ArcPy를 사용하여 shapefile에서 각 다각형의 범위를 구합니까?


20

ArcGIS 10 및 Python에서 쉐이프 파일에있는 각 다각형의 범위 (xmax, ymax, xmin, ymin) 정보를 얻고 싶습니다.

전체 shapefile의 범위를 사용하여 얻을 수 있습니다.

file=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
desc=arcpy.Describe(file)
print desc.extent.Xmax

394551.52085039532

그러나 데이터 세트의 각 행에 대해 동일한 정보를 얻는 방법을 알 수없는 것 같습니다.

rows = arcpy.SearchCursor("100k_trc_tiles_TVM")
for row in rows:
 print row

데이터 세트에서 31 행을 인쇄하지만

for row in rows:
 desc=arcpy.Describe(row)
 print desc.extent.Xmax

오류가 발생합니다.

런타임 오류 : 개체 : 설명 입력 값이 올바른 유형이 아닙니다

"계산 계산"을 사용하여 테이블에 범위 값을 추가하려고 생각했지만 이것은 중심을 제공합니다. 그런 다음 row.GetValue ( "xmax")와 같은 것을 사용할 수 있습니다.

그것은 우리가 http://www.ian-ko.com/free/free_arcgis.htm 의 기능을 사용하여 X / ​​Y, max / min을 만들 수 있다는 것을 알고 있지만 추가하지 않아도되는 것이 가장 좋습니다 필드, 특히 ArcPy가 이러한 값을 얻을 수있는 경우.

기본적으로 분할 도구가 큰 크기의 데이터 세트로 인해 실패하기 때문에 지오 프로세싱을 위해 클립 도구로 피드를 확장하여 지오 프로세싱을위한 30 개 영역의 데이터 (1 : 100,000 맵 시트에 따라)를 가져와야합니다 ( 교차가 제공하는 이유 참조). ERROR 999999 : 유효하지 않은 토폴로지 기능 실행 오류 [너무 많은 lineeg 엔드 포인트]? ). 여러 데이터 세트에서 반복되므로 이것을 자동화하고 싶습니다.

=== 작업 스크립트 ===

# Emulates Arc Info SPLIT tool by using Clip but
# Requires a FC from which each row is used as the input clip feature.
# Each row must be rectangular.
# Used on 12GB FGDB with 100 million records.


#Licence: Creative Commons
#Created by: George Corea; georgec@atgis.com.au, coreagc@gmail.com
import arcpy, string

#inFrame=arcpy.GetParameterAsText(0) # Input dataframe FC
#inFile=arcpy.GetParameterAsText(1) # Input FC for splitting
#outDir=arcpy.GetParameterAsText(2) # Output FGDB

inFrame=r"D:\SCRATCH\ARCGIS\100k_trc_tiles_TVM.shp"
inFile=r"c:\junk\106\data\7_Merge.gdb\FullRez_m2b"
outDir=r"D:\SCRATCH\Projects\206\datasplit\test_slaasp.gdb"
#NameField="Name_1"

#arcpy.env.workspace = r"C:/Workspace"
arcpy.env.overwriteOutput = True

rows = arcpy.SearchCursor(inFrame)
shapeName = arcpy.Describe(inFrame).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    Name = row.Name_1
    print "Executing clip on: "+str(Name)
    extent = feat.extent
    #print extent.XMin,extent.YMin,extent.XMax,extent.YMax
# Create an in_memory polygon
    XMAX = extent.XMax
    XMIN = extent.XMin
    YMAX = extent.YMax
    YMIN = extent.YMin
    pnt1 = arcpy.Point(XMIN, YMIN)
    pnt2 = arcpy.Point(XMIN, YMAX)
    pnt3 = arcpy.Point(XMAX, YMAX)
    pnt4 = arcpy.Point(XMAX, YMIN)
    array = arcpy.Array()
    array.add(pnt1)
    array.add(pnt2)
    array.add(pnt3)
    array.add(pnt4)
    array.add(pnt1)
    polygon = arcpy.Polygon(array)
    ShapeFile = outDir+"\\temp_poly"
    arcpy.CopyFeatures_management(polygon, ShapeFile)

    #print Name
### Set local variables
    in_features = inFile
    clip_features = ShapeFile
    out_feature_class = outDir+"\\"+Name
    xy_tolerance = "0.22"

    # Execute Clip

    try:
        arcpy.Clip_analysis(in_features, clip_features, out_feature_class, xy_tolerance)
        print "Completed: "+str(Name)
    except:
        error = arcpy.GetMessages()
        print "Failed on: "+str(Name)+" due to "+str(error)

2
다각형 = arcpy.Polygon (배열) arcpy.Clip_analysis (in_features, 다각형, out_feature_class, xy_tolerance) : 당신은 디스크에 클립 기능을 작성할 필요가 없습니다, 단지 메모리 다각형, 예를 사용
user2856

