Mais

Automatize a projeção de vários arquivos shp usando ArcPy

Automatize a projeção de vários arquivos shp usando ArcPy


Tenho tentado criar um script Python que converterá todos os arquivos de forma dentro de uma pasta do GCS WGS 84 para Web Mercator. Abaixo está o código que tenho até agora, mas o que estou lutando é como iterar em cada um dos arquivos enquanto cria um novo nome para a saída (o novo arquivo projetado no Web Mercator). Alguma ideia de como eu poderia mudar esse código para fazer isso funcionar? Eu sei que não tenho o parâmetro de saída certo, mas acho que todo o resto está certo.

import arcpy import glob inFCFolder = "C:  Data" def projectToWebM (): para f em glob.glob (r "" + inFCFolder + " *. shp"): try: arcpy.Project_management (f, f + r "  Project  *. Shp "," PROJCS ['WGS_1984_Web_Mercator_Auxiliary_Sphere', GEOGCS ['GCS_WGS_1984', DATUM ['D_WGS_1984', SPHEROID ['WGS_1984', 6378137.0,298.257223563] Greenwich, PRIMIT 'Grau', 0,0174532925199433]], PROJEÇÃO ['Mercator_Auxiliary_Sphere'], PARAMETER ['False_Easting', 0,0], PARAMETER ['False_Northing', 0.0], PARAMETER ['Central_Meridian', 0.0], PARAMETER ['Standard_Parallel_1', , PARAMETER ['Auxiliary_Sphere_Type', 0.0], UNIT ['Meter', 1.0]] "," # "," GEOGCS ['GCS_WGS_1984', DATUM ['D_WGS_1984', SPHEROID ['WGS_1984', 6378137.0,298.257223563]], PRIMEM ['Greenwich', 0,0], UNIDADE ['Grau', 0,0174532925199433]] ") exceto: imprimir 'Erro: Não foi possível projetar' + f if __name __ == '__main__': projectToWebM ()

## Seu código: ## ## import arcpy ## import glob ## ## ## inFCFolder = "C:  Data" ## def projectToWebM (): ## for f in glob.glob (r "" + inFCFolder + " *. shp"): ## try: ## arcpy.Project_management (f, f + r " Project  *. shp", "PROJCS ['WGS_1984_Web_Mercator_Auxiliary_Sphere', GEOGCS ['GCS_WGS_1984', DATUM ['D_WGS_1984 ', SPHEROID [' WGS_1984 ', 6378137.0,298.257223563]], PRIMEM [' Greenwich ', 0,0], UNIDADE [' Grau ', 0,0174532925199433]], PROJEÇÃO [' Mercator_Auxiliary_Sphere '], PARÂMETRO [' False_Easting ', 0,0] ['False_Northing', 0.0], PARAMETER ['Central_Meridian', 0.0], PARAMETER ['Standard_Parallel_1', 0.0], PARAMETER ['Auxiliary_Sphere_Type', 0.0], UNIT ['Meter', 1.0]] "," # ", "GEOGCS ['GCS_WGS_1984', DATUM ['D_WGS_1984', SPHEROID ['WGS_1984', 6378137.0,298.257223563]], PRIMEM ['Greenwich', 0.0], UNIDADE ['Grau', 0.0174532925199433]]") # # print 'Erro: Incapaz de projetar' + f ## ## if __name __ == '__main__': ## projectToWebM () # Eu sugeriria algo assim: import arcpy import glob import os # Normalmente o caractere '' er é um caractere de escape, então você precisará usar o formato de string bruto # r'C:  Data 'ou usar' C:  Data 'para obter uma "barra invertida" em sua string # literal. # # Consulte: http://docs.python.org/reference/lexical_analysis.html#literals inFCFolder = r'C:  Data 'def projectToWebM (): for f em glob.glob (inFCFolder + r'  *. Shp '): try: # Deixe arcpy criar um nome de scratch e usar os.path.basename para transferir parte # do nome do arquivo original para o novo nome de arquivo. scratch_name = arcpy.CreateScratchName ('wm_' + os.path.basename (f) .replace ('. shp', ") + '_', ",  'Shapefile',  inFCFolder) # Para torná-lo simples, Estou enviando os novos shapefiles projetados para o mesmo # diretório de onde eles vieram (existência garantida). Parece que você vai # querer colocá-los na pasta "Projeto" olhando para o seu código. Além disso, # se seus dados já estão projetados (como em tem uma referência espacial definida), # você não precisa especificar um quinto parâmetro "in_coor_system". arcpy.Project_management (f, scratch_name,  r "PROJCS ['WGS_1984_Web_Mercator_Auxiliary_Sphere'," +  r "GEOGCS ['GCS_WGS_1984'," +  r "DATUM ['D_WGS_1984'," +  r "SPGSHERO1984 [' 6378137.0,298.257223563]], "+  r" PRIMEM ['Greenwich', 0,0], "+  r" UNIDADE ['Grau', 0,0174532925199433]], "+  r" PROJEÇÃO ['Mercator_Auxiliary_Sphere'], "+  r "PARAMETER ['False_Easting', 0.0]," +  r "PARAMETER ['False_Northing', 0.0]," +  r "PARAMETER ['Central_Meridian', 0.0]," +  r "PARAMETER ['Standard_Parallel_1', 0.0], "+  r" PARAMETER ['Auxiliary_Sphere_Type', 0.0], "+  r" UNIT ['Meter', 1.0]] ") exceto: print 'Erro: Incapaz de projetar' + f if __name __ == ' __main__ ': projectToWebM ()

