注:本文翻译自:https://developers.arcgis.com/ios/objective-c/guide/creating-a-graphics-layer.htm

       创建图形图层

图形图层可以使你在地图上动态的展示图形。图形图层可以用来存储用户绘制的多边形、线条,或者展示例如查询或是地理编码结果的属性信息。下图中,图形图层用于突出展示每平方里超过200人的人口密度状态:

当你想在地图中添加一个图形图层,可以利用AGSGraphicsLayer 类来创建图层。该类的实例包含了一系列图形和可选性的渲染器(AGSRender)。同时,也包含了添加、删除和重绘图形的方法。

符号定义了图形表面的非地理方面属性,主要包括图形的颜色、边框宽度、透明度等等。ArcGIS Runtime SDK for iOS中包含了许多符号类,每个类都可以使你以独特的方式指定符号。每个符号类型同时也是特定于某一类几何类型(点、线、面)。

渲染器定义了应用于图形的符号集。应用在每个图形的符号取决于图形的属性。渲染器指定了什么样的属性值对应哪一种符号。

添加图形图层

下面是添加图层的方法:

  1. AGSGraphicsLayer* myGraphicsLayer = [AGSGraphicsLayer graphicsLayer];
  2. [self.mapview addMapLayer:myGraphicsLayer withName:@"Graphics Layer"];

需要注意的是,在addMapLayer方法中你给图形图层赋予的名字在地图视图中必须是唯一的。

 添加图形属性

图形是AGSGraphic类的一个实例,图形和几何体(geometry)相关联,几何体定义了在地图中图形的位置和形状。图形同时又跟符号相关联,符号定义了图形如何被展示。另外,图形图层可以跟渲染器相关联,渲染器定义了图层中的所有图形如何被展示。你还可以将一些属性跟图形相关联,这些属性是键-值对,它可以表征图形所代表的实体的信息。

在多数情况下,你在地图上所展示的图形将会被返回并作为执行任务的结果,例如请求地图服务、地理编码一个地址、或者是进行地理处理分析操作。在这些例子中,图形将包含了描述它们位置和形状的几何体。所以你要做的就是定义这些图形该如何被展示,是通过为每个图形赋一个符号?或是给图形图层赋一个渲染器。

下面的代码创建了一个图层,并给它赋予一个符号和几何体,并将它添加到已存在的图形图层中去:

  1. //create a marker symbol to be used by our Graphic
  2. AGSSimpleMarkerSymbol *myMarkerSymbol =
  3. [AGSSimpleMarkerSymbol simpleMarkerSymbol];
  4. myMarkerSymbol.color = [UIColor blueColor];
  5. //Create an AGSPoint (which inherits from AGSGeometry) that
  6. //defines where the Graphic will be drawn
  7. AGSPoint* myMarkerPoint =
  8. [AGSPoint pointWithX:-93.2984
  9. y:44.9409
  10. spatialReference:self.mapView.spatialReference];
  11. //Create the Graphic, using the symbol and
  12. //geometry created earlier
  13. AGSGraphic* myGraphic =
  14. [AGSGraphic graphicWithGeometry:myMarkerPoint
  15. symbol:myMarkerSymbol
  16. attributes:nil];
  17. //Add the graphic to the Graphics layer
  18. [myGraphicsLayer addGraphic:myGraphic];

作为任务结果返回的图形是一个几何图形,但是没有符号,所以你在将在将这些图形添加到地图中去前,需要给其赋予一个符号或是一个渲染器。代码如下:

  1. //create a simple fill symbol
  2. AGSSimpleFillSymbol *fillSymbol =
  3. [AGSSimpleFillSymbol simpleFillSymbol];
  4. fillSymbol.color =
  5. [[UIColor purpleColor] colorWithAlphaComponent:0.25];
  6. fillSymbol.outline.color = [UIColor darkGrayColor];
  7. //featureSet.features is the result of a Query task.
  8. //It is an array of AGSGraphic objects containing
  9. //geometries, but not symbols.
  10. for (AGSGraphic *graphic in featureSet.features) {
  11. //set the graphics’s symbol to fillSymbol
  12. graphic.symbol = fillSymbol;
  13. //add the graphic to the layer
  14. [myGraphicsLayer addGraphic:graphic];
  15. }

使用符号

常用的符号和其使用的几何体总结如下表:

Symbol Geometry Description Symbol class
Simple Marker Point Symbolizes points with simple shapes AGSSimplemarkerSymbol
Picture Marker Point Symbolizes points with images AGSPictureMarkerSymbol
Simple Line Polyline Symbolizes lines with pre-defined styles AGSSimpleLineSymbol
Composite Point,Polyline,orPolygon Symbolizes geometry with an array of symbols AGSCompositeSymbol
Simple Fill Polygon Fills Polygons with a variety of patterns AGSSimpleFillSymbol
Text Point,Polyline,orPolygon Displays text labels for geometries AGSTextSymbol

