C#+MO实现一个道路编辑软件(刚开始)
//**********************************************************
//******主窗口程序
//********************************************************
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 ;
}
}
}