我有一些生成谷歌地图的 C# 代码。此代码查看我需要在地图上绘制的所有点,然后计算出矩形的边界以包含这些点。然后它将这个边界传递给 Google Maps API 以适当地设置缩放级别以显示地图上的所有点。
这段代码运行良好,但是我有一个新要求。
其中一个点可能具有与之相关的精度。如果是这种情况,那么我在该点周围画一个圆,半径设置为精度值。这再次工作正常,但是我的边界检查现在没有做我想要做的事情。我想让边界框包括完整的圆圈。
这需要一种算法来获取一个点 x 并计算点 y,该点位于 x 以北 z 米处和 x 以南 z 米处。
有没有人有这个算法,最好是在 C# 中。我确实在这里找到了一个通用算法,但我似乎没有正确实现这一点,因为我得到的答案是 1000 公里的漂移。
这是通用示例
Lat/lon given radial and distance
A point {lat,lon} is a distance d out on the tc radial from point 1 if:
lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
IF (cos(lat)=0)
lon=lon1 // endpoint a pole
ELSE
lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
ENDIF
这是我的 C# 翻译。
// Extend a Point North/South by the specified distance
public static Point ExtendPoint(Point _pt, int _distance, int _bearing )
{
Decimal lat = 0.0;
Decimal lng = 0.0;
lat = Math.Asin(Math.Sin(_pt.Lat) * Math.Cos(_distance) + Math.Cos(_pt.Lat) *
Math.Sin(_distance) * Math.Cos(_bearing));
if (Math.Cos(lat) == 0)
{
lng = _pt.Lng; // endpoint a pole
}
else
{
lng = (
(_pt.Lng - Math.Asin(Math.Sin(_bearing) * Math.Sin(_distance) / Math.Cos(lat))
+ Math.PI) % (2 * Math.PI)) - Math.PI;
}
ret = new Point(lat,lng);
return ret;
}
我用 0 的方位角调用这个函数来计算新的北向位置,用 180 的值来计算新的南向位置。
谁能看到我做错了什么或者提供一个已知的工作算法?