zoukankan      html  css  js  c++  java
  • 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中包含了许多符号类,每个类都可以使你以独特的方式指定符号。每个符号类型同时也是特定于某一类几何类型(点、线、面)。

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

           添加图形图层

           下面是添加图层的方法:

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

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

           添加图形属性

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

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

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

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

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

    [objc] view plain copy
     
    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.   
    8. //featureSet.features is the result of a Query task.  
    9. //It is an array of AGSGraphic objects containing  
    10. //geometries, but not symbols.  
    11. for (AGSGraphic *graphic in featureSet.features) {  
    12.     //set the graphics’s symbol to fillSymbol  
    13.     graphic.symbol = fillSymbol;  
    14.   
    15.     //add the graphic to the layer  
    16.     [myGraphicsLayer addGraphic:graphic];  
    17.   
    18. }  

         使用符号

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

    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,其以蓝宝石的形式、三个像素宽的轮廓绘制。

    [objc] view plain copy
     
    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,其以半透明的红色填充,红色的轮廓线进行绘制。

    [objc] view plain copy
     
    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.   
    5. //Create the AGSSimpleLineSymbol used for the outline  
    6. AGSSimpleLineSymbol* myOutlineSymbol = [AGSSimpleLineSymbol simpleLineSymbol];  
    7. myOutlineSymbol.color = [UIColor redColor];  
    8. myOutlineSymbol.width = 2;  
    9.   
    10. //set the outline property to myOutlineSymbol  
    11. myFillSymbol.outline = myOutlineSymbol;  

           使用渲染器

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

    [objc] view plain copy
     
    1. myGraphicsLayer.renderer = myRenderer;  

           创建一个简单的渲染器

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

    [objc] view plain copy
     
    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。

    [objc] view plain copy
     
    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.   
    7. //create three AGSClassBreak objects, one each for    
    8. //low, medium and high populations and the appropriate    
    9. //symbol (for clarity, the symbol creation has been omitted)    
    10. AGSClassBreak* lowClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"Low" description:@"" maxValue:50000 symbol:lowMarkerSymbol];      
    11. AGSClassBreak* mediumClassBreak =[AGSClassBreak classBreakInfoWithLabel:@"Medium" description:@"" maxValue:250000 symbol:mediumMarkerSymbol];      
    12. AGSClassBreak* highClassBreak = [AGSClassBreak classBreakInfoWithLabel:@"High" description:@"" maxValue:DBL_MAX symbol:highMarkerSymbol];      
    13.   
    14. //add the AGSClassBreak objects to the renderer           
    15. cityRenderer.classBreaks = @[lowClassBreak, mediumClassBreak, highClassBreak];  
    16.   
    17.   
    18. //add the renderer to the graphics layer    
    19. citiesGraphicsLayer.renderer = cityRenderer;  

           创建单值渲染器

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

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

    [objc] view plain copy
     
    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.   
    8. //create three AGSUniqueValue objects, one each for    
    9. //CITY, TOWN, and VILLAGE   
    10. AGSUniqueValue* village = [[AGSUniqueValue alloc] initWithValue:@"VILLAGE" label:@"village" description:nil symbol:villageSymbol];    
    11. AGSUniqueValue* city = [[AGSUniqueValue alloc] initWithValue:@"CITY" label:@"city" description:nil symbol:citySymbol];    
    12. AGSUniqueValue* town = [[AGSUniqueValue alloc] initWithValue:@"TOWN" label:@"town" description:nil symbol:townSymbol];      
    13.   
    14. //add the AGSUniqueValue objects to the renderer  
    15. cityRenderer.uniqueValues = @[village, city, town];  
    16.    
    17.   
    18. //add the renderer to the graphics layer    
    19. citiesGraphicsLayer.renderer = cityRenderer;  





  • 相关阅读:
    python3+request接口自动化框架
    类型转换函数
    操作符重载(三)
    操作符重载(二)
    操作符重载(一)
    时间获取函数
    文件和目录
    Linux五种IO模型
    类中的函数重载
    系统调用IO和标准IO
  • 原文地址:https://www.cnblogs.com/sunfuyou/p/8404805.html
Copyright © 2011-2022 走看看