Czy dodać pole z nazwą pliku podczas łączenia plików kształtów z ogr2ogr?

14

Łączę niektóre pliki kształtów i miałem pewne problemy w QGIS, więc używam bezpośrednio ogr2ogr. Robię to (partią):

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

Działa dobrze, ale teraz muszę mieć wynikowy plik kształtu, pole z nazwami oryginalnych plików kształtu, które scaliłem. Nie brzmi to zbyt trudne, ale nie udaje mi się to zrobić.

Czy ktoś może pomóc? Dziękuję Ci!

vascobnunes
źródło

Odpowiedzi:

14

Przy małych skryptach byłoby to wykonalne. Powtarzając, powinieneś być w stanie dodać kolumnę do pliku shapefile we wszystkich plikach shapefile w folderze i scalić je do pliku scaled.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 
)

edycja: Taki sam jak skrypt Bash, z pewnymi zmianami, aby działał:

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
źródło
To rozwiązanie działałoby tylko wtedy, gdy wszystkie twoje warstwy / pliki kształtów miały tę samą nazwę, np. „CHEMIN”, prawda? Szukam rozwiązania dla skryptów plików o różnych nazwach warstw.
oeon
Prawidłowo, jeśli zamienisz CHEMIN na% f, powinien on działać z dowolną nazwą, ponieważ w tabeli kształtów nazwa pliku to nazwa warstwy. Zredagowałem odpowiedź. Nie mam systemu Windows, żeby to przetestować
JaakL
9

Chciałbym użyć opcji -sql i zaimportować plik shapefile w następujący sposób:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'
capooti
źródło
Paolo - Walczę, żeby to zadziałało. Czy można to zrobić tylko przy pomocy ogr2ogr, a nie ogrinfo? Wysłałem też do gdal-dev, z moimi przykładami lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html Nie mogę tego zrobić w systemie Windows lub Bash ..
oeon
Joe, czy pojedyncza linia ogrinfo zawodzi, czy zawodzi tylko w kontekście skryptu (wewnątrz pętli)?
capooti
Paolo - poniżej dodam odpowiedź, która zadziałała dla mnie. Dziękuję za skontaktowanie się ze mną, proszę Pana! :)
oeon
7

istnieje kilka sposobów łączenia plików kształtu.

  • jeśli chcesz scalić warstwy jako jedną warstwę, możesz użyć narzędzi MMqgis do scalenia ...

mmqgis

  • jeśli chcesz scalić wszystkie pliki kształtów w folderze, możesz użyć prostego kodu DARREN COPE tutaj.

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 )
)
  • oprócz tego można użyć bezpłatnego narzędzia GeoMerge do łączenia wielu plików, ale nie zapomnij rozważyć rozmiaru pliku do pracy z nim.

i dodanie atrybutu do directon shapefile @dango jest dobre. możesz użyć layer.CreateField (nazwa_pola) do utworzenia nowej kolumny, z której zostaną wypełnione

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

Mam nadzieję, że Ci to pomoże...

Aragonia
źródło
5

vascobnunes, oto jak udało mi się rozwiązać ten problem, używając skryptu Python do łączenia w łańcuch kilku instrukcji ogr2ogr. Możesz łatwo przekonwertować go na skrypt wsadowy, w zasadzie po prostu łączę ze sobą instrukcje ogr2ogr ( cmd), a następnie wykonuję je, wywołując os.system(cmd), przekazując polecenie ogr2ogr, które połączyłem.

Tajną bronią jest ( jak wykazał Capooti ) stosowanie OGR_SQL w celu narzucenia nazwy pliku jako stałej wartości źródłowego zestawu danych, który dołączasz do wyniku scalania.

W moim przykładzie -sqlflaga to obsługuje, w kodzie wygląda to tak:

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

Ale to jest mylące, ponieważ muszę zastosować pojedyncze cudzysłowy i podwójne cudzysłowy w wynikowej konkatenacji. Aby to zrobić, muszę uciec od pojedynczych cudzysłowów (tj. \ ') I użyć ich „na poważnie”. Tak więc dla czytelności pomaga to zobaczyć bez zmiennych i sekwencji ucieczki. Jeśli udajesz, że nazwa pliku to „drogi1” dla określonej iteracji, wynikowa konkatenacja wyglądałaby tak w zdaniu ogr2ogr:

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

Ten skrypt .py to połączenie trzech trików, które ukradłem z Matt Wilkie (pusty, klon pliku kształtu ), j03lar50n (dodawanie kolumny do pliku kształtu za pomocą ogrinfo i ogr_sql) oraz capooti (użycie ogr_sql do narzucenia stałej wartości kolumny we wszystkich rekordach w pliku kształtu). Oto pełny skrypt:


# 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
źródło
4

Dodaj kolumnę z nazwą pliku źródłowego z folderu plików kształtów. Wymaga GDAL 1.10dev, moja próba usunięcia rozszerzenia .shp nie działa - ale ogólnie działa. - Wydaje mi się, że można go dodać do linii łączących się z 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
źródło
+1 za specyfikację dialektu. Otrzymywałem błędy na pierwszą odpowiedź z powodu braku aktualizacji OGR SQL.
user15741
3

Cześć, może ten link pomoże. Pokazuje, jak dodać cechę do pliku kształtu za pomocą powiązań Pythona Gdal.

Dango
źródło
2

Wewnątrz QGIS możesz dodać wtyczkę Merge Shapefile. Istnieje opcja „Dodaj kolumnę o nazwie pliku”wprowadź opis zdjęcia tutaj

Ryan Garnett
źródło
Dostaję błąd TypeError: obiekt typu „NoneType” nie ma len ()
Hannes Ledegen
0

Nieco zmodyfikowana wersja odpowiedzi JaaKL. Zauważ, że -append foo.shp i -nln foo muszą się zgadzać. Zwróć też uwagę na użycie dialektu SQLite (GDAL najwyraźniej nie akceptuje słowa kluczowego „Update”, więc należy użyć instancji dialektu SQLite) oraz brak słowa kluczowego „TABLE” po słowie „UPDATE” (niepotrzebne) lub zaakceptowane przez 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 
  )
)

źródło
0

Trochę za późno na dyskusję, ale teraz jest też ogrmerge

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
t Book
źródło