根據經緯度坐標計算距離-python


 一、兩個坐標之間距離計算

參考鏈接:

python實現

1、Python 根據地址獲取經緯度及求距離

2、python利用地圖兩個點的經緯度計算兩點間距離

  LBS 球面距離公式   

       美團app篩選“離我最近” 之 地理空間距離計算優化   

 

案例1、2,因為都是用LBS 球面距離公式(haversine公式)結果完全相同, 且與 geopy相差不大。

原文:geopy在python中的使用

geopy是一個關於地理編碼的python庫。主要有以下幾個功能:(需要聯網)

  1. 地理編碼:將字符串轉換為地理位置
  2. 逆地理編碼:用於將地理坐標轉換為具體地址
  3. 計算兩個點的距離:經緯度距離和球面距離

代碼:

from math import radians, cos, sin, asin, sqrt

#公式計算兩點間距離(m)

def geodistance(lng1,lat1,lng2,lat2):
  #lng1,lat1,lng2,lat2 = (120.12802999999997,30.28708,115.86572000000001,28.7427)
  lng1, lat1, lng2, lat2 = map(radians, [float(lng1), float(lat1), float(lng2), float(lat2)]) # 經緯度轉換成弧度
  dlon=lng2-lng1
  dlat=lat2-lat1
  a=sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
  distance=2*asin(sqrt(a))*6371*1000 # 地球平均半徑,6371km
  distance=round(distance/1000,3)
  return distance

# 返回 446.721 千米

 

#調用geopy包中的方法

from geopy.distance import geodesic

print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).m) #計算兩個坐標直線距離
print(geodesic((30.28708,120.12802999999997), (28.7427,115.86572000000001)).km) #計算兩個坐標直線距離
# 返回 447.2497993542003 千米


# 南昌:華東交通大學(120.12802999999997,30.28708)
# 杭州:浙江工商大學(115.86572000000001,28.7427)
# 用百度地圖測量結果:447.02km


 

  

二、中文位置 轉 經緯度坐標

 

1. 地理編碼/逆地理編碼 ★★★ (日6000次)

  (地理編碼/逆地理編碼 API 是通過 HTTP/HTTPS 協議訪問遠程服務的接口,提供結構化地址與經緯度之間的相互轉化的能力。) Python程序參考

  高德接口:https://lbs.amap.com/api/webservice/guide/api/georegeo

 

2. 搜索POI   ★★★★★  (日2000次)

  (搜索服務API是一類簡單的HTTP接口,提供多種查詢POI信息的能力,其中包括關鍵字搜索、周邊搜索、多邊形搜索、ID查詢四種篩選機制。)

  高德接口:https://lbs.amap.com/api/webservice/guide/api/search

 

3. 調用geopy包 

  結果偏差,可能使用的google api;且只能按照 省市區(縣),無法到 鄉鎮。且速度慢。

import requests
#使用高德API-地理/逆地理編碼:https://lbs.amap.com/api/webservice/guide/api/georegeo
def geocodeG(address):
    key = '07ac12a00f830764ebfdee2fd0bc96fd'
    par = {'address': address, 'key': key}
    base = 'http://restapi.amap.com/v3/geocode/geo'
    response = requests.get(base, par)
    answer = response.json()
    return answer['geocodes'][0]['location']

address='原陽縣酒樓' #非結構化的位置,返回結果不准(結構化的數據效果很好)
print(geocodeG(address))
輸出:113.912220,35.386060
#使用高德API-搜索POI:https://lbs.amap.com/api/webservice/guide/api/search def geocodeG2(address): key = '07ac12a00f830764ebfdee2fd0bc96fd' par = {'keywords': keywords, 'key': key,'offset':1} base = 'https://restapi.amap.com/v3/place/text' response = requests.get(base, par) answer = response.json() return answer['pois'][0]['location'] address='原陽縣酒樓' #模糊匹配、關鍵詞搜索 效果很好 print(geocodeG2(address))

輸出:113.961655,35.057336

from geopy.geocoders import Nominatim
# 結果的經緯度,與高德有1-2公里偏差; 且只能按照 省市區(縣),無法到 鄉鎮; 且速度慢
def geocodeN(address):
    gps=Nominatim(user_agent="my-application")
    location=gps.geocode(address)
    return location.longitude,location.latitude


address = "四川樂山市峨眉山市"
print(geocodeN(address))
address = "四川樂山市峨眉山市高橋鎮"
print(geocodeN(address))

輸出:

(103.48222, 29.60173)
Traceback (most recent call last):

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM