最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中經(jīng)緯度距離計(jì)算的實(shí)現(xiàn)方式

 更新時(shí)間:2025年08月11日 15:54:14   作者:AI手記叨叨  
文章介紹Python中計(jì)算經(jīng)緯度距離的方法及中國(guó)加密坐標(biāo)系轉(zhuǎn)換工具,主要方法包括geopy(Vincenty/Karney)、Haversine、pyproj和平面近似法,適用于不同精度和場(chǎng)景需求,需注意坐標(biāo)系轉(zhuǎn)換(如GCJ-02→WGS84)的不可逆性及誤差問題

Python中計(jì)算經(jīng)緯度距離可以使用geopy(Vincenty、Karney)、Haversine、pyproj(橢球模型投影計(jì)算)、平面近似法(小范圍快速估算)等。而針對(duì)中國(guó)加密坐標(biāo)系(如GCJ-02/BD-09)也可以使用coord-convert工具轉(zhuǎn)換為WGS84。

以下是對(duì)應(yīng)方法的示例。

一、基本方法

1. 使用geopy庫(kù)(推薦)

geopy 提供了多種距離計(jì)算方式(包括Haversine、Vincenty、Karney),支持WGS84橢球模型。

安裝

pip install geopy

示例代碼

from geopy.distance import geodesic, great_circle

# 定義兩點(diǎn)(緯度, 經(jīng)度)
point_a = (39.9042, 116.4074)  # 北京
point_b = (31.2304, 121.4737)  # 上海

# 方法1:
# geopy 1.x 版本 Vincenty(默認(rèn),高精度)
# geopy 2.0 版本 Karney
distance_karney = geodesic(point_a, point_b).km
print(f"karney距離: {distance_karney:.2f} km")

# 方法2:大圓距離(Haversine,球面近似)
distance_great_circle = great_circle(point_a, point_b).km
print(f"大圓距離: {distance_great_circle:.2f} km")

輸出:

Karney距離: 1065.85 km
大圓距離: 1067.31 km

說明:
geodesic 2.0版本 使用的是Karney算法,1.x 版本使用的是Vincenty算法。
great_circle 使用Haversine公式,假設(shè)地球?yàn)橥昝狼蝮w。實(shí)際地球是橢球體,其誤差范圍(通常為 0.5% 左右)。

2. 手動(dòng)實(shí)現(xiàn) Haversine 公式

適合無需外部庫(kù)的場(chǎng)景。

示例代碼

import math


def haversine(lat1, lon1, lat2, lon2):
    R = 6371  # 地球半徑(km)
    phi1, phi2 = math.radians(lat1), math.radians(lat2)
    delta_phi = math.radians(lat2 - lat1)
    delta_lambda = math.radians(lon2 - lon1)

    a = math.sin(delta_phi / 2) ** 2 + \
        math.cos(phi1) * math.cos(phi2) * math.sin(delta_lambda / 2) ** 2
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
    return R * c

distance = haversine(39.9042, 116.4074, 31.2304, 121.4737)
print(f"Haversine距離: {distance:.2f} km")

輸出:

Haversine距離: 1067.31 km

注意:與geopygreat_circle結(jié)果一致。

3. 使用pyproj進(jìn)行投影坐標(biāo)系計(jì)算

適合需要平面坐標(biāo)的高精度場(chǎng)景(如UTM投影)。

安裝

pip install pyproj

示例代碼

from pyproj import Geod

# 使用WGS84橢球
geod = Geod(ellps="WGS84")

# 計(jì)算距離和方位角
# 參數(shù)順序:起點(diǎn)經(jīng)度、起點(diǎn)緯度、終點(diǎn)經(jīng)度、終點(diǎn)緯度
_, _, distance = geod.inv(116.4074, 39.9042, 121.4737, 31.2304)
print(f"pyproj橢球距離: {distance / 1000:.2f} km")

輸出:

pyproj橢球距離: 1065.85 km

說明:

  • geod.inv 返回前兩個(gè)值是方位角,第三個(gè)是距離(米)。
  • 結(jié)果與geopy的Vincenty一致。

4. 平面近似法(小范圍適用)

適用于城市內(nèi)短距離快速估算。

