创建新的图层 先要设置图层的TableDesc 也就是属性字段 ,让后利用AddGeoDataset 方法就可以产生新的Geodataset(数据集),如把他加载到新的DataConnection就产生一个新的shape图层文件
这写了简单的测试 例子 实际使用的时候 不能把字段写死
using System; using System.Collections.Generic; using System.Linq; using System.Text; using MapObjects2; using System.Windows.Forms; using System.Collections; namespace roadEditTool { /// <summary> /// /// </summary> class MODataOperate { public GeoDataset gobj_gds; public string gs_shpName; public TableDesc gobj_desc = new TableDesc(); public DataConnection gobj_dc = new DataConnection(); public MapLayer gobj_layer = new MapLayer(); //新建一个shp文件 public void createShpFile() { SaveFileDialog lobj_saveShp = new SaveFileDialog(); lobj_saveShp.Filter = "shape|*.shp"; lobj_saveShp.RestoreDirectory = true; if (lobj_saveShp.ShowDialog() == DialogResult.OK) { // lobj_saveShp.OpenFile(); if (lobj_saveShp.FileName == null || lobj_saveShp.FileName.Trim() == "") { MessageBox.Show("文件名称不能为空"); return; } gs_shpName = lobj_saveShp.FileName.Substring(0, lobj_saveShp.FileName.Length - 4); gobj_dc.Database = gs_shpName.Substring(0, gs_shpName.LastIndexOf("\\")); gs_shpName = gs_shpName.Substring(gs_shpName.LastIndexOf("\\") + 1, gs_shpName.Length - gs_shpName.LastIndexOf("\\") - 1); createFileds(); addDataset(); mapLayer(); gobj_dc.Disconnect(); gobj_layer = null; gobj_desc = null; gobj_gds = null; gobj_dc = null; } } //打开shp数据 public void openShpFile() { string ls_FileName = null; string ls_path = null; OpenFileDialog lobj_saveShp = new OpenFileDialog(); lobj_saveShp.Filter = "shape|*.shp"; lobj_saveShp.RestoreDirectory = true; if (lobj_saveShp.ShowDialog() == DialogResult.OK) { ls_FileName = lobj_saveShp.SafeFileName.Split('.')[0].ToString().Trim(); System.IO.FileInfo file = new System.IO.FileInfo(lobj_saveShp.FileName); ls_path = file.DirectoryName; // lobj_saveShp.OpenFile(); if (lobj_saveShp.FileName == null || lobj_saveShp.FileName.Trim() == "") { MessageBox.Show("文件名称不能为空"); return; } //gs_shpName = lobj_saveShp.FileName.Substring(0, lobj_saveShp.FileName.Length - 4); //gobj_dc.Database = gs_shpName.Substring(0, gs_shpName.LastIndexOf("\\")); // gs_shpName = gs_shpName.Substring(gs_shpName.LastIndexOf("\\") + 1, gs_shpName.Length - gs_shpName.LastIndexOf("\\") - 1); gobj_layer= AddShape(ls_path, ls_FileName, true); } } //三维显示 public void openLayer() { /*Recordset rs = gobj_layer.GeoDataset; do { }while();*/ } //添加一个图层 public void mapLayer() { gobj_layer.GeoDataset = gobj_gds; } public MapObjects2.MapLayer AddShape(string basepath, string fileName, bool mHasMeasure) { try { mHasMeasure = false; gobj_dc.Database = basepath; if (gobj_dc.Connect()) { gobj_gds = gobj_dc.FindGeoDataset(fileName); if (gobj_gds == null) { MessageBox.Show("打开shape文件异常"); return null; } else { MapLayer newLayer = new MapLayer(); newLayer.GeoDataset = gobj_gds; mHasMeasure = gobj_gds.HasMeasure; gobj_dc = null; gobj_gds = null; return newLayer; } } else { gobj_dc = null; gobj_gds = null; return null; } } catch (Exception EX) { log.log.appLog.Error("Error:加载shp数据异常", EX); return null; } } //新建字段 public void createFileds() { gobj_desc.FieldCount = 10; //字段名称 gobj_desc.set_FieldName(0, "路线名称"); gobj_desc.set_FieldName(1, "路线代码"); gobj_desc.set_FieldName(2, "起点桩号"); gobj_desc.set_FieldName(3, "止点桩号"); gobj_desc.set_FieldName(4, "L"); gobj_desc.set_FieldName(5, "ROADNAME"); gobj_desc.set_FieldName(6, "ROADCODE"); gobj_desc.set_FieldName(7, "FMEAS"); gobj_desc.set_FieldName(8, "TMEAS"); gobj_desc.set_FieldName(9, "GUID"); //字段类型 gobj_desc.set_FieldType(0, FieldTypeConstants.moString); gobj_desc.set_FieldType(1, FieldTypeConstants.moString); gobj_desc.set_FieldType(2, FieldTypeConstants.moDouble); gobj_desc.set_FieldType(3, FieldTypeConstants.moDouble); gobj_desc.set_FieldType(4, FieldTypeConstants.moDouble); gobj_desc.set_FieldType(5, FieldTypeConstants.moString); gobj_desc.set_FieldType(6, FieldTypeConstants.moString); gobj_desc.set_FieldType(7, FieldTypeConstants.moDouble); gobj_desc.set_FieldType(8, FieldTypeConstants.moDouble); gobj_desc.set_FieldType(9, FieldTypeConstants.moString); //字段长度 gobj_desc.set_FieldLength(0, 50); gobj_desc.set_FieldLength(1, 50); gobj_desc.set_FieldPrecision(2, 15); gobj_desc.set_FieldScale(2, 3); gobj_desc.set_FieldPrecision(3, 15); gobj_desc.set_FieldScale(3, 3); gobj_desc.set_FieldPrecision(4, 16); gobj_desc.set_FieldScale(4, 11); gobj_desc.set_FieldLength(5, 50); gobj_desc.set_FieldLength(6, 50); gobj_desc.set_FieldPrecision(7, 15); gobj_desc.set_FieldScale(7, 3); gobj_desc.set_FieldPrecision(8, 15); gobj_desc.set_FieldScale(8, 3); gobj_desc.set_FieldLength(9, 50); } //添加记录集 public void addDataset() { gobj_gds = gobj_dc.AddGeoDataset(gs_shpName, ShapeTypeConstants.moShapeTypeLine, gobj_desc, true, true); } //添加矢量线及属性值 public void addLine(Line _line, Hashtable _table) { Recordset rs = gobj_layer.Records; rs.AddNew(); rs.Fields.Item("shape").Value = _line; // rs.Fields.Item("路线名称").Value = _table["路线名称"].ToString().Trim(); setStringValue(rs, "路线名称", _table); setStringValue(rs, "路线代码", _table); seDoubleValue(rs, "起点桩号", _table); seDoubleValue(rs, "止点桩号", _table); rs.Fields.Item("L").Value = _line.Length; setStringValue(rs, "ROADNAME", _table); setStringValue(rs, "ROADCODE", _table); seDoubleValue(rs, "FMEAS", _table); seDoubleValue(rs, "TMEAS", _table); rs.Fields.Item("GUID").Value = Guid.NewGuid().ToString(); rs.Update(); rs.StopEditing(); } private void setStringValue(Recordset rs, string name, Hashtable _table) { string value = _table[name].ToString().Trim(); if (value == null || value == "") return; rs.Fields.Item(name).Value = value; } private void seDoubleValue(Recordset rs, string name, Hashtable _table) { string value = _table[name].ToString().Trim(); if (value == null || value == "") return; rs.Fields.Item(name).Value =Convert.ToDouble(value); } } }