Looking for a good and free reverse geocoding API [closed]
Asked Answered
A

4

17

I am familiar with two reverse geocoding APIs - Google Maps and foursquare. Both have problems. Consider lat,lng = 35.699,139.707 (Tokyo).

Foursquare:

GET https://api.foursquare.com/v2/venues/search?ll=35.699,139.707&oauth_token=5TJR4WQZSOW0ZWTE4ENMXKO3Y415252GITEMRPQIVPMEGCYK&v=20120723&limit=1

yields the following result:

{
"meta": {
    "code": 200
},
"notifications": [
    {
        "type": "notificationTray",
        "item": {
            "unreadCount": 0
        }
    }
],
"response": {
    "venues": [
        {
            "id": "4b64ebedf964a520e3d92ae3",
            "name": "まいどおおきに食堂 東新宿食堂",
            "contact": {
                "phone": "0352911870",
                "formattedPhone": "03-5291-1870"
            },
            "location": {
                "address": "大久保1-1-45",
                "crossStreet": "新宿セントラルハイツプラザ 1F",
                "lat": 35.698492646211,
                "lng": 139.707271456718,
                "distance": 61,
                "postalCode": "169-0072",
                "city": "新宿区",
                "state": "東京都",
                "country": "Japan",
                "cc": "JP"
            },
            "categories": [
                {
                    "id": "4bf58dd8d48988d111941735",
                    "name": "Restaurant japonais",
                    "pluralName": "Restaurants japonais",
                    "shortName": "Japonaise",
                    "icon": {
                        "prefix": "https://foursquare.com/img/categories_v2/food/japanese_",
                        "suffix": ".png"
                    },
                    "primary": true
                }
            ],
            "verified": false,
            "stats": {
                "checkinsCount": 191,
                "usersCount": 100,
                "tipCount": 1
            },
            "url": "http://www.shokudo.jp/",
            "likes": {
                "count": 0,
                "groups": []
            },
            "specials": {
                "count": 0,
                "items": []
            },
            "hereNow": {
                "count": 0,
                "groups": []
            }
        }
    ]
}

}

I am only interested in the response.venues[0].location.city entry. Unfortunately, I do not know Japanese, so I cannot tell what it is. Well, google says it is Shinjuku - one of the special wards of Tokyo.

Google Maps:

GET http://maps.googleapis.com/maps/api/geocode/json?sensor=false&language=en&latlng=35.699,139.707

