В настоящее время я беру 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
Кто-нибудь есть идеи о том, как я могу изменить алгоритм для правильной работы?
Точка является внутри зеленых границ, но вы просто хотите переопределить это с другим полигоном.
Предполагая, что у вас есть несколько полигонов, возможно, стоит отслеживать, заштрихованы ли полигоны (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;
}
}
Чтобы найти внешний цикл, создайте массив полигонов и выполните итерацию, проверяя все комбинации, из которых внутри какая (используя алгоритм, который у вас уже есть). Проверка одной точки из одного в полный другой многоугольник должна работать. Полигон, который никогда не будет внутри других, будет внешней петлей (заштрихован). Все остальные внутри, перевернутые и не затененные.
Конечно, это предполагает, что петли никогда не пересекаются.
Вам нужно будет проверить точку во всех полилиниях, используя алгоритм. Если это внутри внешней петли, а не внутри любой внутри петли затенены; если он находится внутри внешнего цикла и внутри внутреннего цикла, он не затенен.
Других решений пока нет …