在客户端绘制点、线、面要素是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. Idea golang "can’t find import" 解决方法

    如题,在使用leveldb go wrapper levigo 的时候,本地安装好levigo后,通过命令行编译代码正常并能work,但在Idea中使用时出现: can't find import & ...

  2. VMware安装Centos7超详细过程(图文)

    1.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:CentOS6 ,如果没有镜像可以在阿里云下载 https://mirrors.aliyun.com/centos/ 硬件 ...

  3. 关闭MongoDB

    以下方法干净地关闭MongoDB: 完成所有挂起的操作.刷新数据到数据文件.关闭所有的数据文件 1. > use admin switched to db admin > db.shutd ...

  4. hdu 4770 Lights Against Dudely(回溯)

    pid=4770" target="_blank" style="">题目链接:hdu 4770 Lights Against Dudely 题 ...

  5. oblique perspective projection

    参考: https://en.wikibooks.org/wiki/GLSL_Programming/Vertex_Transformations <3D游戏与计算机图形学中的数学方法>E ...

  6. Error: Could not find or load main class org.apache.flume.tools.GetJavaProperty

    问题: [root@master conf]# flume-ng version Error: Could not find or load main class org.apache.flume.t ...

  7. python访问纯真IP数据库的代码

    通过IP地址判断客户端是网通的还是电信的. 使用一个纯文本的IP纯真数据库,用Python写了一个小程序. 核心代码: #!/usr/bin/env python #site www.jbxue.co ...

  8. python 同时遍历多个变量

    最近在用python的时候,用到遍历多个变量: import sys import math F58=11491939491.7 F=[11429229079.7,11374540753.7,1132 ...

  9. RabbitMQ系列一

    1.http://www.erlang.org/downloads 下载一个比教新的版本(otp_win64_20.2.exe) 2.http://www.rabbitmq.com/install-w ...

  10. Webdings 图形字体

    如果想在网页上插入图形,最简单的方式就是使用图形字体.Webdings 是一种微软开发的图形字体,在IE浏览器上可以使用它. 什么是Webdings Webdings 是一个TrueType的ding ...