PIE二次开发(三)鼠标绘制创建矢量要素数据集SHP

PIE二次开发(三)鼠标绘制创建矢量要素数据集SHP

通过鼠标绘制创建SHP文件,可以选择设定指定的字段等。
主要内容: ①几何元素绘制,②要素创建



0. 前言
1. 输出参数设置
2. 绘制形状
3. 设置属性信息
4. 创建要素添加显示

0.前言

创建一个SHP文件,主要是完成两种属性的设置。一个是几何信息,包括要素的类型(点线面)、空间参考等;第二个是属性信息,比如字段的设置和ID等。几何形状的话,采用元素绘制工具来完成;而字段设置就比较繁琐了,如果你需要很多字段的话可能会有大量重复代码,这边就写一个小的示例。
绘制形状,通过PIE的元素绘制工具实现。我们不需要从最底层的操作开始实现怎么在画布上由MouseDown、Up、Move这类事件绘制一个形状,而是采用一个完整的工具-Tool来帮助我们画自己想要的形状。这个工具和我们认识的大多数的GIS绘图工具类似,比如双击完成绘制这种操作。工具十分简单,两行代码就可以调用,但是对于更高级的操作比如:编辑节点这种,还需要自己进一步加工。不过,对于画我们想要的形状来说,足够了。
整理一下实现思路: ①输出参数设置,②绘制形状,③设置属性信息,④创建要素添加显示
在这里插入图片描述

2.输出参数设置

输出参数,按照我自己的逻辑是用户自定义的参数:输出位置、要素类型、空间参考系的选择。要素类型可以用一个下拉列表确定,我这边直接指定面类型。主要是空间参考的选择,PIE封装了一个完整的空间参考系选择的窗体(SpatialReferenceSelectorDialog)使用,用WTK编码作为唯一ID传输参数。

            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Title = "待创建的矢量要素数据集";
            saveFileDialog.Filter = "ShapeFile|*.shp";
            if (saveFileDialog.ShowDialog() != DialogResult.OK) return;
            
            //输出路径
            string outPath = saveFileDialog.FileName;
            
            //空间参考选择
            
            //实例化空间参考窗口对象
            PIE.AxControls.SpatialReferenceSelectorDialog sRSelectorDialog = new SpatialReferenceSelectorDialog();
            if (sRSelectorDialog.ShowDialog() != 1) return;
            //获取对应编码
            string spatialWKT = sRSelectorDialog.SpatialReference.ExportToWkt();
            

2.绘制形状

mapControl的click事件是不能用的,不知道为什么,所以事件选择mapControl.MouseDown事件来完成。如果让用户选择绘制绘制元素的类型的话,可以加一个全局的判定变量来解决,什么时候画线、面的问题。通过绘制工具主要解决元素的形状问题,在绘制完成后创建临时的符号添加进地图,之后在创建完成之后记得删除就好。

        //提前声明形状集
        IGeometry[] geometries = new IGeometry[99];
        int num_geo = 0;
        //判定变量
        string w_status == "pg"
        
        //鼠标按下事件
         private void mapControlMain_MouseDown(object sender, MouseEventArgs e)
        {
            if (w_status == "pg")//画面
            {
                IPolygonElement polygonElement = new PolygonElement();
                IGeometry geometry = (mapControlMain.TrackPolygon()) as IGeometry;

                polygonElement.Geometry = geometry;

                ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol();
                simpleFillSymbol.Style = SimpleFillStyle.SFSSolid;

                IFillSymbol fillSymbol = simpleFillSymbol as FillSymbol;
                fillSymbol.Color = System.Drawing.Color.Red;
                polygonElement.Symbol = fillSymbol;
                mapControlMain.ActiveView.GraphicsContainer.AddElement(polygonElement);
                mapControlMain.ActiveView.PartialRefresh(ViewDrawPhaseType.ViewAll);

                //添加进形状集
                geometries[num_geo] = geometry;
                num_geo++;
            }

3.设置属性信息

现在我们有已经画好的形状信息——Geometries,还有要素的类型和空间参考。这一步创建要素数据集FeatureDataset,指定相应的信息。因为①不同类型的要素集创建方法大同小异,只是指定的类型不同;②所有的数据集创建完都要添加进地图显示。然后删除之前创建的临时要素。所以把重复代码封装为一个方法fun_CreateNewShp(Dataset) 该方法在第四步实现,介绍。需要一个参数,就是已经设置好的要素数据集。
在绘制状态结束后,点击一个按钮表示绘制完成。清除当前的绘制状态w_status,并将Geometry清空。

        //绘制完成创建featuredataset
        private void btn_createDone_Click(object sender, EventArgs e)
        {

            //设置字段集
            IFields fields = new Fields();

            //2设置字段
            IField field1 = new Field("Name", FieldType.OFTString, 50, 1);
            field1.Name = "Name";
            field1.AliasName = "名称";
            IField field2 = new Field("Level", FieldType.OFTInteger, 50, 1);
            field2.Name = "Level";
            field2.AliasName = "级别";

            //3添加字段
            fields.AddField(field1);
            fields.AddField(field2);
            //4创建空间参考信息
            ISpatialReference spatialReference = SpatialReferenceFactory.CreateSpatialReference(spatialWKT);
            switch (w_status)
            {

                case "pt":
                    //5创建矢量要素集
                    IFeatureDataset ptDataset = DatasetFactory.CreateFeatureDataset(outPath, fields, GeometryType.GeometryPoint, spatialReference, "SHP");
                    fun_CreateNewShp(ptDataset);
                    break;
                case "pl":
                    IFeatureDataset plDataset = DatasetFactory.CreateFeatureDataset(outPath, fields, GeometryType.GeometryPolyline, spatialReference, "SHP");
                    fun_CreateNewShp(plDataset);
                    break;
                case "pg":
                    IFeatureDataset pgDataset = DatasetFactory.CreateFeatureDataset(outPath, fields, GeometryType.GeometryPolygon, spatialReference, "SHP");
                    fun_CreateNewShp(pgDataset);
                    break;
            }
            w_status = "";
            Array.Clear(geometries, 0, 99);
            num_geo = 0;
        }

4.创建要素添加显示

        void fun_CreateNewShp(IFeatureDataset data) {
            for (int num = 0; num < num_geo; num++)
            {
                IFeature ptfeature = data.CreateNewFeature();
                ptfeature.Geometry = geometries[num];
                ptfeature.FID = num;

                //数据集添加要素
                data.AddFeature(ptfeature);
            }
            IFeatureLayer pgfeatureLayer = LayerFactory.CreateDefaultFeatureLayer(data);
            data.CreateSpatialIndex(1);
            mapControlMain.ActiveView.GraphicsContainer.DeleteAllElements();
            mapControlMain.FocusMap.AddLayer(pgfeatureLayer as ILayer);
        }

返回目录


欢迎大家反馈交流。
本文链接:https://blog.csdn.net/qq_38560619/article/details/107599312


版权声明:本文为qq_38560619原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。