Getting zip-code + 4 from latitude/longitude - iphone

Does anyone know the best way to use the iPhone location services (lat/long) to determine the zip code+4 of the user? Does MKReverseGeocoder have the ability to pull back zip+4?
Thanks!
-tony

My favorite place to go for anything having to do with geocoding is geonames.org.

You may be able to use a free Reverse Geocoding service to do this for you.
Google has such a service: http://code.google.com/apis/maps/documentation/services.html#ReverseGeocoding
Alternately, this Google Groups post has a listing of other Reverse Geocoding services: http://groups.google.com/group/Google-Maps-API/web/resources-non-google-geocoders?pli=1

Apple's documentation says that the MKPlacemark that MKReverseGeocoder only returns a five-digit zip code. You may have to use an outside reverse geocoder as described in the other answers to get the extra four digits.

Related

Using Google Maps Geocoding API

Basically I need to get info like state, county, zip code with a user's lat/lng coords from a CLLocation object.
Does anyone know if Google has an Objective-C library for its Geocoding service? Or maybe with iOS 6 maps this will be handled by Apple's API. Running into Google API limits when using query string:
http://maps.googleapis.com/maps/api/geocode/json?latlng=39.76144296429947,-104.8011589050293&sensor=false
so I am hoping I can use an API key/ Google Wallet account to make these calls freely, via native Objc calls. Basically I need to get info like state, county, zip code with a user's lat/lng coords from a CLLocation object.
Suggestions on where to look for info on this is greatly appreciated.
For anyone visiting this answer and not looked hard enough,
CLGeocoder class
does all of this. You need to show a map with it as part of the usage terms... or you did previously have to - dont quote me on it!!!

Where can I find or what API can i use to find the lang/long of a certain place?