yields:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "41",
               "short_name" : "41",
               "types" : [ "sublocality_level_4", "sublocality", "political" ]
            },
            {
               "long_name" : "1",
               "short_name" : "1",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "1丁目",
               "short_name" : "1丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Japan, Tokyo, Shinjuku, Okubo, 1丁目1−41",
         "geometry" : {
            "location" : {
               "lat" : 35.69893960,
               "lng" : 139.7069460
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70028858029149,
                  "lng" : 139.7082949802915
               },
               "southwest" : {
                  "lat" : 35.69759061970850,
                  "lng" : 139.7055970197085
               }
            }
         },
         "types" : [ "sublocality_level_4", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "169-8540",
               "short_name" : "169-8540",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "2",
               "short_name" : "2",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "1丁目",
               "short_name" : "1丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "1丁目-2 Okubo, Shinjuku, Tokyo 169-8540, Japan",
         "geometry" : {
            "location" : {
               "lat" : 35.69946460,
               "lng" : 139.70746810
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70081358029149,
                  "lng" : 139.7088170802915
               },
               "southwest" : {
                  "lat" : 35.69811561970850,
                  "lng" : 139.7061191197085
               }
            }
         },
         "types" : [ "postal_code" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "1",
               "short_name" : "1",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "1丁目",
               "short_name" : "1丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Japan, Tokyo, Shinjuku, Okubo, 1丁目1",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.69984490,
                  "lng" : 139.70749510
               },
               "southwest" : {
                  "lat" : 35.69787060,
                  "lng" : 139.70506090
               }
            },
            "location" : {
               "lat" : 35.69880630,
               "lng" : 139.70610160
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70020673029150,
                  "lng" : 139.7076269802915
               },
               "southwest" : {
                  "lat" : 35.69750876970850,
                  "lng" : 139.7049290197085
               }
            }
         },
         "types" : [ "sublocality_level_3", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "1丁目",
               "short_name" : "1丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Japan, Tokyo, Shinjuku, Okubo, 1丁目",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.70128920,
                  "lng" : 139.70796940
               },
               "southwest" : {
                  "lat" : 35.69787060,
                  "lng" : 139.7019760
               }
            },
            "location" : {
               "lat" : 35.69868950,
               "lng" : 139.70306310
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70128920,
                  "lng" : 139.70796940
               },
               "southwest" : {
                  "lat" : 35.69787060,
                  "lng" : 139.7019760
               }
            }
         },
         "types" : [ "sublocality_level_2", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Okubo, Shinjuku, Tokyo, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.70956610,
                  "lng" : 139.7091340
               },
               "southwest" : {
                  "lat" : 35.69787310,
                  "lng" : 139.70060080
               }
            },
            "location" : {
               "lat" : 35.70418340,
               "lng" : 139.70558750
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70956610,
                  "lng" : 139.7091340
               },
               "southwest" : {
                  "lat" : 35.69787310,
                  "lng" : 139.70060080
               }
            }
         },
         "types" : [ "sublocality_level_1", "sublocality", "political" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Higashishinjuku Station",
               "short_name" : "Higashishinjuku Station",
               "types" : [ "train_station", "transit_station", "establishment" ]
            },
            {
               "long_name" : "27",
               "short_name" : "27",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "7丁目",
               "short_name" : "7丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Higashishinjuku Station, 7丁目-27 Shinjuku, Tokyo, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.7050830,
                  "lng" : 139.7144590
               },
               "southwest" : {
                  "lat" : 35.6926030,
                  "lng" : 139.7000410
               }
            },
            "location" : {
               "lat" : 35.697920,
               "lng" : 139.7075490
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.7050830,
                  "lng" : 139.7144590
               },
               "southwest" : {
                  "lat" : 35.6926030,
                  "lng" : 139.7000410
               }
            }
         },
         "types" : [ "train_station", "transit_station", "establishment" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "169-0072",
               "short_name" : "169-0072",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "Okubo",
               "short_name" : "Okubo",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Okubo, Shinjuku, Tokyo 169-0072, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.70972520,
                  "lng" : 139.71028470
               },
               "southwest" : {
                  "lat" : 35.69710930,
                  "lng" : 139.69624280
               }
            },
            "location" : {
               "lat" : 35.70418340,
               "lng" : 139.70558750
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70972520,
                  "lng" : 139.71028470
               },
               "southwest" : {
                  "lat" : 35.69710930,
                  "lng" : 139.69624280
               }
            }
         },
         "types" : [ "postal_code" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Shinokubo Station",
               "short_name" : "Shinokubo Station",
               "types" : [ "train_station", "transit_station", "establishment" ]
            },
            {
               "long_name" : "10",
               "short_name" : "10",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "1丁目",
               "short_name" : "1丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Hyakunincho",
               "short_name" : "Hyakunincho",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Shinokubo Station, 1丁目-10 Hyakunincho, Shinjuku, Tokyo, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.7078270,
                  "lng" : 139.708840
               },
               "southwest" : {
                  "lat" : 35.6953970,
                  "lng" : 139.6937970
               }
            },
            "location" : {
               "lat" : 35.7013060,
               "lng" : 139.7000440
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.7078270,
                  "lng" : 139.708840
               },
               "southwest" : {
                  "lat" : 35.6953970,
                  "lng" : 139.6937970
               }
            }
         },
         "types" : [ "train_station", "transit_station", "establishment" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "Shinjuku Station",
               "short_name" : "Shinjuku Station",
               "types" : [ "train_station", "transit_station", "establishment" ]
            },
            {
               "long_name" : "38",
               "short_name" : "38",
               "types" : [ "sublocality_level_3", "sublocality", "political" ]
            },
            {
               "long_name" : "3丁目",
               "short_name" : "3丁目",
               "types" : [ "sublocality_level_2", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Shinjuku Station, 3丁目-38 Shinjuku, Tokyo, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.7005790,
                  "lng" : 139.7124960
               },
               "southwest" : {
                  "lat" : 35.6812220,
                  "lng" : 139.6878250
               }
            },
            "location" : {
               "lat" : 35.6909210,
               "lng" : 139.7002580
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.7005790,
                  "lng" : 139.7124960
               },
               "southwest" : {
                  "lat" : 35.6812220,
                  "lng" : 139.6878250
               }
            }
         },
         "types" : [ "train_station", "transit_station", "establishment" ]
      },
      {
         "address_components" : [
            {
               "long_name" : "160-0022",
               "short_name" : "160-0022",
               "types" : [ "postal_code" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "sublocality_level_1", "sublocality", "political" ]
            },
            {
               "long_name" : "Shinjuku",
               "short_name" : "Shinjuku",
               "types" : [ "locality", "political" ]
            },
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Shinjuku, Tokyo 160-0022, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.70311470,
                  "lng" : 139.71922230
               },
               "southwest" : {
                  "lat" : 35.68222330,
                  "lng" : 139.69241360
               }
            },
            "location" : {
               "lat" : 35.69110170,
               "lng" : 139.7067630
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.70311470,
                  "lng" : 139.71922230
               },
               "southwest" : {
                  "lat" : 35.68222330,
                  "lng" : 139.69241360
               }
            }
         },
         "types" : [ "postal_code" ]
      },
   /* REMOVED FOR BREVITY */
   ],
   "status" : "OK"
}

