Définir des projections pour plusieurs fichiers de formes dans ArcMap?

29

J'ai plus de 100 fichiers de formes qui n'ont pas de fichier .prj et donc quand je les amène dans ArcMap 10, ils montrent le système de coordonnées comme inconnu. Je sais que le système de coordonnées de tous les fichiers de formes est GCS WGS 1984. Je sais également que je peux utiliser l'outil Define Projection GP pour attribuer individuellement le système de coordonnées à chaque fichier, mais cela prendra une éternité.

J'espérais qu'il y avait un outil GP pour les définir par lots, mais je n'en vois pas. Ensuite, je pensais que je pourrais peut-être utiliser python pour cela, alors j'ai regardé dans le menu d'aide et trouvé un script, mais cela me donne une erreur.

Voici le code python que j'ai essayé (c'est pour un seul fichier shp donc j'aurais toujours la peine de taper le nom de chaque fichier:

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
la source
Mais si je veux définir la projection pour les fichiers multi raster, que puis-je faire?

Réponses:

29

Je pense que vous pensez trop à celui-ci ...

  1. Cliquez avec le bouton droit sur l'outil "Définir la projection" dans la boîte à outils,
  2. sélectionnez "Lot",
  3. glissez-déposez vos calques dans la colonne "Input Dataset",
  4. faites un clic droit dans la première case "Système de coordonnées" pour remplir la projection correcte,
  5. puis faites un clic droit sur la projection que vous venez de sélectionner et choisissez "Remplir" qui remplira toutes les autres projections pour vous.
  6. Appuyez sur "OK" et vous avez terminé.

texte alternatif

RyanDalton
la source
Cela génère-t-il réellement le fichier d'assistance Shapefile .PRJ dans le dossier OS, ou simplement annote-t-il un attribut de couche? Et vous devez également lancer ArcGIS. Le script Python mis en place par Jay fera son travail complètement en dehors d'ArcGIS, avec certains résultats - bon pour les besoins non ESRI.
V Stuart Foote
Oui, l'outil "Define Projection" écrit un fichier PRJ pour tous les fichiers de formes qui y sont traités. Bien que je convienne que le script python que Jay a publié fonctionnera probablement très bien, les scripts sont souvent en dehors des compétences d'un spécialiste SIG moyen, contrairement à l'utilitaire "Définir la projection".
RyanDalton
1
Merci Ryan, je ne pense pas que vous puissiez cliquer avec le bouton droit sur l'outil GP pour obtenir plus d'options. C'est une bonne astuce et c'était exactement ce que je cherchais. Très appréciée.
wilbev
13

S'ils sont dans le même répertoire, quelque chose comme ça fonctionnerait (remplacez simplement vos chemins, peut-être ajoutez une gestion des exceptions):

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
la source
J'ai essayé cette route parce que je veux apprendre à utiliser davantage Python mais je n'ai pas réussi. C'est une erreur sur le nom «os». J'ai collé dans le message d'erreur ci-dessous. Des idées, qu'est-ce qui ne va pas?
wilbev
Désolé d'avoir été ajouté avant de coller l'erreur, la voici: Erreur d'exécution <type 'exceptions.NameError'>: le nom 'os' n'est pas défini
wilbev
oups ... les importations aideraient!: import os, shutil (voir la réponse mise à jour). docs.python.org/tutorial/stdlib.html si vous y êtes.
Jay Cummins
9

Faites simplement des copies du .prj et renommez. Donc, par exemple, si vous avez 3 fichiers de formes:

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

Définissez la projection pour one.shp et vous aurez one.prj dans le répertoire. Copiez one.prj dans le répertoire two.shp et renommez-le en two.prj, répétez pour tous les fichiers de formes. Le .prj est juste un fichier texte. Tant qu'il y a un .prj dans le même répertoire qu'un .shp et avec le même nom, le logiciel le récupérera. Automatisez avec les outils que vous connaissez pour copier et renommer des fichiers.

Sean
la source
4

Modifier:

La méthode la plus simple serait probablement. Apportez-les tous et attribuez les bons CRS au document. Ils seraient «non projetés» mais assis au bon endroit. Il vous suffit ensuite d'exporter (plusieurs) vers un nouvel emplacement.

Je vois un outil GP pour la projection par lots.

batch proj

Il ne peut pas être exposé à l'arc. ??

Je pense que je créerais un pgdb (fichier, personnel ou même sde) puis créerais un fds (ensemble de données de fonctionnalité).

Attribuez les crs appropriés à ces fds.

Importez les fichiers de forme (plusieurs). [tous les fc dans un fds héritent des crs des fds].

Ensuite, vous pouvez exporter vers un fichier de forme (plusieurs).

Ce serait au lieu de la projection par lots, et je suis sûr que cela pourrait être scripté.

Brad Nesom
la source
Bien que cette méthode fonctionne, elle prend beaucoup plus de temps que ce que Ryan Dalton a suggéré. L'importation de plus de 100 fichiers de formes dans une classe d'entités est très lente.
wilbev
1

Voici ce que j'utilise ... il ne définira que la projection pour les fichiers raster qui n'ont pas de projection. J'espère que ça aide. Il crée également une liste des fichiers sans projection à des fins d'assurance qualité.

Pour vos vecteurs, il suffit d'un léger 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
la source