¿Cómo agregar un campo con nombre de archivo cuando se combinan shapefiles con ogr2ogr?

13

Estoy fusionando algunos shapefiles y tuve algunos problemas al hacerlo dentro de QGIS, por lo que estoy usando ogr2ogr directamente. Estoy haciendo esto (en un lote):

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

Funciona bien, pero ahora necesito tener en el shapefile resultante, un campo con los nombres de los shapefiles originales que fusioné. No suena muy difícil, pero no estoy logrando hacerlo.

¿Alguien puede ayudar? ¡Gracias!

    
pregunta vascobnunes 23.03.2012 - 12:52

8 respuestas

11

Con secuencias de comandos pequeñas sería factible. Con algo como lo siguiente, debería poder agregar una columna a un shapefile en todos los shapefiles de una carpeta, y fusionarlos en el archivo 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 
)

editar: Lo mismo que un script de Bash, con algunos cambios para que funcione:

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
    
respondido por el JaakL 21.11.2012 - 10:17
8

Yo usaría la opción -sql e importaría el shapefile de la siguiente manera:

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'
    
respondido por el capooti 23.03.2012 - 14:07
7

hay algunas formas de fusionar shapefiles.

  • si desea fusionar capas como una capa, puede usar MMqgis para fusionar ...

  • sideseacombinartodoslosshapefilesenunacarpeta,puedeusar DARREN COPE código simple aquí.
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 )
)
  • al lado de esto puede usar la herramienta gratuita GeoMerge para combinar muchos archivos, pero no olvide considerar el tamaño de su archivo para trabajar con it.

y agregar atributo a shapefile @dango directon es bueno. puede usar layer.CreateField (field_name) para crear una nueva columna que se rellena desde

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

espero que te ayude ...

    
respondido por el Aragon 21.11.2012 - 10:20
4

vascobnunes, aquí es cómo logré este problema usando un script de Python para encadenar varias instrucciones ogr2ogr juntas. Podría convertirlo fácilmente en un script por lotes, básicamente, solo concatené instrucciones ogr2ogr ( cmd ), luego las ejecuté llamando a os.system(cmd) , pasando el comando ogr2ogr que concatené.

El arma secreta es ( como demostró Capooti ) aplicando OGR_SQL para imponer el nombre de archivo como un valor constante de fuente de datos que está agregando en su resultado de combinación.

En mi ejemplo, la bandera -sql maneja esto, en el código es así:

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

Pero es confuso leer esto porque debo aplicar comillas simples y comillas dobles en la concatenación resultante. Para hacer eso, tengo que escapar de las comillas simples (es decir, \ ') para usarlas "de verdad". Así que para facilitar la lectura, ayuda verlo sin variables y secuencias de escape. Si pretende que el nombre del archivo era "roads1" para una iteración en particular, la concatenación resultante se vería así en la oración ogr2ogr:

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

Este script .py es una amalgama de tres trucos que robé de matt wilkie (un clon vacío de un shapefile), j03lar50n (agregando una columna a un shapefile usando ogrinfo y ogr_sql), y capooti (usando ogr_sql para imponer una columna fija valor en todos los registros en un shapefile). Así que aquí está el script completo:

# 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
    
respondido por el elrobis 01.12.2012 - 17:15
3

Hola, tal vez este enlace ayudará. Muestra cómo agregar un feild a un shapefile usando los enlaces de python gdal.

    
respondido por el dango 21.11.2012 - 10:12
3

Agregue una columna con el nombre de archivo de origen de la carpeta de shapefiles. Requiere GDAL 1.10dev, mi intento de eliminar la extensión .shp no está funcionando, pero en general funciona. - Me imagino que podría agregarse a las líneas que se fusionan con la 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;
    
respondido por el oeon 01.12.2012 - 03:29
2

Dentro de QGIS puede agregar el complemento Fusionar Shapefile. Hay una opción para "Agregar columna con nombre de archivo"

    
respondido por el Ryan Garnett 07.06.2013 - 21:03
0

Una versión ligeramente modificada de la respuesta de JaaKL. Tenga en cuenta que los parámetros -append foo.shp y -nln foo deben coincidir. Además, tenga en cuenta el uso del dialecto SQLite (GDAL aparentemente no acepta la palabra clave "Actualizar", por lo que el dialecto SQLite debe usarse de manera permanente), y la ausencia de la palabra clave "TABLA" después de la palabra "ACTUALIZAR" (no es necesario o aceptado por 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 
  )
)
    
respondido por el user78826 29.07.2016 - 21:33

Lea otras preguntas en las etiquetas