MapGIS常见问题之二次开发相关问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MapGIS常见问题
中地数码集团平台二次开发支持部
本期常见问题主要由MapGIS开发平台C/S开发问题组成,涉及部分B/S开发问题。
1、基于MapGIS开发平台,如何通过代码实现修改线的图形参数操作,包括可变颜色、可变笔宽、线型等参数?
答:可按照如下步骤实现:
(1)在MapGIS软件中若需查看线、区等要素的图形参数,需开启还原显示功能,可通过编写代码手动开启还原显示功能。
(2)在还原显示模式下,线是通过MapGIS符号库的线型来显示的,而线型符号则由几部分构成,而每一部分若采取固定颜色或者固定笔宽的模式,则无法看到修改后的线型参数。
只有在某一部分采取可变颜色或者可变笔宽的情况下,对图形信息中的相关项的修改才会有效果,因此可以通过修改符号库的相关线型的颜色模式或笔宽模式来达到效果。
(3)一个线型可以通过线型号+辅助线型号来唯一确定,以COM组件式开发C#语言为例的线属性如下:
mcLinInfo. libID:辅助线型号
mcLinInfo. linstyID:线型号
(4)基于COM组件式开发C#语言的还原显示实现代码如下:
mcLinInfolineInfo = new mcLinInfo();//线信息
mcGeoVarLinevarLine = new mcGeoVarLine();//折线对象
//点对象
mcDot dot1 = new mcDot();
mcDot dot2 = new mcDot();
//点对象赋值
dot1.x = 50;
dot1.y = 50;
dot2.x = 200;
dot2.y = 200;
//添加到折线对象
varLine.Append2D(dot1);
varLine.Append2D(dot2);
//设置线参数
lineInfo.linstyID = 21;
lineInfo.libID = 4;
lineInfo.xscale = 20;
lineInfo.yscale = 20;
//绘图
IXDisplay display = this.axMapXView1.Display;//绘图对象
display.DispLine(ptGeom as IGeoLine, lineInfo as mcLinInfo, 6);//根据线参数显示对应的线
display.DisplayOption.SymbolShow = true;//开启还原显示功能
display.DispLine(varLine, lineInfo as mcLinInfo, 0);//重绘制线
2、在查看地图的过程中,常要通过不同比率显示地图,如何通过代码实现按照一定的显示比率显示地图的功能?
答:步骤如下:
(1)用户常常将显示比率与比例尺相混淆,比例尺一般应用于地图数据打印输出时,表示图上距离与实际距离的比值。
而显示比率通常是指基于某一显示设备显示地图的逻辑范围与显示设置的分辨率的关系,实现的效果则是根据用户输入的显示比率来放大或缩小地图,显示效果如下:
图1 1:10000显示比率显示效果
图2 1:250000显示比率显示效果
(2)显示比率近似值计算公式
a.显示比率=当前逻辑范围/设备范围;
b.当前比例尺=设备范围(毫米值)/实际的显示范围(毫米值);
c.设备范围的值是根据96像素/英寸,1英寸=25.4毫米来计算。
(3)以C/S模式,COM组件式开发C#语言为例,部分实现代码如下:
//当前比例尺
public string scalejs()
{
//设备范围
double sbfw = gisOper.AxMapView1.Width;//gisOper为workSpace对象
sbfw = (sbfw / 96) * 25.4 //这里显示器设置为96像素,以实际值为主
//实际显示范围
IXDisplay display = null;
display = gisOper.AxMapView1.Display;
mcRectrect = display.Transformation.DispRect;
doublesjfw = rect.xmax - rect.xmin;
sjfw = (sjfw * Math.PT * 6371000000) /180;//取地球的平均半径,得到近似的实际距离//当前比例尺
int x = Convert.ToInt32((sjfw/sbfw));
srtingscaledq = "1 : " + Convert.ToString(x);//得到当前比例尺
3、在进行符号库操作时,添加符号成功,但看不到效果,应该如何解决?答:在进行符号库设置的过程中,需要注意以下几点:
(1)坐标值是像素乘以5000,比如dot.x = 0.2*5000;
(2)符号数据长度必须设为80,mcSymbolHead.DataLen = 80;
(3)以C/S模式,COM组件式开发,C#语言为例,实现代码如下:mcMapSymbolLibClassmcLibClass = new mcMapSymbolLibClass();//符号库类
intnnnn = mcLibClass.get_BaseNum(meSymbolType.mePntSymbol);//设置点符号intnSymCount = mcLibClass.SymbolNum;
mcMapSymbolmcSymbol = new mcMapSymbol();//符号对象
mcSymbolHeadm_symHead = new mcSymbolHead();
m_symHead.symbolType = meUnitSymbolType.meVectPoint;//设置符号类型为矢量点
m_symHead.ItemNum = 1;
m_symHead.SymbolName = "test113";
m_symHead.DeleteFlag = false;
//设置坐标值
m_X = 5000;
m_Y = 5000;
//注意1
m_symHead.DataLen = 80;
mcDots dots = new mcDots();
mcDot dot = new mcDot();
//这里需要使用设备坐标,三个点
dot.x = 0;
dot.y = 0;
dots.Add(dot);
dot.x = 5000;
dot.y = 5000;
dots.Add(dot);
dot.x = 10000;
dot.y = 5000;
dots.Add(dot);
dot.x = 0;
dot.y = 0;
dots.Add(dot);
mcSymbolItemClassmcSymItem = new mcSymbolItemClass();//符号图元对象
mcSymItem.ItemType = meSymbolItemType.mePolygon;//填充区
//填充区参数
mcSymItem.InterColor = 1;
mcSymItem.OuterColor = 1;
mcSymItem.DateLen = 4;
mcSymItem.OuterPen = 1;
mcSymItem.SInterPenWidth = 1;
mcSymItem.CirNum = 1;
/注意2,顺序
m_symHead.SymbolNo= mcLibClass.get_BaseNum(meSymbolType.mePntSymbol) + 1; mcSymbol.SymbolHead = m_symHead;
intrtn = mcSymbol.AppendItem(mcSymItem, dots, "");
intnAddFlag = mcLibClass.AppendSymbol(mcSymbol);
nSymCount = mcLibClass.SymbolNum;
//注意3
mcLibClass.WriteSymbol(mcSymbol);//更新符号库
mcLibClass.SaveLib();
4、如何实现图层透明显示?
答:以COM组件式开发C#语言为例,有两种实现方法,如下:
(1)方法一:mcSFeatureLayer.SetProperty提供(MapGISK9新增加接口),
m_regLayer.SetProperty("TRANSPARENT", 50);
(2)方法二:mcSFeatureLayer提供了对区图层透明显示和填充模式的设置:
设置区填充显示方式0/1/2,只填充区/只绘制边线/填充区并绘制边线,代码如下:Sub SetRegFillDispMode(ByVal mode As Integer, [linf As mc_basObj7Lib.ILinInfo])
mapXBase.mcSFeatureLayer的成员
设置显示透明度,代码如下:
Sub SetTransparent(ByVal per As Integer)
mapXBase.mcSFeatureLayer的成员
5、MapGIS K9中如何操作属性字段类型为图片的属性值?
答:步骤如下:
(1)在K9中属性字段类型为图片类型的字段,字段内容是图片的绝对路径,可以对其进行操作,但中间必须有解码的过程。
(2)以C/S模式,COM组件式开发,C#语言为例,实现过程如下:
mcGDBServersvr = new mcGDBServer();
svr.Connect("MapGISlocal", "", "");//连接数据源
mcGDataBasegdb=svr.get_gdb("sample");//打开数据库
mcSFeatureClssfcls=gdb.get_XClass(meXClsType.meXSFCls) as mcSFeatureCls;
sfcls.Open("Ku6_1.wl", 0);//打开简单要素类
//查询OID为1的要素的信息
mcObjectID id=new mcObjectID();
id.Int=1;
mcRecordrcd = null;
sfcls.GetAtt(id, out rcd);
objectob;
//获取名称为“aaa”的要素信息,该属性为图片类型
rcd.GetFldVal("aaa", out ob);
byte[] bt = System.Text.Encoding.Unicode.GetBytes((string)ob);//转化成二进制字节
string str = System.Text.Encoding.ASCII.GetString(bt);//转化成String
Image img = Image.FromFile(str);//输出图片
6、MapGIS IGServer中包含哪些数据组织形式?
答:MapGIS IGServer采用“纵向多级,横向网络”方式管理海量多源异构数据。
IGServer 平台通过发布数据服务实现数据资源的应用与共享,支持二维、三维数据。
二维数据组织形式包括矢量数据和瓦片数据两种基本方式,其中矢量数据又包含矢量地图文档、矢量图层两种类型。
矢量图层概述:
矢量图层亦即存储在本地文件(*.HDF)或者网络数据源中的地理数据,按照地理数据的几何约束类型可以分为点、线、面这三种,相对于地理数据库而言,可以简单地理解为三种类型简单要素类。
在同一地理数据库中,矢量图层具有名称唯一性,即可以通过矢量图层的名称来唯一确定一个矢量数据。
矢量地图文档概述:
矢量地图文档亦即复合文档,它采用了复合结构,其文件内部逻辑结构类似文件系统的管理结构。
它是地图的一种数据的综合表现和管理形式,存储了组成地图的各种制图元素,包括标题、指北针、图例、比例尺、布局、数据窗体、图层等。
矢量地图文档的地图(Map),主要作用是集中的管理这些独立的图层,为用户归纳、综合分析地理数据等提供手段。
而图层只是作为地理数据的一种引用,亦即对矢量图层的引用,指向位于本地或者网络数据库中的地理数据集,并不是在物理上存储地理数据,以*.Map 的形式存在。
瓦片数据概述:
为了提高互联网电子地图的响应速度,改善大数据量地图的浏览效果及流畅度,地图瓦片应运而生。
将一定范围内的地图进行纵向和横向分幅,根据不同的等级,按照指定的尺寸和指定格式进行切割,得到若干行和列的矩形图片库,这些矩形地图切片就称之为地图瓦片。
这些切割而成的若干行和列的地图瓦片库呈现正金字塔形的数据结构,在IGServer中将其
存储到一个临时的*.HDF文件中,这个存储瓦片库的HDF文件和前面提及的存储本地数据源的地理数据库的HDF文件没有任何关系。
在IGServer中,瓦片数据的生成有两种方式:预生成和实时动态生成。
预生成实际上就是根据用户需求(级数和范围),通过工具一次性生成所有的瓦片,并存储到HDF文件中。
该HDF文件可以存储到服务器上或者本地,在需要显示应用的时候,根据用户请求的瓦片的级数及行列号,从HDF中检索出瓦片并实现自动拼接。
实时动态生成方式,则会在本地生成临时的HDF文件用来存储瓦片库数据,根据用户请求瓦片的级数及行列号,首先检索这个临时的瓦片库,如果该瓦片存在就直接读取,如果瓦片不存在,则进行实时裁剪生成该瓦片,存储到本地的临时HDF文件中并进行调阅。
三维数据概述:
IGServer平台利用本地与网络数据库一体化存储机制,高效管理三维场景中多源、异构、海量的三维模型。
该平台采用的以三维矢量结构为主、兼顾三维栅格结构的三维空间数据模型,可实现对地表、地下的人造空间实体、地质体等三维空间实体模型及其空间位置、拓扑关系高效存储管理,并支持三维空间连续变化的各属性参数信息的体数据模型的集成管理与融合分析。
IGServer平台通过MapGIS DCServer提供的底层数据存储服务,采用全新的面向关系规则的组织方式进行数据存储管理,体现了三维实体在几何特征、空间关系和非空间关系上的高度统一;提供了方便高效的模型查询、分析接口和统一的建模方法;实现了较好的通用性和较强的可扩展性,可以表达地形、地物的几何特征,并适应新的数据种类和关系种类。
图3 基于规则库的三维空间数据模型
图4 三维实体的几何构成
IGServer平台采用的空间数据索引机制,可以快速的进行空间数据查询,并可依据对象
LOD信息直接获取可供显示的简化模型,提高了三维场景的显示漫游速度。
按照“基于规则库的三维空间数据模型”建立统一的三维空间数据管理平台,无论是基于文件系统或基于关系数据库系统,平台提供统一的标准存储、查询接口,实现完全一致的概念。