import math

def flat_approximation(lat1, lon1, lat2, lon2):
    R = 6371  # 地球半徑(km)
    avg_lat = math.radians((lat1 + lat2) / 2)
    dx = math.radians(lon2 - lon1) * math.cos(avg_lat)
    dy = math.radians(lat2 - lat1)
    return R * math.sqrt(dx**2 + dy**2)

# 示例(北京天安門到北京西站)
distance = flat_approximation(39.9042, 116.4074, 39.8946, 116.3224)
print(f"平面近似距離: {distance:.2f} km")

輸出:

平面近似距離: 7.33 km

注意:適用于距離 < 10 km,實(shí)際誤差還取決于緯度,高緯度地區(qū)誤差更大。

二、不同坐標(biāo)系的影響

常見坐標(biāo)系

許多國(guó)家會(huì)對(duì)地理信息進(jìn)行加密或偏移,如中國(guó)的GCJ-02或BD-09,計(jì)算距離前需確保所有坐標(biāo)點(diǎn)在同一坐標(biāo)系下,否則結(jié)果會(huì)有偏差。

可以使用庫(kù)(如coord-convert)將GCJ-02或BD-09坐標(biāo)轉(zhuǎn)換為WGS84,但不同坐標(biāo)系之間的轉(zhuǎn)換是不可逆的,多次轉(zhuǎn)換可能會(huì)導(dǎo)致精度損失。

  • WGS84(國(guó)際標(biāo)準(zhǔn)GPS坐標(biāo)系):未加密的地心坐標(biāo)系,高精度。
  • GCJ-02(火星坐標(biāo)系):基于WGS84通過非線性算法加入隨機(jī)偏移。
  • BD-09(百度坐標(biāo)系):在GCJ-02基礎(chǔ)上二次加密的坐標(biāo)系。

coord-convert坐標(biāo)系轉(zhuǎn)換

安裝

pip install coord-convert

示例代碼

from coord_convert import transform

# GCJ-02 轉(zhuǎn) WGS84
gcj_lon, gcj_lat = 116.404, 39.915  # 北京天安門(GCJ-02)
wgs_lon, wgs_lat = transform.gcj2wgs(gcj_lon, gcj_lat)
print(f"WGS84坐標(biāo): {wgs_lon:.6f}, {wgs_lat:.6f}")
# WGS84坐標(biāo): 116.397756, 39.913596

# BD-09 轉(zhuǎn) WGS84
bd_lon, bd_lat = 116.410, 39.921  # 北京天安門(BD-09)
wgs_lon, wgs_lat = transform.bd2wgs(bd_lon, bd_lat)
print(f"WGS84坐標(biāo): {wgs_lon:.6f}, {wgs_lat:.6f}")
# WGS84坐標(biāo): 116.397387, 39.913258

坐標(biāo)系轉(zhuǎn)換方法

函數(shù)說明
transform.wgs2gcj(lon, lat)WGS84 → GCJ-02
transform.gcj2wgs(lon, lat)GCJ-02 → WGS84
transform.gcj2bd(lon, lat)GCJ-02 → BD-09
transform.bd2gcj(lon, lat)BD-09 → GCJ-02
transform.bd2wgs(lon, lat)BD-09 → WGS84
transform.wgs2bd(lon, lat)WGS84 → BD-09

三、方法對(duì)比總結(jié)

方法精度適用場(chǎng)景依賴庫(kù)
geopy.geodesic毫米級(jí)全球范圍,高精度geopy
geopy.great_circle中等快速球面估算geopy
Haversine手動(dòng)實(shí)現(xiàn)中等無庫(kù)依賴
pyproj.Geod毫米級(jí)復(fù)雜橢球模型計(jì)算pyproj
平面近似極小范圍(城市內(nèi))

四、如何選擇?

  • 通用場(chǎng)景:直接使用 geopy.geodesic(平衡精度和易用性)。
  • 學(xué)術(shù)與工程:需要橢球模型時(shí)用 pyproj。
  • 輕量級(jí)需求:手動(dòng)Haversine或無庫(kù)平面近似。

