`
Virgo_S
  • 浏览: 1137883 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Server Java讲座---使用图片和TrueType字体进行标注

阅读更多
直奔主题吧,接上个主题的讲座的内容,讲讲如何用图片进行标注。在前面一个讲座我们已经说明,如何对选中的物体进行高亮显示。而且这一部分工作是在ADF这一端完成的。那么有的时候,我们进行高亮显示的时候,不仅仅希望只是设置颜色,我们希望能够用图片或者truetype字体进行标注。比如在犯罪地点放一个坏人之类的功能。
我们来看看实现原理,关键是两个类,WebTrueTypeMarkerSymbol和WebPictureMarkerSymbol,没啥好说的,直接用代码来说明吧:
先来看看普通的点标注:
WebPoint pt=(WebPoint)arg0.getWebGeometry().toMapGeometry(arg0.getWebContext().getWebMap());
WebSimpleMarkerSymbol markers =null;
markers = new WebSimpleMarkerSymbol();
markers.setAntialiasing(true);
markers.setColor("255,0,0");
markers.setWidth(8);
markers.setOutlineColor("255,0,0");
markers.setMarkerType(WebSimpleMarkerSymbol.CIRCLE); 
markers.setPicture(bytInput);
GraphicElement ge=new GraphicElement();
ge.setGeometry(pt);
ge.setSymbol(markers);
WebGraphicsgraphics=arg0.getWebContext().getWebGraphics();
graphics.addGraphics(ge);
arg0.getWebContext().refresh();

注意webgraphicsymbol的setPicture方法的参数不是图片目录,而是图片的二进制数组,所以需要用文件IO把图片读取进来。当然,如果用户访问量很大,线程就不安全了,大家可以在application启动时进行读取,放在context的某个attribute里面。我原来认为是通过设置路径方式实现,这样又可能可以搞定gif图形的闪烁,但是现在实验结果是不行。设置图片标注的代码如下:
WebPointpt=(WebPoint)arg0.getWebGeometry().toMapGeometry(arg0.getWebContext().getWebMap());
//图片在servelet容器里面目录 
String picPath=FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()+"\\images\\angle.gif";
File myFile = new File(picPath);
FileInputStream myStream= newFileInputStream(myFile); 
BufferedInputStream buf = newBufferedInputStream(myStream);
byte[] bytInput = newbyte[(int)myFile.length()];
buf.read(bytInput, 0, (int) myFile.length());
buf.close();
myStream.close();
WebPictureMarkerSymbol markers=newWebPictureMarkerSymbol(); 
markers.setPicture(bytInput);
GraphicElement ge=new GraphicElement();
ge.setGeometry(pt);
ge.setSymbol(markers);
WebGraphics graphics=arg0.getWebContext().getWebGraphics();
graphics.addGraphics(ge);
arg0.getWebContext().refresh();

在jsf文件里面添加如下代码,调用图片标注工具,进行测试:
<a:tool id="pointTest"defaultImage="images/point.gif"hoverImage="images/pointU.gif" selectedImage="images/pointD.gif"clientAction="EsriMapPoint" serverAction="com.cj.ucdemo.GifTestTool"clientPostBack="true"/>

我们也可以使用TrueType字体里面的矢量字体对图形进行符号化显示,这也是我们经常使用的方法,具体代码如下:
webMap=arg0.getWebContext().getWebMap(); 
WebPointpt=(WebPoint)arg0.getWebGeometry().toMapGeometry(webMap); WebTrueTypeMarkerSymbol trueMarkerSymbol=new WebTrueTypeMarkerSymbol(); //注意使用系统里面已经安装的字体 
trueMarkerSymbol.setFontName("ESRITransportation & Civic");//设置索引 trueMarkerSymbol.setCharacterIndex(8); 
trueMarkerSymbol.setFontColor("255,0,0"); 
trueMarkerSymbol.setFontSize(20); 
trueMarkerSymbol.setFontStyle(WebTrueTypeMarkerSymbol.BOLD);
GraphicElement ge=new GraphicElement(); ge.setGeometry(pt);
ge.setSymbol(trueMarkerSymbol);
WebGraphicsgraphics=arg0.getWebContext().getWebGraphics();
graphics.addGraphics(ge);
arg0.getWebContext().refresh();

把上面的代码放在一个点击工具里面,在jsf文件中用如下代码进行调试:
<a:toolid="trueMarkerTest" defaultImage="images/point.gif"hoverImage="images/pointU.gif" selectedImage="images/pointD.gif"clientAction="EsriMapPoint" serverAction="com.cj.ucdemo.TrueTypeMarkerTest"clientPostBack="true"/>



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics