首页 励志故事 模型设计之绘制的基础

模型设计之绘制的基础

时间:2022-01-19 励志故事 版权反馈
【摘要】:由于具体绘制时使用的参数较多,采用了参数类RenderParam来描述参数。类AbstractLocalRenderer作为类LocalRenderer的基类,实现了与本地绘制过程相关的一些方法,如增加、删除以及生成绘制事件并通知监听者;类LocalRenderer主要实现了具体的本地绘制过程。类ServerRendererProxy实现了Renderer接口中定义的方法,在使用远程绘制时完成服务器端绘制代理的功能。类RenderEvent为绘制事件给出定义,事件中包含了两种状态:是否被中断以及是否产生了错误。
绘制考虑_网络地理信息系统

9.3.5 绘制考虑

1.模型图

GeoSurf中的绘制接口Renderer定义了绘制所要实现的方法,具体的绘制类例如ServerRenderProxy、GeoSurfRender和LocalRender实现了这个接口。由于具体绘制时使用的参数较多,采用了参数类RenderParam来描述参数。这些类的模型结构如图9-3所示。

类AbstractLocalRenderer作为类LocalRenderer的基类,实现了与本地绘制过程相关的一些方法,如增加、删除以及生成绘制事件并通知监听者;类LocalRenderer主要实现了具体的本地绘制过程。类ServerRendererProxy实现了Renderer接口中定义的方法,在使用远程绘制时完成服务器端绘制代理的功能。接口RenderListener定义了绘制监听者所要实现的方法。二次开发用户可以通过实现该接口中的方法在接收到绘制事件后进行相应的处理,如设置鼠标状态以及将缓存中的图像绘制到设备上。类RenderEvent为绘制事件给出定义,事件中包含了两种状态:是否被中断以及是否产生了错误。

2.画法

画法对象GeoSurfRendition描述了要素对象进行绘制时所使用的一系列属性,如颜色、透明度、背景色、大小以及使用的符号ID等。每个要素对象中都可定义一个画法,也可为每个矢量图层定义绘制(VectorLayerRendition)的方法。矢量图层的绘制方式可分为3种:单一画法、分级画法和独立值画法。以下代码分别为矢量图层layer1,layer2和layer3设置这3种画法。

①layer1中的所有要素对象都使用统一的画法rendition1:

//将单一画法设置到图层中

VectorLayerRendition layerRendition1=new VectorLayerRendition(rendition1);

layer1.setLayerRendition(layerRendition1);

②layer2中的要素对象按照其属性项value的值的不同,分为3级,value值大于或等于0,小于100的使用画法rendition21;value值大于或等于100,小于200的使用画法rendition22;value值大于或等于200,小于300的使用画法rendition23;其余的使用画法rendition24。

//创建分级专题符号

RangedThemeSymbol themeSymbol=new RangedThemeSymbol(layer2);

//设为可见

themeSymbol.setVisible(true);

//设定分级画法使用的属性

themeSymbol.setAttrName("value");

//设定使用的缺省画法

themeSymbol.setIsUseDefaultRendition(true);

themeSymbol.setDefaultRendition(rendition24);

//创建分级区间画法对集合

RangedBinSet binset=new RangedBinSet();

//创建分级区间画法对,并加入到分级区间画法对集合中

GeoSurfAttributeValue value21=new GeoSurfAttributeValue((double)0);

GeoSurfAttributeValue value22=new GeoSurfAttributeValue((double)100);

GeoSurfAttributeValue value23=new GeoSurfAttributeValue((double)200);

GeoSurfAttributeValue value24=new GeoSurfAttributeValue((double)300);

RangedBin bin1=new RangedBin(value21,value22,rendition21);

RangedBin bin2=new RangedBin(value22,value23 rendition22);

RangedBin bin3=new RangedBin(value23,value24,rendition23);

binset.add(bin1);

binset.add(bin2);

binset.add(bin3);

//设定专题图使用的属性区间画法对集合

themeSymbol.setBinSet(binSet);

//将分级画法设置到图层中

VectorLayerRendition layerRendition2=new VectorLayerRendition(themeSymbol);

layer2.setLayerRendition(layerRendition2);

③layer3中的要素对象按照其属性项value的值的不同,设置如下:value值等于0的使用画法rendition31;value值等于100的使用画法rendition32; value值等于200的使用画法rendition33;其余的使用画法rendition34。

//创建独立值专题符号

IndividualThemeSymbol themeSymbol=new IndividualThemeSymbol(layer3);

//设为可见

themeSymbol.setVisible(true);

//设定独立值画法使用的属性

themeSymbol.setAttrName("value");

//设定使用的缺省画法

themeSymbol.setIsUseDefaultRendition(true);

themeSymbol.setDefaultRendition(rendition34);

//创建属性值画法对集合

IndividualBinSet binset=new IndividualBinSet();

//创建属性值画法对,并加入到属性值画法对集合中

GeoSurfAttributeValue value31=new GeoSurfAttributeValue((double)0);

GeoSurfAttributeValue value32=new GeoSurfAttributeValue((double)100);

GeoSurfAttributeValue value33=new GeoSurfAttributeValue((double)200);

