zoukankan      html  css  js  c++  java
  • MapXtreme 2005学习(8):实现手动画线

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

    当时我的第一反应就是去百度上搜索,但网上关于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)就可以得到所有点的坐标。

  • 相关阅读:
    R语言nest_join()函数
    R语言行/列合并
    ffmpeg 命令将视频转化为图帧
    Natas Wargame Level20 Writeup(会话状态注入/篡改)
    vim简明教程--半小时从入门到精通
    笔记:Spring Cloud Hystrix 异常处理、缓存和请求合并
    【Ecstore2.0】导出问题解决(未导出或导出文件为0字节)
    Android Handler消息处理顺序分析
    着色器语言之变量类型
    Redis源码分析(十一)--- memtest内存检测
  • 原文地址:https://www.cnblogs.com/glacierh/p/1263443.html
Copyright © 2011-2022 走看看