Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找从固定位置到由两个GPS位置连接的直线的最近位置_Java_Gps - Fatal编程技术网

Java 查找从固定位置到由两个GPS位置连接的直线的最近位置

Java 查找从固定位置到由两个GPS位置连接的直线的最近位置,java,gps,Java,Gps,我想找到从固定位置到由两个GPS位置连接的直线的最近位置。我试着用图表来说明它。所有位置均为GPS坐标。我想找到从位置P到从位置A和位置B连接的线的最短距离,即,从P开始的线在连接A和B的线上形成90度角。 如果您知道这方面的现有实现或算法,那就太好了。非常感谢。 我被告知的计算方法是: 首先将GPS位置转换为笛卡尔坐标。对于转换,它使用一个参考位置(Q_参考经度,Q_参考纬度) x=(经度回流)*π/180*r_e,r_e地球半径 y=阿坦(sin)⁡(纬度) 因此,参考点具有笛卡尔坐标(0

我想找到从固定位置到由两个GPS位置连接的直线的最近位置。我试着用图表来说明它。所有位置均为GPS坐标。我想找到从位置P到从位置A和位置B连接的线的最短距离,即,从P开始的线在连接A和B的线上形成90度角。 如果您知道这方面的现有实现或算法,那就太好了。非常感谢。

我被告知的计算方法是: 首先将GPS位置转换为笛卡尔坐标。对于转换,它使用一个参考位置(Q_参考经度,Q_参考纬度)

x=(经度回流)*π/180*r_e,r_e地球半径
y=阿坦(sin)⁡(纬度)
因此,参考点具有笛卡尔坐标(0,artanh(sin⁡(回流)。
conv(refp)=(0,artanh(sin⁡(回流)
所有位置A、B、P都转换为(x、y)坐标系
使用参考笛卡尔坐标(x,y)计算截距点∈R^2:
在以下上下文中(vp)⃗∈R^2是参考笛卡尔坐标系中P的位置向量。
是两个向量a的点积⃗ b⃗.
(凤凰社第2章)⃗  指位置A
(凤凰社第一章)⃗ 指位置B
(副总裁)⃗ 指位置P
(凤凰社第一章)⃗,(凤凰社第2章)⃗,(副总裁)⃗∈R^2
intPoint=[()/()]*((op2)-(op1))+(op1)
必须使用以下逆公式将截距点转换回GPS坐标:
Iconv:R^2→[-180°,180°]×[-90°,90]
经度=x+回流
纬度=弧心⁡(谭)⁡(y) )

有人知道这种方式吗?我试着这样做,但它给出了负值。

由于距离很短,如果你不靠近极点,你可以使用基于规则平面几何的廉价近似

首先你要做的是改变坐标系:用经度乘以纬度的余弦,以说明在两极附近经度较短的事实。否则,在计算投影时将无法获得90°角

然后计算点p在AB线上的投影,就像正常情况一样

完成后,将经度除以纬度以撤消先前所做的坐标更改

以下是基本算法:

// input:
double Alat, Alng, Blat, Blng, Plat, Plng;
// output: 
double Xlat, Xlng;

// change of coordinate system
Alng *= cos(Alat * PI/180);
Blng *= cos(Blat * PI/180);
Plng *= cos(Plat * PI/180);

// compute projection
double scale = ((Blng-Alng)*(Plng-Alng)+(Blat-Alat)*(Plat-Alat)) /
               ((Blng-Alng)*(Blng-Alng)+(Blat-Alat)*(Blat-Alat));

Xlat = (1-scale)*Alat + scale*Blat;
Xlng = (1-scale)*Alng + scale*Blng;

// change to original coordinate system
Xlng /= cos(Xlat * PI/180);

return (Xlat, Xlng)
你可以通过计算其中一个纬度的余弦来降低成本;没什么大区别


如果您靠近极点或出于任何原因需要更精确的结果,则必须使用更复杂的算法。

检查我们要处理的是哪种距离?如果足够短,可以将AB近似为一条直线。如果你必须考虑地球的曲率,它会变得相当复杂。@Joni:距离足够短,在不到50米的范围内。这不是基本的三角形计算吗?你有长度A-B,B-P,P-A,可以计算ABPA的所有角度。对于长度B-P,在B处给定角度,在X处给定90°,您可以计算X-P。小心:如果A、B和P(几乎)在同一条线上,最短距离将是(P,A)或(P,B),并且不会发现90度线将它们连接在一起。我不是在极点附近计算这些值。因此,我可以继续执行你建议的实施方案。我对ur算法有些混淆:Alng=cos(Alat*PI/180);-->沿=纵向(Alat*PI/180)??当转换回来时,Xlat不需要转换?我不是在计算极点附近的这些值。因此,我可以继续执行你建议的实施方案。我对ur算法有些混淆:Alng=cos(Alat*PI/180);-->沿=纵向(Alat*PI/180)??当转换回来时,Xlat不需要被转换?是的,
a*=b
在Java和其他类似C的语言中是
a=a*b
的缩写。随着坐标的改变,纬度可以保持原样,只有经度被调整。
// input:
double Alat, Alng, Blat, Blng, Plat, Plng;
// output: 
double Xlat, Xlng;

// change of coordinate system
Alng *= cos(Alat * PI/180);
Blng *= cos(Blat * PI/180);
Plng *= cos(Plat * PI/180);

// compute projection
double scale = ((Blng-Alng)*(Plng-Alng)+(Blat-Alat)*(Plat-Alat)) /
               ((Blng-Alng)*(Blng-Alng)+(Blat-Alat)*(Blat-Alat));

Xlat = (1-scale)*Alat + scale*Blat;
Xlng = (1-scale)*Alng + scale*Blng;

// change to original coordinate system
Xlng /= cos(Xlat * PI/180);

return (Xlat, Xlng)