下载本文代码


如何计算地图中两点距离及角度

例如北京市北纬40.1,东经116.6; 哈尔滨市北纬45.7567, 东经126.6424

感兴趣的童鞋也可去看问题出处

https://stackoverflow.com/questions/3932502/calculate-angle-between-two-latitude-longitude-points/51415608

在回答中,看到有地理信息系统Python包geographiclib,可以计算两点距离和角度。


安装geographiclib

https://geographiclib.sourceforge.io/1.52/python/

!pip3 install geographiclib==1.52

计算距离

注意,在接下来的计算中,将北纬、东经表示为正数。将南纬、西经表示为负数。

def distance(beiwei1, dongjing1, beiwei2, dongjing2):
    """
    beiwei1: 地点1的纬度数,如果地点在北半球,北纬为正;反之为负。
    dongjing1: 地点2的经度数, 如果位于东半球,东经数为正;反之为负
    beiwei2: 地点2的纬度数
    dongjing2: 地点2的经度数
    """
    from geographiclib.geodesic import Geodesic
    geod = Geodesic.WGS84
    g = geod.Inverse(beiwei1, dongjing1, beiwei2, dongjing2)
    distance = g['s12']/1000
    return distance
    

#北京Beijing与哈尔滨harbin
distance(40.1, 116.6, 45.7567, 126.6424)

Run

1031.617791888516


方位角azimuth

两个地点在地图中所处的相对位置,称之为方位角azimuth。方位角最大度数360度,

  • 0度表示正北
  • 90度表示正西
  • 180度表示正南
  • 270度表示正西
  • 360度表示正北
def azimuth(beiwei1, dongjing1, beiwei2, dongjing2):
    """
    beiwei1: 地点1的纬度数,如果地点在北半球,北纬为正;反之为负。
    dongjing1: 地点2的经度数, 如果位于东半球,东经数为正;反之为负
    beiwei2: 地点2的纬度数
    dongjing2: 地点2的经度数
    """
    from geographiclib.geodesic import Geodesic
    geod = Geodesic.WGS84
    l = geod.InverseLine(beiwei1, dongjing1, beiwei2, dongjing2)
    s12 = distance(beiwei1, dongjing1, beiwei2, dongjing2)
    g = l.Position(s12, Geodesic.STANDARD | Geodesic.LONG_UNROLL)
    return g['azi2']

#北京 哈尔滨
azimuth(40.1, 116.6, 45.7567, 126.6424)
56.03961942267271

按照azimuth定义,56度的解读为 哈尔滨位于北京的东北方向。

同理可以计算西安与杭州

#西安, 杭州
azimuth(34.2658, 108.9541, 30.2741, 120.1552)
115.1506923699206

杭州位于西安的115度,即东南方向



广而告之