Embora eu use python para criar scripts / serviços de geoprocessamento, fiquei com a impressão de que o uso do ArcObjects para realizar operações equivalentes terá melhor desempenho.
Eu publiquei o ArcGIS Server GP Service - RasterIO.dll, causando um erro fatal no ArcSOC.exe e no ArcGIS Geoprocessing Script, funciona bem na área de trabalho, mas falha como serviço de geoprocessamento? nos últimos dias, sobre como obter scripts de geoprocessamento que usam as ferramentas do Spatial Analyst para trabalhar como serviços de geoprocessamento. Meu prazo está se aproximando rapidamente, por isso decidi seguir a rota SOE para alcançar a funcionalidade desejada.
Obter uma análise de caminho de custo no ArcObjects foi relativamente simples, usando o .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , especificamente os métodos CostDistanceFull () e CostPath ().
Alguns trechos de código de como estou fazendo as coisas:
Pitão
# 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);
Uma análise de caminho de custo no ArcPy (usando sa.CostDistance e sa.CostPath) leva aproximadamente 15 a 20 segundos. Usando exatamente as mesmas entradas, a rotina baseada em ArcObjects leva de 55 a 60 segundos. Mesmo usando o geoprocessador .NET é significativamente mais lento que o arcpy.
Eu acho que minhas perguntas aqui são:
- As implementações do ArcPy e ArcObjects estão apontando para a mesma base de código (por meio de wrappers Python e .NET)?
- Alguma dica para otimizar a análise de caminho de custo baseada no ArcObject?
fonte
Respostas:
Acredito que é porque seu Python está usando o ArcPy para chamar tarefas de geoprocessamento, que estão sendo executadas em processos de 64 bits . ArcObjects acontece em processos de 32 bits .
fonte