ArcGIS Runtime SDK for iOS开发系列教程(5)——要素信息的绘制

在客户端绘制点、线、面要素是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[email protected]"您当前点击的位置:";

    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>

    NSURL *mapUrl = [NSURL URLWithString:@"http://www.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineStreetColor/MapServer"];

    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

时间: 2024-11-06 01:21:26

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

《ArcGIS Runtime SDK for Android开发笔记》——ArcGIS Runtime SDK概述

1.前言 ArcGIS Runtime SDK是一整套用于构建原生及跨平台的应用程序开发包, 转载请注明出处:http://www.cnblogs.com/gis-luq/p/4765993.html 2.ArcGIS Runtime SDKs产品家族 相信大部分开发者对ArcGIS Runtime SDKs这个名称并不生疏,它实际上包含了一系列SDKs,用来开发应用于桌面和移动设备的应用程序.在10.2.2之前的版本中,ArcGIS Runtime SDKs包括ArcGIS Runtime S

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

1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑.但是在ArcGIS Runtime SDK for Android的版本中并没有提供类似的功能,实现过程相对较复杂.(10.2.8及以下版本需要用户自定义扩展实现,通过扩展MapOnTouchListener类实现,Quartz版SDK默认自带) 之前有大神gispace封装了DrawTools2.

《ArcGIS Runtime SDK for Android开发笔记》

开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).Android Studio下载与安装 <ArcGIS Runtime SDK for Android开发笔记>——(2).Android Studio基本配置与使用 <ArcGIS Runtime SDK for Android开发笔记>——(3).ArcGIS Runtime SDK概述

《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型

1.前言 移动端的数据来源非常重要,它决定了移动端功能的实现.早期的ArcGIS Android API中,主要以接入在线的数据源为主,因此主要实现在线的地图浏览.查询和路径分析.地理处理等从操作:在v1.0.1版本中,ArcGIS移动产品第一次可以加载松散型切片,自此逐渐掀开了对本地离线数据源的支持,也因此可以在移动端实现越来越受欢迎的离线功能.现在最新的10.2.7 API离线支持数据主要包括紧凑型切片.tpk切片包..geodatabase..shp文件.地名地址库.网络数据集. 转载请注

《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预计将在明年的时候推出.届时在开发思路上将会往新版迁移. 总的来说,虽然“Quartz”版的开发思路有所变化,但总体变化不大,这里我将继续以现有正式发布版本为主梳理ArcGIS Runtime SDK for Android 开发内容. 参考API版本号:version 10.2.7.后续内容若不做特

《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述

1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基础环境: ArcGIS for Desktop 10.2.1以上版本 ArcGIS for Server 10.2.1以上版本 使用PostgreSQL.Microsoft SQL Server.或 Oracle 设置企业级地理数据库ArcSDE. 再次在使用同步功能是必须给要素添加GlobleID

《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步

1.前言 上一篇文章中我们实现了离线要素的编辑操作,这一篇中主要介绍离在线一体化技术中最后一个环节离线数据的同步功能,通过对数据的上传,服务器端的版本化管理,实现数据生产管理的整个流程. 转载请注明出处:http://www.cnblogs.com/gis-luq/p/5858062.html 2.demo实现过程 2.1.Demo UI实现 activity_main.xml <?xml version="1.0" encoding="utf-8"?>

ArcGIS Runtime SDK for iOS中获取ImageServiceLayer的栅格值

本文原创,转载请注明原创地址 http://blog.csdn.net/dongyu1009/article/details/37697389 用AGSImageServiceIdentifyTask可以获取ArcGISImageServiceLayer图层中的栅格值.这涉及了三个比较重要的类:AGSImageServiceIdentifyParameters.AGSImageServiceIdentifyTask和AGSImageServiceIdentifyResult,还有一个delega

《ArcGIS Runtime SDK for Android开发笔记》——基于Android Studio构建ArcGIS Android开发环境(离线部署)

1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在这种方式里主要通过设置maven仓库位置,设置编译选项.依赖版本在联网环境下下载对应SDK依赖包. 但是在网络情况不好的情况下这种方式就不行了,那怎么解决在离线环境或者内网环境实现开发流程呢?目前了解到的有两种方式: 1)配置内网环境maven仓库,预先缓存到内网环境下,然后离线调用. 2)采用直接