Newer
Older
GHFX_REFACTOR / NewFunction / FrmExportVector.cs
wxn on 9 Nov 2016 8 KB 冗余代码整理
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using GeoScene.Data;
using GeoScene.Engine;
using GeoScene.Globe;

namespace Cyberpipe
{
    public partial class FrmExportVector :Office2007Form
    {
        GSOGlobeControl globeControl1;
        List<string> pipeLineNames = new List<string>();
        public FrmExportVector(GSOGlobeControl globeControl, List<string> listPipelineNames)
        {
            InitializeComponent();
            globeControl1 = globeControl;
            pipeLineNames = listPipelineNames;
        }
        /// <summary>
        /// 窗体初始化事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FrmExportCADS_Load(object sender, EventArgs e)
        {            
            if (pipeLineNames.Count > 0)
            {
                for (int i = 0; i < pipeLineNames.Count; i++)
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(pipeLineNames[i]);
                    if (layer != null)
                    {
                        listViewEx1.Items.Add(layer.Caption);                        
                    }
                }
            }
        }
        /// <summary>
        /// 导出按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnExport_Click(object sender, EventArgs e)
        {
            string checkItemText = "";
            if (listViewEx1.SelectedItems.Count > 0)
            {
                checkItemText = listViewEx1.SelectedItems[0].Text.Trim();
                try
                {
                    GSOLayer layer = globeControl1.Globe.Layers.GetLayerByCaption(checkItemText.Trim());
                    if (layer != null)
                    {
                        if (layer.GetAllFeatures().Length <= 0)
                        {
                            MessageBox.Show("要导出的图层为空", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                            return;
                        }
                        layer.Dataset.ImportProjectionRefFromProj4(Utility.projectStr);
                        SaveFileDialog dlg = new SaveFileDialog();
                        dlg.Filter = "*.shp|*.shp|*.kml|*.kml";
                        dlg.FileName = layer.Caption;
                        if (dlg.ShowDialog() == DialogResult.OK)
                        {
                            if (layer.GetAllFeatures().Length > 0)
                            {
                                if (layer.Caption.EndsWith("管线"))
                                {
                                    layer.SaveAs(dlg.FileName);
                                }
                                else
                                {
                                    GSOFeatureDataset featdataset = CreateDBFeatureDataset(layer.GetAllFeatures()[0], "导出点图层", Utility.dataSource);

                                    for (int i = 0; i < layer.GetAllFeatures().Length; i++)
                                    {
                                        GSOFeature feature = layer.GetAt(i);
                                        if (feature != null && feature.Geometry != null)
                                        {
                                            GSOFeature featureNew = featdataset.CreateFeature();

                                            if (feature.Geometry.Type == EnumGeometryType.GeoModel)
                                            {
                                                GSOGeoModel model = feature.Geometry as GSOGeoModel;
                                                GSOGeoPoint3D pointModel = new GSOGeoPoint3D();
                                                pointModel.Position = model.Position;
                                                featureNew.Geometry = pointModel;

                                                for (int m = 0; m < feature.GetFieldCount(); m++)
                                                {
                                                    if (feature.GetFieldCount() > m)
                                                    {
                                                        GSOFieldDefn fielddef = feature.GetFieldDefn(m);

                                                        if (fielddef == null)
                                                            continue;

                                                        object obu = feature.GetValue(fielddef.Name);
                                                        if (obu != null)
                                                        {
                                                            string fieldName = fielddef.Name;
                                                            featureNew.SetValue(fieldName, obu);
                                                        }
                                                    }
                                                }

                                            }
                                            featdataset.AddFeature(featureNew);
                                        }
                                    }
                                    featdataset.Save();

                                    GSOLayer layerTemp = globeControl1.Globe.Layers.Add(featdataset);
                                    
                                    layerTemp.SaveAs(dlg.FileName);

                                    globeControl1.Globe.Layers.Remove(layerTemp);
                                }
                                    MessageBox.Show("导出矢量完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                                    Close();
                                }
                        }
                    }
                    else
                    {
                        MessageBox.Show("请选中要导出的图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    }
                }
                catch (Exception ex)
                {
                    LogError.PublishError(ex);
                }
            }
            else
            {
                MessageBox.Show("请选中要导出的图层!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        
        /// <summary>
        /// 关闭按钮事件处理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClose_Click(object sender, EventArgs e)
        {            
            Close();
        }
        /// <summary>
        /// 创建数据库表
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        private GSOFeatureDataset CreateDBFeatureDataset(GSOFeature feature, string name,GSODataSource ds)
        {
            if (feature == null)
            {
                MessageBox.Show("图层要素个数为0!", "提示");
                return null;
            }
            GSODataset dataset = ds.GetDatasetByName("导出点图层");
            GSOFeatureDataset featDs = null;
            if (dataset != null)
            {
                ds.DeleteDatasetByName("导出点图层");
            }

            featDs = ds.CreateFeatureDataset(name);
            

            if (featDs == null)
            {
                MessageBox.Show("图层名称不符合要求!", "提示");
                return null;
            }
            for (int i = 0; i < feature.GetFieldCount(); i++)
            {
                GSOFieldDefn fielddef = feature.GetFieldDefn(i);

                GSOFieldAttr field = new GSOFieldAttr();

                field.Name = fielddef.Name;
                switch (fielddef.Type)
                {
                    case EnumFieldType.Text:
                        field.Type = EnumFieldType.Text;
                        field.Width = 8000;
                        break;
                    case EnumFieldType.INT32:
                        field.Type = EnumFieldType.INT32;
                        field.Width = 4;
                        break;
                    case EnumFieldType.Double:
                        field.Type = EnumFieldType.Double;
                        field.Width = 8;
                        break;
                    case EnumFieldType.Date:
                        field.Type = EnumFieldType.Date;
                        field.Width = 10;
                        break;
                }
                bool res = featDs.AddField(field);
            }

            featDs.Save();
            return featDs;
        }


    }
}