Více

Automatizujte projekci více souborů shp pomocí ArcPy

Automatizujte projekci více souborů shp pomocí ArcPy


Snažil jsem se vytvořit skript v Pythonu, který převede všechny soubory tvaru ve složce z GCS WGS 84 na Web Mercator. Níže je uveden kód, který zatím mám, ale s čím se potýkám, je to, jak iterovat každý ze souborů při vytváření nového názvu výstupu (nový projektovaný soubor ve Web Mercatoru). Nějaké nápady, jak mohu změnit tento kód, aby to fungovalo? Vím, že nemám výstupní parametr správně, ale myslím, že všechno ostatní je správné.

import arcpy import glob inFCFolder = "C:  Data" def projectToWebM (): pro f v 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]] Green []] 'Degree', 0,0174532925199433]], PROJECTION ['Mercator_Auxiliary_Sphere'], PARAMETER ['False_Easting', 0,0], PARAMETER ['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] PRIMEM ['Greenwich', 0,0], UNIT ['Degree', 0,0174532925199433]] ") kromě: print 'Error: Unable to project' + f if __name __ == '__main__': projectToWebM ()

## Váš kód: ## ## import arcpy ## import glob ## ## ## inFCFolder = "C:  Data" ## def projectToWebM (): ## pro f v 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_WS ', SPHEROID [' WGS_1984 ', 6378137.0,298.257223563]], PRIMEM [' Greenwich ', 0,0], UNIT [' Degree ', 0,0174532925199433]], PROJECTION [' Mercator_Auxiliary_Sphere '], PARAMETER [' 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], UNIT ['Degree', 0,0174532925199433]] #) kromě # # print 'Chyba: Nelze promítat' + f ## ## if __name __ == '__main__': ## projectToWebM () # Navrhuji něco podobného: import arcpy import glob import os # Normálně znak '' er je znak úniku, takže budete muset použít # r'C:  Data 'formát nezpracovaného řetězce nebo použít' C:  Data 'a získat ve svém řetězci # zpětné lomítko. # # Viz: http://docs.python.org/reference/lexical_analysis.html#literals inFCFolder = r'C:  Data 'def projectToWebM (): for f in glob.glob (inFCFolder + r'  *. Shp '): try: # Let arcpy create a scratch name, and use os.path.basename to transfer part # of the original file name to the new file name. scratch_name = arcpy.CreateScratchName ('wm_' + os.path.basename (f) .replace ('. shp', ") + '_', ",  'Shapefile',  inFCFolder) # Aby to bylo jednoduché, Vydávám nové promítané soubory tvaru do stejného adresáře #, ze kterého pocházejí (zaručeně existují). Vypadá to, že # je budete chtít při pohledu na svůj kód umístit do složky „Projekt“. Také, # pokud jsou vaše data již projektována (jako v má definovaný prostorový odkaz), # nemusíte určovat pátý parametr „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'," +  "SP 6378137.0,298,257223563]], "+  r" PRIMEM ['Greenwich', 0,0], "+  r" UNIT ['stupeň', 0,0174532925199433]], "+  r" PROJEKT ['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" PARAMETR ['Auxiliary_Sphere_Type', 0,0], "+  r" UNIT ['Meter', 1,0]] ") kromě: print 'Chyba: Nelze promítnout' + f pokud __name __ == ' __main__ ': projectToWebM ()

Dnes ráno jsem udělal něco velmi podobného (ETRS_1989_To_WGS_1984). Klíčem, jak iterovat všemi tvarovými soubory v adresáři, je použít funkci ListFeatureClasses ke generování seznamu tvarových souborů v Pythonu a pro smyčku skrz tento seznam. Doufám, že to pomůže.

# Importovat moduly importovat arcpy z arcpy import env import os # Nastavit nastavení prostředí env.workspace = "C:…  ETRS1989" # Nastavit lokální proměnné outWorkspace = "C:…  WGS84" # Použijte ListFeatureClasses k vygenerování seznamu tvarových souborů fcList = arcpy.ListFeatureClasses () # Nastavit souřadnicový systém pouze pro ty vstupy, které mají definovaný prostorový odkaz pro infc ve fcList: # Určete, zda má vstup definovaný souřadný systém dsc = arcpy.Describe (infc) sr = dsc.spatialReference pokud sr.Name == "Neznámý": # přeskočit pokračovat else: # Určete novou cestu třídy výstupních funkcí a název outFeatureClass = os.path.join (outWorkspace, infc.strip (". shp") + "_wgs84.shp") # Nastavit výstupní souřadnicový systém outCS = "C: / Program Files / ArcGIS / Desktop10.0 / Souřadnicové systémy / Geografické souřadnicové systémy / Svět / WGS 1984.prj" # Nastavit transformační metodu transform_method = "ETRS_1989_To_WGS_1984" arcpy.Project_management (infc, outFeatureClass , outCS, transform_method)

Nejsem obeznámen s globem, ale jen jsem to vyhledal a zdá se, že jej používáte k rekurzivnímu procházení složek a hledání tvarových souborů, což zní, jako by to bylo velmi užitečné.

Myslím, že vaším problémem je, že se pokoušíte předat zástupný znak (tj. F + r " Project * .shp") do nástroje Project při každé iteraci cyklu for.

Než se dostanete na řádek Project_management, myslím, že musíte mít již nastavenou proměnnou (možná fProjected) na konkrétní název vašeho výstupního souboru, abyste ji mohli předat do každé iterace nástroje Project.

Modul os bude pravděpodobně užitečný při rozbití starého celého názvu souboru a sestavení nového.


Dobře, co musíte udělat, je mít randomiser, který připojí k původnímu názvu souboru, protože se to zdá být problém.

Také bych rozdělil způsob, jakým to děláte globálně. Dělám to takto:

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

Také bych přidal náhodný:

importovat náhodné hld = 'abcdefghijhijklmnopqrstuvwxyz'

připojit jej ke starému názvu souboru, vytvořit nový název souboru.

Co si musíte pamatovat, je řádek:

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

f + r " Project * .shp", ... bude toto (pokud používáte glob):

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

Ve druhém parametru musíte mít název souboru.

Odstraňte název souboru z f. Odstraňte .shp ze jména, přidejte několik náhodných písmen, pak přidejte .shp a bude to fungovat.

UPRAVIT:

Omlouváme se, ale abyste získali název souboru, musíte to udělat:

import os název souboru = os.path.basename (f) název souboru = název souboru [0: len (název souboru) -4] + random.choice (hld) + random.choice (hld) + random.choice (hld) + ".shp "arcpy.Project_management (f," C:  PathToProject  Projekce  "+ název souboru atd.…

Doufám, že to pomůže.


Podívejte se na video: How to convert KML to shapefile layer in arcgis in urduhindi. Lecture Number 18