ArcGIS Runtime SDK for Windows Phone 入门教程

  1. 基本概念

    1. Windows Phone平台介绍

Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox Live游戏、Zune音乐与独特的视频体验整合至手机中。2010年10月11日晚上9点30分,微软公司正式发布了智能手机操作系统Windows Phone,同时将谷歌的Android和苹果的IOS列为主要竞争对手。2011年2月,诺基亚与微软达成全球战略同盟并深度合作共同研发。2012年3月21日,Windows Phone 7.5登陆中国。6月21日,微软正式发布最新手机操作系统Windows Phone 8,Windows Phone 8采用和Windows 8相同的内核

 Windows Phone具有桌面定制、图标拖拽、滑动控制等一系列前卫的操作体验。下图的lumia920是第一款Wp8操作系统的手机。

Nokia Lumia 920

其主屏幕通过提供类似仪表盘的体验来显示新的电子邮件、短信、未接来电、日历约会等,让人们对重要信息保持时刻更新。它还包括一个增强的触摸屏界面,更方便手指操作;以及一个最新版本的IE Mobile浏览器——该浏览器在一项由微软赞助的第三方调查研究中,和参与调研的其它浏览器和手机相比,可以执行指定任务的比例超过高达48%。很容易看出微软在用户操作体验上所做出的努力,而史蒂夫-鲍尔默也表示:"全新的Windows手机把网络、个人电脑和手机的优势集于一身,让人们可以随时随地享受到想要的体验。

  Windows Phone,力图打破人们与信息和应用之间的隔阂,提供适用于人们包括工作和娱乐在内完整生活的方方面面,最优秀的端到端体验。

  1. ArcGIS Server Rest API 介绍

ArcGIS Runtime SDK for Windows Phone是基于 ArcGIS Server REST 接口工作的,首先介绍一下

REST 的基本概念。

REST(Representational State Transfer)是 Roy Fielding 博士在 2000 年他的博士论文中提出来的一种软件架构风格。REST本身并不涉及任何新的技术,它基于 HTTP 协议,比起 SOAP 和 XML-RPC 来说它更加地简洁、高效,现在越来越多的大型网站正在使用 REST 风格来设计和实现。

REST 最突出的特点就是用 URI 来描述互联网上所有的资源,Roy Fielding 博士通

过观察互联网的运作方式对其进行了抽象,他认为:设计良好的网络应用表现为一系列的虚拟"网页",或者说这些虚拟网页就是资源状态的表现(Representational);用户选择这些链接导致下一个虚拟的"网页"传输到用户端展现给使用的人,而这正代表了资源状态的转发(State Transfer)。

REST 主要有以下的特点:

资源通过 URI 来指定和操作

对资源的操作包括获取、创建、修改和删除资源,这些操作正好对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法

连接是无状态性的

能够利用 Cache 机制来提高性能 接下来介绍 ArcGIS Server 是如何通过 REST 接口来暴露 GIS 资源的。 服务目录:使用 REST 接口最重要的就是 REST 服务目录,它是将 ArcGIS Server

提供的 REST 资源通过 HTML 表现出来的 URL。

ArcGIS Server for Java 10.0版本的服务目录地址为:http://<host>:8399/arcgis/rest/services; ArcGIS Server for .Net 10.0版本的服务目录地址为:http://<host>/arcgis/rest/services; 在10.1中的ArcGIS for Server 10.1(分为Windows 版本和linux版本) 服务的目录地址http://localhost:6080/arcgis/rest/services

在浏览器中输入上述 URL 后就可以看到当前所有的服务及其这些服务超链接到的资源和操作,如下图所示:

图 1-1 ArcGIS Server REST 服务根目录

下面我们进入点击,点查看其中China 服务。其 URL 地址为 http://localhost:6080/arcgis/rest/services/China/MapServer,特别需要注意的是 URL 中的目录名称arcgis,以及服务类型 MapServer,是区分大小写的,其余如机器名(localhost)、服务根目录(rest/services)、服务名(Base_Overview)都不区分大小写、在开发中我们经常会用到服务的地址,为确保地址准确一般采用粘贴复制的方式。:

图 1-4 ArcGIS 服务信息页面

下面就让我们点击"导出地图"链接去使用地图服务的"export"操作。你会发现,这个操作的 URL 是这样的:

http://localhost:6080/arcgis/rest/services/China/mapServer/export?bbox=105.94045756485127,35.36492248574146,142.82210315522065,60.05183042123063。在浏览器中访问

这个 URL 的结果如下:

地图服务的 export 操作返回结果

在最新的ArcGIS for Server 10。1中新增了Admin API 帮助我们管理ArcGISServer 比如 站点管理。服务的管理,服务发布,用户管理等等。我们在浏览器中输入http://localhost:6080/arcgis/admin/login,然后使用 ArcGIS Server 管理员帐号登录:

图 1-2 ArcGIS Server AdminAPI 管理员登录页面

从这个例子中,我们可以总结出:在 ArcGIS Server REST 接口中,请求服务的 URL 一般应该是这样的:http://<host>[:<port>]/arcgis/rest/services/<服务名称>/<服务类型> / < 操作>?<参数>。关于 REST 接口支持的资源类型和具体操作参数,你可以查阅 ArcGIS Server 的 REST SDK 文档,在这里就不赘述了。

  1. ArcGIS Runtime SDK for Windows Phone介绍

首先介绍一下有关ArcGIS 开发的编程模型,ArcGIS Server把我们的数据发布为不同类型的服务,然后通过Rest风格的接口暴露出来,既然是Rest风格的,我们就可以在浏览器地址栏上输入网址完成服务的使用,当然也可以自己在程序里构造http字符串来完成这些请求。但是这样操作比较复杂,比如我们要执行一个空间查询操作,首先要自己够早一个Json 风格的Geometry对象,如果是点的话,还比较简单,如果是面状的话就是麻烦了。另外一点就是如何来展示空间要素,我们向发送请求之后服务器也是以Json文本的形式来返回给我们,为了展示这些空间数据,于是我们想到 把文本解析为几何对象,这样一来就需要一个地图控件来完成这些操作。所以我们对ArcGIS Server Rest API需要进一步的封装也是有必要的。Esri针对不同的平台对ArcGIS Server Rest API进行了封装,主要包括 三种web API (ArcGIS API for JavaScript ,ArcGIS API for Flex ,ArcGIS API for Silverlight)以及四种移动的SDK,包括ArcGIS Runtime Sdk for Android ,ArcGIS Runtime Sdk for IOS 、ArcGIS Runtime Sdk for Windows Mobile、ArcGIS Runtime Sdk for WindowsPhone),他们具有相同的编程模型,只是跟据不同的平台以及不同的编程语言进行了不同的实现。功能也是基本一致的,有用来显示地图以及空间要素的地图控件,同时包含了用于加载不同类型的Layer,以及Grapchic、Geometry、Symbol、以及渲染器等等。同时还包括用来加载OGC格式的服务的类。通过一些任务来完成与服务器的交互,比如查询、路径分析、Gp 服务的调用等等。

ArcGIS APIs

ArcGIS Runtime SDK for Windows Phone(原名 ArcGIS API for Windows Phone) 是Esri推出的用于开发运行在Windows Phone设备上的移动GIS应用开发包。允许开发者在Windows Phone平台上集成 ArcGIS Server的服务以及微软的Bing地图服务。结合地图资源,定位器,gp服务与windowsPhone本身的平台以及开发框架(比如应用程序栏,Wp控件,以及微软的位置服务)相结合。ArcGIS Runtime SDK for Windows Phone基于ArcGIS API for Silverlight 技术。如果我们已经解了ArcGIS API for Silverlight 那么我们基本已经掌握了ArcGIS Runtime SDK for Windows Phone开发流程。ArcGIS Runtime SDK for WP开发

目前 ArcGIS Runtime SDK for Windows Phone 的最新版版本为 3.0,上一个版本的名字叫ArcGIS API for Windows Phone 2.4 较之前 增加了对10.1 新特性的支持,比如动态图层,服务端打印,以及可以访问像ArcGIS Online这样门户中资源的 Portal API等等。

使用ArcGIS Runtime SDK for Windows Phone 可以做什么?有哪些功能呢,其实与ArcGIS Runtime SDK for android 以及ArcGIS Runtime SDK for IOS 功能基本是一致的,与ArcGIS 3种WebAPI 也是类似的,都是基于Rest 架构的,对于ArcGIS Server Rest API的封装。

使用它可以在我们的在windows phone应用程序里面加入可以交互的地图,并且可以执行的任务。例如

  • 制作地图
  • 使用ArcGIS Online 以及Binging Map 中的地图作为底图
  • 增加要素以及可以交互的标记
  • 跟据空间或者属性查询要素并且显示结果到地图上
  • 地理定位并且显示定位结果
  • 计算路径并显示结果以及路径的方向
  • 编辑要素的形状和属性
  • 改变栅格影响的渲染器
  • 多源数据加载,比如OpenStreetmap,WMS WMTS

ArcGIS Runtime SDK for Windows Phone主要包含哪些内容

Map地图-支持多种坐标系的数据,支持加载来自ArcGIS Server的动态服务以及切片服务,支持Bing地图服务

Graphics图形 –允许用户在地图上绘制要素图形

Task 任务:主要包含如下的任务操作

查询

地理定位

搜索

识别

GP服务

几何图形运算比如缓冲区,空间运算,以及要素形状的简化

路径分析以及其他的网络操作的任务

Tookit 工具包

InfoWindow 弹出窗口

Legend 图例控件

MapProgressBar 地图加载进度条

ScaleLine 比例尺

同时还可以使用Windows Phone开发中用的控件,还包括对传感器的使用,关于更多WP开发的知识请到https://dev.windowsphone.com/en-US了解。

  1. ArcGIS Server中的各种服务

    1. 服务类型

我们已经知道ArcGIS Runtime 可以加载来自ArcGIS Server 发布的不同服务。下面对这些服务做些简单的介绍,服务类型如下表

表 ArcGIS Server不同的服务类型

服务类型

说明

MapService

提供动态的,或经过缓存处理的 2D 地图服务。

ImageService

提供对栅格、影像数据的访问服务。

GlobeService

提供 3D 球体服务。

GeocodeService

提供地址地理位置查询服务。

GeodataService

提供对 Geodatabase 的访问、查询、更新和管理服务。

GeoprocessingService

提供空间分析和地理处理服务。

Geometry Service

提供对几何图形的操作。

Search Service

提供对企业级 GIS 数据资源的检索服务。 目前叧能在 ArcGIS Desktop 软件中使用该服务。

  1. 服务与资源的关系

我们发布的服务需要一定的资源来满足要发布服务的类型

表 ArcGIS Server 服务与资源的对应关系

服务类型

所需资源

Map Service

地图文档(.mxd, .pmf);

地图服务定义文件(msd)。

Image Service

栅格数据集/镶嵌数据集; 引用了栅格数据集/镶嵌数据集的图层文件; 已编译的影像服务定义文件(.ISCDef)。

Globe Service

Globe 文档(.3dd, .pmf)。

Geocode Service

地址定位器(.loc, .mxs, SDE batch locator)。

Geodata Service

数据库连接文件(.sde)、PGDB 或 File GDB;

引用了版本数据库中数据的地图文档。

Geoprocessing

Service

包含工具图层的地图文档;

工具箱(.tbx)。

Geometry Service

需要 GIS 数据资源。

Search Service

包含 GIS 数据的文件夹或 Geodatabase。

  1. 服务具备的能力

当然不同服务的类型,具有的能力也是不同的。

  • 地图服务

地图服务具备的能力

服务能力

功能描述

Mapping

提供对地图文档内容的访问。地图服务自动具备该能力。

Feature Access

提供对地图上矢量要素的访问。

Mobile Data

Access

允许从移动设备访问地图文档中的数据。

WMS

创建符合 OGC WMS 标准的服务。

KML

使用地图文档创建 KML 要素。

Network Analysis

使用网绚分析扩展模块解决交通网络的分析问题。

WFS

创建符合 OGC WFS 标准的服务。

WCS

创建符合 OGC WCS 标准的服务。

Geodata Access

允许用户在 ArcMap 中迕行数据复制和数据。启用该能力

将创建一个关联的 Geodata Service。

Geoprocessing

提供对工具箱或工具图层中地理处理模型的访问。工具图层指代已添加到地图文档 TOC 中的模型。启用该能力将创建关联的

Geoprocessing 服务。

  • 影像服务

影像服务具备的能力

服务能力

功能描述

Imaging

提供对栅格数据集或镶嵌数据集的访问,包括像素值、属性、元

数据和波段。影像服务自劢具备该能力。

JPIP

当使用 JPEG 2000 文件和配置来自 ITTVIS 的 JPIP 服务器时提

供 JPIP 流能力。

WMS

创建符合 OGC WMS 标准的服务。

WCS

创建符合 OGC WCS 标准的服务。

  • 球体服务

球体服务具备的能力

服务能力

功能描述

Globe

提供对 Globe 文档内容的访问。Globe 服务具备该能力。

  • 地理编码服务

    地理编码服务具备的能力

服务能力

功能描述

Geocoding

提供对地址定位器的访问。Geocode 服务具备该能力。

  • 空间数据服务

    空间数据服务具备的能力

服务能力

功能描述

Geodata

提供对 Geodatabase 数据的查询、搜索和复制。

Geodata 服务具备该能力。

WFS

创建符合 OGC WFS 标准的服务。

WCS

创建符合 OGC WCS 标准的服务。

  • 地理处理服务

    地理处理服务具备的能力

服务能力

功能描述

Geoprocessing

提供对工具箱或工具图层中地理处理模型的访问。

Geoprocessing 服务自动具备该能力。

  • 几何服务

几何服务具备的能力

服务能力

功能描述

Geometry

提供执行几何计算的一个内部引擎,如投影、生成缓冲区等。

  • 数据检索服务

    数据检索服务具备的能力

服务能力

功能描述

Search

提供对企业级 GIS 数据资源的检索。Search 服务自动具备该能力。

  1. 开发环境部署、Hello World Map

    1. 开发环境

最新的ArcGIS Runtime SDK for Windows Phone 3.0同时支持 Windows Phone 7.5以及Windows Phone 8.0。根据需要配置开发环境。两种任选一种即可

  1. Windows phone 7的开发环境.

WP SDK内置了Express 版本的VS 如果已经安装VS的旗舰版本则WP的开发环境会集成到VS上,推荐先安装VS2010旗舰版 下载Windows Phone SDK 离线包,解压运行autorun.exe即可安装(如果网速高的话,也可以到微软官网下载Vm_Web2.exe ,进行在线安装)。安装过程很简单,"下一步"一直点击下去,直到安装完成,完成之后会在之前VS开发模板中增加Silverlight for Windows Phone 模板用来开发Windows Phone程序的模板,在此不再赘述。

  1. Windows Phone 8的开发环境

Windows Phone sdk 8.0 是一个功能齐全的开发环境,可用于构建 Windows Phone 8.0 和 Windows Phone 7.5 的应用和游戏戏。  Windows Phone SDK 将提供一个适用于 Windows Phone 的独立 Visual Studio Express 2012 版本或作为 Visual Studio 2012 Professional、Premium 或 Ultimate 版本的外接程序进行工作。 借助 SDK,您可以使用现有的编程技巧和代码来构建托管或本机代码应用。 此外,SDK 还包括在实际条件下用于分析和测试 Windows Phone 应用的多个模拟器和其他工具。

首先得确定的是自己的电脑的CPU是否支持虚拟化和二级地址转化,若不支持,后面也就不用做啦。。。鉴定方法,百度一下吧。不过基本上可以确定的是i5以上的CPU支持的。接下来 在 64位的win8 操作系统下 安装 Windows Phone SDK 8。SDK下载地址 下载后一路next。

  1. 安装 ArcGIS Runtime SDK for Windows Phone

下一步安装ArcGIS Runtime SDK for Windows Phone,最新版本是3.0 下载地址http://resources.arcgis.com/en/communities/windows-phone-sdk/ 下载完成后点击安装,也没什么复杂的地方,一路next下来:

下载界面

安装之后在安装目录下有6个dll,在这里介绍一下他们的功能

DLL名称

说明

ESRI.ArcGIS.Client.dll

核心类库包含了地图控件,各种服务的图层,Graphic,Symbol,Geometry,并且包含了各种任务比如Query,find,Identity,and gp服务,路径分析服务的调用

ESRI.ArcGIS.Client.Bing.dll

包含了使用微软bing地图图层以及服务的类

ESRI.ArcGIS.Client.Printing.dll

支持了调用ExportWebMap 任务的服务端打印(10.1新增)

ESRI.ArcGIS.Client.Tookit.dll

包含了与地图交互的工具比如图例 以及弹出窗口,地图加载进度条,比例尺

ESRI.ArcGIS.Client.Toolkit.DataSource.dll

对普通数据源的支持,比如OpenStreetMap以及WMS。该库是开源的,源码下载地址http://esrisilverlight.codeplex.com

ESRI.ArcGIS.Client.Portal.dll

加载ArcGISOnline或者其他私有portal中的内容 比如加载WebMap

对于新入门的朋友,在开发有些朋友不清楚引用哪一个,其实也很容易记得。Client基本上是必用的,如果我们要显显示地图,或者执行查询或者GP,以及网络分析的任务。需要的对象都是在Client.dll里面的。如果使用除了地图控件之外其他的展示控件的话还有添加Tookit.dll。如果实现服务端打印功能的话需要添加Printing.dll。等等,说明里也经写的很清楚了,这里不再赘述

  1. 第一个WP的地图应用

可以通过两种方式开发WP的应用,使用VS或者是使用Blend,下面简单地介绍两种方式的使用。

  1. 使用Visual Studio

开发Windows Phone 应用需要一定的C#/Vb 和XAML基础知识

启动Visual Studio。 File->New ->Project->Silverlight for Windows Phone->Windows Phone Application (在Wp8下没有Silverlight for Windows Phone 直接选择Windows Phone Application)

这里选择高版本7.1(Windows Phone OS 其实是开发的Windows Phone 7.5的程序)

点击OK 之后

工具箱中并没有ArcGIS Runtime SDK for Windows Phone的控件,在这里我们手动加入,在这里我们暂时只能手动加入,以后的版本中应该会加入 在工具箱上点击右键-点击ChooseITem

将Assembly Name为 以ESRI开头的控件全部打上对勾。点击OK之后,会发现工具箱中增加了好 多的ArcGIS Runtime SDK的控件。

当拖动完成后会自动增加Map标签,以及相应的XAML命名空间并且把ESRI.ArcGIS.Client.dll的引用也自动添加到引用里面,

然后修MAP的的代码

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<esri:Map x:Name="MyMap" Extent="12912639.4360293,4829242.20974629,13000507.7367659,4875676.67761523">

<esri:ArcGISTiledMapServiceLayer ID="MyLayer" Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" /> </esri:Map> </Grid>

在这里我加载一个ArcGIS Online的地图这里显示北京市

  1. 使用Blend创建

Microsoft Expression Blend作为一款功能齐全的专业设计工具,可用来针对基于 Microsoft Windows 和基于 Microsoft Silverlight的应用程序制作精美复杂的用户界面。Expression Blend 可让设计人员集中精力从事创作,而让开发人员集中精力从事编程工作。可以用来进行WPF,Silverlight 以及WindowsPhone 的界面设计代码编写,安装完Wp的Sdk开发包之后,可以在开始菜单里找到Blend的启动程序,下面介绍具体的操作

启动之后再主界面上点击 New Project

