Arcgis runtime sdk .net 二次開發

前段時間研究了下 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這個對象實現了不少操做。

相關文章
相關標籤/搜索