Алгоритм вычисления покрытия + перекрытия из набора дуг

10

У меня есть шейп-файл, содержащий дуги, представляющие путь, по которому грузовик разбрасывает удобрения на ферму.

Допустим, я знаю, что ширина разбрасывания составляет 30 м, то есть грузовик может разбрасывать удобрения на 15 м с каждой стороны транспортного средства.

Я хочу создать набор полигонов, которые показывают:
1) общую площадь, на которой получено удобрение
2) области перекрытия, т. Е. Где два отдельных прохода были слишком близко друг к другу, так что некоторые части фермы получали вдвое правильную «дозу» «Удобрений.

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

Если это уместно, я использую TatukGIS VCL DK, но я действительно ищу алгоритм, а не конкретное решение.

Некоторые пояснения в ответ на обсуждение до сих пор:

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

2) Цель отчета - показать пользователю, насколько «опытным» был оператор транспортного средства, где «опытный» означает «достиг самого высокого охвата с наименьшим перекрытием».

3) Я чувствую себя более комфортно на векторной земле, чем на растровой, поэтому предпочитаю векторные решения.

Спасибо,

Даррен.

dbruning
источник
1
Интересно, будет ли это похоже на методы, которые предсказывают кумулятивные осадки на основе прогнозируемых штормовых дорожек.
Кирк Куйкендалл

Ответы:

3

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

Другой подход заключается в наложении полигональной сетки на данные, а затем в каждой ячейке сетки буферизует каждый пересекающийся отрезок линии отдельно. Чтобы быть точным в этом, вы хотите взять анализируемую ячейку сетки, буферизовать ее, затем собрать пересекающиеся сегменты и буферизовать их, выполняя анализ в исходном окне ячейки.

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

SCW
источник
Спасибо. Я думал в соответствии с вашим первым предложением - разбить геометрию на сегменты и буферизовать их. Я думаю, что мне нужно также буферизовать концы сегментов, чтобы получить закругленные края по углам. Думая о случае, когда я начинаю с линии под прямым углом - если я не буферизую концы, я получу два перекрывающихся прямоугольника с квадратом, отсутствующим на внешней стороне угла (трудно выразить как текст!)
dbruning
Я думаю, что мне нужно также буферизовать концы сегментов, чтобы получить закругленные края по углам. Далее я думал о том, чтобы пересечь буфер для каждого сегмента с буфером для предыдущего сегмента, а затем накапливать только «новые» части каждого буфера в основной буфер. Идея состоит в том, чтобы игнорировать совпадения с предыдущим сегментом, но захват перекрывается с более старыми сегментами.
dbruning
2

Нет решения, но некоторые входные данные:

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

введите описание изображения здесь

Этот документ стр. 176-180 (на французском языке ... извините) дает алгоритмы для обнаружения таких самопересекающихся частей. Принцип, как предлагает scw , заключается в использовании одностороннего буфера каждого сегмента, состоящего из сегмента плюс 0, 1 или 2 дуг окружности. JTS содержит реализацию этого одностороннего буфера, который может быть полезен.

жюльен
источник
Почему вы обеспокоены обнаружением самопересечений? И почему вы предлагаете «односторонние» буферы? Ни то, ни другое не кажется уместным для проблемы.
whuber
Цель состоит в том, чтобы определить, где грузовик разбрасывает удобрения несколько раз, то есть там, где разбрасывается зона разбрасывания.
Жюльен
2

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

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

Растровое представление может справиться с этими проблемами. Растеризуйте путь трактора. Это устанавливает все ячейки, не пересекаемые трактором, в значения NoData (или в ноль). Если бы трактор двигался со стандартной постоянной скоростью, было бы достаточно поместить постоянное значение в каждую ячейку данных. Теперь, например, если бы трактор двигался с удвоенной скоростью, (предположительно) его норма внесения снизилась бы вдвое, и это можно представить, вдвое уменьшив значение в ячейках.

