MapXtreme 2005 二次开发小记

来源:互联网 发布:肇庆酒店入住率数据 编辑:程序博客网 时间:2024/04/30 15:09
    最近接到个项目要用 MapXtreme 来开发一个 WebGIS 网站,才刚开始接触 MapXtreme 这东西就要应用于实战中了。最难受的就是 MapXtreme 的资料真是少得可怜,我特地在 Google 中搜它的英文文章,竟然都没有发现多少文章,还好就是它的手册讲得还算详细。    

    现在项目还没有完成,但开发过程中就遇到了很多问题,小记与此。    

    我们是将数据放在 Oracle Spatial,然后用 MapXtreme 读取它的。所以一般会用到手册里面给的那个代码例子。
    
        TableInfoServer ti = new TableInfoServer("ttt");
        ti.ConnectString = "SRVR=ORCL;UID=abc;PWD=123456";
        ti.Query = "Select * From xyz"; ti.Toolkit = ServerToolkit.Oci;
        ti.CacheSettings.CacheType = CacheOption.Off; MapInfo.Data.Table tbl =  MapInfo.Engine.Session.Current.Catalog.OpenTable(ti);
        map.Load(new MapInfo.Mapping.MapTableLoader(tbl));
   
    这样了的话,调试的如果不关闭 ASP.NET Development Server 又测试网站的话,就会报“名称 ttt ”已经存在。所以最好加个 ti.Alias = "tmap",然后每次用来判断,就不用每次都关闭 ASP.NET Development Server 了。
   
        if (MapInfo.Engine.Session.Current.Catalog.GetTable("tmap") == null)
   
    本来我们计划只从 Oracle 中读出数据,不需要文件形式的TAB或MWS文件,但是不知道是否是因为工程里面只有临时表的原因,在对地图进行操作后就会随机的在 GetMapObj 函数里面出现异常。说什么 MapFactory 中没有地图之类的问题。上网查了很多发现很多人都发现有这个问题(我在 Mapinfo 的论坛上看到这个问题已经被认为是一个 Bug 了,http://community.mapinfo.com/forums/thread.jspa?messageID=51127),但是还没有看到有解决的办法。干脆就把 <add key="MapInfo.Engine.Session.State" value="Manual"/> 这个的 HttpSessionState 改成自动的好了。但是这样,很多功能又会有错误,比如用 map.setview(ftr) 的功能想让地图以某图元居中却没有反应。

    其实 MapXtreme 读取数据库有多种方式。其中一种是将 SQL 语句写在一个 TAB 文件中,加载这个 TAB 文件也可以达到上面那种用 TableInfoServer 的效果。而且有了实在的 TAB 文件就可以把它加载在工作空间 mws 文件中。这样在 web.config 中预加载这个工作空间就不会出现常常有 GetMapObj 报错的情况了。

    在 StateManager 的代码中有一段 RestoreZoomCenterState() 中是:
        if (manualSerializer[GetKey("Zoom")] != null)
        {
           map.Zoom = (MapInfo.Geometry.Distance)manualSerializer[GetKey("Zoom")];
        }
        if (manualSerializer[GetKey("Center")] != null)
        {
            map.Center = (DPoint)manualSerializer[GetKey("Center")];
        }
我觉得这也就是说,它只保存一个 zoom 和 center。那么在同一个网站中开有两个以上的地图控件,一个地图移动了,另一个也会一起移动。我们的项目中本来想在一个页面加两个控件实现不同的功能,但是它只保存一个中心点,每次作 RestoreZoomCenterState 动作后都会把其它的地图中心点都设置成一样的了。最后我们只要用网页中的 Frame 的形式嵌入第二个地图。

    MapXtreme 的坐标转换也是麻烦。本来想做个自动在地图上生成图像热区的功能。上网找到一个“MapXtreme实用技巧与源码10例”有个例子就是类似的。但是它里面竟然直接用 dt.ToDisplay 函数来转换,不知道在作者的电脑上行不行,在我这就是不行。我还得先用下面这个求出图元坐标到地图显示坐标的转换关系:
CoordinateTransform dtf = new CoordinateTransform(fg.CoordSys, map.GetDisplayCoordSys());
然后再用 ToDisplay 函数才得到我想要的结果。


    其实仔细研究 MapXtreme 后可以发现它大多功能都是通过调用 MapController.ashx 来实现的。比如获得新的图像是MapController.ashx?Command=GetMap&Width=523& Height=382&ExportFormat=Jpeg。通过向Controller传递要运行的命令(Command),再把参数传递给它(Width、Height 那些),然后它返回具体的结果由浏览器通过图片或其它方式显示出来,这种作法是典型的 MVC 模式。这样我们使用的时候就可以灵活多了。
原创粉丝点击