注:本文翻译自: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. hdu 1686 Oulipo 【KMP】(计算模式串匹配的次数——与已匹配的字串可以有交集)

    题目链接:https://vjudge.net/contest/220679#problem/B 题目大意: 输入一个T,表示有T组测试数据: 每组测试数据包括一个字符串W,T,T长度大于W小于100 ...

  2. IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

    上节以对话形式,大概说了几种客户端授权模式的原理,这节重点介绍Hybrid模式在MVC下的使用.且为实现IdentityServer4从数据库获取User进行验证,并对Claim进行权限设置打下基础( ...

  3. Python学习 ——正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. re 模块使 Python 语言拥有全部的正则表达式功能. compile 函数根据一个模式字符串和可选的标志参数生 ...

  4. win7查看其它工作组 win7 所有工作组

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha win7 所有工作组 ==== win7  网络 工作组 查找 自身有问题.  多刷新几 ...

  5. 滑动CheckBox样式

    <Style x:Key="SliderCheckBox" TargetType="{x:Type CheckBox}"> <Setter P ...

  6. java参数转换为javaBean对象

    package com.tuxin.tool.json; import flexjson.JSONDeserializer;import flexjson.JSONSerializer;import ...

  7. 2016年3月12日Android学习笔记

    1. //此句不能忘,否则onFling左右滑动不起作用 mLlExamView.setLongClickable(true); mLlExamView.setOnTouchListener(new ...

  8. iOS web view 与 js 交互

    移动应用中许多复杂的且经常改动的页面会使用H5进行代替native,这里就会使用到js和webview的交互 iOS里面,UIWebView提供了方法stringByEvaluatingJavaScr ...

  9. 【原创】python模拟腾讯网页登录

    近日,研究Tencent网页模拟登录的过程,过程有些忐忑,但最终还是实现了这一功能.先将结果写于此,供大家参考: 其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下: fu ...

  10. 喵哈哈村的魔法考试 Round #20 (Div.2) 题解

    题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...