0

重複の可能性:
Google Maps API V3 で fromLatLngToDivPixel を呼び出す方法は?

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;
}
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と、コールバック関数を呼び出します。initidle

アプリケーションによっては、セットアップを少し変更する必要がある場合があります。

于 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 に答える