在客户端绘制点、线、面要素是GIS应用的基本功能,这一讲我将向大家介绍在iOS中如何来实现这一功能。大家都知道在Flex、Silverlight、js中对于要素的绘制都有一个叫GraphicsLayer的图层,那么在ArcGIS for iOS中也不例外,具体的功能和用法也比较类似。同时,在ArcGIS for iOS中还有一个实用的图层叫AGSSketchGraphicsLayer(草图编辑图层),它不仅可以方便客户要素的绘制保存,也是实现离线在线编辑同步的利器。

  另外,在Objective-C中委托是一种普遍采用的设计模式,而且ArcGIS for iOS中基本都是通过协议来实现的,比如要素绘制需要使用到AGSMapViewTouchDelegate协议来实现相应的委托。委托是将一个对象需要完成的处理委托给另外的对象来实现。委托有多种实现方式,协议只是其中一种,不能够将协议和委托混为一体。而协议是一组具有相似功能的函数集,它只定义了应该如何来完成相应的处理,具体的实现只能由其它类(也可以是自己)来完成。下面我就带大家来一步一步使用协议来实现委托处理完成要素绘制的功能。

  首先,我们通过上一讲中的操作来构建具有GIS功能的工程,然后添加GraphicsLayer,并添加协议

@interface esriViewController : UIViewController<<span style="">AGSMapViewTouchDelegate</span>>
 
@property (retain, nonatomic) IBOutlet AGSMapView *mapView;
@property (retain, nonatomic) IBOutlet AGSGraphicsLayer *graphicsLayer;
 
@end

  使用ArcGIS for iOS的协议实现委托处理的流程非常简单,只需要在类的声明中包含相应的协议

