请教一下 Java 经纬度问题

2022-09-22 10:01:20 +08:00
 koela

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

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

x ,y 要注意有正负
phplin
2022-09-22 11:04:31 +08:00
给你提供个思路 高德有判断一个经纬度在不在一个圈内的 sdk 是把经纬度转化成墨卡托坐标
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
2022-09-22 11:15:13 +08:00
这个看似简单,实则是个复杂问题


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

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

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

假设你对上下的定义是:在两点连线(维度最大值不可跨越,仅可跨越东西经度,那么会有两条连线)分割出来的两片区域,那么就是计算包含 c 经度区域的 ab 连线就行了。
trcnkq
2022-09-22 19:57:31 +08:00
记地心为 o ,则判断 (oa x ob) * oc 符号即可(其中 x 为叉乘,* 为点乘)。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/882052

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX