Нахождение точки широты / долготы внутри многоугольника, определяемого координатами

В настоящее время я беру KML, используемый для определения увиденных полигонов Вот.

Я использую алгоритм подробно в этом ответе определить, находится ли точка внутри многоугольника.

Однако проблема в том, что точка находится внутри пустой части многоугольника, как показано ниже.

Нажмите, чтобы увидеть изображение!

Если я передаю координаты Индианаполиса (показано стрелкой), алгоритм все равно говорит, что точка находится внутри светло-зеленого многоугольника, что неверно.

Когда я передаю координаты Индианаполиса, используя KML, определяющий изображение выше, это результаты.

string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Slight Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Slight Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is outside Marginal Risk
string(22) "39.7774501,-86.1090119" 39.7774501,-86.1090119 is inside General Thunder

Кто-нибудь есть идеи о том, как я могу изменить алгоритм для правильной работы?

0

Решение

Точка является внутри зеленых границ, но вы просто хотите переопределить это с другим полигоном.

Предполагая, что у вас есть несколько полигонов, возможно, стоит отслеживать, заштрихованы ли полигоны (True) или не затенены (False) или какую-то другую комбинацию, основанную на том, что на самом деле делает ваш алгоритм.

Передайте статус затенения в качестве аргумента в test а также pointInPolygon функции (что-то вроде функции test($lat, $lng, $shaded)) и инвертировать вывод pointInPolygon если $shaded является False,

function pointInPolygon($p, $polygon, $shaded) {
//if you operates with (hundred)thousands of points
//rest of code
$output = $c%2!=0;
if (!$shaded) { //if the area is not shaded, negate the output
return !$output;
} else {
return $output;
}
}

Чтобы найти внешний цикл, создайте массив полигонов и выполните итерацию, проверяя все комбинации, из которых внутри какая (используя алгоритм, который у вас уже есть). Проверка одной точки из одного в полный другой многоугольник должна работать. Полигон, который никогда не будет внутри других, будет внешней петлей (заштрихован). Все остальные внутри, перевернутые и не затененные.

Конечно, это предполагает, что петли никогда не пересекаются.

Вам нужно будет проверить точку во всех полилиниях, используя алгоритм. Если это внутри внешней петли, а не внутри любой внутри петли затенены; если он находится внутри внешнего цикла и внутри внутреннего цикла, он не затенен.

0

Другие решения

Других решений пока нет …