注意输入应用程序的名字 注意选择SKD的版本(注意SDK7.1开发的Winphone 7.5的程序),以及编程语言(C#/VB)点击OK

选择Map拖到name 为ContentPanel的Grid里面

修改代码 设置大小

Map里面的代码如下<esri:Map Background="White"WrapAround="True" >

<esri:ArcGISTiledMapServiceLayer Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"/></esri:Map>

按F5开始调试

通常在实际开发中使用Blend来实现一些界面的设计,动画的设计,后台的交互操作由VS来完成的。当然在Blend中也可以编写代码只是自动提示能力不是太强,还有就是如果编写的应用如果与微软的其他框架结合比如WebService、WCF等等

  1. 关于如何学习

1、首先关于语言,学习Windows Phone开发,需要有C#和XAML基础。但是需要对C#和XAML要熟悉。XAML它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言。XAML提供了一种便于扩展和定位的语法来定义和程序逻辑分离的用户界面,。在开发一个应用程序时,我们可以将开发工作分成开发人员和设计人员两个团体分别进行,各自负责后台程序代码逻辑和前台程序界面的设计,这样就使得开发人员和设计人员之间的协作更通畅,也极大地发挥了他们的专长。C#+XAML的开发方式同样使用Silverlight,WPF以及Win8 Metro开发,并且开发方式也是类似的。如果你已经熟悉ArcGIS API for Silverlight 开发,你会发现两者是如此相似。当然学习Windows Phone开发 也不一定要有Silverlight或者WPF基础。

2、帮助文档是最好的参考资料,地址http://resources.arcgis.com/en/communities/windows-phone-sdk/index.html 至于多大作用不必多说。帮助文档主要分为四个部分,Home主要是一些概况以及一些最新的信息,同时还有一些视频可以下载,Concept 里面是一个入门级的教程,Sample是例子,我们可以在网页上操作Wp的模拟器,同时也可以看到代码,API Reference API的介绍。

帮助文档界面

3、阅读类关系图

当我们部署完开发环境之后下一步就是熟悉API了,为了更好的学习API建议到官网下载类关系图。下载地址

通过阅读类关系图,让我们对每个类的功能一目了然。以及类之间的关系也能很快熟悉,一般是开发必备的武器。

  1. 开发篇

本章主要是描述如何使用ArcGIS Runtime SDK for Windows Phone 进行开发。常用GIS应用的功能的来分别进行介绍。

  1. 地图和图层

    1. Map控件

首先要介绍一个与地图加载相关的控件——Map。主要用来展示空间信息,呈现地图服务、影像服务中的空间数据,此外还可以展示WMS服务、、OpenStreetMap、GeoRSS、KML数据等。主要的属性如下

Map 类视图

Layers 是图层的集合,PanDuration是移动地图平移的时间。SpatialReference 获取地图控件的空间参考。MapToScreen和ScreenToMap是屏幕坐标与地图坐标坐标的转换函数,Progress地图加载进度事件。IsLogoVisible 是否显示右下角的Esri的 logo标志.。同时还包括,Extent用来设置地图的范围。MaximumResolution MinimumResolution 用来表示地图的最大最小分辨率,一般用来控制地图在某一范围的比例尺下进行显示。超过这些范围则不能进行缩放。PanTo 地图中心平移到某一几何对象,ZoomTo 放大至某一几何对象,WrapAround来决定地图向左向右平移之后是否循环显示。Map.ZoomFactor 用手"连击"(pinch)地图时的缩放比例因子,ZoomDuration/PanDuration平移缩放过程中过度动画的时间间隔MoveLayer 切换各个图层的顺序。ExtentChanged/ExtentChanging地图显示的范围发生变化时,变化后的事件。MapGesture 手势触发事件。同事Map控件也支持默认的几种手势。

在MapGesture事件里可以获得触发的手势。主要包括以下几种:Tap 、DoubleTap、 Hold 、Drag 、Flick 、Pinch、 Started 、Completed。详细介绍如下

Pan/Drag默认情况下会移动地图。

Pinch缩小地图的显示比例

Stretch放大地图的显示比例

Strech 按比例放大地图,缩放比例引子有地图控件的Map.ZoomFactor 来设置的

  1. Layers

Map 表示一个地图控件,提供一个 Layers 属性作为图层容器,而真正的数据则存储在相应的图层中。ArcGIS Runtime SDK for Windows Phone提供了若干种图层类型来承载不同来源的数据。。可以看出能能够显示的可以是来自ArcGIS for Server 发布的地图服务,切片服务,以及要素图层。也可以是符合OGC规范的Wms,Wmts 服务,以及开放街道图(OpenStreetMap,简称OSM)或者自己在前段绘制的要素图层。与定位相关的GpsLayer。图层架构图如下

图层

说明

Layer

抽象基类,表示所有可以添加到 Map 控件中的地理数据。图层是地理数据或者文本标注和符号渲染的表现形式。

TiledLayer

抽象基类,表示切片/缓存地图服务图层。当需要自定义一个切片图层类型,但缓存图片能通过简单的 URL 直接引用时,应考虑实现

TiledLayer。

TiledMapServiceLayer

抽象基类,表示切片/缓存地图服务图层。当需要自定义一个切片图层类型,并且缓存图片可以通过简单的 URL 直接引用时,应考虑实现

TiledMapServiceLayer。

ArcGISTiledMapServic eLayer

ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer 表示可以通过 REST 接口访问的 ArcGIS 缓存地图服务图层。缓存服务访问预先创建好的图片资源,而不是根据客户端请求动态产生图片。

OpenStreetLayer

ESRI.ArcGIS.Client.Toolkit.DataSources.OpenStreetMapLayer 表示由 OpenStreetMap 组织提供的缓存 image 服务数据。该组织拥有一份可供公众免费使用和自由编辑的全球地图数据。一共支持 4 种

OpenStreetMapLayer 类型:Mapnik,Osmarenderer,Cycle Map 和 NoName。OpenStreetMap 数据使用 WGS84 基准,经纬度坐标。

TileLayer

ESRI.ArcGIS.Client.Bing.TileLayer 表示缓存的微软必应地图服务数据。

使用 Bing 服务要求生成并提供令牌(Token)

DynamicLayer

抽象基类,表示动态图层类型。如果想创建自定义动态图层类型,并需要管理创建、操作或自己下载源图片数据,请实现 DynamicLayer。

DynamicMapServiceLa yer

抽象基类,表示动态图层类型。如果想创建自定义的劢态图层类型,通过 指 向 在 线 服 务 的 URL 访 问 劢 态 生 成 的 图 片 , 请 实 现

DynamicMapServiceLayer。

ArcGISDynamicMapSer viceLayer

ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer 表示可以通过REST 接口访问的 ArcGIS 动态地图服务图层。动态地图服务根据客户端请求实时生成图片。ArcGISDynamicMapServiceLayer 的背景色始终透明。

ArcGISImageServiceLa yer

ESRI.ArcGIS.Client.ArcGISImageServiceLayer 表示可以通过 REST 接口访问的 ArcGIS 影像服务图层。影像服务是原始影像或成果影像数据的最佳选择,支持 RGB,全色,多光谱,DEM 等影像数据,影像数据可以存储在 Geodatabase 或文件系统中。影像服务的数据源可以是栅格数据集或镶嵌数据集。

GPResultImageLayer

ESRI.ArcGIS.Client.Tasks.GPResultImageLayer 表示由地理处理任务(Geoprocessing Task)产生的结果图层。如果返回的要素数量超过 500 个,将由 ArcGIS Server MapServer 负责渲染图片,如果少于 500 个 , 应 由 开 发人 员 编 码 使 用 GraphicsLayer 显 示 要 素 。GPResultImageLayer 要求通过后台代码使用。

WMSLayer

ESRI.ArcGIS.Client.Toolkit.DataSources.WmsLayer表示符合 OGC标准的劢态服务图层。目前在 ArcGIS Silverlight API 2.1 中,支持 WMS

1.1.1 和 WMS 1.3。

GraphicsLayer

ESRI.ArcGIS.Client.GraphicsLayer 是一种客户端图层,用于绘制基于

矢量数据的图形,幵指定符号迕行渲染。

FeatureLayer

ESRI.ArcGIS.Client.FeatureLayer 是 GraphicsLayer 的特殊类型,编写后台代码即显示要素。与GraphicsLayer 相比,FeatureLayer 有以下特性:

Url—地图服务地址(加上图层 ID),要素图层自动回去动态服务中图层中的数据。

FeatureSymbol—要素渲染的符号。 ClusterFeatures—是否允许对点要素迕行聚簇显示。

KmlLayer

ESRI.ArcGIS.Client.Toolkit.DataSources.KmlLayer    也    是    一    种

GraphicsLayer,其图形几何体由基于 XML 语法的数据源迒回,可以是 KML、KMZ 或服务。

GpsLayer

ESRI.ArcGIS.Client.Toolkit.DataSources.GpsLayer 一种客户端图层类型

生成的位图图层,与GPS 定位相关的图层。

ElementLayer

ESRI.ArcGIS.Client.ElementLayer 是一种客户端图层类型,可以将WindowsPhone中任意 UIElement 对象放在地图里的某个地理位置。如果为 UIElement 指定高宽,则其将随地图缩放,如果仅指定点位置,则随地图缩放。

Layer 是所有图层类型的基类,定义了任何类型的图层都具有的一些通用的属性、方法、事件,如下表所示

属性

说明

FullExtent

获取图层的全图范围。

ID

获取或设置图层的标识符,可用于在地图图层集合中查找指定图层。

InitializationFailure

包含图层初始化失败信息。

MaximumResolution/

MinimumResolution

在图层可见时获取或设置图层的最大和最小分辨率(map unit per pixel)。

Opacity

获取或设置图层的透明度。

SpatialReference

获取图层的空间参考。

Visible

获取或设置图层的可见性。

方法

说明

Initialize

初始化图层数据,可重写该方法以添加自己的初始化逡辑。

ToBitmap

将当前图层渲染为 WritableBitmap 对象。

事件

说明

InitializationFailed

图层初始化失败事件。

Initialized

图层初始化结束事件。

关于某个图层的具体信息请参阅API文档或者类视图文档,这里不做详细介绍。

  1. 地图加载

加载图层主要有两种形式。在XAML编写或者使用Codebehind(后台编码)来添加。刚才最我们已经完成了HelloWorld 实现了地图的显示。在创建Hello World 的时候,我们只是从工具箱中拖了一个Map 控件到我们的界面上,在拖放的过程中,开发工具帮助我们完成了一些操作,添加了 dll的引用,并且在XAML添加了对命名空间的引用。同时在显示地图的时候我们需要完成一些初始化的设置。接下来我们自己完成这些操作

  1. 使用XAML 添加图层

由于显示地图用到的Map 类,所以我们要添加ESRI.ArcGIS.Client.dll的引用,在工程目录下,右键引用 点击添加引用,选择相应的dll。如果在列表里没有ERSI.ArcGIS.Client.dll.则需要单机浏览按钮手动添加找到Sdk的安装目录 默认在C:\Program Files (x86)\ESRI SDKs\WindowsPhone71\v3.0 下,选择 Client.dll选择。然后单击确定。发现引用里多了一个ESRI.ArcGIS.Client

然后在XAML添加引用,打开MainPage.xaml.可以看到类似Xml风格的XAML语言。在Phone:PhoneApplicationPage 标签上输入一行xmlns:esri=" 然后会弹出提示如下.这里选择ESRI.ArcGIS.Client(ESRI.ArcGIS.Client),自动为我们添加了命名空间,如果没有弹出智能提示的话我们可以手动输入如下的内容xmlns:esri="clr-namespace:ESRI.ArcGIS.Client;assembly=ESRI.ArcGIS.Client",在这里esri是我自己取得名字,可以随便设置。

找到Name为ContentPanel 的标签在里面添加一个Map控件,并添加一个动态服务。XAML代码如下

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<esri:Map >

<esri:ArcGISDynamicMapServiceLayer Url="http://192.168.1.112:6080/arcgis/rest/services/China/MapServer"></esri:ArcGISDynamicMapServiceLayer>

</esri:Map>

</Grid>

其中ArcGISDynamicMapServiceLayer是在刚才引用的esri的命名空间下的。这里我本机发布的一个动态服务。地址在Service Directory 可以找到,我的机器目录下是http://192.168.1.112:6080/arcgis/rest/services。

如果要添加多个图层话,可以在Map的Layer里面继续添加,比如我要添加一个切片地图作为底图。XAML代码如下

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<esri:Map >

<esri:ArcGISTiledMapServiceLayer Url="http://www.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer"></esri:ArcGISTiledMapServiceLayer>

<esri:ArcGISDynamicMapServiceLayer Url="http://192.168.1.112:6080/arcgis/rest/services/China/MapServer"></esri:ArcGISDynamicMapServiceLayer>

</esri:Map>

</Grid>

运行效果如下。

  1. 使用后台代码添加图层

把刚才添加到XAML文件里面的代码清除掉,打开MainPage.xaml.cs 文件。添加 Using ESRI.ArcGIS.Clinet引用(确保在引用里面已经添加了相应的dll)。在构造函数里面添加代码

public MainPage()

{

InitializeComponent();

Map Mymap = new Map();

ArcGISTiledMapServiceLayer layer1 = new ArcGISTiledMapServiceLayer();

layer1.Url = "http://192.168.1.112:6080/arcgis/rest/services/China/MapServer";

ArcGISDynamicMapServiceLayer layer2 = new ArcGISDynamicMapServiceLayer();

layer2.Url = "http://192.168.1.112:6080/arcgis/rest/services/China/MapServer";

Mymap.Layers.Add(layer1);

Mymap.Layers.Add(layer2);

ContentPanel.Children.Add(Mymap);

}

运行结果与上一种情况是相同的。

而在实际开发中,往往使用XAML与后台代码结合的形式来完成的。比如我在XAML里面完成Map 控件的添加,为Map设置x:Name属性(后台通过这个属性来获取Map控件)。

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">

<esri:Map x:Name="Mymap" > </esri:Map

</Grid>

在后台代码里实现地图的添加

public MainPage()

{

InitializeComponent()

ArcGISTiledMapServiceLayer layer1 = new ArcGISTiledMapServiceLayer()

layer1.Url = "http://www.arcgisonline.cn/ArcGIS/rest/services/ChinaOnlineCommunity/MapServer";

ArcGISDynamicMapServiceLayer layer2 = new ArcGISDynamicMapServiceLayer();

layer2.Url = "http://192.168.1.112:6080/arcgis/rest/services/China/MapServer";

Mymap.Layers.Add(layer1);

Mymap.Layers.Add(layer2);

}

以上实现地图的添加了动态服务,以及切片图层,其它的添加方式与之类似,如果我们要添加多个地图的话 就要考虑地图的顺序的问题,在添加过程中我们先添加的图层在最底层,以次向上添加。可以为地图图层注册一些事件,比如加载完成/失败的事件

  1. 地图的初始化

以下三个属性是在地图初始化的时候可以设置的

•Initial extent 初始化地图范围

•Spatial reference 空间参考信息

•Minimum and maximum resolution 可以的显示的分辨率范围

在默认情况下,地图的显示范围是它的FullExtent,地图控件的坐标系以第一次添加到该控件的图层的坐标系为准,如果之后添加的是动态服务与第一次添加的服务的坐标系不一致,动态服务可以进行动态投影的转换,它会自动进行投影,来适应地图控件的坐标系,如果后来添加的是切片服务第一次添加的服务的坐标系不一致,切片服务不能进行动态投影的转换,这样就会出现图层不显示的情况。如果Map 控件中包含有切片图层。最大最小分辨率的值与该切片图层的分辨率的范围一致。

设置地图开始的范围,可以设置Map的Extent属性,Extent代表一个矩形区域的范围,四个之分别为minimum X, minimum Y, maximum X and maximum Y如下

<esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40">

</esri:Map>

如果在后台代码里设置或者要修改显示范围,需要构建一个Envelope对象,设置上述的四个属性,然后把Envelope 对象赋值给Map 的Extent属性即可,同时呢我们可以使用Map.ZoomTo来实现,放大显示至某一几何对象。

设置地图的坐标系,默认情况下Map的坐标系以第一次添加到该Map的图层的坐标系为准,如果我们之后添加的图层(动态服务图层,动态影像服务图层,以及要素图层)与当前地图的坐标系不一致的时候,这些图层的空间信息会自动进行投影转化到当前Map坐标系下以实现与底图的叠加。但是如果后来添加的是切片服务图层话,不会进行重投影转换,导致不能实现叠加。这个时候怎么办呢,既然切片不能进行投影转换,那我们只好把设置Map的坐标系为该切片图层的坐标系了。这样就以切片图层的坐标系为基准了。如果要设置一个坐标系,我们可以设置Map对象的Extent属性的坐标系(SpatialReference) 代码如下:

<esri:Map x:Name="MyMap">

<esri:Map.Extent>

<esriGeometry:Envelope XMin="661140" YMin="-1420246" XMax="3015668" YMax="1594451" >

<esriGeometry:Envelope.SpatialReference>

<esriGeometry:SpatialReference WKID="26777"/>

</esriGeometry:Envelope.SpatialReference>

</esriGeometry:Envelope>

</esri:Map.Extent>

</esri:Map>

关于空间参考SpatialReference :地理对象的位置在地球球面上通过经纬度,也即地理坐标系测量。经度和纬度没有统一的度量单位;仅当在赤道时,一个经度所代表的距离才大致等于一个纬度所代表的距离。为了克服度量上的差异,数据通常会从三维的地理坐标系统统一到二维平面上的投影坐标系上。每个坐标系统通过一个WKID 和定义字符串(WKT)进行标识和定义。ArcGIS RuntimeSdk for支持WKID 和WKT。有关支持的完成IDs 和关于他们对应的定义字符串,请参考:

  • Projected Coordinate Systems listing
  • Geographic Coordinate Systems listing
  1. 缩放地图

考虑到在移动设备上屏幕分辨率是一固定值的问题,在Windows Phone 7中的分辨率默认是桌面计算机的两倍,也就是意味着,在windows Phone7种一个像素的大小是在桌面计算机上的一半。一般我们发布的地图服务中的文本,以及符号等渲染效果都是根据桌面计算的标准来设计的,这样在Windows Phone手机上使用该服务就会显示出来比较小的符号或者文本,为了得到良好的显示,我们应该对地图服务的渲染器进行重新设计,或者在程序里控制(进行缩放),一般选择后者。可以对地图控件做个变换来改变图层渲染器以适应屏幕。XAML代码如下

  1. <esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40"
  2. SizeChanged="MyMap_SizeChanged" RenderTransformOrigin="0.5,0.5">
  3. <esri:Map.RenderTransform>
  4. <ScaleTransform ScaleX="2" ScaleY="2" />
  5. </esri:Map.RenderTransform>

接着在SizeChanged的事件里添加,保证地图控件大小不变

  1. private void MyMap_SizeChanged(object sender, SizeChangedEventArgs e)
  2. {
  3. if (e.PreviousSize.Height == 0)
  4. {
  5. MyMap.Width = e.NewSize.Width / 2;
  6. MyMap.Height = e.NewSize.Height / 2;
  7. }
  8. }

通过前后对比,地图中的文本和符号都变大了,而地图的显示范围却没有变

  1. 地图导航

默认情况下Map控件支持默认的几种手势来完成地图的导航功能,以上已经在前面的地图控件内容中介绍了。

我们也可以在程序里通过改变地图的Extent来实现地图的移动。比如,可以对Map的Extent重新赋值,也可以使用地图控件的ZoomTo,Zoom,Panto、ZoomToResolution来实现。

Extent

设置Extent属性ESRI.ArcGIS.Client.Geometry.Envelope envelope = new ESRI.ArcGIS.Client.Geometry.Envelope (-120, 20, -100, 40);

MyMap.Extent = envelope;

Zoom

MyMap.Zoom(2)缩小一半MyMap.Zoom(0.5)放大2倍

ZoomTo

MyMap.ZoomTo(Mypolygon)放大至一多边形

ZoomToResolution

MyMap. ZoomToResolution(double d)放大至某一分辨率

PanTo

把某一几何对象移动至Map的中心,地图的显示比例不变

如果想获得地图的默认的初始范围,我们应该在它第一次加载的时候来获取,在地图的范围变化,我们可以在ExtentChanging 和 ExtentChanged 两个事件里来获取地图地图变化前后的范围值。在地图移动或者缩放的时候会触发这两个事件,获取初始范围的代码如下

void MyMap_ExtentChanged(object sender, ExtentEventArgs e)

{ if (e.OldExtent == null)

ESRI.ArcGIS.Client.Geometry.Envelope initialExtent = e.NewExtent;

}

我们在平移或者缩放过程中,地图会有一个过渡动画,我们可以控制动画的时间,默认的情况下缩放的持续时间是1.5秒,平移动画的持续时间是0.75秒,通过设置Map 的PanDuration以及ZoomDuration可以设置,以下是取消动画的操作

<esri:Map x:Name="MyMap" ZoomDuration="00:00:00" PanDuration ="00:00:00">

</esri:Map>

  1. 图例控件

在我们观看一个地图的时候,图例中的不同符号能够帮助我们更好地理解地图的内容。这里需要用到一个Legend控件,Legend控件在ESRI.ArcGIS.Client.Toolkit.dll 这个程序集里面,图例控件可以显示我们选择的所有图层的符号,以及显示当前地图范围内的图层符号。

图例显示

Legend 类的主要属性、方法、事件如下表所述

成员

说明

LayerIDs

获取或设置图例控件关联的图层 IDs。

LayerItems

获取图例控件关联的图层。

LayerItemsMode

获取或设置图层项的模式,以定义图例控件的结构样式:Flat 或 Tree 。基于该属性值,LayerItemsSource 和 ESRI.ArcGIS.Client.Toolkit.Primitives.LayerItemViewModel.La yerItemsSource 既可以仅返回回图层项叶节点或完整的图层项层次 结构(包含地图服务图层和组图层)。

LayerItemsSource

枚举图例控件中第一级节点显示的图例项。枚举内容依赖于

LayerItemsMode 属性和 ShowOnlyVisibleLayers 属性设置。

LayerTemplate

获取或设置图层模板。该模板默认应用于所有图层项(除去最深一级的图例项)。

LegendItemTemplate

获取或设置图例项的模板(定义图例项外观)。

Map

获取或设置图例控件关联的地图控件。

MapLayerTemplate

获取或设置地图图层模板(最高一级的服务图层节点)。

ShowOnlyVisibleLayers

是否仅显示可见的图层的图例。

Refresh()

刷新图例控件。

Refreshed

图例刷新后触发的事件。可在此添加或清除图例项

为了创建一个图例,应当与一个地图控件相绑定,并且绑定相应的图层,比如

<esriToolkit:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}"

