最后更新时间:2020年12月24日
运行环境类
答:出现该问题的原因是未设置正确的目标平台。
解决办法:如果引用的是32位的MapGIS程序集,设置目标平台为 X86,如果引用的是64位的MapGIS程序集,目标平台设置为X 64。如果设置了目标平台,还未解决此问题,还需将工程的输出目录设置到,MapGIS的安装路径的program文件夹,参考下图。
数据管理类
答: 原因一:在这之前open了图层,没有关闭导致的错误,在程序中对数据操作完成后要及时关闭数据; 原因二:此数据在平台或其他程序正在进行编辑。
答:表格文件只能与对象类相互转换,不能直接将表格数据转为简单要素类。
数据表达类
答:将自定义绘制图形的方法添加到MapControl控件的postrefresh事件中,每次重绘地图(刷新、缩放、移动等引发)均会自动调用该方法,实现自定义图形重新自动绘制。
答:一般带图形参数的方法是绘制逻辑坐标下的几何对象,而不带图形参数的则是绘制设备坐标下的几何对象,例如DispPolyGon(GeoPolygon poly,RegInfo regInfo),需要传入图形参数regInfo,则该方法所需的是逻辑坐标下的几何对象poly,而方法PolyGon(GeoPolygon poly),则是设备坐标下的几何对象poly。
答:自定义绘图时不会触发窗口重绘类型的事件。
答:可能主要是两种原因导致,其一:矩形对象构建需要把第一个点作为第五个点添加到线对象中,以封闭矩形;其二可能是没有设置画刷导致。参考关键代码如下:
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();
答:异或模式是用Display类对象进行自定义图形绘制时可能用到的一种画笔模式,通过给定SetPenMode方法里参数值为9来设置当前画笔为异或模式。处于异或模式的画笔,可实现在同一位置,重复绘制同一几何对象(包括构成几何对象的所有坐标点及几何对象的角度完全一样)时,将实现擦除原几何对象的效果。
答:这个问题涉及到两个方面:动态注记与部分显示。在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(); }
答:通过组件方式只能操作系统默认的系统库,一个线型可以通过线型号+辅助线型号来唯一确定,其中:
LinInfo.LibID:辅助线型号 LinInfo.LinStyID:线型号
答:VectorLayer图层对象提供了Transparency属性:0-100,值越大,图层显示效果越透明。
答:该功能由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); } } }
答:在添加圆、弧以及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();
答:可以通过调用MapGIS.GeoMap命名空间中VectorLayer类中的SetDispCondition方法,通过设置一定条件,控制当前图层的某些对象显示与隐藏。