2

I'm attempting to use the Google Maps API with the GoogleMaps Python library to geocode latitude/longitude when provided with whole or part of an address (in this example, I'm using city/state, but I also have datasets with just zip codes that I'll need to use this for down the line).

 import googlemaps
 gmaps = googlemaps.Client(key=[insert API key here])
 geocode_result = gmaps.geocode('Sacramento, CA')
 print(geocode_result)

Result:[{u'geometry': {u'location_type': u'APPROXIMATE', u'bounds': {u'northeast': {u'lat': 38.685507, u'lng': -121.325705}, u'southwest': {u'lat': 38.437574, u'lng': -121.56012}}, u'viewport': {u'northeast': {u'lat': 38.685507, u'lng': -121.325705}, u'southwest': {u'lat': 38.437574, u'lng': -121.56012}}, u'location': {u'lat': 38.5815719, u'lng': -121.4943996}}, u'address_components': [{u'long_name': u'Sacramento', u'types': [u'locality', u'political'], u'short_name': u'Sacramento'}, {u'long_name': u'Sacramento County', u'types': [u'administrative_area_level_2', u'political'], u'short_name': u'Sacramento County'}, {u'long_name': u'California', u'types': [u'administrative_area_level_1', u'political'], u'short_name': u'CA'}, {u'long_name': u'United States', u'types': [u'country', u'political'], u'short_name': u'US'}], u'place_id': u'ChIJ-ZeDsnLGmoAR238ZdKpqH5I', u'formatted_address': u'Sacramento, CA, USA', u'types': [u'locality', u'political']}]

My issue is that I'm not sure how to extract the appropriate lat/lon values from this list. I've tried parsing through the list using the following code (taken from the answer to this question on SO):

import operator
thirditem=operator.itemgetter(3)(geocode_result)
print(thirditem)

When I run this, I get an IndexError saying the index is out of range. I've run it through the debugger also, but I get the same error without any additional information. I've googled around and looked through other SO questions, but i'm still not sure where the issue is.

As a side note, I've also tried to use the code examples in this tutorial, but I get a "0" as my answer when I try to run it, which is unfortunately even less helpful than an IndexError.

My goal is to be able to parse the appropriate lat/lon values from here and insert them dynamically into this basemap script. Values are currently hard-coded, but eventually I'd like to be able to use a variable for the values llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat, lat_0, and lon_0:

map = Basemap(projection='merc',
          # with high resolution,
          resolution= 'h',
          # And threshold 100000
          area_thresh = 100000.0,
          # Centered on these coordinates
          lat_0=37, lon_0=119,
          #and using these corners to specify the lower left lon/lat and upper right lon/lat of the graph)
          llcrnrlon=-130, llcrnrlat=30,
          urcrnrlon=-110, urcrnrlat=45)

I'm SUPER new to all this, so there could be an easy answer that I'm just not seeing. Any help is welcome! Thanks.

1
  • Why the downvote? I'm just trying to learn..... Commented May 19, 2016 at 14:05

1 Answer 1

11

I was able to ask some of my fellow devs for help, and I am answering my own question on here in the hopes that it will help others who are also struggling with the same problem.

Geocoded results return a JSON object, which in Python is treated like a dictionary that only contains a single object (the result). Therefore, in order to extract the appropriate lat-lon values, you need to use "geocode_result[0]["geometry"]["location"]["lat"]", with [0] being the first object in the array (the result).

I wrote this function to use in my Basemap script to extract the lat/lon values from a location passed in as a parameter.

def geocode_address(loc):
    gmaps = googlemaps.Client(key=[insert your API key here])
    geocode_result = gmaps.geocode(loc)
    lat = geocode_result[0]["geometry"]["location"]["lat"]
    lon = geocode_result[0]["geometry"]["location"]["lng"]
    #test - print results
    print (lat,lon)

When I test it out using Sacramento, CA as the loc:

geocode_address('Sacramento, CA')

This is my result:

Result: 38.5815719, -121.4943996
Sign up to request clarification or add additional context in comments.

2 Comments

Tried this code and I now get "index out of range" on the '0' index. Perhaps the response has changed.
I haven't updated this post since I first wrote the response. It worked for me at the time. You're using it exactly as written, or did you change it in any way?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.