常见问题

最后更新时间:2019年8月16日

运行环境类

1. 当运行程序,出现缺少依赖错误,如何解决?

答:出现该问题的原因是未设置正确的目标平台。

解决办法:如果引用的是32位的MapGIS程序集,设置目标平台为 X86,如果引用的是64位的MapGIS程序集,目标平台设置为X 64。如果设置了目标平台,还未解决此问题,还需将工程的输出目录设置到,MapGIS的安装路径的program文件夹,参考下图。

数据管理类

1. 操作矢量类时,报操作对象内存不可读,是什么原因?

答: 原因一:在这之前open了图层,没有关闭导致的错误,在程序中对数据操作完成后要及时关闭数据; 原因二:此数据在平台或其他程序正在进行编辑。

2. 表格数据转换为简单要素类失败,是什么原因?

答:表格文件只能与对象类相互转换,不能直接将表格数据转为简单要素类。

数据表达类

1. 用Display自定义绘制图形,为确保刷新窗口亦能正常显示图形,应该怎么做?

答:将自定义绘制图形的方法添加到MapControl控件的postrefresh事件中,每次重绘地图(刷新、缩放、移动等引发)均会自动调用该方法,实现自定义图形重新自动绘制。

2. Display里的绘图方法基本都有两种方法可以实现,例如绘制多边形有方法DispPolyGon和PolyGon,请问有什么区别?

答:一般带图形参数的方法是绘制逻辑坐标下的几何对象,而不带图形参数的则是绘制设备坐标下的几何对象,例如DispPolyGon(GeoPolygon poly,RegInfo regInfo),需要传入图形参数regInfo,则该方法所需的是逻辑坐标下的几何对象poly,而方法PolyGon(GeoPolygon poly),则是设备坐标下的几何对象poly。

3. MapControl有很多窗口事件,例如PostRefresh、BeginDrawing等,用Display自定义绘图时会触发这样的事件吗?

答:自定义绘图时不会触发窗口重绘类型的事件。

4. 用Display的PolyGon方法始终画不出想要的矩形图形,可能是什么原因?

答:可能主要是两种原因导致,其一:矩形对象构建需要把第一个点作为第五个点添加到线对象中,以封闭矩形;其二可能是没有设置画刷导致。参考关键代码如下:

GeoPolygon polygon = new GeoPolygon();
GeoVarLine varLine = new GeoVarLine();
 //构建折线对象(矩形)
 varLine.Append(new Dot(100, 100));
 varLine.Append(new Dot(200, 100));
 varLine.Append(new Dot(200, 200));
 varLine.Append(new Dot(100, 200));
 varLine.Append(new Dot(100, 100));//以封闭矩形
 GeoLines lines = new GeoLines();
 lines.Append(varLine);
 polygon.Append(lines);
  //绘制该矩形
 disp.Begin();
 disp.SetBrush(6,0,0,0,0);//这个必须设置
 disp.PolyGon(polygon);//绘制多边形
 disp.End();
5. 什么是异或模式?

答:异或模式是用Display类对象进行自定义图形绘制时可能用到的一种画笔模式,通过给定SetPenMode方法里参数值为9来设置当前画笔为异或模式。处于异或模式的画笔,可实现在同一位置,重复绘制同一几何对象(包括构成几何对象的所有坐标点及几何对象的角度完全一样)时,将实现擦除原几何对象的效果。

6. 如何显示部分动态注记?

