Walaupun saya menggunakan python untuk membuat skrip / layanan geoproses, saya mendapat kesan bahwa menggunakan ArcObjects untuk melakukan operasi yang setara akan memiliki kinerja yang lebih baik.
Saya telah memposting ArcGIS Server GP Service - RasterIO.dll menabrak ArcSOC.exe dan ArcGIS Geoprocessing Script berjalan dengan baik di Desktop tetapi macet sebagai Layanan Geoprocessing? selama beberapa hari terakhir tentang mendapatkan skrip geoproses yang menggunakan alat Spatial Analyst untuk bekerja sebagai layanan geoproses. Tenggat waktu saya semakin dekat, jadi saya memutuskan untuk mengambil rute SOE untuk mencapai fungsionalitas yang diinginkan.
Mendapatkan analisis jalur biaya di ArcObjects relatif mudah menggunakan .NET ESRI.ArcGIS.SpatialAnalyst.RasterDistanceOpClass , khususnya Metode CostDistanceFull () dan CostPath ().
Beberapa cuplikan kode tentang cara saya melakukan sesuatu:
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);
Analisis jalur biaya di ArcPy (menggunakan sa.CostDistance dan sa.CostPath) membutuhkan waktu sekitar 15-20 detik. Menggunakan input yang sama persis, rutin berbasis ArcObjects membutuhkan waktu 55-60 detik. Bahkan menggunakan .NET Geoprocessor secara signifikan lebih lambat daripada arcpy.
Saya kira pertanyaan saya di sini adalah:
- Apakah implementasi ArcPy dan ArcObjects menunjuk pada basis kode yang sama (melalui pembungkus Python dan .NET)?
- Adakah tips untuk mengoptimalkan analisis Cost Path berbasis ArcObject?