tks. 행의 범위가 아닌 행을 새로운 모양 파일로 내 보내서 사용할 수있는 방법을 알고 있습니까? 직사각형이 아닌 클립도 처리 할 수 ​​있습니다.
GeorgeC

1
동일한 스크립트에서 해당 기능을 기준으로 클립하려면 기능 개체를 사용하십시오. 다시 말하지만, 모양 파일, 예를 들어 수출 할 필요가 없습니다 : arcpy.Clip_analysis (in_features, 공적, out_feature_class, xy_tolerance)
user2856

shapefile 또는 shapefile의 각 다각형에 대해? 여기서 두 가지 다른 것에 대해 이야기하고있는 것 같습니다.
Rayner

shapefile에 다각형 객체가 하나만 있습니까? 그렇지 않은 경우 객체 범위에 for 루프를 사용하십시오.
Aragon

답변:


26

커서에서 모양 객체를 가져와 범위 속성에 액세스합니다. Python에서 지오메트리 작업 ArcGIS 도움말을 참조하십시오 .

shapeName = arcpy.Describe(inFeatures).shapeFieldName
for row in rows:
    feat = row.getValue(shapeName)
    extent = feat.extent
    print extent.XMin,extent.YMin,extent.XMax,extent.YMax

1
고마워 루크 이것은 훌륭하게 작동했습니다. 누구든지 도구를 사용하려면 새 작업 코드를 갖도록 질문을 편집하겠습니다.-클립 도구 세트를 반복적으로 사용하여 큰 피쳐 클래스의 직사각형 영역을 잘라냅니다. 최대 10GB FGDB 및 1 억 레코드의 데이터 세트와 충돌하지 않고 arc info Split 도구의 기능을 에뮬레이트합니다.
GeorgeC

한 가지-name 속성을 다음과 같이 시도하여 Name = row.Name_1에 해당하는 열 이름을 하드 코딩해야했습니다. NameField = "Name_1"; 이름 = row.NameField; 또는 Name = row + "."+ NameField 여기서 NameField = arcpy.GetParameterAsText (2)이고 이름은 Name_1 열에 있습니다. 어떤 아이디어? 참고; ";"를 사용했습니다 새 줄을 나타냅니다.
GeorgeC

1
row.GetValue (XXX)에서 - 상기 냈 gis.stackexchange.com/questions/16586/...
GeorgeC

7

경계 컨테이너 도구 세트는 당신이 원하는 것을 정확히 않습니다. 코드 스 니펫을 원할 경우 스크립트 내에서 함수를 검사하면 범위를 명시 적으로 처리합니다.

편집하다

스크립트가 생성 된 출력 파일의 왼쪽, 오른쪽, 위쪽 및 아래쪽 필드에 값을 추가하여 후속 처리에 사용할 수 있음을 추가해야합니다.


감사. 확인하겠습니다. 바라건대 파이썬 스크립트 / 모델 내에서 코드를 사용할 수 있기를 바랍니다.
GeorgeC

2

방금 ArcGIS 10에서 최소 경계 지오메트리 (봉투) (데이터 관리에서)를 시도했는데 모든 필드에 대해 정확히 동일한 것으로 보입니다.


1

다른 방법은 shapefile에서 SearchCursor ()를 수행하는 것입니다. 그러면 row.shape.extent를 사용할 수 있습니다.

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...

1

ArcMap에서 다각형 꼭짓점의 좌표 추출 에서 다루었 습니까? 다각형의 꼭짓점을 얻은 다음 각 꼭짓점의 x 및 y 좌표를 속성 테이블의 필드로 추가 할 수 있습니다. 이것은 최대 / 최소 좌표를 각 다각형에 직접 연결하지 않는 데 한계가 있지만 몇 가지 방법으로 달성 할 수 있습니다.

내가 가장 친숙한 방법은 pyshp 모듈을 사용하여 x 및 y 필드를 파이썬 목록으로 읽는 다음 각 다각형의 최대 값과 최소값을 찾기 위해 정렬 할 수 있습니다. 그런 다음 Pyshp를 사용하여 기록기 클래스를 열어 원래 다각형에 새 필드를 추가하고이 최대 값과 최소값을 올바른 다각형에 쓸 수 있습니다.

나는 이것이 arcpy를 사용하여 수행 할 수 있다고 생각하지만 지오 프로세서를 사용하여 9.3에서 shapefile에 쓰는 데 많은 문제가 있었으므로 pyshp 방법을 선호하지만 arcpy 모듈이 이러한 문제를 해결했는지 확실하지 않습니다.


0

"XMax"에서 "M"을 대문자로 사용해 보셨습니까? 나는 그것이 있어야한다고 생각합니다 :

print desc.extent.XMax

대신에

print desc.extent.Xmax

설명서 에 따라 . 물론 첫 번째 코드 스 니펫이 어떻게 작동했는지 궁금합니다. 어느 쪽이든, 기회를 줘!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.