Google Maps API is in English, but its results are too low level. For instance, cities and towns are normally identified with the locality type. Here the locality is Shinjuku, which is one of the special wards of Tokyo, but it is an implementation detail of the administration system of Tokyo. I want to get Tokyo as the city. Of course, I could search for the administrative_area_level_1 type token instead of the locality, knowing that Tokyo is actually one of the Japan prefectures.

The foursquare API has the same problem, it reports the city as Shinjuku and the state as Tokyo, only both as in Japanese!

Are there any simple high level reverse geocoding API which returns common sense results? I mean, no one outside Japan says "I am going to Shinjuku". People say "I am going to Tokyo".

Thanks.

Anachronous answered 23/7, 2012 at 16:0 Comment(1)
Your definition of "common sense" is very narrow. Over 70% of the people in the world don't even speak english, so what more "common" than returning whatever the locals will call the place? In any case, Tokyo is NOT a city, it's a Level 1 Administrative Area (Province, State, Prefecture, Canton). If you want to say "Tokyo" or "Saitama" or "Nagano" just because you don't know the names of japanese cities, then just use lvl1 administrative areas from the google API.. But don't then complain because you're saying "Illinois" instead of "Chicago"Clyburn
A
5

The Yahoo Maps API may be able to help you out, because it offers the ability to set the precision.

Andean answered 23/7, 2012 at 16:3 Comment(2)
+1 for referencing me to Yahoo API. I am checking it right now. It seems to work exactly as I expect for the coordinate given in this question. But I have more coordinates to check.Anachronous
There is one problem though. Yahoo covers quite less territory than Google.Anachronous
M
31

OpenStreeMap has a reverse lookup tool too:

http://wiki.openstreetmap.org/wiki/Nominatim#Reverse_Geocoding_.2F_Address_lookup

Example from link:

Query:

 http://nominatim.openstreetmap.org/reverse?format=xml&lat=52.5487429714954&lon=-1.81602098644987&zoom=18&addressdetails=1

Result:

 <reversegeocode timestamp="Fri, 06 Nov 09 16:33:54 +0000" querystring="...">
   <result place_id="1620612" osm_type="node" osm_id="452010817">
     135, Pilkington Avenue, Wylde Green, City of Birmingham, West Midlands (county), B72, United Kingdom
   </result>
   <addressparts>
     <house>135</house>
     <road>Pilkington Avenue</road>
     <village>Wylde Green</village>
     <town>Sutton Coldfield</town>
     <city>City of Birmingham</city>
     <county>West Midlands (county)</county>
     <postcode>B72</postcode>
     <country>United Kingdom</country>
     <country_code>gb</country_code>
   </addressparts>   
 </reversegeocode>
Mclellan answered 12/9, 2013 at 7:22 Comment(1)
But be aware that this service is only for a very small number of requests ("an absolute maximum of 1 request per second").Campstool
A
5

The Yahoo Maps API may be able to help you out, because it offers the ability to set the precision.

Andean answered 23/7, 2012 at 16:3 Comment(2)
+1 for referencing me to Yahoo API. I am checking it right now. It seems to work exactly as I expect for the coordinate given in this question. But I have more coordinates to check.Anachronous
There is one problem though. Yahoo covers quite less territory than Google.Anachronous
W
5

Try GeocodeFarm.

250 free queries daily per IP based but the web service is free for unlimited and the cheap $25 gives you 25,000 queries daily (which is what I use for my apps).

Results are easy to understand, thorough documentation, forward and reverse, etc.

Wives answered 14/12, 2013 at 22:44 Comment(2)
25000 queries daily is actually £100/month now...Valera
no free version now. be aware of thatCenturial
H
1

You can try Bing Maps I don't know how accurate it is, but you can try it

http://dev.virtualearth.net/services/v1/geocodeservice/geocodeservice.asmx/ReverseGeocode?latitude=[NUMBER]&longitude=[NUMBER]&key=[MAPS_KEY]&culture=%22en-us%22&format=json
Hypotonic answered 26/1, 2013 at 0:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.