2012-01-09 10 views
7

Estoy usando Google Maps y el servicio de geocodificación de Google para mi aplicación de servicio de ubicación. Uso el servicio de geocodificación de Google para traducir la dirección a la posición lat/lng. Mi problema es cómo encontrar automáticamente un zoom apropiado para una determinada dirección, como hace el maps.google.com.Búsqueda automática del zoom apropiado para el resultado de geocodificación

Por ejemplo, cuando busco una calle en maps.google.com (por ejemplo, Cisitu Baru, Bandung), se mostrará la calle con un zoom más pequeño. Cuando busco en una región (por ejemplo, Bandung), se mostrará un zoom más grande. Y un zoom más grande para la provincia (por ejemplo, Jawa Barat/West Java), y así sucesivamente.

He intentado tanto

var geocoder = new google.maps.Geocoder(); 
geocoder.geocode({ 
    'address': someAddress 
}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     console.dir(results); 
     //cut 
     map.panToBounds(results[0].geometry.bounds); //setting bound 
     //cut 
    } 
}); 

y

//cut 
map.panToBounds(results[0].geometry.viewports); //setting bound 
//cut 

(Honestamente, todavía no sé cuál es la diferencia entre bounds y viewport y cuáles son sus usos de code.google.com /apis/maps/documentation/javascript/geocoding.html)

pero ambos aún no muestran el mapa con el zoom apropiado.

En este momento, utilizar un pequeño truco como esto

var tabZoom = { 
    street_address: 15, 
    route: 15, 
    sublocality: 14, 
    locality: 13, 
    country: 10 
}; 
//cut 
map.setCenter(results[0].geometry.location); 
if (tabZoom[results[0].types[0]] != undefined){ 
    map.setZoom(tabZoom[results[0].types[0]]); 
} else { 
    map.zetZoom(10); 
} 
//cut 

¿Hay otra solución? (O cualquier cosa de Google Map API que aún no conozco?)

¡Gracias!

Respuesta

4

GLatLngBounds uso de clase

un ejemplo:

// map: an instance of GMap2 

// latlng: an array of instances of GLatLng 

var latlngbounds = new GLatLngBounds(); 

for (var i = 0; i < latlng.length; i++) 
{ 
    latlngbounds.extend(latlng[ i ]); 
} 

map.setCenter(latlngbounds.getCenter(), map.getBoundsZoomLevel(latlngbounds)); 

^

El truco es añadir la lista de todos los puntos que deben ser visibles en el mapa de forma simultánea en un objeto GLatLngBounds. La API de Google Maps puede hacer el resto de las matemáticas.

o en v3 puede utilizar LatLngBounds clase (similar a GLatLngBounds en la versión 2), enlace: http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLngBounds

para un ejemplo mejor comprobar esto: http://unicornless.com/code/google-maps-v3-auto-zoom-and-auto-center

+0

No estoy familiarizado con la API v2. ¿Puedes describirlo usando la API v3? Gracias. –

+0

en v3 puede usar la clase LatLngBounds http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLngBounds –

+2

Bien, acabo de descubrir el método 'fitBounds' de su URL de ejemplo. Acabo de hacer 'map.fitBounds (results [0] .geometry.bounds);' y funciona como un amuleto. ¡Gracias! –

3

uso de visualización de la geometría resultado. si el resultado de su búsqueda no tiene límites específicos, obtendrá un error con geometry.bounds

viewport le ofrece la mejor vista para el resultado.

map.fitBounds (results [0] .geometry.viewport);

Cuestiones relacionadas