实现手动画线

为了实现在地图上手动画线的功能,煞费了一翻苦心,不过最后实现的方法还是很简单的,只是这个过程复杂了点。所以只有找对了方法才能事半功倍。

当时我的第一反应就是去百度上搜索,但网上关于MapXtreme的资料本来就少,几乎没有找到任何与此相关的。于是只能自己动手,丰衣足食。最开始的想法是,通过JavaScript在客户端画线,把点的坐标传回到服务器端进行处理。于是颇费了一番周折,在网上搜到一些画线的js代码,自己作了一些修改,达到想要的效果。但毕竟对js不熟,接下来就遇到问题了,要控制只能在地图上画线,并且把这些点的数据传回服务器端,还要在服务器端把这些点都提取出来,感觉是非常麻烦的。

在我一愁莫展的时刻,一位朋友为我指明了出路。MapXtreme测距工具在客户端的实现基本上和画线是一样的,并具也要将点传回服务器端进行距离的计算,我怎么没想到时呢,真是一语惊醒梦中人啊!

下面说明一下实现的过程:

(1)首先在后台代码中加入自定义的服务器端命令的类Line。代码如下:
复制内容到剪贴板
代码:

[Serializable]
public class Line : MapInfo.WebControls.MapBaseCommand
{
public Line()
{
Name = "Line";
}

public override void Process()
{
MapControlModel model = MapControlModel.GetModelFromSession();
model.SetMapSize(MapAlias, MapWidth, MapHeight);

//extract points from url of client side.
System.Drawing.Point[] points = ExtractPoints(DataString);

MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);
MapInfo.Mapping.FeatureLayer workLayer = (MapInfo.Mapping.FeatureLayer)map.Layers["LineLayer"];
MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable("LineLayerTable");

for (int i = 0; i < points.Length - 1; i++)
{
DPoint startPoint;
DPoint endPoint;
map.DisplayTransform.FromDisplay(points[i], out startPoint);
map.DisplayTransform.FromDisplay(points[i + 1], out endPoint);
FeatureGeometry lfg = MultiCurve.CreateLine(workLayer.CoordSys, startPoint, endPoint);
MapInfo.Styles.SimpleLineStyle lstyle = new MapInfo.Styles.SimpleLineStyle(
new MapInfo.Styles.LineWidth(3, MapInfo.Styles.LineWidthUnit.Pixel), 2, System.Drawing.Color.OrangeRed);
MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(lstyle);
MapInfo.Data.Feature lft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns);
lft.Geometry = lfg;
lft.Style = cstyle;
lft["index"] = i;
workLayer.Table.InsertFeature(lft);
}

System.IO.MemoryStream ms = model.GetMap(MapAlias, MapWidth, MapHeight, ExportFormat);
StreamImageToClient(ms);
}
}
(2)在页面加载中添加Line的命令注册。代码如下:
复制内容到剪贴板
代码:
if (Session.IsNewSession)
{
MapControlModel model = MapControlModel.SetDefaultModelInSession();
model.Commands.Add(new Line());
}
(3)在页面上拖放一个自定义控件WebTool,对其样式进行设置,有几个属性需要选择:
复制内容到剪贴板
代码:
ID:LineTool1

ClientCommand:MapCommand

ClientInteraction:PolyineInteraction

Command:Line
这样就实现了手动画线的功能,为什么这么简单呢?因为在交互PolyineInteraction中会获取所有点的坐标(测距工具也是使用PolyineInteraction交互),而MapCommand会把点坐标回传到服务器,只要的服务器端,调用System.Drawing.Point[] points = ExtractPoints(DataString)就可以得到所有点的坐标。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值