五、總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 利用keras使用神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)銷量操作

    利用keras使用神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)銷量操作

    這篇文章主要介紹了利用keras使用神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)銷量操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • 關(guān)于Qt6中QtMultimedia多媒體模塊的重大改變分析

    關(guān)于Qt6中QtMultimedia多媒體模塊的重大改變分析

    如果您一直在 Qt 5 中使用 Qt Multimedia,則需要對(duì)您的實(shí)現(xiàn)進(jìn)行更改。這篇博文將嘗試引導(dǎo)您完成最大的變化,同時(shí)查看 API 和內(nèi)部結(jié)構(gòu)
    2021-09-09
  • Python將Word文檔轉(zhuǎn)為PDF的兩種方法

    Python將Word文檔轉(zhuǎn)為PDF的兩種方法

    這篇文章主要介紹了兩種將docx和doc文件轉(zhuǎn)換為PDF的方法,方法一使用了docx2pdf模塊,方法二使用了win32com模塊,文中通過代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • python3 http提交json參數(shù)并獲取返回值的方法

    python3 http提交json參數(shù)并獲取返回值的方法

    今天小編就為大家分享一篇python3 http提交json參數(shù)并獲取返回值的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作示例

    Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作示例

    這篇文章主要介紹了Flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了flask框架使用DBUtils模塊連接數(shù)據(jù)庫(kù)的常見操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • VSCode中Python venv環(huán)境加載失敗的5大原因及解決方案

    VSCode中Python venv環(huán)境加載失敗的5大原因及解決方案

    本文詳細(xì)探討了VSCode中Python虛擬環(huán)境加載失敗的常見原因及解決方法,包括解釋器選擇、環(huán)境配置、路徑設(shè)置、解釋器優(yōu)先級(jí)和配置文件管理等方面,通過實(shí)際案例和配置示例,提供了從零創(chuàng)建可被VSCode識(shí)別的venv環(huán)境的實(shí)踐步驟,需要的朋友可以參考下
    2026-03-03
  • 用Python實(shí)現(xiàn)協(xié)同過濾的教程

    用Python實(shí)現(xiàn)協(xié)同過濾的教程

    這篇文章主要介紹了用Python實(shí)現(xiàn)協(xié)同過濾的教程,主要用于從大數(shù)據(jù)中抽取用戶信息偏好等等,需要的朋友可以參考下
    2015-04-04
  • 如何在mac下配置python虛擬環(huán)境

    如何在mac下配置python虛擬環(huán)境

    這篇文章主要介紹了如何mac下配置python虛擬環(huán)境,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Flask配置四種方式

    Flask配置四種方式

    Flask提供了多種配置方式,可以根據(jù)不同的需求和場(chǎng)景進(jìn)行選擇,包括配置類方式、配置文件方式、環(huán)境變量方式和實(shí)例文件方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • 基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制

    基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制

    這篇文章主要介紹了基于Python實(shí)現(xiàn)主機(jī)遠(yuǎn)程控制,本文為?HITwh?網(wǎng)絡(luò)空間安全專業(yè)網(wǎng)絡(luò)空間安全設(shè)計(jì)與實(shí)踐選題,主要實(shí)現(xiàn)了遠(yuǎn)程監(jiān)控局域網(wǎng)內(nèi)的主機(jī)桌面與網(wǎng)絡(luò)情況、簡(jiǎn)單鍵鼠控制、遠(yuǎn)程斷網(wǎng)(ARP?攻擊)、數(shù)據(jù)加密傳輸?shù)裙δ?,下面來看看具體實(shí)現(xiàn)過程吧
    2022-01-01

最新評(píng)論

黎川县| 林甸县| 宁武县| 绥江县| 尼勒克县| 竹山县| 遵义县| 会同县| 安远县| 会同县| 安泽县| 开封县| 彭州市| 台湾省| 丰原市| 连城县| 宝坻区| 德保县| 蒲江县| 丹寨县| 女性| 浦北县| 中阳县| 黑龙江省| 贡山| 淮安市| 西丰县| 隆尧县| 宿迁市| 万全县| 汉阴县| 山丹县| 南部县| 平远县| 万年县| 灵台县| 阳谷县| 佳木斯市| 建宁县| 灯塔市| 宜良县|