我正在尝试通过 Google Maps API 动态表示 groovy 域对象的坐标变化。该对象具有字段:
Double lat
Double lng
和一个方法:
void flyTo(lat, lng){
Thread.start(){
while (locked){
changeCoords (this)
this.save()
}
}
这是一个每 5 秒重新填充 map 更改的 JS:
<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()
方法时,遇到两个错误。
- 不会填充对象的更改。事实上, map 甚至没有显示。
- 当我调用
this.save()
方法时,我在线程中遇到异常:没有绑定(bind)到线程的 Hibernate session ,并且配置不允许创建非事务 session 这里
我该如何解决这些问题?有更好的方法吗?
最佳答案
好的,我有两个解决方案。
首先 — 我应该创建一个 Controller Action ,并通过 AJAX 对其进行校准以更新坐标。这个解决方案不太合适,因为我实际上感兴趣的是从外部而不是从 View 改变域对象的状态(希望,我解释得足够清楚。如果没有,我会在这里回答任何问题)。
第二 — 使用 Quartz plugin .
关于javascript - Grails + Google map API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2167881/