У меня есть два пересекающихся линии классов объектов. Я хочу найти угол в каждой точке пересечения, используя ArcGIS 10 и Python.
Кто-нибудь может помочь?
arcpy
arcgis-10.0
Бикаш
источник
источник
Ответы:
Существует относительно простой рабочий процесс. Это преодолевает потенциальные проблемы, которые две функции могут пересекать в более чем одной точке. Это не требует сценариев (но может быть легко превращено в сценарий). Это можно сделать в первую очередь из меню ArcGIS.
Идея состоит в том, чтобы использовать слой точек пересечения, по одной точке для каждой отдельной пары пересекающихся полилиний. Вам нужно получить небольшой кусочек каждой пересекающейся ломаной в этих точках пересечения. Используйте ориентации этих частей, чтобы вычислить их углы пересечения.
Вот шаги:
Убедитесь, что каждый из объектов полилинии имеет уникальный идентификатор в своей таблице атрибутов. Это будет использовано позже, чтобы соединить некоторые геометрические атрибуты полилиний с таблицей точек пересечения.
Геообработка | Пересечение получает точки (убедитесь, что вы хотите указать точки для вывода).
Геообработка | Буфер позволяет вам буферизовать точки на небольшое количество. Сделайте его действительно крошечным, чтобы часть каждой строки в буфере не сгибалась.
Геообработка | Клип (применяется дважды) ограничивает исходные слои полилинии только буферами. Поскольку это создает новые наборы данных для вывода, последующие операции не изменят исходные данные (что хорошо).
Вот схема того, что происходит: два полилинейных слоя, показанные голубым и светло-красным, имеют темные точки пересечения. Вокруг этих точек крошечные буферы показаны желтым цветом. Темно-синий и красный сегменты показывают результаты обрезки оригинальных объектов в эти буферы. Остальная часть алгоритма работает с темными сегментами. (Вы не можете видеть это здесь, но крошечная красная ломаная пересекает две синие линии в общей точке, создавая то, что кажется буфером вокруг двух синих полилиний. Это действительно два буфера вокруг двух перекрывающихся точек пересечения красно-синего цвета. Таким образом, эта диаграмма отображает пять буферов всего.)
Используйте инструмент AddField , чтобы создать четыре новых поля в каждом из этих обрезанных слоев: [X0], [Y0], [X1] и [Y1]. Они будут содержать точечные координаты, поэтому сделайте их двойными и придайте им большую точность.
Вычислить геометрию (вызывается щелчком правой кнопкой мыши на каждом новом заголовке поля) позволяет вычислять координаты x и y начальной и конечной точек каждой обрезанной полилинии: поместите их в [X0], [Y0], [X1] и [Y1] соответственно. Это делается для каждого обрезанного слоя, поэтому необходимо 8 вычислений.
Используйте инструмент AddField , чтобы создать новое поле [Angle] в слое точек пересечения.
Соедините вырезанные таблицы с таблицей точек пересечения на основе общих идентификаторов объектов. (Соединения выполняются путем щелчка правой кнопкой мыши на имени слоя и выбора «Объединения и взаимосвязи».)
На данный момент таблица пересечения точек имеет 9 новых полей: два с именем [X0] и т. Д., А одно с именем [Угол]. Псевдоним полей [X0], [Y0], [X1] и [Y1], которые принадлежат одной из соединяемых таблиц. Давайте назовем их (скажем) «X0a», «Y0a», «X1a» и «Y1a».
Используйте Калькулятор поля, чтобы вычислить угол в таблице пересечений. Вот блок кода Python для расчета:
Выражение вычисления поля, конечно, просто
Несмотря на длину этого кодового блока, математика проста: (dx, dy) является вектором направления для первой полилинии, а (dxa, dya) является вектором направления для второй. Их длины r и ra (вычисленные по теореме Пифагора) используются для нормализации их к единичным векторам. (Не должно быть никаких проблем с нулевой длиной, потому что отсечение должно давать характеристики положительной длины.) Размер их клинового произведения dx dya - dydxa (после деления на r и ra) - синус угла. (Использование продукта клина, а не обычного внутреннего продукта должно обеспечить лучшую числовую точность для почти нулевых углов.) Наконец, угол преобразуется из радианов в градусы. Результат будет лежать в диапазоне от 0 до 90. Обратите внимание на избегание тригонометрии до самого конца: этот подход имеет тенденцию давать надежные и легко вычисляемые результаты.
Некоторые точки могут появляться несколько раз в слое пересечения. Если это так, они получат несколько углов, связанных с ними.
Буферизация и отсечение в этом решении относительно дороги (шаги 3 и 4): вы не хотите делать это таким образом, когда задействованы миллионы точек пересечения. Я рекомендовал его, потому что (а) он упрощает процесс поиска двух последовательных точек вдоль каждой ломаной линии в окрестности ее точки пересечения и (б) буферизация настолько проста, что ее легко выполнить в любой ГИС - дополнительное лицензирование не требуется выше базового уровня ArcMap - и обычно дает правильные результаты. (Другие операции «геообработки» могут быть не такими надежными.)
источник
!table1.x0!
.Я считаю, что вам нужно создать скрипт Python.
Вы можете сделать это, используя инструменты геообработки и arcpy.
Вот основные инструменты и идеи, которые могут быть полезны для вас:
Возможно, будет очень сложно кодировать шаг 2 (также для некоторых инструментов требуется лицензия ArcInfo). Затем вы также можете попытаться проанализировать вершины каждой ломаной линии (сгруппировав их по ID после пересечения).
Вот способ сделать это:
point_x
,point_y
)vert0_x
,vert0_y
) и второй (vert1_x
,vert1_y
) его стихи.tan0 = (point_y - vert0_y) / (point_x - vert0_x)
tan1 = (vert1_y - point_y) / (vert1_x - point_x)
tan1
равноtan2
, то вы нашли две вершины вашей линии, между которыми есть точка пересечения, и вы можете рассчитать угол пересечения для этой линии. В противном случае вам нужно перейти к следующей паре стихов (второй, третий) и так далее.источник
Недавно я пытался сделать это самостоятельно.
Моя подсказка основана на круглых точках вокруг пересечений линий, а также на точках, расположенных на расстоянии одного метра от пересечений. Выходными данными является класс пространственных объектов ломаной линии, который имеет атрибуты числа углов на пересечениях и углах.
Обратите внимание, что линии должны быть выровнены, чтобы найти пересечения, и пространственная привязка должна быть установлена с отображением правильной длины линии (у меня WGS_1984_Web_Mercator_Auxili_Sphere).
Работает в консоли ArcMap, но легко может быть превращен в скрипт на панели инструментов. Этот скрипт использует только линейный слой в оглавлении, не более того.
источник