1 加载数据
Basemap.CreateXxx()获得)x:Name获得MapView对象,设置它的Map成员属性为第1步中创建的Map对象Map pMap = new Map();
pMap.Basemap = Basemap.CreateTopographic();
MyMapView.Map = pMap;
在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>
String filePath = "/home/test.shp"
ShapefileFeatureTable shapefile = await ShapefileFeatureTable.OpenAsync(filePath);
FeatureLayer featurelayer = new FeatureLayer(shapefile);
MainMapView.Map.OperationalLayers.Add(featurelayer);
加载shp后可能因为数据范围比较小,而底图默认范围是全球,导致虽然加载成功,但是在图中却看不到的情况。所以需要用代码把显示范围调整到shp的范围处。
FullExtent()函数获取,也可以通过shapefile对象的Extent属性获得await MainMapView.SetViewpointGeometryAsync(featurelayer.FullExtent); //方法一
await MainMapView.SetViewpointGeometryAsync(shapefile.Extent); //方法二
Raster raster = new Raster("test.tif");
RasterLayer rasterLayer = new RasterLayer(raster);
MyMapView.Map.OperationalLayers.Add(rasterLayer);
首先肯定是需要先放一个新的MapView控件,并且为这个控件初始化一个基础的地图,参考1.1 加载ESRI在线底图,这里不再赘述,主要说的是在鹰眼地图中显示范围指示器的实现思路。
OnViewpointChanged事件,只要主地图视图范围发生了改变(例如缩放、移动)就会触发Polygon类的对象),获取方法同1.2.2 视点调整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);
按属性查询实际上就是用SQL语句查询,使用图层层面的SelectFeaturesAsync方法,实现思路为:
QueryParameters查询参数对象WhereClause为要查询的SQL语句(字符串类型)SelectFeaturesAsync方法,传入QueryParameters和查询模式枚举,执行查询操作QueryParameters pQueryP = new QueryParameters();
pQueryP.WhereClause = "Name = '广州市'";
await _featureLayer.SelectFeaturesAsync(pQueryP,SelectionMode.New);
FeatureQueryResult pQueryResult = await featureLayer.GetSelectedFeaturesAsync();
可以通过响应MapView的GeoViewTapped事件获取所点击的位置进行点击查询,也可以通过其它方法获取一个Geometry对象作为按位置查询的参考依据
QueryParameters查询参数对象Geometry,可以是点、线、面、包络矩形框等,作为查询位置的依据,可以使用NEW来创建,也可以通过读取其它Feature的Geometry获得SelectFeaturesAsync方法,传入QueryParameters和查询模式枚举,执行查询操作QueryParameters pQueryPara = new QueryParameters();
pQueryPara.Geometry = /*查询位置依据*/;
pQueryPara.SpatialRelationship = SpatialRelationship.Intersects;
await _featureLayer.SelectFeaturesAsync(pQueryPara, SelectionMode.New);
FeatureQueryResult pQueryResult = await featureLayer.GetSelectedFeaturesAsync();
Identify查询只能传入一个点和容差值,其执行是在MapView层面进行的,而不是图层Layer的层面
IdentifyLayerResult myIdentifyResult = await MyMapView.IdentifyLayerAsync(pFLayer, pPoint, 20, false);
Feature identifiedFeature = (Feature)myIdentifyResult.GeoElements[0];
此处主要说明调整图层顺序的实现思路,假设要将A图层移动至B图层的位置
LayerCollection featureLayers = MyMapView.Map.OperationalLayers;
Layer sourceLayer = ALayer;
featureLayers.Remove(sourceLayer);
int targerIndex = GetLayerIndex(targetLayer);
featureLayers.Insert(targerIndex+1, sourcLayer);