Memperoleh sejauh mana setiap poligon di shapefile menggunakan ArcPy?

20

Dalam ArcGIS 10 dan Python saya ingin mendapatkan info (xmax, ymax, xmin, ymin) dari masing-masing poligon dalam sebuah shapefile.

Saya bisa mendapatkan sejauh mana seluruh shapefile menggunakan

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

394551.52085039532

Tapi sepertinya saya tidak tahu cara mendapatkan info yang sama untuk setiap baris dalam dataset.

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

mencetak 31 baris dalam dataset tetapi

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

memberikan kesalahan.

Runtime error: Object: Menggambarkan nilai input bukan tipe yang valid

Saya sedang berpikir untuk menambahkan nilai-nilai luas ke tabel menggunakan "menghitung geometri" tetapi ini hanya memberikan centroid. Maka saya kira kita bisa menggunakan sesuatu seperti row.GetValue ("xmax").

Itu dikatakan saya tahu bahwa kita dapat membuat X / Y, maks / mnt menggunakan fungsi dari http://www.ian-ko.com/free/free_arcgis.htm tetapi akan lebih baik jika kita dapat menghindari keharusan menambahkan bidang, terutama jika ArcPy bisa mendapatkan nilai-nilai ini.

Pada dasarnya saya perlu mendapatkan luasan untuk dimasukkan ke alat klip untuk menghapus 30 bidang data (sesuai dengan 1: 100.000 lembar peta) untuk geoproses karena alat Split gagal karena ukuran besar dataset (lihat Mengapa Intersect memberikan GALAT 999999: Fungsi pengeksekusi kesalahan Topologi Tidak Valid [Terlalu banyak baris dan titik akhir]? ). Saya ingin mengotomatiskan ini karena diulang pada sejumlah dataset.

=== skrip yang berfungsi ===

# 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; [email protected], [email protected]
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)
GeorgeC
sumber
2
Anda tidak perlu menulis fitur klip ke disk, cukup gunakan dalam poligon memori, misalnya: poligon = arcpy.Poligon (array) arcpy.Clip_analysis (in_features, polygon, out_feature_class, xy_tolerance)
user2856
tks. Adakah yang bisa saya ekspor baris ke file bentuk baru sehingga digunakan, bukan hanya sejauh baris? Ini agar dapat menangani klip non-persegi panjang juga.
GeorgeC
1
Nah jika Anda hanya ingin klip dengan fitur itu, dalam skrip yang sama, cukup gunakan objek fitur. Sekali lagi, tidak perlu mengekspor ke file bentuk, misalnya: arcpy.Clip_analysis (in_features, feat, out_feature_class, xy_tolerance)
user2856
Untuk shapefile atau untuk setiap poligon di shapefile? Sepertinya Anda berbicara tentang dua hal terpisah di sini.
Rayner
Apakah hanya ada satu objek poligon di shapefile Anda? jika tidak, gunakan untuk loop sejauh objek Anda.
Aragon

Jawaban:

26

Dapatkan objek bentuk di kursor Anda dan akses properti luasnya. Lihat Bantuan ArcGIS Bekerja dengan geometri dengan 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
pengguna2856
sumber
1
Terima kasih Luke. Ini bekerja dengan baik. Saya akan mengedit pertanyaan saya untuk memiliki kode kerja baru jika ada yang ingin menggunakan alat yang - Menggunakan Clip toolset secara itieratif untuk memotong daerah persegi panjang dari kelas fitur besar. Mengemulasi fungsionalitas alat Split info arc tanpa menabrak dataset setinggi 10GB FGDB dan 100 juta catatan.
GeorgeC
Satu hal - saya harus menuliskan kode nama kolom untuk mendapatkan yang setara dengan Name = row.Name_1 dengan mencoba atribut nama sebagai; NameField = "Name_1"; Name = row.NameField; atau Name = row + "." + NameField di mana NameField = arcpy.GetParameterAsText (2) dan Name disimpan di kolom Name_1. Ada ide? Catatan I; ve used ";" untuk menunjukkan baris baru.
GeorgeC
1
menemukan yang di atas - baris. Dapatkan Nilai (xxx) dari gis.stackexchange.com/questions/16586/…
GeorgeC
7

The Batas Kontainer toolset tidak persis apa yang Anda inginkan. Jika Anda hanya ingin potongan kode, periksa fungsi-fungsi di dalam skrip, satu berurusan secara eksplisit dengan luasnya.

EDIT

Saya harus menambahkan bahwa skrip akan menambahkan nilai ke bidang Kiri, Kanan, Atas dan Bawah dalam file output yang dibuat yang dapat digunakan untuk pemrosesan selanjutnya


sumber
Terima kasih. Akan memeriksanya. Semoga saya bisa menggunakan kode dalam skrip / model python saya.
GeorgeC
2

Saya baru saja mencoba Geometri Batas Minimum (Amplop) (dalam Manajemen Data) di ArcGIS 10 dan tampaknya melakukan hal yang persis sama, untuk semua bidang.

Sid
sumber
1

Cara lain adalah dengan melakukan SearchCursor () pada shapefile, maka Anda dapat menggunakan row.shape.extent:

rows = arcpy.SearchCursor(shapefileName)

for row in rows:
   extent = row.shape.extent
   ...
   ...
Ruth
sumber
1

Seperti yang tercakup dalam Ekstraksi koordinat titik poligon di ArcMap? Anda bisa mendapatkan simpul dari poligon dan kemudian menambahkan koordinat x dan y dari setiap simpul sebagai bidang dalam tabel atribut. Ini memiliki batasan tidak melampirkan koordinat max / min langsung ke setiap poligon tetapi ini dapat dicapai dalam beberapa cara.

Metode yang paling saya kenal adalah membaca bidang x dan y ke dalam daftar python menggunakan modul pyshp , yang kemudian dapat disortir untuk menemukan nilai maksimum dan minimum untuk setiap poligon. Pyshp kemudian dapat digunakan untuk membuka kelas penulis untuk menambahkan bidang baru ke poligon asli dan menulis nilai-nilai max dan min ini ke poligon yang benar.

Saya percaya ini bisa dilakukan menggunakan arcpy, tapi saya punya banyak masalah dengan menulis ke shapefile di 9.3 menggunakan geoprocessor, jadi saya lebih suka metode pyshp, namun saya tidak yakin apakah modul arcpy telah menyelesaikan masalah ini.

sgrieve
sumber
0

Apakah Anda mencoba menggunakan huruf kapital "M" di "XMax"? Saya pikir itu seharusnya:

print desc.extent.XMax

dari pada

print desc.extent.Xmax

sesuai dengan dokumentasi . Tentu saja itu membuat saya bertanya-tanya bagaimana cuplikan kode pertama Anda bekerja. Apa pun itu, cobalah!

dmahr
sumber