ArcGIS Runtime SDK for iOS开发地图图层-图形图层
注:本文翻译自:https://developers.arcgis.com/ios/objective-c/guide/creating-a-graphics-layer.htm
创建图形图层
图形图层可以使你在地图上动态的展示图形。图形图层可以用来存储用户绘制的多边形、线条,或者展示例如查询或是地理编码结果的属性信息。下图中,图形图层用于突出展示每平方里超过200人的人口密度状态:
当你想在地图中添加一个图形图层,可以利用AGSGraphicsLayer 类来创建图层。该类的实例包含了一系列图形和可选性的渲染器(AGSRender)。同时,也包含了添加、删除和重绘图形的方法。
符号定义了图形表面的非地理方面属性,主要包括图形的颜色、边框宽度、透明度等等。ArcGIS Runtime SDK for iOS中包含了许多符号类,每个类都可以使你以独特的方式指定符号。每个符号类型同时也是特定于某一类几何类型(点、线、面)。
渲染器定义了应用于图形的符号集。应用在每个图形的符号取决于图形的属性。渲染器指定了什么样的属性值对应哪一种符号。
添加图形图层
下面是添加图层的方法:
- AGSGraphicsLayer* myGraphicsLayer = [AGSGraphicsLayer graphicsLayer];
- [self.mapview addMapLayer:myGraphicsLayer withName:@"Graphics Layer"];
需要注意的是,在addMapLayer方法中你给图形图层赋予的名字在地图视图中必须是唯一的。
添加图形属性
图形是AGSGraphic类的一个实例,图形和几何体(geometry)相关联,几何体定义了在地图中图形的位置和形状。图形同时又跟符号相关联,符号定义了图形如何被展示。另外,图形图层可以跟渲染器相关联,渲染器定义了图层中的所有图形如何被展示。你还可以将一些属性跟图形相关联,这些属性是键-值对,它可以表征图形所代表的实体的信息。
在多数情况下,你在地图上所展示的图形将会被返回并作为执行任务的结果,例如请求地图服务、地理编码一个地址、或者是进行地理处理分析操作。在这些例子中,图形将包含了描述它们位置和形状的几何体。所以你要做的就是定义这些图形该如何被展示,是通过为每个图形赋一个符号?或是给图形图层赋一个渲染器。
下面的代码创建了一个图层,并给它赋予一个符号和几何体,并将它添加到已存在的图形图层中去:
- //create a marker symbol to be used by our Graphic
- AGSSimpleMarkerSymbol *myMarkerSymbol =
- [AGSSimpleMarkerSymbol simpleMarkerSymbol];
- myMarkerSymbol.color = [UIColor blueColor];
- //Create an AGSPoint (which inherits from AGSGeometry) that
- //defines where the Graphic will be drawn
- AGSPoint* myMarkerPoint =
- [AGSPoint pointWithX:-93.2984
- y:44.9409
- spatialReference:self.mapView.spatialReference];
- //Create the Graphic, using the symbol and
- //geometry created earlier
- AGSGraphic* myGraphic =
- [AGSGraphic graphicWithGeometry:myMarkerPoint
- symbol:myMarkerSymbol
- attributes:nil];
- //Add the graphic to the Graphics layer
- [myGraphicsLayer addGraphic:myGraphic];
作为任务结果返回的图形是一个几何图形,但是没有符号,所以你在将在将这些图形添加到地图中去前,需要给其赋予一个符号或是一个渲染器。代码如下:
- //create a simple fill symbol
- AGSSimpleFillSymbol *fillSymbol =
- [AGSSimpleFillSymbol simpleFillSymbol];
- fillSymbol.color =
- [[UIColor purpleColor] colorWithAlphaComponent:0.25];
- fillSymbol.outline.color = [UIColor darkGrayColor];
- //featureSet.features is the result of a Query task.
- //It is an array of AGSGraphic objects containing
- //geometries, but not symbols.
- for (AGSGraphic *graphic in featureSet.features) {
- //set the graphics’s symbol to fillSymbol
- graphic.symbol = fillSymbol;
- //add the graphic to the layer
- [myGraphicsLayer addGraphic:graphic];
- }
使用符号
常用的符号和其使用的几何体总结如下表:
| 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,其以蓝宝石的形式、三个像素宽的轮廓绘制。
- //Create the AGSSimpleMarker Symbol and set some properties
- AGSSimpleMarkerSymbol* myMarkerSymbol = [AGSSimpleMarkerSymbol simpleMarkerSymbol];
- myMarkerSymbol.color = [UIColor blueColor];
- myMarkerSymbol.style = AGSSimpleMarkerSymbolStyleDiamond;
- myMarkerSymbol.outline.color = [UIColor whiteColor];
- myMarkerSymbol.outline.width = 3
下面的代码创建了AGSSimpleFillSymbol,其以半透明的红色填充,红色的轮廓线进行绘制。
- //Create the AGSSimpleFillSymbol and set it’s color
- AGSSimpleFillSymbol* myFillSymbol = [AGSSimpleFillSymbol simpleFillSymbol];
- myFillSymbol.color = [UIColor colorWithRed:0.7 green:0.1 blue:0.1 alpha:0.5];
- //Create the AGSSimpleLineSymbol used for the outline
- AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol];
- myOutlineSymbol.color = [UIColor redColor];
- myOutlineSymbol.width = 2;
- //set the outline property to myOutlineSymbol
- myFillSymbol.outline = myOutlineSymbol;
使用渲染器
渲染器定义了应用于图层中图形的符号集。你可以利用渲染器,根据图形的属性值,以不同的颜色或是尺寸大小来符号化特征。要使用渲染器,你先要创建它,定义符号,然后为图层设置渲染特性。
- myGraphicsLayer.renderer = myRenderer;
创建一个简单的渲染器
一个简单的渲染器将相同的符号应用在每一个图形上。所有你需要所做的就是利用满足要求的符号创建渲染器,然后将其作为图形图层的渲染属性。
- AGSSimpleRenderer* mySimpleRenderer = [AGSSimpleRenderer
- simpleRendererWithSymbol:myMarkerSymbol];
- myGraphicsLayer.renderer = mySimpleRenderer;
在AGSSimplerenderer中的符号属性是只读的。利用简单的渲染器来使用符号,你必须利用符号要求的符号来创建渲染器。同时,符号的类型需要与属性特征相匹配。
创建分类间隔渲染器
分类间隔渲染器根据图形的数值属性来为每个图形符号化。具有相似的属性值的图形获得相同的符号。“间隔”定义了符号发生变化时的数值。
符号和数值的映射关系定义在AGSClassBreak 对象的数组中,AGSClassBreaksrenderer将这种关系存储在它的classBreaks的属性中。AGSClassBreak的对象包含了用来绘制图形的符号、最小值和最大值。
下面的代码根据城市的大小,创建了一个AGSClassBreaksRenderer来符号化城市。共有三个分类:第一个是从DB_MIN到50000,第二个是从50000到250000,最后一级是从250000到DBL_MAX。
- //create the renderer with a default simple marker symbol
- //and an attribute field.
- AGSClassBreaksRenderer *cityRenderer = [[[AGSClassBreaksRenderer alloc] init] autorelease];
- cityRenderer.field = @"POP1990";
- cityRenderer.minValue = DBL_MIN;
- //create three AGSClassBreak objects, one each for
- //low, medium and high populations and the appropriate
- //symbol (for clarity, the symbol creation has been omitted)
- AGSClassBreak* lowClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"Low" description:@"" maxValue:50000 symbol:lowMarkerSymbol];
- AGSClassBreak* mediumClassBreak =[AGSClassBreak classBreakInfoWithLabel:@"Medium" description:@"" maxValue:250000 symbol:mediumMarkerSymbol];
- AGSClassBreak* highClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"High" description:@"" maxValue:DBL_MAX symbol:highMarkerSymbol];
- //add the AGSClassBreak objects to the renderer
- cityRenderer.classBreaks = @[lowClassBreak, mediumClassBreak, highClassBreak];
- //add the renderer to the graphics layer
- citiesGraphicsLayer.renderer = cityRenderer;
创建单值渲染器
单值渲染器符号化一组具有属性匹配的图形,这在标准化数据和字符串数据中很常用。例如,你可以利用单值渲染器来标识区域名称:黄色为住宅区、紫色为工厂区、红色为商业区等等。你也可以将单值渲染器用在编码值上,或者是有序的属性值上如一、二、三等。
下面的代码创建了AGSUniqueValueRenderer来为城市的三个值来符号化:VILLAGE、CITY、TOWN,每种类型都用单一的符号来表达TYPE属性字段。
- //create the renderer
- //specify the attribute field whose values will decide the symbol
- //we need to provide a default symbol for unmatched values
- AGSUniqueValueRenderer *cityRenderer = [[[AGSUniqueValueRenderer alloc] init] autorelease];
- cityRenderer.defaultSymbol = defaultMakerSymbol;
- cityRenderer.field1 = @"TYPE";
- //create three AGSUniqueValue objects, one each for
- //CITY, TOWN, and VILLAGE
- AGSUniqueValue* village = [[AGSUniqueValue alloc] initWithValue:@"VILLAGE" label:@"village" description:nil symbol:villageSymbol];
- AGSUniqueValue* city = [[AGSUniqueValue alloc] initWithValue:@"CITY" label:@"city" description:nil symbol:citySymbol];
- AGSUniqueValue* town = [[AGSUniqueValue alloc] initWithValue:@"TOWN" label:@"town" description:nil symbol:townSymbol];
- //add the AGSUniqueValue objects to the renderer
- cityRenderer.uniqueValues = @[village, city, town];
- //add the renderer to the graphics layer
- citiesGraphicsLayer.renderer = cityRenderer;
ArcGIS Runtime SDK for iOS开发地图图层-图形图层的更多相关文章
- ArcGIS Runtime SDK for iOS开发系列教程(5)——要素信息的绘制
在客户端绘制点.线.面要素是GIS应用的基本功能,这一讲我将向大家介绍在iOS中如何来实现这一功能.大家都知道在Flex.Silverlight.js中对于要素的绘制都有一个叫GraphicsLaye ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的地图应用程序的开发包,包括移动设备的Android.iOS.Windows Phone,针对桌面的.Net.Java.OSX ...
- ArcGIS Runtime SDK for iOS之符号和渲染
符号定义了图形外观的非地理方面.它包括了图形的颜色.线宽.透明度等等.ArcGIS Runtime SDK for iOS包含了许多符号类,其中的每个类可以让你以独特的方式指定符号.每个符号的类型也是 ...
- 《ArcGIS Runtime SDK for Android开发笔记》
开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO
1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述
1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步
1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出 ...
随机推荐
- 蛋疼的mocha库-promise异步测试
mocha 测试库的使用 错误的处理异步测试 异步当出现断言错误的时候,他会抛出错误,但不会把这次测试当作失败,就是正确的顺利通过测试了,很无语. promise的reject会在then的第二个函数 ...
- JavaScript访问对象属性
在JavaScript中,可以使用“ . ”和“ [ ] ”访问对象的属性. 1.点表示法 使用“ . ”运算符来存取一个对象的属性时,属性名是用标识符表示的.而在JavaScript程序中,标识符必 ...
- Struts2 架构图
Struts2架构图 请求首先通过Filter chain,Filter主要包括ActionContextCleanUp,它主要清理当前线程的ActionContext和Dispatcher:Filt ...
- BZOJ.5120.[清华集训2017]无限之环(费用流zkw 黑白染色)
题目链接 LOJ 洛谷 容易想到最小费用最大流分配度数. 因为水管形态固定,每个点还是要拆成4个点,分别当前格子表示向上右下左方向. 然后能比较容易地得到每种状态向其它状态转移的费用(比如原向上的可以 ...
- [BZOJ3674]可持久化并查集加强版&[BZOJ3673]可持久化并查集 by zky
思路: 用主席树维护并查集森林,每次连接时新增结点. 似乎并不需要启发式合并,我随随便便写了一个就跑到了3674第一页?3673是这题的弱化版,本来写个暴力就能过,现在借用加强版的代码(去掉异或),直 ...
- libctemplate——源码分析
前言 在阅读此文章前,建议先阅读我之前写的<libctemplate——C语言模块引擎简介及使用>,以便对这个库有一个初步的认识.通过对库的代码阅读,对库有了一定的认识,提练一些重要的知识 ...
- Qt.Qt新安装之后出现Error while building/deploying (kit: Desktop Qt 5.7.0 GCC 64bit) When executing step "Make”
出问题的环境: 操作系统: Ubuntu18.04 安装包: qt-opensource-linux-x64-5.8.0.run 现象: 新建一个Hello World项目, 试着运行, 出现以下提示 ...
- MySql数据库事务正常提交,回滚失败
问题:在初次练习Mysql数据库事务时,事务正常提交,但是在遇到异常应当回滚时,回滚失败. 代码如下: //2.更新操作. public void update(Connection conn, St ...
- Object类--toString方法
toString()方法 1.在Object类中定义toString()方法的时候返回对象的哈希code码(对象地址字符串) 直接输出对象: 2.可以通过重写toString()方法表示出对象的属性之 ...
- oracle索引原理(b-tree,bitmap,聚集,非聚集索引)
B-TREE索引 一个B树索引只有一个根节点,它实际就是位于树的最顶端的分支节点. 可以用下图一来描述B树索引的结构.其中,B表示分支节点,而L表示叶子节点. 对于分支节点块(包括根节点块)来说,其所 ...