C# 基于AE的GIS二次开发实例-----台风信息系统

设计任务

课程设计的主要任务是利用GIS公共平台提供的二次开发环境开发一套“台风GIS软件”,在遵循国家台风编码的基础上,实现台风的运动轨迹可视化,以及台风经过区域的经济损失评估。

1.获取台风的各个时刻的空间位置关系;

2.建立空间数据及属性数据库;

3.建立空间数据的查询系统;

4.实现空间分析的基本功能(包括缓冲区分析、叠加分析等);

5.提交书面报告(数据库设计、软件设计流程和软件使用说明等)和台风GIS系统软件运行程序及原始程序代码等。

空间数据库设计与建库

  1. 地图分层

素类

描述

面要素

省级面要素

线要素

台风路径

点要素

台风某时刻位置

台风登陆点

省会城市

  1. 属性库设计

地价信息表(tf_price)

属性名

字段名称

类型

是否为空

备注

省份名称

chian_name

Char(10)

Not null

地价

price

Char(20)

Not null

每平米地价

台风路径(tf_name)

属性名

字段名称

类型

是否为空

备注

台风名称

tf_name

Char(10)

Not null

路径长度

SHAPE_Length

Char(17)

Not null

台风信息表(tf_geo)

属性名

字段名称

类型

是否为空

备注

台风编号

tf_number

Char(10)

Not null

台风名

tf_name

Char(10)

Not null

时间

tf_time

Char(20)

Not null

经度

tf_lon

Char(20)

Not null

纬度

tf_lat

Char(20)

中心压强

tf_central_pressure

Char(20)

台风风速

tf_wind

Char(20)

台风风向

tf_direction

Char(20)

未来移速

tf_feature_speed

Char(20)

台风登陆信息表(tf_loacl)

属性名

字段名称

类型

是否为空

备注

台风编号

tf_number

Char(10)

Not null

台风登陆时间

tf_time

Char(20)

Not null

经度

tf_lon

Char(17)

Not null

纬度

tf_lat

Char(20)

描述

tf_text

Char(20)

系统功能设计

系统界面设计

  1. 主界面

操作界面

地图数字成果

部分代码:

1.按名称进行要素查询
/// <summary>
        /// 名称查询
        /// </summary>
        /// <param name="mapControl"></param>
        /// <param name="index">图层</param>
        /// <param name="field">字段</param>
        /// <param name="value">查询值</param>
        public static void SelectByName(IMapControlDefault mapControl,string layerName, string field, string value)
        {
            try
            {
                ClearSelection(mapControl);//清除选择
                string selectName = value.Trim();
                ILayer layer = getFeatureLayer(mapControl, layerName);//获取对应图层
                IFeatureLayer featureLayer = layer as IFeatureLayer;
                IFeatureClass featureClass = featureLayer.FeatureClass;
                IQueryFilter queryFilter = new QueryFilterClass();//查询对象实例化
                IFeatureCursor featureCursor;
                IFeature feature = null;
                string str = field + " = '" + selectName+"'" ;//创建查询语句
                queryFilter.WhereClause = str;
                featureCursor = featureClass.Search(queryFilter, true);//进行查询操作
                feature = featureCursor.NextFeature();//下一个得到查询要素
                if (null != feature)
                {
                    mapControl.Map.SelectFeature(layer, feature);//地图高亮显示
                    mapControl.Refresh(esriViewDrawPhase.esriViewGeoSelection, null, null);//刷新
                }
            }
            catch (System.Exception ex)
            {
                MessageBoxEX.Show("依据名称查询选中要素失败!"+ex);
            }
        }
2.查询指定条件下的属性表信息显示
/// <summary>
        /// 查询指定条件下的属性表信息显示,默认字段去除
        /// </summary>
        /// <param name="mapControl">map控件</param>
        /// <param name="index">图层</param>
        /// <param name="field">属性值</param>
        /// <param name="value">条件值</param>
        /// <returns>DataTable</returns>
        public static DataTable FeatureTableByName(IMapControlDefault mapControl, string lyerName, string field, string value)
        {
            DataTable pTable = new DataTable();//建立一个table
            string selectName = value.Trim();//查询条件
            try
            {
                IFeatureLayer featureLayer = getFeatureLayer(mapControl, lyerName);//获取图层
                IFields pFields = featureLayer.FeatureClass.Fields;//获取要素类字段
                int log = -1;
                for (int i = 0; i < pFields.FieldCount; i++) //FieldCount字段集合中的字段数
                {
                    pTable.Columns.Add(pFields.get_Field(i).AliasName);//datatable添加字段
                    if (pFields.get_Field(i).AliasName.ToString() == "SHAPE")
                    { log = i; }//记录“Shape”行。
                }
                //创建一个新的查询过滤器
                IFeatureClass featureClass = featureLayer.FeatureClass;
                IQueryFilter queryFilter = new QueryFilterClass();//查询
                IFeatureCursor featureCursor;
                IFeature feature = default(IFeature);
                string str = field + " = '" + selectName + "'";//查询语句
                queryFilter.WhereClause = str;
                featureCursor = featureClass.Search(queryFilter, true);//查询执行
                feature = featureCursor.NextFeature();//获取查询第一个要素
                while (feature != null)
                {
                    DataRow newRow = pTable.NewRow();
                    string featapye = feature.Shape.GeometryType.ToString();//获取要素类类型名
                    for (int i = 0; i < pFields.FieldCount; i++)
                    {
                        if (log != i)
                        {
                            newRow[i] = feature.get_Value(i).ToString();//每行要素赋值给datatable
                        }
                        else
                        {
                            newRow[i] = featapye;//要素类型赋值
                        }
                    }
                    pTable.Rows.Add(newRow);
                    feature = featureCursor.NextFeature();//下一个要素
                }
                ShowByFilter(mapControl, featureLayer, str);//只显示满足条件的要素
            }
            catch (System.Exception ex)
            {
                MessageBoxEX.Show("查询指定条件下的属性表信息失败!" + ex.Message);
            }
            return pTable;
        }
