Easiest Way To Get Zip Code From City Name
Solution 1:
Google can help you out here!
https://developers.google.com/maps/documentation/geocoding/
The zip is actually called "postal_code" by Google.
"long_name": "94043",
"short_name": "94043",
"types": postal_code
For example, let's say you want to get the zip for Clarkston, MI...
http://maps.googleapis.com/maps/api/geocode/json?address=Clarkston+MI&sensor=true
This returns:
{"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"}
EDIT
If you're not receiving a postal code with that first call, you'll have to make a second call to the same web service using the coordinates from the first call. Still very simple - the call for Stevens Point, WI would be as follows:
http://maps.googleapis.com/maps/api/geocode/json?latlng=44.52357920000001,-89.5745630&sensor=true
You can grab the lat/lng values from "location". Hope this helps!
Solution 2:
The most popular answer above is incomplete. Please check my more up-to date answer below, where I describe my personal proven method to get the most accurate results from Google Maps API. Tested on a website with over 100 million unique locations.
There are many postcodes in each city.
I've had an issue like this one before when I had to generate over 1 million combinations of links for sitemaps with mixed locations + keywords.
At first, I have tried adding keywords "center", "central" & "centre" to the city name as well as the country and it worked 80% of the time, which was not good enough due to the volume I've had to accomplish.
So I kept digging for a better solution and eventually, I have found 2 NEW parameters for Google Maps Geocode API, simply by copy/pasting parts of the results in the query URL.
Please note: This is not documented by Google and whilst it is working just now, it might not work in the future.
1st Parameter:
&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.
2nd Parameter:
&location_type=GEOMETRIC_CENTER& // as is, this will get you a place closest to the central geometrical location of the town/city.
Full Example:
var city_name = 'Edinburgh'; // City/Town/Place Namevar country_code = 'GB'; // Great Britain var key = 'AIzaSyBk********************cM'// Google API Keyvar query = https://maps.googleapis.com/maps/api/geocode/json?address='+city_name+'&components=country:'+country_code+'&location_type=GEOMETRIC_CENTER&key='+key+'&sensor=false
Also when looping through JSON sometimes POSTCODE is not in the 1st hierarchy of results, so be sure to loop through the 2nd row, if the 1st one is missing the POSTCODE.
Here is a looping example through the array:
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 });
functionget_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'];
}elseif(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;
}
Enjoy!
Solution 3:
The way I am doing it is by making two calls.
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 functionappearsbelow.
--------------------------------------
functiongeocode($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'];
}
}
elsereturnfalse;
}
elsereturnfalse;
if(!$city) returnfalse; // if there is no city just return false.returntrue;
}
---------------------------------------------------
The global variables are available to the rest of the script after the function call. The function returns false on failure or true on success. Appropriate error handling should be done in the main code.
Solution 4:
var res; // store response in res variablevar 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
Post a Comment for "Easiest Way To Get Zip Code From City Name"