use*_*712 24 python google-maps python-2.7
我试图通过下面的脚本检索物理地址的经度和纬度.但是我收到了错误.我已经安装了googlemaps.亲切的回复在此先感谢
#!/usr/bin/env python
import urllib,urllib2
"""This Programs Fetch The Address"""
from googlemaps import GoogleMaps
address='Mahatma Gandhi Rd, Shivaji Nagar, Bangalore, KA 560001'
add=GoogleMaps().address_to_latlng(address)
print add
Run Code Online (Sandbox Code Playgroud)
输出:
Traceback (most recent call last):
File "Fetching.py", line 12, in <module>
add=GoogleMaps().address_to_latlng(address)
File "/usr/local/lib/python2.7/dist-packages/googlemaps.py", line 310, in address_to_latlng
return tuple(self.geocode(address)['Placemark'][0]['Point']['coordinates'][1::-1])
File "/usr/local/lib/python2.7/dist-packages/googlemaps.py", line 259, in geocode
url, response = fetch_json(self._GEOCODE_QUERY_URL, params=params)
File "/usr/local/lib/python2.7/dist-packages/googlemaps.py", line 50, in fetch_json
response = urllib2.urlopen(request)
File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen
return _opener.open(url, data, timeout)
File "/usr/lib/python2.7/urllib2.py", line 407, in open
response = meth(req, response)
File "/usr/lib/python2.7/urllib2.py", line 520, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python2.7/urllib2.py", line 445, in error
return self._call_chain(*args)
File "/usr/lib/python2.7/urllib2.py", line 379, in _call_chain
result = func(*args)
File "/usr/lib/python2.7/urllib2.py", line 528, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden
Run Code Online (Sandbox Code Playgroud)
小智 43
您正在使用的googlemaps包不是正式的,并且不使用谷歌地图API v3,这是谷歌的最新版本.
您可以使用谷歌的地理编码REST API来从地址获取坐标.这是一个例子.
import requests
response = requests.get('https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA')
resp_json_payload = response.json()
print(resp_json_payload['results'][0]['geometry']['location'])
Run Code Online (Sandbox Code Playgroud)
Ham*_*son 17
对于不需要 API 密钥或外部库的 Python 脚本,您可以查询 Nominatim 服务,后者反过来查询 Open Street Map 数据库。
有关如何使用它的更多信息,请参阅https://nominatim.org/release-docs/develop/api/Search/
一个简单的例子如下:
import requests
import urllib.parse
address = 'Shivaji Nagar, Bangalore, KA 560001'
url = 'https://nominatim.openstreetmap.org/search/' + urllib.parse.quote(address) +'?format=json'
response = requests.get(url).json()
print(response[0]["lat"])
print(response[0]["lon"])
Run Code Online (Sandbox Code Playgroud)
小智 8
尝试此代码:-
from geopy.geocoders import Nominatim
geolocator = Nominatim()
city ="London"
country ="Uk"
loc = geolocator.geocode(city+','+ country)
print("latitude is :-" ,loc.latitude,"\nlongtitude is:-" ,loc.longitude)
Run Code Online (Sandbox Code Playgroud)
您还可以将地理编码器与 Bing 地图 API 结合使用。该 API 为我获取所有地址的纬度和经度数据(与 Nominatim 不同,Nominatim 仅适用于 60% 的地址),并且它有一个非常适合非商业用途的免费版本(每年最多免费 125000 个请求)。要获取免费的 API,请转到此处并单击“获取免费的基本密钥”。获取 API 后,您可以在下面的代码中使用它:
import geocoder # pip install geocoder
g = geocoder.bing('Mountain View, CA', key='<API KEY>')
results = g.json
print(results['lat'], results['lng'])
Run Code Online (Sandbox Code Playgroud)
它results包含的信息比经度和纬度多得多。一探究竟。
使用 google api、Python 和 Django 获取纬度和经度的最简单方法。
# Simplest way to get the lat, long of any address.
# Using Python requests and the Google Maps Geocoding API.
import requests
GOOGLE_MAPS_API_URL = 'http://maps.googleapis.com/maps/api/geocode/json'
params = {
'address': 'oshiwara industerial center goregaon west mumbai',
'sensor': 'false',
'region': 'india'
}
# Do the request and get the response data
req = requests.get(GOOGLE_MAPS_API_URL, params=params)
res = req.json()
# Use the first result
result = res['results'][0]
geodata = dict()
geodata['lat'] = result['geometry']['location']['lat']
geodata['lng'] = result['geometry']['location']['lng']
geodata['address'] = result['formatted_address']
print('{address}. (lat, lng) = ({lat}, {lng})'.format(**geodata))
# Result => Link Rd, Best Nagar, Goregaon West, Mumbai, Maharashtra 400104, India. (lat, lng) = (19.1528967, 72.8371262)
Run Code Online (Sandbox Code Playgroud)
你好,这是我最常使用的使用物理地址获取纬度和经度的方法。注:请NaN填空。df.adress.fillna('')
from geopy.exc import GeocoderTimedOut
# You define col corresponding to adress, it can be one
col_addr = ['street','postcode','town']
geocode = geopy.geocoders.BANFrance().geocode
def geopoints(row):
search=""
for x in col_addr:
search = search + str(row[x]) +' '
if search is not None:
print(row.name+1,end="\r")
try:
search_location = geocode(search, timeout=5)
return search_location.latitude,search_location.longitude
except (AttributeError, GeocoderTimedOut):
print("Got an error on index : ",row.name)
return 0,0
print("Number adress to located /",len(df),":")
df['latitude'],df['longitude'] = zip(*df.apply(geopoints, axis=1))
Run Code Online (Sandbox Code Playgroud)
注意:我使用 BANFrance() 作为 API,您可以在这里找到其他 API Geocoders。
正如@WSaitama 所说,geopy效果很好,并且不需要身份验证。下载它: https: //pypi.org/project/geopy/。有关如何使用它的示例如下:
from geopy.geocoders import Nominatim\n\naddress=\'Barcelona\'\ngeolocator = Nominatim(user_agent="Your_Name")\nlocation = geolocator.geocode(address)\nprint(location.address)\nprint((location.latitude, location.longitude))\n#Barcelona, Barcelon\xc3\xa8s, Barcelona, Catalunya, 08001, Espa\xc3\xb1a\n#(41.3828939, 2.1774322)\nRun Code Online (Sandbox Code Playgroud)\n