Страница 1 из 1
Поиск ближайщей точки
Добавлено: 14 янв 2014, 10:50
bobik
Подскажите, можно ли использовать координаты WGS 84 в десятичном виде, которые приходят от gps приемника для задач поиска ближайшей точки и вхождения точки в полигон? Или их необходимо переводить в какую либо проекцию?
Re: Поиск ближайщей точки
Добавлено: 14 янв 2014, 11:02
bingeomap
Я думаю это зависит от ПО на котором вы будете выполнят задачу. Дело в том, что если вы используете геодезические координаты ваша программа должна вычислит расстояния на эллипсоиде, т.е. расстоянию геодезической линий. Если нет, то вы должны работать на каком та проекции.
Re: Поиск ближайщей точки
Добавлено: 14 янв 2014, 11:56
bobik
Программа самописная. Для приблизительной оценки расстояния я хочу использовать следующие расчеты:
Код: Выделить всё
static const double DEG_TO_RAD = 0.017453292519943295769236907684886;
static const double EARTH_RADIUS_IN_METERS = 6372797.560856;
double latitudeArc = (latitude - right.latitude) * DEG_TO_RAD;
double longitudeArc = (longitude - right.longitude) * DEG_TO_RAD;
double latitudeH = sin(latitudeArc * 0.5);
latitudeH *= latitudeH;
double lontitudeH = sin(longitudeArc * 0.5);
lontitudeH *= lontitudeH;
double tmp = cos(latitude * DEG_TO_RAD) * cos(right.latitude * DEG_TO_RAD);
double distanceArc = 2.0 * asin(sqrt(latitudeH + tmp * lontitudeH));
return EARTH_RADIUS_IN_METERS * distanceArc;
Верно ли что для определения вхождения точки в полигон, можно использовать алгоритм, как для эвклидовой системы координат:
Код: Выделить всё
bool inside = false;
for (int i = 0, j = numPoints - 1; i < numPoints; j = i++)
{
if (((points[i].y > testPoint.y) != (points[j].y > testPoint.y)) &&
(testPoint.x < (points[j].x - points[i].x) * (testPoint.y - points[i].y) / (points[j].y - points[i].y) + points[i].x))
{
inside = !inside;
}
}
return inside;
Re: Поиск ближайщей точки
Добавлено: 14 янв 2014, 11:57
Михель
Re: Поиск ближайщей точки
Добавлено: 14 янв 2014, 19:50
Дмитрий Барышников
Да можно. Главное что бы все координаты были в градусах. Мне кажется ваш код для не выпуклых полигонов работать не будет. Обычно из точки выпускают луч и считают количество пересечений с оболочкой. Если нечетное - значит внутри.
А почему не воспользоваться стандартными библиотеками (метод intersect)?
GEOS, gdal, boost и др?
[ Сообщение с мобильного устройства ]
Re: Поиск ближайщей точки
Добавлено: 15 янв 2014, 01:24
bobik
Дмитрий Барышников писал(а):Да можно. Главное что бы все координаты были в градусах. Мне кажется ваш код для не выпуклых полигонов работать не будет. Обычно из точки выпускают луч и считают количество пересечений с оболочкой. Если нечетное - значит внутри.
А почему не воспользоваться стандартными библиотеками (метод intersect)?
GEOS, gdal, boost и др?
[ Сообщение с мобильного устройства ]
В boost пока мало функций реализовано, а вот за geos спасибо.