Processing math: 100%

6 votos

Mueve el .SHP de .MXD a gdb

Posible duplicado:
¿Cómo mover SHP a gdb con la licencia de ArcView?

Dejémoslo corto, tengo numerosos mxd con capa proveniente de .SHP y varios servidores WMS que necesito pasar a un gdb. Lo que quiero es abrir el mxd y ejecutar un script que seleccione todas las capas .SHP en la TOC, cree un gdb, exporte el .SHP y cree un nuevo MXD con la nueva ruta apuntando a gdb.

El siguiente es el código que escribí, pero no puedo tenerlo para seleccionar sólo el .SHP, lo intenté con dataType pero todos salen como "FeatureLayer"... ¡necesito ayuda!

# Import system modules 
import arcpy, datetime, os, traceback 
from arcpy import env 

# Load required toolboxes... 
arcpy.AddToolbox("C:\\Program Files (x86)\\ArcGIS\\Desktop10.0\\ArcToolbox\\Toolboxes\\Data Management Tools.tbx")

# Get the active map document 
import arcpy.mapping 
mxd = arcpy.mapping.MapDocument ("CURRENT") 

# List broken links 
# arcpy.mapping.ListBrokenDataSources(mxd) 

# Set environment settings 
ws = "C:\\PARK" 
arcpy.env.workspace = ws 
print("env.workspace completed successfully") 
installdir = arcpy.GetInstallInfo("desktop") 

#check GDB exist 
gdb_nam = "test.gdb" 
gdb_full_path = os.path.join(ws,gdb_nam) 
if os.path.exists(gdb_full_path): 
    arcpy.Delete_management(gdb_full_path) 
print("GDB checked") 

# Execute CreateFileGDB 
arcpy.CreateFileGDB_management(ws, gdb_nam) 
print("CreateFileGDB completed successfully") 
outWorkspace = gdb_full_path 

# Iterate 

list = [] 

for df in arcpy.mapping.ListDataFrames (mxd): 
    for fc in arcpy.mapping.ListLayers (mxd, "", df):
        if (fc.datasetName.endswith(".shp")):
                    list.append(fc) 
for fc in fclist: 
    arcpy.FeatureClassToGeodatabase_conversion(fc, gdb_full_path)

9voto

nagytech Puntos 2872

Código

Si la capa es un archivo de forma, Layer.datasetName devolverá el nombre del archivo.

Por favor, lea la documentación en el siguiente enlace para ayudarle a entender más sobre el datasetName parámetro de la Layer objeto:

dataSource (Sólo lectura) : Devuelve el camino completo para la fuente de datos de la capa. Incluye la ruta del espacio de trabajo y las propiedades del nombre del conjunto de datos combinadas. No todas las capas soportar la propiedad datasetName (por ejemplo, servicios web), por lo que es buena práctica para probar esto con antelación usando los soportes método.

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#/Layer/00s300000008000000/

import arcpy, os
#import datetime, os, traceback
import arcpy.mapping
#from arcpy import env

#arcpy.AddToolbox('C:\Program Files (x86)\ArcGIS\Desktop10.0\ArcToolbox\Toolboxes\Data Management Tools.tbx')

project_root = 'C:/temp/'
working_mxd_directory = os.path.join(project_root, 'documents/')
blank_mxd_filename = project_root + 'templates/Blank.mxd'
working_mxd_file_names = ['Document_1.mxd', 'Document_2.mxd']

shapefiles_encountered = []

for working_mxd_file_name in working_mxd_file_names:
    current_mxd = arcpy.mapping.MapDocument(os.path.join(working_mxd_directory, working_mxd_file_name))
    print('I> Working on MXD: ' + current_mxd.filePath)

    layer_list = []
    for data_frame in arcpy.mapping.ListDataFrames(current_mxd):
        for layer in arcpy.mapping.ListLayers(current_mxd, "", data_frame):
            if (layer.supports("dataSource") and layer.dataSource.upper().endswith("SHP")):
                layer_list.append(layer)
                print 'I> Layer is a shapefile, adding to list: ' + layer.name
            else:
                print 'W> Layer not a shapefile: ' + layer.name    

    for layer in layer_list:
        # TODO: If shapefiles_encountered.contains(layer) foo, then bar

Para empezar, te recomiendo que pongas el objeto de capa completa en tu nuevo arreglo de 'lista', y que luego lo hagas en bucle y hagas lo que quieras.

Después de haber creado / poblado tus BGF, tienes tres opciones para crear tus nuevos documentos de mapas.

  1. Utilice el documento del mapa existente, cambie las fuentes de datos y guarde el documento del mapa como una copia.
  2. La segunda es crear nuevos documentos de mapas desde cero y sobre la marcha. No estoy seguro de que pueda crear un nuevo documento de mapa vacío directamente desde python/ArcPy.
  3. ( Recomendado ) Necesitará tener una plantilla vacía que pueda copiar en su sistema de archivos. Para ello, tendrá que acceder al sistema de archivos usando python .

Tendrá que tener en cuenta las reglas de su negocio para lo que sucede cuando se encuentra con el mismo shapefile en dos documentos de mapas diferentes. ¿Duplicas la información o qué?

Notas

No he usado ESRI en años, así que no puedo ofrecerte una solución completa a tu problema. A menos que alguien más venga a ayudarte, te recomiendo que intentes encontrarle sentido a la documentación de Geoprocesamiento y ArcPy en el sitio de ESRI. Hay bastantes personas en el mundo que "practican el SIG", y sólo un porcentaje de los que están dispuestos a escribir código para usted.

El enlace arriba indicado debería llevarle al área general de la documentación de ESRI ArcPy. También hay un tutorial general para pitón aquí: http://docs.python.org/tutorial/ .

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