MapXtreme 2005 开发经验和技巧总结

转载自 skyapplezhao

最终编辑 chinagispub

一、常见问题

先上一张MapXtreme的丑陋的图片

这个是我历经千山才弄出来的效果。

在处理的过程中,会有一些问题经常报错,网上几乎找不到资料可以解决了,本人经过大量实践,反复点击报错,代码步步注释的方法。

终于小有成果。

Table.BeginAccess(TableAccessMode.Write);这句代码,报错率非常高。

我们在修改一个表的时候,通常要begin一下,然后处理,处理完之后再end一下

在反复的begin与end中,一旦拿不到锁,就报错了。通常这个问题引起,是另一个表正在处理时,发生异常,你try完之后,没有endAccess引起的

Table.DeleteFeature(feature);这句代码的报率也很高,网上流传这么一些代码:

foreach(Featrue fea in Table) {
Table.DeleteFeature(feature);
}

说明:用来删除表的数据,这里报错率通常是由于Table.BeginAccess(TableAccessMode.Write);这个异常引起的。
所以最好处理就是try一下Table.BeginAccess(TableAccessMode.Write);正常后,再执行删除表数据。这里有一点提的,其实里面的东西最后还是执行delete from table wheremkey=@mkey之类的语句,这样等于一条一条执行。还不如直接执行delete from table就OK了,foreach来干什么。那个MISql操作的,几乎和ADO.net的操作一个样,不用担心不会。

最后一个就是最严重的问题了。

       产生的问题是这样的:地图上画上的点,一开始好好的,然后点一下放大或细小,一会正常,一会又点不见了,再点一下,点又出来了,就这样反反复复。
       一会正常,一会不正常。
       经常反复大量研究表明:地图是存在Session中的,在研究中发现,Session经常不确定性的会丢失,所以,最好在画点的逻辑里加上一些处理:

我是这样处理的:
if (CommonHelper.Get<string>("Command", "") == "" || map.CustomProperties["layerCount"] == null || (int)map.CustomProperties["layerCount"] != map.Layers.Count) {
RUnitMapView mapView = new RUnitMapView(map);
map.CustomProperties["layerCount"] = map.Layers.Count;//预防Session的layer丢失
}

说明:找了一个地方保存下地图的图层数,由于生成了点之后,地图的图层一定会和初始图层不一样。所以,用了这个来做为判断Session是否丢失。如果Session丢失,重新加载一下数据点的处理。这样,终于解决了问题.

二、Session问题及两种配置方式

之前的调试方式

在MapXtreme 安装目录下,有一个MapXtremeControl的源码。

先说说怎么调试MapXtremeControl

情况分析:用Vs2005打开项目工程后,提示版本转化,直接转化即可,然后添加到项目引用。这时候,就算添加的是这个引用,也是无法调试的,因为在“C:\WINDOWS\assembly”目录下就存在了MapInfo.WebControls,所以默认会优化调用这个。如果想调试你引用的项目,需要先卸载此目录下的DLL,直接右键卸载是行不通的。

卸载的方法如下:以下是网上搜到,以前我搜的时候,是通过修改注册表,然后进行卸载的:

.NET Framework中附带了一些和GAC有关的工具,其中包括:
        1)Gacutil.exe,一个命令行的工具,用于在GAC中浏览、添加、删除Assembly
        2)Ngen.exe,也是一个命令行的工具,用于在GAC中创建Native Image
        3)mscorcfg.msc,一个MMC终端,可以图形化完成Gacutil.exe的主要功能。

卸载后,即可以调试你添加的项目了。

问题澄清的结论:在调试进去后,最终又把问题引向自身了,关于Session的不稳定性,是由于Session的两种配置方式的不同而引起的。这个一定要在项目之初就考虑清楚,而帮助文档里也有这么一段说明,不过当时没在意。

关于两种配置方式

1、是用Session池,所有人共享Session,所有的保存都需要进行序列化,编码很麻烦,默认的示例也是这种方式,有点误导。WebConfig的配置有三点,帮助文档里有说到。
        2、是和普通的Session一个样,不需要序列化。编码简单,不过没有默认的救命。WebConfig配置一下即可。帮助文档里也有说到。
       关于两种模式的使用情况,帮助文档里也有提到。多看帮助文档很重要,不然这个配置错误,引起的返工,是近乎重写所有的代码。

三、地图从Wor格式转wms的方法

首先,通过MapInfo Professional 6.5工具,转成gst格式

方法如下:

1.打开工具

2.File->Open WordSpace->选择wor格式文件打开地图

3.Tools->Tool Manager->Mapx Geoset Utility打上Loaded列对应的勾->OK确定

4.Tools->Mapx Geoset Utility[添加后会出现]->Save Mapx Geoset As…

5.出现对话框,选择”4.5”->OK确定->选择路径并输入名称保存即为gst文件。

      然后,通过MapXtreme 2005 6.7.1下的Workspace Manager工具,将gst转成wms格式

1.打开工具

2.File->Open WordSpace->选择gst(刚保存的文件)格式文件打开地图

3.File->Save As…->选择路径并输入名称保存即为wms文件

