7 votos

Partir un shapefile en muchos archivos con open source

Quiero crear un shapefile para cada uno de los 72,000 censos en los Estados unidos que incluye el censo de los bloques en que el tracto uso de software de código abierto.

Probablemente voy a empezar con un estado shapefile que incluye a todos los bloques para que el estado y combinar con un archivo GDB. Esto me dará una lista de los bloques que están en el censo.

Pero entonces no estoy seguro de cómo dividir el estado shapefile en los más pequeños. ¿Cómo puedo hacer esto?

Es allí una manera de automatizar este uso de software de fuente abierta? Si es así, ¿qué herramientas debo usar?

Estoy aprendiendo Quantum GIS.

9voto

Alex Puntos 1975

Básicamente, usted puede hacer el extracto con ogr2ogr siempre que entregue el Censo de IDENTIFICACIÓN, por lo que es realmente un problema de llegar de 72.000 ogr2ogr llamadas.

ogr2ogr -where "tract = '<tract_id>'" /dest_folder /source_folder block_shapefile -nln block_shapefile_<tract_id>

Notas:

  • Usted no tiene que especificar el formato de origen, ogr2ogr habrá que averiguarlo. Especificó shapefile, así que eso es lo que estoy suponiendo.
  • Si no va a cambiar el formato, usted también no tiene que especificar el formato de destino. De lo contrario, para obtener un shapefile, añadir `-f "Shapefile"
  • Estoy usando el -where cambiar a un subconjunto de datos. Recuerde que el atributo de la consulta es mucho más rápido que las consultas espaciales. Su pregunta era un poco vago, así que no sé si usted tiene la intención de unirse a los bloques a los tratados por atributo o espacialmente, pero yo recomiendo la primera.
  • Tenga en cuenta que estoy asumiendo los bloques shapefile tiene un tracto columna de ID. La mayoría del Censo de los conjuntos de datos tendrá una jerarquía de IDENTIFICACIÓN de las columnas, es decir, los bloques shapefile probable que tenga un estado, condado, y de las vías, así como bloquear el IDENTIFICADOR de la columna, pero no puede tener una columna de la concatenación de todos ellos juntos. Deben estar concatenados, porque los condados son sólo los únicos con los estados, los tratados son sólo los únicos con los condados, y los bloques son sólo los únicos dentro de la selva. Así que usted tendrá que ya sea (a) crear un nuevo campo con el estado y el condado y el tracto como su campo de ID, o añadir los tres criterios para la cláusula where.

Entonces, ¿cómo construir 72,000 ogr2ogr llamadas mediante programación? Usted puede utilizar cualquier herramienta que usted quiere, pero aquí está un ejemplo con R:

library(foreign)
dfBlocks = read.dbf("/source_folder/shapefile_name.dbf", as.is=TRUE)

strTract = unique(dfBlocks$tract_id)
for (i in 1:length(strTract)) {
  strOGR = paste(
    "ogr2ogr -where \"tract_id = '", strTract, 
    "'\" /dest_folder /source_folder layer_name -nln base_name_", 
    strTract, sep=""
    )
  system(strOGR)
}

También puede recoger el sistema de llamadas en un solo paso, a continuación, recorrer para que se ejecute el ogr2ogr de llamada por separado, en un bucle, o en un momento posterior, o escribir a un script en bash que se puede ejecutar desde la línea de comandos.

La principal desventaja es que se analizará el origen de datos de una vez por cada ogr2ogr de la llamada, así que en realidad la importación de los datos de origen, la iteración, y la escritura de un archivo shapefile para cada fila, probablemente sería más eficiente. Pero yo les recomiendo probarlo en otra cosa que R, el cual es un poco lento en la lectura de grandes conjuntos de datos espaciales (me encontré con una importación de los condados de los estados unidos, ~3000, y después de 15 minutos he cancelado la importación).

--Lee

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