Fiz algo muito semelhante (ETRS_1989_To_WGS_1984) esta manhã. A chave para iterar por todos os shapefiles dentro de um diretório é usar a função ListFeatureClasses para gerar uma lista Python de shapefiles e loop for por meio dessa lista. Espero que ajude.

# Import modules import arcpy from arcpy import env import os # Definir configurações do ambiente env.workspace = "C:…  ETRS1989" # Definir variáveis ​​locais outWorkspace = "C:…  WGS84" # Use ListFeatureClasses para gerar uma lista de shapefiles fcList = arcpy.ListFeatureClasses () # Defina o sistema de coordenadas apenas para as entradas que têm uma referência espacial definida para infc em fcList: # Determine se a entrada tem um sistema de coordenadas definido dsc = arcpy.Describe (infc) sr = dsc.spatialReference if sr.Name == "Desconhecido": # ignorar continuar else: # Determine o novo caminho de classe de recurso de saída e nomeie outFeatureClass = os.path.join (outWorkspace, infc.strip (". shp") + "_wgs84.shp") # Set output coordinate system outCS = "C: / Program Files / ArcGIS / Desktop10.0 / Coordinate Systems / Geographic Coordinate Systems / World / WGS 1984.prj" # Set transform method transform_method = "ETRS_1989_To_WGS_1984" arcpy.Project_management (infc, outFeatureClass , outCS, transform_method)

Não estou familiarizado com o glob, mas acabei de pesquisar e parece que você o está usando para percorrer recursivamente suas pastas em busca de shapefiles, o que parece ser muito útil.

Acho que seu problema é que você está tentando passar um curinga (ou seja, f + r " Project * .shp") para a ferramenta Project a cada iteração do loop for.

Antes de chegar à linha Project_management, acho que você precisa já ter definido uma variável (talvez fProjected) para o nome específico do seu arquivo de saída para que você possa passá-lo para cada iteração da ferramenta Project.

O módulo os provavelmente será útil para separar o nome do arquivo completo antigo e montar o novo.


OK, o que você precisa fazer é ter um randomizador para anexar ao nome do arquivo original, pois esse parece ser o problema.

Eu também desagregaria a maneira como você faz glob. Eu faço assim:

sNames = r "C:  projdata  working  data  *. shp" itFileNames = glob.iglob (sNames) para vFile em itFileNames:

Eu também adicionaria o aleatório:

import random hld = 'abcdefghijhijklmnopqrstuvwxyz'

para anexá-lo ao nome do arquivo antigo, para criar o novo nome do arquivo.

O que você precisa lembrar é a linha:

arcpy.Project_management (f, f + r " Project  *. shp",…

f + r " Project * .shp", ... será este (se você estiver usando glob):

"C:  inFCFolder  newfile.shp  Project  *. Shp"

Você precisa ter um nome de arquivo no segundo parâmetro.

Portanto, retire o nome do arquivo de f. Retire o .shp do nome, acrescente algumas letras aleatórias e, em seguida, adicione .shp e isso funcionará.

EDITAR:

Desculpe, mas para obter o nome do arquivo, você precisa fazer o seguinte:

import os filename = os.path.basename (f) filename = filename [0: len (filename) -4] + random.choice (hld) + random.choice (hld) + random.choice (hld) + ".shp "arcpy.Project_management (f," C:  PathToProject  Projections  "+ nome do arquivo, etc…

Espero que ajude.


Assista o vídeo: Change Projection - Coordinate System in ArcMap