前段时间研究了下 arcgis runtime sdk .net 二次开发··这里作个笔记网络
runtime版本为100.6 基于WPF 开发curl
命名空间引入async
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版受权,能够去掉水印,url
这个lite版受权有不少限制,好比不能加载本地地图。下边代码为使用开发者受权license代码spa
//使用lite版license //去掉水印 var res = Esri.ArcGISRuntime.ArcGISRuntimeEnvironment.SetLicense("你的受权license");
加载地图:大部分的地图操做都封装在Map对象中,初始化的时候可使用BaseMap对象建立地图有arcgis内置的不少网络地图,可直接加载到BaseLayer中,这里不展现.net
一 加载天地图地图rest
这里展现直接加载天地图的网络地图到basemap的图层中,由于新版天地图服务须要token,须要开发者本身申请帐户,申请后可将申请token放在地址中便可,code
下边为加载矢量地图的代码,加载影像和地形图相似,须要吧关键字换成对应的就能够了,天地图有备用的好几个域名的,能够传一个list,这里写死了t0orm
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这个对象实现了不少操做。