如何在ArcGIS .NET SDK离线地图中添加城市名称?能否用FeatureLayer实现?
解决ArcGIS .NET SDK离线地图添加城市、街道及名称要素的问题
你可以通过FeatureLayer实现离线要素(城市、街道、名称等)的显示,但需要提前准备好对应的离线要素数据(比如GeoPackage、Shapefile格式),以下是具体实现步骤:
1. 准备离线要素数据
首先需要导出包含城市边界、街道线、名称属性的离线要素数据集,推荐使用GeoPackage格式(ArcGIS生态对其离线支持完善)。你可以通过ArcGIS Pro将在线要素图层或本地要素导出为GeoPackage,确保导出的数据包含需要显示的属性字段(如街道名称STREET_NAME、城市名称CITY_NAME等)。
2. 加载离线要素到FeatureLayer
以GeoPackage为例,将要素数据加载到FeatureLayer,并添加到地图的操作图层中(与现有WebTiledLayer底图叠加):
完整示例代码
// 原有WebTiledLayer底图代码 const string tilePath = @"C:\map\{level}\{col}\{row}.png"; WebTiledLayer webLayer = new(tilePath); Basemap baseMap = new(); baseMap.BaseLayers.Add(webLayer); Map map = new Map(baseMap); // 新增:加载GeoPackage中的街道要素 string gpkgPath = @"C:\map\offline_features.gpkg"; using (var gpkg = await GeoPackage.OpenAsync(gpkgPath)) { // 获取街道要素表(假设表名为"streets") FeatureTable streetTable = gpkg.FeatureTables.First(t => t.TableName == "streets"); // 创建街道FeatureLayer FeatureLayer streetLayer = new(streetTable); // 设置街道渲染:蓝色线,宽度2 SimpleLineSymbol streetSymbol = new(SimpleLineSymbolStyle.Solid, Colors.Blue, 2); SimpleRenderer streetRenderer = new(streetSymbol); streetLayer.Renderer = streetRenderer; // 设置街道名称标注:基于STREET_NAME字段 LabelDefinition streetLabelDef = new( new ArcadeLabelExpression("$feature.STREET_NAME"), new TextSymbol(Colors.Black, 10, SimpleTextSymbolStyle.Normal) ); streetLayer.LabelDefinitions.Add(streetLabelDef); streetLayer.IsLabelsVisible = true; // 将街道图层添加到地图操作图层 map.OperationalLayers.Add(streetLayer); // 同理可加载城市面要素(示例) FeatureTable cityTable = gpkg.FeatureTables.First(t => t.TableName == "cities"); FeatureLayer cityLayer = new(cityTable); // 设置城市渲染:浅红色填充,黑色边框 SimpleFillSymbol citySymbol = new(SimpleFillSymbolStyle.Solid, Color.FromArgb(100, 255, 150, 150), new SimpleLineSymbol(SimpleLineSymbolStyle.Solid, Colors.Black, 1)); SimpleRenderer cityRenderer = new(citySymbol); cityLayer.Renderer = cityRenderer; // 设置城市名称标注 LabelDefinition cityLabelDef = new( new ArcadeLabelExpression("$feature.CITY_NAME"), new TextSymbol(Colors.DarkRed, 12, SimpleTextSymbolStyle.Bold) ); cityLayer.LabelDefinitions.Add(cityLabelDef); cityLayer.IsLabelsVisible = true; map.OperationalLayers.Add(cityLayer); } // 绑定地图到视图 _mapView.Map = map;
3. 关键说明
- 如果使用Shapefile,替换GeoPackage的加载逻辑为
ShapefileFeatureTable.OpenAsync(@"C:\map\streets.shp")即可。 - 要素表名、属性字段名需与你导出的数据集一致,代码中需对应修改。
- 可以通过调整渲染符号、标注样式,让要素与底图视觉协调。
内容的提问来源于stack exchange,提问作者anonimusBird
相关产品推荐
相关产品推荐

