arcpy를 사용하여 x 수의 이웃에 대한 근거리 테이블 생성


9

근거리에서 가까운 거리에서 캡처하려고하는 장면이 3 가지 있습니다.

  1. 2 개 이상의 인접 스테이션이있는 인터체인지 지하철 스테이션. 즉, 해당 스테이션은 2 개 이상의 주요 경로를 연결하고 2 개 이상의 인접 스테이션을 가지고 있습니다.
  2. 인접 역이 1 개 밖에없는 터미널 지하철역. 이것은 선의 끝에있는 역입니다.
  3. 인라인 지하철 역으로, 정확히 2 개의 인접 역이 있으며, 둘 중 하나의 접근 방식입니다.

"인접 스테이션 사이의 평균 거리"라고 부르는 값을 계산하려고합니다.

arcpy.GenerateNearTable_analysis()모든 기능 사이에 가장 가까운 기능으로 거리 및 거리 : 두 가지 옵션을 처리 할 수 있습니다.

이 시나리오를 해결하는 영리한 방법이 있습니까? 각 스테이션은 "StationType"필드 아래의 속성 테이블에서 "교환", "터미널"또는 "인라인"으로 지정됩니다.

추가 :

다음은 주석에서 @ 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가 제안한 것처럼 Adjacency Matrix 에서 가장 잘 표현 될 것이라고 귀하의 문제를 믿습니다 . 즉, 당신을 위해 일을하기 위해 꾸러미에 의존하기보다는 그 배후의 이론을 이해할 시간과 성향이 있다면.

정점으로 지정된 그래프 G에 대해서는 {V 1 , V 2 , ..., V의 N } n이 정점의 수이고,는 크기 M의 행렬 만들어야 I, J 여기서 I = N이고, J =을 엔. 그런 다음 각 정점은 i 번째 행에서 j 번째 열의 인접한 정점에있는 경로 수로 표시됩니다.

아래 예 :

여기에 이미지 설명을 입력하십시오

비교적 간단한 데이터를 나타내는 이처럼 복잡한 형태를 감안할 때 논리적 순서를 나타내지 않고 임의의 방식으로 정점에 번호를 매겨 야합니다.

참고 : 스테이션 루프 자체가 없다고 가정하면 k 번째 행에는 k 번째 열에 0 이외의 값이 없습니다 . 아래의 모든 정의는 이것이 사실이라고 가정합니다.

참고 : 동일한 스테이션 사이에 동시 회선이 없다고 가정하면 아래의 모든 예에서는 셀 값이 1 또는 0 일 뿐이라고 가정합니다. 위의 예에서는 양방향 이동이 허용된다고 가정합니다.

스테이션 범주를 식별하기위한 규칙 :

1. 터미널

터미널은 값이 0이고 값이 1 인 단일 열을 갖는 k 번째 행 으로 식별됩니다 . 위의 예 1의 정점 1, 2 및 3을 참조하십시오.

2. 접합

접합은 값 1을 포함하는 두 개 이상의 열이 있는 k 번째 행 으로 식별됩니다. 위의 예 1의 정점 4, 위의 예 3의 모든 정점을 참조하십시오.

3. 인라인

인라인 스테이션은 값이 1 인 k 번째 행 에 정확히 2 개의 열이 있음을 나타냅니다 . 위의 예 2의 모든 정점을 참조하십시오. {v 1 , v 3 }이 {v 2 , v 4 } 와 교차 한다는 사실을 무시하십시오 .


당신은 누구이며 어디에서 왔습니까! 그것은 내가 오랫동안받은 최고의 답변 중 하나였습니다. @Geoist 감사합니다.
Michael Markieta

@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

트윗 담아 가기 동의했다. 나는 그 질문에 너무 성급하게 대답했다.
Cyrus

@whuber가 마크에 있습니다.
hhart

이것은 나를 위해 작동하지 않지만 감사합니다!
마이클 마키에 타
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.