2010-09-14 186 views
7

我似乎無法弄清楚爲什麼getProjection()返回的對象是未定義的。這裏是我的代碼:谷歌地圖v3 OverlayView.getProjection()

// Handles the completion of the rectangle 
    var ne = recBounds.getNorthEast(); 
    var sw = recBounds.getSouthWest(); 
    $("#map_tools_selat").attr('value', sw.lat()); 
    $("#map_tools_nwlat").attr('value', ne.lat()); 
    $("#map_tools_selng").attr('value', ne.lng()); 
    $("#map_tools_nwlng").attr('value', sw.lng()); 

    // Set Zoom Level 
    $("#map_tools_zoomlevel").attr('value', HAR.map.getZoom()+1); 
    document.getElementById("map_tools_centerLat").value = HAR.map.getCenter().lat(); 
    document.getElementById("map_tools_centerLong").value = HAR.map.getCenter().lng(); 

    // All this junk below is for getting pixel coordinates for a lat/lng =/ 
    MyOverlay.prototype = new google.maps.OverlayView(); 
    MyOverlay.prototype.onAdd = function() { } 
    MyOverlay.prototype.onRemove = function() { } 
    MyOverlay.prototype.draw = function() { } 
    function MyOverlay(map) { this.setMap(map); } 
    var overlay = new MyOverlay(HAR.map); 
    var projection = overlay.getProjection(); 
    // END - all the junk 
    var p = projection.fromLatLngToContainerPixel(recBounds.getCenter()); 
    alert(p.x+", "+p.y); 

我的錯誤是:不能調用未定義

+0

BTW:我貼了jQuery部分表明,我的地圖對象(HAR.map)確實有效。我已經多次證實getCenter()和getZoom()函數實際上正在返回適當的值。所以HAR.map對象是合法的。 – 2010-09-14 16:15:42

回答

26

其實,我之所以會發生這種情況是因爲投影對象是在平移/縮放後地圖閒置後創建的。因此,一個更好的解決辦法是監聽的空閒事件google.maps.Map對象,並獲得了投影有一個參考:

// Create your map and overlay 
var map; 
MyOverlay.prototype = new google.maps.OverlayView(); 
MyOverlay.prototype.onAdd = function() { } 
MyOverlay.prototype.onRemove = function() { } 
MyOverlay.prototype.draw = function() { } 
function MyOverlay(map) { this.setMap(map); } 

var overlay = new MyOverlay(map); 
var projection; 

// Wait for idle map 
google.maps.event.addListener(map, 'idle', function() { 
    // Get projection 
    projection = overlay.getProjection(); 
}) 
+0

太棒了!我需要嘗試一下。 – 2011-07-12 14:50:27

+0

簡單地保存了我的一天 – 2014-12-01 14:17:10

2

法「fromLatLngToContainerPixel」我有點想通了什麼事情。儘管現在還不清楚爲什麼會出現這種情況,但我知道我必須在實例化我的谷歌地圖(HAR.map)後立即實例化變量「overlay」。所以我幾乎感動的是代碼片段我HAR類,現在我使用:

HAR.canvassOverlay.getProjection().fromLatLngToContainerPixel(recBounds.getCenter()); 

所以現在,每次我通過我的課「HAR」創建地圖時我也有我的課之內的並聯OverlayView的對象。

錯誤可能是因爲我的類對象丟失範圍,但我認爲它更多的是地圖事件「projection_changed」沒有被解僱。我從地圖類地圖API文檔的提示,在方法getProjection():

Returns the current Projection. If the map is not yet initialized (i.e. the mapType is still null) then the result is null. Listen to projection_changed and check its value to ensure it is not null.

如果您收到類似的問題,請確保您所指定的overlayView.setMAP(YOUR_MAP_OBJECT )在實例化地圖對象後緊密結合。

+0

我也有這個問題,這是因爲我根本沒有任何this.setMap()。謝謝。 – danludwig 2011-12-19 08:27:01

+0

Np。很高興幫助。 – 2011-12-28 17:45:25