2010-01-30 8 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() 
    } 
    } 

맵 변경 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()"> 

I가 실행을 시작할 flyTo() 메서드 중 두 가지 버그가 발생했습니다.

  1. 개체의 변경 내용이 채워지지 않습니다. 실제로,지도는 나타나지 않습니다. No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

가 어떻게 사람들을 해결합니까 : 나는 this.save() 메서드를 호출 할 때

  • 나는 스레드에서 예외를 받고 있어요? 이 작업을 수행하는 더 좋은 방법이 있습니까?

  • 답변

    1

    그래,이 두 가지 해결책이 있습니다.

    처음으로 컨트롤러의 동작을 생성하고 AJAX를 통해 좌표를 업데이트해야합니다. 이 솔루션은 실제적으로 적합하지 않습니다. 왜냐하면 실제로 도메인 객체의 상태를보기가 아닌 외부에서 변경하기를 원하기 때문입니다 (희망 사항, 명확하게 설명하고 있습니다. 그렇지 않은 경우 질문에 답변 해 드리겠습니다).

    두 번째 - Quartz plugin을 사용하십시오.

    0

    도메인 모델에 대한 변경 사항은 Hibernate 세션의 컨텍스트 내에서 발생해야하므로 새 스레드를 만들면 세션 외부에서 생성 된 것처럼 보입니다. Thread.start()를 사용하는 특별한 이유가 있습니까? 또한 어디에서 언제 flyTo()가 호출됩니까? 나는 당신의 JS에서 업데이 트를 요청하는 전화를 생각하지 않습니다. 컨트롤러 내에서 flyTo() 호출을하면 자동으로 Hibernate 세션에 바인딩됩니다.

    +0

    lat 및 lng 필드를 변경하고 뷰에 동적으로 변경 사항을 표시하므로 Thread.start()를 사용하고 있습니다. 내가 이해하는 한, 간단한 루프를 사용하면 루프가 끝날 때까지 페이지가 새로 고쳐지지 않습니다. 폼의 단추를 누르면 flyTo()가 호출됩니다. 그리고 업데이트는 다음과 같습니다 : 간단히 말해, 객체가 도달 할 때까지 특정 좌표를 표시하고 맵에서 실제 좌표를 나타냅니다. – folone