是否有一些简单的方法可以在API V3中获取map.fromLatLngToDivPixel?

时间:2013-01-11 10:09:42

标签: google-maps google-maps-api-3

  

可能重复:
  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;
}

2 个答案:

答案 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);