ArcGIS API for Android 案例教程 8

来源:互联网 发布:360云盘 mac下载 编辑:程序博客网 时间:2024/04/30 03:08

I. 客户端要素

客户端要素图层

ArcGIS Android中提供了一个客户端的要素图层GraphicsLayer,以ArcGIS以往Web开发的经验我们就可以知道这是用于客户端要素绘制的图层。让我们尝试在MapView中再添加一个GraphicsLayer:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

<Button android:id="@+id/buttonAddGraphic" android:layout_width="fill_parent"

android:layout_height="wrap_content" android:text="添加客户端要素" />

<com.esri.android.map.MapView android:id="@+id/map"

android:layout_width="fill_parent" android:layout_height="fill_parent">

<com.esri.android.map.ags.ArcGISTiledMapServiceLayer
url="http://server.arcgisonline.com/ArcGIS/rest/services
/World_Imagery/MapServer" />

<com.esri.android.map.GraphicsLayer android:id="@+id/gLayer" />

</com.esri.android.map.MapView>

</LinearLayout>

这里我还添加了一个按钮“添加客户端要素”,我希望在点击这个按钮的时候,程序可以在地图的中央添加一个客户端要素,也就是在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像素、方形的点要素;下面的代码通过按钮添加了客户端要素,并通知程序马上更新显示。这些代码运行的效果如下:

clip_image002

图 22 通过按钮添加客户端要素

现在让我们在换一种渲染方式,我想用一个小图片来渲染这些要素,比如就用当前程序的图标来表示,应该如何修改呢?查阅API就可以发现熟悉的PictureMarkerSymbol这个符号类,下面就让我们稍微修改一下上面的代码:

Drawable image = AgsGraphicsLayer.this.getBaseContext().getResources()

.getDrawable(R.drawable.icon);

gLayer.setRenderer(new SimpleRenderer(new PictureMarkerSymbol(image)));

这里我们通过获得程序的图标资源,使其作为一个PictureMarkerSymbol的符号,这样修改过的代码运行起来就会是这个样子:

clip_image004

图 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显示的这样。

clip_image006

图 24 使用分类渲染显示客户端要素