Chociaż używam Pythona do tworzenia skryptów / usług geoprzetwarzania, miałem wrażenie, że użycie ArcObjects do wykonania równoważnych operacji będzie miało lepszą wydajność.
Mam pisał ArcGIS Server GP Service - RasterIO.dll upaść ArcSOC.exe i ArcGIS Geoprzetwarzania Skrypt działa dobrze w Pulpicie ale wywala jak Geoprzetwarzania Service? w ciągu ostatnich kilku dni na temat uzyskiwania skryptów geoprzetwarzania, które używają narzędzi Spatial Analyst do pracy jako usługi geoprzetwarzania. Mój termin zbliża się bardzo szybko, więc postanowiłem pójść drogą SOE, aby osiągnąć pożądaną funkcjonalność.
Uzyskanie analizy ścieżki kosztów w ArcObjects było stosunkowo proste przy użyciu metod .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , w szczególności metod CostDistanceFull () i CostPath ().
Niektóre fragmenty kodu dotyczące tego, jak to robię:
Pyton
# 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")
DO#
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);
Analiza ścieżki kosztów w ArcPy (przy użyciu sa.CostDistance i sa.CostPath) zajmuje około 15-20 sekund. Wykorzystując dokładnie te same dane wejściowe, procedura oparta na ArcObjects zajmuje 55-60 sekund. Nawet korzystanie z Geoprocesora .NET jest znacznie wolniejsze niż arkowanie.
Myślę, że moje pytania są następujące:
- Czy implementacje ArcPy i ArcObjects wskazują na tę samą bazę kodu (poprzez ich opakowania w Pythonie i .NET)?
- Wszelkie wskazówki dotyczące optymalizacji analizy ścieżki kosztów opartej na ArcObject?
źródło
Odpowiedzi:
Uważam, że dzieje się tak, ponieważ Twój Python używa ArcPy do wywoływania zadań Geoprocessing, które są uruchomione w procesach 64-bitowych . ArcObjects dzieje się w procesach 32-bitowych .
źródło