Aunque uso Python para crear scripts / servicios de geoprocesamiento, tenía la impresión de que usar ArcObjects para hacer las operaciones equivalentes tendrá un mejor rendimiento.
He publicado ArcGIS Server GP Service: ¿RasterIO.dll se bloquea cuando ArcSOC.exe y ArcGIS Geoprocessing Script funcionan bien en el escritorio, pero se bloquean como servicio de geoprocesamiento? en los últimos días sobre la obtención de scripts de geoprocesamiento que usan herramientas de Spatial Analyst para trabajar como servicios de geoprocesamiento. Mi fecha límite se acerca rápidamente, por lo que he decidido seguir la ruta SOE para lograr la funcionalidad deseada.
Obtener un análisis de ruta de costo 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:
Pitón
# 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 ruta de costo en ArcPy (usando sa.CostDistance y sa.CostPath) toma aproximadamente 15-20 segundos. Usando exactamente las mismas entradas, la rutina basada en ArcObjects tarda 55-60 segundos. Incluso el uso del geoprocesador .NET es significativamente más lento que arcpy.
Creo que mis preguntas aquí son:
- ¿Las implementaciones de ArcPy y ArcObjects apuntan a la misma base de código (a través de sus envoltorios Python y .NET)?
- ¿Algún consejo para optimizar el análisis de ruta de costo basado en ArcObject?
fuente
Respuestas:
Creo que es porque su Python está utilizando ArcPy para llamar a tareas de geoprocesamiento, que se ejecutan en procesos de 64 bits . ArcObjects ocurre en procesos de 32 bits .
fuente