ArcGIS for Android 100.3.0(7):绘制图层(GraphicsOverlay) ,符号和渲染器(Symbols and Renderers)

绘制图层GraphicsOverlay

这里写图片描述

100版本单独把绘制图层拿出来的一个好处就是,它将永远置于地图内容之上。在以前我们如果要在MapView里加载一个新的图层,必须先remove带有图形的FeatureLayer,加载这个图层之后再加载一次带有图形的FeatureLayer,否则我们这个FeatureLayer将会被新加载的图层所覆盖。现在这个问题就不复存在了。

GraphicsOverlay graphicsOverlay1 = new GraphicsOverlay();
GraphicsOverlay graphicsOverlay2 = new GraphicsOverlay(GraphicsOverlay.RenderingMode.DYNAMIC);
mMapView.getGraphicsOverlays().add(graphicsOverlay1);

GraphicsOverlay默认的构造模式一共有两种:DYNAMIC和STATIC,默认的是动态渲染模式DYNAMIC。

当为DYNAMIC模式时候,每当图形有变化时候GraphicsOverlay会立刻更新图形;
而为STATIC模式时候,图形变化了不会马上更新,而是在进行地图的缩放、旋转和平移时候才更新图层,适合于绘制图层里含有大量图形时候使用,以防图形更新太慢影响体验。

举个例子:绘制点

mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
    @Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {

        Point clickPoint =  mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
        GraphicsOverlay graphicsOverla=new GraphicsOverlay();
        SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
        Graphic pointGraphic = new Graphic(clickPoint,simpleMarkerSymbol);
        graphicsOverlay.getGraphics().add(pointGraphic);
        mMapView.getGraphicsOverlays().add(graphicsOverlay);
        return true;
    }
});

符号与渲染器(Symbols and Renderers),通过色彩值、大小、形状、边线、透明度来表达空间要素的具体含义。如果仅仅有位置,而没有位置上的属性信息,位置也会失去意义,符号与渲染器是呈现位置上属性信息的最直接表达方式。对于Graphic(GraphicsOverlay),可以直接赋值符号或者设置渲染器,而对于Feature(FeatureLayer)只能通过渲染器进行设置。

符号Symbol使用

Symbol类是一个用来控制显示图形符号样式的类。

1.点符号(MarkerSymbol)

点符号,顾名思义就是用来修饰Point的符号。包含三种类型,分别是
PictureMarkerSymbol(图片点符号),
SimpleMarkerSymbol(简单点符号),
TextSymbol(文本符号)。

扫描二维码关注公众号,回复: 3208094 查看本文章

2.线符号(LineSymbol)

线符号是用来修饰线PolyLine的符号。只有一种类型,SimpleLineSymbol(简单线符号)。

3.面符号(FillSymbol)

面符号是用来修饰面Polygon的符号,一共有两种PictureFillSymbol(图片面符号), SimpleFillSymbol(简单面符号)。


渲染Renderer使用

渲染也是设置图形样式,相比起符号来,渲染就相当于是批量的图形样式设置。但是当渲染和符号同时存在时候,会优先使用符号的样式。

渲染一共包含了ClassBreaksRenderer, HeatmapRenderer, SimpleRenderer, UniqueValueRenderer, UnsupportedRenderer五大类,这里简要以SimpleRenderer介绍下吧。

单一符号渲染(SimpleRenderer)

官方案例:

public class AddGraphicsRendererActivity extends AppCompatActivity {

    private MapView mMapView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_graphics_renderer);
        mMapView = (MapView) findViewById(R.id.mapView);
        ArcGISMap mMap = new ArcGISMap(Basemap.Type.TOPOGRAPHIC, 15.169193, 16.333479, 2);
        addGraphicsOverlay();
        mMapView.setMap(mMap);
    }

    private void addGraphicsOverlay() {
        // point graphic
        Point pointGeometry = new Point(40e5, 40e5, SpatialReferences.getWebMercator());
        // red diamond point symbol
        SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
        // create graphic for point
        Graphic pointGraphic = new Graphic(pointGeometry);
        // create a graphic overlay for the point
        GraphicsOverlay pointGraphicOverlay = new GraphicsOverlay();
        // create simple renderer
        SimpleRenderer pointRenderer = new SimpleRenderer(pointSymbol);
        pointGraphicOverlay.setRenderer(pointRenderer);
        // add graphic to overlay
        pointGraphicOverlay.getGraphics().add(pointGraphic);
        // add graphics overlay to the MapView
        mMapView.getGraphicsOverlays().add(pointGraphicOverlay);

        // line graphic
        PolylineBuilder lineGeometry = new PolylineBuilder(SpatialReferences.getWebMercator());
        lineGeometry.addPoint(-10e5, 40e5);
        lineGeometry.addPoint(20e5, 50e5);
        // solid blue line symbol
        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 5);
        // create graphic for polyline
        Graphic lineGraphic = new Graphic(lineGeometry.toGeometry());
        // create graphic overlay for polyline
        GraphicsOverlay lineGraphicOverlay = new GraphicsOverlay();
        // create simple renderer
        SimpleRenderer lineRenderer = new SimpleRenderer(lineSymbol);
        // add graphic to overlay
        lineGraphicOverlay.setRenderer(lineRenderer);
        // add graphic to overlay
        lineGraphicOverlay.getGraphics().add(lineGraphic);
        // add graphics overlay to the MapView
        mMapView.getGraphicsOverlays().add(lineGraphicOverlay);

        //polygon graphic
        PolygonBuilder polygonGeometry = new PolygonBuilder(SpatialReferences.getWebMercator());
        polygonGeometry.addPoint(-20e5, 20e5);
        polygonGeometry.addPoint(20e5, 20e5);
        polygonGeometry.addPoint(20e5, -20e5);
        polygonGeometry.addPoint(-20e5, -20e5);
        // solid yellow polygon symbol
        SimpleFillSymbol polygonSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.YELLOW, null);
        // create graphic for polygon
        Graphic polygonGraphic = new Graphic(polygonGeometry.toGeometry());
        // create graphic overlay for polygon
        GraphicsOverlay polygonGraphicOverlay = new GraphicsOverlay();
        // create simple renderer
        SimpleRenderer polygonRenderer = new SimpleRenderer(polygonSymbol);
        // add graphic to overlay
        polygonGraphicOverlay.setRenderer(polygonRenderer);
        // add graphic to overlay
        polygonGraphicOverlay.getGraphics().add(polygonGraphic);
        // add graphics overlay to MapView
        mMapView.getGraphicsOverlays().add(polygonGraphicOverlay);

    }

    @Override
    protected void onPause() {
        super.onPause();
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mMapView.dispose();
    }
}

效果图:
这里写图片描述

唯一值渲染(UniqueValueRenderer)

UniqueValueRenderer表示具有匹配属性的功能/图形组。这在名义或字符串数据中最常见。

UniqueValueRenderer用于绘制具有不同符号的多个要素/图形,并将UniqueValueRenderer中的字段名称与UniqueValues中的值进行匹配。

示例:使用UniqueValueRenderer对分区指定进行符号化:黄色表示“住宅”,紫色表示“工业”,红色表示“商业”,等等。

public class UniqueValueRendererActivity extends AppCompatActivity {

    private MapView mMapView;

    private String sample_service_url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_unique_value_renderer);

        mMapView = (MapView) findViewById(R.id.mapView);

        ArcGISMap map = new ArcGISMap(Basemap.createTopographic());

        //[DocRef: Name=Unique Value Renderer, Topic=Symbols and Renderers, Category=Fundamentals]
        // Create service feature table
        ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(sample_service_url);

        // Create the feature layer using the service feature table
        FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);

        // Override the renderer of the feature layer with a new unique value renderer
        UniqueValueRenderer uniqueValueRenderer = new UniqueValueRenderer();

        // Set the field to use for the unique values
        //You can add multiple fields to be used for the renderer in the form of a list, in this case
        uniqueValueRenderer.getFieldNames().add("STATE_ABBR");
        // we are only adding a single field

        // Create the symbols to be used in the renderer
        SimpleFillSymbol defaultFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.NULL, Color.BLACK,
                new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GRAY, 2));

        SimpleFillSymbol californiaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.RED,
                new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.RED, 2));

        SimpleFillSymbol arizonaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.GREEN,
                new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 2));

        SimpleFillSymbol nevadaFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.BLUE,
                new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLUE, 2));

        // Set default symbol
        uniqueValueRenderer.setDefaultSymbol(defaultFillSymbol);
        uniqueValueRenderer.setDefaultLabel("Other");

        // Set value for california
        List<Object> californiaValue = new ArrayList<>();
        // You add values associated with fields set on the unique value renderer.
        // If there are multiple values, they should be set in the same order as the fields are set
        californiaValue.add("CA");
        uniqueValueRenderer.getUniqueValues().add(
                new UniqueValueRenderer.UniqueValue("California", "State of California", californiaFillSymbol,
                        californiaValue));

        // Set value for arizona
        List<Object> arizonaValue = new ArrayList<>();
        // You add values associated with fields set on the unique value renderer.
        // If there are multiple values, they should be set in the same order as the fields are set
        arizonaValue.add("AZ");
        uniqueValueRenderer.getUniqueValues()
                .add(new UniqueValueRenderer.UniqueValue("Arizona", "State of Arizona", arizonaFillSymbol, arizonaValue));

        // Set value for nevada
        List<Object> nevadaValue = new ArrayList<>();
        // You add values associated with fields set on the unique value renderer.
        // If there are multiple values, they should be set in the same order as the fields are set
        nevadaValue.add("NV");
        uniqueValueRenderer.getUniqueValues()
                .add(new UniqueValueRenderer.UniqueValue("Nevada", "State of Nevada", nevadaFillSymbol, nevadaValue));

        // Set the renderer on the feature layer
        featureLayer.setRenderer(uniqueValueRenderer);
        //[DocRef: END]

        // add the layer to the map
        map.getOperationalLayers().add(featureLayer);

        map.setInitialViewpoint(new Viewpoint(
                new Envelope(-13893029.0, 3573174.0, -12038972.0, 5309823.0, SpatialReferences.getWebMercator())));

        // set the map to be displayed in the mapview
        mMapView.setMap(map);

    }

    @Override
    protected void onPause() {
        super.onPause();
        // pause MapView
        mMapView.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // resume MapView
        mMapView.resume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // dispose MapView
        mMapView.dispose();
    }
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36699930/article/details/82457951