ArcGIS for Android Runtime100 基本操作(五)——绘制图层和符号渲染

原创 2017年09月23日 15:46:42

      在ArcGIS里我们经常要高亮显示一些图形,比如GPS轨迹,查询、分析出来的地块图形等。在ArcGIS10.2.X版本里,一般我们都会新建FeatureLayer来放置这些图形,然后渲染显示;但是在Runtime100 里删除了这个类,取而代之的是一个新类——GraphicsOverlay作为绘制图层,并和地图内容分开来。其和MapView以及ArcGISMap的关系如下所示:



      

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


      那么我们来看下GraphicsOverlay的用法吧。


GraphicsOverlay加载


      首先是实例化。GraphicsOverlay的实例化方法如下:


GraphicsOverlay graphicsOverlay_1=new GraphicsOverlay();
GraphicsOverlay graphicsOverlay_2=new GraphicsOverlay(GraphicsOverlay.RenderingMode.DYNAMIC);

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


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


       使用方法也很简单,只需要GraphicsOverlay.getGraphics().add(Graphic graphic),然后加载到MapView里即可。举一个简单的例子,以下代码是点击屏幕后在对应地方高亮显示个红点


mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
    @Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {
        android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY()));
        Point clickPoint = mMapView.screenToLocation(screenPoint);
        GraphicsOverlay graphicsOverlay_1=new GraphicsOverlay();
        SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
        Graphic pointGraphic = new Graphic(clickPoint,pointSymbol);
        graphicsOverlay_1.getGraphics().add(pointGraphic);
        mMapView.getGraphicsOverlays().add(graphicsOverlay_1);
        return true;
    }
});

      效果图如下:




      图上四个点就是我点击的四下屏幕。


符号Symbol使用


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


      比如在上述的例子里,我用了SimpleMarkerSymbol类来设置我要高亮显示点的样式为菱形,红色,10px大小。


      在Runtime100里对于Symbol类也进行了比较大的更改,多了一些参数,使得符号的样式更加丰富。下面我简单的介绍下各类符号。


点符号(MarkerSymbol


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


      SimpleMarkerSymbol的构造方法为:

SimpleMarkerSymbol(SimpleMarkerSymbol.Style style, int color, float size)
      三个参数分别是点样式,颜色以及点的大小。默认的构造参数为(circle,Black,0.0)

      样式包含:


      构造以后,有两种方法方法来使用,一种是直接构造新的图形,加入GraphicsOverlay里;另一种是加入到GraphicsOverlay的渲染里:

GraphicsOverlay.getGraphics().add(new Graphic(Geometry, SimpleMarkerSymbol));
GraphicsOverlay.setRenderer(new SimpleRenderer(SimpleMarkerSymbol));

      PictureMarkerSymbol的构造方法为:

PictureMarkerSymbol(BitmapDrawable drawable)
PictureMarkerSymbol(String url)
PictureMarkerSymbol(String url, RequestConfiguration requestConfiguration)

      其实就是给图片点符号里增加一个图片用以显示点。

      不过构造以后PictureMarkerSymbol的使用稍微麻烦,因为涉及到加载图片到符号里,所以需要一个异步监听操作:

final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable);
campsiteSymbol.loadAsync();
campsiteSymbol.addDoneLoadingListener(new Runnable() {
    @Override
    public void run() {
        
    }
});


      TextSymbol的构造函数为:

TextSymbol(float size, String text, int color, TextSymbol.HorizontalAlignment hAlign, TextSymbol.VerticalAlignment vAlign)

      一共有五个参数,分别是文本字体大小,文本内容,文字颜色以及相对于符号重点水平和竖直的对齐方式。

      文本符号的使用方法很简单,和简单点符号相同。


