¿Definición de proyecciones para múltiples shapefiles en ArcMap?

29

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 forma es GCS WGS 1984. También sé que puedo usar la herramienta Definir GP de proyección para asignar individualmente el sistema de coordenadas a cada archivo, pero eso tomará una eternidad.

Esperaba que hubiera una herramienta de GP para definir estos lotes, pero no veo una. 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, por lo que aún tendría la molestia 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)
wilbev
fuente
Pero si quiero definir la proyección para archivos multi ráster, ¿qué puedo hacer?

Respuestas:

29

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

  1. Haga clic derecho en la herramienta "Definir proyección" en la caja de herramientas,
  2. seleccione "Lote",
  3. arrastre y suelte sus capas en la columna "Conjunto de datos de entrada",
  4. haga clic derecho en el primer cuadro "Sistema de coordenadas" para completar la proyección correcta,
  5. luego haz clic derecho en la proyección que acabas de seleccionar y elige "Rellenar", que completará el resto de las proyecciones por ti.
  6. Presiona "OK" y listo.

texto alternativo

RyanDalton
fuente
¿Eso realmente genera el archivo de ayuda Shapefile .PRJ en la carpeta del sistema operativo, o simplemente anota un atributo de capa? Y también tendrías que iniciar ArcGIS. El script Python que Jay presentó hará su trabajo completamente fuera de ArcGIS, con ciertos resultados, bueno para las necesidades que no son de ESRI.
V Stuart Foote
Sí, la herramienta "Definir proyección" escribe un archivo PRJ para todos los archivos de forma que se procesan a través de él. Si bien estoy de acuerdo en que la secuencia de comandos de Python que publicó Jay probablemente funcionará de maravilla, las secuencias de comandos a menudo están fuera del conjunto de habilidades de un especialista en SIG promedio, mientras que la utilidad "Definir proyección" de botón no lo es.
RyanDalton
1
Gracias Ryan, no tengo idea de que podrías hacer clic derecho en la herramienta GP para obtener más opciones. Ese es un buen truco y era justo lo que estaba buscando. Muy apreciado.
wilbev
13

Si están en el mismo directorio, algo como esto funcionaría (solo reemplace sus rutas, quizás agregue algún manejo de excepciones):

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))
Jay Cummins
fuente
Intenté esta ruta porque quiero aprender a usar Python más, pero no tuve éxito. Se está produciendo un error en el nombre 'os'. Pegué el mensaje de error a continuación. Alguna idea de lo que puede estar mal?
wilbev
Lo siento, eso se agregó antes de pegar el error, aquí está: Error de tiempo de ejecución <tipo 'excepciones.NombreError'>: el nombre 'os' no está definido
wilbev
¡Uy ... las importaciones ayudarían !: import os, shutil (ver la respuesta actualizada). docs.python.org/tutorial/stdlib.html debería estar allí.
Jay Cummins
9

Simplemente haga copias del .prj y cambie el nombre. Entonces, por ejemplo, si tiene 3 archivos de forma:

  • one.shp,
  • two.shp,
  • tres.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 archivos de forma. El .prj es solo un archivo de texto. Mientras haya un .prj en el mismo directorio que un .shp y con el mismo nombre, el software lo recogerá. Automatice con cualquier herramienta con la que esté familiarizado para copiar y renombrar archivos.

Sean
fuente
4

Editar:

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

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

proyecto por lotes

No puede exponerse en arco. ??

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

Asigne los crs apropiados a ese fds.

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

Luego puede 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 ser un guión.

Brad Nesom
fuente
Aunque este método funciona, lleva mucho más tiempo de lo que sugirió Ryan Dalton. La importación de más de 100 archivos de formas en una clase de entidad es muy lenta.
wilbev
1

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

Para sus 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)
GeorgeC
fuente