각 다각형에서 꼭짓점 수를 추출 하시겠습니까?


14

ArcGIS Desktop 10.2가 있으며 다음과 같은 모든 기능에 대해 각 다각형에서 여러 정점을 추출하는 방법이 있습니다.

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

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

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

피쳐 클래스에 많은 구획이 있고 모든 피쳐에 대한 꼭지점 수를 개별적으로 추출하고 모든 꼭지점에 대한 XY 좌표를 표시하려고합니다.

자세한 내용은 각 다각형의 정점을 변환하고 1에서 시작하는 각 정점의 숫자를 표시하고 싶습니다. 따라서 다각형이 있고 정점이 4 개인 경우 다각형을 정점으로 변환하려는 경우 다음과 같이 정점의 수를 표시합니다 (1,2,3,4,5) 그런 다음 각 정점에 대해 xy를 표시합니다. 실제 도전 과제는 모든 다각형을 정점으로 변환하고 각 정점 수를 1에서 시작하는 방법입니다.


편집 한 내용에 따라 각 지형지 물에 지형지 물 XY 좌표 마다 고유 한 ID (1 .... n)가 있어야 합니까? [1, 942744.1234, 924654.1234] [2, 952744.1234, 925654.1234] ...와 같이 라벨링 목적으로이 모든 정보를 갖기 위해 하나의 열 / 필드를 원하십니까?
Aaron

예, 실수가 아니라면, 하나의 파일에 다음과 같이 각 다각형의 꼭지점 수에 대한 ID가 있습니다 (1,2,3,4), (1,2,3,4,5), (1,2,3,4, 5,6,), (1,2,3,4,5,6,7,8,9) 등, 그러면 우리가 arctoolbox에서 xy 도구 추가를 호출하면 xy가 쉽다고 생각합니다
GIS Man

답변:


5

아래 코드는 다른 답변을 결합하고 정점에 번호를 매기는 비트를 추가합니다. 결과

import arcpy
arcpy.env.workspace = "in_memory"
#paths
fc = r"...\polygons"
fc_out = r"...\vertices"
arcpy.MakeFeatureLayer_management(fc, "lyr")
# add fields if needed
for FIELD in ["DRAW_ORDER", "COUNT"]:
    if FIELD not in [field.name for field in arcpy.ListFields(fc)]:
        try:
            arcpy.AddField_management("lyr", FIELD, "SHORT")
        except Exception as e:
            print e
# get the number of points minus overlapping (@dmahr - GSE)
arcpy.CalculateField_management("lyr", "COUNT", "!Shape!.pointCount-!Shape!.partCount", "PYTHON")
# dict to iterate and check count
OIDS = {}
for row in arcpy.da.SearchCursor("lyr", ["OBJECTID", "COUNT"]):
    OIDS[row[0]] = row[1]
del row
# get vertices as points and add XY (@Aaron - GSE)
arcpy.FeatureVerticesToPoints_management("lyr", fc_out)
arcpy.AddXY_management(fc_out)
# start adding a number to the points
for OID in OIDS:
    order_count = 1
    rows = arcpy.da.UpdateCursor(fc_out, ["DRAW_ORDER", "COUNT"], "ORIG_FID = %d"%OID)
    for row in rows:
        # will leave the overlapping as NULL
        if order_count <= OIDS[OID]:
            row[0] = order_count
            rows.updateRow(row)
            order_count += 1
##        # this can set the overlapping to 0 or some unique value (999)
##        else:
##            row[0] = 0
##            rows.updateRow(row)

점은 도면 순서로 표시됩니다. 마지막 지점 (첫 번째 지점 아래)에는 레이블이 없으며 재구성에 필요하지 않은 경우 Null 또는 고유 한 "DRAW_ORDER"값을 가진 모든 지점을 선택하여 삭제할 수 있습니다. 정의 쿼리를 사용하여 표시에서 겹치는 지점을 제거 할 수 있습니다.

XY 데이터는 있지만 라벨링 / 표시 요구 사항에 그대로 두겠습니다. 라벨링을위한 XY 필드 추가에 대한 Aaron의 답변을 참조하십시오.

또한 FeatureClass를 사용하여 numpy 배열을 사용하고 있었지만이 작업을 먼저 마쳤습니다.


감사합니다 @ gm70560, 코드 변수를 따라 .py로 저장했지만 실행하려고 할 때 "지정된 필드 이름이 테이블에 존재하지 않습니다"라는 오류 메시지가 나타납니다. ?
GIS Man

여기에 내 PC에서 인쇄 화면이 있습니다. 이미지 사용 방법에 대한 지침을 만들 수있는 경우 대상 기능 클래스 경로 및 새 기능 클래스 출력 경로를 코드로 설정하십시오. imageshack.com/i/ fvsozep
GIS Man

