在.net2005下进行MapGIS 6.7二次组件开发
一般情况,MapGIS 6.7 SDK的二次开发是在Visual Studio**6.0等通用的COM组件开发环境下进行的。基于.net2005环境下的二次开发资料很少,如果你咨询中地的技术工程师,他们毫不犹豫的告诉你最好别使用.net环境,确实在.net下6.7 SDK可能有些缺陷,再加上中地在 6.7 这块基本上没有人管(他们的注意力在7.X上面)。可是在现实中MapGIS 6.x还是在测绘行业占有一定的市场份额的,使用.net二次开发MapGIS 6.7 是实际存在的。
本人就是前段时间就这样做了,当然期间遇到很多问题。现在把我遇到的问题及解决的方法做一下笔记,供以后工作的需要,当作自己整理一下思路。
问题一:安装MapGIS6.7 SDK平台后,在.net2005不能使用相关COM组件(如:MapGisBasCom1.dll、MapGisBasCtl1.dll等组件)。也就是说在dotnet2005添加引用中的COM组件并没有看到相关MapGIS相关组件,也不能通过“浏览”的MapGIS相关组件。会报一些如下提示:“未能添加对 ‘MapGisBasCom1.dll’的引用 有效的程序集和com组件”。
解决的过程: 开始怀疑是组件没有注册成功,于是在cmd下使用regsvr32对相关组件进行注册,可是WINDOW的数据保护老提示:内存不能为read等等,注册失败。这个可以通过修改系统下的BOOT.INI解决,即将原来的“NoExecute =option”改为运行任何程序“NoExecute =alwaysOff”(也可以在 我的电脑--属性--高级--设置启动和故障恢复--编辑系统启动 中更改),更改后.net2005添加dll引用还是失败。后来偶然的在VB6.0下添加引用,通过浏览把需要的MapGIS 6.7 SDK的一些组件动态库,竟然把他们添加到引用中去了,同样的在.net2005的COM组件下也有这些动态库了,结果.net2005可以正常使用他们。虽然问题被偶然的解决了,但是现在还不明白为什么这些.dll先要在vb6.0添加后,然后再.net2005的COM组件下才能看到他们?难道他们在添加到vb6.0的过程成做了哪些操作使.net2005知道它是个com组件,可是先前我不是regsvr32注册了为什么.net2005看不到这些组件呢??[将MapGIS的桌面装上]
问题二:如下描述。 目地:想得到.wl文件的字段结构
WorkArea mWorkArea = new LinAreaClass() as WorkArea;
mWorkArea.Load(@"C:\mapgis67\sample\KU6_1.WL", null, null, null); //加载数据
LinArea mLinArea = mWorkArea as LinArea;
LinAtt mLinAtt = mLinArea.att; //从这里有问题????
Record_Head mR_Hd = mLinAtt.stru; //目的得到Record_Head对象mR_Hd;
问题描述:
LinAtt mLinAtt = mLinArea.att;
mLinArea.att是一个对象的属性,按理属性的类型是LinAtt。可是当我调试到此处时mLinArea.att是一个LinAreaClass类型(也就是方法所属对象mLinArea的类型)?为什么会出现这种情况。难道是前辈们所传说的net不支持集合(这问题是不是属于集合)?
解决的方法:1、通过其他方法或属性得到你想要的。如本例可以用:用att.get(0, out record), 再从record里取record.stru,就可以得到属性结构。 2、你也可以在6.0(如:vb中写DLL来实现你要得到属性结构功能)然后再dotnet通过添加引用的方式使用该方法。
下面截取一段在.net2005下使用6.7 SDK组件开发的代码(将SHP格式转换为MapGIS格式):
while (pFeature != null) //AE的要素:pFeature
{
featureNumber = featureNumber + 1;
geoNums = new List<int>();
D_DotSet mRegDotSet = new D_DotSetClass(); //mapgis 组件对象
LONGList mLONGList = new LONGListClass(); //mapgis 组件对象
pGeometry = pFeature.ShapeCopy; //AE的要素几何:pGeometry
if (pGeometry is IPolygon)
{
IGeometryCollection pPolygonGeometryCol = pGeometry as IGeometryCollection; //AE的要素几何集
if (pPolygonGeometryCol.GeometryCount == 1)
{
regCurrentNum = 1;
IPointCollection pPolygonPtCol = pGeometry as IPointCollection;
//得到长度和面积
pRegPolygon = pGeometry as IPolygon;
pRegArea = pRegPolygon as IArea ;
regLen.Add(pRegPolygon.Length);
regArea.Add(pRegArea.Area);
for (int i = 0; i < pPolygonPtCol.PointCount; i++)
{
mRegDotSet.Append(pPolygonPtCol.get_Point(i).X, pPolygonPtCol.get_Point(i).Y);
}
lng = mRegArea.Lin.Append(mRegDotSet, mLinInfo); //可能报错,使用dll
mLONGList.Insert(1, lng);
geoNums.Add(mRegArea.Append(mLONGList, mRegInfo));
curGeoAmount = curGeoAmount + 1;
}
else //包含ring和岛的情况