I am trying to get coordinates for a 'city' column of a dataframe. That city column has a dtype of ('O'). Its a list of city names. I have made sure there are no digits or numbers within the city name. This is the function i run to get coordinates:
def get_coordinates(city_list):
"""Takes a list of cities and returns a dictionary of the cities and their corresponding coordinates."""
geolocator = Nominatim(user_agent='location script')
dicto = {}
for city in city_list:
try:
location = geolocator.geocode(city)
except:
raise Exception("There was a problem with the getCoordinates function")
coordinate_values = (location.longitude, location.latitude) #in geopandas, the x value corresponds to the longitude while the y value, the latitude(Just in case you were wondering why it was *location.longitude, location.latitude* and not the other way round )
dicto[city] = coordinate_values #adding the coordinate pair to the dictionary at the end of every loop
return dicto #finally retruns the dict
Then:
#getting coordinates for each city in the list
city_coords_dict = get_coordinates(city_list)
city_coords_dict
Final output:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-63-dedf916e4307> in <module>
1 #getting coordinates for each city in the list
----> 2 city_coords_dict = get_coordinates(city_list)
3 city_coords_dict
<ipython-input-62-c391f86b76db> in get_coordinates(city_list)
13 except:
14 raise Exception("There was a problem with the getCoordinates function")
---> 15 coordinate_values = (location.longitude, location.latitude) #in geopandas, the x value corresponds to the longitude while the y value, the latitude(Just in case you were wondering why it was *location.longitude, location.latitude* and not the other way round )
16 dicto[city] = coordinate_values #adding the coordinate pair to the dictionary at the end of every loop
17 return dicto #finally retruns the dict
AttributeError: 'NoneType' object has no attribute 'longitude'
Anyone with suggestions will greatly be appreciated. Thanks in advance.
CodePudding user response:
Your geolocator apparently does not have data for the specific city that it is trying to request. As not_speshal also said, geolocator.geocode(city) is returning None at some point, which is being assigned to location. So later, you try to get location.longitude, which, because location is now None, is equivalent to (None).longitude...
CodePudding user response:
Instead of throwing an exception, geocode returns a NoneType object. So Nominatim is not able to find one of the locations listed in "location script".
Try replacing the try catch block with assert location, city
