ArcPy kullanarak şekil dosyasındaki her çokgenin kapsamı alınıyor mu?


20

ArcGIS 10 ve Python'da bir şekil dosyasındaki çokgenlerin her birinin boyut (xmax, ymax, xmin, ymin) bilgisini almak istiyorum.

Tüm şekil dosyasının kapsamını kullanarak

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

394.551,52085039532

Ancak veri kümesindeki her satır için aynı bilgileri nasıl alacağımı anlayamıyorum.

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

veri kümesindeki 31 satırı yazdırır ancak

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

hata veriyor.

Çalışma zamanı hatası: Nesne: Giriş değerini tanımla geçerli değil türü

Ben "geometri hesaplamak" kullanarak tabloya kapsam değerleri eklemeyi düşünüyordum ama bu sadece centroid verir. Sonra sanırım row.GetValue ("xmax") gibi bir şey kullanabiliriz.

Http://www.ian-ko.com/free/free_arcgis.htm işlevini kullanarak X / Y, max / min oluşturabileceğimizi biliyorum ancak eklemek zorunda kalmamak en iyisi özellikle ArcPy bu değerleri alabilirse.

Temelde bölme aracı veri kümesinin büyük boyutu nedeniyle başarısız olduğu için coğrafi işlem için 30 veri alanını (1: 100.000 harita sayfasına göre) kırpmak için klip aracına beslenecek uzantıları almam gerekiyor (bkz. Neden Kesişim HATA 999999: İşlev yürütülürken hata oluştu Geçersiz Topoloji [Çok fazla lineseg uç noktası]? ). Bir dizi veri kümesinde tekrarlandığı için bunu otomatikleştirmek istiyorum.

=== çalışma betiği ===

# 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
Klip özelliğini diske yazmanız gerekmez, sadece bellek çokgenini kullanın, örneğin: polygon = arcpy.Polygon (dizi) arcpy.Clip_analysis (in_features, çokgen, out_feature_class, xy_tolerance)
user2856

tks. Herhangi bir fikir nasıl satır yerine sadece kullanılan, yeni bir şekil dosyasına verebilirsiniz? Bu, dikdörtgen olmayan klipleri de işleyebilmesi içindir.
GeorgeC

1
Sadece bu özelliğe göre kırpmak istiyorsanız, aynı komut dosyasında, özellik nesnesini kullanın. Yine, şekil dosyasına aktarmaya gerek yok, örneğin: arcpy.Clip_analysis (in_features, feat, out_feature_class, xy_tolerance)
user2856 10:11

Bir şekil dosyası için mi yoksa şekil dosyasındaki her çokgen için mi? Burada iki ayrı şeyden bahsediyorsunuz.
Rayner

şekil dosyanızda yalnızca bir çokgen nesnesi var mı? değilse, nesneleriniz için döngü için kullanın.
Aragon

Yanıtlar:


26

Şekil nesnesini imlecinize getirin ve scope özelliğine erişin. Bkz. ArcGIS Yardım Python'da geometriyle çalışma :

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
Teşekkürler Luke. Bu harika çalıştı. Kimse bir araç kullanmak isterse yeni çalışma koduna sahip olmak için sorumu düzenleyeceğim - Bir büyük özellik sınıfının dikdörtgen bölgelerini kırpmak için Klip araç setini iteratif olarak kullanır. Yay bilgisinin bölünmesi aracının işlevselliğini taklit eder 10GB FGDB ve 100 milyon kayıt gibi veri kümeleriyle kilitlenmeden.
GeorgeC

Bir şey - name = row.Name_1 eşdeğerini ad özniteliğini deneyerek elde etmek için sütunun adını sabit kodlamak zorunda kaldı; NameField = "Ad_1"; Name = row.NameField; veya Name = row + "." + NameField = burada NameField = arcpy.GetParameterAsText (2) ve Name Name_1 sütununda tutulur. Herhangi bir fikir? Not I; ";" yeni bir hat göstermek için.
GeorgeC

1
yukarıdakileri hesapladı
g..stackexchange.com

7

Sınırlayıcı Konteyner araç seti tam olarak ne istediğinizi yapar. Sadece kod snippet'leri istiyorsanız, komut dosyalarındaki işlevleri inceleyin, biri açıkça kapsamlıdır.

DÜZENLE

Betiğin, sonraki işlem için kullanılabilecek oluşturulan çıktı dosyasındaki Sol, Sağ, Üst ve Alt alana değerler ekleyeceğini eklemeliyim


Teşekkürler. Kontrol edecek. Umarım kodu python betiklerim / modellerimde kullanabilirim.
GeorgeC

2

ArcGIS 10'da Minimum Sınırlayıcı Geometri'yi (Zarf) (Veri Yönetiminde) denedim ve tüm alanlar için aynı şeyi yapıyor gibi görünüyor.


1

Başka bir yol şekil dosyasında bir SearchCursor () yapmak olabilir, o zaman row.shape.extent kullanabilirsiniz:

rows = arcpy.SearchCursor(shapefileName)

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

1

Kaplı gibi ArcMap'te poligon köşe koordinatları elde? bir çokgenin köşelerini alabilir ve ardından her bir tepe noktasının x ve y koordinatlarını öznitelik tablosundaki alanlar olarak ekleyebilirsiniz. Bunun, max / min koordinatlarını doğrudan her çokgene bağlamama sınırlaması vardır, ancak bu birkaç yolla gerçekleştirilebilir.

En çok aşina olduğum yöntem pyshp modülünü kullanarak x ve y alanlarını python listelerine okumaktır , bu daha sonra her çokgen için maksimum ve minimum değerleri bulmak üzere sıralanabilir. Pyshp daha sonra orijinal çokgenlere yeni alanlar eklemek ve bu max ve min değerlerini doğru çokgene yazmak için bir yazar sınıfı açmak için kullanılabilir.

Bunun arcpy kullanılarak yapılabileceğine inanıyorum, ancak geoprocessor kullanarak 9.3'te şekil dosyalarına yazma ile ilgili çok fazla sorun yaşadım, bu yüzden pyshp yöntemini tercih ediyorum, ancak arcpy modülü bu sorunları çözüp çözmediğinden emin değilim.


0

"XMax" içindeki "M" harfini büyük yazmayı denediniz mi? Bence olması gerekiyordu:

print desc.extent.XMax

onun yerine

print desc.extent.Xmax

belgelere göre . Tabii ki bu bana ilk kod snippet'inizin nasıl çalıştığını merak ediyor. Her iki durumda da, denemek!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.