线符号(LineSymbol


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


      SimpleLineSymbol的构造函数为:

SimpleLineSymbol(SimpleLineSymbol.Style style, int color, float width)

      三个参数跟SimpleMarketSymbol相似,分别是样式,颜色,和线宽度。默认的构造参数是(Null,Black,0.0)

      样式为:


       使用方法和SimpleMarketSymbol也是相似的,有两种方法方法来使用,一种是直接构造新的图形,加入GraphicsOverlay里;另一种是加入到GraphicsOverlay的渲染里:

GraphicsOverlay.getGraphics().add(new Graphic(Geometry, SimpleLineSymbol));
GraphicsOverlay.setRender(new SimpleRenderer(SimpleLineSymbol));


面符号(FillSymbol)


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


      SimpleFillSymbol的构造函数为:

SimpleFillSymbol(SimpleFillSymbol.Style style, int color, LineSymbol outline)
      一共有三个参数,分别是面样式,颜色,以及面的外边线样式。默认参数为(Null,Black,Null

      样式为:


      使用方法和SimpleMarketSymbol也是相似的,有两种方法方法来使用,一种是直接构造新的图形,加入GraphicsOverlay里;另一种是加入到GraphicsOverlay的渲染里:

GraphicsOverlay.getGraphics().add(new Graphic(Geometry, SimpleFillSymbol));
GraphicsOverlay.setRender(new SimpleRenderer(SimpleFillSymbol));


      PictureMarkerSymbol的构造方法为:

      用法同PictureMarkerSymbol,就不用多累述了。


      介绍完了符号,举个例子说明下吧。结合本系列的三章,空间数据离线查询做一个I查询的功能,显示对应的面。废话不多说,上代码:


mMapView = (MapView) findViewById(R.id.mapview);
arcGISMap = new ArcGISMap();
mMapView.setMap(arcGISMap);
mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
    @Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {
        android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY()));
        final Point clickPoint = mMapView.screenToLocation(screenPoint);
        QueryParameters query = new QueryParameters();
        query.setGeometry(clickPoint);// 设置空间几何对象
        FeatureTable mTable = dataFeatureLayer.getFeatureTable();//得到查询属性表
        final ListenableFuture<FeatureQueryResult> featureQueryResult
                = mTable.queryFeaturesAsync(query);
        featureQueryResult.addDoneListener(new Runnable() {
            @Override
            public void run() {
                try {
                    FeatureQueryResult featureResul = featureQueryResult.get();
                    for (Object element : featureResul) {
                        if (element instanceof Feature) {
                            Feature mFeatureGrafic = (Feature) element;
                            Geometry geometry=mFeatureGrafic.getGeometry();
                            GraphicsOverlay graphicsOverlay_1=new GraphicsOverlay();
                            SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
                            SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.DASH,Color.GREEN,10);
                            SimpleFillSymbol fillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID,Color.YELLOW,lineSymbol);
                            Graphic pointGraphic = new Graphic(clickPoint,pointSymbol);
                            Graphic fillGraphic = new Graphic(geometry,fillSymbol);
                            graphicsOverlay_1.getGraphics().add(pointGraphic);
                            graphicsOverlay_1.getGraphics().add(fillGraphic);
                            mMapView.getGraphicsOverlays().add(graphicsOverlay_1);
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        return true;
    }
});


      功能就是展示点击查询到对应的图层,找到这个面,并且设置为红点,绿线,黄面。我们看看效果图:




渲染Renderer使用


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


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


      使用方法其实上面介绍符号时候以及接触到了,以官方例子说明下:


// 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);


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

ArcGIS Runtime for Android开发教程V2.0(5)基础篇---图层

原址:http://blog.csdn.net/ArcGIS_Mobile/article/details/8151626 [html] view plaincopy ...

安卓智能地图开发与实施八:离线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0)

离线业务图层离线业务图层,在很大程度上减少了对网络的依附。无论是哪个行业的外业核查,都需要详细的原有信息进行支撑,而涉及地图、位置的信息核查,通过离线数据可以在本端形成对比核实能力。

安卓智能地图开发与实施十:图层管理 - ArcGIS Runtime SDK for Android(Version 100.0.0)

图层管理图层管理分为了基础底图切换和业务数据管理。基础底图主要是进行切换,而业务数据管理的功能因项目而已,基本有控制显示、图层查询、统计等。

安卓智能地图开发与实施十九:符号与渲染器 - ArcGIS Runtime SDK for Android(Version 100.1.0)

符号与渲染器符号与渲染器(Symbols and Renderers),通过色彩值、大小、形状、边线、透明度来表达空间要素的具体含义。如果仅仅有位置,而没有位置上的属性信息,位置也会失去意义,符号与渲...

最新基于高德地图的android进阶开发(5)地图的基本操作、事件监听、用户UI、图层选择等

1.高德地图的基本操作:最简单的莫过于第一次加载地图布局文件:basic_map.xml,在下面的操作中,未作特别说明都采用此布局文件。 <com.amap.api.maps.MapView ...

ArcGIS Runtime SDK for iOS移动开发之WMS图层

注:本文翻译自:https://developers.arcgis.com/ios/objective-c/guide/wms-layer.htm       web地图服务(WMS)图层基于来自开放...

ArcGIS Runtime SDK for iOS之利用代码添加图层(Layers)

注:本篇文章翻译于点击打开链接。        这篇文章将向大家描述你可以添加到地图中的图层类型,并向你展示具体的添加过程。同时概述当一个图层被加载到地图中时哪些代理会被调用。

AO 图层基本操作

  • 2008-05-13 15:25
  • 755KB
  • 下载

ArcGIS Engine开发教程之图层符号化(四)——符号化之Renderer( 渲染)体系

符号化之Renderer( 渲染)体系     ArcGIS Engine9.3对GIS数据的符号化分为矢量数据渲染和栅格数据渲染两大类。接下来分别介绍FeatureRender和RasterR...

ArcGIS Runtime SDK for iOS之符号和渲染

本篇文章翻译自与点击打开链接,有不妥之处还请大家多多指正!        符号定义了图形外观的非地理方面。它包括了图形的颜色、线宽、透明度等等。ArcGIS Runtime SDK for iOS包...
  • hlj184
  • hlj184
  • 2015-03-08 19:45
  • 1007
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)