建站极客
软件编程 C#教程 正文
C#+MO实现一个道路编辑软件(刚开始)
所属分类:
软件编程 / C#教程
阅读数:
62
收藏 0
赞 0
分享
//********************************************************** //******主窗口程序 //******************************************************** using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace IRND_DPT { public partial class frmMain : Form { IRND_DPT.layerVariable pubLayerVariable = new layerVariable (); public frmMain() { InitializeComponent(); } //添加图层 private void tlbAddLayer_Click(object sender, EventArgs e) { IRND_DPT.OpenFile AddFile = new OpenFile(); AddFile.OpenShapeFiles(CD1,axMap1 ); object refMap = (object)this.axMap1; bool refTrue = true; short refShort = 0; axlegend1.setMapSource(ref refMap); axlegend1.ShowAllLegend(); axlegend1.LoadLegend(ref refTrue); axlegend1.set_Active(ref refShort, true); axMap1.Refresh(); axlegend1.Refresh(); //AddFile(CD1, axMap1); } //删除图层 private void toolStripButton4_Click(object sender, EventArgs e) { if (pubLayerVariable.MapLayerIndex >= 0) { for (int i = 0; i <= axMap1.Layers.Count - 1; i++) { axMap1.Layers.Remove(pubLayerVariable.MapLayerIndex); break; } bool refTrue = true; axMap1.Refresh(); axlegend1.LoadLegend(ref refTrue); } } private void axlegend1_AfterSetLayerVisible(object sender,AxSampleLegendControl.__legend_AfterSetLayerVisibleEvent e) { axMap1.Refresh(); } private void axlegend1_LayerDblClick(object sender, AxSampleLegendControl.__legend_LayerDblClickEvent e) { } private void axlegend1_MouseDownEvent(object sender, AxSampleLegendControl.__legend_MouseDownEvent e) { if (e.index >= 0) { MapObjects2.MapLayer layer= (MapObjects2.MapLayer )axMap1.Layers.Item(e.index ); pubLayerVariable.MapLayerName = layer.Name; pubLayerVariable.MapLayerIndex = e.index; } axMap1.TrackingLayer.Refresh(true, axMap1.Extent); } //放大 private void tlb_ZoomIn_Click(object sender, EventArgs e) { axMap1.MousePointer = MapObjects2.MousePointerConstants.moZoomIn; } //缩小 private void tlb_ZoomOut_Click(object sender, EventArgs e) { axMap1.MousePointer = MapObjects2.MousePointerConstants.moZoomOut; } //漫游 private void tlb_Pan_Click(object sender, EventArgs e) { axMap1.MousePointer = MapObjects2.MousePointerConstants.moPan; } //全图 private void tbl_Full_Click(object sender, EventArgs e) { axMap1.Extent = axMap1.FullExtent; axMap1.MousePointer = MapObjects2.MousePointerConstants.moArrow; } //逐渐放大 private void tbl_SmallIn_Click(object sender, EventArgs e) { MapObjects2.Rectangle r = axMap1.Extent; r.ScaleRectangle(0.9); axMap1.Extent = r; } //逐渐缩小 private void tbl_SmallOut_Click(object sender, EventArgs e) { MapObjects2.Rectangle r = axMap1.Extent; r.ScaleRectangle(1.1); axMap1.Extent = r; } //选择查询 private void tbl_Identify_Click(object sender, EventArgs e) { axMap1.MousePointer = MapObjects2.MousePointerConstants.moIdentify; } //属性浏览 private void toolStripButton2_Click(object sender, EventArgs e) { if (pubLayerVariable.MapLayerIndex >= 0 & pubLayerVariable.MapLayerName != null) { MapObjects2.MapLayer lyr = (MapObjects2.MapLayer )axMap1.Layers.Item(pubLayerVariable.MapLayerName); IRND_DPT.frmBrowseAttr frmBrowset = new frmBrowseAttr(); frmBrowset.IniListview(lyr); frmBrowset.ShowDialog(this); } } //地图响应事件 private void axMap1_MouseDownEvent(object sends, AxMapObjects2._DMapEvents_MouseDownEvent e) { MapObjects2.Rectangle rect; MapObjects2.Point curp; MapObjects2.MapLayer lyr; MapObjects2.Recordset rest; switch (axMap1.MousePointer) { //放大 case MapObjects2.MousePointerConstants.moZoomIn: { rect = axMap1.TrackRectangle(); if (rect.Width == 0 || rect.Height == 0) { rect = axMap1.Extent; rect.ScaleRectangle(0.5); } axMap1.Extent = rect; break; } //缩小 case MapObjects2.MousePointerConstants.moZoomOut: { MapObjects2.Rectangle Tempr; Tempr = axMap1.Extent; rect = axMap1.TrackRectangle(); double NewSR; if (rect.Width != 0 || rect.Height != 0) { if (axMap1.Extent.Width / rect.Width > axMap1.Extent.Height / rect.Height) { NewSR = axMap1.Extent.Height / rect.Height; } else { NewSR = axMap1.Extent.Width / rect.Width; } Tempr.ScaleRectangle(NewSR); } else { Tempr.ScaleRectangle(2.0); } axMap1.Extent = Tempr; break; } //漫游 case MapObjects2.MousePointerConstants.moPan: { axMap1.Pan(); break; } //选择查询 case MapObjects2.MousePointerConstants.moIdentify: { if (pubLayerVariable.MapLayerIndex >= 0 && pubLayerVariable.MapLayerName != "") { rect = axMap1.TrackRectangle(); lyr = (MapObjects2.MapLayer)axMap1.Layers.Item(pubLayerVariable.MapLayerIndex); if (rect.Width == 0) { curp = axMap1.ToMapPoint(e.x, e.y); rest = lyr.SearchByDistance(curp, (double)axMap1.ToMapDistance((float)Screen.PrimaryScreen.WorkingArea.X * 5), ""); } else { rest = lyr.SearchShape(rect, MapObjects2.SearchMethodConstants.moAreaIntersect, ""); } if (rest.EOF!=true) { axMap1.FlashShape(rest.Fields.Item("shape").Value, 2); IRND_DPT.frmIdentify FunctionClass = new frmIdentify(); ////FunctionClass.Close(); FunctionClass.CurRecordSet(rest); FunctionClass.IniTvFeat(rest, lyr.Name); FunctionClass.IniLvwAttr(rest); FunctionClass.Show(this); } } break; } } } //////// /////////////////////////////////////////////////////////////////////////////////////////////// } } //************************************************* //********属性查询 //************************************************ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace IRND_DPT { public partial class frmIdentify : Form { MapObjects2.Recordset mrs; public frmIdentify() { InitializeComponent(); } private void frmIdentify_Load(object sender, System.EventArgs e) { lvwAttr.View = View.Details; lvwAttr.Columns.Add("字段",50,HorizontalAlignment.Left ); lvwAttr.Columns.Add ("值",50,HorizontalAlignment.Center ); } // private void tvFeat_NodeMouseClick(object sender, System.Windows.Forms.TreeNodeMouseClickEventArgs e) { string ID; ListViewItem Item; //if (e.Node.Parent == null) { return; } lvwAttr.Items.Clear(); ID = e.Node.Text; mrs.MoveFirst(); while (mrs.EOF != true) { if (ID == mrs.Fields.Item("FeatureID").ValueAsString) { for (short fld = 1; fld < mrs.TableDesc.FieldCount; fld++) { Item = lvwAttr.Items.Add(mrs.TableDesc.get_FieldName(fld)); Item.SubItems.Add(mrs.Fields.Item(Item.Text).ValueAsString); } lvwAttr.Refresh(); break; } mrs.MoveNext(); } } public void CurRecordSet(MapObjects2.Recordset vNewValue) { mrs = vNewValue; } public void IniLvwAttr(MapObjects2.Recordset rst) { TreeNode n=null ; ListViewItem Item; string ID; lvwAttr.Items.Clear(); if (tvFeat.Nodes.Count >= 2) { int i = 0; foreach (TreeNode tn in tvFeat.Nodes) { i=i+1; if (i == 2) { n = tn; break; } } if (n.Text != null) { rst.MoveFirst(); ID = rst.Fields.Item("FeatureID").ValueAsString; while (rst.EOF != true) { if (ID == n.Text) { for (short fld = 1; fld < rst.TableDesc.FieldCount; fld++) { Item = lvwAttr.Items.Add(rst.TableDesc.get_FieldName(fld)); Item.SubItems.Add(rst.Fields.Item(Item.Text).ValueAsString); } lvwAttr.Refresh(); break; } } } } } //将选择的记录集加入到树型控件中进行显示 public void IniTvFeat(MapObjects2.Recordset moRs_in, string lyrName_in) { TreeNode n; string ID; if (moRs_in.EOF != true) { moRs_in.MoveFirst(); tvFeat.Nodes.Clear(); n = tvFeat.Nodes.Add(lyrName_in); n=n.Parent; while (moRs_in.EOF != true) { ID = moRs_in.Fields.Item("FeatureID").ValueAsString; n= tvFeat.Nodes.Add(ID); moRs_in.MoveNext(); } } } ///////zuihou//////////////////////////////////////////////////////////////////////////// } } //************************************************************* //************加载图层函数 //************************************************************* using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace IRND_DPT { class OpenFile { //功能说明: // 从公共对话框中提取文件名,然后调用不同的子模块处理不同的文件加入图层的问题(支持打开多个文件) public void OpenShapeFiles(OpenFileDialog comopenfile,AxMapObjects2.AxMap map) { try { string strShape, strCov, strCAD, strVPF, strImage, strMilImage; //将过滤器设置为可支持的文件 strShape = "ESRI ShapeFiles(*.shp)|*.shp"; strCov = "ESRI Coverages(*.adf,*.tat,*.pat,*.rat)|aat.adf;pat.adf;nat.adf;txt.adf;*.tat;*.pat;*.rat"; strCAD = "AutoCAD File (*.dwg,*.dxf)|*.dwg;*.dxf"; strImage ="All Image(*.bmp,*.dib,*.tif,*.jpg,*.jff,*.bil,*.bip,*.bsq,*.gis,*.lan,*.rlc,*.sid,*.sun,*.rs,*.ras,*.svf,*.img,*.gif)|*.bmp,*.dib,*.tif,*.jpg,*.jff,*.bil,*.bip,*.bsq,*.gis,*.lan,*.rlc,*.sid,*.sun,*.rs,*.ras,*.svf,*.img,*.gif"; comopenfile.CheckFileExists = true; //设置过滤 comopenfile.Filter = strShape + "|" + strCov + "|" + strCAD + "|" + strImage ; comopenfile.Title = "添加图层"; //允许选择多个文件,并允许长文件名 comopenfile.Multiselect = true; if (comopenfile.ShowDialog() == DialogResult.OK) { foreach (string strFilename in comopenfile.FileNames) { string sPath = strFilename.Substring(0, strFilename.LastIndexOf("\\") + 1); string sFile = strFilename.Substring(strFilename.LastIndexOf("\\") + 1, strFilename.Length - strFilename.LastIndexOf("\\") - 1); string nametype = sFile.Substring(sFile.LastIndexOf(".") + 1, sFile.Length - sFile.LastIndexOf(".") - 1); open_file(sPath, sFile, nametype, map); } } } catch { MessageBox.Show("图层添加有错!"); } } //功能说明: // 测试文件类型,一便调用不同的子模块.处理不同图层加入的问题 private void open_file(string Path,string filename,string filetype,AxMapObjects2.AxMap mapobject) { string LayerName = filename.Substring(0, filename.LastIndexOf(".")); switch (filetype) { case "shp": shpAdd(Path, filename, mapobject, LayerName, true); break; } } //功能说明: //添加shape格式的文件 public void shpAdd(string databasepath, string filename,AxMapObjects2.AxMap mapobject, string LayerName, bool Hide) { MapObjects2.DataConnection dCon=new MapObjects2.DataConnection() ; // MapObjects2.GeoDataset gSet=new MapObjects2.GeoDataset (); MapObjects2.MapLayer newLayer = new MapObjects2.MapLayer(); long i=0; try { dCon.Database = databasepath; if (dCon.Connect()) { MapObjects2.GeoDataset gSet = dCon.FindGeoDataset(filename); if (gSet == null) { return ; } else { //查看当前是否有重复的图层名,以确保所有的图层名都是唯一的 if (FindMapLayerName(mapobject,LayerName)==true ) { string tempstr = LayerName; while (FindMapLayerName(mapobject, tempstr + "-" + i)==true ) { i++; } LayerName = LayerName + "-" + i; } newLayer.GeoDataset = gSet; if (Hide) { newLayer.Visible = true; } else { newLayer.Visible = false; } //使用默认颜色和样式设置图层 switch (newLayer.shapeType) { case MapObjects2.ShapeTypeConstants.moShapeTypePoint : newLayer.Symbol.Color=11513775; newLayer.Symbol.Size=5; break; case MapObjects2.ShapeTypeConstants .moShapeTypeLine : newLayer.Symbol.Color = 11513775; newLayer.Symbol.Size = 1; break; case MapObjects2.ShapeTypeConstants.moShapeTypePolygon : newLayer.Symbol.SymbolType = 0; newLayer.Symbol.Style = 8; newLayer.Symbol.Color = 12566463; newLayer.Symbol.Outline = true; newLayer.Symbol.OutlineColor = (int)MapObjects2.ColorConstants.moBlack; break; } mapobject.Layers.Add (newLayer); newLayer.Name = LayerName; newLayer.Tag=databasepath + filename ; } } } catch { // MessageBox("加载图层出错!"); } } //功能说明: // 查找map中的图层AxMapObjects2.AxMap mapobject,string LayerName public bool FindMapLayerName(AxMapObjects2.AxMap mapobject, string LayerName) { for (int i=0;i<mapobject.Layers.Count ;i++) { if (mapobject.Layers.Item(i).ToString() ==LayerName ) { return true; } } return false ; } } }