V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cyy564
V2EX  ›  问与答

请教一下,如何判断两个经纬度之间的中心点的经纬度

  •  
  •   cyy564 · 2021-07-09 12:18:58 +08:00 · 1466 次点击
    这是一个创建于 1242 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如('31.318318', '120.62872')和('31.31866', '120.63027')之间

    1.两点距离很短,500 米左右的

    2.https://stackoverflow.com/questions/6671183/calculate-the-center-point-of-multiple-latitude-longitude-coordinate-pairs?rq=1

    这文里面的方法用过,但是计算出是负数

    3.坐标系属于火星坐标

    4.网上关于这个需求的 api 真的蛮少的

    12 条回复    2021-07-09 16:54:44 +08:00
    villivateur
        1
    villivateur  
       2021-07-09 12:25:13 +08:00 via Android
    怎么定义“中心”啊,如果只是简单的加起来除以二为啥不行?
    3dwelcome
        2
    3dwelcome  
       2021-07-09 12:33:31 +08:00
    @villivateur 因为有投影的关系,所以中国地图上经纬度都是弯的。

    你看楼主帖子里面的提到的 stackoverflow 代码,计算就比较复杂。
    ShinichiYao
        3
    ShinichiYao  
       2021-07-09 12:41:33 +08:00
    500 米那么短直接加加除以二就行了
    koast
        4
    koast  
       2021-07-09 12:41:58 +08:00 via Android
    要不试试先转给正常的 wgs84,求出中心再转回火星坐标?拿那套公式推一下就行,就是不知道那套公式的误差有多大...
    wutiantong
        5
    wutiantong  
       2021-07-09 13:51:01 +08:00
    想象你站在北极点,A 点在你的前方 10 米处,B 点在你的后方 10 米处,它们的“中心点”是?
    1. 北极点
    2. 你的左边 10 米处
    3. 你的右边 10 米处
    anytk
        6
    anytk  
       2021-07-09 13:54:19 +08:00
    你需要以第一个点为站心,转换第二个点到站心坐标系 ENZ,然后把 ENZ 坐标中 ENZ 全部取 0.5,再从站心坐标反算到 BLH 上就行。
    其他用高斯投影也行,中央经线选择其中 1 点经线就可以,原理类似。
    如果你装有 proj 的话,可以快速测算:
    # 计算 2 点投影坐标
    proj +lon_0=120 +x_0=500000 +proj=tmerc +ellps=WGS84 -f %.8f
    120.62872 31.318318 0.0
    559845.61411542 3466437.62013044 0.0
    120.63027 31.31866 0.0
    559992.93900665 3466476.38304797 0.0

    # 取中值
    (559845.61411542 + 559992.93900665) * .0.5 = 559919.2765610351
    (3466437.62013044 + 3466476.38304797) * 0.5 = 3466457.001589205

    # 投影反算
    invproj +lon_0=120 +x_0=500000 +proj=tmerc +ellps=WGS84 -f %.8f
    559919.2765610351 3466457.001589205 0.0
    120.62949500 31.31848900 0.0

    如果用站心 ENZ 计算更简单,网上应该可以找站心坐标转换源码
    anytk
        7
    anytk  
       2021-07-09 14:01:00 +08:00
    ENU 坐标计算参考 https://github.com/tomojitakasu/RTKLIB/blob/180043ee24b6d2b168f98b64be15f69d50046b1a/src/rtkcmn.c#L1950

    BLH 通过 pos2ecef 转换到 ecef,ecef2enu 获得 ENU 坐标
    ENU 通过 enu2ecef 转换到 ecef,ecef2pos 还原 BLH

    实际上,直接用 ecef 坐标来计算中间点也是可以的
    cyy564
        8
    cyy564  
    OP
       2021-07-09 14:16:56 +08:00
    @anytk 谢谢大佬,我研究研究
    TomVista
        9
    TomVista  
       2021-07-09 14:43:43 +08:00
    两个经纬度之间的中心点的经纬度
    我觉得
    直接相加 /2 就是正确答案,和地球是圆的没关系
    TomVista
        10
    TomVista  
       2021-07-09 14:45:08 +08:00
    @TomVista 需要考虑正负
    gam2046
        11
    gam2046  
       2021-07-09 15:05:30 +08:00
    @TomVista #9 球面是需要考虑的,只不过距离足够短,这种曲率可以忽略不计,极端情况是两个点位于球面的对立面,即分别处于南北极,直接除 2 的结果是不正确的。
    xiaoliaoliao
        12
    xiaoliaoliao  
       2021-07-09 16:54:44 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5530 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:28 · PVG 16:28 · LAX 00:28 · JFK 03:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.