I am making an app which you open it up and it will use your lang/long point to find the nearest ( for example: shop ) what api, or what would i need to do this?
/* this app is for the iPhone *\
You would use the CoreLocation framework
Read the CLLocation docs and Core Location Data Types
There's no built-in API to find the nearest shop/restaurant/whatever, but you can make requests to the Google Local Search API to find them.
Note that this API is deprecated and will be phased out over the next 3 years, but I'm sure something will replace it.
You can also use Yahoo's placefinder api:
http://developer.yahoo.com/geo/placefinder/guide/

how to get latitude and longitude from the address in MKMapkit?

I have implemented one application .In which i want to get latitude and longitude from the address.I dont want to use java script.Is it possble then please help me.
AFAIK, MKMapKit does not support this.
MapKit has no geocoding support (only reverse geocoding) but Google offers a HTTP Geocoding service that's very easy to use – assuming you comply with their license terms:
Note: the geocoding service may only be used in conjunction with a Google map; geocoding results without displaying them on a map is prohibited.
Use the example from Apple’s «Location Awareness Programming guide: Geocoding Location Data» to pinpoint your location on the map, then call Google Geocoding Service (post a request, parse the result json/xml data) to get the address.

How do I do geocoding (NOT reverse geocoding) on iPhone?

I am perplexed as to why there is an iPhone API for Reverse Geocoding (lat/long to address) but NOT for regular Geocoding (address to lat/long).
I want to be able to display an annotation on a map (MKMapView) at an address entered by the user. (As text, not by touching the map) As far as I can tell, that means I have to determine the lat/long for the entered address.
It looks like it can be done using HTTP, but then, Reverse Geocoding ALSO could have been done that way, too. Why did they support one but not the other?
Answers as to "why?" or "how?" would both be appreciated.
*** Anyone learned anything new on this topic? Any announcements I haven't heard about?
Merrimack wrote an answer here with a useful example..
Forward geocoding from the iPhone
There is a nice blog post of him
http://blog.sallarp.com/ipad-iphone-forward-geocoding-api-google/
I had the same issue and wrote a geocoding class. http://web.me.com/andreas.bungert/erle_muss_sein/iPhone_Development/Einträge/2009/7/9_Geocoding_im_SDK.html
Best Regards
For those finding this question long after it was asked:
As brainjam notes, since iOS 5 Apple's CLGeocoder class supports forward-geocoding.
I am looking at the source code available from:
http://www.pragprog.com/screencasts/v-bdmapkit/using-the-map-kit
In what part the forward geocoding used?
Thanks

Integrate Google Maps API into an iPhone app

Update: iPhone SDk 3.0 now addresses the question here, however the NDA prevents any in depth discussion. Log in to the iPhone Dev Center if you need more info.
Ok, I have to admit I'm a little lost here.
I am fairly comfortable with Cocoa, but am having trouble picking up the bit of javascript needed to solve this problem.
I am trying to send a request to Google for a reverse geo code.
I have looked over the Google documentation I have viewed here:
http://code.google.com/apis/maps/documentation/index.html
http://code.google.com/apis/maps/documentation/geocoding/
Even after a rough reading, I am missing a basic concept:
How do I talk to google? In some examples, they show a url being sent to google (which seems easy enough), but in others they show javascript. It seems for reverse geocoding, the request might be be harder than sending the url with some parameters (but I hope I am wrong).
Can someone point me to the correct way to make a request? (In objective-C, so I can wrap my head around it)
UPDATE - iPhone 0.3 includes MapKit, which will hopefully be significantly faster than using the JS API. The blurb says that it will include reverse geocoding.
You can't make a request directly in objective-C, at least not within the terms of the Google API. The Google API is written in Javascript. You could use an objective-c to JS bridge, as the Google Maps Component does, but that doesn't really solve the issue - you're still making JS calls!
Unfortunately, that means you
a) need to use a webview
b) need to use the JS API which is slow... compare with the Google Maps application which uses a completely different OTA protocol (try packet sniffing it).
The Google Maps Component is, however, a useful tutorial in how to make simple calls to the API.
I have created SVGeocoder, a simple forward and reverse geocoder class for iOS. It uses the Google Geocoding API, returns SVPlacemark objects (an MKPlacemark subclass with a coordinate property) and uses blocks.
This is how you geocode an address string:
[SVGeocoder geocode:addressString
completion:^(NSArray *placemarks, NSError *error) {
// do something with placemarks, handle errors
}];
You can also reverse geocode a coordinate like this:
[SVGeocoder reverseGeocode:CLLocationCoordinate2DMake(45.53264, -73.60518)
completion:^(NSArray *placemarks, NSError *error) {
// do something with placemarks, handle errors
}];
The easiest way to get a Google map using Cocoa is to use the "Static Maps API". In practice, you need to prepare an NSURL that you use to contact Google. You get back your map as NSData, that you transform to an NSImage. Note that you can do both geocoding and reverse geocoding. You can also embed markers on the map. However, you loose the full controls you have access to if you use their JavaScript API.
Take a look at their reference guide here:
http://code.google.com/apis/maps/documentation/staticmaps/
Now that apple have release the MapKit API for OS 3.0, I think your question has been answered. Having looked at the API docs, I can see a heck of a lot of potential! I still would like to see reverse geocoding webservice from Google, but Yahoo will do in the meantime.
For your information: The reverse geocoding API from Google for requests by XML isn't public, so it's illegal to use. The only legal way is going through their JavaScript-API, which as you found out is harder to do in Cocoa than to simply send an HTTP request.
Alternatives: Reverse geocoding with simple XML/JSON requests is also available from Geonames or Yahoo.
Since iOS5 we have the following options as stated in the development doc:
* "A geocoder object uses a network service to convert between latitude and longitude values and a user-friendly placemark, which is a collection of data such as the street, city, state, and country information. Reverse geocoding is the process of converting a latitude and longitude into a placemark. Forward geocoding is the process of converting place name information into a latitude and longitude value. Reverse geocoding is supported in all versions of iOS but forward geocoding is supported only in iOS 5.0 and later."*
You can now use a CLGeocoder object.
Also try to take a look at google maps component.
Actually, I did not meant reverse geocoding as "translating a point into a human-readable address", but rather visualizing a point using a Google Map (that can also, depending on the accuracy level, show a human-readable address). This is the basic functionality that was required.
In practice, I just wanted to suggest the static maps API as a clean and fast way to:
1) given the coordinates obtained from the iPhone GPS sensor, retrieve a Google Map showing the point
2) given an address, transform it in the corresponding geographical coordinates and then use the coords to retrieve a Google Map showing the address given
Both are possible using simple NSURLs involving the staticmap and geo services
http://maps.google.com/staticmap?
http://maps.google.com/maps/geo?
passing of course the needed parameters to provide a suitable query string.
Kind regards
The big issue of course, is that the license agreement of both google and yahoo state you can't use these API's in "commercial applications". would hate to pub an app on the app store only to have it taken down and sued by yahoo or google. In reading the iPhone 3.0 map api and associated license this isn't mentioned but if you want an app to run on phones not upgraded....
Is there an answer for this that won't get one in trouble?
http://blog.cloudmade.com/2009/06/12/how-to-get-forward-geocoding-in-iphone-mapkit/
CloudMade seems to be an open-source map/location provider - the above blog post lists details on how to get forward geocoding.