2010-09-14 28 views
7

Nie mogę zrozumieć dlaczego obiekt zwrócony przez getProjection() jest niezdefiniowany. Tu jest mój kodu:Google Maps 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); 

Mój błąd jest: Nie można nazwać metodą „fromLatLngToContainerPixel” undefined

+0

BTW: Mam wklejony fragment jquery, aby pokazać, że mój obiekt mapy (HAR.map) działa. Wielokrotnie potwierdziłem, że funkcje getCenter() i getZoom() zwracają właściwe wartości. Tak więc obiekt HAR.map jest zgodny z prawem. –

Odpowiedz

26

W rzeczywistości, powodem tego jest fakt, że obiekt projekcji jest tworzony po bezczynności mapy po panoramowaniu/powiększaniu. Tak, lepszym rozwiązaniem jest, aby słuchać na bezczynności przypadku google.maps.Map obiektu i uzyskać odniesienie do projekcji tam:

// 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

Awesome! Muszę to wypróbować. –

+0

Po prostu zapisałem mój dzień –

2

I niby zorientowali się, co się dzieje. Mimo, że nadal nie jest jasne, dlaczego tak się dzieje, wiem, że musiałem utworzyć instancję zmiennej "overlay" zaraz po utworzeniu mojej mapy google (HAR.map). Więc praktycznie przeszło fragment kodu w mojej klasie Har i teraz używam:

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

więc teraz, za każdym razem tworzę mapę za pośrednictwem mojej klasy „HAR” Mam też równoległe wyświetlanie nakładki obiektu w mojej klasie.

Błąd mógł polegać na utracie zasięgu mojego obiektu klasy, ale myślę, że było to więcej zdarzeń na mapie "visction_changed", które nie były uruchamiane. Dostałem wskazówkę od docs map API dla klasy map, w ramach metody 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.

Jeśli uzyskanie podobnego problemu, upewnij się, że można przypisać swój overlayView.setMAP (YOUR_MAP_OBJECT) dokładnie po utworzeniu obiektu mapy.

+0

Też miałem ten problem, i to dlatego, że nie miałem żadnej this.setMap() w ogóle. Dzięki. – danludwig

+0

Np. Cieszę się, że to pomogło. –

Powiązane problemy