duanhuang2150 2016-02-01 20:48
浏览 185
已采纳

获取lat,lng基于地址

I have

an array of user addresses

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 "
  ]
]

My goal

is to grab the lat, and lng of each address, and construct something like this

[
    ["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]
]

so I can plot them in Google Map.


I tried:

making a curl to

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

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


I got

this back as a response, after decode it

$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"
}

As you can see, now I can access the lat,lng by accessing

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

You might say, if you can access to it - why are you still asking this question ?

Well, that lat,lng data that I'm getting back from the API response produce wrong Google Map Marker.

I'm not sure why/how it is wrong, but I am sure that all my user addresses are in the US, and here is my Google Map Marker Result. None of them showing inside the US.

Google Map Result

enter image description here


I'm running out of ideas now.

Any hints / helps / suggestions will mean a lot to me.


Update

Thanks to this answer

I be able to get the lat,lng and plot correct markers on my Google Map now.


Final Result

enter image description here

  • 写回答

1条回答 默认 最新

  • drkjzk3359 2016-02-01 21:16
    关注

    You should url-encode your address before you pass it to curl.

    urlencode($address);
    

    The spaces in the addresses if not encoded can cause unpredictable problems.

    Here is an example of what happens:

    Without url encoding:

    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"
    }
    

    With url encoding:

    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
                }...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?