在客户端绘制点、线、面要素是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. mysql去除内容中的换行和回车

    UPDATE tablename SET field = REPLACE(REPLACE(field, CHAR(10), ”), CHAR(13), ”); char(10): 换行符 char(1 ...

  2. java基础讲解05-----流程控制语句

    1.条件语句 语法 :  1.    if(表达式){语句块} 2.    if()                {                                    }else ...

  3. ubuntu下运行第一个.net core web程序

    前置条件 ubuntu系统 且已经安装dotnetcore运行环境 mkdir  testMVC 创建一个文件夹 cd testMVC    进入文件夹 dotnet new -t web 创建程序( ...

  4. mongodb - Master Slave Replication

    master-slave复制模式大多场景下都被replicat sets代替.官方也建议使用replicat sets. master-slave复制不支持自动failover. master-sla ...

  5. Oracle Report(Report 6i/RDF)使用全局变量fnd_global, fnd_frofile

    注:本文为原创,作为学习交流使用,转载请标明作者及出处,作者保留追究法律责任的权力. Lumen Su lzsu1989#gmail.com (#=@) www.cnblogs.com/lzsu198 ...

  6. Android横竖屏布局总结

      Android横竖屏要解决的问题应该就两个:一.布局问题;二.重新载入问题. 1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的 AndroidManifest.xml中找到你 ...

  7. Node.js搭建本地web服务(转)

    http://www.cnblogs.com/wangfupeng1988/p/4143996.html https://github.com/finderL/webserver

  8. Oauth2.0协议曝漏洞 大量社交网站隐私或遭泄露

    2014年是IT业界不平常的一年,XP停服.IE长老漏洞(秘狐)等等层出不穷,现在,社交网络也爆出惊天漏洞:Oauth2.0协议漏洞 继OpenSSL漏洞后,开源安全软件再曝安全漏洞.新加坡南洋理工大 ...

  9. ArcGIS教程:将“替换为模型”工具用于多面体

    替换为模型工具出如今 3D 编辑器 工具条上的 3D 编辑器菜单中.而且仅仅适用于多面体要素.使用此命令可将所选的一个或多个要素的几何替换为磁盘中所保存的 3D 模型文件.受支持的 3D 模型类型包含 ...

  10. JAVA设计模式之 命令模式【Command Pattern】

    一.概述 命令模式能够将请求发送者和接收者全然解耦.发送者与接收者之间没有直接引用关系,发送请求的对象仅仅须要知道怎样发送请求,而不必知道怎样完毕请求.核心在于引入了命令类,通过命令类来减少发送者和接 ...