2010-09-14 33 views
7

Parece que no puedo entender por qué el objeto devuelto por getProjection() no está definido. Aquí está mi código: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); 

Mi error es: No se puede llamar al método 'fromLatLngToContainerPixel' de la indefinida

+0

Por cierto: me pega la parte jquery para mostrar que mi objeto de mapa (HAR.map) funciona. He confirmado muchas veces que las funciones getCenter() y getZoom() devuelven los valores correctos. Entonces el objeto HAR.map es legítimo. –

Respuesta

26

En realidad, la razón por la que esto sucede es porque el objeto de proyección se crea después de que el mapa esté inactivo después de la panorámica/acercamiento. Por lo tanto, una mejor solución es para escuchar en el inactivo caso de objeto google.maps.Map, y obtener una referencia a la proyección allí:

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

¡Impresionante! Necesito probar esto. –

+0

Simplemente salvó mi día –

2

que tipo de cuenta de lo que estaba pasando. Aunque todavía no está claro por qué sucede esto, sé que tuve que crear una instancia de la variable "superposición" justo después de crear mi mapa de Google (HAR.map). Por lo que prácticamente se trasladó ese fragmento de código en mi clase de HAR y ahora uso:

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

Así que ahora, cada vez que se crea un mapa a través de mi clase "HAR" También tienen un objeto OverlayView paralelo dentro de mi clase.

El error podría haber sido al perder el alcance de mi objeto de clase, pero creo que fue más el evento de mapa "projection_changed" que no se activó. Tengo una sugerencia de la documentación de la API para la clase de mapa mapa, bajo getProjection método():

"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."

Si usted está recibiendo el problema similar, asegúrese de que asigna su overlayView.setMAP (YOUR_MAP_OBJECT) de cerca después de instanciar el objeto del mapa.

+0

También tuve este problema, y ​​fue porque no tenía este this.setMap() en absoluto. Gracias. – danludwig

+0

Np. Me alegro de que haya ayudado. –