我想处理我的一项任务,按城市名称而不是邮政编码搜索天气(我现在是如何设置的)。使用城市名称输入字符串并从中获取邮政编码的最简单方法是什么?非常感谢您的帮助!谢谢
谷歌可以在这里帮助您!
https://developers.google.com/maps/documentation/geocoding/
zip实际上被谷歌称为"postal_code"。
"long_name": "94043",
"short_name": "94043",
"types": postal_code
例如,假设你想获得密歇根州克拉克斯顿的邮政编码…
http://maps.googleapis.com/maps/api/geocode/json?address=Clarkston+MI&传感器=真实
返回:
{
"results" : [
{
"address_components" : [
{
"long_name" : "Clarkston",
"short_name" : "Clarkston",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Oakland",
"short_name" : "Oakland",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Michigan",
"short_name" : "MI",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "48346",
"short_name" : "48346",
"types" : [ "postal_code" ]
}
],
"formatted_address" : "Clarkston, MI 48346, USA",
"geometry" : {
"bounds" : {
"northeast" : {
"lat" : 42.7418310,
"lng" : -83.41402409999999
},
"southwest" : {
"lat" : 42.7252370,
"lng" : -83.42880730000002
}
},
"location" : {
"lat" : 42.73511960,
"lng" : -83.41929410
},
"location_type" : "APPROXIMATE",
"viewport" : {
"northeast" : {
"lat" : 42.74331460,
"lng" : -83.40328670
},
"southwest" : {
"lat" : 42.72692350,
"lng" : -83.43530149999999
}
}
},
"types" : [ "locality", "political" ]
}
],
"status" : "OK"
}
编辑
如果你在第一次通话中没有收到邮政编码,你就必须使用第一次通话的坐标对同一网络服务进行第二次通话。仍然非常简单-威斯康星州史蒂文斯角的呼叫如下:
http://maps.googleapis.com/maps/api/geocode/json?latlng=44.52357920000001,-89.5745630&传感器=真实
您可以从"location"获取lat/lng值。希望这能有所帮助!
上面最流行的答案是不完整的。请查看下面我的最新答案,我在这里描述了我个人验证的方法,以从谷歌地图API获得最准确的结果。在一个拥有超过1亿个独特位置的网站上进行了测试。
每个城市都有许多邮政编码。
我以前遇到过这样的问题,当时我必须为混合位置+关键字的网站地图生成超过100万个链接组合。
起初,我尝试添加关键字"中心","中心"&城市名称和国家的"中心",80%的时间都有效,由于我必须完成的工作量,这还不够好。
因此,我一直在寻找更好的解决方案,最终,我为Google Maps Geocode API找到了2个新参数,只需在查询URL中复制/粘贴部分结果。
请注意:谷歌没有记录这一点,虽然它现在正在工作,但将来可能不会工作。
第一个参数:
&components=country:UK // where "UK" is a country of choice, by utilising this method, rather than adding the Country to the City name, you will avoid clashes and reduce the risk of not getting the postcode.
第二个参数:
&location_type=GEOMETRIC_CENTER& // as is, this will get you a place closest to the central geometrical location of the town/city.
完整示例:
var city_name = 'Edinburgh'; // City/Town/Place Name
var country_code = 'GB'; // Great Britain
var key = 'AIzaSyBk********************cM' // Google API Key
var query = https://maps.googleapis.com/maps/api/geocode/json?address='+city_name+'&components=country:'+country_code+'&location_type=GEOMETRIC_CENTER&key='+key+'&sensor=false
此外,当通过JSON进行循环时,有时POSTCODE不在结果的第一层次结构中,因此,如果第一行缺少POSTCCODE,请确保通过第二行进行循环。
下面是一个遍历数组的循环示例:
url = geocode_query;
fetch(url)
.then(res => res.json())
.then((out) => {
result = JSON.parse(out);
postcode = get_postcode(result); // HERE is Your Postcode do what you need with it
})
.catch(err => { throw err });
function get_postcode(results){
city_data = results['results'][0]['address_components'];
for(i=0;i<city_data.length;i++){
var cv = city_data[i];
if(typeof cv['types'][0] != 'undefined')){
if(cv['types'][0] === 'postal_code'){
city['postcode'] = cv['long_name'];
}else if(cv['types'][0] === 'postal_town'){
city['place_name'] = cv['postal_town'];
}
}
}
if(typeof city == 'undefined'){
city_data = results['results'][1]['address_components'];
for(i=0;i<city_data.length;i++){
var cv = city_data[i];
if(typeof cv['types'][0] != 'undefined')){
if(cv['types'][0] === 'postal_code'){
city['postcode'] = cv['long_name'];
}
}
}
}
return city;
}
享受吧!
我这样做的方式是进行两次调用。
On the first call my query is: geocode('address=' .$cty. ',' .$st, $key);
$cty = city name - $st = state abbreviation - $key is my api key
-
On the second call my query is: geocode('latlng=' .$lat. "," .$lng, $key);
$lat = latitude from first call - $lng = longitude from first call
---------
My function appears below.
--------------------------------------
function geocode($query, $key){
global $lat, $lng, $zipcode, $city, $state;
$url = 'https://maps.googleapis.com/maps/api/geocode/json?'.$query.'&key='.$key;
$json_string = curlfun($url); // this uses CURL to access the url (false on fail)
if($json_string){
$parsed_json = json_decode($json_string, true);
//
if ($parsed_json['status'] == "OK"){
$lat = $parsed_json['results'] [0] ['geometry'] ['location'] ['lat'];
$lng = $parsed_json['results'] [0] ['geometry'] ['location'] ['lng'];
foreach($parsed_json['results'] [0] ['address_components'] as $a){
if($a ['types'] [0] == 'postal_code') $zipcode = $a ['long_name'];
if($a ['types'] [0] == 'locality') $city = $a ['long_name'];
if($a ['types'] [0] == 'administrative_area_level_1') $state = $a ['short_name'];
}
}
else return false;
}
else return false;
if(!$city) return false; // if there is no city just return false.
return true;
}
---------------------------------------------------
在函数调用之后,全局变量可用于脚本的其余部分。函数在失败时返回false,在成功时返回true。应该在主代码中进行适当的错误处理。
var res; // store response in res variable
var add_array = res[0].address_components; //add_array = {
"long_name" : "Clarkston",
"short_name" : "Clarkston",
"types" : [ "locality", "political" ]
},
{
"long_name" : "Oakland",
"short_name" : "Oakland",
"types" : [ "administrative_area_level_2", "political" ]
},
{
"long_name" : "Michigan",
"short_name" : "MI",
"types" : [ "administrative_area_level_1", "political" ]
},
{
"long_name" : "United States",
"short_name" : "US",
"types" : [ "country", "political" ]
},
{
"long_name" : "48346",
"short_name" : "48346",
"types" : [ "postal_code" ]
}
var add_array = add_array[add_array.length-1]; //add_array = {
"long_name" : "48346",
"short_name" : "48346",
"types" : [ "postal_code" ]
}
var zip = add_array.long_name; //zip = 48346