การเพิ่มฟิลด์ด้วยชื่อไฟล์เมื่อรวม Shapefiles กับ ogr2ogr?


14

ฉันกำลังรวมรูปร่างบางไฟล์และมีปัญหาบางอย่างใน QGIS ดังนั้นฉันจึงใช้ ogr2ogr โดยตรง ฉันกำลังทำสิ่งนี้อยู่ (ในชุด):

ogr2ogr -overwrite %destination% %n1%
ogr2ogr -update -append %destination% %n2% -nln all_new
ogr2ogr -update -append %destination% %n3% -nln all_new
ogr2ogr -update -append %destination% %n4% -nln all_new

มันใช้งานได้ดี แต่ตอนนี้ฉันต้องมีใน shapefile ที่เกิดขึ้นซึ่งเป็นเขตที่มีชื่อของรูปร่างที่เป็นต้นฉบับที่ฉันผสาน ฟังดูไม่ยากมาก แต่ฉันก็ไม่สามารถทำมันได้

ใครช่วยได้บ้าง ขอขอบคุณ!

คำตอบ:


14

ด้วยสคริปต์ขนาดเล็กมันจะทำได้ ด้วยสิ่งที่ชอบดังต่อไปนี้คุณควรจะสามารถเพิ่มคอลัมน์ไปยัง Shapefile ใน Shapefiles ทั้งหมดในโฟลเดอร์และรวมเข้ากับไฟล์ผสาน

for %f in (*.shp) do (
  ogrinfo %f -sql "ALTER TABLE %f ADD COLUMN filename character(15)"
  ogrinfo %f -sql "UPDATE TABLE %f filename = '%f'"
  ogr2ogr -update -append merged.shp %f -f esri shapefile -nln merge 
)

แก้ไข: เหมือนกับสคริปต์ Bash โดยมีการเปลี่ยนแปลงบางอย่างเพื่อให้ทำงานได้:

for f in *.shp
do 
  base=${f%.shp}
  ogrinfo $f -sql "ALTER TABLE $base ADD COLUMN filename character(15)"
  ogrinfo $f -dialect SQLite -sql "UPDATE $base SET filename = '$base'"
  ogr2ogr -update -append merged.shp $f
done

วิธีนี้จะใช้งานได้ก็ต่อเมื่อเลเยอร์ / รูปร่างของคุณทั้งหมดมีชื่อเดียวกันเช่น "CHEMIN" ถูกต้องหรือไม่ ฉันกำลังมองหาวิธีแก้ไขไฟล์สคริปต์ที่มีชื่อเลเยอร์ต่างกัน
oeon

ถูกต้องหากคุณแทนที่ CHEMIN ด้วย% f ดังนั้นควรทำงานกับชื่อใด ๆ ในชื่อตาราง shapefile คือชื่อเลเยอร์ ฉันแก้ไขคำตอบ ฉันไม่มี windows เพื่อทดสอบจริง ๆ
JaakL

9

ฉันจะใช้ตัวเลือก -sql และนำเข้า shapefile ด้วยวิธีต่อไปนี้:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'

เปาโล - ฉันกำลังดิ้นรนเพื่อให้งานนี้สำเร็จ สามารถทำได้ด้วย ogr2ogr เท่านั้นไม่ใช่ ogrinfo? ฉันโพสต์ไปที่ gdal-dev ด้วยเช่นกันlists.osgeo.org/pipermail/gdal-dev/2012-November/034849.htmlของฉันไม่สามารถทำได้ใน Windows หรือ Bash ..
oeon

Joe, บรรทัด ogrinfo บรรทัดเดียวล้มเหลวหรือไม่หรือเกิดความล้มเหลวเฉพาะในบริบทของสคริปต์ (ภายในลูป)
capooti

เปาโล - ฉันจะเพิ่มคำตอบที่เหมาะกับฉันด้านล่าง ขอบคุณที่ติดตามฉันด้วยนะครับ! :)
oeon

7

มีบางวิธีในการรวม Shapefiles

  • หากคุณต้องการผสานเลเยอร์เป็นเลเยอร์เดียวคุณสามารถใช้เครื่องมือMMqgisสำหรับการผสาน ...

mmqgis

  • หากคุณต้องการรวมรูปร่างของไฟล์ทั้งหมดในโฟลเดอร์คุณสามารถใช้รหัสอย่างง่ายของDARREN COPE ได้ที่นี่

mkdir merged
for %f in (*.shp) do (
if not exist merged\merged.shp (
ogr2ogr -f esri shapefile merged\merged.shp %f) else (
ogr2ogr -f esri shapefile -update -append merged\merged.shp %f -nln Merged )
)
  • ข้างนี้สามารถใช้เครื่องมือฟรีGeoMergeสำหรับการรวมไฟล์จำนวนมาก แต่อย่าลืมพิจารณาขนาดไฟล์ของคุณสำหรับการทำงานกับมัน

และการเพิ่มคุณสมบัติให้กับ shapefile @dango directon นั้นดี คุณสามารถใช้ layer.CreateField (field_name) เพื่อสร้างคอลัมน์ใหม่ที่มีประชากรอยู่

import os
shapeFileName = os.path.splitext("your_shape_file_path")[0]

ฉันหวังว่ามันจะช่วยคุณ ...


5

vascobnunes นี่คือวิธีที่ฉันประสบความสำเร็จในปัญหานี้โดยใช้สคริปต์ Python เพื่อ daisy-chain คำแนะนำ ogr2ogr หลายคำพร้อมกัน คุณสามารถแปลงเป็นสคริปต์แบบแบตช์ได้ง่ายๆโดยทั่วไปฉันเพียงแค่เชื่อมคำสั่ง ogr2ogr ( cmd) เข้าด้วยกันแล้วดำเนินการโดยการเรียกos.system(cmd)ผ่านคำสั่ง ogr2ogr ที่ต่อกันเข้าด้วยกัน

