การรับขอบเขตของรูปหลายเหลี่ยมแต่ละรูปใน Shapefile โดยใช้ ArcPy


20

ใน ArcGIS 10 และ Python ฉันต้องการได้รับข้อมูลขอบเขต (xmax, ymax, xmin, ymin) ของรูปหลายเหลี่ยมแต่ละรูปในรูปแบบไฟล์

ฉันสามารถใช้ขนาดไฟล์ทั้งหมดได้

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

394,551.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

ให้ข้อผิดพลาด

ข้อผิดพลาดรันไทม์: วัตถุ: อธิบายค่าอินพุตไม่ใช่ประเภทที่ถูกต้อง

ฉันคิดที่จะเพิ่มค่าขอบเขตลงในตารางโดยใช้ "คำนวณเรขาคณิต" แต่นี่จะให้เซนทรอยด์เท่านั้น จากนั้นฉันเดาว่าเราสามารถใช้บางอย่างเช่นแถว GetValue ("xmax")

ที่ถูกกล่าวว่าฉันรู้ว่าเราสามารถสร้าง X / Y, สูงสุด / นาทีโดยใช้ฟังก์ชั่นจากhttp://www.ian-ko.com/free/free_arcgis.htmแต่มันจะดีที่สุดถ้าเราสามารถหลีกเลี่ยงการเพิ่ม เขตข้อมูลโดยเฉพาะอย่างยิ่งถ้า ArcPy สามารถรับค่าเหล่านี้

โดยทั่วไปฉันต้องการให้ extents ป้อนเข้าไปใน clip tool เพื่อตัดข้อมูล 30 ส่วน (ตามแผนที่ 1: 100,000 แผ่น) สำหรับการประมวลผลทางภูมิศาสตร์เนื่องจากเครื่องมือ Split ล้มเหลวเนื่องจากชุดข้อมูลมีขนาดใหญ่ (ดูทำไม Intersect ให้ ข้อผิดพลาด 999999: ข้อผิดพลาดในการใช้งานฟังก์ชั่นโทโพโลยีไม่ถูกต้อง [จุดปลายทาง Lineseg มากเกินไป? ) ฉันต้องการทำให้เป็นแบบอัตโนมัติเนื่องจากมันถูกทำซ้ำกับชุดข้อมูลจำนวนหนึ่ง

=== สคริปต์ทำงาน ===

# 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
คุณไม่จำเป็นต้องเขียนคุณสมบัติคลิปลงในดิสก์เพียงใช้รูปหลายเหลี่ยมในหน่วยความจำเช่น: polygon = arcpy.Polygon (อาร์เรย์) arcpy.Clip_analysis (in_features, polygon, out_feature_class, xy_tolerance)
2856

TKS ความคิดใด ๆ ที่ฉันสามารถส่งออกแถวไปยังไฟล์รูปร่างใหม่เพื่อที่จะใช้มากกว่าแค่ขอบเขตของแถว นี่คือเพื่อให้สามารถจัดการกับคลิปที่ไม่ใช่สี่เหลี่ยมเช่นกัน
GeorgeC

1
ถ้าคุณเพียงต้องการที่จะตัดทอนคุณสมบัตินั้นในสคริปต์เดียวกันให้ใช้คุณลักษณะวัตถุ อีกครั้งไม่จำเป็นต้องส่งออกไปยังไฟล์รูปร่างเช่น: arcpy.Clip_analysis (in_features, feat, out_feature_class, xy_tolerance)
2856

สำหรับ Shapefile หรือสำหรับแต่ละรูปหลายเหลี่ยมใน Shapefile ดูเหมือนว่าคุณกำลังพูดถึงสองสิ่งที่แยกจากกันที่นี่
Rayner

มีวัตถุรูปหลายเหลี่ยมเดียวเท่านั้นในไฟล์รูปร่างของคุณหรือไม่ ถ้าไม่ใช้สำหรับลูปสำหรับขอบเขตวัตถุของคุณ
Aragon

คำตอบ:


26

รับรูปร่างวัตถุในเคอร์เซอร์ของคุณและเข้าถึงคุณสมบัติขอบเขต ดูวิธีใช้ ArcGIS กับเรขาคณิตใน 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
ขอบคุณลุค มันใช้งานได้ดีมาก ฉันจะแก้ไขคำถามของฉันเพื่อให้มีรหัสการทำงานใหม่หากใครต้องการใช้เครื่องมือที่ - ใช้ชุดเครื่องมือคลิปอย่างซ้ำ ๆ เพื่อตัดพื้นที่สี่เหลี่ยมของคลาสคุณลักษณะขนาดใหญ่ จำลองฟังก์ชันการทำงานของเครื่องมืออาร์คข้อมูลแยกโดยไม่ชนกับชุดข้อมูลที่มีขนาดใหญ่ถึง 10GB FGDB และ 100 ล้านเรคคอร์ด
GeorgeC

สิ่งหนึ่ง - ฉันต้องฮาร์ดโค้ดชื่อของคอลัมน์เพื่อให้ได้ชื่อเทียบเท่า = 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

อีกวิธีหนึ่งในการทำ SearchCursor () บน Shapefile จากนั้นคุณสามารถใช้ row.shape.extent:

rows = arcpy.SearchCursor(shapefileName)

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

1

ครอบคลุมในการแยกพิกัดของจุดยอดรูปหลายเหลี่ยมใน ArcMap? คุณสามารถหาจุดยอดของรูปหลายเหลี่ยมแล้วเพิ่มพิกัด x และ y ของแต่ละจุดยอดเป็นฟิลด์ในตารางแอตทริบิวต์ นี่เป็นข้อ จำกัด ของการไม่แนบพิกัดสูงสุด / นาทีโดยตรงกับรูปหลายเหลี่ยมแต่ละรูป แต่สามารถทำได้สองสามวิธี

วิธีที่ฉันคุ้นเคยมากที่สุดคือการอ่านฟิลด์ x และ y ในรายการไพ ธ อนโดยใช้โมดูล pyshpซึ่งสามารถเรียงลำดับเพื่อค้นหาค่าสูงสุดและต่ำสุดสำหรับแต่ละรูปหลายเหลี่ยม จากนั้นสามารถใช้ Pyshp เพื่อเปิดคลาสนักเขียนเพื่อเพิ่มฟิลด์ใหม่ให้กับรูปหลายเหลี่ยมดั้งเดิมและเขียนค่าสูงสุดและต่ำสุดเหล่านี้ไปยังรูปหลายเหลี่ยมที่ถูกต้อง

ฉันเชื่อว่าสิ่งนี้สามารถทำได้โดยใช้ arcpy แต่ฉันมีปัญหามากมายกับการเขียนไปยัง shapefiles ใน 9.3 โดยใช้ตัวประมวลผลทางภูมิศาสตร์ดังนั้นฉันจึงชอบวิธีการ pyshp แต่ฉันไม่แน่ใจว่าโมดูล arcpy แก้ปัญหาเหล่านี้ได้อย่างไร


0

คุณลองใช้ตัวพิมพ์ใหญ่ "M" ใน "XMax" หรือไม่ ฉันคิดว่ามันควรจะเป็น:

print desc.extent.XMax

แทน

print desc.extent.Xmax

ตามเอกสาร แน่นอนว่าทำให้ฉันสงสัยว่าโค้ดแรกของคุณทำงานอย่างไร ไม่ว่าจะด้วยวิธีใดให้ยิง!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.