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/