3.基于GP工具的缓冲区分析
        /// <summary>
        /// 单个缓冲区分析
        /// </summary>
        /// <param name="mapControl">map控件</param>
        /// <param name="name">文件名</param>
        /// <param name="distances">缓冲半径</param>
        public static void Buffer(IMapControlDefault mapControl,string distances,string name)
        {
            string outPath = appPath+ ""+ name + distances + "_Buffer.shp";
            IFeatureLayer featureLayer = getFeatureLayer(mapControl, "台风路径");
            Geoprocessor gp = new Geoprocessor(); //初始化Geoprocessor
            gp.OverwriteOutput = true; //允许运算结果覆盖现有文件
            try
            {
                ESRI.ArcGIS.AnalysisTools.Buffer pBuffer = new ESRI.ArcGIS.AnalysisTools.Buffer(); //定义Buffer工具
                pBuffer.in_features = featureLayer; //输入对象,既可是IFeatureLayer对象,也可是完整文件路径如“D://data.shp”
                pBuffer.out_feature_class = outPath; //输出对象,一般是包含输出文件名的完整文件路径

                //设置缓冲区的大小,即可是带单位的具体数值,如0.1 Decimal Degrees;也可是输入图层中的某个字段,如“BufferLeng”
                pBuffer.buffer_distance_or_field = "" + distances + " Kilometers"; //缓冲区参数
                pBuffer.dissolve_option = "NONE"; //支持融合缓冲区重叠交叉部分
                gp.Execute(pBuffer, null); //执行缓冲区分析
                //添加结果到窗口
                string pFolder = System.IO.Path.GetDirectoryName(outPath); //得到字符串中文件夹位置
                string pFileName = System.IO.Path.GetFileName(outPath); //得到字符串中文件名字
                mapControl.AddShapeFile(pFolder, pFileName); //往地图控件里添加文件
                mapControl.ActiveView.Refresh(); //激活窗口刷新
            }
            catch (Exception ex)
            {
                MessageBoxEX.Show("警告", "缓冲分析失败!" + ex.ToString());
            }
        }
4.唯一值生成渲染色带
/// <summary>
        /// 构建色带
        /// </summary>
        /// <param name="size">色带个数</param>
        /// <returns></returns>
        private static IAlgorithmicColorRamp GetColorRgb(int size)
        {
            IColor fromColor = null, toColor = null;
            fromColor = ConvertNETColorToAEColor(Color.Yellow);//起始颜色
            toColor = ConvertNETColorToAEColor(Color.Red);//终止颜色
            IAlgorithmicColorRamp algCR = new AlgorithmicColorRampClass();
            algCR.Size = size;//生成渲染个数
            bool nFlag;
            //设置色带生成算法
            algCR.Algorithm = esriColorRampAlgorithm.esriLabLChAlgorithm;
            algCR.FromColor = fromColor; algCR.ToColor = toColor;
            algCR.CreateRamp(out nFlag);
            return algCR;
        }

/// <summary>
        /// 唯一值渲染图层
        /// </summary>
        /// <param name="pFeatureLayer">矢量图层</param>
        /// <param name="pUniqueFieldName">唯一值字段</param>
        public static void UniqueValueRender(IMapControlDefault mapControl,string layerName, string pUniqueFieldName)
        {
            IFeatureLayer pFeatureLayer = getFeatureLayer(mapControl, layerName);//获取要素图层
            IGeoFeatureLayer pGeoLayer = pFeatureLayer as IGeoFeatureLayer;
            if (pGeoLayer == null) return;
            ITable pTable = pGeoLayer.FeatureClass as ITable;//得到属性表
            ICursor pCursor;
            IQueryFilter pQueryFilter = new QueryFilter();//查询
            pQueryFilter.AddField(pUniqueFieldName);
            pCursor = pTable.Search(pQueryFilter, true);//获取字段
            IEnumerator pEnumreator;

            //获取字段中各要素属性唯一值
            IDataStatistics pDataStatistics = new DataStatisticsClass();
            pDataStatistics.Field = pUniqueFieldName;//获取统计字段
            pDataStatistics.Cursor = pCursor;
            pEnumreator = pDataStatistics.UniqueValues;
            int fieldcount = pDataStatistics.UniqueValueCount;//唯一值个数,以此确定颜色带范围

            IUniqueValueRenderer pUniqueValueR = new UniqueValueRendererClass();
            pUniqueValueR.FieldCount = 1;//单值渲染
            pUniqueValueR.set_Field(0, pUniqueFieldName);//渲染字段
            IEnumColors pEnumColor = GetColorRgb(fieldcount).Colors;
            pEnumColor.Reset();

            while (pEnumreator.MoveNext())
            {
                string value = pEnumreator.Current.ToString();
                if (value != null)
                {
                    IColor pColor = pEnumColor.Next();
                    ISymbol pSymbol = GetDefaultSymbol(pFeatureLayer.FeatureClass.ShapeType, pColor);//获取默认符号
                    pUniqueValueR.AddValue(value, pUniqueFieldName, pSymbol);
                }
            }
            pGeoLayer.Renderer = pUniqueValueR as IFeatureRenderer;
        }

数据是中国天气网(台风)爬的

地图是自己数字化的!!!!!!

界面自己设计的

代码自己敲的,

不会的全百度的!!!!!

OVER.....................

源码地址:https://download.csdn.net/download/qq_40953393/43046832

  • 19
    点赞
  • 156
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DXnima

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值