อาวุธลับคือ ( ดังที่ capooti แสดง ) ใช้OGR_SQLเพื่อกำหนดชื่อไฟล์เป็นค่าคงที่ของชุดข้อมูลต้นฉบับที่คุณผนวกเข้ากับผลการผสาน

ในตัวอย่างของฉันการ-sqlจัดการค่าสถานะนี้ในรหัสเป็นดังนี้:

-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

แต่นั่นทำให้สับสนเพราะฉันต้องใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ในการต่อผลลัพธ์ที่ได้ ในการทำเช่นนั้นฉันต้องหลีกเลี่ยงอัญประกาศเดี่ยว (เช่น \ ') เพื่อใช้คำว่า "เป็นของจริง" ดังนั้นเพื่อความสะดวกในการอ่านจะช่วยให้เห็นได้โดยไม่ต้องมีตัวแปรและลำดับการยกเว้น หากคุณแกล้งชื่อไฟล์คือ "roads1" สำหรับการวนซ้ำโดยเฉพาะการต่อผลลัพธ์ที่เกิดขึ้นจะมีลักษณะเช่นนี้ในประโยค ogr2ogr:

-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"

สคริปต์. py นี้เป็นการรวมกันของสามเทคนิคที่ฉันขโมยมาจากmatt wilkie (ว่างเปล่า, โคลนของ shapefile), j03lar50n (เพิ่มคอลัมน์ไปยัง shapefile โดยใช้ ogrinfo และ ogr_sql) และcapooti (ใช้ ogr_sql เพื่อกำหนดค่าคอลัมน์ถาวร ในบันทึกทั้งหมดใน shapefile) ดังนั้นนี่คือสคริปต์เต็มรูปแบบ:


# merge_shps.py
import os    

path = "D:/GIS/01_tutorials/ND_Roads/extracted"  # path to your folder of .shp files
merge = "merge_filename"                         # this will be the name of your merged result

directory = os.listdir(path)

count = 0
for filename in directory:
    if ".SHP" in filename.upper() and not ".XML" in filename.upper():

        # On the first pass, create a clone and add the filename column.
        if count == 0:
            # Make a clone (matt wilkie)..
            cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
            os.system(cmd)

            # Add the field (j03lar50n)..
            cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
            os.system(cmd)

        # Now populate the data (capooti)..
        print "Merging: " + str(filename)

        # You'll need the filename without the .shp extension for the OGR_SQL..
        filenameNoExt = filename.replace(".shp","")

        cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
                path + '/' + merge + '.shp ' + \
                path + '/' + filename + \
                ' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

        # Uncomment this line to spit the ogr2ogr sentence to the terminal..
        #print "\n" + cmd + "\n"

        os.system(cmd)

        count += 1

4

เพิ่มคอลัมน์พร้อมชื่อไฟล์ต้นฉบับจากโฟลเดอร์ของ shapefiles ต้องใช้ GDAL 1.10dev ความพยายามที่จะวางส่วนขยาย. shp ไม่ทำงาน แต่โดยรวมแล้วก็ใช้งานได้ - ฉันคิดว่ามันสามารถเพิ่มไปยังบรรทัดที่รวมเข้ากับ OGR

for f in *.shp;

do

name=${f%.shp}

/Users/you/gdal_src/bin/ogrinfo $f -sql "ALTER TABLE $name ADD COLUMN filename character(21)"
/Users/you/gdal_src/bin/ogrinfo $f -dialect SQLite -sql "UPDATE $name SET filename = '$f'"
done;

+1 สำหรับข้อมูลจำเพาะภาษา ฉันได้รับข้อผิดพลาดในคำตอบด้านบนเนื่องจาก OGR SQL ไม่ได้ทำการปรับปรุง
user15741

3

สวัสดีบางทีลิงค์นี้จะช่วย มันแสดงวิธีเพิ่ม feild ให้กับ shapefile โดยใช้การเชื่อม python gdal


2

ภายใน QGIS คุณสามารถเพิ่มปลั๊กอิน Merge Shapefile มีตัวเลือกในการ "เพิ่มคอลัมน์ด้วยชื่อไฟล์"ป้อนคำอธิบายรูปภาพที่นี่


ฉันได้รับ TypeError A: วัตถุชนิด 'NoneType' ได้ len ไม่มี ()
ฮานเนส Ledegen

0

คำตอบของ JaaKL เวอร์ชันแก้ไขเล็กน้อย โปรดทราบว่า -append foo.shp และ -nln foo ต้องตรงกัน นอกจากนี้โปรดทราบว่าการใช้ภาษา SQLite (GDAL เห็นได้ชัดว่าไม่ยอมรับคำหลัก 'อัปเดต' ดังนั้นต้องใช้ภาษา SQLite แทน) และไม่มีคำว่า 'ตาราง' หลังคำว่า 'อัพเดท' (ไม่จำเป็นต้องใช้ หรือยอมรับโดย SQLite)

for %%f in (*.shp) do (
  if not "%%f" == "merge.shp" (
    ogrinfo %%f -sql "ALTER TABLE %%~nf ADD COLUMN fname character(15)"
    ogrinfo %%f -dialect SQLite -sql "UPDATE %%~nf SET fname = '%%~nf'"
    ogr2ogr -update -append merge.shp %%f -f "ESRI SHAPEFILE" -nln merge 
  )
)

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