1 加载数据

1.1 加载ESRI在线底图

1.1.1 加载在线底图一般流程

  1. New一个Map类的对象
  2. 设置此Map对象的Basemap属性为一个Basemap类的对象(此对象可以调用Basemap类的静态方法Basemap.CreateXxx()获得)
  3. 直接通过xaml中的x:Name获得MapView对象,设置它的Map成员属性为第1步中创建的Map对象
Map pMap = new Map();
pMap.Basemap = Basemap.CreateTopographic();
MyMapView.Map = pMap;

1.1.2 其它方法

在xaml中写死Source

<esri:Basemap Name="Basemap">
	<esri:ArcGISTiledLayer name="World Topographic" Source="https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer"/>
</esri:Basemap>

同样遵循MapView>Map>Basemap的层级关系,也就是说在上述代码外面要依次套上<esri:Map><esri:MapView>

1.2 加载shp数据

1.2.1 核心过程

  1. 获得要加载的shp的文件路径
  2. 打开shp为ShapefileFeatureTable类的一个对象,使用的是这个类的一个静态方法OpenAsync
  3. 把这个对象传入FeatureLayer类的构造函数中得到一个FeatureLayer类的对象
  4. 把这个FeatureLayer类的对象添加到Map的OperationalLayers里面
String filePath = "/home/test.shp"
ShapefileFeatureTable shapefile = await ShapefileFeatureTable.OpenAsync(filePath);
FeatureLayer featurelayer = new FeatureLayer(shapefile);
MainMapView.Map.OperationalLayers.Add(featurelayer);

1.2.2 视点调整

加载shp后可能因为数据范围比较小,而底图默认范围是全球,导致虽然加载成功,但是在图中却看不到的情况。所以需要用代码把显示范围调整到shp的范围处。

  1. 获取一个范围Extent对象,实际上是一个能框住目标的最小水平矩形框,可以通过FeatureLayer的FullExtent()函数获取,也可以通过shapefile对象的Extent属性获得
  2. 设置MapView对象的Viewpoint为这个Extent
await MainMapView.SetViewpointGeometryAsync(featurelayer.FullExtent);  //方法一

await MainMapView.SetViewpointGeometryAsync(shapefile.Extent);  //方法二

1.3 加载栅格数据

  1. 新建Raster对象,传入文件路径
  2. 新建RasterLayer对象,传入Raster对象
  3. 将RasterLayer对象添加至Map对象的OperationalLayers中
Raster raster = new Raster("test.tif");
RasterLayer rasterLayer = new RasterLayer(raster);
MyMapView.Map.OperationalLayers.Add(rasterLayer);

1.4 实现鹰眼地图

首先肯定是需要先放一个新的MapView控件,并且为这个控件初始化一个基础的地图,参考1.1 加载ESRI在线底图,这里不再赘述,主要说的是在鹰眼地图中显示范围指示器的实现思路。

  1. 响应主MapView控件的OnViewpointChanged事件,只要主地图视图范围发生了改变(例如缩放、移动)就会触发
  2. 获取主地图可见范围(是一个Polygon类的对象),获取方法同1.2.2 视点调整
  3. 用此polygon新建一个Graphic对象
  4. 将Graphic对象添加至新建的GraphicsOverlay对象
  5. 将GraphicOverlay对象添加至鹰眼图MapView的GraphicOverlays属性中
Polygon visibleArea = MyMapView.VisibleArea;
var envGraphic = new Esri.ArcGISRuntime.UI.Graphic(visibleArea, fillSymbol); //此处还需要传入一个符号,否则范围指示器显示不出来
var graphicOverlay = new Esri.ArcGISRuntime.UI.GraphicsOverlay();
graphicOverlay.Graphics.Add(envGraphic);
EagleMapView.GraphicsOverlays.Add(graphicOverlay);

看到代码中还需要传入一个fillSymbol来设置范围指示器的符号样式,我们希望的是无填充,虚线红色边框,所以使用下面的代码,关于符号系统的介绍详见2 符号绘制及符号系统

