6 votos

La proyección de una selección de la gran conjunto de datos utilizando ArcPy?

Tengo un gran conjunto de datos X(x1-xn) a partir de la cual debo seleccionar consecutivamente los atributos(a1-an) de X. fieldsSRC o X. fieldDST proyecto y de las selecciones.

Tengo un funcionamiento arcpy script que haga lo siguiente:

<inside loop incrementing n>
#proj_sr is defined here but omitted
where_clause = fieldSRC = n OR fieldDST = n #simplified for webparser

#create a new feature class based on selection
arcpy.Select_analysis('input', 'temp1', where_clause)
#project selection
arcpy.Project_management('temp1', 'temp2', proj_sr)

#PERFORM OPERATION ON PROJECTED SELECTION

#append selection, and project to destination SR
arcpy.Append_management('temp2', 'final_output')

#we must delete rows from source files otherwise we will treat them each twice
#create layer file in order to select and delete specific rows
arcpy.MakeFeatureLayer_management('input', 'layerfile', where_clause)
#delete rows selected above in layer file
arcpy.DeleteFeatures_management('layerfile')
<end of loop>

Esto funciona. En mi mente no debe ser una manera de hacer lo siguiente, que sería más eficiente.

<inside loop incrementing n>
#proj_sr is defined here but omitted
where_clause = fieldSRC = n OR fieldDST = n #simplified for webparser

#create layer file in order to select and delete specific rows
arcpy.MakeFeatureLayer_management('input', 'layerfile', where_clause)
#project ACTUAL selection rather than a complete shapefile as was done earlier
arcpy.Project_management('layerfile', 'temp2', proj_sr)

#PERFORM OPERATION ON PROJECTED SELECTION

#delete rows selected above in layer file
arcpy.DeleteFeatures_management('layerfile')
<end of loop>

Obviamente el arcpy.Project_management() la función no operan en el segundo ejemplo de código. Es un gran conjunto de datos ('input') y volver a crear la clase de entidad que se basa en la selección cada vez que no parece eficiente y necesario. Funciona, pero no es rápido.

¿Alguien tiene una sugerencia?

1voto

Arda Xi Puntos 1099

Has probado a utilizar un SearchCursor y establecimiento de la referencia espacial en él de modo que vuelve a proyectar los resultados sobre la marcha? Código de abajo straight outta la ayuda:

import arcpy

desc = arcpy.Describe("d:/base/data.gdb/latlongbnd")

# Create search cursor. Use the spatial reference object from the
#   described feature class so geometries are returned in decimal degrees.
rows = arcpy.SearchCursor("d:/base/data.gdb/buildings", "", desc.spatialReference)

1voto

UnkwnTech Puntos 21942

RESPUESTA ACTUALIZADA

El siguiente código debe trabajar el uso de la geodatabase de archivos que Cyrille publicado en el Esri Foro de Discusión.

import arcpy

prjString = "PROJCS['World_Mercator',GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Mercator'],PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',0.0],PARAMETER['Standard_Parallel_1',0.0],UNIT['Meter',1.0]];-20037700 -30198300 10000;-100000 10000;-100000 10000;0.001;0.001;0.001;IsHighPrecision"

arcpy.CopyFeatures_management(r"C:/Support/Cyrille/MFL_Test.gdb/FlightPaths",r"C:/Support/Cyrille/FlightPaths.shp","#","0","0","0")
arcpy.MakeFeatureLayer_management(r"C:/Support/Cyrille/FlightPaths.shp","YVR_layer",'"src" = ' + "'YVR'")

arcpy.Project_management("YVR_layer", r"C:/Support/Cyrille/MFL_Test.gdb/YVR_Proj", prjString)

Lo que he encontrado es que mi código original hecha la capa en un shapefile mientras Cyrille fue lo que lo convierte en un archivo de clase de entidad de geodatabase. Para solucionar lo que yo creo que es un MakeFeatureLayer error o un Proyecto de error lo que hice fue copiar la clase de entidad a un shapefile antes de realizar los dos pasos. De esa manera la cláusula where es respetado.

Sospecho que la solución no será deseable para Cyrille así que el siguiente paso será ver si este error ha sido reportado previamente y para que informe si no.

RESPUESTA ORIGINAL

Me corrió la prueba por debajo de la cual utiliza MakeFeatureLayer_management para aplicar una expresión SQL a la base de datos (de 31 de polilíneas) y, a continuación, utiliza Project_management a los proyectos que la capa (de una polilínea). El resultados es una característica de la clase de uno proyectado de la polilínea. Así que parece que lo que usted está tratando de hacer en tu segundo ejemplo de código debería funcionar, a menos que su where_clause no evalúa correctamente. En consecuencia, mi recomendación es verificar que su where_clause está trabajando.

import arcpy

arcpy.MakeFeatureLayer_management("C:/Temp/test.shp","test_Layer",'"ID" = 555')

arcpy.Project_management("test_Layer","C:/Temp/test.gdb/projectedFC","PROJCS['GDA_1994_Australia_Albers',GEOGCS['GCS_GDA_1994',DATUM['D_GDA_1994',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Albers'],PARAMETER['False_Easting',0.0],PARAMETER['False_Northing',0.0],PARAMETER['Central_Meridian',132.0],PARAMETER['Standard_Parallel_1',-18.0],PARAMETER['Standard_Parallel_2',-36.0],PARAMETER['Latitude_Of_Origin',0.0],UNIT['Meter',1.0]]","#","GEOGCS['GCS_GDA_1994',DATUM['D_GDA_1994',SPHEROID['GRS_1980',6378137.0,298.257222101]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]")

0voto

Klaasvaak Puntos 131

SearchCursor toma una cláusula "where" - es la mejor manera de lidiar con un subconjunto de registros.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X