代码之家  ›  专栏  ›  技术社区  ›  George

Grails+谷歌地图API

  •  1
  • George  · 技术社区  · 15 年前

    我试图通过google maps api动态地表示一个groovy域对象的坐标变化。对象具有字段:

    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

    如何解决这些问题?有更好的方法吗?

    2 回复  |  直到 15 年前
        1
  •  1
  •   George    15 年前

    好吧,我有两个解决办法。

    弗斯特 我应该创建一个控制器动作,并通过Ajax校准它来更新坐标。这个解决方案不太合适,因为我实际上对从外部而不是从视图改变域对象的状态感兴趣(希望,我解释得足够清楚)。如果没有,我会在这里回答任何问题)。

    第二 使用中 Quartz plugin .

        2
  •  0
  •   nstehr    15 年前

    对域模型的更改需要在休眠会话的上下文中进行,因此当创建新线程时,它看起来像是在会话外部创建的。使用thread.start()有什么特别的原因吗?另外,何时何地调用flyto()?我不认为我注意到你的JS中有一个调用来进行更新。如果在控制器中调用flyto(),它将自动绑定到休眠会话。