2010-01-30 161 views
1

我試圖通過Google Maps API動態地表示groovy域對象的座標變化。該對象具有字段:Grails + Google Maps API

Double lat 
Double lng 

和方法:

void flyTo(lat, lng){ 
    Thread.start(){ 
    while (locked){ 
    changeCoords (this) 
    this.save() 
    } 
    } 

,這裏是一個JS重新填充每5秒改變到地圖:

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key="MY_API_KEY" 
      type="text/javascript"></script> 
<script type="text/javascript"> 
var usCenterPoint = new GLatLng(39.833333, -98.583333) 
var usZoom = 4 
var map = new GMap2(document.getElementById("map")) 

function load() { 
    if (GBrowserIsCompatible()) { 
     var latFrom = -900; 
     var latTo = -900; 
     var lngFrom = -900; 
     var lngTo = -900; 
     map.setCenter(usCenterPoint, usZoom) 
     map.addControl(new GLargeMapControl()); 
     map.addControl(new GMapTypeControl()); 
     updateMap();      
    } 
} 

function updateMap(){ 
    map.clearOverlays(); 

    <g:each in="${dronesList}" status="i" var="drone"> 
     var point${drone.id} = new GLatLng(${drone.lat}, ${drone.lng}) 
     if (latFrom == -900){ 
      latFrom = ${drone.lat} 
      lngFrom = ${drone.lng} 
     } else { 
    latTo = ${drone.lat} 
    lngTo = ${drone.lng} 
     } 
     var marker${drone.id} = new GMarker(point${drone.id}) 
     marker${drone.id}.bindInfoWindowHtml("<strong>${drone.name}</strong><br/>${drone.description}<br/>") 
      map.addOverlay(marker${drone.id}); 
     // map.setCenter(point${drone.id},usZoom); 
     if (latTo != -900){ 
      var polyline = new GPolyline([ 
             new GLatLng(latFrom, lngFrom), 
             new GLatLng(latTo, lngTo) 
             ], "#ff0000", 10); 
      map.addOverlay(polyline); 
     } 
    </g:each> 
} 
</script> 
    </head> 
    <body onload="load(); setInterval('updateMap()', 5000)" onunload="GUnload()"> 

當我開始執行的flyTo()方法,我得到兩個錯誤。

  1. 未填充對象的更改。事實上,地圖甚至沒有出現。
  2. 我得到的線索一個異常時,我稱之爲this.save()方法:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

如何解決這些?有一個更好的方法嗎?

回答

1

好的,我有兩個解決方案。

第一個 - 我應該創建一個控制器的動作,並通過AJAX調用它來更新座標。這個解決方案並不適合,因爲我真的有興趣從外部改變域對象的狀態,而不是從視圖(希望,我解釋清楚了,如果沒有,我會在這裏回答任何問題)。

第二個 - 使用Quartz plugin

0

對域模型的更改需要在Hibernate會話的上下文中發生,因此當您創建新線程時,它看起來像是在會話之外創建的。爲什麼使用Thread.start()有什麼特別的原因?還有什麼地方和什麼時候flyTo()被調用?我不認爲我注意到你的JS中的一個調用來進行更新。如果您在控制器內進行flyTo()調用,它將自動綁定到Hibernate會話。

+0

我想更改lat和lng字段,並動態地表示視圖,因此我使用了Thread.start()。據我所知,如果我使用一個簡單的循環,它將不會刷新頁面,直到循環完成。 當按下表單上的按鈕時,會調用flyTo()。更新如下: 簡而言之,我想要一個對象改變它的座標直到達到某些座標,並代表它在地圖上的實際移動。 – folone 2010-01-30 13:11:02