我正在尝试开发一种涉及标准化 GPS 坐标(纬度/经度)的算法。这意味着,给定两个点 A (lat1,lon1) 和 B(lat2,lon2) 我想插入一个与 AB 成线性的点 C(相同的弧),并且放置在距 A 和 B 特定距离处(例如:A 到 B 的距离是 0.5 公里,我希望点 C 距离 A 0.1 公里,位于 AB 弧上)。如何计算C点的坐标?
出于给定的目的,将地球近似为完美的球形物体就足够了。
我找到了这篇文章,但它只给出了中点的公式(我还没有完全理解它,以便适应)。两个纬度和经度之间的中点 https://stackoverflow.com/questions/4656802/midpoint-between-two-latitude-and-longitude谢谢。
编辑:我尝试过,但它给出了错误的答案
public static void normalizedPoint(double lat1, double lon1, double lat2, double lon2, double dist){
double constant=Math.PI/180;
double angular = dist/6371;
double a = Math.Sin( 0* angular )/Math.Sin(angular);
double b = Math.Sin(1*angular)/Math.Sin(angular);
double x = a * Math.Cos(lat1) * Math.Cos(lon1) + b * Math.Cos(lat2) * Math.Cos(lon2);
double y = a * Math.Cos(lat1) * Math.Sin(lon1) + b * Math.Cos(lat2) * Math.Sin(lon2);
double z = a * Math.Sin(lat1) + b * Math.Sin (lon2);
double lat3 = Math.Atan2(z, Math.Sqrt( x*x + y*y ));
double lon3 = Math.Atan2(y, x);
Console.WriteLine(lat3/constant + " " + lon3/constant );
}
据我理解原始公式,这应该返回 2 个原始点之一,但事实并非如此(因为使用的分数是 1)。此外,变量 dist 是距两点的距离,并且已正确计算(在同一网站上检查)。
编辑 2:我提供 2 个地理点(lat1、lon1、lat2 lon2)的输入坐标以及它们之间的距离。我正在尝试获得一个中间点(lat3,lon3)。
正如我在链接问题的答案中指出的那样,您需要更改所有输入以使用radians而不是degrees.
我相信你也有一个错误z
你用过的地方lon2
而不是lat2
.
通过这些更正,我得到了您正在寻求的答案:
public static void normalizedPoint(double lat1, double lon1,
double lat2, double lon2,
double dist)
{
double constant = Math.PI / 180;
double angular = dist / 6371;
double a = Math.Sin(0 * angular) / Math.Sin(angular);
double b = Math.Sin(1 * angular) / Math.Sin(angular);
double x = a * Math.Cos(lat1* constant) * Math.Cos(lon1* constant) +
b * Math.Cos(lat2* constant) * Math.Cos(lon2* constant);
double y = a * Math.Cos(lat1* constant) * Math.Sin(lon1* constant) +
b * Math.Cos(lat2* constant) * Math.Sin(lon2* constant);
double z = a * Math.Sin(lat1* constant) + b * Math.Sin(lat2* constant);
double lat3 = Math.Atan2(z, Math.Sqrt(x * x + y * y));
double lon3 = Math.Atan2(y, x);
Console.WriteLine(lat3 / constant + " " + lon3 / constant);
}
当然,上面的内容可以通过仅转换角度来大大简化,避免重复计算相同的角度Sin
/Cos
价值观等
Calling:
normalizedPoint(47.20761, 27.02185, 47.20754, 27.02177, 1);
我得到输出:
47.20754 27.02177
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)