Найдите координаты, где LineString пересекает границу полигона в turfjs

Есть ли способ в Turfjs определить координаты, в которых LineString пересекается с границей многоугольника?

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

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

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

Поскольку трек GPX записывает местоположения только через определенные промежутки времени, обычно pN, записанный в момент времени tN, находится за пределами области, а pN+1, записанный в момент времени tN+1, находится внутри области. Если я могу получить точку, в которой линия (pN, pN+1) пересекает границу многоугольника, я могу оценить точное время, когда дорожка пересекает многоугольник.


person rifboy    schedule 10.11.2015    source источник
comment
Вы можете задать этот вопрос на gis.stackexchange.com.   -  person Steve Bennett    schedule 11.11.2015
comment
Спасибо @SteveBennett, я спросил там.   -  person rifboy    schedule 11.11.2015


Ответы (2)


В конечном счете, похоже, у turfjs нет API для этого.

Я смог получить нужный ответ, перечислив точки многоугольника из объекта GeoJSON для построения последовательности сегментов линии, а затем я использовал maxogden/geojson-js-utils linesIntersect для проверки точек пересечения.

person rifboy    schedule 17.11.2015

Я не вижу функции Turf, которая делает именно это, но есть intersect, которая находит площадь пересечения двух многоугольников.

Вы могли:

  1. Постройте многоугольник, соединив линию с самой собой в обратном порядке (так что ABC становится ABCBA)
  2. Найдите пересечение ABCBA и P, исходного многоугольника, используя Intersect.
  3. Пересечение должно быть многоугольником с нулевой площадью, который является частью ABCBA внутри P. Каким-то образом вычислите его длину (странно, но нет функции периметра).
  4. Вычтите эту длину из исходной длины ABC.

Не совсем элегантно, правда. :)

РЕДАКТИРОВАТЬ

Пробовал это. Оказывается, Turf-intersect не возвращает пересечения, если один из полигонов имеет нулевую площадь.

person Steve Bennett    schedule 11.11.2015
comment
Думаю, что turf-line-to-polygon мог бы сделать это. Затем вы можете немного буферизовать его, чтобы полигон не был пустым. Я поиграю с ним и посмотрю, какие результаты он дает. - person rifboy; 11.11.2015
comment
Да, я вижу, что в этой организации Github гораздо больше модулей Turf, чем в официальном списке: github.com/Turfjs - person Steve Bennett; 13.11.2015
comment
@SteveBennett, не могли бы вы проверить здесь, пожалуйста, stackoverflow.com/questions/55974083/ - person DevAS; 04.05.2019
comment
Я не вижу никакого отношения к этому вопросу, кроме того, что оба используют Turf. - person Steve Bennett; 06.05.2019