四、缩放比例下不显示图层

上次将一份上海的地图从wor格式转成gst再转成wms后,能用是能用了,可是每次点击地图时,都需要5-6秒的生成时间,在效率上成了一个问题。主要是图层显示太多引起的,生成后的图片有100多K。

来一张大图片,图层很多的情况下的图片:

终于有点空,于是也开始想一下如何减少图层的显示。

早上经过发现,安装完后的MapInfo下的Workspace Manage就有对图层的显示有控制功能。先上一张图:

点击图层时:下面有 Display Within Range,打上勾后,即可设置该图层在缩放比例0.00->4.00米的范围内可见。

至于图层的确认:可以通过图层前面的“勾”(显示与否)观看地图的变化,来确认是哪个图层。

对于自己通过编码方式的图层进行控制时:

通过Layer.VisibleRangeEnabled = true;
       Layer.VisibleRange.属性或方法进行控制。

五、画道路区域

有了需求,又得弄那MapXtreme地图了,需要增加一个道路区域监控。

折腾了一天,算是有点结果。

1、画线

前台JS可以通过自带的测量功能来画线,使用Command="Distance",同样双击结束画线。

上一展画线的图:

2、画区域

前台JS可以通过自带的功能来区域,使用Command="PolygonSelection",同样双击结束画区域

同样上一下图:

3、后台显示:

画线的可以直接用画线的画就行了。以前说过就不说了。

以下为显示多边型代码:
FeatureGeometry pt =new MultiPolygon(Layer.CoordSys, CurveSegmentType.Linear,polyPoint[bean.ID_Road.Value].ToArray());
SimpleInterior polyStyle = new SimpleInterior(9, System.Drawing.Color.Blue, System.Drawing.Color.Blue, true);
CompositeStyle comStyle = new CompositeStyle(polyStyle);
Feature feature = new MapInfo.Data.Feature(Table.TableInfo.Columns);
feature.Geometry = pt;
feature.Style = comStyle;
Table.InsertFeature(feature);

这里也上一张图片:

六、道路区域选择

事实上,在选择道路的时候,出了点问题。

问题一:之前在显示道路的时候,每取两个点就画了一条线显示,以至于选择道路时,只选中了两点间的一线,事实上,一条路可能是多个点组成的,所以选择路时,应该是选中整条路。

经过折腾,把画线的代码改成如下,多点组合成一线。
FeatureGeometry pt = new MultiCurve(Layer.CoordSys, CurveSegmentType.Linear,点数组);
SimpleLineStyle lineStyle = new SimpleLineStyle(new LineWidth(4, LineWidthUnit.Pixel), 线样式,颜色);
CompositeStyle comStyle = new CompositeStyle(lineStyle);
Feature feature = new MapInfo.Data.Feature(Table.TableInfo.Columns);
feature.Geometry = pt;
feature.Style = comStyle;
Table.InsertFeature(feature);

通过点数组画线之后,再用PointSelect工具选择线的时候,就能选择整条线了。

问题二:选择道路或区域后,需要交互的显示的数据,如下图:

因此,在选择点的时候,需要获取被选中点的数据,在这里一开始走了弯路,通过Ajax重新查询点击点上附近的图元来找到数据,结果查的数据跟选择的点有出入。

经过折腾,发现从

MapInfo.Engine.Session.Current.Selections.DefaultSelection[MapInfo.Engine.Session.Current.Catalog.GetTable(表别名)];

可以直接获取选择的数据。

问题三:如何改变选中道路或区域的样式

搜遍中文搜索引擎,几乎没有答案,最后还是搜英文的,终于找到结果:

经过折腾,代码如下:
SimpleLineStyle lineStyle = new SimpleLineStyle(new LineWidth(4, LineWidthUnit.Pixel),2,System.Drawing.Color.Red,true);
AreaStyle areaStyle = new MapInfo.Styles.AreaStyle(lineStyle, new MapInfo.Styles.SimpleInterior(9,System.Drawing.Color.Blue, System.Drawing.Color.Blue, true));
Session.Current.Selections.DefaultSelection.Style.AreaStyle.ApplyStyle(areaStyle);
Session.Current.Selections.DefaultSelection.Style.LineStyle.ApplyStyle(lineStyle);

问题还有一点,对于线的样式的改变,效果不显著,如果把线的宽度变大一点,可以看到改变后的颜色是线的边框。如果不改变,根本看不到有变化。

七、关于地图投影坐标问题的解决方式

用地图的安装程序MapInfo安装后的:MapInfo Workspace Manager工具打开

1、选择打开所有表,或打开wms文件。
       2、选择Map Alias[一般叫Map1],即第一个根节点。
       3、切换下面的选项到Coordinate System->点击下面的Coordinate System...按钮
       4、在出来的Choose Coordinate System框中选择:经度/纬度(WGS 84)
       5、点OK,然后重新保存即可。

这样就可以切换到我们正常使用的坐标系了。

http://yk8900.blog.163.com/blog/static/1231835442011270584126/

posted @ 2011-06-16 21:45  googlegis  阅读(191)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub