通过python获取您的位置

时间:2014-07-23 09:30:56

标签: python geolocation

无论如何,我可以通过python获取我的设备的位置。目前我不得不使用selenium并打开浏览器,使用位置服务网站并将其结果设置为lat / long的变量。

但有更简单的方法吗?

更新:我在我的RaspberryPi上使用3G加密狗,所以寻找一种方法来获取特定的lat / long - 我可以通过Web服务成功完成此操作,只是想知道是否有更快的内置到python中对于这些要求?

13 个答案:

答案 0 :(得分:26)

<强> 更新 : 此API端点已弃用,并将停止在2018年7月1日工作。有关详细信息,请访问:https://github.com/apilayer/freegeoip#readme&#34;

假设:

正在寻找位置的设备是运行Python的设备 您可以访问互联网(因为您提到了位置服务网站,这似乎很公平)

在这种情况下,存在类似于评论中链接的服务,其中请求的IP用于生成位置。例如,http://freegeoip.net/

import requests
import json

send_url = 'http://freegeoip.net/json'
r = requests.get(send_url)
j = json.loads(r.text)
lat = j['latitude']
lon = j['longitude']

缺点

仅使用IP来生成位置。

答案 1 :(得分:22)

或者,就像这个一样简单

import geocoder
g = geocoder.ip('me')
print(g.latlng)

答案 2 :(得分:4)

其他人已经提到了一些服务,但另一个要考虑的是我自己的https://ipinfo.io,它会给你lat,lon和一堆其他信息:

$ curl ipinfo.io
{
  "ip": "24.6.61.239",
  "hostname": "c-24-6-61-239.hsd1.ca.comcast.net",
  "city": "Mountain View",
  "region": "California",
  "country": "US",
  "loc": "37.3845,-122.0881",
  "org": "AS7922 Comcast Cable Communications, LLC",
  "postal": "94040"
}

如果您只想要坐标数据,可以通过请求/loc

来获得
$ curl ipinfo.io/loc
37.3845,-122.0881

有关详细信息,请参阅https://ipinfo.io/developers

答案 3 :(得分:2)

由于http://freegeoip.net/json API端点已弃用,并且将于2018年7月1日停止工作。因此,他们会发布新的API http://api.ipstack.com

因此,您可以尝试使用新API:

import requests
import json

send_url = "http://api.ipstack.com/check?access_key=YOUR_ACCESS_KEY"
geo_req = requests.get(send_url)
geo_json = json.loads(geo_req.text)
latitude = geo_json['latitude']
longitude = geo_json['longitude']
city = geo_json['city']

要获得自己的ACCESS_KEY,您必须先在ipstack.com创建一个帐户,该帐户在https://ipstack.com/signup/free免费。

latitudelongitudecity一起;您还可以抓取zipcontinent_codecontinent_namecountry_codecountry_nameregion_coderegion_name

限制:免费帐户每月只允许10,000次请求。如果您的要求更高,那么您可以升级您的帐户。

有关此新API的详情,请访问https://github.com/apilayer/freegeoip

参考:@JishnuM回答

答案 4 :(得分:1)

这是一个拥有GeoFreeIP的Python地理编码模块

实施例: http://geocoder.readthedocs.io/

$ pip install geocoder

使用CLI

$ geocode '99.240.181.199' --provider freegeoip --pretty --json

使用Python

>>> import geocoder
>>> g = geocoder.freegeoip('99.240.181.199')
<[OK] Freegeoip - Geocode [Ottawa, Ontario Canada]>
>>> g.json

答案 5 :(得分:1)

一直在玩这个,所以感谢所有人在这个帖子中的有用答案(以及一般的SO!)以为我分享我的短程序以防万一有人想看到它与大圆计算结合

import geocoder

import requests
freegeoip = "http://freegeoip.net/json"
geo_r = requests.get(freegeoip)
geo_json = geo_r.json()

address=input('enter an address: ')
g= geocoder.google(address)
lat_ad=g.latlng[0]
lon_ad=g.latlng[1]

user_postition = [geo_json["latitude"], geo_json["longitude"]]
lat_ip=user_postition[0]
lon_ip=user_postition[1]

#Calculate the great circle distance between two points on the earth (specified in decimal degrees)

from math import radians, cos, sin, asin, sqrt
# convert decimal degrees to radians 
lon_ad, lat_ad, lon_ip, lat_ip = map(radians, [lon_ad, lat_ad, lon_ip, lat_ip])

# haversine formula 
dlon = lon_ip - lon_ad 
dlat = lat_ip - lat_ad 
a = sin(dlat/2)**2 + cos(lat_ad) * cos(lat_ip) * sin(dlon/2)**2
c = 2 * asin(sqrt(a)) 
km = 6367 * c
#end of calculation