필드를 추가하지 않았습니다 (?). 결과에서 어떤 일이 더 발생 했습니까? 전체 결과를 볼 수있는 대화방이 있습니다 . 방을 확인할 수 있도록 의견을 남겨주세요.
gm70560

22

가장 쉬운 방법은 소포 레이어의 속성 테이블에 새로운 정수 필드를 추가하는 것입니다. 그런 다음 다음 식으로 필드 계산기를 실행하십시오.

!Shape!.pointCount-!Shape!.partCount

!Shape!.pointCount기능에서 정점의 총 수를 반환합니다. 그러나 피처를 닫기 위해 각 파트의 첫 번째 정점이 끝에서 반복됩니다. 이를 처리하려면을 사용하여 각 부품에 대해 하나의 정점을 빼십시오 -!Shape!.partCount.

이 표현식이 작동하려면 Python 파서를 사용해야합니다.

필드 계산기


이것은 정말 멋지지만 각 정점에 XY를 제공하지는 않습니다. 대답은 두 가지 응답 (예 : @ Aaron 's)을 사용하여 요청 된 모든 정보를 얻는 것 같습니다.
Roland

@Roland 당신 말이 맞아 ... XY 정점에 대한 질문의 일부를 놓쳤다. 이 경우 SearchCursorAaron의 답변 또는 Feature Vertices To Points 와 같은 지오 프로세싱 도구 (이 도구에는 ArcGIS for Desktop Advanced 라이센스가 필요하지만) 의 방법 을 사용해야합니다 .
dmahr

대단히 감사합니다 @ dmahr, 나는 단계를 놓친다고 생각합니다. 값을 계산할 때 결과는 꼭짓점의 수입니다. 따라서 5 개의 꼭짓점이있는 구획 피쳐 클래스가있는 경우이 1,2,3과 같이 표시하고 싶습니다 , 4,5 각 정점마다 하나의 숫자로 모든 정점을 계산하지는 않습니다. 실제 문제는 각 구획마다 1 개의 숫자부터 시작하여 각 정점의 번호를 표시하는 방법입니다.
GIS Man

12

dmahr은 정점을 계산하는 좋은 솔루션을 제공했습니다. XY 좌표로 각 포인트에 레이블을 지정하는 비 프로그래밍 방법은 다음 워크 플로우를 시도하십시오.

  1. 피처 정점
  2. 새 포인트 FC "X", "Y"에 두 개의 새 필드 (유형 : double)를 추가하십시오.
  3. 형상을 계산합니다. 마우스 오른쪽 버튼으로 필드> 형상 계산 ...> X 점 좌표 (Y 필드에 대해 반복)
  4. 다른 필드 "XY"추가 (유형 : 텍스트)
  5. 필드 계산기에서 "XY"필드를 계산하십시오. 여기서 XY =

    str (! x!) + ","+ str (! y!)

  6. 라벨 기능. 레이어를 마우스 오른쪽 버튼으로 클릭> 레이블> 레이블 필드 : XY

결과는 다음과 같습니다.

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

또한 프로그램 사용하여 이러한 작업을 수행 할 수 있습니다 explode_to_points으로 검색 커서 (시작 등을).

피쳐를 개별 점 또는 정점으로 분해합니다. explode_to_points가 True로 설정된 경우 예를 들어 5 개의 점이있는 멀티 포인트 피처는 5 개의 행으로 표시됩니다.

(기본값은 False입니다)

arcpy.da.SearchCursor (in_table, field_names, {where_clause}, {spatial_reference}, {explode_to_points}, {sql_clause})

# 정점 수의 기능별 요약을 얻으려면 사후 프로세스가 필요하거나 @ dmahr의 대답을 사용해야합니다.
Roland

4

새로운 필드를 계산하고 싶지 않고 레이어 당 많은 정점을 실제로 빠르게 다시 얻으려면 (웹에 데이터 세트를 노출 할 때와 같은 일반화 목적으로) 사용자 정의 스크립트 도구를 만들 수 있습니다 도구 상자를 작성하거나 코드를 Python 추가 기능으로 노출하십시오.

맞춤 스크립트 도구 코드 :

import arcpy
in_fc = arcpy.GetParameterAsText(0)

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])
arcpy.AddMessage("***************************************")
arcpy.AddMessage("Number of vertices in the layer: {0}".format(count_vertices))
arcpy.AddMessage("***************************************")

Python 애드 인 코드 (정점을 계산하기 위해 TOC에서 레이어를 선택) :

import arcpy
import pythonaddins

arcpy.env.overwriteOutput = True
mxd = arcpy.mapping.MapDocument("current")
in_fc = pythonaddins.GetSelectedTOCLayerOrDataFrame()

features = [feature[0] for feature in arcpy.da.SearchCursor(in_fc,"SHAPE@")]
count_vertices = sum([f.pointCount-f.partCount for f in features])

pythonaddins.MessageBox(count_vertices, 'Number of vertices in {0}'.format(in_fc.name), 0)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.