Додавання поля з назвою файлу при об'єднанні файлів форм з 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

Це прекрасно працює, але тепер мені потрібно мати в отриманому форм-файлі поле з іменами оригінальних файлів форм, які я об'єднав. Це не дуже складно, але мені це не вдається.

Хтось може допомогти? Дякую!

Відповіді:


14

З невеликим сценарієм це було б можливо. Виконуючи наступні дії, ви маєте змогу додати стовпчик до файлу форми у всі файли форм у папці та об'єднати їх у файл merged.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 
)

редагувати: Те саме, що і сценарій 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 є ім'я шару. Я відредагував відповідь. У мене немає вікон, щоб перевірити це справді
JaakL

9

Я б скористався параметром -sql та імпортував файл форм таким чином:

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

Паоло - я намагаюся, щоб це спрацювало. Чи можна це робити лише за допомогою ogr2ogr, а не ogrinfo? Я також публікував до gdal-dev, зі своїми прикладами списки.osgeo.org/ pipermail/gdal-dev/2012- November/034849.html Я не можу це зробити в Windows або Bash ..
oeon

Джо, невдача однієї лінії ogrinfo або не вдається лише в контексті сценарію (всередині циклу)?
capooti

Паоло - я збираюся додати відповідь, яка працювала на мене, нижче. Дякую за те, що пішли зі мною, добрий сер! :)
ойон

7

є кілька способів злиття форм-файлів.

  • якщо ви хочете об'єднати шари як один шар, ви можете використовувати інструменти 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 (ім'я_поля) для створення нового стовпця, з якого заповнюється

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

я сподіваюся, що це допоможе тобі ...


5

vascobnunes, ось, як я вирішив цю проблему, використовуючи сценарій Python для того, щоб з'єднати кілька інструкцій 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-скрипт - це об'єднання трьох трюків, які я вкрав з матового вілкі (порожній, клон формфайлу ), j03lar50n (додавання стовпця до файлу форми за допомогою ogrinfo та ogr_sql) та capooti (використовуючи ogr_sql для накладення фіксованого значення стовпця на всіх записах у форміфайлу). Отже ось повний сценарій:


# 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

Додайте стовпчик із назвою вихідного файлу із папки формфілів. Потрібен 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 не робив оновлення.
користувач15741

3

Привіт, можливо, це посилання допоможе. Він показує, як додати feild до файлу форми за допомогою прив'язки python gdal.


2

Всередині QGIS можна додати плагін Merge Shapefile. Є можливість "Додати стовпець з назвою файлу"введіть тут опис зображення


Я отримую TypeError: об’єкт типу 'NoneType' не має len ()
Hannes 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 
  )
)

0

Трохи запізнюємось на дискусію, але зараз також є огрмерге

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.