aeug二次开发 日期属性中记录属性表行的数组怎么定义

2928人阅读
ArcGIS Engine开发(4)
GIS二次开发(1)
一、系统概述
1、系统简介
系统是在VS2008中利用ArcGIS Engine10.1进行的二次开发。系统主要有菜单栏、内容列表、鹰眼视图、操作面板、地图视图、布局视图等六大功能模块区。
2、功能简介
系统主要功能包括:
基础操作:新建文档、打开文档、保存文档、另存为、添加XY数据、影像导入、退出系统;
地图制图输出:添加文字、添加图例、添加数字比例尺、添加文字比例尺、添加指北针、输出JPG、输出BMP、输出PNG、输出PDF;
系统设置:皮肤选择、内容显示;
帮助:帮助文档、关于、在线支持、联系我们;
地图操作:选择、放大、缩小、平移、全幅显示;
布局操作:选择、、放大、缩小、平移、全幅显示、固定比例尺放大、固定比例尺缩小、前一视图、后一视图、1:1显示。
3、系统界面介绍
系统使用DevExpress第三方控件进行系统界面搭建。DevExpress开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制。对于编程人员来说是个不错的选择。它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件,而让您编写的程序或软件更显专业化。它还提供完善的帮助系统,资料详尽,可以快速入手。有些高级控件更是零代码的,非常易于使用。
图1:系统主界面
图2:系统皮肤选择
二、系统环境及功能亮点
1、系统环境
ArcGIS Engine10.1
VS2008、IDL、DevExpress
C#、IDL8.0
其他(可扩充)
2、功能亮点
1)、 系统基础功能较为完善。基础文档操作、地图布局设置功能丰富、地图输出格式多样;
2)、&实现图层添加、移除以及属性表查看等功能;
3)、& 通过调用GP工具实现“添加XY数据”功能;
4)、&通过调用IDL程序实现遥感影像波段合成功能;
图3:图层属性查看
图4:属性查看代码实现
//属性查看
private void FormAttribute_Load(object sender, EventArgs e)
//pLayer:存储当前查询图层名称
pFeatureLayer = pLayer as IFeatureL
pFeatureClass = pFeatureLayer.FeatureC
pLayerFields = pFeatureLayer as ILayerF
DataSet ds = new DataSet(&dsTest&);
DataTable dt = new DataTable(pFeatureLayer.Name);
DataColumn dc =
for (int i = 0; i & pLayerFields.FieldC i++)
dc = new DataColumn(pLayerFields.get_Field(i).Name);
dt.Columns.Add(dc);
IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
IFeature pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
DataRow dr = dt.NewRow();
for (int j = 0; j & pLayerFields.FieldC j++)
if (pLayerFields.FindField(pFeatureClass.ShapeFieldName) == j)
dr[j] = pFeatureClass.ShapeType.ToString();
dr[j] = pFeature.get_Value(j);
dt.Rows.Add(dr);
pFeature = pFeatureCursor.NextFeature();
gridControl1.DataSource =
this.Text = pLayer.Name + &属性表&;
catch (Exception ex)
MessageBox.Show(&属性表读取失败:& + ex.Message.ToString(), &提示&, MessageBoxButtons.OK, rmation);
this.Dispose();//释放资源
图5:添加XY数据
图6:代码实现
//确定,创建点图层
private void btOk_Click(object sender, EventArgs e)
if (textEditExcel.Text == && || ComboBoxEditX.Text == && || ComboBoxEditY.Text == && || textEditName.Text == && || txyPath == null)
MessageBox.Show(&输入有误,请重新填写!&, &提示&, MessageBoxButtons.OK, MessageBoxIcon.Warning);
this.progressBar.EditValue = 5;
//bgWorker.RunWorkerAsync();
Geoprocessor GP = new Geoprocessor();
//添加XY事件
MakeXYEventLayer MxyLayer = new MakeXYEventLayer();
//直接获取Excel表格中第一个表名
MxyLayer.table = textEditExcel.Text +&\\&+ ReadExcel.GetExcelFirstTableName(textEditExcel.Text);
this.progressBar.EditValue = 15;
//获取经度字段
MxyLayer.in_x_field = ComboBoxEditX.T
//获取纬度字段
MxyLayer.in_y_field = ComboBoxEditY.T
this.progressBar.EditValue = 25;
MxyLayer.out_layer = &result&;
GP.Execute(MxyLayer, null);
this.progressBar.EditValue = 35;
//复制要素
ESRI.ArcGIS.DataManagementTools.CopyFeatures cf = new ESRI.ArcGIS.DataManagementTools.CopyFeatures();
cf.in_features = &result&;
this.progressBar.EditValue = 45;
cf.out_feature_class = txyP
GP.Execute(cf, null);
this.progressBar.EditValue = 55;
//添加要素图层到Map
IWorkspaceFactory workspaceFactory = new FileGDBWorkspaceFactoryClass();
IFeatureWorkspace pws = workspaceFactory.OpenFromFile(gdbPath, 0) as IFeatureW
this.progressBar.EditValue = 65;
IFeatureLayer pFeatureLater = new FeatureLayerClass();
pFeatureLater.FeatureClass = pws.OpenFeatureClass(&XY点图层_& + textEditName.Text);
pFeatureLater.Name = &XY点图层_& + textEditName.T
this.progressBar.EditValue = 75;
axMapControlxy.Map.AddLayer(pFeatureLater as ILayer);
axMapControlxy.Extent = axMapControlxy.FullE
this.progressBar.EditValue = 85;
MessageBox.Show(&图层创建成功!&, &提示&, MessageBoxButtons.OK, rmation);
this.Dispose();
this.Close();
catch(Exception ex)
MessageBox.Show(&图层创建失败!&+ex.Message.ToString(),&提示&, MessageBoxButtons.OK, MessageBoxIcon.Warning);
图7:XY示例数据
图8:点图层创建结果
图9:波段合成
图10:结果显示
//波段合成
private void btOk_Click(object sender, EventArgs e)
if (lvFiles.Items.Count & 2 || textImageName.Text == && || ImgsavePath == null)
if (lvFiles.Items.Count & 2)
MessageBox.Show(&波段选择有误,请重新选择!&, &提示&, MessageBoxButtons.OK, MessageBoxIcon.Warning);
lvFiles.Items.Clear();
MessageBox.Show(&输入有误,请重新填写!&, &提示&, MessageBoxButtons.OK, MessageBoxIcon.Warning);
//调用LayerStacking方法实现波段合成
this.LayerStacking(ImgsavePath);
//调用RasterToGDB方法将合成影像导入地理数据库中
RasterToGDB(ImgsavePath);
//调用DeleteFile方法实现删除合成影像
DeleteFile(&波段合成_& + textImageName.Text.Trim() + &.img&);
DeleteFile(&波段合成_& + textImageName.Text.Trim() + &.hdr&);
catch (Exception ex)
MessageBox.Show(ex.Message.ToString());
DialogResult re = MessageBox.Show(&操作成功!是否添加显示?&, &提示&, MessageBoxButtons.OKCancel, rmation);
if (re == DialogResult.OK)
//调用添加显示功能
AddLayerToMap(&波段合成_& + textImageName.Text, gdbPath, axMapControlimg);
this.Close();
this.Dispose();
this.Close();
this.Dispose();
注:一下为C#封装的方法,主要实现影栅格数据入库、Temp数据删除、栅格数据添加显示等功能操作!
/// &summary&
/// 调用GP工具将栅格数据导入地理数据库中
/// &/summary&
/// &param name=&imagepath&&生成的栅格数据路径&/param&
public static void RasterToGDB(string imagepath)
Geoprocessor GP = new Geoprocessor();
ESRI.ArcGIS.ConversionTools.RasterToGeodatabase rasterTogeodatabase = new ESRI.ArcGIS.ConversionTools.RasterToGeodatabase();
rasterTogeodatabase.Input_Rasters =
rasterTogeodatabase.Output_Geodatabase = FormMain.GDB;
GP.Execute(rasterTogeodatabase, null);
/// &summary&
/// 删除文件
/// &/summary&
/// &param name=&filename&&文件名&/param&
public static void DeleteFile(string filename)
//判断文件是否存在
if (File.Exists(FormMain.ImagePath +&\\&+ filename))
//如果存在则删除
File.Delete(FormMain.ImagePath +&\\&+ filename);
/// &summary&
/// 将产生的栅格数据添加到map中显示
/// &/summary&
/// &param name=&filename&&栅格数据名称&/param&
///&param name=&gdbpath&&数据存放路径&/param&
/// &param name=&axmapcontrol&&Axmapcontrol&/param&
public static void AddLayerToMap(string filename,string gdbpath, AxMapControl axmapcontrol)
IWorkspaceFactory workspacefactory = new FileGDBWorkspaceFactoryClass();
IRasterWorkspaceEx rasterworkspace = workspacefactory.OpenFromFile(gdbpath, 0) as IRasterWorkspaceEx;
IRasterDataset rasterdataset = rasterworkspace.OpenRasterDataset(filename);
IRasterLayer rasterlayer = new RasterLayerClass();
rasterlayer.CreateFromDataset(rasterdataset);
axmapcontrol.Map.AddLayer(rasterlayer as ILayer);
axmapcontrol.Extent = axmapcontrol.FullE
图11:波段合成IDL代码实现
pro ENVI_LAYER_STACKING_DOIT_Record,_extra = extra
pro LayerStacking,paths,out_path
compile_opt idl2
严格编译规则
compile_opt idl2
载入envi的sav文件
envi,/restore_base_save_files
初始化envi
envi_batch_init,log_file = 'batch.LOG'
fids = lonarr(n_elements(paths))
nbs = lonarr(n_elements(paths))
nses = lonarr(n_elements(paths))
nls = lonarr(n_elements(paths))
dimses = lonarr(5,n_elements(paths))
Sum_nb = 0l
for i = 0,n_elements(paths)-1 do begin
envi_open_file,paths[i],r_fid =r_fid
fids[i] = r_fid
envi_file_query,fids[i],ns=ns, nl=nl, nb=nb,dims = dims
nses[i]=ns
dimses[*,i]=dims
Sum_nb = Sum_nb + nbs[i]
pos = lonarr(Sum_nb)
out_proj = envi_get_projection(fid=fids[0],pixel_size=out_ps)
ENVI_DOIT,'ENVI_LAYER_STACKING_DOIT',dims=dimses,FID=fids,pos=pos,OUT_NAME=out_path,$
out_dt=4,interp=2, out_ps=out_ps, $
out_proj=out_proj, r_fid=r_fid
图12:指北针选择器
图13:添加文字及检测输入是否规范
图14:系统托盘
图15:系统关于
三、团队分工
本系统所有内容均为本人独立创作(如有雷同,存属意外)。
四、心得体会
此处略去一万字。。。
系统演示视频地址:
友情链接(MapGIS文档):
五、相关书籍推荐
1、IDL程序设计--数据可视化与ENVI二次开发(附光盘) 董彦卿
简介:《IDL程序设计--数据可视化与ENVI二次开发(附光盘)》编著者董彦卿。数据可视化是进行信息提取的有效手段之一。《IDL程序设计:数据可视化与ENVI二次开发》就是一本专门针对交互式数据语言——IDL的可视化应用的编程指南。书中由浅入深地介绍了IDL程序设计的语法基础,着重对比了直接图形法、对象图像法和快速可视化三种数据可视化方法,描述了它们的使用方法和特点,最后介绍了IDL与其他程序语言如C++、C#、Java等混合编程以及ENVI功能扩展与二次开发;同时,列举了丰富的示例代码和注释说明,并对IDL中的各种函数进行了归纳。随书附赠光盘中含有书中所有示例代码和实验数据,方便读者实践。本书内容系统全面,可作为遥感、地理信息系统、计算机、图形图像处理及相关专业本科生和研究生的教学用书和实验教程,也可作为计算机软件开发人员的工具书。
查看详情:
2、基于C#语言的ArcGIS Engine开发基础与技巧
简介:本书将GIS理论知识和实际应用相结合,在Visual
Studio 2010.NET开发环境下,以C#作为开发语言,结合大量实例,介绍了利用ArcGIS Engine 10.0进行GIS二次开发的方法、过程和技巧。本书内容主要包括ArcGIS Engine接口的概念,利用ArcGIS Engine构建GIS基本框架的方法,在ArcGIS Engine环境下空间数据访问与查询、空间数据投影转换、矢栅数据结构转换、符号化显示与符号库定制、空间数据编辑、外部属性数据操作与专题图制作、地图整饰与打印输出、空间数据裁剪、地形分析、插值方法、叠加分析、地图配准,以及空间数据图饰符号标注等功能的实现方法。每个章节都对应一个具体的GIS功能,先介绍基本概念,然后讲述ArcGIS
Engine 10.0实现这些功能所提供的方法,并给出了具体的实现过程。
查看详情:
3、.NET之美(.NET关键技术深入解析) 张子阳
简介:张子阳等编著的《.NET之美(.NET关键技术深入解析)》是.NET程序员进阶修炼的必读之作,由拥有多年开发经验的资深。NET技术专家对C#和.NET中实用的、关键的和难以理解的知识点进行了深入解析,旨在帮助读者在尽可能短的时间内以尽可能低的学习成本去掌握那些最应该被掌握的知识。书中的每个知识点都辅之以精心设计的案例,易于理解,实践性强。
&&&& 《.NET之美(.NET关键技术深入解析)》共17章,分为两个部分:第一部分(1~5章)主要讲解了C#语言中的一些关键知识点,如类型、泛型、委托、事件、对象、LINQ等;第二部分(6~17章)则对.NET中的关键知识点进行了深入剖析,如程序集、流和序列化、加密与解密、网络编程、.NETRemoting、在.NET中操作XML、.NET应用程序配置、基于角色的安全性、反射、多线程、对象生存期与垃圾回收等。
查看详情:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32263次
排名:千里之外
原创:19篇
转载:33篇
评论:26条
(2)(2)(1)(2)(2)(2)(7)(3)(1)(2)(1)(1)(18)(5)(1)(4)该商品已下柜,非常抱歉!
正版特价 基于AE与 C# 的地理信息系统二次开发 书籍
商品介绍加载中...
扫一扫,精彩好书免费看
服务承诺:
京东平台卖家销售并发货的商品,由平台卖家提供发票和相应的售后服务。请您放心购买!
注:因厂家会在没有任何提前通知的情况下更改产品包装、产地或者一些附件,本司不能确保客户收到的货物与商城图片、产地、附件说明完全一致。只能确保为原厂正货!并且保证与当时市场上同样主流新品一致。若本商城没有及时更新,请大家谅解!
权利声明:京东上的所有商品信息、客户评价、商品咨询、网友讨论等内容,是京东重要的经营资源,未经许可,禁止非法转载使用。
注:本站商品信息均来自于合作方,其真实性、准确性和合法性由信息拥有者(合作方)负责。本站不提供任何保证,并不承担任何法律责任。
印刷版次不同,印刷时间和版次以实物为准。
价格说明:
京东价:京东价为商品的销售价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等)或该商品在京东平台上曾经展示过的销售价;由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣:如无特殊说明,折扣指销售商在原价、或划线价(如品牌专柜标价、商品吊牌价、厂商指导价、厂商建议零售价)等某一价格基础上计算出的优惠比例或优惠金额;如有疑问,您可在购买前联系销售商进行咨询。
异常问题:商品促销信息以商品详情页“促销”栏中的信息为准;商品的具体售价以订单结算页价格为准;如您发现活动商品售价或促销信息有异常,建议购买前先联系销售商咨询。
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
加载中,请稍候...
浏览了该商品的用户还浏览了
加载中,请稍候...
价 格: 到
   
