Поиск ближайщей точки

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
bobik
Новоприбывший
Сообщения: 3
Зарегистрирован: 14 янв 2014, 10:45
Репутация: 0

Поиск ближайщей точки

Сообщение bobik » 14 янв 2014, 10:50

Подскажите, можно ли использовать координаты WGS 84 в десятичном виде, которые приходят от gps приемника для задач поиска ближайшей точки и вхождения точки в полигон? Или их необходимо переводить в какую либо проекцию?

Аватара пользователя
bingeomap
Гуру
Сообщения: 506
Зарегистрирован: 06 июл 2012, 08:37
Репутация: 53
Откуда: Азербайджан, Баку

Re: Поиск ближайщей точки

Сообщение bingeomap » 14 янв 2014, 11:02

Я думаю это зависит от ПО на котором вы будете выполнят задачу. Дело в том, что если вы используете геодезические координаты ваша программа должна вычислит расстояния на эллипсоиде, т.е. расстоянию геодезической линий. Если нет, то вы должны работать на каком та проекции.
С уважением,
Биннат Халилов

bobik
Новоприбывший
Сообщения: 3
Зарегистрирован: 14 янв 2014, 10:45
Репутация: 0

Re: Поиск ближайщей точки

Сообщение bobik » 14 янв 2014, 11:56

Программа самописная. Для приблизительной оценки расстояния я хочу использовать следующие расчеты:

Код: Выделить всё

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;

Михель
Новоприбывший
Сообщения: 8
Зарегистрирован: 10 янв 2014, 16:10
Репутация: 0

Re: Поиск ближайщей точки

Сообщение Михель » 14 янв 2014, 11:57


Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Поиск ближайщей точки

Сообщение Дмитрий Барышников » 14 янв 2014, 19:50

Да можно. Главное что бы все координаты были в градусах. Мне кажется ваш код для не выпуклых полигонов работать не будет. Обычно из точки выпускают луч и считают количество пересечений с оболочкой. Если нечетное - значит внутри.
А почему не воспользоваться стандартными библиотеками (метод intersect)?
GEOS, gdal, boost и др?

[ Сообщение с мобильного устройства ]

bobik
Новоприбывший
Сообщения: 3
Зарегистрирован: 14 янв 2014, 10:45
Репутация: 0

Re: Поиск ближайщей точки

Сообщение bobik » 15 янв 2014, 01:24

Дмитрий Барышников писал(а):Да можно. Главное что бы все координаты были в градусах. Мне кажется ваш код для не выпуклых полигонов работать не будет. Обычно из точки выпускают луч и считают количество пересечений с оболочкой. Если нечетное - значит внутри.
А почему не воспользоваться стандартными библиотеками (метод intersect)?
GEOS, gdal, boost и др?

[ Сообщение с мобильного устройства ]
В boost пока мало функций реализовано, а вот за geos спасибо.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя