ArcGIS API for Android 案例教程 8

    技术2026-09-25  9

    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像素、方形的点要素;下面的代码通过按钮添加了客户端要素,并通知程序马上更新显示。这些代码运行的效果如下:

    图 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 使用分类渲染显示客户端要素

    最新回复(0)