C#进行MapX二次开发之控件基本操作
上篇介绍了MapX的部分基本使用代码,包括放大、缩小、缩放到初始大小(全图)、平移、矩形选择、圆形选择、箭头、打开图层对话框 、打开ActiveX属性对话框 、添加符号等基本操作代码,本篇继续探讨一些控件的基本操作。
MapX提供的标准工具,不同的工具将会使鼠标能够完成多种任务。例如,如果当前的工具设成
miLabelTool
,那么当单击鼠标时,会在此特指的地图对象上放置标签。鼠标光标将根据正使用的工具更改形状。
MapX
可用的标准工具列表如下所示:
|
常量 |
描述 |
|
MiAddLineTool |
向插入图层添加线图元 |
|
MiAddPointTool |
单击从而向插入图层添加点图元。 |
|
MiAddPolyLineTool |
添加折线图元到插入图层 |
|
MiAddRegionTool |
添加区域图元到插入图层。 |
|
MiArrowTool |
单击标题或注释。并且,它也可用在可编辑的图层中移动选中的图元或者改变其大小。 |
|
MiCenterTool |
单击鼠标使地图居中显示。 |
|
miLabelTool |
单击图元进行标注。 |
|
MiPanTool |
拖动地图并重定位地图的中心。 |
|
MiPolygonSelectTool |
单击鼠标画多边形;在多边形内的对象被选中。 |
|
MiRadiusSelectTool |
拖动鼠标并选中在拖动半径内的图元。 |
|
MiRectSelectTool |
拖动鼠标选中在矩形内的图元。 |
|
miSelectTool |
单击选择图元。 |
|
miSymbolTool |
放置符号注释。 |
|
miTextTool |
放置文本注释。 |
|
miZoomInTool |
放大。 |
|
miZoomOutTool |
缩小。 |
导出地图为图片的操作代码:
if
(axMap1.GeoSet.Length
<
1
)
{
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);
}
}
添加图层的操作代码
=
new
OpenFileDialog();
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
x
=
0
;
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);
放置点工具操作
try
{
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
方法来创建自定义工具。
创建自定义工具时,需要控制创建工具的“类型”,即:就是要选择此工具是否允许用户单击,或是单击并拖动来画线,或是单击并拖动来画矩形等等。也可以选择使用自定义工具时显示的光标。
下面是自定义测量距离和测量面积的操作代码
private
void
Form1_Load(
object
sender, EventArgs e)
{
//
记录地图的比例合中心点
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
使用户可以画圆等)。
自定义工具创建以后,需要为该工具实际要做的编写代码。
|
行为 |
|
在指定位置显示点。 |
|
画线。 |
|
画圆。 |
|
画选取框,并选在此框中选择地图对象。 |
|
画折线。 |
|
画多边形。 |