【发布时间】:2010-11-10 15:24:02
【问题描述】:
我有一些生成谷歌地图的 C# 代码。此代码查看我需要在地图上绘制的所有点,然后计算出矩形的边界以包含这些点。然后它将此边界传递给 Google Maps API 以适当地设置缩放级别以显示地图上的所有点。
此代码运行良好,但我有一个新要求。
其中一个点可能具有与之相关的精度。如果是这种情况,那么我在该点周围画一个圆,半径设置为精度值。这再次工作正常,但是我的边界检查现在没有做我想要做的事情。我想让边界框包含完整的圆圈。
这需要一种算法来获取点 x 并计算点 y,该点位于 x 以北 z 米处和 x 以南 z 米处。
有没有人有这个算法,最好是在 C# 中。我确实找到了一个通用算法here,但我似乎没有正确实现这一点,因为我得到的答案是漂移了 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 来计算新的南纬位置。
谁能看到我做错了什么或者提供一个已知的工作算法?
【问题讨论】:
-
对于它的价值,我有一个 PHP 示例,它可以执行 OP 请求的操作。在我的示例中,它在起始纬度/经度坐标周围绘制了一个框,但代码可以很容易地用于获取单个点、X 公里或英里以外的点。 richardpeacock.com/blog/2011/11/…