zoukankan      html  css  js  c++  java
  • DotSpatial 要素合并

    private void toolStripButton45_Click(object sender, EventArgs e)
            {
                //存在Bug,合并丢失现象
                if (mapMain.Layers.Count == 0)
                {
                    return;
                }
                //查看与选中要素重叠的要素
                PolygonLayer pLayer = Lzq_LayerManager.getLayerByName(layerNamePolygon, mapMain) as PolygonLayer;
                if (pLayer == null)
                {
                    MessageBox.Show(@"未找到具体图层:" + layerNamePolygon, @"系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
    
                FeatureSet fs = null;
                fs = (FeatureSet)pLayer.DataSet; ;
                if (pLayer.Selection.Count <2)
                {
                    MessageBox.Show(@"图层至少要选中两个要素:" + pLayer.Selection.Count, @"系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
    
    
                //防止有合并后有悬挂线,先将面图元进行正值缓冲,合并后,将图元负值缓冲
    
                double buffer = 0.001; //容差
                ////获取第一个被选中要素
                IFeature pFeature = (Feature)pLayer.Selection.ToFeatureList()[0];
                NetTopologySuite.Geometries.Geometry gm1 = (NetTopologySuite.Geometries.Geometry)pFeature.Geometry;
                Geometry g1 = (Geometry)pFeature.Geometry.Clone();
                Geometry g1Buff = (Geometry)g1.Buffer(buffer);
    
                //遍历选择级,找到重叠要素
                for (int j = 1; j < pLayer.Selection.Count; j++)
                {
                    IFeature pFeature2 = (Feature)pLayer.Selection.ToFeatureList()[j];
                    Geometry gm2 = (Geometry)pFeature2.Geometry.Clone();
                    CoordinateArrays.RemoveRepeatedPoints(gm2.Coordinates);
                    Geometry gm2Buff = (Geometry)gm2.Buffer(buffer);
                    Geometry p = (Geometry)g1Buff.Union(gm2Buff);
                    Console.WriteLine(p.IsSimple.ToString());
                    if (p.IsSimple)
                    {
                        CoordinateArrays.RemoveRepeatedPoints(p.Coordinates);
                        p.Normalize();
                        pFeature.Geometry = p.Buffer(-1 * buffer);
                        fs.Features.Remove(pFeature2);
                        ClassBase.IndexError(pLayer, mapMain);
                    }    
                }
                fs.Save();
            }
    
    
    
    
            public static void IndexError(DotSpatial.Symbology.IFeatureLayer fLayer, DotSpatial.Controls.Map _map)
            {
                fLayer.DataSet.UpdateExtent();
                fLayer.DataSet.InitializeVertices();
                if (fLayer.LabelLayer != null)
                {
                    fLayer.LabelLayer.CreateLabels();
                }
    
                fLayer.AssignFastDrawnStates();
    
                if (_map != null)
                {
                    _map.Refresh();
                    _map.ResetBuffer();
                }
            }
    
    
            public static Layer getLayerByName(string layerName, Map mainMap)
            {
                Layer layer = null;
                foreach (FeatureLayer featureLayer in mainMap.Layers)
                {
                    if (featureLayer.Name == layerName)
                    {
                        layer = featureLayer;
                    }
                }
                return layer;
            }
    

      选中两个以上元素,只能合并两个,目前没解决此处bug,应该是

    ClassBase.IndexError(pLayer, mapMain);
    操作后将selection 清空导致,有研究过的帮忙 解答一下,谢谢!
  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/kogame/p/12503582.html
Copyright © 2011-2022 走看看