2012-07-05 3 views
4

поэтому .. Я столкнулся с проблемой, которая, возможно, очень распространена.zoom google maps API - разные для города и страны

только приступил к реализации API Карт Google, и после моего кода, чтобы разрешить город на широчайший/Ланг и центрировать карту там:

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
    geocoder.geocode({ 'address': address }, function (results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
     var loc = results[0].geometry.location; 
     document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13)); 
    } 

проблема заключается в том, что я передаю статический зум (13) ,

Если кто-то называет имя страны, я хотел бы уменьшить масштаб. если это город, я бы хотел увеличить масштаб и т. д.

Единственное, что я могу придумать, - это выяснить подходящий масштаб для каждого города и страны, сохранить их в каком-то хеше и попытаться который используется, для передачи соответствующего увеличения.

Возможно, Google думает о более интеллектуальном подходе?

ответ

6

Геокодер возвращает "recommended" viewport

Что вы можете использовать в своей функции SetMapAddress так:

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      document.map.fitBounds(results[0].geometry.viewport); 
     } 
     }); 
    } 
} 
+0

удивительный, который полностью сработал. однако, я бы хотел, чтобы он увеличился немного больше. теперь он меняет масштаб, но он всегда находится в середине 60% карты. Я хочу, чтобы он заполнил карту .. любым способом сделать это? –

+0

Я полагаю, я мог бы сделать ++ на document.map.zoom после каждого сброса? –

+0

Существует также граница, возвращаемая в результате, которую документация описывает как «Точные границы этого GeocodeResult, если применимо». Он может (если он существует) быть более близким, чем «рекомендуемый» видовое окно. – geocodezip

1

Результат геокодирования предоставляет массив address_components, содержащий Address component types для запроса.

Из моего очень ограниченного тестирования, чем больше информации добавляется в запрос, тем дольше этот массив address_components становится. При вводе «Франция», это всего лишь следующее:

> Object 
long_name: "France" 
short_name: "FR" 

types: Array[2] 
> 0: "country" 
> 1: "political" 

При добавлении города, есть тип под названием «местность». Таким образом, вы можете пройти этот массив, проверяя, существует ли совпадение между long_names и тем, что пользователь вводил, если набирается только город или страна, это легко, но существует множество вариантов, таких как Рим/Рим Италия (различия в написании) , и если пользователь вошел в город и страну, вы должны отдавать приоритет городу.

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

Вот мой ленивый подход:

Создать var mapZoom = 13; (предположим, это город)

Проверьте, если весь пользовательский ввод на самом деле название страны: если он соответствует значение параметра long_name и тип въездной является " страна ", нижний mapZoom до 5.

Применить setCenter с этой переменной mapZoom.

+0

очень круто. будет экспериментировать с этим! –

0

Другой (иногда проблематично) решение подсчитать длину массива address_components.

Как уже упоминалось Тиной CG Hoehr в другом ответе, объект places имеет массив address_components. Массив содержит разные части адреса.

Вы можете проверить длину массива address_components и установить уровень масштабирования соответствующим образом.

Строительство на вашем примере кода

function SetMapAddress(address) { // "London, UK" for example 
    var geocoder = new google.maps.Geocoder(); 
    if (geocoder) { 
     geocoder.geocode({ 'address': address }, function (results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      var loc = results[0].geometry.location; 



      // Test address_components 
      var ac_length = results[0].address_components.length; 

      if (ac_length == 1) { 
       // Assume country 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 3)); 

      } else if (ac_length == 2) { 
       // Assume city 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 7)); 

      } else { 
       // Everything else can have a standard zoom level 
       document.map.setCenter(new google.maps.LatLng(loc.lat(),loc.lng(), 13)); 
      } 



     } 
    } 
} 

Этот метод кажется работать нормально. Проверяя это на австралийских адресах, я обнаружил, что в некоторых пригородах есть почтовый индекс, а некоторые нет - изменение длины массива. Те, у кого нет почтовых индексов, казалось, были в менее населенных районах, но поэтому для более подходящих целей мне было необходимо уменьшить масштаб.