Est-il possible que je puisse obtenir l'emplacement de mon périphérique en python? Actuellement, je dois utiliser Selenium et ouvrir un navigateur, utiliser un site Web de service de localisation et définir le résultat de ce résultat en variables pour lat/long.
Mais y a-t-il un moyen plus facile de faire cela?
MISE À JOUR: J'utilise un dongle 3G sur mon RaspberryPi. Je cherche donc un moyen d'obtenir le lat/long spécifique de celui-ci. Je peux le faire avec succès grâce au service Web, en me demandant simplement si un moyen plus rapide est intégré à python pour ces requêtes. ?
Hypothèses:
Le périphérique pour lequel vous recherchez l'emplacement est celui qui exécute PythonVous avez un accès Internet (semble juste puisque vous mentionnez un site Web de service de localisation).
Dans un tel cas, il existe des services similaires à celui lié dans le commentaire où l'adresse IP de la demande est utilisée pour générer l'emplacement. Par exemple, 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']
Désavantages
Seul IP est utilisé pour générer l'emplacement.
Update: Ce noeud final d'API est deprecated et arrêtera de fonctionner le 1er juillet 2018. Pour plus d'informations, visitez le site: https: // github.com/apilayer/freegeoip#readme "
ou aussi simple que cela
import geocoder
g = geocoder.ip('me')
print(g.latlng)
D'autres ont mentionné quelques services, mais un autre à considérer est le mien, https://ipinfo.io , ce qui vous donnera des informations plus tard:
$ 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"
}
Si vous ne voulez que les données de coordonnées, vous pouvez obtenir cela en demandant /loc
:
$ curl ipinfo.io/loc
37.3845,-122.0881
Voir https://ipinfo.io/developers pour plus de détails.
Étant donné que http://freegeoip.net/json
, le point de terminaison de l'API est obsolète et cessera de fonctionner le 1er juillet 2018. Ils publient la nouvelle API http://api.ipstack.com
.
Donc, vous pouvez essayer ceci avec la nouvelle 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']
Afin d'obtenir votre propre ACCESS_KEY
, vous devez d'abord créer un compte sur ipstack.com
qui est gratuit à l'adresse https://ipstack.com/signup/free .
Avec latitude
, longitude
et city
; vous pouvez aussi récupérer Zip
, continent_code
, continent_name
, country_code
, country_name
, region_code
, region_name
.
Limitation: le compte gratuit ne vous autorise que 10 000 demandes/mois. Si vos besoins sont plus nombreux, vous pouvez mettre à niveau votre compte.
Pour plus d'informations sur cette nouvelle API, visitez le site https://github.com/apilayer/freegeoip
Référence: @JishnuM answer
Voici un module de géocodage Python doté de GeoFreeIP
Exemple: http://geocoder.readthedocs.io/
$ pip install geocoder
Utilisation de la CLI
$ geocode '99.240.181.199' --provider freegeoip --pretty --json
Utiliser Python
>>> import geocoder
>>> g = geocoder.freegeoip('99.240.181.199')
<[OK] Freegeoip - Geocode [Ottawa, Ontario Canada]>
>>> g.json
Avec le ipdata.co API
Cette réponse utilise une clé d'API 'test' très limitée et destinée uniquement à tester quelques appels. Inscrivez-vous pour votre propre clé API gratuite et recevez jusqu'à 1500 demandes de développement par jour.
import requests
r = requests.get('https://api.ipdata.co?api-key=test').json()
r['country_name']
# United States
j'ai joué avec cela, alors merci à tous pour les réponses utiles dans ce fil (et SO en général!) Je pensais partager mon programme court au cas où quelqu'un voudrait le voir en association avec
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')
@JishnuM a répondu aux questions à merveille.
2 cents de moi. Vous n'avez pas vraiment besoin d'importer la bibliothèque JSON.
Vous pouvez aller comme suit:
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)
L'emplacement basé sur l'adresse IP ne donne que l'emplacement de votre serveur. Pour rechercher un emplacement en fonction de votre emplacement actuel, vous devez donner au navigateur un accès à cet emplacement. Cela peut être fait en utilisant sélénium.
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()
Un tutoriel sur la marche à suivre est ici ou trouvez le dépôt GitHub ici