ValueBin bin1=new ValueBin(value31,rendition31);

ValueBin bin2=new ValueBin(value32,rendition32);

ValueBin bin3=new ValueBin(value33,rendition33);

binset.add(bin1);

binset.add(bin2);

binset.add(bin3);

//设定专题图使用的属性值画法对集合

themeSymbol.setBinSet(binSet);

//将分级画法设置到图层中

VectorLayerRendition layerRendition3=new VectorLayerRendition(themeSymbol);

layer3.setLayerRendition(layerRendition3);

3.符号

在GeoSurf中支持两种类型的符号:栅格符号与符号库符号。

栅格符号是指直接使用gif或jpeg格式的图片作符号,只适用于点对象。

符号库符号是指使用GeoStar4.0符号设计工具制作的符号,在处理过程中需要使用工具先将GeoStar4.0符号库文件转换成以字节流方式记录的GeoSurf符号库文件(*.symx),它能够转换点符号、线符号和面符号。

符号表现模块中使用一个类SymbolPool来管理读入内存的符号,以避免符号的重复读取。这些符号以哈希表形式存放,其关键字采用字符串类型,其构成方式为:符号库名的大写+“\\nSYMID”+符号类型+符号ID的字符串值。栅格符号的符号库名称使用长度为0的字符串""。符号类型是指点符号、线符号或面符号,取值分别为1、2、3。

4.地图绘制

地图绘制是指根据地图中图层的压盖顺序和可视性,依次将图层绘制到指定的设备上。“设备”包括屏幕或内存图像。根据进行绘制时的具体位置,可以分为本地绘制和服务器端绘制。

本地绘制将直接绘制内存中的要素对象或图层;服务器端绘制时,本地不直接绘制要素对象或图层,而是通过服务器端绘制代理,将绘制的请求发送到服务端,由服务端将空间数据绘制到内存图像上,再将图像传回客户端显示。其中,处理客户端绘制请求的服务端进行绘制时使用的是本地绘制。

本地绘制时,图层数据已经位于本地内存中或者可以载入本地内存。绘制时,按照图层的压盖顺序,依次将各个图层绘制到指定的设备上。在两种情况下会使用到本地绘制:一种是在客户端能下载数据,并能在客户端进行绘制;另一种是处理客户端发来的绘制请求的服务器端。

在二次开发时,有时根据需要,在客户端并不下载图层数据,只是将当前的绘制参数作为请求发送给指定的服务器端,并接收从服务器端传来的图像,将图像绘制到指定的设备上。服务器端绘制代理就是用来完成这种绘制任务的。

5.如何调用本地绘制

GeoSurf提供的本地绘制对象LocalRenderer的构造方法只需要绘制设备(Graphics2D)。要完成绘制过程,首先需要生成一个绘制参数RenderParam,然后用它作参数调用LocalRenderer的render方法。

在绘制过程中会产生开始绘制、更新以及绘制结束等绘制事件(RenderEvent),用户需要自定义一个监听类,实现GeoSurf中定义的绘制监听接口(RenderListener),处理相关的事件。例如,在监听到开始绘制事件时改变鼠标的形状,或是在监听到绘制结束事件时刷新当前屏幕的显示等。

6.如何调用服务器端绘制代理

使用GeoSurf提供的服务器端绘制代理对象ServerRendererProxy的构造方法,只需要给出服务器端的地址和绘制设备(Graphics2D)。要完成绘制过程,需要先生成一个绘制参数RenderParam,然后将其当做参数,调用ServerRendererProxy的render方法。

与本地绘制相同,调用服务器端绘制代理时,也需要监听并处理绘制事件。

7.如何绘制地图

用户可以根据具体需要,确定是采用本地绘制还是采用服务器端绘制代理。为了避免在向屏幕绘制时出现闪烁,建议用户使用双缓冲技术,即创建一个与屏幕显示范围相同的BufferImage,绘制时使用该BufferImage的图形设备来绘制各个图层的数据,最后再将BufferImage绘制到屏幕设备上。

GeoSurf中提供了一个支持线程的绘制对象GeoSurfRenderer,该对象的构造方法需要使用LocalRenderer对象或ServerRendererProxy对象的实例作参数。将绘制过程放在一个线程中,可以通过调用该对象的interrupt方法中止当前的绘制。

以下的例子中使用了一个LocalRenderer对象的实例作参数绘制地图map,并对地图进行全图显示(脱机图像的设备为g)。

//构造一个线程绘制对象

GeoSurfRenderer renderer=new GeoSurfRenderer(localRenderer);

//获取当前的图的图层

AbstractLayer[]layers=map.getLayers();

//设置当前的显示范围为地图的范围

float[]viewExtent=map.getMapExtent();

//构造绘制参数,指定使用图层本身的空间参考,图层,显示范围,绘制设备的宽度、高度,不需要对图像进行编码,背景颜色为白色以及背景半透明。

RenderParamparam=newRenderParam(null,layers,viewExtent,rectangle.width,rectangle.height,null,Color.white.getRGB(),128);

//进行绘制

renderer.render(param);

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