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