У меня есть код С#, который генерирует карты Google. Эти коды просматривают все Точки, которые мне нужны для построения на карте, а затем выстраивают границы прямоугольника, чтобы включить эти точки. Затем он передает эту оценку API Карт Google, чтобы установить уровень масштабирования соответствующим образом, чтобы показать все точки на карте.
Этот код работает нормально, но у меня есть новое требование.
Одна из точек может иметь связанную с ней точность. Если это так, тогда я рисую круг вокруг точки с радиусом, заданным для значения точности. Опять же, это прекрасно работает, однако моя проверка границ теперь не делает то, что я хочу, чтобы она делала. Я хочу, чтобы ограничивающая рамка включала полный круг.
Для этого требуется, чтобы алгоритм взял точку x и вычислил точку y, которая была бы z метров к северу от x, а также z метров к югу от x.
У кого-нибудь есть этот алгоритм, желательно на С#. Я нашел общий алгоритм здесь, но я, кажется, не реализовал это правильно, так как ответы, которые я получаю, являются 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
И это мой перевод на С#.
// 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 для вычисления нового южного положения.
Кто-нибудь может увидеть, что я сделал неправильно или, возможно, предоставил известный рабочий алгоритм.