php 使用谷歌通过反向地理编码获取街道、城市和国家
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18173242/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Getting street,city and country by reverse geocoding using google
提问by Ruben
I'm trying to getting the $street, $city and $country string from google json. It works for my home address : http://maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true
我正在尝试从 google json 获取 $street、$city 和 $country 字符串。它适用于我的家庭地址:http: //maps.googleapis.com/maps/api/geocode/json?latlng=52.108662,6.307370&sensor=true
$url = "http://maps.googleapis.com/maps/api/geocode/json?latlng=".$lat.",".$lng."&sensor=true";
$data = @file_get_contents($url);
$jsondata = json_decode($data,true);
if(is_array($jsondata) && $jsondata['status'] == "OK")
{
$city = $jsondata['results']['0']['address_components']['2']['long_name'];
$country = $jsondata['results']['0']['address_components']['5']['long_name'];
$street = $jsondata['results']['0']['address_components']['1']['long_name'];
}
But for a different address with more data in the arrays like this example: http://maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=trueit doesn't work, because there is more data in the json array and it makes the province the country.
但是对于在数组中包含更多数据的不同地址,如以下示例:http: //maps.googleapis.com/maps/api/geocode/json?latlng=52.154184,6.199592&sensor=true它不起作用,因为有json 数组中的更多数据,它使该省成为国家。
How can I select the type that I need (long_name)?
如何选择我需要的类型(long_name)?
- for street : long_name where "types" : [ "route" ]
- for city : long_name where "types" : [ "locality", "political" ]
- for country : long_name where "types" : [ "country", "political" ]
- 对于街道:long_name 其中“类型”:[“路线”]
- 对于城市:long_name 其中“类型”:[“地方”,“”]
- 对于国家:long_name 其中“类型”:[“国家”,“”]
Example output from the geocode JSON:
地理编码 JSON 的示例输出:
{
"results" : [
{
"address_components" : [
{
"long_name" : "89",
"short_name" : "89",
"types" : [ "street_number" ]
},
{
"long_name" : "Wieck De",
"short_name" : "Wieck De",
"types" : [ "establishment" ]
},
{
"long_name" : "Industrieweg",
"short_name" : "Industrieweg",
"types" : [ "route" ]
},
{
"long_name" : "Zutphen",
"short_name" : "Zutphen",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Zutphen",
"short_name" : "Zutphen",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Gelderland",
"short_name" : "GE",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "Nederland",
"short_name" : "NL",
"types" : [ "country", "political" ]
},
{
"long_name" : "7202 CA",
"short_name" : "7202 CA",
"types" : [ "postal_code" ]
}
I think I fixed it myself, hereby my code:
我想我自己修复了它,特此我的代码:
// street
foreach ($jsondata["results"] as $result) {
foreach ($result["address_components"] as $address) {
if (in_array("route", $address["types"])) {
$street = $address["long_name"];
}
}
}
// city
foreach ($jsondata["results"] as $result) {
foreach ($result["address_components"] as $address) {
if (in_array("locality", $address["types"])) {
$city = $address["long_name"];
}
}
}
// country
foreach ($jsondata["results"] as $result) {
foreach ($result["address_components"] as $address) {
if (in_array("country", $address["types"])) {
$country = $address["long_name"];
}
}
}
采纳答案by lejlot
You could convert the data to the associative array and work with it like
您可以将数据转换为关联数组并使用它
$data = array();
foreach($jsondata['results']['0']['address_components'] as $element){
$data[ implode(' ',$element['types']) ] = $element['long_name'];
}
print_r($data);
echo 'route: ' . $data['route'] . "\n";
echo 'country: ' . $data['country political'];
回答by joseph-l
Your code is perfectly good, but wouldn't it be better to use a switch inside 1 foreach instead of repeated foreach loops? Here is how I parse the exact same array :
您的代码非常好,但是在 1 foreach 中使用 switch 而不是重复的 foreach 循环不是更好吗?这是我解析完全相同的数组的方法:
$location = array();
foreach ($result['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('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'];
break;
}
}
回答by sudiptpa
If you use Postal Code to find the address, as i have recently generated street,city, country using Google MAP API the code is:
如果您使用邮政编码查找地址,因为我最近使用 Google MAP API 生成了街道、城市、国家/地区,代码为:
$search_code = urlencode($postcode);
$url = 'http://maps.googleapis.com/maps/api/geocode/json?address=' . $search_code . '&sensor=false';
$json = json_decode(file_get_contents($url));
if($json->results == []){
return '';
}
$lat = $json->results[0]->geometry->location->lat;
$lng = $json->results[0]->geometry->location->lng;
//Now build the actual lookup
$address_url = 'http://maps.googleapis.com/maps/api/geocode/json?latlng=' . $lat . ',' . $lng . '&sensor=false';
$address_json = json_decode(file_get_contents($address_url));
$address_data = $address_json->results[0]->address_components;
//return $address_data = $address_json->results[0]->formatted_address;
$street = str_replace('Dr', 'Drive', $address_data[1]->long_name);
$town = $address_data[2]->long_name;
$county = $address_data[3]->long_name;
return $street.', '. $town. ', '.$county;
回答by Jonathan
Looks like the job for a set-parser like JMESpath http://jmespath.org/
看起来像 JMESpath http://jmespath.org/这样的集合解析器的工作
Given the array
给定数组
{
"locations": [
{"name": "Seattle", "state": "WA"},
{"name": "New York", "state": "NY"},
{"name": "Bellevue", "state": "WA"},
{"name": "Olympia", "state": "WA"}
]
}
A JMESPath of:
一个 JMESPath:
locations[?state == 'WA'].name | sort(@) | {WashingtonCities: join(', ', @)}
locations[?state == 'WA'].name | sort(@) | {WashingtonCities: join(', ', @)}
yields
产量
{
"WashingtonCities": "Bellevue, Olympia, Seattle"
}
You'd have to rewrite for your case, but you get the idea how powerful this language is. You can use composer
to install a JMESPath implementation for PHP
你必须为你的案例重写,但你会知道这种语言有多么强大。您可以使用composer
为 PHP 安装 JMESPath 实现