Aw I was REALLY hoping to see geocoding + reverse geocoding.
To clarify why, the landscape for that is fairly grim right now. GeoNames (http://www.geonames.org) seems to be the best that i've evaluated thus far. It'll cost you at scale (not much), but it's international and can find nearby neighborhoods/cities. Google requires you to display their information on one of their maps if you use them to geocode or reverse geocode.
Question for iOS devs out there: how are you finding nearby cities in your app from a lat/lng point? (is even asking this against the ios rules?) Right now I am using geonames and the results are pretty decent. Works for now!
Note: I have setup a nominatim server. Unless you have 128gb of ram and some SSD's or 15k SAS drives, be prepared to wait over 1 month. The indexes are intense and they take, literally, over a month to create if you end up swapping. To avoid swapping you need at least 128gb of ram....
I guess if all you want is geocoding, you could exclude a lot of data before importing it. Eg landuses without names, lots of single nodes that have nothing to do with addresses, etc.
Have you set it up? I have...and I am giving you the amount of time it took to do a world import on data from January. This was on a quad core xeon 5345 with 32gb of ram and a dedicated SSD for swap, with database living on a RAID10 of 8 7200 rpm drives. In other words, the box is decent.
I am not trying to fear monger, I am just trying to say "hey, BTW unless you have a big hardware budget, you might want to just pay a third party".
Blast from the past! I worked on this project, mainly on the associated Facebook app, "Friends on Fire". The original crew has scattered around the place - several work at Twitter now, one is running a dev shop in Uruguay, one is freelancing in SF, a couple are at various startups down the peninsula.
Easter egg: All the little pixel characters on the homepage are members of the dev team. I'm the one on the left in blue jeans and a dotted shirt :)
They offer both SaaS, as well as a simple way to deploy the whole thing and run a local (reverse-) geocoding server. It does take a few days to build the GeoNames + OpenStreetMap index though. I run it locally for mapping coordinates to cities and it runs quite decently, a 2-core 2GB Linux VM running PostgreSQL gets me about 80-100 queries/s. It has a nice JSON API so it shouldn't be too hard using it from iOS.
That strikes me as a fairly low number of requests per second for powerful dedicated hardware. Am I way off here? Is the problem much harder than I think it is?
iOS's built in MapKit provides a reverse geocoding lookup API. It used to abstract away the Google geocoding API, but I'm not sure if iOS6 still relies on Google for that, I haven't looked into it.
The basic gist of it: Init a CLLocation object with a lat/long (probably pulled from the device GPS or a map dropped pin) and then call CLGeocoder's reverseGeocodeLocationInitialize and it'll return a CLPlacemark, which contains the approximate address.
To just find nearby cities from a lat/long though, you probably don't need to reverse lookup the address, it's probably easier to use something like MaxMind's free database which would give you the lat/long of cities, host it either locally on the device (a subset, obv) or on your server and then just use math to put some coordinate min/max bounds on your query to find city names nearby.
It hasn't relied on Google since iOS 5, when CLGeocoder was introduced. This is one reason why the new geocoding classes (versus the now deprecated MapKit ones, which used Google) are somewhat less accurate and absent entirely from certain countries.
To clarify why, the landscape for that is fairly grim right now. GeoNames (http://www.geonames.org) seems to be the best that i've evaluated thus far. It'll cost you at scale (not much), but it's international and can find nearby neighborhoods/cities. Google requires you to display their information on one of their maps if you use them to geocode or reverse geocode.
Question for iOS devs out there: how are you finding nearby cities in your app from a lat/lng point? (is even asking this against the ios rules?) Right now I am using geonames and the results are pretty decent. Works for now!