Автоматический поиск подходящего масштаба для результата геокодирования - PullRequest
7 голосов
/ 09 января 2012

Я использую Google Maps и службу геокодирования Google для своего приложения службы определения местоположения.Я использую сервис Google Geocoding для перевода адреса в широту / долготу.Моя проблема заключается в том, как автоматически найти подходящий зум для определенного адреса, как, например, 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

Есть ли другое решение?(Или что-нибудь из API Карт Google, которого я еще не знаю?)

Спасибо!

Ответы [ 2 ]

4 голосов
/ 09 января 2012

используйте класс 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

3 голосов
/ 10 марта 2013

использовать видовой экран геометрии результата.если ваш результат поиска не имеет определенных границ, вы получите ошибку с geometry.bounds

viewport дает вам лучший вид для результата.

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

...