Ogr2ogr ile şekil dosyalarını birleştirirken dosya adıyla alan eklensin mi?


15

Bazı şekil dosyalarını birleştiriyorum ve QGIS içinde bazı sorunlar yaşadım, bu yüzden doğrudan ogr2ogr kullanıyorum. Bunu (toplu olarak) yapıyorum:

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

İyi çalışıyor, ancak şimdi ortaya çıkan şekil dosyasında, birleştirdiğim orijinal şekil dosyalarının adlarını içeren bir alana sahip olmam gerekiyor. Kulağa pek zor gelmiyor, ama bunu başaramıyorum.

Biri yardım edebilir mi? Teşekkür ederim!

Yanıtlar:


15

Küçük betikleme ile bu yapılabilir. Aşağıdaki gibi bir şeyle, bir klasördeki tüm şekil dosyalarındaki şekil dosyasına sütun ekleyebilmeli ve bunları merged.shp dosyasına birleştirebilmelisiniz.

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 
)

edit: Çalışmasını sağlamak için bazı değişiklikler ile bir Bash betiği ile aynı:

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

Bu çözüm yalnızca tüm katmanlarınız / şekil dosyalarınız aynı isme sahipse, örneğin "CHEMIN" doğru mu? Ben farklı katman isimleri ile dosyaları komut dosyası için bir çözüm arıyorum.
oeon

Doğru, CHEMIN'i% f ile değiştirirseniz, shapefile tablo adında katman adı olduğu için herhangi bir adla çalışması gerekir. Cevabı düzenledim. Gerçekten test etmek için pencerelerim yok
JaakL

9

-Sql seçeneğini kullanır ve şekil dosyasını aşağıdaki şekilde alırım:

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

Paolo - Bunu işe almak için uğraşıyorum. Sadece ogr2ogr ile yapılabilir, ogrinfo ile değil mi? Ben gdal-dev de benim örnekleri ile gönderdim lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html Windows veya Bash ile
yapamam

Joe, tek ogrinfo satırı başarısız mı, yoksa sadece kod bağlamında mı (döngü içinde) başarısız oluyor?
capooti

Paolo - Aşağıda benim için işe yarayan yanıtı ekleyeceğim. Beni takip ettiğiniz için teşekkür ederim, efendim! :)
oeon

7

şekil dosyalarını birleştirmenin bazı yolları vardır.

  • katmanları tek bir katman olarak birleştirmek istiyorsanız, MMqgis araçlarını birleştirmek için kullanabilirsiniz ...

mmqgis

  • bir klasör altındaki tüm şekil dosyalarını birleştirmek istiyorsanız, burada DARREN COPE basit kodunu kullanabilirsiniz .

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 )
)
  • Bunun yanında çok sayıda dosyayı birleştirmek için GeoMerge ücretsiz aracını kullanabilirsiniz , ancak dosya boyutu ile çalışmak için dikkate almayı unutmayın.

ve shapefile @dango directon'a öznitelik eklemek iyidir. doldurulmuş yeni bir sütun oluşturmak için layer.CreateField (alan_adı) öğesini kullanabilirsiniz

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

umarım sana yardımcı olur ...


5

vascobnunes, ben bu sorunu birkaç ogr2ogr talimat birlikte papatya zinciri için bir Python komut dosyası kullanarak nasıl başardı. Kolayca bir toplu iş komut dosyasına dönüştürebilirsiniz, temelde ben sadece ogr2ogr talimatları ( cmd) birleştirmek , sonra arayarak os.system(cmd)ogr2ogr komut birlikte geçirerek onları yürütün .

Gizli silah ( capooti'nin gösterdiği gibi ) , dosya adını birleştirme sonucunuza eklediğiniz kaynak veri kümesinin sabit bir değeri olarak uygulamak için OGR_SQL kullanıyor.

-sqlÖrneğimde , bayrak bunu işliyor, kodda şöyle:

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

Ancak bu, okumak için kafa karıştırıcıdır, çünkü sonuçta birleştirmede tek tırnak ve çift tırnak kullanmam gerekiyor. Bunu yapmak için "gerçek" onları kullanmak için tek tırnak (yani \ ') kaçmak zorunda. Bu nedenle, okunabilirlik için, değişkenler ve kaçış dizileri olmadan görmeye yardımcı olur. Dosya adının belirli bir yineleme için "roads1" olduğunu varsayarsanız, sonuçtaki birleştirme ogr2ogr cümlesinde şöyle görünür:

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

Bu .py komut dosyası, matt wilkie'den (boş, bir şekil dosyasının klonu), j03lar50n'den (ogrinfo ve ogr_sql kullanarak bir şekil dosyasına bir sütun ekleyerek) ve kapooti'den (sabit bir sütun değeri uygulamak için ogr_sql kullanarak) çaldığım üç hilenin birleşimidir. şekil dosyasındaki tüm kayıtlarda). İşte tam komut dosyası:


# 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

Şekil dosyaları klasöründen kaynak dosya adına sahip sütun ekleyin. GDAL 1.10dev gerektirir, .shp uzantısını düşürme girişimim çalışmıyor - ancak genel olarak çalışıyor. - OGR ile birleşen hatlara eklenebileceğini düşünüyorum.

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;

Lehçe özellikleri için +1. OGR SQL güncellemeleri yapmaması nedeniyle üst yanıt hata alıyordu.
user15741

3

Merhaba belki bu bağlantı yardımcı olacaktır. Python gdal bağlarını kullanarak şekil dosyasına nasıl bir alan ekleneceğini gösterir.


2

QGIS içinde Merge Shapefile eklentisini ekleyebilirsiniz. "Dosya adıyla sütun ekle" seçeneği vardırresim açıklamasını buraya girin


Bir TypeError alıyorum: 'NoneType' türünde nesne len () yok
Hannes Ledegen

0

JaaKL'nin cevabının biraz değiştirilmiş bir versiyonu. -Append foo.shp ve -nln foo öğelerinin eşleşmesi gerektiğini unutmayın. Ayrıca, SQLite lehçesinin (GDAL, görünüşe göre 'Güncelleme' anahtar kelimesini kabul etmiyor, bu nedenle SQLite lehçesi mutlaka kullanılmalıdır) ve 'GÜNCELLEME' kelimesinden sonra 'TABLO' anahtar kelimesinin yokluğuna (gerekli değil) dikkat edin veya SQLite tarafından kabul edilir).

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 
  )
)

0

Tartışmaya biraz geç, ama şimdi de ogrmerge var

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
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.