ArcMap에서 Python 스크립트 내 면적 계산


14

파이썬 스크립트 내에서 다각형의 면적을 계산하려고합니다. 두 개를 병합하여 새 다각형을 만들고 결과 다각형의 영역을 출력 파일의 필드에 추가하고 싶습니다. 다각형은 일반 모양 파일에 저장되어 투영됩니다. 지역은지도 단위로 표시하는 것이 좋습니다.

나는 이것이 매우 일반적이고 간단한 작업이라고 생각했지만 많은 Google 작업에도 불구하고 지금까지 작동하는 솔루션을 찾을 수 없었습니다.

arcpy.updateCursor값이 계산되면 (이 단계에서 FC에 단 하나의 기능 만 있음) 값을 삽입하는 데 사용하려고 계획 했으므로 변수로 반환 할 수 있는지가 가장 쉽습니다. 동일한 작업을 수행하는 다른 솔루션 (영역 값을 올바른 필드로 가져 오기)도 작동합니다.

나는 또한 파이썬에서 필드 계산기를 사용해 보았습니다. 도움말 페이지에서 수정하여 다음과 같이 작동한다고 생각했지만 지금까지는 운이 없습니다.

arcpy.AddField_management(tempPgs, "Shape_area", 'DOUBLE')
exp = "float(!SHAPE.AREA!.split())"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp)

Windows 7에서 Python 2.7과 함께 ArcGIS Basic 10.1 SP1 실행

현재 코드의 관련 부분은 다음과 같습니다.

#/.../
arcpy.Copy_management(inpgs, outpgs)
arcpy.AddField_management(outpgs, 'Shape_area', 'LONG')
fields = AM.FieldLst(outpgs)

#/.../

# Identify and search for shapes smaller than minimum area
where1 = '"' + 'Shape_Area' + '" < ' + str(msz)
polyrows = arcpy.SearchCursor(inpgs, where1)

for prow in polyrows:
    grd1 = prow.GridID   # GridID on the current polygon
    grd2 = nDD.get(grd1) # GridID on the polygon downstream

    # Update features
    if grd2
        geometry1 = prow.Shape
        geometry2 = geometryDictionary[grd2]

        # Update temporary features
        arcpy.Merge_management([geometry1, geometry2], tempMerged)
        arcpy.Dissolve_management(tempMerged, tempPgs)

        fds = AM.FieldLst(tempPgs)

        for field in fields[2:]:
            arcpy.AddField_management(tempPgs, field, 'DOUBLE')

        for fd in fds[2:]:
            arcpy.DeleteField_management(tempPgs, fd)

        exp = "float(!SHAPE.AREA!.split())"
        arcpy.CalculateField_management(tempPgs, "Shape_area", exp)

        # Append them to output FC
        try:
            arcpy.Append_management(tempPgs, outpgs, "TEST")
        except arcgisscripting.ExecuteError:
            arcpy.Append_management(tempPgs, outpgs, "NO_TEST")

    elif ...

    else ...

출력 유형은 무엇입니까? 쉐이프 파일, 파일 지오 데이터베이스, 다른 것? 출력 파일이 투영되거나 투영되지 않습니까?
blord-castillo

또한 코드 샘플, 특히 업데이트에 사용중인 커서를 조금 더 게시 할 수 있습니까? SHAPE@AREA커서의 일부로 영역을 읽을 때 원하는 것을 얻을 수 있습니다. 그러나 코드의 구조는 지역이 작성하려는 것과 동일한 단위인지 여부에 따라 다릅니다.
blord-castillo

답변:


29

arcpy를 사용하여 다각형 영역을 찾아 피쳐 클래스에 저장하는 세 가지 방법이 있습니다. 1) 필드 계산기, 2) "클래식"arcpy 커서 및 3) arcpy.da커서. 이 중 일부는 SearchCursor 사용에 대한 이전 답변 에서 빌려 왔습니다 .


