本次使用WEbTool自定义工具,实现一个简单的功能
效果描述:
在激发自定义工具后,在地图界面点击时,弹出该点的客户端坐标,与相应的经纬度坐标
一:先从客户端处理怎么发送请求
1:拖webtool工具到界面
将工具WebTool 拖到MapForm.aspx界面上,设置对应的地图如下:
< cc1:WebTool ID ="WebTool1" runat ="server" MapControlID ="MapControl1" />
< cc1:WebTool ID ="WebTool1" runat ="server" MapControlID ="MapControl1" />
说明:
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
客户端有三个重要的脚本:在项目MapXtremeWebResources文件夹下
1.Interaction.js---交互类型脚本
(已实现的有:ClickInteraction(单击)、RectInteraction(画矩形)..等等,基本是和已有工具对应的)
2.Command.js----命令发送请求脚本
(已实现的有:MapCommand(获取地图)、PanCommand(拖动地图)、DistanceCommand(测量)..等等,基本是和已有工具对应的)
3.Tool.js----------工具命令状态激活脚本
(在激活不同的工具时,改变命令的请求参数)
1.Interaction.js---交互类型脚本
(已实现的有:ClickInteraction(单击)、RectInteraction(画矩形)..等等,基本是和已有工具对应的)
2.Command.js----命令发送请求脚本
(已实现的有:MapCommand(获取地图)、PanCommand(拖动地图)、DistanceCommand(测量)..等等,基本是和已有工具对应的)
3.Tool.js----------工具命令状态激活脚本
(在激活不同的工具时,改变命令的请求参数)
[现在开始处理自定义的客户端脚本请求]
2:设置工具属性事件为点击
交互:由于要实现的功能,交互类型也是通过点击引发的,交互就直接使用已有的ClickInteraction
因此设置工具属性:ClientInteraction="ClickInteraction"
因此设置工具属性:ClientInteraction="ClickInteraction"
3:设置工具命令[使用测量工具的命令功能]
命令:由于要实现的功能,客户端类型在接收服务端返回的消息后,直接弹出,这点和测量功能是一样的,于是命令就直接使用DistanceCommand
因此设置工具属性:ClientCommand="DistanceCommand"
因此设置工具属性:ClientCommand="DistanceCommand"
4:自定义命令关键字
再设置一个自定义命令文本:Command="GetXY" --这个GetXY是随便起的名字,等一下对应服务端的请求命令
OK,至此,客户端处理完成,实际我们什么也没做,只是把工具往界面一拖,然后设置了一下属性:
<
cc1:WebTool
ID
="WebTool1"
runat
="server"
MapControlID
="MapControl1"
ClientInteraction
="ClickInteraction"
Command
="GetXY"
ClientCommand
="DistanceCommand"
/>
二:服务端接收请求并输出信息
1:新建自定义命令类:WebInfoGetXY
在App_Code里,我们新建一个类,叫WebInfoGetXY,让它继承自MapInfo.WebControls.MapBaseCommand
同时加上可序列化属性[Serializable],不加就报错了,配置文件那节里有说到
在构造函数里,写base.Name = "GetXY";//这个就对应了客户端发送的Command
同时加上可序列化属性[Serializable],不加就报错了,配置文件那节里有说到
在构造函数里,写base.Name = "GetXY";//这个就对应了客户端发送的Command
代码如下:
[Serializable]
public class WebInfoGetXY:MapInfo.WebControls.MapBaseCommand
{
public WebInfoGetXY()
{
base .Name = " GetXY " ;
}
}
public class WebInfoGetXY:MapInfo.WebControls.MapBaseCommand
{
public WebInfoGetXY()
{
base .Name = " GetXY " ;
}
}
然后,重写一下Process()方法输出文本即可,代码如下
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
public
override
void
Process()
{
MapControlModel model = MapControlModel.GetModelFromSession();
MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);
System.Drawing.Point[] points = ExtractPoints(DataString);
MapInfo.Geometry.DPoint dpoint = new MapInfo.Geometry.DPoint();
map.DisplayTransform.FromDisplay(points[ 0 ], out dpoint); // 屏幕xy转经纬度
string outText = " 屏幕xy: " + points[ 0 ].X + " , " + points[ 0 ].Y;
outText += " <br>经纬度xy: " + dpoint.x + " , " + dpoint.y;
HttpContext.Current.Response.Write(outText);
}
{
MapControlModel model = MapControlModel.GetModelFromSession();
MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);
System.Drawing.Point[] points = ExtractPoints(DataString);
MapInfo.Geometry.DPoint dpoint = new MapInfo.Geometry.DPoint();
map.DisplayTransform.FromDisplay(points[ 0 ], out dpoint); // 屏幕xy转经纬度
string outText = " 屏幕xy: " + points[ 0 ].X + " , " + points[ 0 ].Y;
outText += " <br>经纬度xy: " + dpoint.x + " , " + dpoint.y;
HttpContext.Current.Response.Write(outText);
}
OK,服务端到此也就结束了
三:在页面上用代码注册工具命令
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
if (Session.IsNewSession)
{
MapInfo.WebControls.MapControlModel model = MapInfo.WebControls.MapControlModel.SetDefaultModelInSession();
model.Commands.Add(new WebInfoGetXY());
}
{
MapInfo.WebControls.MapControlModel model = MapInfo.WebControls.MapControlModel.SetDefaultModelInSession();
model.Commands.Add(new WebInfoGetXY());
}
四:运行效果
在激发自定义工具后,在地图界面点击时,弹出该点的客户端坐标,与相应的经纬度坐标
提供代码下载:点击下载