とにかく、私のデバイスの場所をpythonで取得できるということはありますか。現在、Seleniumを使用してブラウザを開き、位置情報サービスのWebサイトを使用し、その結果をlat/longの変数に設定する必要があります。
しかし、これを行う簡単な方法はありますか?
更新:RaspberryPiで3Gドングルを使用しているため、特定のlat/longを取得する方法を探しています-python?
Update:このAPIエンドポイントは非推奨ですそして、2018年7月1日にstop作業を開始します。詳細については、 https://github.comをご覧ください。/apilayer/freegeoip#readme "
仮定:
位置を探しているデバイスは、Pythonインターネットアクセスがあります(位置情報サービスのWebサイトに言及しているので公平だと思われます)
このような場合、コメントにリンクされているサービスに似たサービスがあり、リクエストの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のみが使用されます。
または、これと同じくらい簡単
import geocoder
g = geocoder.ip('me')
print(g.latlng)
他の人はいくつかのサービスに言及していますが、考慮すべきもう1つは私自身のものです https://ipinfo.io 、これはあなたに緯度、経度および他の多くの情報を与えます:
Bashの使用法:
$ 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 を参照してください。
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 で無料です。
latitude
、longitude
およびcity
とともに; Zip
、continent_code
、continent_name
、country_code
、country_name
、region_code
、region_name
も取得できます。
制限:無料アカウントでは、毎月10,000リクエストのみ許可されます。要件がそれ以上であれば、アカウントをアップグレードできます。
この新しいAPIの詳細については、 https://github.com/apilayer/freegeoip をご覧ください。
参照:@JishnuMの回答
このスレッドで遊んでいるので、このスレッドの有用な回答に感謝します(そして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')
Python GeoFreeIPを備えたジオコーディングモジュール
例: 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
@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)
IPアドレスに基づく場所は、サーバーの場所のみを示します。現在の場所に基づいて場所を見つけるには、ブラウザに場所へのアクセスを許可する必要があります。これは、Seleniumを使用して実行できます。
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()
Ipregistry は、現在のUPアドレスまたは指定されたアドレス(免責事項、サービスを実行します)の位置データと、通貨、タイムゾーンなどを返します。また、公式のPython PyPIで利用可能なクライアント:
$ pip install ipregistry
from ipregistry import IpregistryClient
client = IpregistryClient("tryout")
ipInfo = client.lookup()
print(ipInfo)
Freegoip.netおよびapi.ipstack.comエンドポイントは、デバイスの場所ではなく、インターネットサービスプロバイダー(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マップで場所の緯度と経度を確認すると、これはサーバー/デバイスの場所ではなく、サービスプロバイダーの場所であることを示しています。
このソリューションは引き続き使用できますが、ISPがゲートウェイを整理および検索する方法に基づいて、おそらく都市または国の粒度でのみ使用できます。