答:这个问题涉及到两个方面:动态注记与部分显示。在GeoMap提供的图层对象(VectorLayer)里面都有相应的功能接口与之对应,动态注记由图层的属性Label提供;而实现部分显示则通过图层设置显示过滤条件,由函数SetDispCondition提供。示例代码如下:

        //地图显示控件
        MapControl mapControl1 = null;
        //数据库服务器
        Server srv = null;
       //打开地理数据库中的简单要素类
       SFeatureCls sfcls = new SFeatureCls();
       if(sfcls.Open("gdbp://MapGisLocal/sample/ds/地图综合/sfcls/水系"))
       {
                //链接数据
                VectorLayer layer = new VectorLayer(VectorLayerType.SFclsLayer);
                layer.URL = sfcls.URL;
                layer.ConnectData();
                //统一标注图
                SimpleLabel splbl = new SimpleLabel();
                //注记信息
                LabelInfo labelInfo = new LabelInfo();
                TextAnnInfo txtAnninfo = new TextAnnInfo();             
                //设置注记图形信息
                txtAnninfo.Color = 5;
                txtAnninfo.Height = 10;
                txtAnninfo.Width = 10;
                //间隔
                txtAnninfo.Space = 2;
                //是否压盖
                txtAnninfo.Ovprnt = true;               
                //设置注记的文本信息
                labelInfo.AnnInfo = txtAnninfo;
                labelInfo.Caption = "名称";
                labelInfo.IsVisible = true;                           
                //设置动态注记的属性字段(必须设置参数)
                splbl.LabelExpression = "mpPerimeter";
                splbl.HighlightClr = 6;
                splbl.LabelGeomType = LabelGeomType.RegionGeom             
                //高亮显示未能标注的注记
                splbl.HighlightLabelUnPlaced = true;
                splbl.LabelUnPlaced = true;
                splbl.Priority = 1;
                //显示动态注记
                splbl.Visible = true;
                splbl.SetInfo(labelInfo);                      
                //添加设置好的图层到地图中
                layer.Label = splbl;
                this.map.Append(layer);
                this.mapCtrl.Refresh();
            }
7. 线型库中如何唯一确定一个线型?

答:通过组件方式只能操作系统默认的系统库,一个线型可以通过线型号+辅助线型号来唯一确定,其中:

 LinInfo.LibID:辅助线型号  LinInfo.LinStyID:线型号

8. 如何设置图层透明显示?

答:VectorLayer图层对象提供了Transparency属性:0-100,值越大,图层显示效果越透明。

9. 如何取得MapGIS颜色号的RGB值?

答:该功能由MapGIS.GeoMap提供,获取指定颜色的RGB值关键代码如下:

//系统库管理
SystemLibrarys sysLibs = SystemLibrarys.GetSystemLibrarys();
if (sysLibs != null)
{
    //获取默认系统库
    SystemLibrary sysLib = sysLibs.GetDefaultSystemLibrary();
    if (sysLib != null)
    {
        //获取颜色库
        ColorLibrary mcLib = sysLib.GetColorLibrary();
        if (mcLib != null)
        {
            //颜色对象
            MapGIS.GeoMap.Color mClrBegin;
            //获取45号色的R、G、B分量
            byte rBegin, gBegin, bBegin;
            //根据颜色号找到颜色对象
            mClrBegin = mcLib.GetColorByNo(45);
            mClrBegin.GetRGB(out rBegin, out gBegin, out bBegin);
        }
    }
}
10. 为什么添加弧段不成功?

答:在添加圆、弧以及Bezier之类的解析线时,添加不成功很多情况下都是由于构造完之后没有离散化,也就是没有调用DisperseToDots。因为这些图形在存储的时候也是存储的点,再者添加不成功还有一个原因就是调用了DisperseToDots(),但是入口参数步长给的不合适,可能太大了,这个步长是地图坐标,是根据你实际的地图数据而确定的,如果太小了,数据量会变大;如果太大了,可能会离散不成功;在添加区块的时候也存在着同样的问题,可以参照如下添加弧段关键代码:

//地图控件
MapControl mapControl1 = new MapControl(); 
this.splitContainer1.Panel2.Controls.Add(mapControl1);
Display disp = mapControl1.Display;
GeoArc arc = new GeoArc();
//初始化弧段对象
arc.Set(new Dot(100, 100), 130, 45, 90);
//离散化
arc.DisperseToDots(2);
//开始绘制
disp.Begin();
disp.SetPen(1, 6);
disp.MoveTo(new Dot(100, 100));
//绘制弧段
disp.Arc(arc);
disp.End();
11. 如何控制一个矢量类图层中某些要素在地图视图中可见或不可见?

答:可以通过调用MapGIS.GeoMap命名空间中VectorLayer类中的SetDispCondition方法,通过设置一定条件,控制当前图层的某些对象显示与隐藏。