Хотя я использую python для создания сценариев / сервисов геообработки, у меня сложилось впечатление, что использование ArcObjects для выполнения эквивалентных операций будет иметь более высокую производительность.
Я разместил сервис ArcGIS Server GP - RasterIO.dll приводит к сбою ArcSOC.exe и скрипта геообработки ArcGIS в рабочем столе, но работает как сервис геообработки? за последние пару дней о получении скриптов геообработки, которые используют инструменты Spatial Analyst для работы в качестве сервисов геообработки. Мой крайний срок быстро приближается, поэтому я решил пойти по пути SOE для достижения желаемой функциональности.
Получение анализа пути затрат в ArcObjects было относительно простым с использованием .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , в частности методов CostDistanceFull () и CostPath ().
Некоторые фрагменты кода того, как я делаю вещи:
питон
# 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);
Анализ пути затрат в ArcPy (с использованием sa.CostDistance и sa.CostPath) занимает около 15-20 секунд. Используя точно такие же входные данные, процедура на основе ArcObjects занимает 55-60 секунд. Даже использование .NET Geoprocessor значительно медленнее, чем arcpy.
Я думаю, мои вопросы здесь:
- Указывают ли реализации ArcPy и ArcObjects на одну и ту же базу кода (через свои обертки Python и .NET)?
- Любые советы по оптимизации анализа пути затрат на основе ArcObject?
источник
Ответы:
Я считаю, что это потому, что ваш Python использует ArcPy для вызова задач геообработки, которые выполняются в 64-битных процессах . ArcObjects происходит в 32-битных процессах .
источник