Сгенерировать таблицу рядом для количества соседей х, используя 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 }.)


Кто ты и откуда ты пришел! Это был один из лучших ответов, которые я получил за долгое время. Спасибо @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

Это не будет работать для меня, но спасибо!
Майкл Маркиета
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.