Esempio n. 1
0
        private void 分割数据ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (pIsSelect == false)
            {
                MessageBox.Show("请先进行地图分割范围选择", "提示");
            }
            else if (pIsSelect == true)
            {
                pActiveView = this.axMapControl1.ActiveView;
                pMap        = pActiveView.FocusMap;


                ////先清除已有选择图形
                //pMap.ClearSelection();
                //pActiveView.Refresh();

                if (sourceDbName == "")
                {
                    MessageBox.Show("请选择需分割的个人数据库路径");
                    return;
                }
                else if (pBufferDistance == 0)
                {
                    MessageBox.Show("请设置缓冲区半径!");
                    return;
                }

                //数据分割之前先导出数据框架
                string XmlFile = System.Windows.Forms.Application.StartupPath + "\\WS_Schema.xml";   // 配置文件放置在应用程序的可执行文件的路径下。
                ExportWS_Schema(sourceDbName, XmlFile);

                //检查文件是否已经存在
                bool isExist = File.Exists(dbPath + dbName);
                if (isExist == true)
                {
                    File.Delete(dbPath + dbName);
                }
                ImportWS(dbPath, dbName, XmlFile);

                //********************************************


                //IGeometry pGeometry = this.axMapControl1.TrackPolygon();
                IGeometry pGeometry = (IGeometry)SelectArea;
                IGeometry pBufferGeometry; //缓冲区几何图形

                axMapControl1.DrawShape(pGeometry, ref m_FillSymbol);

                //空间查询

                ILayer         pLayer;
                IFeatureLayer  pFeatureLayer;
                IFeatureClass  pFeatureClass;
                ISpatialFilter pSpatialFilter = new SpatialFilter();
                IFeatureCursor pFeatureCursor;
                IFeature       pFeature;
                int            m;
                string         pFileGDB;

                //遍历地图控件中的每个图层,进行多边形选择
                for (int i = 0; i < axMapControl1.Map.LayerCount; i++)
                {
                    pLayer        = pMap.get_Layer(i);
                    pFeatureLayer = (IFeatureLayer)pLayer;
                    pFeatureClass = pFeatureLayer.FeatureClass;
                    string str = pFeatureClass.AliasName;
                    pSpatialFilter.set_GeometryEx(pGeometry, false);
                    //设置空间过滤关系为包含
                    pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;
                    pFeatureCursor            = pFeatureClass.Search(pSpatialFilter, false);
                    pFeature = pFeatureCursor.NextFeature();

                    ////遍历所有符合要求的要素,使用IMap::SelectFeature方法将他们添加到图层的选择要素层中去
                    while (pFeature != null)
                    {
                        pMap.SelectFeature(pFeatureLayer, pFeature);
                        pFeature = pFeatureCursor.NextFeature();
                    }
                    pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null);
                    m = this.axMapControl1.Map.SelectionCount;  // 选择要素的个数
                }

                DialogResult result = MessageBox.Show(this, "是否按此范围进行数据分割?", "提示", MessageBoxButtons.YesNo);
                if (result == System.Windows.Forms.DialogResult.Yes)
                {
                    //pFileGDB = Properties.Settings.Default.targetPersonalGDB;//此处是写死的参数,可以修改
                    pFileGDB = dbPath + dbName;
                    //缓冲区
                    pGeometry.SpatialReference = this.axMapControl1.SpatialReference;
                    ITopologicalOperator topologicalOperator = pGeometry as ITopologicalOperator;

                    pBufferGeometry = topologicalOperator.Buffer(pBufferDistance);


                    //打开目标数据库
                    IWorkspaceName pWorkspaceName = new WorkspaceName() as IWorkspaceName;
                    pWorkspaceName.WorkspaceFactoryProgID = "esriDataSourcesGDB.AccessWorkspaceFactory";
                    pWorkspaceName.PathName = pFileGDB;
                    IName             pName     = pWorkspaceName as IName;
                    IFeatureWorkspace target_ws = pName.Open() as IFeatureWorkspace;
                    IWorkspaceEdit    wse       = target_ws as IWorkspaceEdit;

                    //遍历地图控件中的每个图层,进行数据分割
                    for (int i = 0; i < axMapControl1.Map.LayerCount; i++)
                    {
                        pLayer        = pMap.get_Layer(i);
                        pFeatureLayer = (IFeatureLayer)pLayer;
                        pFeatureClass = pFeatureLayer.FeatureClass;
                        string pFeatureClassName = pFeatureClass.AliasName;

                        //打开目标图层
                        IFeatureClass target_fc = target_ws.OpenFeatureClass(pFeatureClassName);

                        //*********设置空间过滤关系为包含,选择框内的要素剪切到第二个个人数据库里,标识为可编辑状态******************
                        pSpatialFilter.set_GeometryEx(pGeometry, false);
                        pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;

                        wse.StartEditing(false);
                        IFeatureCursor target_cur = target_fc.Insert(true);
                        IFeatureBuffer buffer     = target_fc.CreateFeatureBuffer();

                        pFeatureCursor = pFeatureClass.Update(pSpatialFilter, true);
                        pFeature       = pFeatureCursor.NextFeature();

                        while (pFeature != null)
                        {
                            for (int n = 0; n < pFeatureClass.Fields.FieldCount; n++)
                            {
                                IField source_field = pFeatureClass.Fields.get_Field(n);
                                if (source_field.Name != pFeatureClass.OIDFieldName && source_field.Name != "SHAPE_Area" && source_field.Name != "SHAPE_Length")
                                {
                                    int target_field_index = pFeatureClass.FindField(source_field.Name);
                                    if (target_field_index != -1)
                                    {
                                        if (source_field.Name == "Editable")
                                        {
                                            buffer.set_Value(target_field_index, 1);//选择框内的要素设定为可编辑
                                        }
                                        else
                                        {
                                            object source_value = pFeature.get_Value(pFeatureClass.FindField(source_field.Name));
                                            buffer.set_Value(target_field_index, source_value);
                                        }
                                    }
                                }
                            }
                            target_cur.InsertFeature(buffer);   //新的mdb图层中增加一条记录
                            pFeatureCursor.DeleteFeature();     //删除原数据库中的要素,保证每一个可编辑要素有并且只存在一个数据库中
                            pFeature = pFeatureCursor.NextFeature();
                        }

                        System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);   //释放资源


                        //***************设置空间过滤关系为相交,缓冲区内的要素复制到第二个个人数据库里,但标识为不可编辑状态****************
                        pSpatialFilter.set_GeometryEx(pBufferGeometry, false);
                        pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIndexIntersects;


                        pFeatureCursor = pFeatureClass.Search(pSpatialFilter, true);
                        pFeature       = pFeatureCursor.NextFeature();

                        while (pFeature != null)
                        {
                            for (int n = 0; n < pFeatureClass.Fields.FieldCount; n++)
                            {
                                IField source_field = pFeatureClass.Fields.get_Field(n);
                                if (source_field.Name != pFeatureClass.OIDFieldName && source_field.Name != "SHAPE_Area" && source_field.Name != "SHAPE_Length")
                                {
                                    int target_field_index = pFeatureClass.FindField(source_field.Name);
                                    if (target_field_index != -1)
                                    {
                                        if (source_field.Name == "Editable")
                                        {
                                            buffer.set_Value(target_field_index, 0);//缓冲区内的要素设定为不可编辑
                                        }
                                        else
                                        {
                                            object source_value = pFeature.get_Value(pFeatureClass.FindField(source_field.Name));
                                            buffer.set_Value(target_field_index, source_value);
                                        }
                                    }
                                }
                            }
                            target_cur.InsertFeature(buffer);   //新的mdb图层中增加一条记录
                            pFeature = pFeatureCursor.NextFeature();
                        }
                        target_cur.Flush();
                        wse.StopEditing(true);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);   //释放资源
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(target_cur);
                        System.Runtime.InteropServices.Marshal.ReleaseComObject(buffer);
                    }

                    System.Runtime.InteropServices.Marshal.ReleaseComObject(target_ws);
                    MessageBox.Show("数据分割成功!", "提示", MessageBoxButtons.OK);
                }
                pIsSelect = false;
                //*****************************************
            }
        }