Thu được phạm vi của mỗi đa giác trong shapefile bằng ArcPy?


20

Trong ArcGIS 10 và Python tôi muốn lấy thông tin mức độ (xmax, ymax, xmin, ymin) của từng đa giác trong một shapefile.

Tôi có thể nhận được mức độ của toàn bộ shapefile bằng cách sử dụng

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

394551.52085039532

Nhưng tôi dường như không thể tìm ra làm thế nào để có được thông tin tương tự cho mỗi hàng trong bộ dữ liệu.

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

in 31 hàng trong tập dữ liệu nhưng

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

đưa ra một lỗi.

Lỗi thời gian chạy: Đối tượng: Mô tả giá trị đầu vào không phải là loại hợp lệ

Tôi đã nghĩ đến việc thêm các giá trị phạm vi vào bảng bằng cách sử dụng "tính toán hình học" nhưng điều này chỉ mang lại trọng tâm. Sau đó, tôi đoán chúng ta có thể sử dụng một cái gì đó như row.GetValue ("xmax").

Điều đó đang được nói tôi biết rằng chúng ta có thể tạo X / Y, tối đa / phút bằng cách sử dụng chức năng từ http://www.ian-ko.com/free/free_arcgis.htmlm nhưng sẽ tốt nhất nếu chúng ta có thể tránh phải thêm các trường, đặc biệt là nếu ArcPy có thể nhận được các giá trị này.

Về cơ bản, tôi cần lấy các phạm vi để cung cấp cho công cụ clip để cắt ra 30 vùng dữ liệu (theo tờ bản đồ 1: 100.000) để xử lý địa lý do công cụ Split không thành công do kích thước lớn của bộ dữ liệu (xem Tại sao Intersect đưa ra LRI 999999: Chức năng thực thi lỗi Cấu trúc liên kết không hợp lệ [Quá nhiều điểm cuối dòng]? ). Tôi muốn tự động hóa điều này vì nó được lặp lại trên một số bộ dữ liệu.

=== kịch bản làm việc ===

# 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
Bạn không cần phải ghi tính năng clip vào đĩa, chỉ cần sử dụng đa giác trong bộ nhớ, ví dụ: polygon = arcpy.Polygon (mảng) arcpy.Clip_analysis (in_features, polygon, out_feature_ class, xy_tolerance)
user2856

tks. Bất kỳ ý tưởng làm thế nào tôi có thể xuất hàng sang một tệp hình dạng mới để nó được sử dụng, thay vì chỉ phạm vi của hàng? Điều này là để nó có thể xử lý các clip không phải hình chữ nhật là tốt.
GeorgeC

1
Chà, nếu bạn chỉ muốn cắt theo tính năng đó, trong cùng một kịch bản, chỉ cần sử dụng đối tượng tính năng. Một lần nữa, không cần xuất để định hình tệp, ví dụ: arcpy.Clip_analysis (in_features, feat, out_feature_ class, xy_tolerance)
user2856

Cho một shapefile hoặc cho mỗi đa giác trong một shapefile? Có vẻ như bạn đang nói về hai điều riêng biệt ở đây.
Rayner

chỉ có một đối tượng đa giác trong shapefile của bạn? nếu không, sử dụng vòng lặp cho phạm vi đối tượng của bạn.
Aragon

Câu trả lời:


26

Lấy đối tượng hình dạng trong con trỏ của bạn và truy cập thuộc tính phạm vi của nó. Xem Trợ giúp ArcGIS Làm việc với hình học trong Python :

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
Cảm ơn Luke. Điều này đã làm việc tuyệt vời. Tôi sẽ chỉnh sửa câu hỏi của mình để có mã làm việc mới nếu có ai muốn sử dụng một công cụ - Sử dụng bộ công cụ Clip một cách chính xác để cắt các vùng hình chữ nhật của một lớp đối tượng lớn. Mô phỏng chức năng của công cụ phân chia thông tin vòng cung mà không gặp sự cố với bộ dữ liệu lớn như 10GB FGDB và 100 triệu bản ghi.
GeorgeC

Một điều - tôi đã phải mã hóa tên của cột để có được tên tương đương với Name = row.Name_1 bằng cách thử thuộc tính name như; NameField = "Name_1"; Tên = hàng.NameField; hoặc Name = row + "." + NameField trong đó NameField = arcpy.GetParameterAsText (2) và Tên được giữ trong cột Name_1. Có ý kiến ​​gì không? Lưu ý I; đã sử dụng ";" để biểu thị một dòng mới.
GeorgeC

1
đã tìm ra ở trên - hàng.GetValue (xxx) từ gis.stackexchange.com/questions/16586/ trộm
GeorgeC

7

Bộ công cụ Bounding Container thực hiện chính xác những gì bạn muốn. Nếu bạn chỉ muốn đoạn mã, kiểm tra các chức năng trong các tập lệnh, một giao dịch rõ ràng với mức độ.

CHỈNH SỬA

Tôi nên thêm rằng tập lệnh sẽ thêm các giá trị vào trường Trái, Phải, Trên và Dưới trong tệp đầu ra đã tạo có thể được sử dụng để xử lý tiếp theo


cảm ơn. Sẽ kiểm tra xem nó ra. Hy vọng rằng tôi có thể sử dụng mã trong các tập lệnh / mô hình python của mình.
GeorgeC

2

Tôi vừa thử Hình học giới hạn tối thiểu (Phong bì) (trong Quản lý dữ liệu) trong ArcGIS 10 và dường như nó thực hiện giống hệt nhau, cho tất cả các trường.


1

Một cách khác là thực hiện SearchCoder () trên shapefile, sau đó bạn có thể sử dụng row.shape.extent:

rows = arcpy.SearchCursor(shapefileName)

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

1

Như được đề cập trong Trích xuất tọa độ của các đỉnh đa giác trong ArcMap? bạn có thể nhận được các đỉnh của một đa giác và sau đó thêm tọa độ x và y của mỗi đỉnh dưới dạng các trường trong bảng thuộc tính. Điều này có giới hạn là không gắn trực tiếp tọa độ tối đa / phút vào mỗi đa giác nhưng điều này có thể đạt được theo một số cách.

Phương pháp tôi quen thuộc nhất là đọc các trường x và y vào danh sách python bằng mô-đun pyshp , sau đó có thể được sắp xếp để tìm giá trị tối đa và tối thiểu cho mỗi đa giác. Pyshp sau đó có thể được sử dụng để mở một lớp nhà văn để thêm các trường mới vào đa giác ban đầu và viết các giá trị tối đa và tối thiểu này vào đa giác chính xác.

Tôi tin rằng điều này có thể được thực hiện bằng cách sử dụng arcpy, nhưng tôi đã gặp nhiều vấn đề với việc viết vào shapefile trong 9.3 bằng cách sử dụng công cụ địa lý, vì vậy tôi thích phương pháp pyshp, tuy nhiên tôi không chắc liệu mô-đun arcpy có giải quyết được các vấn đề này không.


0

Bạn đã thử viết hoa chữ "M" trong "XMax" chưa? Tôi nghĩ rằng nó được cho là:

print desc.extent.XMax

thay vì

print desc.extent.Xmax

theo tài liệu . Tất nhiên điều đó khiến tôi tự hỏi làm thế nào đoạn mã đầu tiên của bạn hoạt động. Dù bằng cách nào, hãy cho nó một shot!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.