Створіть біля таблиці таблицю для x кількості сусідів, використовуючи arcpy


9

Є три вірогідні сценарні фільми, які я намагаюся зробити на відстані:

  1. Станція метро на розв'язці, яка має 2 або більше сусідніх станцій. Тобто станція, про яку йдеться, з'єднує 2 або більше основних маршрутів і має 2 або більше сусідніх станцій.
  2. Термінальна станція метро, ​​яка має лише 1 сусідню станцію. Це станція в кінці лінії.
  3. Станція метро в метро, ​​яка має рівно дві сусідні станції, одна з будь-яких підходів.

Я намагаюся обчислити значення, яке можна назвати "середня відстань між сусідніми станціями"

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

Хтось має розумний метод вирішення цих сценаріїв? Зауважте, що кожна станція позначена як "Обмін", "Термінал" або "Вбудований" у таблиці атрибутів під полем "Тип станції".

Додано:

Ось якийсь код 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 (за його швидкість). Я сподіваюся, що ми можемо цим скористатися.
Michael Markieta

3
FWIW - це суто теоретично задана графа зі стандартним рішенням: ви шукаєте графік сусідства кожної вершини. Він доступний майже одразу, як тільки ви представляєте мережу у стандартному форматі, наприклад, 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 стовпців у першому рядку, де значення дорівнює 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 можна використовувати лише для особливостей декартової площини, тому цей метод не працюватиме, якщо ваші дані знаходяться в географічних координатах.
Сайрус

Ця відповідь говорить про неоднозначність, як можна зрозуміти питання. Я прочитав питання про те, що вказані відстані відомі; їх обчислення, здається, не є проблемою. Я вважаю, що ОП прагне, це алгоритм ідентифікації змінної кількості безпосередніх сусідів вершин по мережі, щоб в кінці потім отримати їх відстані та обчислити їх статистичний підсумок (наприклад, середнє значення).
whuber

@whuber На жаль! Погодився, я занадто поспішно відповів на питання.
Сайрус

@whuber на марці.
hhart

Це не працює для мене, але дякую!
Майкл Маркієта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.