iframe(src='///ns.html?id=GTM-T947SH', height='0', width='0', style='display: visibility:')1196人阅读
ArcGIS Engine 二次开发(5)
WPF开发(3)
在本文档中主要内容是:代码实现创建的几何网络最短路径分析的代码。参考资料为: ArcGIS Engine 10开发手册。
using System.Collections.G
using System.L
using System.T
using ESRI.ArcGIS.G
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.NetworkA
using ESRI.ArcGIS.C
using ESRI.ArcGIS.G
using ESRI.ArcGIS.D
using ESRI.ArcGIS.C
namespace 阵地部署辅助决策预案系统_3._10_.Services.MapDevelopClass
/// &summary&
/// 网络分析,包括几何网络分析和无向网络分析
/// &/summary&
class NetWorkAnalysis
Geometric Network 几何网络分析,用于:A.寻找 连通的/不连通的管线 B.上/下游追踪 C.寻找环路 D.寻找通路 E.爆管分析
#region 获取工作区间
/// &summary&
/// 打开个人数据库,获取工作区
/// &/summary&
/// &param name=&_pGDBName&&&/param&
/// &returns&&/returns&
public IWorkspace GetWorkspace(String _pGDBName)
IWorkspaceFactory pWsFac = new AccessWorkspaceFactoryClass();
IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName, 0);
return pWs;
#endregion
#region 创建几何网络
/// &summary&
/// 创建几何网络,其中要素类和几何网络名可根据需要进行修改
/// &/summary&
/// &param name=&_pWorkspace&&&/param&
/// &param name=&_pFeatureDatasetName&&&/param&
/// &param name=&_pGeometricName&&&/param&
public void CreateGeometricNetwork(IWorkspace _pWorkspace, IFeatureDatasetName _pFeatureDatasetName, String _pGeometricName)
INetworkLoader2 pNetworkLoader = new NetworkLoaderClass();
// 创建网络的名称
pNetworkLoader.NetworkName = _pGeometricN
// 创建网络的类型
pNetworkLoader.NetworkType = esriNetworkType.esriNTUtilityN
// 设置要素集名称
pNetworkLoader.FeatureDatasetName = (IDatasetName)_pFeatureDatasetN
// 检查要建立几何网络的数据,每一个要素只能参与一个网络,PrimaryLine 是要素集中的线要素
if (pNetworkLoader.CanUseFeatureClass(&PrimaryLine&) ==
esriNetworkLoaderFeatureClassCheck.esriNLFCCValid)
pNetworkLoader.AddFeatureClass(&PrimaryLine&,
esriFeatureType.esriFTComplexEdge, null, false);
//Feeder是数据集中的点要素
if (pNetworkLoader.CanUseFeatureClass(&Feeder&) ==
esriNetworkLoaderFeatureClassCheck.esriNLFCCValid)
pNetworkLoader.AddFeatureClass(&Feeder&, esriFeatureType.esriFTSimpleJunction,
null, false);
// 数据中没有enable字段,所以用false。如果用true的话,就要进行相关的设置
INetworkLoaderProps pNetworkLoaderProps = (INetworkLoaderProps)pNetworkL
pNetworkLoader.PreserveEnabledValues =
String defaultAncillaryRoleFieldName =
pNetworkLoaderProps.DefaultAncillaryRoleF
esriNetworkLoaderFieldCheck ancillaryRoleFieldCheck =
pNetworkLoader.CheckAncillaryRoleField(&Feeder&,
defaultAncillaryRoleFieldName);
switch (ancillaryRoleFieldCheck)
case esriNetworkLoaderFieldCheck.esriNLFCValid:
case esriNetworkLoaderFieldCheck.esriNLFCNotFound:
pNetworkLoader.PutAncillaryRole(&Feeder&,
esriNetworkClassAncillaryRole.esriNCARSourceSink,
defaultAncillaryRoleFieldName);
Console.WriteLine(
&The field {0} could not be used as an ancillary role field.&,
defaultAncillaryRoleFieldName);
pNetworkLoader.SnapTolerance = 0.02;
// 给几何网络添加权重
pNetworkLoader.AddWeight(&Weight&, esriWeightType.esriWTDouble, 0);
// 将权重和PrimaryLine数据中的SHAPE_Length字段关联
pNetworkLoader.AddWeightAssociation(&Weight&, &PrimaryLine&, &SHAPE_Length&);
// 构建网络
pNetworkLoader.LoadNetwork();
#endregion
#region 代码创建几何网络的最短路径分析
/// &summary&
/// 求解最短路径,使用方式如: SolvePath(axMapControl1.Map, GetGeometricNetwork(pFtDataset, &TestGeometric&), &Weight&, pPointC, 1000, ref pPolyline, ref s); GetGeometricNetwork是自定义的获取几何网络名的方法
/// &/summary&
/// &param name=&_pMap&&MapControl中的Map&/param&
/// &param name=&_pGeometricNetwork&&&/param&
/// &param name=&_pWeightName&&&/param&
/// &param name=&_pPoints&&&/param&
/// &param name=&_pDist&&&/param&
/// &param name=&_pPolyline&&&/param&
/// &param name=&_pPathCost&&&/param&
public void SolvePath(IMap _pMap, IGeometricNetwork _pGeometricNetwork, string _pWeightName, IPointCollection _pPoints, double _pDist, ref IPolyline _pPolyline, ref double _pPathCost)
{ // 这4个参数其实就是一个定位Element的指标
int intEdgeUserClassID;
int intEdgeUserID;
int intEdgeUserSubID;
int intEdgeID;
IPoint pFoundEdgeP
double dblEdgeP
ITraceFlowSolverGEN pTraceFlowSolver = new TraceFlowSolverClass() as ITraceFlowSolverGEN;
INetSolver pNetSolver = pTraceFlowSolver as INetS
//操作是针对逻辑网络的,INetwork是逻辑网络
INetwork pNetwork = _pGeometricNetwork.N
pNetSolver.SourceNetwork = pN
INetElements pNetElements = pNetwork as INetE
int pCount = _pPoints.PointC
//定义一个边线旗数组
IEdgeFlag[] pEdgeFlagList = new EdgeFlagClass[pCount];
IPointToEID pPointToEID = new PointToEIDClass();
pPointToEID.SourceMap = _pM
pPointToEID.GeometricNetwork = _pGeometricN
pPointToEID.SnapTolerance = _pD
for (int i = 0; i & pC i++)
INetFlag pNetFlag = new EdgeFlagClass() as INetF
IPoint pEdgePoint = _pPoints.get_Point(i);
//查找输入点的最近的边线
pPointToEID.GetNearestEdge(pEdgePoint, out intEdgeID, out pFoundEdgePoint, out dblEdgePercent);
pNetElements.QueryIDs(intEdgeID, esriElementType.esriETEdge, out intEdgeUserClassID, out intEdgeUserID, out intEdgeUserSubID);
pNetFlag.UserClassID = intEdgeUserClassID;
pNetFlag.UserID = intEdgeUserID;
pNetFlag.UserSubID = intEdgeUserSubID;
IEdgeFlag pTemp = (IEdgeFlag)(pNetFlag as IEdgeFlag);
pEdgeFlagList[i] = pT
pTraceFlowSolver.PutEdgeOrigins(ref pEdgeFlagList);
INetSchema pNetSchema = pNetwork as INetS
INetWeight pNetWeight = pNetSchema.get_WeightByName(_pWeightName);
INetSolverWeightsGEN pNetSolverWeights = pTraceFlowSolver as INetSolverWeightsGEN;
pNetSolverWeights.FromToEdgeWeight = pNetW//开始边线的权重
pNetSolverWeights.ToFromEdgeWeight = pNetW//终止边线的权重
object[] pRes = new object[pCount - 1];
//通过FindPath得到边线和交汇点的集合
IEnumNetEID pEnumNetEID_J
IEnumNetEID pEnumNetEID_E
pTraceFlowSolver.FindPath(esriFlowMethod.esriFMConnected,
esriShortestPathObjFn.esriSPObjFnMinSum,
out pEnumNetEID_Junctions, out pEnumNetEID_Edges, pCount - 1, ref pRes);
//计算元素成本
_pPathCost = 0;
for (int i = 0; i & pRes.L i++)
double m_Va = (double)pRes[i];
_pPathCost = _pPathCost + m_Va;
IGeometryCollection pNewGeometryColl = _pPolyline as IGeometryC//QI
ISpatialReference pSpatialReference = _pMap.SpatialR
IEIDHelper pEIDHelper = new EIDHelperClass();
pEIDHelper.GeometricNetwork = _pGeometricN
pEIDHelper.OutputSpatialReference = pSpatialR
pEIDHelper.ReturnGeometries =
IEnumEIDInfo pEnumEIDInfo = pEIDHelper.CreateEnumEIDInfo(pEnumNetEID_Edges);
int Count = pEnumEIDInfo.C
pEnumEIDInfo.Reset();
for (int i = 0; i & C i++)
IEIDInfo pEIDInfo = pEnumEIDInfo.Next();
IGeometry pGeometry = pEIDInfo.G
pNewGeometryColl.AddGeometryCollection(pGeometry as IGeometryCollection);
catch (Exception ex)
Console.WriteLine(ex.Message);
/// &summary&
/// 获得需要的几何网络
/// &/summary&
/// &param name=&_pFeatureDataset&&&/param&
/// &param name=&_pGeometricName&&&/param&
/// &returns&&/returns&
IGeometricNetwork GetGeometricNetwork(IFeatureDataset _pFeatureDataset, string _pGeometricName)
INetworkCollection pNetworkCollection = _pFeatureDataset as INetworkC
return pNetworkCollection.get_GeometricNetworkByName(_pGeometricName);
/// &summary&
/// &/summary&
/// &param name=&axMapControl1&&&/param&
/// &param name=&pGC&&&/param&
public void SolvePathTest(AxMapControl axMapControl1 ,IGraphicsContainer pGC,string workspacfile,string DataSetName,string NetwrokName,IMultipoint pmulti)
IWorkspace pWs = GetMDBWorkspace(workspacfile);
IFeatureWorkspace pFtWs = pWs as IFeatureW
IFeatureDataset pFtDataset = pFtWs.OpenFeatureDataset(DataSetName);
double s = 0;
IPolyline pPolyline = new PolylineClass();
SolvePath(axMapControl1.Map, GetGeometricNetwork(pFtDataset, NetwrokName), &Weight&, pPointC, 1000, ref pPolyline, ref s);
IRgbColor pColor = new RgbColorClass();
pColor.Red = 255;
IElement pElement = new LineElementClass();
ILineSymbol linesymbol = new SimpleLineSymbolClass();
linesymbol.Color = pColor as IC
linesymbol.Width = 100;
pElement.Geometry = pP
pGC.AddElement(pElement, 2);
axMapControl1.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
/// &summary&
/// 打开个人数据库
/// &/summary&
/// &param name=&_pGDBName&&&/param&
/// &returns&&/returns&
IWorkspace GetMDBWorkspace(String _pGDBName)
IWorkspaceFactory pWsFac = new AccessWorkspaceFactoryClass();
IWorkspace pWs = pWsFac.OpenFromFile(_pGDBName, 0);
return pWs;
IPointCollection GetPoints(IMultipoint PMulit)
IPointCollection pP
PMulit = new MultipointClass();
pPoints = PMulit as IPointC
#endregion
#endregion
其中几何网络名,featureSet,featureclass需要自己定义和创建,几何网络如何不是必须在程序后台创建的话,我建议在ArcCatalog中建好之后存储到GDB中。
以上的代码这是几何网络的分析,并不是无向网络的分析。无向网络的创建也分为两种,通过Catalog创建和通过代码创建。无向网络Network DataSet的分析与几何网络稍微不太一样。具体代码如下:&#region Network DataSet 无向网络分析,用于:A.最短路径 B.物流输送 C.临近设施分析 D.服务区分析 E.选址分析
/// &summary&
/// 代码创建几何网络
/// &/summary&
/// &param name=&_pWsName&&个人数据库的路径&/param&
/// &param name=&_pDatasetName&&要素数据集的路径&/param&
/// &param name=&_pNetName&&建立网络的名称&/param&
/// &param name=&_pFtName&&参与网络的要素类&/param&
public void CreateNetworkDataset(string _pWsName, string _pDatasetName, string _pNetName, string _pFtName)
IDENetworkDataset2 pDENetworkDataset = new DENetworkDatasetClass();
pDENetworkDataset.Buildable =
IWorkspace pWs = GetMDBWorkspace(_pWsName);
IFeatureWorkspace pFtWs = pWs as IFeatureW
IFeatureDataset pFtDataset = pFtWs.OpenFeatureDataset(_pDatasetName);
// 定义空间参考,负责会出错
IDEGeoDataset pDEGeoDataset = (IDEGeoDataset)pDENetworkD
IGeoDataset pGeoDataset = pFtDataset as IGeoD
pDEGeoDataset.Extent = pGeoDataset.E
pDEGeoDataset.SpatialReference = pGeoDataset.SpatialR
// 网络数据集的名称
IDataElement pDataElement = (IDataElement)pDENetworkD
pDataElement.Name = _pNetN
// 参加建立网络数据集的要素类
INetworkSource pEdgeNetworkSource = new EdgeFeatureSourceClass();
pEdgeNetworkSource.Name = _pFtN
pEdgeNetworkSource.ElementType = esriNetworkElementType.esriNETE
// 要素类的连通性
IEdgeFeatureSource pEdgeFeatureSource = (IEdgeFeatureSource)pEdgeNetworkS
pEdgeFeatureSource.UsesSubtypes =
pEdgeFeatureSource.ClassConnectivityGroup = 1;
pEdgeFeatureSource.ClassConnectivityPolicy =esriNetworkEdgeConnectivityPolicy.esriNECPEndV
//不用转弯数据
pDENetworkDataset.SupportsTurns =
IArray pSourceArray = new ArrayClass();
pSourceArray.Add(pEdgeNetworkSource);
pDENetworkDataset.Sources = pSourceA
//网络数据集的属性设置
IArray pAttributeArray = new ArrayClass();
// Initialize variables reused when creating attributes:
IEvaluatedNetworkAttribute pEvalNetA
INetworkAttribute2 pNetAttr2;
INetworkFieldEvaluator pNetFieldE
INetworkConstantEvaluator pNetConstE
pEvalNetAttr = new EvaluatedNetworkAttributeClass();
pNetAttr2 = (INetworkAttribute2)pEvalNetA
pNetAttr2.Name =&Meters&;
pNetAttr2.UsageType = esriNetworkAttributeUsageType.esriNAUTC
pNetAttr2.DataType = esriNetworkAttributeDataType.esriNADTD
pNetAttr2.Units = esriNetworkAttributeUnits.esriNAUM
pNetAttr2.UseByDefault =
pNetFieldEval = new NetworkFieldEvaluatorClass();
pNetFieldEval.SetExpression(&[METERS]&, &&);
//方向设置
pEvalNetAttr.set_Evaluator(pEdgeNetworkSource,
esriNetworkEdgeDirection.esriNEDAlongDigitized, (INetworkEvaluator)pNetFieldEval);
pEvalNetAttr.set_Evaluator(pEdgeNetworkSource,
esriNetworkEdgeDirection.esriNEDAgainstDigitized, (INetworkEvaluator)
pNetFieldEval);
pNetConstEval = new NetworkConstantEvaluatorClass();
pNetConstEval.ConstantValue = 0;
pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETEdge,
(INetworkEvaluator)pNetConstEval);
pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETJunction,
(INetworkEvaluator)pNetConstEval);
pEvalNetAttr.set_DefaultEvaluator(esriNetworkElementType.esriNETTurn,
(INetworkEvaluator)pNetConstEval);
// 一个网络数据集可以有多个属性,我只添加了一个
pAttributeArray.Add(pEvalNetAttr);
pDENetworkDataset.Attributes = pAttributeA
// 创建网络数据集,注意在创建几何网络的时候会锁定相应的要素类,因此不要用ArcMap或者catalog等打开参相应的数据
INetworkDataset pNetworkDataset = Create(pFtDataset, pDENetworkDataset);
//建立网络
INetworkBuild pNetworkBuild = (INetworkBuild)pNetworkD
pNetworkBuild.BuildNetwork(pGeoDataset.Extent);
/// &summary&
/// 创建无向网络
/// &/summary&
/// &param name=&_pFeatureDataset&&&/param&
/// &param name=&_pDENetDataset&&&/param&
/// &returns&&/returns&
public INetworkDataset Create(IFeatureDataset _pFeatureDataset, IDENetworkDataset2 _pDENetDataset)
IFeatureDatasetExtensionContainer pFeatureDatasetExtensionContainer = (IFeatureDatasetExtensionContainer)_pFeatureD
IFeatureDatasetExtension pFeatureDatasetExtension = pFeatureDatasetExtensionContainer.FindExtension
(esriDatasetType.esriDTNetworkDataset);
IDatasetContainer2 pDatasetContainer2 = (IDatasetContainer2)pFeatureDatasetE
IDEDataset pDENetDataset = (IDEDataset)_pDENetD
INetworkDataset pNetworkDataset = (INetworkDataset)pDatasetContainer2.CreateDataset
(pDENetDataset);
return pNetworkD
/// &summary&
/// _pFtClass参数为Stops的要素类,_pPointC是用鼠标点的点生成的点的集合,最后一个参数是捕捉距离
/// &/summary&
/// &param name=&_pNaContext&&&/param&
/// &param name=&_pFtClass&&&/param&
/// &param name=&_pPointC&&&/param&
/// &param name=&_pDist&&&/param&
public void NASolve(INAContext _pNaContext, IFeatureClass _pFtClass, IPointCollection _pPointC, double _pDist)
INALocator pNAlocator = _pNaContext.L
for (int i = 0; i & _pPointC.PointC i++)
IFeature pFt = _pFtClass.CreateFeature();
IRowSubtypes pRowSubtypes = pFt as IRowS
pRowSubtypes.InitDefaultValues();
pFt.Shape = _pPointC.get_Point(i) as IG
IPoint pPoint =
INALocation pNalocation =
pNAlocator.QueryLocationByPoint(_pPointC.get_Point(i), ref pNalocation, ref pPoint, ref _pDist);
INALocationObject pNAobject = pFt as INALocationO
pNAobject.NALocation = pN
int pNameFieldIndex = _pFtClass.FindField(&Name&);
pFt.set_Value(pNameFieldIndex, pPoint.X.ToString() + &,& + pPoint.Y.ToString());
int pStatusFieldIndex = _pFtClass.FindField(&Status&);
pFt.set_Value(pStatusFieldIndex, esriNAObjectStatus.esriNAObjectStatusOK);
int pSequenceFieldIndex = _pFtClass.FindField(&Sequence&);
pFt.set_Value(_pFtClass.FindField(&Sequence&), ((ITable)_pFtClass).RowCount(null));
pFt.Store();
/// &summary&
/// 获取网络数据集
/// &/summary&
/// &param name=&_pFeatureWs&&&/param&
/// &param name=&_pDatasetName&&&/param&
/// &param name=&_pNetDatasetName&&&/param&
/// &returns&&/returns&
INetworkDataset GetNetDataset(IFeatureWorkspace _pFeatureWs, string _pDatasetName, string _pNetDatasetName)
ESRI.ArcGIS.Geodatabase.IDatasetContainer3 pDatasetContainer =
ESRI.ArcGIS.Geodatabase.IFeatureDataset pFeatureDataset = _pFeatureWs.OpenFeatureDataset(_pDatasetName);
ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionContainer pFeatureDatasetExtensionContainer = pFeatureDataset as ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtensionC // Dynamic Cast
ESRI.ArcGIS.Geodatabase.IFeatureDatasetExtension pFeatureDatasetExtension = pFeatureDatasetExtensionContainer.FindExtension(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset);
pDatasetContainer = pFeatureDatasetExtension as ESRI.ArcGIS.Geodatabase.IDatasetContainer3; // Dynamic Cast
ESRI.ArcGIS.Geodatabase.IDataset pNetWorkDataset = pDatasetContainer.get_DatasetByName(ESRI.ArcGIS.Geodatabase.esriDatasetType.esriDTNetworkDataset, _pNetDatasetName);
return pNetWorkDataset as ESRI.ArcGIS.Geodatabase.INetworkD // Dynamic Cast
public void LoadNetDataSet(AxMapControl axMapControl1, INASolver pNASolveClass, INALayer pNALayer)
IWorkspace pWs = GetMDBWorkspace(@&.\data\Geometric.mdb&);
IFeatureWorkspace pFtWs = pWs as IFeatureW
INetworkDataset pNetWorkDataset = GetNetDataset(pFtWs, &network&, &network_ND&);
pNASolveClass = new NARouteSolverClass();
loadNet(axMapControl1.Map, pNetWorkDataset);
pNALayer = GetNaLayer(pNASolveClass,
GetSolverContext(pNASolveClass, pNetWorkDataset));
axMapControl1.Map.AddLayer(pNALayer as ILayer);
/// &summary&
/// 加载NetworkDataset到Map中
/// &/summary&
/// &param name=&_pMap&&&/param&
/// &param name=&_pNetworkDataset&&&/param&
void loadNet(IMap _pMap, INetworkDataset _pNetworkDataset)
INetworkLayer pNetLayer = new NetworkLayerClass();
pNetLayer.NetworkDataset = _pNetworkD
_pMap.AddLayer(pNetLayer as ILayer);
/// &summary&
/// 获取网络分析上下文,这个接口是网络分析中很重要的一个
/// &/summary&
/// &param name=&_pNaSolver&&&/param&
/// &param name=&_pNetworkDataset&&&/param&
/// &returns&&/returns&
public INAContext GetSolverContext(INASolver _pNaSolver, INetworkDataset _pNetworkDataset)
//Get the Data Element
IDatasetComponent pDataComponent = _pNetworkDataset as IDatasetC
IDEDataset pDeDataset = pDataComponent.DataE
INAContextEdit pContextEdit = _pNaSolver.CreateContext(pDeDataset as IDENetworkDataset, _pNaSolver.Name) as INAContextE
//Prepare the context for analysis based upon the current network dataset schema.
pContextEdit.Bind(_pNetworkDataset, new GPMessagesClass());
return pContextEdit as INAC
/// &summary&
/// 获取NALayer
/// &/summary&
/// &param name=&_pNaSover&&&/param&
/// &param name=&_pNaContext&&&/param&
/// &returns&&/returns&
INALayer GetNaLayer(INASolver _pNaSover, INAContext _pNaContext)
return _pNaSover.CreateLayer(_pNaContext);
#endregion由于我使用的是MVVM框架,所以稍微修改了下ArcGIS Engine10开发手册中的代码,不过经过测试,还是可以正常使用的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:8332次
排名:千里之外
原创:12篇}

我要回帖

更多关于 ae 二次开发 绘制线段 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信