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

请教一下 Java 经纬度问题

  •  
  •   koela · 74 天前 · 1098 次点击
    这是一个创建于 74 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    x ,y 要注意有正负
    phplin
        9
    phplin  
       74 天前
    给你提供个思路 高德有判断一个经纬度在不在一个圈内的 sdk 是把经纬度转化成墨卡托坐标
    xiangyuecn
        10
    xiangyuecn  
       74 天前
    #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  
       74 天前
    这个看似简单,实则是个复杂问题


    因为地球只有一个面,什么叫上下呢
    sadfQED2
        12
    sadfQED2  
       74 天前 via Android   ❤️ 2
    1.经纬度坐标系并不是平面直角坐标系,所以数学公式不能直接套用

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

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

    假设你对上下的定义是:在两点连线(维度最大值不可跨越,仅可跨越东西经度,那么会有两条连线)分割出来的两片区域,那么就是计算包含 c 经度区域的 ab 连线就行了。
    trcnkq
        18
    trcnkq  
       74 天前
    记地心为 o ,则判断 (oa x ob) * oc 符号即可(其中 x 为叉乘,* 为点乘)。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3366 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 13:56 · PVG 21:56 · LAX 05:56 · JFK 08:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.