โมดูล Python เพื่อลบคุณสมบัติ SHP (ไม่ได้ติดตั้ง Desktop GIS)


16

ฉันมีซอฟต์แวร์บางส่วน (ไม่ใช่ Arc) ที่ทำงานทุกคืนบนเครื่องที่ไม่ได้ใช้งานจริงซึ่งอัพเดตคุณสมบัติ shapefile จากฐานข้อมูลภายนอก ฉันต้องการลบฟีเจอร์ทั้งหมดใน shapefile เป็นระยะ ๆ (ไม่ใช่ไฟล์เองซึ่งจะต้องคงอยู่) และให้ซอฟต์แวร์ "สร้าง" shapefile ใหม่ขึ้นมาใหม่ ฉันต้องการทำให้กระบวนการนี้เป็นแบบอัตโนมัติ

ฉันไม่มีซอฟต์แวร์ GIS ใด ๆ ติดตั้งอยู่ในเครื่องนั้น ฉันหวังว่าฉันจะเขียนสคริปต์เป็นประจำใน Python ซึ่งจะลบคุณลักษณะดังกล่าวโดยอัตโนมัติเหมือนกับเครื่องมือลบคุณสมบัติทางภูมิศาสตร์ของ Arc ในการประมวลผล

มีโมดูล Python ใดบ้างที่จะอนุญาตให้ฉันทำสิ่งนี้? โดยเฉพาะอย่างยิ่งโอเพนซอร์ส? ผมมองไปที่หุ่นดีและPyShpแต่ไม่เห็นอะไรที่จะช่วยให้ฉันลบคุณลักษณะในมวลหรือที่ตรงกับประโยคที่ พวกเขาสามารถเขียนคุณสมบัติและวิเคราะห์ แต่ไม่เห็นคุณลักษณะการลบที่ใดก็ได้

แน่นอนฉันต้องคิดถึงบางสิ่งที่ง่าย ...

แก้ไข:ฉันมี 35 โฟลเดอร์ (ขอบเขตทางภูมิศาสตร์ที่แตกต่างกันทั้งหมดในการฉายของพวกเขาเอง) ด้วย 35-65 รูปร่างไฟล์ที่มีประมาณ 1,000 รูปร่างไฟล์ที่จะจัดการกับ

คำตอบ:


16

คุณสามารถใช้GDAL / OGR python APIโค้ดจะเป็นดังนี้:

from osgeo import ogr

shapefile = ogr.Open( "shapfile.shp",1 )
layer=shapefile.GetLayerByIndex(0)
count=layer.GetFeatureCount()
for feature in range(count):
    layer.DeleteFeature(feature)

ฉันได้รับERROR 1: The DeleteFeature() operation is not permitted on a read-only shapefile
แมตต์วิลคี

4
คุณต้องเปิดมันเพื่อเขียน ลงมือทำด้วย: ogr.Open ('shapefile.shp', 1)
capooti

12

บรรทัดคำสั่งogr2ogrพร้อมกับประโยคที่รับประกันว่าจะสร้างผลลัพธ์ที่ว่างเปล่าเป็นวิธีที่ง่ายและรวดเร็ว:

ogr2ogr output.shp input.shp -where "FID < 0"

หน้าภาพรวมสำหรับ python และ OGR (และ GDAL) คือhttp://trac.osgeo.org/gdal/wiki/GdalOgrInPython


ฉันชอบความคิด ฉันจะต้องเขียนสคริปต์บางอย่างเกี่ยวกับการลบไฟล์อินพุตและเปลี่ยนชื่อไฟล์เอาต์พุตกลับเป็นชื่ออินพุต แต่ฉันสามารถทำให้มันทำงานได้หากไม่มีวิธีแก้ไขปัญหาอื่น ๆ
RyanKDalton-OffTheGridMaps

1
for %%a in (sample.shp) do (ogr2ogr %temp%\xxx.shp %%a -where "FID < 0" && copy %temp%\xxx.* %%~na.*)นี่เป็นไฟล์ชุดหนึ่งบรรทัดที่: คำตอบของปาโบลนั้นสามารถขยายได้มากขึ้น
แมตต์วิลคี

11

คุณสามารถทำได้ใน pyshp มันง่าย แต่ไม่ชัดเจนเพราะฉันไม่เคยนึกถึงกรณีการใช้งานนี้ แต่มันสมเหตุสมผลสำหรับแอพพลิเคชั่นอัพเดทอัตโนมัติ ฉันทดสอบโค้ด 6 บรรทัดต่อไปนี้และใช้งานได้ดี:

import shapefile
r = shapefile.Reader("myshape")
w = shapefile.Writer(r.shapeType)
# This line will give us the same dbf schema
w.fields = r.fields
# Use the original bounding box as a place holder in the header
w.bbox = lambda: r.bbox
w.save("myshape")

ตอนนี้คุณมี shapefile เขียนทับต้นฉบับที่มีส่วนหัวที่ถูกต้องและฟิลด์ dbf ดั้งเดิม มันจะเปิดอย่างปลอดภัยในซอฟต์แวร์ GIS และไลบรารีรูปร่างไฟล์ แต่ไม่มีคุณสมบัติหรือบันทึก dbf

ฟังก์ชั่นแลมบ์ดาโอนกล่องขอบเขตเดิมไปเป็นตัวยึดตำแหน่ง คุณสามารถใส่ค่าทศนิยมที่คุณต้องการในอาร์เรย์ของ [xmin, ymin, xmax, ymax] ตัวอย่าง:

w.bbox = lambda: [0.0, 0.0, 0.0, 0.0]

การเปลี่ยนเขตข้อมูล dbf นั้นง่ายมากและบันทึกไว้ในเอกสาร pyshp

หวังว่าจะช่วย


8

ทำไมไม่บันทึกสำเนาของ Shapefile ที่ว่างเปล่าและเขียน Shapefile ที่คุณสนใจมากเกินไป


แดกดัน IMHO นี้จะเป็นทางออกที่มีประสิทธิภาพที่สุดตราบใดที่เค้าร่างไม่เปลี่ยนแปลงมากนัก ...
Ragi Yaser Burhum

1
ถ้าเป็นไฟล์ 1 หรือ 2 ฉันจะเห็นด้วย เหตุผลหลักที่ไม่น่าจะเป็นเพราะฉันมี 35 โฟลเดอร์ (ขอบเขตทางภูมิศาสตร์ที่แตกต่างกันทั้งหมดในการฉายของพวกเขาเอง) ด้วยรูปร่าง 35-65 คณิตศาสตร์บอกว่ามันจะเป็นรูปแบบไฟล์เปล่ามากกว่า 1,000 รูปที่จะจัดการซึ่งไม่สามารถใช้ได้จริงเช่นกัน การเขียนสคริปต์กระบวนการเพื่อค้นหาคุณสมบัติของรูปร่างและลบเป็นสิ่งที่ฉันหวังว่าจะได้รับในท้ายที่สุด
RyanKDalton-OffTheGridMaps

@ RyanDalton ใน Q คุณพูดว่า "the shapefile" ซึ่งทำให้เราเป็นอย่างนั้นต่อไปเพื่อคิดและคิดค้นวิธีแก้ปัญหาเอกพจน์ ฉันไม่ได้บ่นเพียงชี้ให้เห็นว่าข้อมูลเพิ่มเติมเกี่ยวกับกรณีการใช้งานล่วงหน้าอาจนำไปสู่การตอบคำถามได้รวดเร็วยิ่งขึ้น
matt wilkie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.