在.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和岛的情况

你可能感兴趣的:(.net)