所有的这些符号类都继承自AGSSymbol

下面的这些代码创建了AGSSimpleMarkerSymbol,其以蓝宝石的形式、三个像素宽的轮廓绘制。

  1. //Create the AGSSimpleMarker Symbol and set some properties
  2. AGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol];
  3. myMarkerSymbol.color = [UIColor blueColor];
  4. myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond;
  5. myMarkerSymbol.outline.color = [UIColor whiteColor];
  6. myMarkerSymbol.outline.width = 3

下面的代码创建了AGSSimpleFillSymbol,其以半透明的红色填充,红色的轮廓线进行绘制。

  1. //Create the AGSSimpleFillSymbol and set it’s color
  2. AGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol];
  3. myFillSymbol.color = [UIColor colorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];
  4. //Create the AGSSimpleLineSymbol used for the outline
  5. AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol];
  6. myOutlineSymbol.color = [UIColor redColor];
  7. myOutlineSymbol.width = 2;
  8. //set the outline property to myOutlineSymbol
  9. myFillSymbol.outline = myOutlineSymbol;

使用渲染器

渲染器定义了应用于图层中图形的符号集。你可以利用渲染器,根据图形的属性值,以不同的颜色或是尺寸大小来符号化特征。要使用渲染器,你先要创建它,定义符号,然后为图层设置渲染特性。

  1. myGraphicsLayer.renderer = myRenderer;

创建一个简单的渲染器

一个简单的渲染器将相同的符号应用在每一个图形上。所有你需要所做的就是利用满足要求的符号创建渲染器,然后将其作为图形图层的渲染属性。

  1. AGSSimpleRenderer* mySimpleRenderer = [AGSSimpleRenderer
  2. simpleRendererWithSymbol:myMarkerSymbol];
  3. myGraphicsLayer.renderer = mySimpleRenderer;

在AGSSimplerenderer中的符号属性是只读的。利用简单的渲染器来使用符号,你必须利用符号要求的符号来创建渲染器。同时,符号的类型需要与属性特征相匹配。

创建分类间隔渲染器

分类间隔渲染器根据图形的数值属性来为每个图形符号化。具有相似的属性值的图形获得相同的符号。“间隔”定义了符号发生变化时的数值。

符号和数值的映射关系定义在AGSClassBreak 对象的数组中,AGSClassBreaksrenderer将这种关系存储在它的classBreaks的属性中。AGSClassBreak的对象包含了用来绘制图形的符号、最小值和最大值。

下面的代码根据城市的大小,创建了一个AGSClassBreaksRenderer来符号化城市。共有三个分类:第一个是从DB_MIN到50000,第二个是从50000到250000,最后一级是从250000到DBL_MAX。

  1. //create the renderer with a default simple marker symbol
  2. //and an attribute field.
  3. AGSClassBreaksRenderer *cityRenderer = [[[AGSClassBreaksRenderer alloc] init] autorelease];
  4. cityRenderer.field = @"POP1990";
  5. cityRenderer.minValue = DBL_MIN;
  6. //create three AGSClassBreak objects, one each for
  7. //low, medium and high populations and the appropriate
  8. //symbol (for clarity, the symbol creation has been omitted)
  9. AGSClassBreak* lowClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"Low" description:@"" maxValue:50000 symbol:lowMarkerSymbol];
  10. AGSClassBreak* mediumClassBreak =[AGSClassBreak classBreakInfoWithLabel:@"Medium" description:@"" maxValue:250000 symbol:mediumMarkerSymbol];
  11. AGSClassBreak* highClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"High" description:@"" maxValue:DBL_MAX symbol:highMarkerSymbol];
  12. //add the AGSClassBreak objects to the renderer
  13. cityRenderer.classBreaks = @[lowClassBreak, mediumClassBreak, highClassBreak];
  14. //add the renderer to the graphics layer
  15. citiesGraphicsLayer.renderer = cityRenderer;

创建单值渲染器

单值渲染器符号化一组具有属性匹配的图形,这在标准化数据和字符串数据中很常用。例如,你可以利用单值渲染器来标识区域名称:黄色为住宅区、紫色为工厂区、红色为商业区等等。你也可以将单值渲染器用在编码值上,或者是有序的属性值上如一、二、三等。