LayerIDs="United States" />

  1. InfoWindow 控件

用户经常希望为地图增加一些交互式的操作,通过点击或者长按地图来获得更多的显示信息,当点击点击地图上的GraphicsLayer或者FeatureLauyer中的要素时,可以通过增加InfoWindow来实现一些信息提示的功能InfoWindow是一个带有小尾巴的窗口,小尾巴指向一个位置或感兴趣的要素。 InfoWindow 定义的主要属性如下表所述:

成员

说明

Anchor

获取或设置锚点。

CornerRadius

获取或设置四角的圆弧半径。

IsOpen

获取或设置一个值,指示 InfoWindow 是否打开。

Map

获取或设置 InfoWindow 关联的地图控件。

StrokeThickness

获取或设置线框的宽度。

在地图控件的MapGesture事件里获取触摸到的要素,然后弹出提示窗口。提示要素的属性信息,代码大致如下,

效果如下

  1. WebMap

    1. 概述

ArcGIS Runtime SDK for Windows Phone 中可以使用WebMap,WebMap 一般特指ArcGIS Online中制作的在线地图,通过ArcGIS Json对象来定义地图文件,如果你已经制作好了WebMap,你可以使用ArcGIS Online来进行分享给组织,同时可以共享给任何人或者是部分用户。WebMap一般组成如下

