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

9

Есть 3 вероятных сценария, для которых я пытаюсь запечатлеть близкие расстояния:

  1. Станция метро обмена, которая имеет 2 или более соседних станций. То есть рассматриваемая станция соединяет 2 или более основных маршрутов и имеет 2 или более соседних станций.
  2. Терминальная станция метро, ​​которая имеет только 1 соседнюю станцию. Это станция в конце линии.
  3. Линейная станция метро, ​​которая имеет ровно 2 соседние станции, одна из которых подходит.

Я пытаюсь вычислить значение, которое можно назвать «средним расстоянием между соседними станциями».

arcpy.GenerateNearTable_analysis()Может обрабатывать два варианта: Расстояние до ближайшего элемента, и расстояние между всеми функциями.

У кого-нибудь есть умный метод решения этих сценариев? Обратите внимание, что каждая станция обозначена как «Interchange», «Terminal» или «Inline» в таблице атрибутов под полем «StationType».

Добавлено:

Вот некоторый код psuedo, основанный на предложении @ whuber в комментариях. У меня пока нет времени, чтобы это выяснить, поэтому, если кто-то захочет нанести удар, вы будете вознаграждены галочкой! ;)

Я взглянул на библиотеку NetworkX, и она, кажется, работает так, как я хочу.

Учитывая график:

A —― B ―― C ―― D
     |
     E

а также узлы и ссылки:

Nodes = ["A", "B", "C", "D", "E"]
Links = [("A", "B"), ("B", "C"), ("C", "D"), ("B", "E")]

def myFunction(node):
    identify the links that node belongs to
    count the number of links
    calculate the total link lengths
    divide the total link lengths by the number of links
    return someValue
Майкл Маркиета
источник
Я также могу упомянуть, что я использую ArcGIS 10.1 и мне нравится модуль arcpy.da (за его скорость). Я надеюсь, что мы можем использовать это.
Майкл Маркиета
3
ПОЭТОМУ это чисто теоретико-графическая задача со стандартным решением: вы ищете граф окрестностей каждой вершины. Он доступен практически сразу, как только вы представляете сеть в стандартном формате, например DCEL (или обобщение, если сеть непланарная). Это говорит о том, что могут быть доступны некоторые готовые решения Python.
whuber

Ответы:

5

Я полагаю, что ваша проблема, как предложил @whuber, лучше всего будет представлена ​​в Матрице смежности . То есть, если у вас есть время и желание понять теорию, лежащую в основе, а не полагаться на пакет, чтобы сделать работу за вас.

Для данного графа G с вершинами {v 1 , v 2 , ..., v n }, где n - количество вершин, необходимо создать матрицу размера M i, j, где i = n и j = п. Каждая вершина затем представляется в i- й строке числом путей, найденных в соседних вершинах в j- м столбце.

Пример ниже:

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

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

ПРИМЕЧАНИЕ. Предполагая, что ни одна станция не зацикливается на себе, k- я строка никогда не будет иметь значения, отличного от 0 в k- м столбце. Все определения ниже предполагают, что это правда

ПРИМЕЧАНИЕ. Предполагая, что между одной и той же станцией нет параллельных линий, все приведенные ниже примеры предполагают, что значение ячейки будет только 1 или 0. В приведенном выше примере также допускается двунаправленное перемещение.

Правила определения категорий станций:

1. Терминал

Терминал будет идентифицирован k- й строкой, имеющей один столбец, который не имеет значения 0, и который имеет значение 1. См. Вершины 1, 2 и 3 в примере 1 выше.

2. Соединение

Соединение будет идентифицировано k- й строкой, имеющей более двух столбцов, содержащих значение 1. См. Вершину 4 в примере 1 выше, или все вершины в примере 3 выше.

3. Встроенный

Встроенная станция обозначается наличием ровно 2 столбцов в k- й строке, где значение равно 1. См. Все вершины в примере 2 выше. (Игнорируйте тот факт, что {v 1 , v 3 } пересекается с {v 2 , v 4 }.)

nagytech
источник
Кто ты и откуда ты пришел! Это был один из лучших ответов, которые я получил за долгое время. Спасибо @Geoist.
Майкл Маркиета
@MichaelMarkieta Забавная история, я только что узнал об этом не за 2 часа до того, как увидел ваш пост.
nagytech
1

Вы можете попробовать использовать Shapely . Если вы преобразуете свои дугообразные точки в фигурные, вы можете рассчитать расстояние между отдельными точками.

import arcpy
import shapely

arc_point1 = arcpy.Point(1,1)
arc_point2 = arcpy.Point(5,5)

shp_point1 = shapely.geometry.Point(arc_point1.X, arc_point1.Y)
shp_point2 = shapely.geometry.Point(arc_point2.X, arc_point2.Y)

distance = shp_point1.distance(shp_point2)
print "distance:", distance
Кир
источник
Следует отметить, что Shapely можно использовать только для объектов на декартовой плоскости, поэтому этот метод не будет работать, если ваши данные находятся в географических координатах.
Сайрус
Этот ответ предполагает двусмысленность в том, как вопрос может быть понят. Я прочитал вопрос как указание расстояния известны; их вычисление не является проблемой. Я полагаю, что OP ищет алгоритм для определения переменного числа ближайших соседей вершин вдоль сети, а затем извлечения их расстояний и вычисления их статистической сводки (такой как среднее).
whuber
@whuber Ой! Согласился, я слишком поспешно ответил на вопрос.
Сайрус
@whuber на высоте.
hhart
Это не будет работать для меня, но спасибо!
Майкл Маркиета