Вот иллюстрация рабочего процесса, о котором я упоминал в комментарии выше, и хотя я не знаю какой-либо простой предварительно подготовленной процедуры для этого, я приложил электронную таблицу Excel, в которую можно импортировать набор координат отправления-назначения и лист затем создает набор или круговую линию координат (таблица здесь ). У него есть настроенные формулы, поэтому довольно легко импортировать новые координаты OD и расширять формулы, чтобы заполнить результаты, но я более подробно расскажу о логике процесса, а другие могут дать совет, как полностью написать сценарий в ArcMap (или любой другой).
Вкратце, я думаю, что это разумно для визуализации данных OD, в основном по той же причине, по которой популярны большие круговые линии, они обеспечивают более визуальное различие между линиями. Подход, который я предлагаю, также имеет одно преимущество перед большими круговыми линиями в том, что направление потока кодируется в полукруге. В этом другом ответе на сайте я даю более общий обзор методов визуализации для отображения потока, и многие из тех же самых техник могут применяться в дополнение к созданию дуг, подобных этой.
Итак, чтобы детализировать, как рисуют линии, как я предлагаю, по сути, у меня есть только 3 шага для процесса, 1) найти ориентацию потока, 2) найти среднюю точку и расстояние потока, 3) обработать среднюю точку, как центр круга, а затем нарисуйте дугу (полукруг от начала координат до пункта назначения). Чтобы было ясно, я начинаю с установленной пары проецируемых координат начала и координат (x1,y1)
назначения (x2,y2)
.
Итак, 1) найдите ориентацию потока. Один сначала использует формулу, ATAN((y2 - y1)/(x2 - x1))
а затем в зависимости от направления назначает ориентацию в зависимости от того, является ли направление на восток или запад. Пример псевдокода ниже (я назначаю точки OD, которые находятся в одинаковых координатах с ориентацией нуля). Здесь varaible or_rad
предназначен для сокращения «ориентации в радианах» и pi
относится к значению pi.
#tan_or = ATAN((y2 - y1)/(x2 - x1)).
Do If x2 = x1 and y1 <= y2.
compute or_rad = 0.
Else if x2 = x1 and y1 > y2.
compute or_rad = pi.
Else if x1 > x2.
compute or_rad = 270/180*pi - #tan_or.
Else if x1 < x2.
compute or_rad = 90/180*pi - #tan_or.
End If.
2) Найти среднюю точку и расстояние потока. Это очень просто, так как только для одного набора парных координат будет находиться средняя точка в координатах (x, y) (x1+x2/2,y1+y2/2)
. Итак, давайте определимся mid_x = (x1 + x2)/2
и mid_y = (y1 + y2)/2
для следующей части. Расстояние с использованием теоремы пифагорея просто distance = SQRT((x1 - x2)^2 + (y1 - y2)^2)
.
3) Затем, учитывая эту информацию, нарисуйте круг с заданным количеством градусов и радиусом (который равен половине расстояния между двумя точками). Например, допустим, мы начинаем с набора пар координат OD в (1,3):(3,2)
. Ориентация в градусах будет ~ 116 (а в радианах ~ 2), средняя точка x, y будет, (2,2.5)
а расстояние между двумя точками - около 2.2.
Допустим, мы хотим нарисовать полукруг около 180 градусов. В псевдо-коде (с использованием переменных, которые я уже определил) итерации будут выглядеть примерно так:
for i in (0 to 180 degrees)
rad_i = i/180*pi. /*converts i from degrees to radians
step_or = pi - rad_i /*for clarity, this makes the circle go from origin to destination
radius = distance/2
Arc_X = mid_x + sin(or_rad - step_or)*radius.
Arc_Y = mid_y + cos(or_rad - step_or)*radius.
Ниже приведена схема исходных координат, указанных мной выше. Начиная с нуля и заканчивая 180, убедитесь, что существо и конечные точки находятся в одинаковых местах. Настройка цикла на большее количество шагов (более подробная дуга) или меньшее количество (менее подробная дуга) должна быть достаточно очевидной.
![введите описание изображения здесь](https://i.stack.imgur.com/VkVs0.png)
Отметим, что другие темы на сайте обсуждают создание линий из точечных данных (см. Тег polyline-creation ). У меня есть пример в прикрепленной электронной таблице xls, и я использовал инструмент Arcmap ET Geo- wizards для преобразования координат электронной таблицы в линии шейп - файла. Дуги в данных примера в прилагаемой электронной таблице впоследствии выглядят следующим образом;
![введите описание изображения здесь](https://i.stack.imgur.com/EJMPc.png)
Одним из простых, но потенциально полезных обновлений для этой текущей настройки было бы обновление формул, чтобы учесть предварительно определенное количество эксцентриситета в дуге, хотя я до сих пор не был совершенно уверен, как это сделать в моих нескольких попытках. Я с нетерпением жду предложений и отзывов от сообщества по моему совету.