web-dev-qa-db-ja.com

pythonで現在地を取得

とにかく、私のデバイスの場所をpythonで取得できるということはありますか。現在、Seleniumを使用してブラウザを開き、位置情報サービスのWebサイトを使用し、その結果をlat/longの変数に設定する必要があります。

しかし、これを行う簡単な方法はありますか?

更新:RaspberryPiで3Gドングルを使用しているため、特定のlat/longを取得する方法を探しています-python?

19
Stacker-flow

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のみが使用されます。

27
JishnuM

または、これと同じくらい簡単

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

他の人はいくつかのサービスに言及していますが、考慮すべきもう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 を参照してください。

7
Ben Dowling

http://freegeoip.net/json AP​​Iエンドポイントは廃止され、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 で無料です。

latitudelongitudeおよびcityとともに; Zipcontinent_codecontinent_namecountry_codecountry_nameregion_coderegion_nameも取得できます。

制限:無料アカウントでは、毎月10,000リクエストのみ許可されます。要件がそれ以上であれば、アカウントをアップグレードできます。

この新しいAPIの詳細については、 https://github.com/apilayer/freegeoip をご覧ください。

参照:@JishnuMの回答

2
Aashish

ipdata.co APIを使用

この回答では、「テスト」APIキーを使用していますが、これは非常に限定されており、数回の呼び出しをテストするためだけのものです。 Signup 独自の無料APIキーの場合、開発のために毎日最大1500件のリクエストを受け取ります。

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

このスレッドで遊んでいるので、このスレッドの有用な回答に感謝します(そして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')
1
Apollo_LFB

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
1
user1116928

@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)
0
Kuba Jeziorny

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()

方法のチュートリアルは here またはGitHubリポジトリを見つける here

0
Joel Jogy

Ipregistry は、現在のUPアドレスまたは指定されたアドレス(免責事項、サービスを実行します)の位置データと、通貨、タイムゾーンなどを返します。また、公式のPython PyPIで利用可能なクライアント:

$ pip install ipregistry
from ipregistry import IpregistryClient

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

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がゲートウェイを整理および検索する方法に基づいて、おそらく都市または国の粒度でのみ使用できます。

0
amra