cl991036
管理员
管理员
  • 注册日期2003-07-25
  • 发帖数5917
  • QQ14265545
  • 铜币29669枚
  • 威望217点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • GIS帝国铁杆
阅读:1357回复:0

MapXtreme 2005学习(8):实现手动画线

楼主#
更多 发布于:2008-08-21 10:38
为了实现在地图上手动画线的功能,煞费了一翻苦心,不过最后实现的方法还是很简单的,只是这个过程复杂了点。所以只有找对了方法才能事半功倍。<br><br>当时我的第一反应就是去百度上搜索,但网上关于MapXtreme的资料本来就少,几乎没有找到任何与此相关的。于是只能自己动手,丰衣足食。最开始的想法是,通过JavaScript在客户端画线,把点的坐标传回到服务器端进行处理。于是颇费了一番周折,在网上搜到一些画线的js代码,自己作了一些修改,达到想要的效果。但毕竟对js不熟,接下来就遇到问题了,要控制只能在地图上画线,并且把这些点的数据传回服务器端,还要在服务器端把这些点都提取出来,感觉是非常麻烦的。<br><br>在我一愁莫展的时刻,一位朋友为我指明了出路。MapXtreme测距工具在客户端的实现基本上和画线是一样的,并具也要将点传回服务器端进行距离的计算,我怎么没想到时呢,真是一语惊醒梦中人啊!<br><br>下面说明一下实现的过程:<br><br>(1)首先在后台代码中加入自定义的服务器端命令的类Line。代码如下:<br><br> <br>   [Serializable]<br>    public class Line : MapInfo.WebControls.MapBaseCommand<br>    {<br>        public Line()<br>        {<br>            Name = "Line";<br>        }<br><br>        public override void Process()<br>        {<br>            MapControlModel model = MapControlModel.GetModelFromSession();<br>            model.SetMapSize(MapAlias, MapWidth, MapHeight);<br><br>            //extract points from url of client side.<br>            System.Drawing.Point[] points = ExtractPoints(DataString);<br><br>            MapInfo.Mapping.Map map = model.GetMapObj(MapAlias);<br>            MapInfo.Mapping.FeatureLayer workLayer = (MapInfo.Mapping.FeatureLayer)map.Layers["LineLayer"];<br>            MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable("LineLayerTable");<br><br>            for (int i = 0; i < points.Length - 1; i++)<br>            {<br>                DPoint startPoint;<br>                DPoint endPoint;<br>                map.DisplayTransform.FromDisplay(points, out startPoint);<br>                map.DisplayTransform.FromDisplay(points[i + 1], out endPoint);<br>                FeatureGeometry lfg = MultiCurve.CreateLine(workLayer.CoordSys, startPoint, endPoint);<br>                MapInfo.Styles.SimpleLineStyle lstyle = new MapInfo.Styles.SimpleLineStyle(<br>                    new MapInfo.Styles.LineWidth(3, MapInfo.Styles.LineWidthUnit.Pixel), 2, System.Drawing.Color.OrangeRed);<br>                MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(lstyle);<br>                MapInfo.Data.Feature lft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns);<br>                lft.Geometry = lfg;<br>                lft.Style = cstyle;<br>                lft["index"] = i;<br>                workLayer.Table.InsertFeature(lft);<br>            }<br><br>            System.IO.MemoryStream ms = model.GetMap(MapAlias, MapWidth, MapHeight, ExportFormat);<br>            StreamImageToClient(ms);<br>        }<br>    }<br><br> <br><br>(2)在页面加载中添加Line的命令注册。代码如下:<br><br> <br>if (Session.IsNewSession)<br>{<br>MapControlModel model = MapControlModel.SetDefaultModelInSession();<br>model.Commands.Add(new Line());<br>}<br><br> <br><br>(3)在页面上拖放一个自定义控件WebTool,对其样式进行设置,有几个属性需要选择:<br><br>ID:LineTool1<br><br>ClientCommand:MapCommand<br><br>ClientInteraction:PolyineInteraction<br><br>Command:Line<br><br> <br><br>这样就实现了手动画线的功能,为什么这么简单呢?因为在交互PolyineInteraction中会获取所有点的坐标(测距工具也是使用PolyineInteraction交互),而MapCommand会把点坐标回传到服务器,只要的服务器端,调用System.Drawing.Point[] points = ExtractPoints(DataString)就可以得到所有点的坐标。
喜欢0 评分0
没钱又丑,农村户口。头可断,发型一定不能乱。 邮箱:gisempire@qq.com
游客

返回顶部