今天实现了一个挺好玩的功能
首先是给地图加了一个显示比例尺的功能
可以在地图中心显示比例尺
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.DataSourcesFile;
using ESRI.ArcGIS.DataSourcesRaster;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geometry;
using Microsoft.VisualBasic;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.SpatialAnalyst;
using ESRI.ArcGIS.GeoAnalyst;
using System.Diagnostics;
using ESRI.ArcGIS.Display;
private void MainMapControl_OnExtentUpdated(object sender, EventArgs e)
{
// 添加图幅比例尺
ShowScaleOnMap(MainMapControl);
}
// 获取地图当前的比例尺
private double GetMapScale(IMap map)
{
if (map != null && map.LayerCount > 0)
{
return map.MapScale;
}
else
{
// 地图尚未准备好,返回一个默认值或者抛出异常
throw new Exception("地图尚未加载或不包含图层。");
}
}
// 在地图上显示比例尺
private void ShowScaleOnMap(AxMapControl mapControl)
{
// 获取地图对象
IMap map = mapControl.Map;
if (map != null)
{
// 创建要素图层
ILayer layer = new FeatureLayerClass();
layer.Name = "ScaleLayer";
// 获取当前比例尺
double scale = GetMapScale(map);
// 创建文本元素
ITextElement textElement = new TextElementClass();
textElement.Text = "Scale: 1:" + scale.ToString(); // 设置文本内容
IElement element = textElement as IElement;
// 设置文本元素的位置
IPoint point = new PointClass();
point.PutCoords(50, 50); // 设置比例尺显示的位置
element.Geometry = point;
// 将文本元素添加到图层
IGraphicsContainer graphicsContainer = layer as IGraphicsContainer;
graphicsContainer.AddElement(element, 0);
// 将图层添加到地图
map.AddLayer(layer);
}
}
然后第二个功能就是根据地图比例尺的变化,改变图层的颜色
// 设置图层渲染
private void SetLayerRenderer(ILayer layer)
{
IMap map = MainMapControl.Map;
double scale = GetMapScale(map);
// 创建符号化渲染规则
IFeatureRenderer featureRenderer = CreateRenderer(scale);
// 获取图层样式属性
IGeoFeatureLayer geoFeatureLayer = layer as IGeoFeatureLayer;
// 设置图层渲染
geoFeatureLayer.Renderer = featureRenderer;
// 刷新地图控件,使得新的渲染器生效
MainMapControl.Refresh();
}
private void MainMapControl_OnExtentUpdated(object sender, IMapControlEvents2_OnExtentUpdatedEvent e)
{
// 获取要重新设置渲染的图层对象
IFeatureLayer featureLayer = MainMapControl.get_Layer(0) as IFeatureLayer; // 假设第一个图层是要重新设置渲染的图层
SetLayerRenderer(featureLayer);
// 刷新地图控件,使得新的渲染器生效
MainMapControl.Refresh();
}
// 创建符号化渲染规则
private IFeatureRenderer CreateRenderer(double scale)
{
// 创建符号化渲染规则,这里可以根据需要进行设置
ISimpleFillSymbol symbol = new SimpleFillSymbolClass();
if (scale <= 10000000 && scale > 7500000)
{
// 比例尺小于100000时使用蓝色填充
symbol.Color = GetRgbColor(0, 0, 255); // 蓝色
}
else if (scale <= 7500000 && scale > 5000000)
{
// 比例尺小于750000时使用黄色填充
symbol.Color = GetRgbColor(255, 255, 0); // 黄色
}
else if (scale <= 5000000 && scale > 1000000)
{
// 比例尺小于500000时使用绿色填充
symbol.Color = GetRgbColor(0, 255, 0); // 绿色
}
else if (scale <= 1000000 && scale > 500000)
{
// 比例尺小于100000时使用紫色填充
symbol.Color = GetRgbColor(128, 0, 128); // 紫色
}
else if (scale <= 500000)
{
// 比例尺小于50000时使用橙色填充
symbol.Color = GetRgbColor(255, 165, 0); // 橙色
}
else
{
// 比例尺大于等于500000时使用红色填充
symbol.Color = GetRgbColor(255, 0, 0); // 红色
}
// 将简单填充符号转换为符号接口类型
ISymbol fillSymbol = symbol as ISymbol;
// 创建简单渲染符号
ISimpleRenderer simpleRenderer = new SimpleRendererClass();
simpleRenderer.Symbol = fillSymbol;
// 刷新地图控件,使得新的渲染器生效
MainMapControl.Refresh();
return simpleRenderer as IFeatureRenderer;
}
// 获取 RGB 颜色对象
private IRgbColor GetRgbColor(int red, int green, int blue)
{
IRgbColor rgbColor = new RgbColorClass();
rgbColor.Red = red;
rgbColor.Green = green;
rgbColor.Blue = blue;
return rgbColor;
}
蛮好玩的功能,大家可以参考。