Definindo projeções para vários shapefiles no ArcMap?

29

Eu tenho mais de 100 arquivos de forma que não possuem arquivo .prj e, portanto, quando os trago para o ArcMap 10, eles mostram o sistema de coordenadas como desconhecido. Sei que todo o sistema de coordenadas dos arquivos de formas é GCS WGS 1984. Também sei que posso usar a ferramenta Define Projection GP para atribuir individualmente o sistema de coordenadas a cada arquivo, mas isso levará uma eternidade.

Eu esperava que houvesse uma ferramenta GP para definir em lote, mas não a vejo. Em seguida, pensei que talvez pudesse usar python para fazer isso. Procurei no menu de ajuda e encontrei um script, mas isso me deu um erro.

Aqui está o código python que eu tentei (isso é para um único arquivo shp, então eu ainda teria a dor de digitar o nome de cada arquivo:

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
fonte
Mas se eu quiser definir a projeção para arquivos multi raster, o que posso fazer?

Respostas:

29

Eu acho que vocês estão pensando demais neste ...

  1. Clique com o botão direito do mouse na ferramenta "Definir projeção" na caixa de ferramentas,
  2. selecione "Lote",
  3. arraste e solte suas camadas na coluna "Conjunto de dados de entrada",
  4. clique com o botão direito do mouse na primeira caixa "Sistema de coordenadas" para preencher a projeção correta,
  5. depois clique com o botão direito do mouse na projeção que você acabou de selecionar e escolha "Preencher", que preencherá todo o restante das projeções para você.
  6. Pressione "OK" e pronto.

texto alternativo

RyanDalton
fonte
Does that actually generate the Shapefile .PRJ helper file in the OS folder, or just annotate a layer attribute? And you'd have to launch ArcGIS as well. The Python script Jay put up will do its work completely outside ArcGIS, with certain results--good for non-ESRI needs.
V Stuart Foote
Sim, a ferramenta "Definir projeção" grava um arquivo PRJ para todos os shapefiles processados ​​por ele. Embora eu concorde que o script python que Jay postou provavelmente funcione muito bem, o script geralmente está fora do conjunto de habilidades de um especialista em GIS comum, enquanto o utilitário "Define Projection" do botão de pressão não é.
precisa saber é o seguinte
1
Obrigado Ryan, não tenho idéia de que você poderia clicar com o botão direito do mouse na ferramenta GP para obter mais opções. Esse é um bom truque e era exatamente o que eu estava procurando. Muito apreciado.
wilbev
13

Se eles estiverem no mesmo diretório, algo como isso funcionaria (apenas substitua seus caminhos, talvez adicione algum tratamento de exceção):

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
fonte
Eu tentei essa rota porque quero aprender a usar mais o Python, mas não obtive sucesso. Está com erro no nome do 'os'. Eu colei a mensagem de erro abaixo. Alguma idéia do que pode estar errado?
wilbev
Desculpe, que foi adicionado antes que eu colasse o erro, aqui está: Erro em tempo de execução <type 'exceptions.NameError'>: name 'os' não está definido
wilbev
oops ... as importações ajudariam !: import os, shutil (veja a resposta atualizada). docs.python.org/tutorial/stdlib.html você deve estar lá.
Jay Cummins
9

Basta fazer cópias do .prj e renomear. Então, por exemplo, se você tem 3 shapefiles:

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

Defina a projeção para one.shp e você terá one.prj no diretório Copie one.prj para o diretório de two.shp e renomeie para two.prj, repita para todos os shapefiles. O .prj é apenas um arquivo de texto. Enquanto houver um .prj no mesmo diretório que um .shp e com o mesmo nome, o software irá buscá-lo. Automatize com as ferramentas que você conhece para copiar e renomear arquivos.

Sean
fonte
4

Editar:

Provavelmente o método mais fácil seria. Traga todos eles e atribua as CRs corretas ao documento. Eles seriam "não projetados", mas sentados no lugar certo. Em seguida, basta exportar (vários) para um novo local.

Eu vejo uma ferramenta GP para projeção em lote.

lote proj

Não pode ser exposto no arco. ??

Eu acho que criaria um pgdb (arquivo, pessoal ou mesmo sde) e depois criaria um fds (recurso de conjunto de dados).

Atribua os crs apropriados a esses fds.

Importe os arquivos de forma (vários). [todos os fc em um fds herdam os crs do fds].

Em seguida, você pode exportar para o arquivo de forma (vários).

Isso substitui a projeção em lote e, com certeza, poderia ser roteirizado.

Brad Nesom
fonte
Embora esse método funcione, leva muito mais tempo do que sugeriu Ryan Dalton. A importação de mais de 100 arquivos de forma para uma classe de recurso é muito lenta.
wilbev
1

Aqui está o que eu uso ... ele definirá apenas a projeção para arquivos rasterizados que não têm projeção. Espero que ajude. Ele também cria uma lista dos arquivos sem projeção para fins de garantia de qualidade.

Para seus vetores, ele só precisa de um pequeno 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
fonte