设计任务
课程设计的主要任务是利用GIS公共平台提供的二次开发环境开发一套“台风GIS软件”,在遵循国家台风编码的基础上,实现台风的运动轨迹可视化,以及台风经过区域的经济损失评估。
1.获取台风的各个时刻的空间位置关系;
2.建立空间数据及属性数据库;
3.建立空间数据的查询系统;
4.实现空间分析的基本功能(包括缓冲区分析、叠加分析等);
5.提交书面报告(数据库设计、软件设计流程和软件使用说明等)和台风GIS系统软件运行程序及原始程序代码等。
空间数据库设计与建库
- 地图分层
素类 | 描述 |
面要素 | 省级面要素 |
线要素 | 台风路径 |
点要素 | 台风某时刻位置 |
台风登陆点 | |
省会城市 |
- 属性库设计
地价信息表(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.按名称进行要素查询
/// <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