开发者

Latitude and longitude can find zip code?

I am using Google geocoder for lat and lon and my question is, is there a way you can find out z开发者_JAVA百科ipcode with latitude and longitude?


It's good to note that Google Maps has a new version since this solultion was presented.

Reference: https://developers.google.com/maps/documentation/geocoding/?csw=1#ReverseGeocoding

Here's an updated example for Google Maps v3. It makes use of the Address Components that JIssak mentions above. I should note that there is no fallback. If it fails to find a zip code, it does nothing. This may or may not be important to your script.

var latlng = new google.maps.LatLng(p.coords.latitude, p.coords.longitude);
geocoder = new google.maps.Geocoder();

    geocoder.geocode({'latLng': latlng}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[0]) {
                for (j = 0; j < results[0].address_components.length; j++) {
                    if (results[0].address_components[j].types[0] == 'postal_code')
                        alert("Zip Code: " + results[0].address_components[j].short_name);
                }
            }
        } else {
            alert("Geocoder failed due to: " + status);
        }
    });


I think what you are looking for is the address_components[] in the results array. Maybe something like this would work, just typing the below so it might have errors in it but I think you will get the idea.

http://code.google.com/apis/maps/documentation/geocoding/#Results

function (request, response) {
  geocoder.geocode({ 'address': request.term, 'latLng': centLatLng, 'region': 'US' }, function (results, status) {
    response($.map(results, function (item) {
      return {
       item.address_components.postal_code;//This is what you want to look at
      }
}


[Removed non-working solution for google - see @hblackorby's solution.]

Here's a version that uses openstreetmap.org, much simpler than google's api - coffeescript, then javascript:

getZip = (cb) ->
  # try to populate zip from geolocation/google geocode api
  if document.location.protocol == 'http:' && navigator.geolocation?
    navigator.geolocation.getCurrentPosition (pos) ->
      coords = pos.coords
      url = "http://nominatim.openstreetmap.org/reverse?format=json&lat=#{ coords.latitude }&lon=#{ coords.longitude }&addressdetails=1"
      $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonp: 'json_callback',
        cache: true,
      }).success (data) ->
        cb(data.address.postcode)

Here's the compiled javascript:

getZip = function(cb) {
  if (document.location.protocol === 'http:' && (navigator.geolocation != null)) {
    return navigator.geolocation.getCurrentPosition(function(pos) {
      var coords, url;
      coords = pos.coords;
      url = "http://nominatim.openstreetmap.org/reverse?format=json&lat=" + coords.latitude + "&lon=" + coords.longitude + "&addressdetails=1";
      return $.ajax({
        url: url,
        dataType: 'jsonp',
        jsonp: 'json_callback',
        cache: true
      }).success(function(data) {
        return cb(data.address.postcode);
      });
    });
  }
};

Use it like this:

getZip(function(zipcode){ console.log("zip code found:" + zipcode); });


Yahoo's PlaceFinder API provides a good wat to lookup location data by lat/lng:

http://developer.yahoo.com/geo/placefinder/

Here's an example url that they use:

http://where.yahooapis.com/geocode?q=38.898717,+-77.035974&gflags=R


It would seem so:

Source: Google Maps API Service

Geocoding is the process of converting addresses (like "1600 Amphitheatre Parkway, Mountain View, CA") into geographic coordinates (like latitude 37.423021 and longitude -122.083739), which you can use to place markers or position the map. The Google Geocoding API provides a direct way to access a geocoder via an HTTP request. Additionally, the service allows you to perform the converse operation (turning coordinates into addresses); this process is known as "reverse geocoding."

You should also check out this documentation which has some sample code: Reverse Geocoding


I made a generic function to look for the type that you want. Not always the address_component has zipcode, country, etc and if they do not always are in the same index. Sometimes your array is lenght 8, 6 or whatever. I did it in Typescript, just change a few things to make it vanilla JS.

getPlaceTypeValue(addressComponents: Places[], type: string): string {
    let value = null;
    for (const [i] of addressComponents.entries()) {
      if (addressComponents[i].types.includes(type)) {
        value = addressComponents[i].long_name;
        break;
      }
    }
    return value;
  }

OR

getPlaceTypeValue(addressComponents: any[], type: string): string {
    return (addressComponents.find(({ types }) => types.includes(type)) || {}).long_name || null;
}

Example of usage:

this.placesService.getPlaceTypeValue(address.address_components, 'postal_code');
this.placesService.getPlaceTypeValue(address.address_components, 'country');
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