注:本文翻译自: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. P2376 [USACO09OCT]津贴Allowance

    P2376 [USACO09OCT]津贴Allowance一开始想的是多重背包,但是实践不了.实际是贪心,让多c尽可能少,所以先放大的,最后让小的来弥补. #include<iostream&g ...

  2. jupyter notebook connecting to kernel problem

    前几天帮同学配置 python 和 anaconda 环境,在装 jupyter notebook 时,出了点问题,搞了一天半终于搞好了,也是在 github 里找到了这个问题的解答. 当时显示的是无 ...

  3. springboot Autowired BeanNotOfRequiredTypeException

    现象 org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xxxxImpl' is expect ...

  4. Java开发人员必须掌握的两个Linux魔法工具(四)

    子曰:"工欲善其事,必先利其器." 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 学习应该是快乐的,在这个乐园中我努力让自己能用简洁易懂(搞笑有趣) ...

  5. Android studio 3.0以上版本无法引入,找不到v4,v7包方案解决

    Android studio 3.0以上版本无法引入v4.v7包报红,即找不到v4.v7包,解决方案如下: 步骤: 1,Close Object,点击左上角的关闭工程. 2,点击x,删除项目. 3,重 ...

  6. 添加 vip

    两台机器:172.16.91.101 172.16.91.107 在91.101上增加虚拟ip,92网段的 ifconfig eth0:1 172.16.92.2 netmask 255.255.25 ...

  7. Python进制转换(二进制/八进制/十进制/十六进制)

    Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义 ba ...

  8. CentOS 7下设置Docker代理(Linux下Systemd服务的环境变量配置)

    Docker守护程序使用HTTP_PROXY,HTTPS_PROXY以及NO_PROXY环境变量在其启动环境来配置HTTP或HTTPS代理的行为.无法使用daemon.json文件配置这些环境变量. ...

  9. App架构师实践指南二之App开发工具

    App架构师实践指南二之App开发工具     1.Android Studio 2.编译调试---条件断点.右键单击断点,在弹出的窗口中输入Condition条件.---日志断点.右键单击断点,在弹 ...

  10. 如何实现一个Java Class 解析器

    原文出处: tinylcy 最近在写一个私人项目,名字叫做ClassAnalyzer,ClassAnalyzer的目的是能让我们对Java Class文件的设计与结构能够有一个深入的理解.主体框架与基 ...