上篇介绍了MapX的部分基本使用代码,包括放大、缩小、缩放到初始大小(全图)、平移、矩形选择、圆形选择、箭头、打开图层对话框 、打开ActiveX属性对话框 、添加符号等基本操作代码,本篇继续探讨一些控件的基本操作。
MapX提供的标准工具,不同的工具将会使鼠标能够完成多种任务。例如,如果当前的工具设成 miLabelTool,那么当单击鼠标时,会在此特指的地图对象上放置标签。鼠标光标将根据正使用的工具更改形状。MapX 可用的标准工具列表如下所示:
工具 | 常量 | 描述 |
Add Line | MiAddLineTool | 向插入图层添加线图元 |
Add Point | MiAddPointTool | 单击从而向插入图层添加点图元。 |
Add Polyline | MiAddPolyLineTool | 添加折线图元到插入图层。 |
Add Region | MiAddRegionTool | 添加区域图元到插入图层。 |
Arrow | MiArrowTool | 单击标题或注释。并且,它也可用在可编辑的图层中移动选中的图元或者改变其大小。 |
Center | MiCenterTool | 单击鼠标使地图居中显示。 |
Label | miLabelTool | 单击图元进行标注。 |
Pan | MiPanTool | 拖动地图并重定位地图的中心。 |
Polygon Select | MiPolygonSelectTool | 单击鼠标画多边形;在多边形内的对象被选中。 |
Radius Select | MiRadiusSelectTool | 拖动鼠标并选中在拖动半径内的图元。 |
Rect Select | MiRectSelectTool | 拖动鼠标选中在矩形内的图元。 |
Select Tool | miSelectTool | 单击选择图元。 |
Symbol | miSymbolTool | 放置符号注释。 |
Text | miTextTool | 放置文本注释。 |
Zoom In | miZoomInTool | 放大。 |
Zoom Out | miZoomOutTool | 缩小。 |
导出地图为图片的操作代码:
{
MessageBox.Show( " 未加载地图,不能导出! " );
return ;
}
SaveFileDialog exportFD = new SaveFileDialog();
exportFD.Title = " 导出当前地图 " ;
exportFD.Filter = " windows bitmap(*.bmp)|*.bmp|GIF (*.GIF)|*.gif|JPEG (*.JPG;JPEG;JPE)|*.JPG|PNG (*.PNG)|*.PNG|PSD (*.PSD)|*.PSD|TIFF (*.TIF)|*.TIF " ;
if (exportFD.ShowDialog() == DialogResult.OK && (exportFD.FileName) != null )
{
try
{
axMap1.ExportSelection = true ;
switch (exportFD.FilterIndex)
{
case 1 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatBMP, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 2 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatGIF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 3 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatJPEG, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 4 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatPNG, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 5 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatPSD, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 6 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatTIF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
case 7 :
axMap1.ExportMap(exportFD.FileName, MapXLib.ExportFormatConstants.miFormatWMF, axMap1.MapPaperWidth, axMap1.MapPaperHeight);
break ;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
添加图层的操作代码
if (openFile.ShowDialog() == DialogResult.OK)
{
axMap1.Layers.Add(openFile.FileName, 0 ); // 默认值为0,C#调用不能省略默认值,图层的位置
MapXLib.LayerInfo liinfo;
liinfo = new MapXLib.LayerInfoClass();
liinfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
liinfo.AddParameter( " AutoCreateDataset " , true );
}
查找图元信息:
mX = this .axMap1.Layers[ 1 ].AllFeatures;
this .listView1.Items.Clear();
foreach (MapXLib.Feature mY in mX)
{
ListViewItem mZ = new ListViewItem(mY._FeatureID.ToString());
mZ.SubItems.Add(mY.Name.ToString());
this .listView1.Items.Add(mZ);
}
查找图层信息
mX = this .axMap1.Layers;
this .listView1.Items.Clear();
foreach (MapXLib.Layer mY in mX)
{
ListViewItem mZ = new ListViewItem(mY._Name);
this .listView1.Items.Add(mZ);
}
获取鼠标移动的坐标
double y = 0 ;
axMap1.ConvertCoord( ref e.x, ref e.y, ref x, ref y, MapXLib.ConversionConstants.miScreenToMap);
toolStripStatusLabel1.Text = string .Format( " X:{0} Y:{1} " , x, y);
放置点工具操作
{
MapXLib.Layer mX;
mX = this .axMap1.Layers[ 1 ];
mX.Editable = true ;
this .axMap1.Layers.InsertionLayer = mX;
this .axMap1.CurrentTool = MapXLib.ToolConstants.miAddPointTool;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
MapX自定义工具的使用:
如果需要一种 MapX 没有提供的工具栏按钮,可以使用 Map.CreateCustomTool 方法来创建自定义工具。创建自定义工具时,需要控制创建工具的“类型”,即:就是要选择此工具是否允许用户单击,或是单击并拖动来画线,或是单击并拖动来画矩形等等。也可以选择使用自定义工具时显示的光标。
下面是自定义测量距离和测量面积的操作代码
{
// 记录地图的比例合中心点
this .MapZoom = axMap1.Zoom;
this .CenterX = axMap1.CenterX;
this .CenterY = axMap1.CenterY;
// 创建测量距离的
axMap1.CreateCustomTool( 99 , MapXLib.ToolTypeConstants.miToolTypePoly, MapXLib.CursorConstants.miCrossCursor,
MapXLib.CursorConstants.miCrossCursor, MapXLib.CursorConstants.miCrossCursor, false );
// 创建测量面积的工具
axMap1.CreateCustomTool( 98 , MapXLib.ToolTypeConstants.miToolTypePolygon, MapXLib.CursorConstants.miCrossCursor,
MapXLib.CursorConstants.miCrossCursor, MapXLib.CursorConstants.miCrossCursor, false );
}
private void axMap1_PolyToolUsed( object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
{
if (e.toolNum == 99 ) // 测量距离
{
MapXLib.Points pts = (MapXLib.Points)e.points;
MapXLib.Point pt1, pt2;
double d = 0.0 ;
// 计算顺序两个点距离,累计得到总距离
for ( int i = 1 ; i < pts.Count; i ++ )
{
pt1 = pts[i];
pt2 = pts[i + 1 ];
d += axMap1.Distance(pt1.X, pt1.Y, pt2.X, pt2.Y);
}
this .Text = " 距离: " + d.ToString();
}
else if (e.toolNum == 98 ) // 面积
{
MapXLib.Points pts = (MapXLib.Points)e.points;
// 偷懒了但是很正确
MapXLib.FeatureFactory dd = axMap1.FeatureFactory;
MapXLib.Style style = axMap1.DefaultStyle;
this .Text = " 面积: " + dd.CreateRegion(pts, style).Area.ToString();
}
}
private void btnGetDistance_Click( object sender, EventArgs e)
{
// 测量距离
axMap1.CurrentTool = (MapXLib.ToolConstants) 99 ;
}
private void btnGetArea_Click( object sender, EventArgs e)
{
// 测量面积
axMap1.CurrentTool = (MapXLib.ToolConstants) 98 ;
}
以上代码有一个是事件操作,如果没有采用事件映射的操作,那么要添加下面的代码:
this.axMap1.PolyToolUsed += new AxMapXLib.CMapXEvents_PolyToolUsedEventHandler(this.axMap1_PolyToolUsed);
自定义工具类型的ToolTypeConstants 描述当创建一个自定义工具时可使用的工具类型。它们描述工具的行为(例如,miToolTypeLine 使用户可以画线;miToolTypeCircle 使用户可以画圆等)。自定义工具创建以后,需要为该工具实际要做的编写代码。
常量 | 行为 |
miToolTypePoint | 在指定位置显示点。 |
miToolTypeLine | 画线。 |
miToolTypeCircle | 画圆。 |
miToolTypeMarquee | 画选取框,并选在此框中选择地图对象。 |
miToolTypePoly | 画折线。 |
miToolTypePolygon | 画多边形。 |