最近遇到一个关于经纬度的问题。现在已知两个经纬度坐标 a 、b ,请问怎么判断另外一个经纬度坐标 c 在 ab 连线的上侧还是下侧?
1
leeyuzhe 2022-09-22 10:07:50 +08:00
一次方程,代入 x ,然后比较 y 不就行了,跟 java 啥关系?
|
3
hidemyself 2022-09-22 10:17:39 +08:00
不知道怎么定义上下。如果 a,b 经度是一样的,那 c 在 ab 连线的哪个地方呢
|
4
Jooooooooo 2022-09-22 10:18:10 +08:00
把上下定义出来你的代码就写完了.
|
5
koela OP @hidemyself #3 我说的太笼统了,其实就是 a 和 b 连成的线分成两侧( a 和 b 是固定的),该怎么判断 c 点在线的那一侧?至于是上是下,我会自己根据实际情况去定义。
|
6
xiangyuecn 2022-09-22 10:33:54 +08:00
以为是一段有限长的线,其实应当当做一条无限延长的线😂 平面计算跟球面计算不知道结果会不会有差异,数学基础太差😂
|
7
xiao109 2022-09-22 10:44:04 +08:00
南极点和北极点的连线可以绕地球一圈吗?
|
8
dddd1919 2022-09-22 10:50:09 +08:00
利用初中数学知识,如果坐标经纬度不太远可以近似平面,那么连线可以根据 a ,b 坐标求出经纬度连线(x,y)的二元一次方程组 y=Ax+B ,然后比较南北就是比较 y 大小,带入 c 的经度求出连线的 y 值,对比就知道偏南还是偏北
x ,y 要注意有正负 |
9
phplin 2022-09-22 11:04:31 +08:00
给你提供个思路 高德有判断一个经纬度在不在一个圈内的 sdk 是把经纬度转化成墨卡托坐标
|
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 欢迎围观😁😁 |
11
Vegetable 2022-09-22 11:15:13 +08:00
这个看似简单,实则是个复杂问题
因为地球只有一个面,什么叫上下呢 |
12
sadfQED2 2022-09-22 11:29:43 +08:00 via Android 2
1.经纬度坐标系并不是平面直角坐标系,所以数学公式不能直接套用
2.我目测其实你的需求就是在平面地图吧。这种情况的话你把你的 a b 点经纬度转换成墨卡托坐标系,然后在墨卡托坐标系里面做计算就行了,墨卡托坐标系是平面直角坐标系。转换代码随便一搜就有 |
14
MrZhaoyx 2022-09-22 13:02:27 +08:00
尝试下 GDAL ?
|
16
wangxiaoaer 2022-09-22 13:52:57 +08:00 1
两个思路:
1 转成平面坐标,正如楼上的墨卡托,然后基于平面方式坐标计算。 2 直接基于经纬度计算两两之间的角度,对比判断。具体算法可参考 https://www.movable-type.co.uk/scripts/latlong.html |
17
clf 2022-09-22 14:22:19 +08:00
看你对上下的定义。经纬度和平面坐标系的区别就在于是一个环形。
假设你对上下的定义是:在两点连线(维度最大值不可跨越,仅可跨越东西经度,那么会有两条连线)分割出来的两片区域,那么就是计算包含 c 经度区域的 ab 连线就行了。 |
18
trcnkq 2022-09-22 19:57:31 +08:00
记地心为 o ,则判断 (oa x ob) * oc 符号即可(其中 x 为叉乘,* 为点乘)。
|