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 Engine编程之图层渲染与输入坐标画要素

实验:符号化元素和图层 使用c#+ArcGIS Engine开发一个界面,点击菜单,调用shapefile文件。 图层渲染 要求,点击不同的图层,渲染方式不同。 林班分布图:简单渲染,颜色为红...
  • theArcticOcean
  • theArcticOcean
  • 2016年06月13日 09:35
  • 1818

ArcGIS Engine— 学习图层符号化

地图符号不仅具有确定的空间位置以及空间地物的性质:例如在一个城市管线系统中不同的线符号表示不同类型的管线,不同的点符号表示不同类型的设备等等,而且地图符号也可以表达与空间位置相关的丰富信息:例如人口密...
  • zkcharge
  • zkcharge
  • 2013年06月25日 16:24
  • 1939

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

前几天忙着翻译外文文献,有些专业术语总觉得翻译欠妥。查阅资料后,现在总结一下。 ------------------------------- ArcGIS Engine9.3对GIS数据的符号化...
  • qq_29066959
  • qq_29066959
  • 2016年03月03日 14:00
  • 1618

使用动态图层在服务器端渲染

最近经常碰到用户咨询如何在ArcGIS Server 10.1中对图层进行渲染的问题! 一般以下两个情形我会推荐用户在发布服务时,启用动态图层。 业务需求1: 在服务器端有图层,想对这个图层进行渲染,...
  • myyouthlife
  • myyouthlife
  • 2014年01月06日 15:36
  • 1139

海量图层管理的新希望——ArcGIS Server 动态图层服务

1      众里寻他千百度 “海量数据的发布与共享一直是GIS应用系统建设中的难题,尤其是当数据还在不断增加的时候……”,像是被针扎了般,小崔猛然一惊。然 后他全神贯注,紧紧盯着大屏幕,生怕错...
  • u013751758
  • u013751758
  • 2015年03月26日 15:10
  • 2616

Arcgis for Android在地图上画多边形并进行边长、周长和面积的测量

Arcgis for Android的地图操作里,放大缩小地图、图层切换、定位、测距测面等都是它的一些基本操作,封装后一般调用就是了,很简单。不过最近有了个需求,在地图上画一个多边形时候同时进行多边形...
  • bit_kaki
  • bit_kaki
  • 2016年11月07日 16:42
  • 6087

ArcEngine图层渲染

矢量符号化(渲染)类型   要素符号化类型 描述  1  SimpleRender 简单符号化 2  UniqueValueRender 唯一值符号化...
  • zy332719794
  • zy332719794
  • 2013年06月26日 11:44
  • 3061

符号级别(二)--实际应用

除了调整符号显示顺序之外,符号级别功能还可以实现连接和合并。 连接则是前面所说的在图层右键直接应用符号级别,默认则是做连接,这样实现接驳处自动连接和融合。 使用合并可实现使用不同符号绘制的要素的混合...
  • liyuanxiang1984
  • liyuanxiang1984
  • 2016年10月11日 08:23
  • 2097

Android Arcgis入门(二)、MapView与图层介绍

一、MapView              MapView是Arcgis中的最基本的类,与高德地图SDK的MapView的重要性一样。MapView的创建有两种方法,一种是在Layout文件中直接写...
  • Gary__123456
  • Gary__123456
  • 2017年03月22日 20:57
  • 1740

ArcGIS Engine开发---图层符号化

使用ServerStyle 如果熟悉ArcGIS Desktop的使用,就会对Style符号库文件有所了解,相对应的在ArcGIS Engine开发中对应的是ServerStyle符号库,它的结构体...
  • haizhongliangji
  • haizhongliangji
  • 2014年11月13日 22:22
  • 1438
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ArcGIS for Android Runtime100 基本操作(五)——绘制图层和符号渲染
举报原因:
原因补充:

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