ArcGIS Android中提供了一个客户端的要素图层GraphicsLayer,以ArcGIS以往Web开发的经验我们就可以知道这是用于客户端要素绘制的图层。让我们尝试在MapView中再添加一个GraphicsLayer:
"1.0" encoding="utf-8"?>
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="wrap_content" android:text="添加客户端要素" />
android:layout_width="fill_parent" android:layout_height="fill_parent">
/World_Imagery/MapServer" />
这里我还添加了一个按钮“添加客户端要素”,我希望在点击这个按钮的时候,程序可以在地图的中央添加一个客户端要素,也就是在GraphicsLayer上添加一个Graphic,因此,我在这个Activity创建的时候添加了这样的一些代码:
gLayer = (GraphicsLayer) findViewById(R.id.gLayer);
gLayer.setRenderer(new SimpleRenderer(new SimpleMarkerSymbol(Color.RED,
20, SimpleMarkerSymbol.STYLE.SQUARE)));
buttonAddGraphic = (Button) findViewById(R.id.buttonAddGraphic);
buttonAddGraphic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Graphic g = new Graphic();
g.setGeometry(AgsGraphicsLayer.this.map.getCenter());
AgsGraphicsLayer.this.gLayer.addGraphic(g);
AgsGraphicsLayer.this.gLayer.postInvalidate();
}
});
注意一下上面高亮的几行代码,上面对GraphicsLayer的渲染样式进行了定义,表示这个客户端要素图层上需要显示大小为20像素、方形的点要素;下面的代码通过按钮添加了客户端要素,并通知程序马上更新显示。这些代码运行的效果如下:
图 22 通过按钮添加客户端要素
现在让我们在换一种渲染方式,我想用一个小图片来渲染这些要素,比如就用当前程序的图标来表示,应该如何修改呢?查阅API就可以发现熟悉的PictureMarkerSymbol这个符号类,下面就让我们稍微修改一下上面的代码:
Drawable image = AgsGraphicsLayer.this.getBaseContext().getResources()
.getDrawable(R.drawable.icon);
gLayer.setRenderer(new SimpleRenderer(new PictureMarkerSymbol(image)));
这里我们通过获得程序的图标资源,使其作为一个PictureMarkerSymbol的符号,这样修改过的代码运行起来就会是这个样子:
图 23 用图片来显示客户端要素
同样,我们还可以在客户端图层上进行分类渲染或者唯一值渲染,比如我想要一半要素显示红色,一半要素显示绿色,那么我可以使用分类渲染实现:
ClassBreaksRenderer renderer = new ClassBreaksRenderer();
renderer.setField("class");
renderer.setMinValue(0);
ClassBreak class1 = new ClassBreak();
class1.setClassMaxValue(0.5);
class1.setSymbol(new SimpleMarkerSymbol(Color.RED, 20,
SimpleMarkerSymbol.STYLE.CIRCLE));
renderer.addClassBreak(class1);
ClassBreak class2 = new ClassBreak();
class2.setClassMaxValue(1);
class2.setSymbol(new SimpleMarkerSymbol(Color.GREEN, 20,
SimpleMarkerSymbol.STYLE.CIRCLE));
renderer.addClassBreak(class2);
gLayer.setRenderer(renderer);
buttonAddGraphic = (Button) findViewById(R.id.buttonAddGraphic);
buttonAddGraphic.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Graphic g = new Graphic();
g.setAttributeValue("class", Math.random());
g.setGeometry(AgsGraphicsLayer.this.map.getCenter());
AgsGraphicsLayer.this.gLayer.addGraphic(g);
AgsGraphicsLayer.this.gLayer.postInvalidate();
}
});
这样,根据被随机赋值的名为“class”的属性,所有的客户端要素将会被显示成不同的颜色,就像图 24显示的这样。
图 24 使用分类渲染显示客户端要素