0

可能重复:
如何在 Google Maps API V3 中调用 fromLatLngToDivPixel?

aPoint=map.fromLatLngToDivPixel(labelA.getPoint());
bPoint=map.fromLatLngToDivPixel(labelB.getPoint()); 

我尝试了 Overlay 方法,但失败了,因为我需要将变量返回给函数:

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;
}
4

2 回答 2

2

OverlayView 方法就是这样做的方法。如果它不起作用,则可能是因为在您尝试获取叠加投影之前地图尚未完成加载。

创建地图和叠加层后,等待地图空闲事件触发,然后尝试使用叠加层。

google.maps.event.addListenerOnce(map, 'idle', function() {
    aPoint=overlay.getProjection().fromLatLngToDivPixel(labelA.getPoint()); 
    bPoint=overlay.getProjection().fromLatLngToDivPixel(labelB.getPoint()); 
});

编辑 - 更新答案以反映问题变化

每次调用函数时都创建覆盖并等待空闲事件不是一个好主意。您应该创建一次地图和叠加层,并在地图加载后继续应用程序。

例如

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事件加载了地图,它就会调用回调函数。

根据您的应用程序,您可能需要稍微更改设置。

于 2013-01-11T11:19:40.230 回答
0
var overlay = new google.maps.OverlayView();
var point = overlay.getProjection().fromLatLngToDivPixel(latLng); 
于 2013-01-11T11:15:27.853 回答