Автоматическое нахождение соответствующего масштаба для результата геокодирования
Я использую Google Maps и сервис Google Geocoding для моего приложения location service. Я использую сервис Google Geocoding для перевода адреса в позицию lat / lng. Моя проблема заключается в том, как автоматически найти подходящий масштаб для определенного адреса, например maps.google.com делает.
Например, когда я ищу улицу в maps.google.com (например, Cisitu Baru, Bandung
), он покажет улицу в меньшем масштабе. Когда я ищу область (например, Bandung
), она будет показывать больший масштаб. И увеличение масштаба для провинция (напр.Jawa Barat
/ West Java
), и так далее.
Я пробовал и то и другое
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
}
});
И
//cut
map.panToBounds(results[0].geometry.viewports); //setting bound
//cut
(честно говоря, я до сих пор не знаю, в чем разница между bounds
и viewport
и в чем их польза от code.google.com/apis/maps/documentation/javascript/geocoding.html)
Но оба по-прежнему не отображают карту в соответствующем масштабе.
Прямо сейчас, я использую небольшой хак, как это
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
Есть ли другое решение? (Или что-нибудь из Google Map API, чего я не знаю еще не знаешь?)
Спасибо!
2 ответа:
Используйте класс GLatLngBounds
Пример:
// 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 ) );
^
Фокус в том, чтобы добавить список всех точек, которые должны быть видны на карте одновременно в объект GLatLngBounds. Google Maps API может сделать всю остальную математику.Или в v3 вы можете использовать класс LatLngBounds (аналогичный GLatLngBounds в v2), Ссылка: http://code.google.com/apis/maps/documentation/javascript/reference.html#LatLngBounds
Для примера лучше проверьте это: http://unicornless.com/code/google-maps-v3-auto-zoom-and-auto-center