Obwohl ich Python zum Erstellen von Geoverarbeitungsskripten / -diensten verwende, hatte ich den Eindruck, dass die Verwendung von ArcObjects für die entsprechenden Vorgänge eine bessere Leistung bietet.
Ich habe den ArcGIS Server GP Service veröffentlicht - RasterIO.dll stürzt ab ArcSOC.exe und das ArcGIS-Geoverarbeitungsskript wird auf dem Desktop einwandfrei ausgeführt , stürzt jedoch als Geoverarbeitungsdienst ab? In den letzten Tagen haben wir uns über das Abrufen von Geoverarbeitungsskripten unter Verwendung von Spatial Analyst-Tools als Geoverarbeitungs-Services informiert. Meine Deadline rückt immer näher und ich habe mich entschieden, den SOE-Weg einzuschlagen, um die gewünschte Funktionalität zu erreichen.
Das Abrufen einer Kostenpfadanalyse in ArcObjects war mit den .NET- Methoden ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , insbesondere den Methoden CostDistanceFull () und CostPath (), relativ einfach .
Einige Code-Schnipsel, wie ich Dinge mache:
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);
Eine Kostenpfadanalyse in ArcPy (mit sa.CostDistance und sa.CostPath) dauert ca. 15-20 Sekunden. Bei Verwendung der exakt gleichen Eingaben dauert die auf ArcObjects basierende Routine 55-60 Sekunden. Auch die Verwendung des .NET-Geoprozessors ist deutlich langsamer als arcpy.
Ich denke meine Fragen hier sind:
- Zeigen die ArcPy- und ArcObjects-Implementierungen auf dieselbe Codebasis (über ihre Python- und .NET-Wrapper)?
- Gibt es Tipps zur Optimierung der ArcObject-basierten Kostenpfadanalyse?
quelle
Antworten:
Ich glaube, das liegt daran, dass Ihr Python ArcPy zum Aufrufen von Geoverarbeitungs-Tasks verwendet, die in 64-Bit-Prozessen ausgeführt werden . ArcObjects wird in 32-Bit-Prozessen ausgeführt .
quelle