5 votos

¿Combinar varios shapefiles en arcgisscripting?

Tengo un montón de shapefiles de puntos (r20010101.shp, r20010202.shp, r20020101.shp...). Cada uno de ellos tiene la misma cantidad de puntos en exactamente la misma ubicación. En una columna con nombre de fecha, por ejemplo "D20010101", donde tengo valores únicos para cada shapefile.

Lo que quiero hacer ahora, es combinar o fusionar o unir todos estos shapefiles en un comando de Python.

El resultado debería ser UN shapefile con todos esos puntos (¡pero por favor, SIN duplicados!).

La tabla de atributos de este shapefile debería tener el siguiente aspecto: FID, Shape, Id, [Value of Date 2001/01/01], [Value of Date 2001/02/02],...

0 votos

Lo siento, lo olvidé, estoy usando ArcGis 9.3.1.

0 votos

Traté de juguetear con la idea usando OGR, convertí todo en spatial lite creo que luego de vuelta como un archivo shp. Voy a tratar de desenterrar algo de código

0 votos

Una pregunta \comment A no ser que los archivos de puntos originales contengan duplicados exactos dentro de sí mismos (es decir: r20010101.shp tiene 2 puntos en el mismo lugar con exactamente la misma información), ¿cómo vas a decidir qué duplicado borrar? Como has señalado, aunque el punto1 de r20010101.shp y el punto2 de r20010202.shp están en las mismas coordenadas, NO son duplicados completos ya que contienen datos diferentes...

5voto

user2013 Puntos 2301

NOTA: Esto funciona en ArcMap10. Tendrá que probarlo en 9.3. -- Unir los tres shapefiles con la herramienta Join. Asegúrese de que tiene una característica indexada que se puede utilizar para unirse a ellos (que acelera la herramienta de forma espectacular). Después de hacer esto, puede utilizar la pestaña de Campos dentro de las propiedades del shapefile / capa para hacer ciertos campos visibles / ocultos. Si oculta los campos y exporta la capa a una nueva clase de característica / shapefile, el archivo resultante sólo tendrá el visible campos.

También, una vez que tengas la unión, puedes exportarla al por mayor y realizar cualquier número de herramientas sobre ella:

  1. Utilizar la fusión y manipular el mapa de campos (permite renombrar los campos). Sí, puede realizar una fusión en una sola capa para cambiar los nombres y demás.
  2. Utilice ModelBuilder para crear un lote Field Delete python script para sus shapefiles.
  3. Añadir campo para obtener nuevos nombres y calclular los campos que quieras con los datos antiguos. Luego puede eliminar los campos antiguos con sus feos nombres calificados.

Por último, y lo que es menos importante (el proceso es lento), podría crear nuevos campos y recorrer los datos con un cursor, leyendo la información de fechas de las otras tablas fila por fila.

Así que, como puedes ver, ¡muchas opciones! Y todo ello es accesible a través del procesador GP (aunque me parece que unir varias capas a la vez es poco fiable en un script).

2voto

Daniel Magliola Puntos 8347

Esto es lo que estaba buscando.

import arcgisscripting, os
import sys

gp = arcgisscripting.create(9.3)
gp.Workspace = "D:\\Workspace\\shapedata"
# With Files:
# r20010101.shp with Fields and Input like:
# FID,Shape,POINTID,D20010101
# 0, Shape, 1, 10
# 1, Shape, 2, 14

# r20020101.shp with Fields and Input like:
# FID,Shape,POINTID,D20020101
# 0, Shape, 1, 12
# 1, Shape, 2, 13

# r20020601.shp with Fields and Input like:
# FID,Shape,POINTID,D20020601
# 0, Shape, 1, 11
# 1, Shape, 2, 9

# r20030101.shp with Fields and Input like:
# FID,Shape,POINTID,D20030101
# 0, Shape, 1, 3
# 1, Shape, 2, 7

fcs = gp.ListFeatureClasses("", "POINT")

x=0
for fc in fcs:
    outfc = "D:\\Workspace\\shapeout"
if x==0:
    # just run once:
    x=x+1
    fc_old=fc #r20010101.shp
    fn_old="D"+fc[1:-4] #D20010101
else:
    # do this, as long as there are shapefiles in gp.workspace
    # examples given here for the FIRST SpatialJoin

    fc_new=fc # r20020101.shp
    outfc=outfc+str(x) # D:\\Workspace\\shapeout1
    fn_new="D"+fc[1:-4] #  D20020101

    fieldmappings = gp.CreateObject("FieldMappings")
    vt = gp.CreateObject("ValueTable")

    fieldmappings.AddTable(fc_old)
    fieldmappings.AddTable(fc_new)

    if x>1:
        # This should prevent Fields "Join_Count", "Join_Co1", "Join_Co2"....
        fieldmappings.removeFieldMap(fieldmappings.findFieldMapIndex("Join_Count"))

    gp.SpatialJoin(fc_old, fc_new, outfc, "#", "#", fieldmappings) 

    if x>1:
        # delete temporary file e.g. shapeout1.shp after next loop 
        gp.delete_management(infc)

    fc_old=outfc + ".shp" # D:\\Workspace\\shapeout1.shp will be joined in next loop with e.g. r20020601.shp

    x=x+1

# The final Output will be 1 Shapefile with Fields and Input like: 
# FID,Shape,POINTID,D20010101,D20020101,D20020601,D20030101
# 0, Shape, 1, 10, 12, 11, 3
# 1, Shape, 2, 14, 13, 9, 7

¡Como tengo 30 Pointfiles (150MB cada uno), esto toma bastante tiempo en mi computadora (no muy vieja), como 1-2 horas para cada SpatialJoin!

2 votos

1-2 horas, ¡vaya! ¿Tienes índices espaciales para cada archivo?

1voto

dwj Puntos 2006

Si el campo "ID" es único dentro de cada tabla y consistente para todos los puntos a través de los numerosos shapefiles, puede simplemente utilizar la herramienta de campo de unión en Gestión de Datos - Uniones - Campo de unión.

como dijo Nathanus, asegúrese de que el campo ID de cada shapefile esté indexado.

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