using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using GeoScene.Globe; using System.IO; using GeoScene.Data; using GeoScene.Engine; using System.Collections; namespace Cyberpipe { public partial class FrmExportVector :DevComponents.DotNetBar.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) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(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); this.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) { this.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++) { GeoScene.Data.GSOFieldDefn fielddef = (GeoScene.Data.GSOFieldDefn)(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; } } }