6

У меня есть

Массив адресов пользователейПолучить Lat, LNG база по адресу

array:5 [▼ 
    0 => array:2 [▼ 
    "name" => " Admin" 
    "address" => "111 Park AveFloor 4 New York, NY" 
    ] 
    1 => array:2 [▼ 
    "name" => "User A" 
    "address" => "12 Main Street Cambridge, MA" 
    ] 
    2 => array:2 [▼ 
    "name" => "Apple HQ" 
    "address" => "1 Infinite Loop Cupertino, California" 
    ] 
    3 => array:2 [▼ 
    "name" => "Google MA" 
    "address" => "355 Main St Cambridge, MA" 
    ] 
    4 => array:2 [▼ 
    "name" => "site HQ" 
    "address" => "300 Concord Road Billerica, MA " 
    ] 
] 

Моя цель

, чтобы захватить lat и lng каждого адреса, и построить что-то вроде этого

[ 
    ["Admin", 18.3114513, -66.9219513, 0], 
    ["User A", 25.3253982, 44.5503772, 1], 
    ["Apple HQ", 33.0241101, 39.5865834, 2], 
    ["Google MA", 43.9315743, 20.2366877, 3], 
    ["site HQ", 32.683063, 35.27481, 4] 
] 

, поэтому я могу нарисовать их в Google Map.


Я пробовал:

делая завиток к

https://maps.googleapis.com/maps/api/geocode/json?address='.$address.'&key=*** 

$data = shell_exec('curl '.$url);


Я получил

это обратно в ответ, после того, как расшифровывают это

$data = json_decode($data);

{#278 ▼ 
    +"results": array:1 [▼ 
    0 => {#298 ▼ 
     +"address_components": array:2 [▶] 
     +"formatted_address": "PR-111, Puerto Rico" 
     +"geometry": {#300 ▼ 
     +"bounds": {#301 ▶} 
     +"location": {#304 ▼ 
      +"lat": 18.3114513 
      +"lng": -66.9219513 
     } 
     +"location_type": "GEOMETRIC_CENTER" 
     +"viewport": {#305 ▶} 
     } 
     +"place_id": "ChIJrdMXucS4AowRF4jHu2ji58U" 
     +"types": array:1 [▶] 
    } 
    ] 
    +"status": "OK" 
} 

Как вы можете видеть, теперь я могу получить доступ к лату, LNG путем доступа к

$location = $data->results[0]->geometry->location;

Вы могли бы сказать, если вы можете получить доступ к нему - почему вы все еще задаете этот вопрос?

Хорошо, что lat, lng данные, которые я получаю от ответа API, вызывают неправильный маркер карты Google.

Я не уверен, почему/как это неправильно, но я уверен, что все мои адреса пользователей находятся в США, и вот мой результат маркера Google Map. Ни один из них не показывался внутри США.

Google Map Результат

enter image description here


Я бегу из идей в настоящее время.

Любые советы/подсказки/советы будут иметь для меня многого.


Update

Благодаря этому answer

я смогу получить лат, LNG и сюжет правильные маркеры на моей карте Google в настоящее время.


Конечный результат

enter image description here

+0

вы ищете несколько общий адрес. что произойдет, если вы пометите «США» на конец их? –

+0

Хмм хороший звонок, позвольте мне попробовать. – ihue

+1

Независимо от фактической проблемы, * этот * очень хорошо структурированный вопрос (+1). – Jan

ответ

2

Вы должны кодировать URL-адрес, прежде чем передать его скручиванию.

urlencode($address); 

Пространства в адресах, если они не закодированы, могут вызвать непредсказуемые проблемы.

Вот пример того, что происходит:

Без кодирования URL:

curl https://maps.googleapis.com/maps/api/geocode/json?address=111 Park AveFloor 4 New York, NY 

{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "111", 
       "short_name" : "PR-111", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Puerto Rico", 
       "short_name" : "PR", 
       "types" : [ "country", "political" ] 
      } 
     ], 
     "formatted_address" : "PR-111, Puerto Rico", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 18.4485405, 
        "lng" : -66.6643718 
       }, 
       "southwest" : { 
        "lat" : 18.2420721, 
        "lng" : -67.15701799999999 
       } 
      }, 
      "location" : { 
       "lat" : 18.3114513, 
       "lng" : -66.9219513 
      }, 
      "location_type" : "GEOMETRIC_CENTER", 
      "viewport" : { 
       "northeast" : { 
        "lat" : 18.4485405, 
        "lng" : -66.6643718 
       }, 
       "southwest" : { 
        "lat" : 18.2420721, 
        "lng" : -67.15701799999999 
       } 
      } 
     }, 
     "place_id" : "ChIJrdMXucS4AowRF4jHu2ji58U", 
     "types" : [ "route" ] 
     } 
    ], 
    "status" : "OK" 
} 

с кодировкой URL:

curl https://maps.googleapis.com/maps/api/geocode/json?address=111+Park+AveFloor+4+New+York%2C+NY 
{ 
    "results" : [ 
     { 
     "address_components" : [ 
      { 
       "long_name" : "111", 
       "short_name" : "111", 
       "types" : [ "street_number" ] 
      }, 
      { 
       "long_name" : "Park Avenue", 
       "short_name" : "Park Ave", 
       "types" : [ "route" ] 
      }, 
      { 
       "long_name" : "Midtown East", 
       "short_name" : "Midtown East", 
       "types" : [ "neighborhood", "political" ] 
      }, 
      { 
       "long_name" : "Manhattan", 
       "short_name" : "Manhattan", 
       "types" : [ "sublocality_level_1", "sublocality", "political" ] 
      }, 
      { 
       "long_name" : "New York", 
       "short_name" : "New York", 
       "types" : [ "locality", "political" ] 
      }, 
      { 
       "long_name" : "New York County", 
       "short_name" : "New York County", 
       "types" : [ "administrative_area_level_2", "political" ] 
      }, 
      { 
       "long_name" : "New York", 
       "short_name" : "NY", 
       "types" : [ "administrative_area_level_1", "political" ] 
      }, 
      { 
       "long_name" : "United States", 
       "short_name" : "US", 
       "types" : [ "country", "political" ] 
      }, 
      { 
       "long_name" : "10170", 
       "short_name" : "10170", 
       "types" : [ "postal_code" ] 
      } 
     ], 
     "formatted_address" : "111 Park Ave, New York, NY 10170, USA", 
     "geometry" : { 
      "bounds" : { 
       "northeast" : { 
        "lat" : 40.7522096, 
        "lng" : -73.9773591 
       }, 
       "southwest" : { 
        "lat" : 40.7521971, 
        "lng" : -73.97736809999999 
       } 
      }, 
      "location" : { 
       "lat" : 40.7521971, 
       "lng" : -73.97736809999999 
      }... 
+0

Вы правы! Он исправил мои проблемы после того, как я «urlencode ($ address)». Но могу ли я попросить, чтобы у меня было 26 элементов в массиве ответов. Как я узнаю, какой элемент является тем, который даст мне точные ** lat, lng **? Пожалуйста, порекомендуйте. – ihue

+1

Он возвращает расположение (-ы), которое соответствует вашему запросу, который может быть несколькими адресами. Если вы просто хотите, чтобы лучшее предложение для данного запроса использовало lat/lng из первого результата. – farooq

Смежные вопросы