Я пытаюсь выяснить точки перегиба, то есть точки, где кривые линии начинаются и заканчиваются. Если вы посмотрите на изображение, зеленая линия может быть дорогой или ручьем, а черные точки - это точки, где кривые начинаются и заканчиваются.
Каковы были бы шаги высокого уровня для автоматизации генерации этих очков? У меня есть рабочий стол ArcGIS, и я очень удобен с ArcObjects.
arcobjects
algorithm
Девдатта Тенгше
источник
источник
Ответы:
Когда кривая состоит из отрезков, то все внутренние точки этих отрезков являются точками перегиба, что не интересно. Вместо этого кривая должна рассматриваться как аппроксимируемая вершинами этих отрезков. Разделив кусочно-дважды дифференцируемую кривую на эти сегменты, мы можем затем вычислить кривизну. Строго говоря, точка перегиба - это место, где кривизна равна нулю.
В примере имеются удлиненные участки, где кривизна почти равна нулю. Это говорит о том, что указанные точки должны аппроксимировать концы таких отрезков областей низкой кривизны.
Таким образом, эффективный алгоритм объединит вершины, вычислит кривизну вдоль плотного набора промежуточных точек, определит диапазоны почти нулевой кривизны (используя некоторую разумную оценку того, что значит быть «рядом») и отметит конечные точки этих диапазонов. ,
Вот рабочий
R
код, чтобы проиллюстрировать эти идеи. Давайте начнем со строки строки, выраженной в виде последовательности координат:Сплайн координаты х и у отдельно для достижения параметризации кривой. (Параметр будет вызван
time
.)Интерполируйте сплайны для построения и вычисления:
Нам нужна функция для вычисления кривизны параметризованной кривой. Необходимо оценить первую и вторую производные сплайна. Для многих сплайнов (таких как кубические сплайны) это простой алгебраический расчет.
R
предоставляет первые три производные автоматически. (В других средах можно вычислить производные численно.)Я предлагаю оценить порог для нулевой кривизны с точки зрения степени кривой. По крайней мере, это хорошая отправная точка; это должно быть отрегулировано согласно извилистости кривой (то есть увеличено для более длинных кривых). Позже это будет использовано для окрашивания участков в соответствии с кривизной.
Теперь, когда вершины были разделены и вычислена кривизна, осталось только найти точки перегиба . Чтобы показать их, мы можем построить вершины, построить сплайн и отметить точки перегиба на нем.
Открытые точки - это исходные вершины,
xy
а черные точки - это точки перегиба, автоматически идентифицируемые этим алгоритмом. Поскольку кривизна не может быть надежно рассчитана в конечных точках кривой, эти точки специально не отмечены.источник
Вы можете использовать инструмент Densify . Для этого случая вы выбираете уплотнение по углу, затем выберите максимальный угол, принятый по прямой линии. Затем примените к результирующей линии инструмент Split line по вершинам . Наконец, удалите линии, у которых shape_length меньше минимальной длины дороги.
На этой картинке мы видим три шага:
1- Увеличьте линию, используя угол. Я использовал 10 градусов в качестве параметра, и мы использовали сплитлайн. На картинке изогнутая линия находится в начальной фазе.
2- Выберите сегменты, где shape_length не является избыточным. Как мы видим из таблицы, я не выбрал эти избыточные длины. Затем я выбираю их в новый класс пространственных объектов.
3- Мы извлекли вершины, расположенные по краям линий, которые являются точками перегиба.
источник
Вы можете использовать инструмент Обобщение , который имеет максимальное смещение от исходной линии в качестве параметра, так что вы можете выбрать смещение, соответствующее вашему случаю.
Если мы назовем исходную строку «line_cur», а обобщенную - «line_gen», то мы можем обрезать «line_cur» по «line_gen». Результатом будет прямой сегмент "line_cur". Затем мы можем очистить некоторые очень короткие сегменты, удалив их с помощью SQL-запроса, который выбирает Shape_length больше минимальной длины дороги.
источник