Я пытаюсь динамически отображать изменения координат объекта «шпунтовый домен» с помощью 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&v=2&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()
, я получаю две ошибки.
- Изменения объекта не заполняются. На самом деле, карта даже не отображается.
- Я получаю исключение в потоке, когда я вызываю
this.save()
метод: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
Как мне разрешить это? Есть ли лучший способ сделать это?