请教一下 Java 经纬度问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
koela
V2EX    问与答

请教一下 Java 经纬度问题

  •  
  • koela 2022-09-22 10:01:20 +08:00 2232 次点击
    这是一个创建于 1170 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近遇到一个关于经纬度的问题。现在已知两个经纬度坐标 a 、b ,请问怎么判断另外一个经纬度坐标 c 在 ab 连线的上侧还是下侧?

    18 条回复    2022-09-22 19:57:31 +08:00
    ThisDay
        1
    ThisDay  
       2022-09-22 10:07:50 +08:00
    一次方程,代入 x ,然后比较 y 不就行了,跟 java 啥关系?
    koela
        2
    koela  
    OP
       2022-09-22 10:16:28 +08:00
    @leeyuzhe #1 经纬度也可以直接像普通坐标一样计算吗?就是不确定这一点,自己在网上还看到有经纬度转坐标系的方法
    hidemyself
        3
    hidemyself  
       2022-09-22 10:17:39 +08:00
    不知道怎么定义上下。如果 a,b 经度是一样的,那 c 在 ab 连线的哪个地方呢
    Jooooooooo
        4
    Jooooooooo  
       2022-09-22 10:18:10 +08:00
    把上下定义出来你的代码就写完了.
    koela
        5
    koela  
    OP
       2022-09-22 10:26:57 +08:00
    @hidemyself #3 我说的太笼统了,其实就是 a 和 b 连成的线分成两侧( a 和 b 是固定的),该怎么判断 c 点在线的那一侧?至于是上是下,我会自己根据实际情况去定义。
    xiangyuecn
        6
    xiangyuecn  
       2022-09-22 10:33:54 +08:00
    以为是一段有限长的线,其实应当当做一条无限延长的线 平面计算跟球面计算不知道结果会不会有差异,数学基础太差
    xiao109
        7
    xiao109  
       2022-09-22 10:44:04 +08:00
    南极点和北极点的连线可以绕地球一圈吗?
    dddd1919
        8
    dddd1919  
       2022-09-22 10:50:09 +08:00
    利用初中数学知识,如果坐标经纬度不太远可以近似平面,那么连线可以根据 a ,b 坐标求出经纬度连线(x,y)的二元一次方程组 y=Ax+B ,然后比较南北就是比较 y 大小,带入 c 的经度求出连线的 y 值,对比就知道偏南还是偏北

    x ,y 要注意有正负
    phplin
        9
    phplin  
       2022-09-22 11:04:31 +08:00
    给你提供个思路 高德有判断一个经纬度在不在一个圈内的 sdk 是把经纬度转化成墨卡托坐标
    xiangyuecn
        10
    xiangyuecn  
       2022-09-22 11:12:27 +08:00
    #6 复杂的计算不会算,只会调第三方库 只想到一个简单的解决办法

    先排除掉 水平或竖直的线,这种好判断。

    剩下斜线直接将[-180 -90][180 90]切成左右两个几何图形,判断坐标点在左边还是右边的几何图形里面,就能得出左右,或者既在左又在右的:这个点就是在线上或延长线上。如果要上下关系就直接判断左右两个图形的上下关系,直接两个坐标点经纬度大小比较而已 很容易

    这种操作均可以调用几何计算库,一般有提供 Geometry 操作对象,比如 jts https://mvnrepository.com/artifact/org.locationtech.jts/jts-core/1.18.2 Geometry.intersects 方法判断图形是否包含坐标点。

    另外推荐一下我开源的 java 版坐标点查询工具,1 秒可查 1 万个以上坐标对应的城市信息,https://github.com/xiangyuecn/AreaCity-Query-Geometry 欢迎围观
    Vegetable
        11
    Vegetable  
       2022-09-22 11:15:13 +08:00
    这个看似简单,实则是个复杂问题


    因为地球只有一个面,什么叫上下呢
    sadfQED2
        12
    sadfQED2  
       2022-09-22 11:29:43 +08:00 via Android   2
    1.经纬度坐标系并不是平面直角坐标系,所以数学公式不能直接套用

    2.我目测其实你的需求就是在平面地图吧。这种情况的话你把你的 a b 点经纬度转换成墨卡托坐标系,然后在墨卡托坐标系里面做计算就行了,墨卡托坐标系是平面直角坐标系。转换代码随便一搜就有
    koela
        13
    koela  
    OP
       2022-09-22 12:26:42 +08:00 via Android
    @sadfQED2 感谢解答,我下午去试试
    MrZhaoyx     14
    MrZhaoyx  
       2022-09-22 13:02:27 +08:00
    尝试下 GDAL ?
    MrZhaoyx
        15
    MrZhaoyx  
       2022-09-22 13:11:31 +08:00
    @MrZhaoyx 看了下 GDAL 貌似只能做转换
    wangxiaoaer
        16
    wangxiaoaer  
       2022-09-22 13:52:57 +08:00   1
    两个思路:
    1 转成平面坐标,正如楼上的墨卡托,然后基于平面方式坐标计算。

    2 直接基于经纬度计算两两之间的角度,对比判断。具体算法可参考 https://www.movable-type.co.uk/scripts/latlong.html
    clf
        17
    clf  
       2022-09-22 14:22:19 +08:00
    看你对上下的定义。经纬度和平面坐标系的区别就在于是一个环形。

    假设你对上下的定义是:在两点连线(维度最大值不可跨越,仅可跨越东西经度,那么会有两条连线)分割出来的两片区域,那么就是计算包含 c 经度区域的 ab 连线就行了。
    trcnkq
        18
    trcnkq  
       2022-09-22 19:57:31 +08:00
    记地心为 o ,则判断 (oa x ob) * oc 符号即可(其中 x 为叉乘,* 为点乘)。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     972 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 23:25 PVG 07:25 LAX 15:25 JFK 18:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86