可能重复:
How to call fromLatLngToDivPixel in Google Maps API V3?
aPoint=map.fromLatLngToDivPixel(labelA.getPoint());
bPoint=map.fromLatLngToDivPixel(labelB.getPoint());
我尝试过覆盖方法,但失败了,因为我需要将变量恢复到函数中:
function LabelLatLongSort(a,b)
{
labelA = eval("label_"+a.deviceId);
labelB = eval("label_"+b.deviceId);
longOffset = eval("offsetOverlapWith_"+a.customId);
overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);
google.maps.event.addListenerOnce(map, 'idle', function() {
aPoint=overlay.getProjection().fromLatLngToDivPixel(labelA.getPoint());
bPoint=overlay.getProjection().fromLatLngToDivPixel(labelB.getPoint());
});
diffLat = bPoint.y-aPoint.y;
diffLong = aPoint.x-bPoint.x;
if (Math.abs(diffLong)>longOffset) return diffLong;
if (diffLat==0)
{
return b.deviceId-a.deviceId;
}
return diffLat;
}
答案 0 :(得分:2)
OverlayView方法就是这样做的。如果它不起作用,则可能是因为在您尝试获取叠加投影之前地图尚未完成加载。
创建地图和叠加层后,等待地图空闲事件触发器,然后尝试使用叠加层。
google.maps.event.addListenerOnce(map, 'idle', function() {
aPoint=overlay.getProjection().fromLatLngToDivPixel(labelA.getPoint());
bPoint=overlay.getProjection().fromLatLngToDivPixel(labelB.getPoint());
});
EIDT - 更新了回答问题更改的答案
每次调用函数时,创建叠加层并等待空闲事件并不是一个好主意。您应该创建地图并叠加一次,并在地图加载后继续应用程序。
例如
var map, overlay;
var labelLatLongSort = function(a, b) {
labelA = eval("label_"+a.deviceId);
labelB = eval("label_"+b.deviceId);
longOffset = eval("offsetOverlapWith_"+a.customId);
aPoint=overlay.getProjection().fromLatLngToDivPixel(labelA.getPoint());
bPoint=overlay.getProjection().fromLatLngToDivPixel(labelB.getPoint());
diffLat = bPoint.y-aPoint.y;
diffLong = aPoint.x-bPoint.x;
if (Math.abs(diffLong)>longOffset) return diffLong;
if (diffLat==0) {
return b.deviceId-a.deviceId;
}
return diffLat;
}
var init = function(callback) {
map = new google.maps.Map(div, options);
overlay = new google.maps.OverlayView();
overlay.draw = function() {};
overlay.setMap(map);
google.maps.event.addListenerOnce(map, 'idle', function() {
callback();
});
}
var startApp = function() {
var diffLat = labelLatLongSort(a, b);
}
// start application on DOM load
init(startApp);
我在这里做的是将我的应用程序代码放在一个名为startApp
的函数中,并将其作为回调传递给init
函数。一旦init
函数通过等待idle
事件加载了映射,它就会调用回调函数。
根据您的应用程序,您可能需要稍微更改设置。
答案 1 :(得分:0)
var overlay = new google.maps.OverlayView();
var point = overlay.getProjection().fromLatLngToDivPixel(latLng);