WebMap由底图和业务数据来数据,底图来提供空间的参考信息,业务数据包括特定的业务数据,通过制作WebMap能够让我们实现资源在线共享,我们可以在不同的平台上通过WebMap的Id即可使用WebMap,从而达到一致的用户体验。WebMap通常包含如下的功能,底图图层,业务数据图层,任务,要素集合以及弹出窗口。关于WebMap的制作请参阅ArcGIS帮助文档http://resources.arcgis.com/zh-CN/help/main/10.1/#/na/01w100000071000000/以及ArcGIS.com网站

BaseMap:底图是整个地图的参考,一般包括基本的信息,比如道路,建筑,地形,,BaseMap可以有多个图层来组成的,但是在Web中只能最为一个图层出现,BaseMap 图层只能用来显示的,但是不可以用来查询或者编辑。在ArcGIS Online中提供了多种地图服务或者影像服务来供我们作为底图的选择,当然如果我们有特别的需求需要自己提供底图,我们可以通过ArcGIS Server来发布地图服务或者影像服务来作为底图。

OperationLayer:业务数据是指能够与用户交互的的图层,包含了组织中的重要的要素比如当地政府的基础设施,网络,管道,当然你也可以使用ArcGIS Online中的数据作为业务数据,你仍然可以跟据自己的实际需求来扩展,业务数据中的要素可以用来编辑以及要素的查询,用来显示或者查询的数据可以来自地图服务,用来编辑的业务图层来自要素服务中,在一个webmap 中可以使用多个OperationLayer

Task:任务主要包含了对业务图层要素的属性查询以及空间查询。

要素集合(可编辑图层):要素可以在不使用地图服务的情况下直接添加到WebMap上并保存到上面,这些要素重要性是可以用来显示信息比如一些事件的发生,添加少量要素到地图上也是很简单的,如果不使用要素服务的话,可以使用可编辑的图层,来存储要素以及相关属性信息。

Popup:弹出窗口,当我们点击要素的时候弹出的提示信息,主要是包含了WebMap的作者想展示给用户关于要素的信息,可以在可编辑图层中定义,也可以是来自地图服务或者是要素服务的要素图层。

  1. 加载webmap

刚才已经介绍了,在应用程序中加载WebMap非常简单,因为我们制作WebMap分享的时候会有一个WebMap的Id,通过获得那个Id,使用SDK中相应的方法即可实现加载.这里我要加载的Web Map 的ID号为 6b9eba62c69c4eb9ac184fa4c22686dc。(在ArcGIS Online中查看webMap 时浏览器地址栏里最后一段数字即是web Map 的Id)

首先要引入 ESRI.ArcGIS.Client..Portal.dll这个程序集 (3.0之前的版本是ESRI.ArcGIS.Client.WebMap)。同时也要引入核心类库ESRI.ArcGIS.Client.dll

添加命名空间 Using ESRI.ArcGIS.Client.WebMap;

通过Document 这个类中的GetMapAsync 方法来加载WebMap,参数就是webMap 的UID

然后在完成事件里获得WebMap(实际上是一个Map 控件) 并且加载到我们的应用上面

效果如下,可以发现与ArcGISonline查看的效果是一致的

除了能够在ArcGIS Online中制作WebMap外,我们还可以使用Portal for ArcGIS,Portal是Esri发布一个新的产品,是ArcGIS 产品体系中的一部分,我们自己可以安装。而ArcGIS Online只有一个,其实Portal 功能类似于ArcGIS Online的功能,也可以简单的理解为时一个门户网站,比如这个网站http://gisday.arcgisonline.cn,界面以及功能与ArcGIS Online类似,我们可以创建WebMap,分享资源等等。关于更多信息请参阅其他文档