UIViewController<AGSMapViewTouchDelegate>,<span style="">然后在实现协议的处理方法(协议中定义的必须实现的函数)</span>,如
-(void)mapView:(AGSMapView *)mapView didClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint graphics:(NSDictionary *)graphics
{
    <span style="">//客户端要素绘制</span>
    <span style="">//构建点要素的渲染样式</span>
    AGSPictureMarkerSymbol *pt=[AGSPictureMarkerSymbol pictureMarkerSymbolWithImageNamed:@"ArcGIS.bundle/GpsDisplay.png"];
    <span style="">//创建点要素</span>  
    AGSGraphic *myPt=[[AGSGraphic alloc]initWithGeometry:mappoint symbol:pt attributes:nil infoTemplateDelegate:nil];
    <span style="">//添加要素到graphicsLayer</span>
    [_graphicsLayer addGraphic:myPt];
    [self.graphicsLayer dataChanged];
     
    <span style="">//将坐标信息以callout方式来显示出来</span>
    NSString *ltn= [NSString stringWithFormat:@"纬度:%0.4f  纬度:%0.4f",mappoint.x,mappoint.y];
     
    self.mapView.callout.title=@"您当前点击的位置:";
    self.mapView.callout.detail=ltn;
    self.mapView.callout.accessoryButtonHidden=YES;
    self.mapView.callout.image=[UIImage imageNamed:@"ArcGIS.bundle/esri.png"];
 
    self.mapView.callout.autoAdjustWidth=YES;
     
    [self.mapView showCalloutAtPoint:(AGSPoint *)mappoint forGraphic:myPt animated:YES];

    设置委托

<span style="">_mapView.touchDelegate=self;(设置mapView的点击后的处理由该类esriViewController本身来实现)</span>

    效果

    以上给大家介绍了使用ArcGIS for iOS协议实现委托的基本流程,以及GraphicsLayer实现要素绘制的功能,当然可以通过这种方式来添加多中用户自定义的要素信息。其实,ArcGIS for iOS的SDK已经给我们封装好了多种协议,如AGSMapViewTouchDelegate、AGSQueryTaskDelegate、AGSGeoprocessorDelegate等,在我们实现相应功能时,只需要引用即可,十分方便。

  下面我们来看AGSSketchGraphicsLayer的使用,实现点、线、面的绘制。同样,首先,添加AGSSketchGraphicsLayer图层,并添加一个

UISegmentedControl组件,实现点、线、面、取消等操作。为了省去代码绑定的环节我采用上讲中右键画线到.h文件的形式来实现类的声明

  完成后esriViewController.h文件为

#import <UIKit/UIKit.h>
#import <ArcGIS/ArcGIS.h>
 
@interface esriViewController : UIViewController<<span style="">AGSMapViewTouchDelegate</span>>
 
@property (retain, nonatomic) IBOutlet <span style="">AGSMapView *mapView</span>;
@property (retain, nonatomic) IBOutlet UISegmentedControl *selectGeometry;
@property (retain, nonatomic) IBOutlet <span style="">AGSGraphicsLayer *graphicsLayer</span>;
@property (retain, nonatomic) IBOutlet <span style="">AGSSketchGraphicsLayer *sketchLayer</span>;
 
@end

  viewDidLoad函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- (void)viewDidLoad
{
    [super viewDidLoad];
    <span style="">//底图加载</span>
    AGSTiledMapServiceLayer* baseMap=[[AGSTiledMapServiceLayer alloc] initWithURL:mapUrl];
    [self.mapView addMapLayer:baseMap withName:@"TiledMapLayer"];
    [baseMap release];
    
    <span style="">//要素图层的初始化与加载</span>
    self.graphicsLayer=[AGSGraphicsLayer graphicsLayer];
    [self.mapView addMapLayer:self.graphicsLayer withName:@"GraphicsLayer"];
    
    <span style="">//草图的初始化与加载</span>
    _sketchLayer= [[[AGSSketchGraphicsLayer alloc] initWithGeometry:nil] autorelease];
    [self.mapView addMapLayer:_sketchLayer withName:@"Sketch layer"];
     
    <span style="">//设置sketchLayer的默认geometry;不设置的情况,程序运行后直接在地图上点击不会得到点要素;</span>
    _mapView.touchDelegate=_sketchLayer;
    _sketchLayer.geometry = [[[AGSMutablePoint alloc] initWithX:NAN y:NAN spatialReference:_mapView.spatialReference]autorelease];
     
    <span style="">//为UISegmentedControl绑定事件消息</span>
    [_selectGeometry addTarget:self action:@selector(selectAction:) forControlEvents: UIControlEventValueChanged];
     
}

   在selectAction中设置要绘制要素的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-(void)selectAction:(id)sender
{
     <span style="">//设置地图点击后的处理由AGSSketchGraphicsLayer来实现;</span>
     <span style="">_mapView.touchDelegate=_sketchLayer;</span>
    switch ([sender selectedSegmentIndex]) {
        case 0:
        {
           //点
            _sketchLayer.geometry = [[[AGSMutablePoint alloc] initWithX:NAN y:NAN spatialReference:_mapView.spatialReference]autorelease];
        }
        case 1:
        {
           //线
           _sketchLayer.geometry = [[[AGSMutablePolyline alloc] initWithSpatialReference:_mapView.spatialReference] autorelease];
            break;           
        }
        case 2:
        {
           //面
            _sketchLayer.geometry = [[[AGSMutablePolygon alloc] initWithSpatialReference:_mapView.spatialReference] autorelease];
            break;
        }
        case 3:
        {
            <span style="">//取消绘制操作;</span>
            <span style="">_mapView.touchDelegate=self;</span>
            <span style="">_sketchLayer.geometry=nil;</span>
            break;
         }
        default:
            break;
    }
}

   AGSMapViewTouchDelegate实现函数

-(void)mapView:(AGSMapView *)mapView didClickAtPoint:(CGPoint)screen mapPoint:(AGSPoint *)mappoint graphics:(NSDictionary *)graphics
{
    AGSGeometry* sketchGeometry = [[_sketchLayer.geometry copy] autorelease];
    _mapView.touchDelegate=_sketchLayer;
    <span style="">//将当前要素绘制到graphicsLayer;</span>
    <span style="">//看到alloc、copy、release、autorelease大家是否还记得之前讲Objective-C语法的内存管理呢,记得回忆下,你就有更加深刻的体会哦;</span>
   
    AGSGraphic *gr=[[AGSGraphic alloc]initWithGeometry:sketchGeometry symbol:nil attributes:nil infoTemplateDelegate:nil];
    [_graphicsLayer addGraphic:gr];
    [_graphicsLayer dataChanged];   
     
}

   效果 

  总结:本讲主要希望通过要素绘制的功能,来向大家展示使用协议的方式实现委托模式的基本流程,AGSGraphicsLayer与AGSSketchGraphicsLayer的使用、callout信息显示等功能。下一讲我将通过QueryTask的实现来给大家介绍ArcGIS for iOS中Tasks使用的一般流程,欢迎大家继续关注!

转:http://www.cnblogs.com/esrichina/archive/2012/11/05/2753087.html

ArcGIS Runtime SDK for iOS开发系列教程(5)——要素信息的绘制的更多相关文章

  1. ArcGIS Runtime SDK for iOS开发地图图层-图形图层

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

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

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

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

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

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

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

  5. 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用

    1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...

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

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

  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. 修改配置nginx,限制无良爬虫频率

    配置如下: #全局配置 limit_req_zone $anti_spider zone=anti_spider:10m rate=15r/m; #某个server中 limit_req zone=a ...

  2. 在项目中增加自定义icon图标

    以MUI框架为例,内容来自于MUI官网. mui如何增加自定义icon图标 mui框架遵循极简原则,在icon图标集上也是如此,mui仅集成了原生系统中最常用的图标:其次,mui中的图标并不是图片,而 ...

  3. Linux 基础学习(第二节)

    free命令用于显示当前系统中内存的使用量信息,格式为:“free [-h]”. 为了保证Linux系统不会突然卡住宕机,因此内存使用量应该是运维人员时刻要关注的数据啦,咱们可以使用-h参数来以更人性 ...

  4. Objective-C中的类型转换

    转自:http://blog.csdn.net/lonelyroamer/article/details/7711920 类型转换 表2-3列出了简单数据类型.示例和格式符. 表2-3 简单数据类型. ...

  5. 品茗论道说广播(Broadcast内部机制讲解)(下)

    下面我们来看,递送广播动作中最重要的processNextBroadcast(). 3.2 最重要的processNextBroadcast() 从processNextBroadcast()的代码, ...

  6. android studio - 使android studio 在提示时不区分大小写

  7. MySQL 行号(类似SQLServer的row_number())

    Select ID,(@rowNum:=@rowNum+1) as RowNo From a,(Select (@rowNum :=0) ) b

  8. linux学习笔记22--命令ln

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  9. gcc 遇到过的语法问题

    1.在ubuntu 12.04 环境下,在/etc/ld.so.conf.d/目录里添加某个so库的配置路径,比如 /home/myself/abc/lib/ 执行 sudo ldconfig

  10. Oracle SQL Developer 日期格式显示设置

    ORACLE的SQL Developer工具默认的日期格式DD-MON-RR,在SQL查询中经常需要查看详细的时间信息,默认的时间显示格式不能满足这一需要, 此时你必须修改日期格式.具体如下所示 工具 ...