2010-09-14 4 views
7

Ich kann nicht herausfinden, warum das von getProjection() zurückgegebene Objekt nicht definiert ist. Hier ist mein Code: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); 

Mein Fehler ist: Kann nicht nennen Methode ‚fromLatLngToContainerPixel‘ undefinierter

+0

BTW: Ich klebte das jquery Teil zu zeigen, dass Mein Kartenobjekt (HAR.map) funktioniert. Ich habe mehrmals bestätigt, dass die Funktionen getCenter() und getZoom() tatsächlich korrekte Werte zurückgeben. Also ist das HAR.map-Objekt echt. –

Antwort

26

Eigentlich ist der Grund, warum dies passiert, weil das Projektionsobjekt erstellt wird, nachdem die Karte nach dem Verschieben/Zoomen im Leerlauf ist. Also, eine bessere Lösung auf dem Ruhe Ereignis des google.maps.Map Objekts zu hören ist, und einen Verweis auf die Projektion dorthin zu gelangen:

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

Super! Ich muss das ausprobieren. –

+0

Einfach meinen Tag gerettet –

2

ich irgendwie herausgefunden, was los war. Obwohl es immer noch nicht klar ist, warum dies passiert, weiß ich, dass ich die Variable "overlay" direkt nach der Instanziierung meiner Google Map (HAR.map) instanziieren musste. Also zog ich praktisch, dass Code-Schnipsel in meine HAR Klasse und jetzt ich benutze:

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

So, jetzt habe ich jedes Mal eine Karte über meine Klasse „HAR“ erstelle Ich habe auch ein parallel Overlay Objekt in meiner Klasse.

Der Fehler könnte Verlust des Gültigkeitsbereichs meines Klassenobjekts gewesen sein, aber ich denke, es war eher das Kartenereignis "projection_changed", das nicht ausgelöst wurde. Ich habe einen Hinweis aus der Karte API-Dokumentation für die Karten Klasse, unter Methode 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.

Wenn Sie das ähnliche Problem bekommen, stellen Sie sicher, dass Sie Ihre overlayView.setMAP zuweisen (YOUR_MAP_OBJECT) kurz nach der Instanziierung des Kartenobjekts.

+0

Ich hatte auch dieses Problem, und es war, weil ich überhaupt keine this.setMap() hatte. Danke. – danludwig

+0

Nr. Froh, dass es geholfen hat. –