#limit decimals
km = ('%.0f'%km)

print(address+' is about '+str(km)+' km away from you')

答案 6 :(得分:1)

使用ipdata.co API

  

这个答案使用了&#39;测试&#39; API密钥非常有限,仅用于测试几个调用。 Signup用于您自己的免费API密钥,每天最多可获得1500个请求以进行开发。

import requests
r = requests.get('https://api.ipdata.co?api-key=test').json()
r['country_name']
# United States

答案 7 :(得分:0)

@JishnuM奇妙地回答了这些问题。

我的2美分。你真的不需要导入json库。

您可以执行以下操作:

freegeoip = "http://freegeoip.net/json"
geo_r = requests.get(freegeoip)
geo_json = geo_r.json()

user_postition = [geo_json["latitude"], geo_json["longitude"]]

print(user_postition)

答案 8 :(得分:0)

基于IP地址的位置仅提供服务器的位置。要根据您当前所在的位置查找位置,您需要授予浏览器访问位置的权限。这可以使用硒来完成。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait

def getLocation():
    chrome_options = Options()
    chrome_options.add_argument("--use-fake-ui-for-media-stream")
    timeout = 20
    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get("https://mycurrentlocation.net/")
    wait = WebDriverWait(driver, timeout)
    longitude = driver.find_elements_by_xpath('//*[@id="longitude"]')
    longitude = [x.text for x in longitude]
    longitude = str(longitude[0])
    latitude = driver.find_elements_by_xpath('//*[@id="latitude"]')
    latitude = [x.text for x in latitude]
    latitude = str(latitude[0])
    driver.quit()
    return (latitude,longitude)
print getLocation()

有关如何操作的教程是here或找到GitHub存储库here

答案 9 :(得分:0)

freegoip.net和api.ipstack.com端点似乎使用的是Internet服务提供商(ISP)的位置,而不是我的设备的位置。我尝试了curl http://api.ipstack.com/check?access_key=YOUR_KEY,得到的是

{"ip":"106.51.151.31","type":"ipv4","continent_code":"AS","continent_name":"Asia","country_code":"IN","country_name":"India","region_code":"KA","region_name":"Karnataka","city":"Bengaluru","zip":"560008","latitude":12.9833,"longitude":77.5833,"location":{"geoname_id":1277333,"capital":"New Delhi","languages":[{"code":"hi","name":"Hindi","native":"\u0939\u093f\u0928\u094d\u0926\u0940"},{"code":"en","name":"English","native":"English"}],"country_flag":"http:\/\/assets.ipstack.com\/flags\/in.svg","country_flag_emoji":"\ud83c\uddee\ud83c\uddf3","country_flag_emoji_unicode":"U+1F1EE U+1F1F3","calling_code":"91","is_eu":false}}

在Google地图上检查位置lat很长,表明这是服务提供商的位置,而不是服务器/设备的位置。

此解决方案仍然可用,但可能仅基于ISP如何组织和定位其网关而适用于城市或国家/地区的粒度。

答案 10 :(得分:0)

更新了一个...(2019)

使用ipstack获取地理位置。从ipstack获取API密钥。有时ipstack获取错误的公共IP地址。所以我用了一些终端命令来获取我的公共IP。

代码:

import os
import requests
import json
a = os.popen('wget -qO- https://ipecho.net/plain').read()
ip = a
send_url = "http://api.ipstack.com/{}?access_key=<your api key>".format(ip)
geo_req = requests.get(send_url)
geo_json = json.loads(geo_req.text)
#print(geo_json)
latitude = geo_json['latitude']
longitude = geo_json['longitude']
city = geo_json['city']

print("My Public IP Address: ",ip)
print("Country: ",geo_json['country_name'])
print("State: ",geo_json['region_name'])
print("IP Version: ",geo_json['type'])
print("Lattitude: ",geo_json['latitude'])
print("Longitude: ",geo_json['longitude'])

答案 11 :(得分:0)

string formatting返回位置数据以及您当前UP地址或给定地址的货币,时区等信息(免责声明,我运行该服务)。在PyPI上也有一个官方的Python客户端:

$ pip install ipregistry
from ipregistry import IpregistryClient

client = IpregistryClient("tryout")  
ipInfo = client.lookup() 
print(ipInfo)

答案 12 :(得分:0)

我已经尝试了几个月来获得它,最后我找到了适用于 Windows 用户的解决方案! 对我来说,它和街道名称一样接近。 你需要安装winrt(https://pypi.org/project/winrt/) 这是:

import winrt.windows.devices.geolocation as wdg, asyncio

async def getCoords():
        locator = wdg.Geolocator()
        pos = await locator.get_geoposition_async()
        return [pos.coordinate.latitude, pos.coordinate.longitude]
    
def getLoc():
    return ascyncio.run(getCoords())