Javascript: Эффективно ли определить, перекрываются ли две функции GeoJSON? - PullRequest
1 голос
/ 05 апреля 2019

Мне нужно создать функцию JavaScript, которая принимает в качестве входных данных две функции GeoJSON: Элемент A будет многоугольником или окружностью; B будет точкой, многоугольником, окружностью или эллипсом.

Функция должна возвращать, как можно быстрее и эффективнее, B"касается" ли A каким-либо образом (перекрываются ли они, содержится ли одно в другом, например, )

Чрезвычайная точность не важна (т. Е. Меня не волнуют вопросы, возникающие, например, из-за кривизны Земли); Мне также не нужно знать какие-либо подробности о , как две функции соприкасаются друг с другом, просто логическое значение ИСТИНА или ЛОЖЬ относительно того, действительно ли они это делают.

Если есть хорошее решение, требующее модуля, то это прекрасно. Единственное, что важно, - это то, что фактическая функция выполняется настолько быстро, насколько это возможно. Например. похоже, что Turf может сделать это, но потребует выполнения нескольких отдельных функций (пересечение, содержание и т. д.), некоторые из которых слишком тяжелые.

1 Ответ

1 голос
/ 06 апреля 2019

К счастью, есть JTS-порт JTS (Java Topology Suite) - библиотека пространственных предикатов и функций для обработки геометрии в соответствии со спецификацией Simple Features (стандарт Open Geospatial Consortium)

Название - JSTS(Включена поддержка GeoJSON)

https://github.com/bjornharrtell/jsts

  • Типичные примеры:

Пересечение A и B

var intersection = a.intersection(b)

РазницаA и B

var difference = a.difference(b)

Объединение A и B

var union = a.union(b)

Проверьте набор тестов для всех случаев использования, включая тесты Point in Polygon https://github.com/bjornharrtell/jsts/tree/master/test

Кроме того, наглядный пример, интегрированный с Openlayers (с исходным кодом): https://openlayers.org/en/master/examples/jsts.html

EDIT 1:

В случае, если вам нужна только одна функция, что-то вроде этого будет делать:

var intersection = (a.intersection(b) !== null) ? true : false;
...