ArcGIS RunTime Sdk +WPF 基础地图显示

1 简单的地图展示

ArcGISRunTime 的平面地图展示主要依赖MapView这个控件,MapView是地图的容器,Map主要是图层的集合

(注:三维场景的显示主要依赖SceneView这个控件)

 

[csharp] view plain copy
 
  1. <esri:MapView x:Name="MyMapView" WrapAround="True">  
  2.             <esri:Map >  
  3.                 <esri:ArcGISTiledMapServiceLayer  
  4.                     ServiceUri="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />  
  5.             </esri:Map>  
  6.         </esri:MapView>  

 

简单的地图显示就已经OK了,但是此时我想展示某个地方的地图,也就是说我不想一上来就展示世界地图,好,接着看下面

2 设置初始视角及范围

(1)分别设置最小点的最大点的坐标即可

[csharp] view plain copy
 
  1. <esri:MapView x:Name="MyMapView" WrapAround="True">  
  2.           <esri:Map >  
  3.               <esri:Map.InitialViewpoint>  
  4.                   <esri:ViewpointExtent XMin="104.082686" YMin="30.695853" XMax="104.382686" YMax="30.718530" SpatialReferenceID="4326" />  
  5.               </esri:Map.InitialViewpoint>  
  6.               <esri:ArcGISTiledMapServiceLayer  
  7.                   ServiceUri="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />  
  8.           </esri:Map>  
  9.       </esri:MapView>  

注:SpatialReferenceID="4326" 4326是WGS 84投影的代号

3我想要达到如图这种自定义控件跟着我的地理坐标实时互动统一应该怎么做呢

正确姿势:使用OverlayItemsControl ,然后利用MapView.ViewOverlayAnchor 指定UI控件(如Grid)在地图上的定位锚点(地理位置)

 

4经向环绕

 

平面地图都是从经度-180展开到180,如果你要同时浏览东西经180的数据就很不方便,因此在v1.8中新增加了经向环绕“Wrap Around”的设置,使得地图数据在东西向平移时无缝环绕。

[csharp] view plain copy
 
  1. <esri:MapView x:Name="mapStreets" WrapAround="True">  
  2.           <esri:Map>  
  3.               <esri:ArcGISTiledMapServiceLayer  
  4.                   ServiceUri="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />  
  5.           </esri:Map>  
  6.       </esri:MapView>  

但是由于设置了经向环绕,所以从屏幕获得的坐标要经过标准化normalize

Geometry Engine里提供了该方法normalizeCentralMeridian

[csharp] view plain copy
 
  1. var normalizedPoint = GeometryEngine.NormalizeCentralMeridian(e.Location);  
  2.             var projectedCenter = GeometryEngine.Project(normalizedPoint, SpatialReferences.Wgs84) as MapPoint;  

当然如果你考虑最大范围覆盖全球或者投影支持Wgs84以及Web Mercator 你可以考虑添加经向环绕

5 以上的地图都是加载网上的地图,能不能加载本地的数据呢?

答案当然是可以的,ArcGIS RunTime支持从本地读取Shapefile  Geodatabase

那么最后能不能以服务的形式加载本地数据呢?这个也是可以的

不过官方会提示你仅供开发调试使用

[csharp] view plain copy
 
  1. LocalMapService localMapService = new LocalMapService(@"\maps\xx.mpk");  
  2.                await localMapService.StartAsync();  
  3.   
  4.                ArcGISDynamicMapServiceLayer arcGISDynamicMapServiceLayer = new ArcGISDynamicMapServiceLayer()   
  5.                {  
  6.                    ID = "arcGISDynamicMapServiceLayer",  
  7.                    ServiceUri = localMapService.UrlMapService,  
  8.                };  
  9.   
  10.             MyMapView.Map.Layers.Add(arcGISDynamicMapServiceLayer);  

 

类比要素服务也可以在本地被创建这种以访问本地服务的方式访问本地数据与远程服务并没有太大差异  



posted @ 2017-12-21 14:43  黑暗时代地表人  阅读(1844)  评论(0编辑  收藏  举报