前段時間研究了下 arcgis runtime sdk .net 二次開發··這裡做個筆記 runtime版本為100.6 基於WPF 開發 命名空間引入 基本只用到了mapview這個控制項和相關的對象,下邊把預設的背景網格去了,改了背景色,mapview的map對象是依賴屬,性支持綁定的,可直接綁 ...
前段時間研究了下 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這個對象實現了很多操作。