下面的代码创建了AGSUniqueValueRenderer来为城市的三个值来符号化:VILLAGE、CITY、TOWN,每种类型都用单一的符号来表达TYPE属性字段。

  1. //create the renderer
  2. //specify the attribute field whose values will decide the symbol
  3. //we need to provide a default symbol for unmatched values
  4. AGSUniqueValueRenderer *cityRenderer = [[[AGSUniqueValueRenderer alloc] init] autorelease];
  5. cityRenderer.defaultSymbol = defaultMakerSymbol;
  6. cityRenderer.field1 = @"TYPE";
  7. //create three AGSUniqueValue objects, one each for
  8. //CITY, TOWN, and VILLAGE
  9. AGSUniqueValue* village = [[AGSUniqueValue alloc] initWithValue:@"VILLAGE" label:@"village" description:nil symbol:villageSymbol];
  10. AGSUniqueValue* city = [[AGSUniqueValue alloc] initWithValue:@"CITY" label:@"city" description:nil symbol:citySymbol];
  11. AGSUniqueValue* town = [[AGSUniqueValue alloc] initWithValue:@"TOWN" label:@"town" description:nil symbol:townSymbol];
  12. //add the AGSUniqueValue objects to the renderer
  13. cityRenderer.uniqueValues = @[village, city, town];
  14. //add the renderer to the graphics layer
  15. citiesGraphicsLayer.renderer = cityRenderer;

ArcGIS Runtime SDK for iOS开发地图图层-图形图层的更多相关文章

  1. ArcGIS Runtime SDK for iOS开发系列教程(5)——要素信息的绘制

    在客户端绘制点.线.面要素是GIS应用的基本功能,这一讲我将向大家介绍在iOS中如何来实现这一功能.大家都知道在Flex.Silverlight.js中对于要素的绘制都有一个叫GraphicsLaye ...

  2. 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  3. 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述

    1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...

  4. ArcGIS Runtime SDK for iOS之符号和渲染

    符号定义了图形外观的非地理方面.它包括了图形的颜色.线宽.透明度等等.ArcGIS Runtime SDK for iOS包含了许多符号类,其中的每个类可以让你以独特的方式指定符号.每个符号的类型也是 ...

  5. 《ArcGIS Runtime SDK for Android开发笔记》

    开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO

    1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

  8. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

    1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

    1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...

随机推荐

  1. (数据分析)第02章 Python语法基础,IPython和Jupyter Notebooks.md

    第2章 Python语法基础,IPython和Jupyter Notebooks 当我在2011年和2012年写作本书的第一版时,可用的学习Python数据分析的资源很少.这部分上是一个鸡和蛋的问题: ...

  2. BZOJ.1497.[NOI2006]最大获利(最小割 最大权闭合子图Dinic)

    题目链接 //裸最大权闭合子图... #include<cstdio> #include<cctype> #include<algorithm> #define g ...

  3. [CF776D]The Door Problem

    思路: 并查集维护每个开关的状态on[i]和off[i] .假设灯L由开关S1和S2控制.如果开关是亮的,则S1和S2的状态相反:如果开关是灭的,则S1和S2的状态相同.当一个开关状态已知时,可以得知 ...

  4. 常用类及 LeetCode 每日一题

    1 日期时间类 在 Java 语言中,是通过时间戳来表示时间的.所谓的时间戳,在 Java 中就是指当前时间距离历元(1970-01-01 00:00:00)的时间间隔,单位是毫秒,所以 Java 中 ...

  5. unity无限循环报错的定位

    晚上遇到了,碰到了程序一运行就卡住的尴尬问题,然后百度下,看了看,Get到了一个新的skill. 1. 打开对应的VS程序,选择“调试/Attach Unity Debuger”菜单来调试代码. 2. ...

  6. Python 将图片转化为 HTML 页面

    最近在 GitHub 看到一个挺有意思的 Python 程序(img2html: Convert a image to HTML). 它能将图片的每个像素用文字代替,最后生成一个HTML文档,在浏览器 ...

  7. java 使用SAX解析xml 文件

    http://www.cnblogs.com/allenzheng/archive/2012/12/01/2797196.html 为了学习方便,忘博主勿究

  8. webbench进行压力测试

    参考原文:http://www.vpser.net/opt/webserver-test.html webbench是Linux下的一个网站压力测试工具,最多可以模拟3万个并发连接去测试网站的负载能力 ...

  9. Linux:FHS标准

    FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准),多数Linux版本采用这种文件组织形式,FHS定义了系统中每个区域的用途.所需要的最小构成的文件 ...

  10. facebook's HipHop for PHP: Move Fast

    One of the key values at Facebook is to move fast. For the past six years, we have been able to acco ...