¿Comprende por qué la herramienta de análisis de rutas de costo de ArcPy es más rápida que ArcObjects? [cerrado]

15

Aunque uso Python para crear scripts / servicios de geoprocesamiento, tenía la impresión de que usar ArcObjects para realizar las operaciones equivalentes tendrá un mejor rendimiento.

He publicado Servicio GP de ArcGIS Server - RasterIO.dll bloquea ArcSOC.exe y ArcGIS Geoprocessing Script funciona bien en el escritorio pero se bloquea como Servicio de geoprocesamiento? en los últimos días sobre cómo obtener scripts de geoprocesamiento que utilizan las herramientas de Spatial Analyst para funcionar como servicios de geoprocesamiento. Mi fecha límite se acerca rápidamente, por lo que he decidido tomar la ruta SOE para lograr la funcionalidad deseada.

Obtener un análisis de la ruta de los costos en ArcObjects fue relativamente sencillo utilizando .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , específicamente los métodos CostDistanceFull () y CostPath ().

Algunos fragmentos de código de cómo estoy haciendo las cosas:

  

Python

# Get Cost Path Origin and Destination Points
inputPointsShp = 'D:/RasterStuff/test_points.shp'
arcpy.MakeFeatureLayer_management(inputPointsShp,"origin",' "TYPE" = \'ORIGIN\' ')
arcpy.MakeFeatureLayer_management(inputPointsShp,"destination",' "TYPE" = \'DESTINATION\' ')

# Check out the ArcGIS Spatial Analyst extension license
arcpy.CheckOutExtension("Spatial")

# Execute CostDistance
outCostDistance = CostDistance("origin",SOURCE_RASTER,"#","backlink")

# Execute CostPath
outCostPath = CostPath("destination", outCostDistance,"backlink")

# Convert Result to Polyline
arcpy.RasterToPolyline_conversion(outCostPath, "leastCostPath")
featSet = arcpy.FeatureSet("leastCostPath")
  

C #

IDistanceOp distanceOp = new RasterDistanceOpClass();
IRasterBandCollection costDistanceRaster = (IRasterBandCollection)distanceOp.CostDistanceFull((IGeoDataset)sourceFc, (IGeoDataset)raster, true, true, false);
IRasterBand distanceRaster = costDistanceRaster.Item(0);
IRasterBand backLinkRaster = costDistanceRaster.Item(1);

IGeoDataset costPath = distanceOp.CostPath((IGeoDataset)destFc, (IGeoDataset)distanceRaster, (IGeoDataset)backLinkRaster, ESRI.ArcGIS.SpatialAnalyst.esriGeoAnalysisPathEnum.esriGeoAnalysisPathForEachCell);

Un análisis de la ruta de costos en ArcPy (usando sa.CostDistance y sa.CostPath) toma aproximadamente 15-20 seg. Usando exactamente las mismas entradas, la rutina basada en ArcObjects toma 55-60 seg. Incluso el uso del geoprocesador .NET es significativamente más lento que el de arcpy.

Supongo que mis preguntas aquí son:

  1. ¿Las implementaciones de ArcPy y ArcObjects apuntan a la misma base de código (a través de sus envoltorios de Python y .NET)?
  2. ¿Algún consejo para optimizar el análisis de la ruta de costos basada en ArcObject?
pregunta user890 07.07.2012 - 23:43

1 respuesta

0

Creo que eso se debe a que Python está utilizando ArcPy para llamar a las tareas de geoprocesamiento, que se ejecutan en procesos de 64 bits . ArcObjects ocurre en procesos de 32 bits .

    
respondido por el alexGIS 03.05.2016 - 23:58

Lea otras preguntas en las etiquetas