前段時間研究了下 arcgis runtime sdk .net 二次開發··這里做個筆記
runtime版本為100.6 基於WPF 開發
命名空間引入
xmlns:esri="http://schemas.esri.com/arcgis/runtime/2013"
基本只用到了mapview這個控件和相關的對象,下邊把默認的背景網格去了,改了背景色,mapview的map對象是依賴屬,性支持綁定的,可直接綁定
<esri:MapView x:Name="MyMapView" Map="{Binding Path=MainMap}"> <esri:MapView.BackgroundGrid> <esri:BackgroundGrid Color="yellow" IsVisible="False"/> </esri:MapView.BackgroundGrid> </esri:MapView>
可直接在nuget上安裝arcgis runtime ,直接安裝arcgis的 WPF開發包會自動安裝runtime的包,默認為開發者授權,是有開發者水印的,可以申請為arcgis開發者,有lite版授權,可以去掉水印,
這個lite版授權有很多限制,比如不能加載本地地圖。下邊代碼為使用開發者授權license代碼
//使用lite版license //去掉水印 var res = Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.SetLicense("你的授權license");
加載地圖:大部分的地圖操作都封裝在Map對象中,初始化的時候可以使用BaseMap對象創建地圖有arcgis內置的很多網絡地圖,可直接加載到BaseLayer中,這里不展示
一 加載天地圖地圖
這里展示直接加載天地圖的網絡地圖到basemap的圖層中,因為新版天地圖服務需要token,需要開發者自己申請賬戶,申請后可將申請token放在地址中即可,
下邊為加載矢量地圖的代碼,加載影像和地形圖類似,需要吧關鍵字換成對應的就可以了,天地圖有備用的好幾個域名的,可以傳一個list,這里寫死了t0
public void LoadTDTLayer() { //tempurl string vecurl = "http://t0.tianditu.gov.cn/vec_c/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=vec&tileMatrixSet=c&TileMatrix={level}&TileRow={row}&TileCol={col}&style=default&format=tiles&tk=自己的token"; string cvaurl = "http://t0.tianditu.gov.cn/cva_c/wmts?service=wmts&request=GetTile&version=1.0.0&LAYER=cva&tileMatrixSet=c&TileMatrix={level}&TileRow={row}&TileCol={col}&style=default&format=tiles&tk=自己的token"; //切片比例尺 List<LevelOfDetail> levels = new List<LevelOfDetail>() { new LevelOfDetail(1, 0.703125, 295497593.05875003), new LevelOfDetail(2, 0.3515625, 147748796.52937502), new LevelOfDetail(3, 0.17578125, 73874398.264687508), new LevelOfDetail(4, 0.087890625, 36937199.132343754), new LevelOfDetail(5, 0.0439453125, 18468599.566171877), new LevelOfDetail(6, 0.02197265625, 9234299.7830859385), new LevelOfDetail(7, 0.010986328125, 4617149.8915429693), new LevelOfDetail(8, 0.0054931640625, 2308574.9457714846), new LevelOfDetail(8, 0.00274658203125, 1154287.4728857423), new LevelOfDetail(10, 0.001373291015625, 577143.73644287116), new LevelOfDetail(11, 0.0006866455078125, 288571.86822143558), new LevelOfDetail(12, 0.00034332275390625, 144285.93411071779), new LevelOfDetail(13, 0.000171661376953125, 72142.967055358895), new LevelOfDetail(14, 8.58306884765625e-005, 36071.483527679447), new LevelOfDetail(15, 4.291534423828125e-005, 18035.741763839724), new LevelOfDetail(16, 2.1457672119140625e-005, 9017.8708819198619), new LevelOfDetail(17, 1.0728836059570313e-005, 4508.9354409599309), new LevelOfDetail(18, 5.3644180297851563e-006, 2254.4677204799655), new LevelOfDetail(19, 2.6822090148925781e-006, 1127.2338602399827), new LevelOfDetail(20, 1.3411045074462891e-006, 563.61693011999137) }; //投影 SpatialReference sp = new SpatialReference(4490); var tileInfo = new TileInfo(90, TileImageFormat.Mixed, levels, new MapPoint(-180, 90, sp), sp, 256, 256); var env = new Envelope(72, 3, 136, 54, sp);//預設中國 區域 var vecLayer = new WebTiledLayer(vecurl, tileInfo, env);//底圖 _mainMap.Basemap.BaseLayers.Add(vecLayer);//這里加到底圖里邊 var cvaLayer = new WebTiledLayer(cvaurl, tileInfo, env);//注記 _mainMap.Basemap.BaseLayers.Add(cvaLayer);//這里加到底圖里邊 }
二加載本地地圖
這里以加載shp文件為實例,其他的應該只需要換對應的layer對象加載就可以了,使用lite版授權不能加載本地文件
實例加載了shp文件和本地的tif影像,這里加到了map的OperationalLayers中
public async Task<FeatureLayer> LoadMap(string file) { try { //加載本地shp文件 var filepath = $"{LocalConfig.Instance.StatMapDir}\\{file}.shp"; ShapefileFeatureTable myShapefile = await ShapefileFeatureTable.OpenAsync(filepath); FeatureLayer newFeatureLayer = new FeatureLayer(myShapefile); _mainMap.OperationalLayers.Clear(); _mainMap.OperationalLayers.Add(newFeatureLayer); newFeatureLayer.Opacity = 1; newFeatureLayer.ShowInLegend = true; //加載tif Raster raster = new Raster(LocalConfig.Instance.TifPath); RasterLayer rasterLayer = new RasterLayer(raster); rasterLayer.Name = "tifLayer"; IEnumerable<Color> colors = ConstructColors(3, Color.Gold); ColormapRenderer colormapRenderer = new ColormapRenderer(colors); rasterLayer.Renderer = colormapRenderer; rasterLayer.Opacity = 0.6; _mainMap.OperationalLayers.Add(rasterLayer); return newFeatureLayer; } catch (Exception ex) { System.Windows.MessageBox.Show(ex.Message); } return null; }
三 加載arcserver中的地圖服務
可單獨加載服務中的圖層服務或者直接加載地圖服務,
比如地圖服務地址 http://{serverhost}:6080/arcgis/rest/services/{目錄}/{服務名}/MapServer
圖層服務地址http://{serverhost}:6080/arcgis/rest/services/{目錄}/{服務名}/MapServer/{圖層索引} ,圖層索引一般是自動生成比如1,2,3....
//從 arcserver加載地圖服務,這種是直接加載服務 不支持圖層,支持切片, //用serviceLayer加載支持查詢,但是不能添加到map對象 public void LoadServerImag() { var url = new Uri(string.Format(LocalConfig.Instance.ImagePath)); var imgLayer = new ArcGISMapImageLayer(url); _mainMap.OperationalLayers.Insert(0, imgLayer); } //從arcgserver 加載圖層服務,可以直接加載某個圖層類似加載本地shp服務,但是不支持某些查詢操作,具體得自己試下 public async void LoadServerFeaturlayer() { var uri = new Uri(string.Format(LocalConfig.Instance.ServerFeaturePath)); var layer = new ServiceFeatureTable(uri); var feature = new FeatureLayer(layer); feature.RenderingMode = FeatureRenderingMode.Automatic; feature.IsVisible = false; _mainMap.OperationalLayers.Insert(0, feature); //查詢 這里支持查詢 QueryParameters queryStates = new QueryParameters { WhereClause = "1=1" }; var features = await feature.FeatureTable.QueryFeaturesAsync(queryStates); }
四 繪圖圖層
可以支持在控件上繪制簡單圖形,這里以畫方框為例,創建GraphicsOverlay對象,這個圖層是直接加到mapview對象中的
//畫圖圖層 public void LoadGraphic() { var lineSymbol = new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Color.Red, 2.0); var locationOverlay = new GraphicsOverlay { Id = "TapPoints", Renderer = new SimpleRenderer(lineSymbol) }; //畫一個方形區域 SpatialReference sp = new SpatialReference(4490); var envelope = new Envelope(72, 3, 136, 54, sp);//預區域 locationOverlay.Graphics.Clear(); Graphic graphic = new Graphic(envelope); locationOverlay.Graphics.Add(graphic); //直接添加到圖層 //MyMapView.GraphicsOverlays.Add(model.LocationsOverlay); }
其他相關:
1 其他的比如注記和符號 類似之前的arcgis object 二次開發中的對象只是換了個名字,加載方式不一樣基本類似,可以設置不同的符號和注記
2 符號的關鍵字為Symbol,注記關鍵字為Label,可以搜相關對象對應實現即可
3 另可搜一個arcgis.toolkit 的項目 里邊為arcgis實現的一些簡單工具比如測量之類的可按這個實例實現自己的功能,里邊主要依賴SketchEditor這個對象實現了很多操作。