如果要加载Portal 中的WebMap 除了知道WebMap的ID之外,还要设置WebDocument中的ServerBaseUrl属性,告诉WebDocument,是从哪一个门户中来加在资源。默认情况下是从ArcGIS Online中加载的(ServerBaseUrl的默认地址为http://www.arcgis.com/sharing/content)如果Webmap位于其他Portal上比如在http://gisday.arcgisonline.cn上,我们需要设置WebDocument的Url为http://gisday.arcgisonline.cn/sharing/content。代码如下

下面加载http://gisday.arcgisonline.cn的Webmap ,ID号为f66a92d08959 421f9a 53c4d4e19e223f。

完成事件的代码与上面的是一样的。在制作WebMap的过程中我们配置了地图的弹出窗口信息,如果使用Web API来加载我们加载Webmap,也会把弹出窗口加载上的,但是在移动开发中,并没有把弹出窗口自动加载过来,如果要实现手指触摸要素弹出窗口信息的话,我们需要自己编写代码,使用前面介绍的Infowindow ,下面介绍一个加载webMap并且手指按住要素的时候弹出窗口的例子

在WebMap加载完成事件里编写代码添加Infowindow,并且为Map注册手势事件

void webMap_GetMapCompleted(object sender, GetMapCompletedEventArgs e)

{

ContentPanel.Children.Clear();

infowindow =new InfoWindow();

infowindow.Width = 300;

MyMap = e.Map;

infowindow.Map = MyMap;

ContentPanel.Children.Add(MyMap);

ContentPanel.Children.Add(infowindow);

e.Map.MapGesture += new EventHandler<Map.MapGestureEventArgs>(Map_MapGesture);

}

在手势事件里编写弹出提示框的代码,遍历有要素的图层,获得它们的弹出窗口信息,如下

void Map_MapGesture(object sender, Map.MapGestureEventArgs e)

{

infowindow.IsOpen = false;

foreach (Layer layer in MyMap.Layers)

{

if (layer is GraphicsLayer)

{

GraphicsLayer glayer = layer as GraphicsLay DataTemplate dt = layer.GetValue(Document.PopupTemplateProperty) as DataTemplate; if (dt != null)

{ IEnumerable<Graphic> selected = e.DirectlyOver(10, new GraphicsLayer[] { glayer });

foreach (Graphic g in selected)

{

infowindow.Anchor = e.MapPoint;

infowindow.ContentTemplate = dt;

infowindow.Content = g.Attributes;

infowindow.IsOpen = true;

break;

}

}

}

}

上面用到了GraphicsLayer以及Graphic两个类,在下面将有详细的介绍,上面的例子的弹出窗口的效果如下,

  1. GraphicsLayer &FeatureLayer

    1. GraphicsLayer

GraphicLayer 是一种客户端图层,用于在客户端展现各种数据,如绘制的图形,查询返回的结果等。GraphicLayer 中的数据以 Graphic 对象表示,Graphic 包含几何图形、属性信息和符号设置,设置图层中要素的渲染器。并且可以像其他界面元素一样响应用户的手势操作。

加载GraphicsLayer代码如下

  1. <esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40">
  2. <esri:Map.Layers>
  3. <esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
  4. Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer">
  5. </esri:ArcGISTiledMapServiceLayer>
  6. <esri:GraphicsLayer ID="MyGraphicsLayer"/ />
  7. </esri:Map.Layers>
  8. </esri:Map>

关于GraphicsLayer的属性如下

属性

说明

Clusterer

获取或设置应用到要素上的聚簇符号。

Graphics

获取或设置 Graphic 对象集合。

ProjectionService

获取或设置进行自动投影转换时需要的几何服务

IsHitTestVisible

获取或设置 GraphicLayer 包含的区域是否在点击测试时返回真实值。

Opercity

设置图层的透明度

FullExtent

获取或设置Graphics占的范围

Renderer

获取或设置用于生成符号的渲染器。如果指定了渲染器,则为

Graphic 设置的任何符号都将被忽略。

SelectedGraphics

选择的 Graphic 对象列表。

SelectionCount

选择集中的 Graphic 个数。

方法

说明

ClearGraphics

清除所有的 Graphic。

ClearSelction

清除选择的Graphic

FromGraphics

从 Graphic 对象集合创建 GraphicLayer。

Get/SetMapTipHideDelay

获取/设置鼠标离开 Graphic 后地图提示隐藏的延迟时间。

Get/SetMapTipHorizontalOffset

获取/设置 Graphic 关联的地图提示控件的水平偏秱量。

Get/SetMapTipVerticalOffset

获取/设置 Graphic 关联的地图提示控件的垂直偏秱量。

Refresh

强制重新绘制所有的 Graphic 要素。

事件

说明

MouseEnter/Leave

 

MouseLeftButtonDown/Up

 

MouseMove

 

MouseRightButtonDown/Up

 

从命名我们不难看出,GraphicLayer里面放的就是Graphic的集合了。GraphicsLayer.Graphics 是 GraphicCollection 对象,包含了 GraphicsLayer 中所有的数据。GraphicCollection 定义了如下表所示的属性、方法:

属性

说明

Count

获取集合中的元素个数。

Item

获取或设置指定索引的元素。

方法

说明

Add

向集合中添加 Graphic 对象。

Clear

清空集合中的所有元素。

Contains

判断给定的元素是否包含在集合中。

CopyTo

将集合中的所有元素拷贝到数组中。

IndexOf

获取给定元素在集合中的索引。

Insert

将 Graphic 对象揑入到集合中的指定位置。

Remove

从集合中删除除给定的 Graphic 对象。

RemoveAt

从集合中除指定索引处的元素。

通过 GraphicsLayer.Graphics.Clear()方法和 GraphicsLayer.ClearGraphics()方法均可清空 Graphic 对象集合。

当只添加了一个空GraphicsLayer图层之后什么效果也看不到,它只是Graphic容器,可以往里面添加Graphic,Graphic(ESRI.ArcGIS.Graphic)是GraphicsLayer中的基本元素,它包括了Geometry(在ESRI.ArcGIS.Geometry命名空间中),Symbol(在ESRI.ArcGIS.Symbol命名空间中),Attributes等属性。所有显示在地图中的矢量元素都有一个Geometry,里面包含了若干地理坐标,用于显示地图上地物的形状,它是Point,Polyline,Polygon等的总称,在这里代表了Graphic的形状。Symbol代表了Graphic的外观,它是一系列符号的总称,我们通常跟SimpleMarkerSymbol,SimpleLineSymbol和SimpleFillSymbol等打交道,它们分别对应了上面3种不同的Geometry(Point,Polyline,Polygon)。要让一个Graphic显示出来,总共分3步:

  1. 定义Graphic
  2. 设置Graphic的Geometry和Symbol属性
  3. 把定义好的Graphic添加到GraphicsLayer里

在code-behind中

Graphic g = new Graphic()

{

Geometry = new MapPoint(108, 30),//坐标

Symbol = new SimpleMarkerSymbol()

{

Color = new SolidColorBrush(Colors.Blue),

Size = 12,

Style = SimpleMarkerSymbol.SimpleMarkerStyle.Square

}

};

GraphicsLayer glayer = Map1.Layers["MyGraphicsLayer "] as GraphicsLayer;

glayer.Graphics.Add(g);

  1. Feturelayer

FeatureLayer(要素图层)继承自GraphicsLayer是一种特殊类型的 GraphicsLayer,可以显示 ArcGIS Server 地图服务图层中的要素,或者 ArcGIS Server 要素服务中的要素,或者将 MapIt 空间数据服务中的表格作为要素显示。像 GraphicsLayer 一样,FeatureLayer 可以包含和显示图形要素(由几何体和属性组成)。此外,FeatureLayer 还对以下方面提供支持:

  • 编辑—FeatureLayer 是能够在 Web 上编辑要素的关键。包含在 ArcGIS Toolkit 库中的编辑控件是专门为 FeatureLayer 设计的。只能在引用了要素服务的FeatureLayer 上执行编辑操作。
  • 定义表达式—你可能经常只需要使用满足一定属性条件的要素而忽略其他的要素。在这种情况下,你可以在 FeatureLayer 设置一个 Where 子句来获取你需要的要素。另外,ArcGIS Server 要素图层具有一个默认的定义表达式,这个定义表达式来自源地图文档的查询表达式。定义了定义表达式后,你将无法获取地图文档中不满足条件的其他要素。
  • 时间定义—你可以使用时间条件来过滤 FeatureLayer 中的要素。比如,你只想显示建于 1930 年以前的房子。如果你的住房图层是时态感知的,你可以定义一个时间条件只显示修建于 1930 年以前的房子。
  • 选择集—FeatureLayer 支持选择集,这些选择集代表了用户想要用于单独查看,编辑或分析目的的要素子集。用户可以使用空间或属性条件向选择集中添加或从选择集中删除要素。FeatureLayer 使得使用不同类型的符号来区别选择集非常容易。选择集可以用来进行统计计算,GP 工具和制图,以及交互式 GIS 分析和研究。例如,选择集允许用户在一系列建筑周围绘制一个多边形来计算这些建筑的太阳能潜力。选择集在某些编辑流程中也扮演了重要的角色,比如只将需要编辑的要素显示出来。你可以使用单独要素集的 Select()方法,也可以使用 Editor 的 Select 命令来生成选择集。注意,定义了选择表达式后,你将无法获取地图文档中不满足条件的其他要素。

下表中突出了 API 支持的 FeatureLayer 数据源:

数据源

描述

ArcGIS Server 地图服务

ArcGIS Server 动态地图服务可以包含多个图层,每个图层通过一个明确的 Url 来表示,这个 Url 包含的地图服务的名称,以及地图服务分配给图层的 id。。比如:

http://serverapps.esri.com/ArcGIS/rest/services/California/Map Server/8

California 地图服务包含了一个 id 为 8的图层。

ArcGIS Server 要素服务

ArcGIS Server 要素服务引用的单独的要素图层。每个图层通过一个明确的 Url 来表示,这个 Url 包含要素服务的名称,以及要素服务分配给图层的 id。比如:

http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Pet

roleum/KSFields/FeatureServer/0

这个个简单的服务表示了 Kansas 州的石油和天然气字段。 该要素服务包含了一个具有唯一 id 的要素图层。

ArcGIS Server 要素服务支持 Web 编辑。如果想要使用服务的源地图文档中的高级符号或要素模板,请使用要素服务。

SDS

使用Spatial Data Service 的 REST Web Service。他提供了访问数据库(如:SQL Server)中的表的途径。返些表可以是包含了几何形状信息的空间表。例如:

http://serverapps.esri.com/SDS/databases/Demo/dbo.USStates _Geographic.

该 Demo 数据库中包含了一个空间表 dbo.USStates_Geographic

MapIt 图层现在迓丌支持编辑和时态感知。

FeatureLayer 具有几个属性可以支持 GraphicsLayer 不具备的功能。下表列了FeatureLayer 中的重要成员:

成员

描述

Url

表示 ArcGIS Server 地图服务中的图层或宿主在 MapIt 空间数据服务中的表的地址(参见上表中的例子)。要素图层由数据源中的要素构成。

Where

查询定义了将要显示特定图层中的哪些要素。如果没有指定该属性,将可以获取所有要素("1=1")

GdbVersion

获取或设置数据库中的版本信息,只适用于要素服务中的图层

OutFields

返回的哪些属性字段

VisibleTimeExtent

获取或者设置哪些时间段内的要素是可见的

OnDemandCacheSize

当 Mode = OnDemand 时,该属性定义了存储在客户端缓存中当前地图范围以外的要素个数。当某个要素被获叏幵存储在缓存中,除非其被从缓存中删除,否则丌需要重新从服务器上获叏该要素。缓存丌能跨会话保留。

FeatureSymbol

该属性定义了在图层中渲染单个图形所引用的简单符号。

TimeExtent

该属性引用了要素图层中的时间点或范围。该属性由 ArcGIS Server 地图服务或 ArcGIS Server 要素服务定义,并且为只读属性。

Mode

定义了从服务中获叏要素的方式。

Snapshot(快照)模式下会在图层加载到地图以后立即获取图层中的所有要素。返种模式排除了从服务器获取任何信息的需要,但是当图层的要素过多时,会造成徆大的负担。在返种情况下,绘制大量的要素可能会导致浏览器崩溃,或者超过服务一次能够返回回的要素数量的限制(默认情冴下,ArcGIS Server 9.3.1 的限制为 500,ArcGIS Server 10/10.1 的限制为 1000,MapIt 的限制为 1000)。仅当数据集较小或处理时态数据时才使用

Snapshot 模式。 On Demand(按需)模式将会按需获取要素,返回回当前可视范围内的要素。On Demand 模式需要在服务器和客户端迕行多次通信,不适合显示时态动画数据。然而,这种模式保证你不会获取超过你的需求的要素。

Selection Only(选择集)模式在初始情况下不会获取任何要素。只有在生成了选择集的情冴下才会添加要素。这种模式在你不想将所有要素加载到客户端,而只想突出显示一个或某些要素时非常有用。多数情况下返种模式会和动态地图服务图层联合使用,用来显示某个位置上选择的要素。

SelectionColor

该属性定义了一种颜色或可视状态来显示要素图层中选择的要素图形。注

意每个图形要素都有一个 Selected 属性。而 SelectedGraphics 和 SelectionCount 属性(继承自 GraphicsLayer)将返回回所选图形的信息。

DisableClientCaching

默认情况下,要素图层会使用浏觅器缓存来提高性能。如果要素图层中的要素发生改变,幵且你想立即在客户端看到返些变化,请将该属性设置为 true。

Update()

该方法会重新查询要素图层中的数据。如果图层或表格在服务器端迕行了更新,通过调用该方法,可以立即在客户端看到返些变化。注意,这种情情况下你不能启用客户端缓存。

另外还包含一些与编辑相关的方法以及属性,这里不在说明

Graphic

上面已经说过了,GraphicsLayer和FeatureLayer 实际上是 Graphic 的集合,Graphic 其实可以理解为要素(Feature)在前端的展现,一个Graphic 主要有Geometry,Symbol,以及Attribute这几个属性。以及可以监听的手势事件,MouseEnter,MouseLeave,名字有点诡异,其实是对手势的监听,分别当手指触摸到要素以及触摸结束离开屏幕的时候发生。

关于Geometry 可以取点、线、面。如下

Geometry可以理解为只是Graphic的形状的描述,如果要展示这个形状需要给他瞄上颜色,或者用图片填充,这里就需要Symbol(符号)

Symbol是为几何对象设置的符号。对于不同的Geometry可以选择的符号也是不同的。对于点可以设置简单的符号(圆点,十字,以及正方形,三角形等等),图片符号,以及文本符号(使用文本符号来实现标注)。对于线可以Carto,SimpleLine两种符号,对于面除了用颜色填充之外还可以使用图片填充,同时还可以对面的边框赋予线的符号。它们的关系如下。关于种类型符号的具体属性,请参阅API参考。

我们还可以为符号设置一些动画,比如实现闪动的点的符号,以及"流动的线",等等。

Attributes是Graphic属性的集合信息,用键值对来表示的。

  1. 聚簇Clusterer

当我们要展示大量数据点数据的时候,可能会产生点之前的重叠,由此会影响到展示效果,使得要区分每个点非常困难。用一个符号渲染多个点为解决这个问题的提供了更美观,高效和实用的解决方案。这个过程也叫做聚集。一个集群识别了一个图层在给定聚类距离内的一组要素。聚集距离取决于地图显示的比例尺;因此在放大时,聚集在一起的点会越来越少;缩小时,会有越来越多的点聚集在一起。通过聚集可以解决大量点的展示效果。

聚集图形的方法有两种:

  • 使用 FlareCluster
  • 扩展 GraphicsClusterer 以创建一个自定义的聚集解决方案 每种方法都既可应用于 GraphicsLayer,也可应用于 FeatureLayer。

3.5.3.1 使用 FlareClusterer 通过如下 XAML 可以将 FlareClusterer 添加到 GraphicsLayer 或 FeatureLayer:

<esri:GraphicsLayer ID="MyGraphicsLayer">

<esri:GraphicsLayer.Clusterer>

<esri:FlareClusterer />

</esri:GraphicsLayer.Clusterer>

</esri:GraphicsLayer>

形成一个聚集的多组点既可以用 Flare(可散开的聚集符号),又可以用大的聚集符号渲染。默认的 FlareClusterer 聚集符号由一个白色边框的红色圆以及代表了聚集位置的点数字组成。这些符号也具有动画效果。当鼠标移动到地图上的要素上时,符号会将每个点显示为一个附加到聚集上红色圆。 默认的大聚集符号使用的符号呈现红色和黄色之间的渐变色,聚集所代表的要素个数绘制在符号的顶部。大聚集符号没有交互式效果。 FlareClusterer 的

MaximumFlareCount 属性决定了 Flare 符号和大聚集符号什么时间显示。

你可以在 XAML 中使用如下属性修改 FlareClusterer;下面列出了默认值:

属性

描述

FlareBackground

Flare 符号的背景颜色(填充色),默认为红色

FlareForeground

Flare 符号文本或边框的颜色,默认为白色

MaximumFlareCount

Flare 符号所代表的要素的最大个数,如果要素的数量大于该值,将使用大聚集符号来渲染返些要素,大聚集符号显示了其代表的要素数量。符号的大小会随着其代表的要素的数量迕行缩放,其颜色定位渐变色(参见下面的 Gradient 属性),默认值为 10。

Radius

表示聚集的半径,在该聚集内的要素都将被聚合在一起。以像素为单位

定义,默认值为 20

Gradient

大聚集符号使用的 LinearGradientBrush 渲染。

Default = LinearGradientBrush;

MappingMode = RelativeToBoundingBox;

GradientStop1: Offset = 0, Argb = 127,255,255,0,

GradientStop2: Offset = 1, Argb = 127,255,0,0。

下面的代码示例描述了如何在 XAML 中修改 FlareClusterer。结果或生成黄色背景色以及灰色边框和文本的 flare 符号,或者蓝色渐变色的大聚类符号。Flare 符号最多表示 15 个像素范围内的 5 个要素。绿色圆代表了单一的图形要素。

图 3-28 FlareClusterer 效果

<Grid x:Name="LayoutRoot" Background="White">

<Grid.Resources>

<LinearGradientBrush x:Name="BlueGradient" MappingMode="RelativeToBoundingBox" >

<GradientStop Color="#990011FF" Offset="0"/>

<GradientStop Color="#990055FF" Offset="0.25"/> <GradientStop Color="#990099FF" Offset="0.5"/>

<GradientStop Color="#9900CCFF" Offset="0.75"/>

<GradientStop Color="#9900FFFF" Offset="1"/>

</LinearGradientBrush>

</Grid.Resources>

<esri:Map x:Name="MyMap">

<esri:Map.Layers>

<esri:GraphicsLayer ID="MyGraphicsLayer">

<esri:GraphicsLayer.Clusterer>

<esri:FlareClusterer FlareBackground="Yellow"

FlareForeground="#99000000"

MaximumFlareCount="5" Radius="15"

Gradient="{StaticResource BlueGradient}"/>

</esri:GraphicsLayer.Clusterer>

</esri:GraphicsLayer>

</esri:Map.Layers>

</esri:Map>

</Grid>

3.5.3.2 扩展 GraphicsClusterer

要定制聚集的外观、交互式效果和行为,需要创建一个自定义类,从ESRI.ArcGIS.Client.GraphicsClusterer 派生并重写 OnCreateGraphic()以返回一个聚集图形。聚集的要素通过 OnCreateGraphic 方法传递到图形集合中。通过集合和图形要素决定如何创建聚集图形的符号。该 FlareClusterer 返回一个 flare 符号或者一个大聚类符号。下面的示例代码为任何多与一个要素的图形集合生成一个简单的符号。聚集符号的大小和颜色被计算出来,并在 GraphicsLayer 或 FeatureLayer 上应用的自定义聚集将汇集属性列值。值得总数将显示聚集符号上。为了简便起见,下面只提供了自定义聚集类的源代码。

public class SumClusterer : GraphicsClusterer

{

public SumClusterer()

{

MinimumColor = Colors.Red;

MaximumColor = Colors.Yellow; SymbolScale = 1; base.Radius = 50;

}

public string AggregateColumn

{ get;set; }

public double SymbolScale

{ get; set; }

public Color MinimumColor { get;set; }

public Color MaximumColor { get;set; }

protected override Graphic OnCreateGraphic ( GraphicCollection cluster, MapPoint point, int maxClusterCount)

{

if (cluster.Count == 1) return cluster[0];

Graphic graphic =null; double sum=0;

foreach (Graphic g in cluster)

{

if (g.Attributes.ContainsKey(AggregateColumn))

{

Sum+=Convert.ToDouble(g.Attributes[AggregateColumn ]); } }

double size = (sum + 450) / 30;

size = (Math.Log(sum * SymbolScale / 10) * 10 + 20); if (size < 12) size = 12;

graphic = new Graphic()

{ Symbol = new ClusterSymbol()

{ Size = size },

Geometry = point };

graphic.Attributes.Add("Count", sum); graphic.Attributes.Add("Size", size); graphic.Attributes.Add("Color", InterpolateColor(size - 12,

100));

return graphic;

}

private static Brush InterpolateColor(double value, double max)

{

value = (int)Math.Round(value * 255.0 / max); if (value > 255) value = 255;

else if (value < 0) value = 0;

return new SolidColorBrush(Color.FromArgb(127, 255, (byte) value, 0));

}

}

  1. 绘制图形

除了可以用代码添加Graphic之外,我们还可以自己绘制,这里需要使用Draw这个类。可以在Map 上绘制点、线、面或者是任意手绘模式。绘制结束之后获得绘制的几何对象,然后添构造Graphic ,添加到GraphicsLayer上面。关于Draw的具体属性如下

属性名称

描述

DrawMode

绘制的类型可选点、线、面,三角形矩形,圆,箭头,椭圆,任意手绘

FillSymbol

绘制面的符号

IsEnable

是否可用,默认为False

LineSymbol

绘制时的线的符号

Map

所要绘制的地图

AddVertex

添加节点的方法

CompleteDraw

完成绘制

UndoLastVertex

撤销上一次节点的添加

DrawBegin

开始绘制的事件

DrawComplete

绘制结束的事件

VertexAdded

节点添加的事件

在绘制结束之后绘制的结果并不会添加到地图中,我们可以获得绘制的Geometry ,重新构造一个新的Graphic,添加到自定义的GraphicsLayer当中。关于Draw具体的使用步骤如下:

设置绘制过程中的符号(比如面的颜色等)

设置所绘制的地图

开始绘制

绘制结束之后获得绘制的Geometry

代码如下

XAML :首先添加添加Client.dll引用

xmlns:esri="clr-namespace:ESRI.ArcGIS.Client;assembly=ESRI.ArcGIS.Client"

xmlns:esriSymbols="clr-namespace:ESRI.ArcGIS.Client.Symbols;assembly=ESRI.ArcGIS.Client"

定义两个符号资源

  1. <Grid.Resources>
  2. <esriSymbols:SimpleFillSymbol x:Key="RedFillSymbol" Fill="#66FF0000" BorderBrush="Red" BorderThickness="2" />
  3. <esriSymbols:SimpleFillSymbol x:Key="BlueFillSymbol" Fill="#660000FF" BorderBrush="Blue" BorderThickness="2" />
  4. </Grid.Resources>

添加地图控件,并加入底图和一个GraphicsLayer ,我们绘制结束之后要把图形添加到这个GraphicsLayer 里面

  1. <esri:Map x:Name="MyMap" Extent="-120, 20, -100, 40">
  2. <esri:Map.Layers>
  3. <esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer"
  4. Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer">
  5. </esri:ArcGISTiledMapServiceLayer>
  6. <esri:GraphicsLayer ID="MyGraphicsLayer"/>
  7. </esri:Map.Layers>
  8. </esri:Map>

C# 代码 添加using命名空间引用

using ESRI.ArcGIS.Client;

using ESRI.ArcGIS.Client.Symbols;

在构造函数里初始化Draw 设置绘制模式为面,并设置面的符号,设置IsEnable属性为true允许启用绘制工具。

Draw MyDrawObject = new Draw(MyMap) {

FillSymbol = LayoutRoot.Resources["RedFillSymbol"] as FillSymbol

};

MyDrawObject.DrawComplete += MyDrawObject_DrawComplete;

MyDrawObject.DrawMode = DrawMode.Polygon;

MyDrawObject.IsEnabled = true;

在绘制完成事件里实现把绘制的结果添加到Map的Graphicslayer里面

private void MyDrawObject_DrawComplete(object sender, ESRI.ArcGIS.Client.DrawEventArgs args)

{

Graphic graphic = new Graphic() {

Geometry = args.Geometry,

Symbol = LayoutRoot.Resources["BlueFillSymbol"] as FillSymbol

};

GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;

graphicsLayer.Graphics.Add(graphic); }

  1. 符号和渲染器

上面已经介绍了,我们可以为Graphic的Geometry属性来设置不同的符号。通过符号我们可以设置Graphic的外观样式,比如颜色,边框,透明度等等,ArcGIS Runtime SKD for WindowsPhone包含了各种的符号的类,每一种类都可以指定特定符号。每一种符号也是适用于特定几何类型。

不同的几何类型可以设置的符号如下,关于具体每个符号的属性请查询API

符号

Geometry类型

描述

SimpleMarkerSymbol

Point

为一个点设置简单的形状

PictureMarkerSymbol

Point

为一个点设置图片符号

SimpleLineSymbol

PolyLine

根据预定义的样式为线设置简单的符号,

CartographicLineSymbol

Polyline

根据自定义的样式设置线的符号

SimpleFillSymbol

Polygon

用Silverlight画刷来填充

PictureFillSymbol

Polyline

用图片来填充面装图形

符号定义也有两种方式:通过XAML和code-behind,上面的添加一个Graphic到图层中的列子中已经介绍了使用XAML 在资源中定义了两个面妆符号。下面的是使用代码为面装的要素设置符号

SimpleFillSymbol fillSymbol = new SimpleFillSymbol()

{

BorderBrush = new SolidColorBrush(Color.FromArgb(0, 255, 0, 0)),

BorderThickness = 2,

Fill = new SolidColorBrush(Color.FromArgb(alphaVal, redVal, greenVal, blueVal))

};

GraphicsLayer graphicsLayer = MyMap.Layers["MyGraphicsLayer"] as GraphicsLayer;

foreach (Graphic graphic in graphicsLayer.Graphics)

graphic.Symbol = fillSymbol;

Render(渲染器)为GrahcsLayer定义了一个或者多个符号,可以根据图层中的Graphic的字段信息来对 每一个graphic进行符号渲染,可以设置简单渲染、分级渲染,唯一值渲染。上面为GraphicsLayer的每个Graphic设置了符号,首先是定义一个符号,然后是遍历每一个要素,为每一个要素的符号重新赋值,似乎有些麻烦,不过我们可以为Graphicslayer设置简单渲染器来解决。即每个要素有相同的符号。唯一值渲染是你可以根据Graphic的某一属性来设置不同的符号。符号化渲染对象结构如下图所示

对象

说明

SimpleRenderer

是最简单的符号化渲染,对所有要素使用同样的符号。SimpleRenderer 类仅包含一个 Symbol 属性,用于定义渲染的符号。

ClassBreakRenderer

分级符号化渲染,根据某个属性将要素分为若干级别。

ClassBreakInfo

分级符号化渲染参数。

UniqueValueRenderer

唯一值符号化渲染,根据某个属性值的不同分别渲染。

UniqueValueInfo

唯一值符号化渲染参数。

关于符号渲染请参阅

http://resources.arcgis.com/en/help/silverlight-api/concepts/index.html#/Symbols_and_renderers/01660000000w000000/

  1. Task 任务

通常情况下,GIS应用程序需要提供一些空间的查询以及分析的操作,而不只是简单的地图的展示,我们需要一些任务来帮助我们调用ArcGIS Server查询功能,GP服务调用,以及完成网络分析的功能,我们可以通过这些Task来完成与ArcGIS Server交互,并且把最终结果返回到客户端。主要包括以下几类任务

Task 对象说明如下表(其中查询检索相关的是:FindTask、IdentifyTask、QueryTask、ImageServiceIdentifyTask):

任务

说明

TaskBase

所有任务的基类。

FindTask

在动态地图服务所有图层中基于文本模糊查找。

IdentifyTask

点击要素,识别要素属性。

QueryTask

对地图服务中的某个图层,进行行属性条件和空间范围查询。

ImageServiceIdentifyTask

点击影像数据,识别影像属性。

GeometryService

提供几何运算操作,如:缓冲区计算、距离/长度/面积计算、自劢闭合、凸多边形、裁剪、加密、求差、概化、相交、偏移、重塑图形、截断/延伸、组合等。

RouteTask

提供路径分析、临近设施分析、服务区域分析等功能。

Locator

提供地址定位功能。

Geoprocessor

提供调用地理处理服务(ArcGIS Serverr发布的GP Service)的功能。

其中 TaskBase 是所有 Task 的基类,定义了所有 Task 都具备的特性:

成员

说明

DisableClientCaching

是否禁用客户端缓存。如果为 true,则将为每个请求添加时间戳

("_ts")以防止从浏觅器缓存中加载请求的内容。

IsBusy

判断手否有 Web 请求正在处理。

ProxyURL

获取或设置代理 URL。

Token

用于访问启用了安全性的 ArcGIS Task 的令牌。

Url

获取或设置任务的 URL。

CancelAsync()

取消一个正在执行的异步操作。

Failed

当任务执行失败时触发的事件。

使用 Task 通常包括三个步骤:

1)    实例化 Task 对象,注册 Task 完成、失败的监听事件;

2)    实例化 Task 参数对象,为必要属性赋值,发送请求;

