Anche se utilizzo python per creare script / servizi di geoprocessing, avevo l'impressione che l'uso di ArcObjects per eseguire operazioni equivalenti avrebbe prestazioni migliori.
Ho pubblicato il servizio GP di ArcGIS Server - RasterIO.dll si arresta in modo anomalo ArcSOC.exe e ArcGIS Geoprocessing Script funziona bene su Desktop ma si arresta in modo anomalo come Servizio di geoprocessing? negli ultimi due giorni su come ottenere script di geoprocessing che utilizzano gli strumenti di Analizzatore spaziale per funzionare come servizi di geoprocessing. La mia scadenza si sta avvicinando rapidamente, quindi ho deciso di seguire il percorso SOE per ottenere la funzionalità desiderata.
Ottenere un'analisi del percorso dei costi in ArcObjects è stato relativamente semplice utilizzando i .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , in particolare i metodi CostDistanceFull () e CostPath ().
Alcuni frammenti di codice di come sto facendo le cose:
Pitone
# 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'analisi del percorso dei costi in ArcPy (utilizzando sa.CostDistance e sa.CostPath) richiede circa 15-20 secondi. Utilizzando gli stessi input esatti, la routine basata su ArcObjects richiede 55-60 sec. Anche l'uso di .NET Geoprocessor è significativamente più lento di arcpy.
Immagino che le mie domande qui siano:
- Le implementazioni ArcPy e ArcObjects puntano alla stessa base di codice (tramite i loro wrapper Python e .NET)?
- Qualche consiglio per ottimizzare l'analisi del percorso dei costi basata su ArcObject?