Библиотека Node.js/Javascript для проверки того, находится ли точка в мультиполигоне geojson

Есть ли какая-то библиотека для node.js или javascript в целом, которая предоставляет функцию для проверки того, находится ли координата в мультиполигоне geojson?

Я пытаюсь создать небольшой HTTP API, который сообщает мне, какие мультиполигоны (представляющие страны, округа, города и т. д.) содержат заданную координату.

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

Я знаю, что есть библиотека под названием "clipper", которая перенесена в javascript, но кажется, что эта библиотека не предоставляет простой " pointInPolygon", даже если сама библиотека очень мощная. Возможно ли это с этой библиотекой?

Кроме того, я нашел еще одну библиотеку под названием "geojson-js-utils", но она, похоже, не поддерживает мультиполигоны. (по крайней мере там об этом не сказано)

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

Любые подсказки?


person Van Coding    schedule 04.12.2013    source источник
comment
Я немного улучшил вопрос. Я надеюсь, что вы вернете это.. В противном случае, пожалуйста, скажите мне, чего не хватает.   -  person Van Coding    schedule 04.12.2013
comment
Если точка находится в многоугольнике, не находится ли она в мультиполигоне, содержащем этот многоугольник?   -  person Josh C.    schedule 04.12.2013
comment
Другими словами, поскольку multipolygon — это массив полигонов, почему бы просто не выполнить итерацию по массиву?   -  person Josh C.    schedule 05.12.2013
comment
@ДжошС. потому что некоторые полигоны могут быть дырами.   -  person Van Coding    schedule 05.12.2013
comment
Можете ли вы представить сценарий дыры? Я еще не уверен, почему это проблема.   -  person Josh C.    schedule 05.12.2013


Ответы (1)


В новейшем Clipper есть эффективная функция PointInPolygon. Он использует алгоритм Проблема точки в многоугольнике для произвольных многоугольников. от Hormann & Agathos.

В документации функции PointInPolygon в Javascript Clipper говорится:


ClipperLib.Clipper.PointInPolygon()

Number PointInPolygon(IntPoint pt, Path poly)

Возвращает 0, если false, -1, если pt находится на полигоне и +1, если pt находится на полигоне.

Использование:

var poly = [{X:10,Y:10},{X:110,Y:10},{X:110,Y:110},{X:10,Y:110}];
var pt = new ClipperLib.IntPoint(50,50);
var inpoly = ClipperLib.Clipper.PointInPolygon(pt, poly);
// inpoly is 1, which means that pt is in polygon

Чтобы протестировать мультиполигон, вы можете обойти подполигоны и проверить их с помощью PointInPolygon.

person Timo Kähkönen    schedule 11.02.2014
comment
дело в том, что clipper таков: библиотека Javascript Clipper выполняет отсечение и смещение как линий, так и полигонов, но геолокация - это другое, она включает в себя sin cos, чтобы учитывать радиус земли. Задача помещена в сферу, а не в плоскость 2d, подход другой - person Julio Marins; 15.01.2016