2016-10-04 2 views
0

Я уже создаю api geocode на консоли Google. У меня есть вход в окно поиска с автозаполнением google на моем сайте, и я хотел бы установить конкретный город для своего геокодирования api и интегрировать его в свое веб-приложение. Город: toulouse, Страна: Франция.Google автозаполнение в конкретный город

Когда клиент вводит свой адрес в поле поиска, я хочу, чтобы он выполнял поиск всего адреса в городе Тулуз, в зависимости от центра тулузы с закрытым расстоянием 20 км.

Вот мой код, основанный на файле Function.php

public function geoCoding($lat='',$lng='') 
{      
    $protocol = isset($_SERVER["https"]) ? 'https' : 'http'; 
    if ($protocol=="http"){ 
     $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true"; 
    } else $url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true"; 

    $google_geo_api_key=getOptionA('google_geo_api_key'); 
    if (!empty($google_geo_api_key)){ 
     $url=$url."&key=".urlencode($google_geo_api_key); 
    } 

    $data = @file_get_contents($url); 
    if (!empty($data)){ 
     $result = json_decode($data,true);     
     //dump($result); 
     if (!isset($result['results'])){ 
      return false; 
     } 
     if (is_array($result['results']) && count($result['results'])>=2){ 
      $location = array(); 
      foreach ($result['results'][0]['address_components'] as $component) { 
       switch ($component['types']) { 
        case in_array('street_number', $component['types']): 
        $location['street_number'] = $component['long_name']; 
        break; 
        case in_array('route', $component['types']): 
        $location['street'] = $component['long_name']; 
        break; 
        case in_array('neighborhood', $component['types']): 
        $location['street2'] = $component['long_name']; 
        break; 
        case in_array('sublocality', $component['types']): 
        $location['sublocality'] = $component['long_name']; 
        break; 
        case in_array('locality', $component['types']): 
        $location['locality'] = $component['long_name']; 
        break; 
        case in_array('administrative_area_level_2', $component['types']): 
        $location['admin_2'] = $component['long_name']; 
        break; 
        case in_array('administrative_area_level_1', $component['types']): 
        $location['admin_1'] = $component['long_name']; 
        break; 
        case in_array('postal_code', $component['types']): 
        $location['postal_code'] = $component['long_name']; 
        break; 
        case in_array('country', $component['types']): 
        $location['country'] = $component['long_name']; 
        $location['country_code'] = $component['short_name']; 
        break; 
       } 
      }         
      return $location; 
     } 
    } 
    return false; 
} 
+0

Параметр «радиус» .. - Определяет расстояние (в метрах), в пределах которого будут возвращаться результаты. Максимально допустимый радиус составляет 50 000 метров. Обратите внимание, что радиус не должен включаться, если задано значение rankby = distance (описано в разделе Необязательные параметры ниже). Проверьте эту ссылку https://developers.google.com/places/web-service/search – Stallion

+0

Я не думаю, что это связано с параметром radius в API Places, в приведенном выше коде используется только API геокодирования, и это не понятно для меня, что означает OP с «автозаполнением Google», но код не показывает никаких следов использования API автозаполнения мест. – miguev

ответ

1

Ваше описание звучит, как вы используете Search Box виджет в библиотеке местах JavaScript API Карт, но ваш код показывает только использование reverse geocoding в Веб-сервис API геокодирования.

Так как я думаю, что только первый имеет смысл, я рискну, вы будете заинтересованы в следующих запросах функция, которая позволила бы ограничить автозаполнение в городе:

  • Issue 8606: места, связанные ограничения
  • Issue 4433: позволяют componentRestrictions фильтровать то же компоненты, как службы геокодирования API

в настоящем время, варианты которых я знаю, являются:

  • Установите флажок Поиск bounds тем города (которые вы можете получить от API геокодирования) и полагаться на виджете предпочитают (не ограничивать) предложения в пределах этих границ, или
  • Создайте свой собственный виджет, используя AutocompleteService.getQueryPredictions() и сделайте свою собственную фильтрацию после факта, чтобы удалить предложения, но это было бы очень сложно, потому что название города не обязательно всегда будет частью предложения.
Смежные вопросы