3)    在 Task 完成事件处理函数中处理返回结果或在 Task 失败事件处理函数中处理错误信息。由于与ArcGIS API for Silverlight 开发完全一致,这里不在针对具体的进行解释。

  1. Location Service&GpsLayer

我们都知道现在的只能手机基本都有定位功能,只要获得用户的允许我们就可以获得用户所在的当前位置当然Windows Phone也不例外,关于获得位置,微软已经将这些内容封装为位置服务了,在Windows Phone可以使用GeoCoordinateWatcher 来调用,可以启用或者停止位置服务,获得设备的位置,以及该设备位置的变化情况。在ArcGIS Runtime SDk for Windows Phone的应用程序中,有两种方式来处理设备的位置。

第一种 就是使用微软的GeoCoordinateWatcher

第二种使用 ArcGIS Runtime SDK for Windows Phone提供的GpsLayer这个类来处理。

关于GeoCoordinateWatcher如何使用请查询MSDN文档,这里主要介绍第二种情况,GpsLayer位于ESRI.ArcGIS.Client.Toolkit.DataSources 程序集里面,并且继承与GraphicsLayer。所以我们也应当添加ESRI.ArcGIS.Client.dll ,在地图上显示设备当前的位置,同样可以使用XAML以及codeBehind代码来使用具体步骤如下。

