¿Definiendo proyecciones para múltiples shapefiles en ArcMap?

27

Tengo más de 100 archivos de formas que no tienen el archivo .prj y, por lo tanto, cuando los traigo a ArcMap 10, muestran el sistema de coordenadas como desconocido. Sé que todo el sistema de coordenadas de los archivos de formas es GCS WGS 1984. También sé que puedo usar la herramienta Definir Proyección GP para asignar individualmente el sistema de coordenadas a cada archivo, pero eso tomará una eternidad.

Esperaba que hubiera una herramienta de GP para definirlos por lotes, pero no veo ninguna. Luego pensé que tal vez podría usar python para hacer esto, así que busqué en el menú de ayuda y encontré un script, pero me da un error.

Aquí está el código de Python que probé (esto es para un solo archivo shp, así que todavía tendría el dolor de escribir el nombre de cada archivo:

import arcpy
infc = r"C:\Documents and Settings\User\My Documents\ArcGIS\shpfiles\Site_2.shp"
prjfile = r"<install directory>\Coordinate Systems\Geographic Coordinate Systems\World\WGS 1984.prj"
arcpy.DefineProjection_management(infc, prjfile)
    
pregunta wilbev 07.01.2011 - 21:00

6 respuestas

28

Creo que ustedes están pensando demasiado en esto ...

  1. Haga clic con el botón derecho en la herramienta "Definir proyección" en la caja de herramientas,
  2. selecciona "Lote",
  3. arrastre y suelte sus capas en la columna "Dataset de entrada",
  4. haga clic con el botón derecho en el primer cuadro "Sistema de coordenadas" para completar la proyección correcta,
  5. luego haga clic con el botón derecho en la proyección que acaba de seleccionar y seleccione "Rellenar", que completará el resto de las proyecciones por usted.
  6. Pulsa "Aceptar" y habrás terminado.

    
respondido por el RyanDalton 08.01.2011 - 00:09
12

Si están en el mismo directorio, algo como esto funcionaría (solo reemplaza tus rutas, quizás agrega algún manejo de excepción):

import os, shutil

wgs84prjpath='c:/Program Files/ArcGIS/Desktop10.0/Coordinate Systems/Geographic Coordinate Systems/World/WGS 1984.prj'

def definewgs84(shpfilepath):
    tgtpath = os.path.splitext(shpfilepath)[0] + '.prj'
    shutil.copyfile(wgs84prjpath,tgtpath)


yourshapefiledirectory='C:/temp/'
extension='shp'

shpfileslist = [file for file in os.listdir(yourshapefiledirectory) if file.lower().endswith(extension)]

for filename in shpfileslist:
    definewgs84(os.path.join(yourshapefiledirectory,filename))
    
respondido por el Jay Cummins 07.01.2011 - 21:52
9

Simplemente haga copias de .prj y cambie el nombre. Así que, por ejemplo, si tiene 3 shapefiles:

  • one.shp,
  • two.shp,
  • three.shp.

Defina la proyección para one.shp y tendrá one.prj en el directorio. Copie one.prj en el directorio de two.shp y cambie el nombre a two.prj, repita para todos los shapefiles. El .prj es solo un archivo de texto. Siempre que haya un .prj en el mismo directorio que un .shp y con el mismo nombre, el software lo recogerá. Automatice con las herramientas con las que esté familiarizado para copiar y renombrar archivos.

    
respondido por el Sean 07.01.2011 - 21:49
4

Editar:

Probablemente el método más fácil sería. Traiga todos y asigne los crs correctos al documento. Estarían "sin proyectar" pero sentados en el lugar correcto. Luego solo exporta (múltiples) a una nueva ubicación.

Veo una herramienta de GP para la proyección por lotes.

Puede que no esté expuesto en arcpy. ??

Creo que crearía un pgdb, (Archivo, personal o incluso sde) y luego crearía un fds (conjunto de datos de características).

Asigna los crs apropiados a ese fds.

Importar los archivos de formas (múltiples). [todos los fc en un fds heredan los crs de los fds].

Luego puedes exportar a un archivo de forma (múltiple).

Esto sería en lugar de la proyección por lotes, y estoy seguro de que podría tener un script.

    
respondido por el Brad Nesom 07.01.2011 - 21:19
4

¿qué tal un shell script simple y ogr2ogr? Consulte enlace para conocer la sintaxis exacta.

    
respondido por el Ian Turton 07.01.2011 - 21:40
1

Esto es lo que uso ... solo definirá la proyección para archivos raster que no tienen una proyección. Espero eso ayude. También crea una lista de los archivos sin proyección para fines de control de calidad.

Para tus vectores solo necesita un ligero mod - FileList = arcpy.ListFeatureClasses ()

# Defines projection for all rasters with undefined projection
# CAUTION - make sure you know that the projection you are defining is the correct one
# for all files in the current directory.

#Licence: Creative Commons
#Created by: George Corea; [email protected], [email protected]

import arcpy, glob, os, sys, arcgisscripting
from arcpy import env, mapping
path = os.getcwd()
env.workspace = path
env.overwriteOutput = True

print 'Reading files from ' + path
os.chdir(path)
prjFile=r'C:\Python26\GDA_1994_MGA_Zone_55.prj'

x=0
z=x+1
NoProjCount=0
FileList= arcpy.ListRasters()
for File in FileList:
    desc = arcpy.Describe(File)
    SR = desc.spatialReference
    if SR.name == "Unknown":
        print "Projection of " + str(File) + " is " + SR.name + " so defining projection."
        f = open('NoProjection.txt', 'a')
        f.write(str(File)+"\n")
        f.close()
        arcpy.DefineProjection_management(File, prjFile) 
        NoProjCount=NoProjCount+1
    else:    
        print File + " is projected " + str(SR.name)
    
respondido por el GeorgeC 08.09.2011 - 02:06

Lea otras preguntas en las etiquetas