1. 필드 계산기

  • 필드 계산기를 사용할 때 다른 표현식 파서를 사용하는 세 가지 다른 표현식 유형이 있습니다. 이는 필드 계산 지오 프로세싱 도구 의 세 번째 매개 변수에 지정되어 있습니다. 와 같이를 사용하여 Geometry 객체의 속성에 액세스 할 때는 !shape.area!Python 9.3 파서를 사용해야합니다.

  • 이전에 수행 한 식 split()의 결과에 대한 명령을 수행했습니다 !SHAPE.AREA!. 이것은 파이썬 list객체를 반환하는데 , 이것은 객체로 캐스트 될 수 없습니다 float.

  • 표현식에서 @SQUAREKILOMETERS플래그 를 사용하여 리턴 된 영역 SQUAREKILOMETERS의 단위를 필드 계산 도움말 페이지 의 단위로 바꾸어 지정할 수 있습니다 .

이 메소드에 사용할 Python 코드는 다음과 같습니다.

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
exp = "!SHAPE.AREA@SQUAREKILOMETERS!"
arcpy.CalculateField_management(tempPgs, "Shape_area", exp, "PYTHON_9.3")

2. Arc 10.0- "클래식"커서

  • 클래식 커서 (예 arcpy.UpdateCursor:)를 사용하는 경우 커서 객체는 객체를 포함하는 반복 가능 row객체입니다. getValuesetValue메소드 를 사용하여 행에서 지오메트리를 가져와야합니다 ( 지오메트리 객체 로, 면적 값을 row부동 소수점으로 설정).

  • updateRow커서 에서 메소드 를 호출 할 때까지 출력 행은 임시 스크래치 공간에 저장됩니다 . 새 데이터를 실제 데이터 세트에 저장합니다.

이 메소드에 사용할 Python 코드는 다음과 같습니다.

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
geometryField = arcpy.Describe(tempPgs).shapeFieldName #Get name of geometry field
cursor = arcpy.UpdateCursor(tempPgs)
for row in cursor:
    AreaValue = row.getValue(geometryField).area #Read area value as double
    row.setValue("Shape_area",AreaValue) #Write area value to field
    cursor.updateRow(row)
del row, cursor #Clean up cursor objects

3. Arc 10.1-arcpy.da 커서

  • 데이터 액세스 모듈 (예 :)에서 새 커서를 사용하는 arcpy.da.UpdateCursor경우 커서 생성자의 두 번째 매개 변수로 필드 이름 목록을 전달해야합니다. 이를 위해서는 약간의 선행 작업이 필요하지만 결과 row객체는 Python 목록이므로 커서 행을 반복 할 때 데이터를보다 쉽게 ​​읽고 쓸 수 있습니다. 중요하지 않은 필드, 특히 지오메트리를 건너 뛰기 때문에 부분적으로 arcpy.da.UpdateCursor보다 나은 성능을 제공 arcpy.UpdateCursor합니다.

  • 형상을 읽을 때, 당신은 기하 토큰의 숫자 중 하나, 예를 들면 선택할 수 있습니다 SHAPE@TRUECENTROID, SHAPE@AREA또는를 SHAPE@. "간단한"토큰을 사용하면 SHAPE@모든 지오메트리 정보가 포함 된에 비해 성능이 크게 향상됩니다 . 전체 토큰 목록은 arcpy.da.UpdateCursor도움말 페이지에 있습니다.

  • 이전과 같이 updateRow커서 에서 메소드 를 호출 할 때까지 출력 행이 임시 스크래치 공간에 저장됩니다 . 새 데이터를 실제 데이터 세트에 저장합니다.

이 메소드에 사용할 Python 코드는 다음과 같습니다.

tempPgs = "LayerName"
arcpy.AddField_management(tempPgs, "Shape_area", "DOUBLE")
CursorFieldNames = ["SHAPE@AREA","Shape_area"]
cursor = arcpy.da.UpdateCursor(tempPgs,CursorFieldNames)
for row in cursor:
    AreaValue = row[0].area #Read area value as double
    row[1] = AreaValue #Write area value to field
    cursor.updateRow(row)
del row, cursor #Clean up cursor objects

5
훌륭한 답변입니다. 10.2부터는 row[1] = row[0]더 이상 area속성 이 없기 때문에 할 것이라고 말하고 싶었습니다 . with명령문 에서 커서를 컨텍스트 관리자로 사용할 수도 있으며 삭제에 대해 걱정할 필요가 없습니다.
Paul H
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.