gpt4 book ai didi

c# - 如何找到给定纬度/经度以北 x 公里的纬度/经度?

转载 作者:IT王子 更新时间:2023-10-29 04:18:34 25 4
gpt4 key购买 nike

我有一些生成谷歌地图的 C# 代码。此代码查看我需要在 map 上绘制的所有点,然后计算出包含这些点的矩形边界。然后它将此边界传递给 Google Maps API 以适本地设置缩放级别以显示 map 上的所有点。

此代码运行良好,但我有一个新要求。

其中一个点可能具有与之关联的精度。如果是这种情况,那么我会在半径设置为精度值的点周围画一个圆。同样这工作正常但是我的边界检查现在没有做我想要它做的事情。我想让边界框包含完整的圆圈。

这需要一种算法来获取点 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 以计算新的南向位置。

任何人都可以看到我做错了什么或者提供一个已知的工作算法吗?

最佳答案

我有一段非常相似的代码。与另一个实现相比,它让我得到了非常接近的结果。

我认为你的问题在于你使用“距离”作为以米为单位的线性距离而不是以弧度为单位的角距离。

/// <summary>
/// Calculates the end-point from a given source at a given range (meters) and bearing (degrees).
/// This methods uses simple geometry equations to calculate the end-point.
/// </summary>
/// <param name="source">Point of origin</param>
/// <param name="range">Range in meters</param>
/// <param name="bearing">Bearing in degrees</param>
/// <returns>End-point from the source given the desired range and bearing.</returns>
public static LatLonAlt CalculateDerivedPosition(LatLonAlt source, double range, double bearing)
{
double latA = source.Latitude * UnitConstants.DegreesToRadians;
double lonA = source.Longitude * UnitConstants.DegreesToRadians;
double angularDistance = range / GeospatialConstants.EarthRadius;
double trueCourse = bearing * UnitConstants.DegreesToRadians;

double lat = Math.Asin(
Math.Sin(latA) * Math.Cos(angularDistance) +
Math.Cos(latA) * Math.Sin(angularDistance) * Math.Cos(trueCourse));

double dlon = Math.Atan2(
Math.Sin(trueCourse) * Math.Sin(angularDistance) * Math.Cos(latA),
Math.Cos(angularDistance) - Math.Sin(latA) * Math.Sin(lat));

double lon = ((lonA + dlon + Math.PI) % UnitConstants.TwoPi) - Math.PI;

return new LatLonAlt(
lat * UnitConstants.RadiansToDegrees,
lon * UnitConstants.RadiansToDegrees,
source.Altitude);
}

在哪里

public const double EarthRadius = 6378137.0;   //  WGS-84 ellipsoid parameters

LatLonAlt 以度/米为单位(转换在内部进行)。根据需要进行调整。

我假设您可以弄清楚 UnitConstants.DegreesToRadians 的值是什么:)

关于c# - 如何找到给定纬度/经度以北 x 公里的纬度/经度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1125144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com