Color lineColor = Color.FromArgb(255, 255, 0, 0);  
SimpleLineSymbol lineSymbol =  
    new SimpleLineSymbol(SimpleLineSymbolStyle.Dash, lineColor, 2.0);  
Color fillColor = Color.FromArgb(0, 0, 0, 0);  
SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbolStyle.Solid, fillColor, lineSymbol);

2 要素查询

2.1 SelectFeature查询

2.1.1 按属性查询

按属性查询实际上就是用SQL语句查询,使用图层层面的SelectFeaturesAsync方法,实现思路为:

  1. 新建一个QueryParameters查询参数对象
  2. 设置此QueryParameters对象的WhereClause为要查询的SQL语句(字符串类型)
  3. 调用图层对象的SelectFeaturesAsync方法,传入QueryParameters和查询模式枚举,执行查询操作
  4. 获取查询结果
QueryParameters pQueryP = new QueryParameters();
pQueryP.WhereClause = "Name = '广州市'";
await _featureLayer.SelectFeaturesAsync(pQueryP,SelectionMode.New);
FeatureQueryResult pQueryResult =  await featureLayer.GetSelectedFeaturesAsync();

2.1.2 按位置查询

可以通过响应MapView的GeoViewTapped事件获取所点击的位置进行点击查询,也可以通过其它方法获取一个Geometry对象作为按位置查询的参考依据

  1. 新建一个QueryParameters查询参数对象
  2. 设置此QueryParameters的Geometry,可以是点、线、面、包络矩形框等,作为查询位置的依据,可以使用NEW来创建,也可以通过读取其它Feature的Geometry获得
  3. 设置QueryParameters的SpatialRelationship,指定被查询的要素与上一步的Geometry满足什么样的空间关系(例如:相交、包含等)时需要被查询到
  4. 调用图层对象的SelectFeaturesAsync方法,传入QueryParameters和查询模式枚举,执行查询操作
  5. 获取查询结果
QueryParameters pQueryPara = new QueryParameters();
pQueryPara.Geometry = /*查询位置依据*/;
pQueryPara.SpatialRelationship = SpatialRelationship.Intersects;
await _featureLayer.SelectFeaturesAsync(pQueryPara, SelectionMode.New);
FeatureQueryResult pQueryResult = await featureLayer.GetSelectedFeaturesAsync();

2.2 Identify查询

Identify查询只能传入一个点和容差值,其执行是在MapView层面进行的,而不是图层Layer的层面

  1. 直接对MapView执行IdentifyLayerAsync,传入图层、点、容差以及是否弹出提示框四个参数
  2. 查询结果都在函数的返回结果中,一般我们要的内容在GeoElements属性中,这是一个列表,可获取第一项,即可强制转换为Feature类型进行进一步的操作
IdentifyLayerResult myIdentifyResult = await MyMapView.IdentifyLayerAsync(pFLayer, pPoint, 20, false);
Feature identifiedFeature = (Feature)myIdentifyResult.GeoElements[0];

3 图层管理器

3.1 图层顺序调整

此处主要说明调整图层顺序的实现思路,假设要将A图层移动至B图层的位置

  1. 通过Map.OperationalLayers获取图层列表
  2. 先弄个变量暂存A图层,然后移除A图层
  3. 获取B图层的下标(也就是序号)
  4. 调用OperationalLayers的Insert方法插入A图层
LayerCollection featureLayers = MyMapView.Map.OperationalLayers;
Layer sourceLayer = ALayer;
featureLayers.Remove(sourceLayer);
int targerIndex = GetLayerIndex(targetLayer);
featureLayers.Insert(targerIndex+1, sourcLayer);

3.2 其他图层操作

  1. 设置featureLayer的IsVisible属性为true或false控制显示和隐藏
  2. 调用Map对象的OperationalLayers属性的Remove方法移除图层