Grails + API Карт Google - PullRequest
       8

Grails + API Карт Google

1 голос
/ 30 января 2010

Я пытаюсь динамически отображать изменения координат объекта «шпунтовый домен» с помощью API Карт Google. У объекта есть поля:

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 ]

1 голос
/ 01 февраля 2010

Хорошо, у меня есть два решения для этого.

Первый - Я должен создать действие контроллера и вызвать его через AJAX для обновления координат. Это решение не очень подходит, потому что я на самом деле заинтересован в изменении состояния доменного объекта извне, а не с точки зрения (надеюсь, я объясню достаточно ясно. Если нет, я отвечу на любые вопросы здесь).

Второй - используйте Кварцевый плагин .

0 голосов
/ 30 января 2010

Изменения в модели вашего домена должны происходить в контексте сеанса Hibernate, поэтому при создании нового потока создается впечатление, что он создан вне сеанса. Есть ли конкретная причина, по которой вы используете Thread.start ()? Также, где и когда вызывается flyTo ()? Я не думаю, что заметил вызов в вашем JS, чтобы сделать обновление. Если вы выполняете вызов flyTo () внутри контроллера, он будет автоматически привязан к сеансу Hibernate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...