首先添加上面介绍的两个dll,在 XAML里添加两个命名空间的引用

xmlns:esri="clr-namespace:ESRI.ArcGIS.Client;assembly=ESRI.ArcGIS.Client"

xmlns:esriDS="clr-namespace:ESRI.ArcGIS.Client.Toolkit.DataSources;assembly=ESRI.ArcGIS.Client.Toolkit.DataSources.

添加地图控件并加入GpsLayer

<esri:Map x:Name="MyMap">

<esri:Map.Layers>

<esri:ArcGISTiledMapServiceLayer ID="StreetMapLayer" Url="http://server.arcgisonline.com/ArcGIS/rest/services/ESRI_StreetMap_World_2D/MapServer">

</esri:ArcGISTiledMapServiceLayer>

<esriDS:GpsLayer x:Name="myGpsLayer" />

</esri:Map.Layers>

</esri:Map>

如果Map中的地图的坐标系不是WGS84或者WebMecator的话,我们还需要为GpsLayer 进行坐标系的转换。于是这里就需要为Gpslayer设置一个几何服务的地址。即GpsLayer的 GeometryServiceUrl属性

<esriDS:GpsLayer x:Name="myGpsLayer" GeometryServiceUrl="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Geometry/GeometryServer" />

关于位置有关的程序需要在真机下调试方可获得正确的地理位置,不过在模拟器中可以通过模拟位置来使用的。点击模拟器右上角的

打开右侧的窗口,找到位置选项卡,可以用鼠标点击地图来模拟当前的位置。效果如下,一次点几个点还会模拟设备的移动情况

如果你不想使用Gpslayer 来显示位置的话,也可以使用GraphicsLayer从后台中获得当前的位置,然后构造一个Point类型的Graphic 并设置点的符号, 添加到GraphicsLayer中,这里需要事先定义GeoCoordinateWatcher,并注册位置变化事件。在位置变化事件里不断的获得位置

<esri:GraphicsLayer ID="MyGraphicsLayer">

<esri:GraphicsLayer.Graphics>

<esri:Graphic Symbol="{StaticResource RedMarkerSymbol}">

<esriGeometry:MapPoint X="NaN" Y="NaN" />

</esri:Graphic>

</esri:GraphicsLayer.Graphics>

</esri:GraphicsLayer>

GeoCoordinateWatcher只能获得WGS 84坐标系下的经纬度,我们可以根据底图的参考系来进行转换,如果底图本来就是WGS84坐标系的话,就不需要转换了,如果是webmercator空间坐标系的话,可以使用WebMercator来完成地理坐标与空间坐标的转换,如果是其他的坐标系的话,应当使用几何服务。

void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)

{

ESRI.ArcGIS.Client.Projection.WebMercator mercator = new ESRI.ArcGIS.Client.Projection.WebMercator();

_graphicLocation.Geometry = mercator.FromGeographic(new MapPoint(e.Position.Location.Longitude, e.Position.Location.Latitude));

}

转载于:https://www.cnblogs.com/dubaokun/archive/2012/12/16/2820939.html

ArcGIS Runtime SDK for Windows Phone 入门教程相关推荐

  1. ArcGIS Runtime SDK for .NET开发实例教程 之 ArcGIS Runtime开发环境搭建

    随着ArcGIS Engine不再进行更新,ArcGIS Runtime得到了Esri公司的推崇,ArcGIS Runtime版本发布到100.4已经有了很大的内容完善和改进,接下来针对ArcGIS ...

  2. element 点击控制expend的显示隐藏_四、ArcGIS Runtime SDK for iOS 100.X教程系列之图层控制显示隐藏...

    一个图层服务上多个图层时,结合服务的链接地址访问查看详细信息进行代码编写会更方便,形如以下这个arcgis服务: http://arcgis.wuhanrt.cn:6080/arcgis/rest/s ...

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

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

  4. arcgis for android sdk下载地址,Arcgis Runtime sdk for android 授权

    要下载和安装 ArcGISRuntime SDK for Android,您需要注册开发者账户,进而便拥有了访问所有功能的权限,从而实现开发和测试目的.但是,这种情况下,应用程序中的所有地图都具有水印 ...

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

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

  6. 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析...

    1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...

  7. 《ArcGIS Runtime SDK for .Net开发笔记》--介绍与环境搭建

    一. ArcGIS Runtime SDK for .NET介绍 ArcGIS Runtime SDK for .net是一款针对windows平台的开发包.能够在开发出在windows phone, ...

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

    1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...

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

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

最新文章

  1. 用git发patch
  2. Java动物类enjoy方法打印,面向对象编程题汇总
  3. NAB 2019见闻:CAE视频编码与QoE
  4. 聊聊 computed 影响性能的场景
  5. 使用DOM4J解析XML时非法字符Exception
  6. (Docker实战) 第三篇:配置_开发环境
  7. 95-120-042-源码-Cluster-SessionClusterEntrypoint
  8. Linux系统下如何配置SSH?如何开启SSH?
  9. 如何判断一个进程已经完成初始化?
  10. Android Studio系列教程四--Gradle基础
  11. greensock 框架
  12. 数据结构算法基础定义
  13. 来给罗永浩和王自如打个分(上)
  14. 实用工具---python环境安装注意事项
  15. Oracle 12cR1 RAC 在VMware Workstation上安装(上)—OS环境配置
  16. C++ 之 for 循环 | C++11 for 循环 | 内存 Destory 示例
  17. 处理Whitelabel Error Page
  18. UBuntu 下载安装
  19. 2020年全球权威机器人评选RBR50放榜:中国仅一家公司入选,大疆落榜
  20. 在 MaCA 根目录运行所有 py 文件

热门文章

  1. 最长回文子串问题求解
  2. Leetcode 面试题 08.01. 三步问题
  3. SCO UNIX 讲座
  4. 网络编程——UDP协议的实践(词典翻译服务器(英译汉))
  5. 在Abaqus中使用f90格式的子程序
  6. 警告 [http-nio-8080-exec-4] org.springframework.web.servlet.DispatcherServlet
  7. linux 输入8个字母进行排序,Linux下使用sort进行排序
  8. NETDMIS5.0自动测量球2023
  9. 外贸英语900句之 品质Quality
  10. 计算机课程MOOC,高校计算机基础课程MOOC教学模式的探索