本科阶段也是自己偷懒,学了一点关于ArcEngine开发的皮毛知识,现在为了课题又得抱着书重新啃,倒也走了一丢丢进度,对一些公共基础的部分做一些阶段性的总结。自我感觉比较有意思的部分但实际上并没什么难度新颖的地方就是目录树的创建,把读进来的数据按照一定规则重新组织显示,并不会重组数据库中文件的原本存储方式。
首先,我拿到的数据是这样子的,想让他不按照类别的方式存储而是以比例尺的方式显示。
添加一个TreeView控件。设立根节点时数据集的名称,
node = new TreeNode(layerName) {
Tag = featureLayer
};
treeNode.Nodes.Add(node);
Tag的作用是为了方便后面的设计,可以实现点击TreeNode的节点实现图层在MapControl的跳转。
对于图层组(要素集)如何添加根节点,
if (axMapControl1.Map.get_Layer(i) is GroupLayer) {
//使用ICompositeLayer接口进行遍历操作
ICompositeLayer compositeLayer = axMapControl1.Map.get_Layer(i) as ICompositeLayer;
string groupName = axMapControl1.Map.get_Layer(i).Name;
treeNode = new TreeNode(groupName) {
Tag = compositeLayer
};
treeView1.TopNode.Nodes.Add(treeNode);
for (int j = 0; j < compositeLayer.Count; j++) {
//得到图层的名称
layerName = compositeLayer.get_Layer(j).Name;
//得到矢量图层对象的IFeatureLayer接口
featureLayer = (IFeatureLayer)compositeLayer.get_Layer(j);
//如果该图层选择集中的要素不为空,则在TreeView控件中添加一个树节点
//新建一个树节点,将图层名称作为树节点的名称
node = new TreeNode(layerName) {
Tag = featureLayer
};
treeNode.Nodes.Add(node);
}
}
以比例尺作为节点展开对应的图层
首先,先搞清楚如何把图层根据比例尺信息进行分类,通过观察可得出图层的名称是有规定的格式,
以 ‘_’ 分隔。
所以,可通过spilt方法进行分割图层名称。
spilt后的是一个数组形式的集合,其中第一列是要素名称,第二列是要素的形状,第三列是要素的比例尺。
然鹅,又会出现一个新的问题,就是如何分类的问题,分隔开的是一个个的数组,并不能直接进行分类,因为不存在一个集合问题和连接关系,所以需要新建一个对象类,设置其属性为图层名称和比例尺
//定义一个类用于存储信息,图层名称和比例尺
class featurelayerProp {
public string mFeatureLayer { get; set; }
public string mScale { get; set; }
}
设置好连接关系之后,就需要把他们都存在一个列表这种可以集合起来的容器。毕竟这种东西用来分类是比自己写一些分类方法要快得多(很偷懒)。
将要素信息存入列表list
for (int j = 0; j < compositeLayer.Count; j++) {
featurelayerProp prop = new featurelayerProp();
//得到图层的名称
layerName = compositeLayer.get_Layer(j).Name.Trim();
//分解图层名称
string[] str = layerName.Split('_');
prop.mFeatureLayer = layerName;
prop.mScale = str[2];
mfeaturelayers.Add(prop);
Dindex++;
}
数据分类并添加树节点
//通过lambert表达式进行分类
IEnumerable<IGrouping<string, featurelayerProp>> scaleLayerGroup = mfeaturelayers.GroupBy(s => s.mScale);
foreach (IGrouping<string, featurelayerProp> item in scaleLayerGroup) {
treeNode = new TreeNode("1:" + item.Key);
treeView1.TopNode.Nodes.Add(treeNode);
foreach (featurelayerProp prop in item) {
node1 = new TreeNode(prop.mFeatureLayer);
treeNode.Nodes.Add(node1);
}
}
展开树形结构
//添加完节点后将根节点展开以显示所有的图层
treeView1.TopNode.ExpandAll();
结果如下
哎,因为疫情不能面向“对象”做面向对象编程真是太不好了
我在想什么pitch