17 votos

Cómo agregar un campo con nombre de archivo cuando la fusión de los shapefiles con ogr2ogr?

Estoy fusionando algunos archivos de forma y he tenido algunos problemas para hacerlo dentro de QGIS, así 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 resultado del shapefile, un campo con los nombres de los originales de los shapefiles he fusionado. No suena muy difícil, pero no estoy de gestión para hacerlo.

Alguien puede ayudar? Gracias!

10voto

Daniel Auger Puntos 8459

Me gustaría utilizar la opción de sql, e importar el archivo de forma de la siguiente manera:

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

7voto

texai Puntos 178

existen algunas formas de combinación de los shapefiles.

  • si desea combinar capas como una capa, puede utilizar MMqgis herramientas para combinar...

mmqgis

  • si desea combinar todos los archivos en una carpeta, puede utilizar DARREN AFRONTAR simple código 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 )
)
  • junto a esto, se puede utilizar GeoMerge herramienta gratuita para la fusión de los lotes de archivo, pero no se olvide de considerar el tamaño del archivo para trabajar con él.

y añadiendo el atributo de archivo shapefile @dango dirección es buena. puede utilizar la capa.CreateField(nombre_campo) para crear una nueva columna que se rellena a partir de

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

espero te sirva de ayuda...

5voto

warsze Puntos 178

vascobnunes, he aquí cómo he logrado este problema mediante una secuencia de comandos de Python para la conexión en cadena de varios ogr2ogr instrucciones juntos. Usted puede convertir fácilmente a una secuencia de comandos por lotes, básicamente sólo concatenar juntos ogr2ogr instrucciones (cmd), a continuación, ejecutar llamando os.system(cmd), pasando-en el ogr2ogr comando que se concatenan entre sí.

El arma secreta es (como capooti demostrado) la aplicación de OGR_SQL para imponer el nombre de archivo como un valor constante de la fuente de datos está anexando en su resultado de la combinación.

En mi ejemplo, el -sql bandera se encarga de esto, en el código como este:

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

Pero que esto es confuso para leer porque tengo que aplicar comillas simples y comillas dobles en el resultado de la concatenación. Para hacer eso tengo que escapar las comillas simples (es decir,\') para el uso de ellos "real". Así que para facilitar la lectura, ayuda a ver sin variables y secuencias de escape. Si se pretende que el nombre de archivo "roads1" para una iteración particular, el resultado de la concatenación tendría este aspecto en el ogr2ogr frase:

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

Este .py script es una fusión de tres trucos que le robé a matt wilkie (vacía, clon de un shapefile), j03lar50n (agregar una columna a un shapefile utilizando ogrinfo y ogr_sql), y capooti (utilizando ogr_sql para imponer una columna fija de valor en todos los registros en un archivo shapefile). Así que aquí está el guion 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

4voto

Seb Puntos 5120

Agregar la columna con el nombre de archivo de origen desde la carpeta de archivos de forma. Requiere GDAL 1.10 dev, mi intento de quitar .shp extensión no está trabajando - pero, en general, funciona. - Me imagino que se podría añadir a las líneas que hacer la fusión con 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;

3voto

Eric G Puntos 131

Hola que tal vez este enlace te ayudará. Se muestra cómo agregar un campo a un shapefile usando python gdal enlaces.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X