AE开发第10天

今天实现了一个挺好玩的功能

首先是给地图加了一个显示比例尺的功能

可以在地图中心显示比例尺

  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;
        }

蛮好玩的功能,大家可以参考。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值