Как правило, значение, которое нужно поместить в любую ячейку, представляет собой норму внесения на единицу площади . Если трактор равномерно разбрасывает x кг удобрений в секунду до 15 м с каждой стороны во время движения со скоростью у м / сек, то он разбрасывает х / у кг / с / [м / с] / (2 * 15 м) = х / (30 г ) , кг / м ^ 2 удобрения. Таким образом, x / (30 y ) - это значение для каждой ячейки. x дано, а y вычислено по данным GPS.

Самопересечения в принципе не проблема . Если путь трактора пересекает себя, добавляйте вклады каждый раз, когда он пересекает ячейку. Для этого может потребоваться специальная обработка, в зависимости от того, как создается сетка и от возможностей программного обеспечения ГИС.

Сделав эту подготовку, все остальное быстро и легко: фокусная сумма этой сетки, используя круговую окрестность с радиусом 15 м, находит совокупное количество, распределенное на единицу площади в каждой ячейке.

Whuber
источник
1
+1 кажется, что если бы у вас был инструмент, позволяющий ядру (представляющему трактор) перемещаться по пути (а не по каждому ряду), эта проблема была бы более управляемой.
Кирк Куйкендалл
@Kirk Нет необходимости следовать пути или строкам или чему-либо еще с ядром. Важно оценить изменение точки зрения, которое сопровождает фокусную сумму: вместо того, чтобы рассматривать проблему как проблему распространения материала по пути точек, рассматривайте ее как вычисление того, сколько материала накапливается в каждой точке поля. , Очевидно, это та же проблема с тем же решением. Подход с движущимся ядром (и предлагаемые подходы буферизации) принимают первую точку зрения; Очаговая сумма, вторая. Но инструмент фокусной суммы доступен; движущегося ядра вычисления нет.
whuber
Я думаю, что описанный вами растровый подход был бы лучшим методом, если бы мы знали скорость и скорость распространения. К сожалению, в этом конкретном случае мы не знаем ни того, ни другого. Наш конечный пользователь может выбрать любой слой в качестве входных данных для этого отчета покрытия, и мы не можем полагаться на геометрию, имеющую какие-либо конкретные метаданные.
dbruning
@dbruning Этот подход не требует известных скоростей / спредов ; это просто позволяет им (+ более точная модель реальности), если они у вас есть. Тем не менее, для получения метрик, которые вы хотите (общая площадь покрытия; области перекрытия), из системы требуется больше порогового значения + подсчет ячеек + подсчет, и здесь также смешаны компромиссы точности.
Дэн С.
@dbruning Если вы не знаете скорость распространения, вы получите относительную скорость распространения. Если вы не знаете скорости, вы все равно знаете (или должны знать), как люди управляют тракторами, и должны иметь возможность получать разумные оценки относительных скоростей. Если вы предполагаете постоянную скорость и постоянную скорость распространения, вы все равно получите разумные ответы; они согласятся с ответами на основе буфера на прямых участках тракторных маршрутов; и они, вероятно, будут более реалистичными в изогнутых частях.
whuber
2

Я не уверен на 100% в протоколе StackExchange, поэтому я публикую это как ответ на мой вопрос. Это ответ, который я все равно использовал.

Основной алгоритм:
1. Разбейте любую геометрию слоя на сегменты, длина которых не превышает 1/2 ширины разброса.
2. Для каждого сегмента:
- создайте «скользящий буфер», оглядываясь назад по фигуре и буферизуя все предыдущие сегменты, где совокупная длина этих сегментов меньше ширины спреда (радиус буфера = 1/2 ширины спреда)
- Создать «буфер следующего сегмента» только следующего сегмента (радиус буфера = 1/2 ширины разброса)
- вычтите «скользящий буфер» из «буфера следующего сегмента», чтобы получить «новый буфер»
- объедините все «новый буфер» многоугольники вместе, чтобы получить один многоугольник на форму.

По сути, это позволяет водителю разбрасывателя совершать прямые (или более широкие) повороты без штрафа за наложение, но если они поворачивают назад слишком резко, так что они распространяются по «старой земле», мы начинаем перекрываться.

Перекрывается синим

Спираль выглядит так, как будто я хочу:

спираль

dbruning
источник