【问题标题】:Grails + Google Maps APIGrails + 谷歌地图 API
【发布时间】:2010-01-30 12:39:14
【问题描述】:

我正在尝试通过 Google Maps API 动态表示 groovy 域对象的坐标变化。该对象具有字段:

Double lat
Double lng

还有一个方法:

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

这是一个每 5 秒重新填充地图更改的 JS:

    <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

我该如何解决这些问题?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: javascript hibernate grails groovy google-maps


    【解决方案1】:

    好的,我有两个解决方案。

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

    第二个——使用Quartz plugin

    【讨论】:

      【解决方案2】:

      域模型的更改需要在 Hibernate 会话的上下文中发生,因此当您创建一个新线程时,它看起来就像是在会话之外创建的。您使用 Thread.start() 是否有特殊原因?另外,flyTo() 在何时何地被调用?我不认为我注意到您的 JS 中有一个调用来进行更新。如果您在控制器中进行 flyTo() 调用,它将自动绑定到 Hibernate 会话。

      【讨论】:

      • 我想更改 lat 和 lng 字段,并动态表示视图的更改,所以我使用的是 Thread.start()。据我了解,如果我使用一个简单的循环,它不会刷新页面,直到循环完成。 flyTo() 在表单上的按钮被按下时被调用。更新在这里: 简而言之,我想要一个对象改变它的坐标,直到它达到某个坐标,并在地图上表示它的实际移动。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2011-03-25
      相关资源
      最近更新 更多