如何使用python获取纬度和经度

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)

  • 此答案确实需要API密钥。 (8认同)

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)

  • 只是对那些使用此代码片段的人发出警告,它并不总是会产生响应。只是为了让你们节省一些时间。 (9认同)
  • 在选择 Nominatim/OSM API 之前,请先阅读此 API 的使用政策:https://operations.osmfoundation.org/policies/nominatim/ (2认同)

小智 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)


Say*_*r Y 8

您还可以将地理编码器与 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包含的信息比经度和纬度多得多。一探究竟。


Sun*_*ngh 5

使用 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)

  • 这还需要一个 api-key,必须在参数中设置,如 ''key': 'AIza...'` (4认同)

abd*_*lsn 5

你好,这是我最常使用的使用物理地址获取纬度和经度的方法。注:请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


Car*_*tes 5

正如@WSaitama 所说,geopy效果很好,并且不需要身份验证。下载它: https: //pypi.org/project/geopy/。有关如何使用它的示例如下:

\n\n
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)\n
Run Code Online (Sandbox Code Playgroud)\n