Menambahkan bidang dengan nama file saat menggabungkan shapefile dengan ogr2ogr?

14

Saya menggabungkan beberapa shapefile dan saya punya masalah melakukannya di dalam QGIS, jadi saya menggunakan ogr2ogr secara langsung. Saya melakukan ini (dalam batch):

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

Ini berfungsi dengan baik, tapi sekarang saya harus memiliki dalam shapefile yang dihasilkan, bidang dengan nama-nama dari shapefile asli yang saya gabungkan. Kedengarannya tidak terlalu sulit, tetapi saya tidak berhasil melakukannya.

Adakah yang bisa membantu? Terima kasih!

vascobnunes
sumber

Jawaban:

14

Dengan skrip kecil itu bisa dilakukan. Dengan sesuatu seperti mengikuti Anda harus dapat menambahkan kolom ke shapefile di semua shapefile di folder, dan menggabungkannya ke file gabungan.shp

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 
)

sunting: Sama seperti skrip Bash, dengan beberapa perubahan agar berfungsi:

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
JaakL
sumber
Solusi ini hanya akan berfungsi jika semua layer / shapefile Anda memiliki nama yang sama misalnya "CHEMIN" yang benar? Saya mencari solusi untuk skrip file dengan nama layer yang berbeda.
Oeon
Benar, jika Anda mengganti CHEMIN dengan% f maka itu harus bekerja dengan nama apa pun, seperti dalam nama tabel shapefile adalah nama lapisan. Saya mengedit jawaban. Saya tidak punya windows untuk mengujinya benar
JaakL
9

Saya akan menggunakan opsi -sql, dan mengimpor shapefile dengan cara berikut:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'
capooti
sumber
Paolo - Saya berjuang untuk mendapatkan ini berfungsi. Apakah hanya dapat dilakukan dengan ogr2ogr dan bukan ogrinfo? Saya telah memposting ke gdal-dev juga, dengan contoh-contoh saya lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html Tidak dapat melakukannya di Windows atau Bash ..
oeon
Joe, apakah baris ogrinfo tunggal gagal, atau gagal hanya dalam konteks skrip (di dalam loop)?
capooti
Paolo - Saya akan menambahkan jawaban yang berfungsi untuk saya, di bawah ini. Terima kasih telah menindaklanjuti saya, Tuan yang baik! :)
oeon
7

ada beberapa cara untuk menggabungkan shapefile.

  • jika Anda ingin menggabungkan lapisan sebagai satu lapisan, Anda dapat menggunakan alat MMqgis untuk menggabungkan ...

mmqgis

  • jika Anda ingin menggabungkan semua shapefile di bawah folder, Anda dapat menggunakan kode sederhana DARREN COPE di sini.

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 )
)
  • di samping ini dapat menggunakan alat gratis GeoMerge untuk menggabungkan banyak file tetapi jangan lupa untuk mempertimbangkan ukuran file Anda untuk bekerja dengannya.

dan menambahkan atribut ke shapefile @dango directon baik. Anda bisa menggunakan layer.CreateField (field_name) untuk membuat kolom baru yang diisi dari

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

Saya harap ini membantu Anda ...

Aragon
sumber
5

vascobnunes, inilah cara saya menyelesaikan masalah ini dengan menggunakan skrip Python untuk membuat daisy-chain beberapa instruksi ogr2ogr bersamaan. Anda dapat dengan mudah mengubahnya menjadi skrip batch, pada dasarnya saya hanya menyatukan instruksi ogr2ogr ( cmd), kemudian menjalankannya dengan memanggil os.system(cmd), meneruskan perintah ogr2ogr yang saya gabungkan bersama.

Senjata rahasianya adalah ( seperti yang ditunjukkan oleh capooti ) menerapkan OGR_SQL untuk memaksakan nama file sebagai nilai konstan dari dataset sumber yang Anda tambahkan ke dalam hasil gabungan Anda.

Dalam contoh saya, -sqlflag menangani ini, dalam kode seperti ini:

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

Tapi itu membingungkan untuk dibaca karena saya perlu menerapkan tanda kutip tunggal dan ganda dalam rangkaian yang dihasilkan. Untuk melakukan itu saya harus melarikan diri dari tanda kutip tunggal (yaitu \ ') untuk menggunakannya "nyata". Jadi untuk keterbacaan, membantu melihatnya tanpa variabel dan menghindari urutan. Jika Anda berpura-pura nama file adalah "jalan1" untuk iterasi tertentu, hasil gabungan akan terlihat seperti ini dalam kalimat ogr2ogr:

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

Skrip .py ini adalah penggabungan tiga trik yang saya curi dari matt wilkie (klon kosong dari shapefile), j03lar50n (menambahkan kolom ke shapefile menggunakan ogrinfo dan ogr_sql), dan capooti (menggunakan ogr_sql untuk memaksakan nilai kolom tetap pada semua catatan dalam suatu shapefile). Jadi inilah skrip lengkapnya:


# 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
elrobis
sumber
4

Tambahkan kolom dengan nama file sumber dari folder shapefile. Memerlukan GDAL 1.10dev, upaya saya untuk menjatuhkan ekstensi .shp tidak berfungsi - tetapi secara keseluruhan, berfungsi. - Saya membayangkan itu bisa ditambahkan ke garis yang melakukan penggabungan dengan 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;
oeon
sumber
+1 untuk spesifikasi dialek. Saya mendapatkan kesalahan pada jawaban teratas karena OGR SQL tidak melakukan pembaruan.
user15741
3

Hai, mungkin tautan ini akan membantu. Ini menunjukkan cara menambahkan feild ke shapefile menggunakan binding python gdal.

dango
sumber
2

Di dalam QGIS Anda dapat menambahkan plugin Merge Shapefile. Ada opsi untuk "Tambahkan kolom dengan nama file"masukkan deskripsi gambar di sini

Ryan Garnett
sumber
Saya mendapatkan TypeError: objek tipe 'NoneType' tidak memiliki len ()
Hannes Ledegen
0

Versi JaaKL yang sedikit dimodifikasi. Perhatikan bahwa -append foo.shp dan -nln foo harus cocok. Juga, perhatikan penggunaan dialek SQLite (GDAL tampaknya tidak menerima kata kunci 'Perbarui', sehingga dialek SQLite harus digunakan instaed), dan tidak adanya kata kunci 'TABLE' setelah kata 'UPDATE' (tidak diperlukan) atau diterima oleh 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 
  )
)

sumber
0

Agak terlambat untuk berdiskusi, tapi sekarang juga ada ogrmerge

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
buku t
sumber