ArcGIS Runtime SDK for Android

ArcGIS Runtime SDK for Android可以把ArcGIS的强大功能添加到您的安卓应用中。这个API支持了使用安卓2.2及以上版本操作系统的手机及平板电脑上所开发的应用。这个SDK包括:

  • 一个包含了全部SDK的Eclipse插件
  • 一个提供了安卓特定视图和类的Java API,可以用来加入ArcGIS的功能。该模式与其他ArcGIS web和智能手机的 API非常相似,这样可以充分发挥您现有掌握的技能。
  • 丰富的示例来帮助您掌握如何使用API来实现简单和复杂的工作流。
  • 提供类到方法级的文档。
  • 提供概念性的文档来解释如何使用这些示例,以及更多关于如何高效使用此API的详细介绍。

ArcGIS功能

使用这个SDK可以创建能够与ArcGIS Online和ArcGIS Server相连接的应用程序,也可以添加本地缓存的底图到您的地图应用上!使用此SDK您还可以完成下面的操作:

  • 从ArcGIS Online, ArcGIS Portal或者ArcGIS Server上添加和绘制地图。
  • 把本地设备上存储的底图添加到您的地图中。
  • 使用一个集成了ArcGIS强大功能的插件集来帮助您进行地图分析,并为您的用户提供详细信息。
  • 增加工具包,使用户可以编辑数据。
  • 与GPS设备结合工作。
  • 地图中的要素辨识以及在ArcGIS online中创作的丰富的弹出式窗口。
  • 使用一个集成的Eclipse插件使得添加ArcGIS到安卓项目中更加快捷简单。
  • 在地图顶部添加图象。
  • 在本地执行高级几何操作。

通过API您可以做什么?

使用API您可以:

  • 显示和使用ArcGIS Online和您的ArcGIS Server上的聚合服务地图。
  • 显示www.ArcGIS.com或ArcGIS portals上的地图。
  • 执行复杂的GP任务并显示处理结果。
  • 使用空间或SQL标准来搜索,查询和辨识要素。
  • 显示弹出式窗口要素的详细信息。
  • 通过地图绘制或使用GPS感应设备来进行位置采集。
  • 通过地址匹配来进行定位,反之亦然。
  • 执行几何运算并计算几何之间的关系。

API都包括什么?

API提供了以下资源使您可以用于安卓应用程序:

  • 地图和图层 – API支持动态地图和瓦片地图的显示。通过ArcGIS Runtime SDK for Android,您可以在所有支持此API的移动工程里显示地图。
  • 图形 - 您可以允许用户绘制,或当用户在图形要素上单击时弹出信息窗口,以此来提升您的应用程序的体验。
  • 任务 – 常用的GIS任务如要素的查询,搜索和辨识,地址查找,GP工具和采集等。

开始学习

安装

准备开发环境

在使用ArcGIS Runtime SDK for Android开发前,请确认您的计算机具备如下系统环境:

  • Java Development Platfrom JDK.
  • Eclipse IDE 3.6.2+ (Helios).
  • Google Android SDK 2.2 (API 8)或更高版本.
  • Google ADT plugin for Eclipse.
  • Android powered phone, 2.2或更高版本.

安装ArcGIS Runtime SDK for Android的Eclipse插件

ArcGIS Runtime SDK for Android是一个为Eclipse设计的自定义插件,可以为您提供稳定的集成环境用来创建基于安卓的ArcGIS应用程序。

  • 从站点下载ArcGIS Runtime SDK for Android
  • 打开Eclipse,然后选择Help > Install New Software
  • 点击屏幕右上角的Add按钮。
  • 在出现的”Add Repository”的对话框中,输入“ArcGIS 4 Android Plugin”,点击按钮,会显示之前已经下载过的插件列表。
  • 点击OK。
  • 在” Available Software”的对话框中,打开'ArcGIS for Android'目录来查看可用的选项。如果'Group items by category'没有勾选,那么你会看到所有可用的选项列表。
  • 选中‘ArcGIS for Android Core’旁边的复选框,点击“下一步”。另外,选中'ArcGIS for Android Doc and Samples'旁边的复选框,这样将同时安装安卓的示例和开发帮助系统。
  • 在下一个窗口中,你会看到一个工具下载的列表,点击下一步。
  • 阅读并接受许可声明,然后点击完成。
  • 当安装完成之后,重启Eclipse.

下一步

当ArcGIS Runtime SDK for Android成功安装之后,您就可以准备开发ArcGIS应用程序了。下面开始学习之旅吧:

  • 通过“Hello World”程序来开始学习。
  • 学习关于ArcGIS的知识。
  • 探索SDK的整体特性。

Hello World地图应用程序

下面的内容将指导您如何创建一个基于SDK插件的’Hello World’地图应用程序,下面的介绍和说明可以作为一个示例。这篇主题的目的是帮助开发者理解在IDE中使用ArcGIS for Android插件创建一个地图应用的基本流程,与此同时做为基础原则来引导进行接下来的工程搭建工作。该主题将专注于怎么样使用初始范围来添加一个地图到应用程序中,并且如何做到最佳的位置定位。

前提

现在的工作流程认为您已经具备了合适的系统开发环境,已经安装了ArcGIS for Android SDK插件,并且已经打开Eclipse。这篇主题同时认为您对安卓平台有基本的了解。在这篇主题中将使用到一些安卓平台的专用术语,对于那些不是很熟悉安卓开发的人群来说,谷歌已经提供了相应的说明文档。如果您对一些术语不是很熟悉,那么强烈建议您按照提供的链接学习和了解这些在移动开发中使用的语言。

创建一个新的ArcGIS Project for Android工程

当具备了开发环境之后,就可以在Eclipse中创建一个新的ArcGIS Project for Android工程了。

步骤:

  • 在Eclipse中,选择File > New > Project
  • 选择“ArcGIS Project for Android”然后点击Next。

  • 填写工程名称并点击Next。

  • 4. In the Application info window enter a valid Package Name and click Finish。

您已经成功创建了一个新的ArcGIS project for Android工程。接下来,您将把一个地图服务添加到这个应用程序中,并为地图设置一个初始范围。

添加一个地图并设置初始范围

现在您已经创建了一个ArcGIS project for Android工程,下一步是要添加一个地图到这个应用程序中。您要添加到这个特殊的应用程序中的地图是来自ArcGIS.com上的一个可用的世界范围街区地图的服务,但是,地图初始化时是不能显示出整个世界的街区的。对于这样一个应用,初始化时显示一块具体范围要比显示整个范围更加合理-在这个例子中,显示的不是整个世界范围,而是美国南加州的一块具体范围。接下来的介绍将指引您如何为这个应用程序添加地图并指定初始范围:

步骤:

  • 在Eclipse的Package Explorer视图中展开新创建的HelloWorld项目,我们将修改两个源文件。
    • HelloWorld/src/com.esri.android.samples/HelloWorldActivity.java
    • HelloWorld/res/layout/main.xml
  • 双击文件名打开HelloWorld/res/layout/main.xml文件。这时是按默认的图形布局的方式打开这个XML文件,选择左下角的文本视图,这样打开的就是XML的原始文字内容。

    默认情况下,在main.xml中有两个选项卡。首先是安卓的线式布局,这个指定了它的子视图是以单行或单列的形式来展现的。如果要进一步了解这个布局,可以参考谷歌提供的线式布局文档。线性布局只是一种安卓的视图类型,它的作用是组织和排列添加到它上面的各个子视图,所以它也可以被看做是父视图。关于安卓视图的详细解释可以参考用户接口文档。第二个是TextView标签,在这个例子中被认为是一个子视图。这个标签用于添加文本到应用程序中,如果你参考着Android的Hello World教程,那么这个目前这个工程就可以认为是您编写的基于Android的第一个应用程序。

  • 从文件中移除<TextView>元素和它的全部属性。
  • 添加一个MapView XML的布局视图和它的初始范围:在移除<TextView> 元素的位置添加如下的代码片断。
  • 保存main.xml。
  • 双击文件名打开HelloWorld/src/com.esri.android.samples/HelloWorldActivity.java文件,这样将在JAVA编辑器中打开源文件,添加这些代码到HelloWorldActivity类中:
  • 保存HelloWorldActivity.java文件。

您的应用程序现在已经可以发布了,在发布之前让我们先看一些关于“自动化新项目创建向导”的特性:

每个安卓的应用程序都必须有一个AndroidManifest.xml(位于Eclipse中安卓工程的根目录下)做为APK文件的一部分,该文件用于向安卓设备分发和安装各个应用程序,它的另外一个重要作用是声明您的应用程序必须在哪一台设备上执行。自动化新项目创建向导还把另外三个特殊的权限加入到mainifest文件中。下面是对每个权限的详细说明:

  • android.permission.INTERNET: 这个允许应用程序打开网络套接字,这是很重要的,因为ArcGIS API for Android只能在网络连通的模式下运行,这意味着它必须通过网络连接才能与ArcGIS Server进行通信。
  • android.permission.WRITE_EXTERNAL_STORAGE: 这个权限可以让应用程序把数据写到外部存储介质,如SD卡。为了优化使用了ArcGIS API的应用程序的性能,这个授权是非常重要的。
  • android.permission.ACCESS_FINE_LOCATION: 这个权限使应用程序可以从一个设备去访问GPS信息。在编程模式下,它可以使您与ArcGIS API中的LocationService类进行通信和交互,这个类还支持在MapView上显示当前位置。但是,设置这个权限的主要原因是由于ArcGIS API中的LocationService类和Android SDK中的Location Manager类的高耦合性,LocationManager提供了访问设备位置的服务,并且可以使ArcGIS API获取并在地图上显示定期更新的地理位置。在默认情况下,Esri提供的插件认为这个功能是必要的并默认包含了进来。如果应用程序中不需要地理定位,可以从mainifest文件中移除这个权限。要做到这一点,可以手工编辑AndroidManifest.xml文件或使用Eclipse中的ADT插件然后单击manifest文件的权限选项卡。

ArcGIS for Android API使用OpenGL ES子集规范来为嵌入式系统设计高性能的图形。我们在<uses-feature>中声明这个硬件特性。

  • android:glEsVersion="0x00020000": 如果要指明是OpenGL ES2.0版本,我们要把值设置为“0x00020000”。ArcGIS for Android API支持安卓2.2及更高版本。为了在应用程序中进行区分,我们在manifest文件中引入了<uses-sdk>声明.
  • minSdkVersion="8": 这里指明我们的应用程序采用安卓2.2平台,API级别为8级。如果系统的API级别低于指定的值,安卓系统将阻止用户安装这个使用ArcGIS for Android API创建的应用程序。

现在您已经完成了一个基于安卓平台搭建的ArcGIS项目的关键步骤,包括添加地图和设置初始范围。为了更深入地了解用户界面(UI)设计,可以查看布局声明等等的介绍。接下来,您将学习如何把这个应用程序部署到设备上。

执行应用程序

在Eclipse中运行应用程序是非常容易的

步骤:

  • 在Project Explorer面板中,在“HelloWorld”项目上单击右键,选择'Run As > Android Application'。此时确保有一个安卓设备已经连接到电脑上,因为现在不支持在模拟器中运行。
  • 在设备上打开应用程序后,双击地图可以实现放大。
    • Eclipse插件会自动创建一个新运行配置并发布ArcGIS for Android的应用程序到设备上。现在会看到下面的效果:

SDK 的Eclipse工具

集成要素

开发ArcGIS for Android的应用程序是很简单的,它可以通过由SDK,ArcGIS for Android Core 和ArcGIS for Android Doc 和其他的示例提供的一组Eclipse插件来完成。ArcGIS for Android的Eclipse插件提供了丰富的工具包,文档和示例来帮助开发者轻松创建基于ArcGIS API for Android开发的应用程序。

基于安卓的ArcGIS项目

当你在Eclipse中创建了一个新工程时,ArcGIS for Android SDK插件会提供一个新的工程类型。在Eclipse中通过下面的方式来使用这个新的工程类型:

    • 从Eclipse的File菜单中,选择New ,然后点击Project。
    • 在New Project对话框中,展开ArcGIS for Android目录。
    • 选择ArcGIS Project for Android选项,然后点击Next。

    • 在Create ArcGIS for Android Project对话框中,输入项目名称,然后点击Next。
    • 在对话框中输入项目名称,然后点击Finish。这个工程是使用ArcGIS API for Android开发的,所以它需要引用全部的组件。 例如,引用库容器。如果在工程中展开这个容器,你会看到以下需要的JAR文件:

    • ArcGIS_Android.jar:这个jar文件代表ArcGIS API for Android包。
    • jackson-core-lgpl-1.9.5.jar and jackson-mapper-lgpl-1.9.5.jar: 这些jar文件代表用来做JSON解析的框架所使用的工具集。

转换ArcGIS Android工程

除了创建ArcGIS Projects for Android工程,还可以通过一个简单的右键菜单工具把现有的安卓工程转换为ArcGIS for Android 工程。

工具的上下文菜单

Eclipse提供了一种功能,通过这个可以把子菜单添加到一个允许把ArcGIS Runtime SDK for Android和现有安卓工程相集成的导航视图的上下文菜单中来。选择工程的根目录,并单击右键,这时就可以看到上下文菜单,如果是一个安卓工程还可以看到ArcGIS的工具集列表。

  • 右键单击安卓工程,选择ArcGIS Tools > Convert to ArcGIS Android Project.只有安卓工程才可以使用这些选项。
  • 这个工具添加如下资源到现有的安卓工程。
    • 把必要的jar包添加到工程中。
    • 支持armv6和armv7的本地类库。
  • 安卓的Manifest会被更新为ArcGIS应用程序要求的OpenGL ES版本,如果没有权限需要进行授权。

当完成后,你的安卓工程可以添加ArcGIS映射功能到应用程序中。

本地化弹出式窗口文本

ArcGIS for Android工程默认语言是英文。当需要把工程中的弹出式窗口的文本本地化为其他语言时,您可以使用SDK工具包的特性。如果您的工程是ArcGIS for Android 项目,那么可以很容易地使用一个类似右键菜单的工具以此来实现弹出式窗口文本的本地化操作。

  • 右键单击你的ArcGIS for Android工程,然后选择ArcGIS Tools > UI Localization。只有安卓工程才可以使用这些选项。
  • UI 本地化窗口显示如下。

  • 勾选需要的语言,然后点击Finish,这个工具会把您选择的语言添加到一个特定结构的文件中。
  • res/values-zh/arcgis_ui_strings.xml

如果你的设备设置的是除中文外的其他语言,那么ArcGIS弹出式窗口文本将从res/values/arcgis_ui_strings.xml文件中加载。如果设备设置的是中文语言,那么ArcGIS弹出窗口式文件将从res/values-zh/arcgis_ui_strings.xml。

文档

ArcGIS API for Android提供概念性的文档和丰富多样的代码片段来帮助开发者编写应用程序。ArcGIS for Android的文档插件和示例插件包含了所有的文档和代码片断,可以通过如下方式从Eclipse帮助系统中获得:

  • 当安装完插件后,在Eclipse中点击Help菜单,然后点击Contents。

  • 在content列表中,展开ArcGIS API for Android 手册。如果你是一个刚刚接触ArcGIS API for Android的新手,你可以打开Getting started手册来参考一些入门文档来帮助你学习。对于一些高级的开发者来说,可以打开参考手册和示例来深入研究现有的源代码和API文档,并以此来创建应用程序。

示例

ArcGIS for Android的示例是一个简单的应用程序,它方便为开发者理解和使用各种特性。How to work的文档详细讲述了如何导入一个示例工程到Eclipse中然后运行。设计这些示例工程的目的是为了引导开发者按照常用的工作流来进行工作,同时也是一种使用ArcGIS API for Android进行开发最好的练习途径。

更新插件

Eclipse集成了Esri提供的随时改进和升级的插件。下面这段说明展示了如何通过升级现有的插件来获取由Esri提供的最新并且可用的更新。

更新已有插件

Esri定期对ArcGIS API for Android发布更新,更新可以包括新增的功能,新增或更新的文档或示例。更新整个的Eclipse包可能会冗长而繁琐,所以下面的方法介绍怎样只更新Esri的Eclipse插件:

  • 点击Eclipse的Help菜单,然后选择install new software.
  • 在安装向导中,点击already installed链接。
  • 在Eclipse详细安装的对话框中,确认installed software选项已被选中。
  • 从列表中选择ArcGIS for Android Core 和ArcGIS for Android Doc 和 Samples,点击update。
  • 更新相应的插件,当完成后提示重启Eclipse。

深入了解API

地图图层类型

这篇主题列举了ArcGIS for Android API中不同的图层类型,同时描述了它们的功能和性能特点。

Web maps

一个web地图不是一个单一图层,而是参考了ArcGIS Online上保存和授权的复合的图层及服务来进行配置的。Web地图通过URL来访问,用于创建一个完整的地图(MapView),同时可以添加其他的图层到web地图上,如果需要的话,尽量使用代码而不要使用XML来添加。 Web 地图不仅仅包含一组图层,还包含图层的配置信息,例如它们的透明度,名称和绘制顺序。同时也包含地图的配置信息,例如初始范围。Web地图可以做安全控制的,可以在群组内共享,也可以是开放的。

相比传统的方式,web地图在定义单个图层,以及在应用程序中进行配置的时候有很多优势。很多时候你想改变地图中诸多图层中的同一个配置,或者改变初始范围。使用Web地图使这些操作可以在线完成,不需要必须发布应用程序。

Web地图的功能和特性取决于它所包含的地图服务图层 (参考下面的内容)。

一个完全由ArcGIS for Android API 支持的web地图可以包含任何在这篇主题中提到的图层类型。

切片地图服务图层

API类: ArcGISTiledMapServiceLayer/BingMapsLayer—切片地图服务图层是用来对地图服务做缓存的(从ArcGIS Server或Bing),它提供了图像在预定义的范围内的切片格式,这个切片的格式是由服务器设置的,地图图象切片是栅格图象,用来加入到地图中并通过ArcGIS for Android API来设置它们的切片格式,这些服务可以包含多个图层。

功能特点

因为这些图片预先由服务器创建好了,所以不能再改变这些图层的可视性或地图服务的默认空间参考系(可以被认为是一个静态地图服务)。除此之外,除非缓存被刷新了,否则数据不能实时更新。在ArcGIS for Android API中,不能在一个切片地图服务中查询图层,因为这些图层通常都是做为底图的。

性能特点

在ArcGIS for Android API中,切片地图服务是一种最高速的地图服务,地图图片由服务器预先创建并做缓存,能够从服务器高速返回结果。多张图片通常返回一个单一的地图范围,这个含义是多线程和异步处理(切片分别请求和加载)。这个异步模式代表了将会有很多请求发送到服务器来访问这种图层,客户端不会有大量而复杂的处理过程,因为图片被高速的绘制了。每个返回的图片的大小会随着它的清晰度或者分辨率的复杂度的增加而增加。例如,在相同面积和地图范围下,高清的图片切片的文件大小会比地形图测绘的图片切片更大。

动态地图服务图层

API类: ArcGISDynamicMapServiceLayer/ArcGISImageServiceLayer—动态地图服务图层是一个可以包含多个图层(服务器基于每个请求渲染的),并且做为一个单一的栅格图片来返回,该图片不包含任何关于地图特性的额外信息,动态地图图层是与ArcGIS Server地图服务相连接的.

功能特点

地图图片是服务器基于每个请求来绘制的,所以数据可以实时更新并且能被用户看见(只要他们请求一个新的图片,因为这时改变已经发生了)。除此之外,单一地图图层的可视性也可以改变并且展现的数据可以通过添加单个层定义的表达式来进行过滤。尽管没有直接的方法可以用来设置,但是这个图层类型的空间参考系也可以改变的,同时ArcGIS Server会重建每个图片,因为地图的空间参考是基于第一个添加进来的图层的。

在ArcGIS for Android API中, ArcGISDynamicMapServiceLayer类没有提供明确的方法来查询单一图层。但是,图层的最终URL可以用来做为一个要素图层或一个查询任务的基础条件。

性能特点

对每个地图请求来说,ArcGIS Server都创建了一个地图图片,因此绘制的时间取决于地图中数据的数量和复杂度。但是,如果很好的优化过地图服务,那么它相对会更快一些,但通常都会比切片地图服务图层的时间要长。返回的地图图片的文件大小取决于地图数据,不过为它只需要少量的客户端处理流程,所以它在绘制时是比较快的。因此,对于需要实时显示更新的要素,或者需要用户自己过滤种类,只要不需要访问请求要素信息(属性,几何形状或符号)的话,那么它还是一个很好的选择。

图形图层

API类名: GraphicsLayer—图形图层被设计为使用一个可用的渲染器或符号库来绘制要素的应用图层,它们可以包含多个几何类型的要求。有关如何在图层中进行符号化要素的更多介绍,请参考符号化示例。

功能特点

图形图层使用空间坐标系在地图上进行要素绘制,它不是用来绘制基于非地理要素,如指北针或版权信息的。因为图层已经包含了这些要素信息,所以可以通过使用屏幕坐标来获得通过调用getGraphics()方法返回的要素,然后查询图层,也可以通过使用setMinScale 或setMaxScale 方法设置图层的比例尺。

性能特点

通常来说不推荐添加太多的要素到图形图层中,但是,它执行效果确实很不错,同时也是要素图层类的基础。如果你使用了很多要素,那么把这些要素统一放到一个要素图层中,如一个要素集中是更加合适的。

要素图层

API类: ArcGISFeatureLayer—要素图层包含了客户端地图中的要素和使用本地图形单独绘制的要素的信息。这些要素从一个ArcGIS Server的要素服务或地图服务(地图服务的要素图层不能被编辑)的JSON响应中来创建。

功能特点

要素图层提供了丰富的功能,它们包含了所有在地图上显示的要素的完整信息。它们也可以从ArcGIS Server的要素服务(提供编辑操作)中创建。这些图层中的单一要素可以在基于空间或基于文本的WHERE子句的基础上进行查询,要素图层是由图形图层上扩展而来的,因此它可以使用所有图形图层的功能。

性能特点

要素图层拥有丰富的功能,它在访问ArcGIS Server时所需要的请求时间,响应处理时间和渲染速度都是很短的。这是因为每个要素信息是由服务器返回的,然后在设备上解析和处理,最终绘制在屏幕上。但是,只要理解了这些要点并且要素图层被合理的设置和应用,那么它们会使你通过ArcGIS for Android API来构建高效和强大的应用程序。更多关于要素图层和它们的性能特点的细节如下:

在地图中添加图层

这篇主题介绍了关于地图控制器和地图图层的概念,以及指引你如何快速添加地图服务到地图控制器中。它也说明了基本的地图属性(空间参考,初始范围,图层的可见性等等)是怎样与地图服务结合工作的。

在你开始做这些之前,你应该已经完成了这个Hello World地图应用的示例,这个示例是指导你如何使用Eclipse IDE来创建一个安卓的地图应用程序的。

地图

使用地图控制器可以显示地理信息,安卓地图控制器是MapView,这是一个用来显示地图的视图组,并且以要素服务做为子视图。

图层

一个图层代表了一个在地图控制器中可以显示的GIS资源,它可以是一个地图服务,一个要素服务,一个图象服务,或者是一个图形资源。

Android API中的一个图层对象不是安卓视图,因此它不能通过XML来添加。相反,一个MapView中的所有图层实例必须以编程方式来进行配置。

用编程方式来添加图层

步骤:

  • 添加一些变量到类中。 地图变量引用了MapView的实例。dynamicMapURL指向的是你正准备添加的动态地图服务的地址。
  • 从onCreate()方法添加如下代码: 使用findViewById方法来捕获地图参考系,如果要在地图上添加一个图层,可以使用URL来构建ArcGIS动态地图服务图层,然后调用map.addLayer方法。

图层可视化

隐藏和显示图层都是基本的地图操作,通过一次点击,可以开启或关闭你刚刚添加的美国图层的可视性。

步骤:

  • 加入如下代码到onCreate事件中:

调用OnSingleTapListener方法,将其设置为MapView.setOnSingleTapListener监听器。然后使用Layer.isVisible()方法来判断图层是否可见,同时使用Layer.setVisible()方法来设置图层的可见性。

空间参考,初始范围和当前范围

同一个地图中的每个图层在默认情况下可能都有不同的空间参考系,因此使用相同的空间参考系来渲染所有的图层就显得非常重要,MapView会把第一个加入的图层的空间参考系做为它默认的空间参考系。如果你配置了一个地图布局文件,那么位于最顶部的图层将做为整个地图的空间参考系。

当你在一个地图中有多个切片图层时,这些切片地图服务将使用相同的空间参考系。你可以使用不同的空间参考系来生成一个动态地图服务,并且MapView会自动进行投影。

初始范围定义了当地图第一次加载时你期望看到的并且是可见的区域,同理,当前范围定义的是当前可见的范围,一个地图在任何时候都有一个当前范围,而地图加载时有时是不会有初始范围的。

在地图布局文件中可以为MapView设置任意的初始范围,但是当调用getExtent方法来获取当前范围时,大部分情况下你得到的范围与初始范围是不同的。MapView会尽力渲染定义在初始范围内的地图区域,以此来自适应设备的屏幕,但是由于初始范围的长宽比与设备屏幕的长宽比可能不一样,地图服务会重新计算整个范围的长宽比。

编辑

什么是编辑?

这篇主题介绍了使用ArcGIS API for Android进行数据编辑的背景,它介绍了一些编辑时常用的操作流程和方法。此处提供了如何设计一个关于编辑的应用程序,以及多种不同类型的编辑方式,还介绍了ArcGIS Server组件和支持编辑所需的图层配置。关于创建新要素,以及对现有几何组件的编辑和更新功能属性的更多内容将在后面介绍。

编辑可以做什么?

使用ArcGIS API for Android可以编辑通过ArcGIS Server来调用的geodatabase中的空间数据。这可以用在很多方面,如外勤人员在旅行时需要上传或编辑数据,远程工作人员编辑离线数据并需要在当天上传数据,或普通大众通过安卓应用程序来添加或发表评论。

可以在要素服务中进行添加,删除和修改操作,这个包含所有可以支持的几何,渲染和功能服务规范中那些可用的属性类型。

不管采用什么方案,ArcGIS API for Android和Android API的核心都会帮助你实现目标。

编辑的工作流程

编辑的工作流程介绍了用户要在什么时候,并且怎么样去编辑数据,同时应用程序要在什么时候,怎么样把编辑提交到服务器。为了使应用程序具备这种权限,你需要知道应用程序在哪里运行,因为会通过这个确定网络连接是否是可用和可靠的。这一点在确定编辑的工作流程时是非常重要的,因为使用ArcGIS API for Android来触发和提交数据都需要通过网络连接与ArcGIS Server进行通信。

OTA编辑

当前,支持使用ArcGIS API for Android来编辑的工作流程是:通过网络连接调用ArcGIS Server,然后发送和接收编辑结果。如果用户是在高速网络环境(例如,无线局域网连接)下调用,那么这些网络连接的数量就不会有大的影响。但是,在低带宽或间歇性的那些网络环境下,你要确保你的应用程序能最大限度减少网络吞吐量,并且合理处理失败的编辑请求而不能使用户丢失数据。

用户中心设计

不管你的工作流程是什么,你都应该在开发过程中更多考虑用户的类型,这样他们能更容易和安全的使用这个应用程序。这其中包括用户已经知道了什么,而且他们怎么样获取数据并从他们的角度出发能够尽可能减少不必要的步骤。这可以确保能够高效地获取数据,同时会降低培训和未来的维护成本。

有哪些编辑的类型?

这里是有很多可编辑的方案是可供选择的。这篇主题是关于创建新的要素,编辑已存在的要素以及编辑属性的。上述每一种操作的详细说明都可以在下文找到,通过点击下面的链接可以查看更多的信息。

创建新要素

这里包括添加新要素到地图的图层中,用户可以通过在地图上选择一个点来定位,或者使用安卓设备的GPS来定位,它也可以创建更多复杂的几何要素包括多边形,折线,和多点。你可能会考虑使用geodatabase的子类型或要素模版来帮助用户快速添加信息,对于新要素它包括默认的符号库和属性。这里介绍了关于创建新要素的更多细节,无论你要创建什么类型的要素,你必须确保它们符合图层的规则,如几何精度,精确性和拓扑规则。这些信息可以通过使用ArcGISFeatureLayer对象方法以来获得。

编辑现有的几何要素

这个操作包括在地图上重新定形或移动现有的要素,这部分内容应该在编辑方案中着重体现,因为几何编辑工具是很复杂的,尤其关于它们需要做什么,以及如何把结果呈现给用户。这个工具始终需要保持完整的数据层,包括符合准确的几何形状类型,精度,拓扑规则。当然,这个复杂性是取决于你为用户提供什么样的编辑工具。

属性编辑

属性编辑的意思是你不需要考虑编辑要素的几何形状,为保持应用程序的简单化,你应该只显示必要的字段,并提供下拉列表或可选值,从而使用户快速的使用它。你可以通过安卓设备上的日期和时间,或者反向地理编码来自动编辑一些字段。为了展现合适的编辑视图,你应该更多考虑正在编辑的字段的数据类型(例如,日期选择器,微调器,或文本编辑器),软键盘,数据验证和编程逻辑(例如,解析字符串,数字)。这些将在属性编辑的主题中有更详细的介绍。

我需要做什么?

在开始编写ArcGIS for Android应用程序之前有一些问题需要理解,下面是详细的说明。 可以使用ArcGISFeatureLayer.addAttachment()方法来添加附件。

ArcGIS Server要素服务

ArcGIS API for Android可以通过ArcGIS Server的要素服务来进行编辑,这些基于REST的服务是通过地图服务定义(.msd)或者(.mxd)文件来配置的,还有一部分是通过geodatabase来设计的。查看ArcGIS Desktop Help可以了解到更多如何创建这些服务的详细信息。ArcGIS API for Android可以通过本地的,也可以通过公共的ArcGIS Server的实例,或者ArcGIS.com来使用要素服务。

这些服务的配置是非常重要的,因为它们定义了哪些是可编辑的数据,可编辑的字段,还有默认值应该是什么样的。对于地图服务来说,其他要考虑的方面是图层的符号库,尺度阈值和元数据。更多关于地图制作和要素服务的信息,请查看ArcGIS Server Help。

几何引擎和几何服务

当编辑地理要素时,你可能会执行一些几何操作如分割,剪切或简化,或者做空间查询例如靠近,触摸或包含等。ArcGIS API for Android为这些操作(查看com.esri.core.geometry包)提供了一个本地几何引擎。对比ArcGIS Server几何服务,这个引擎几乎提供了全部的功能,你也可以在你的应用程序中同时使用这两种引擎。

其他能帮助你编辑要素的地方?

另一个你需要考虑的事情是geodatabase中的子类型的使用,这个可以提供默认值和域来帮助你对数据进行归类,可以通过子类型来使用要素模版,以此来提供默认值和默认的渲染器。

创建新要素

使用ArcGIS API for Android添加一个新要素到一个要素图层中有几个步骤,下面总结了编辑的工作流程,以及详细的描述和代码片断,这些将帮助你了解创建编辑工具的过程。

我需要添加什么到新要素中?

创建新要素包括添加新的几何形状到一个要素图层中,要做到这一点,需要执行几个步骤。首先,你需要提供一个工具,用户可以用这个工具来创建要素,这个工具应该为图层提供正确的几何类型,如果这个工具是交互式的,它需要与MapView对象的触摸事件绑定,如果这个工具使用GPS定位来创建或跟踪几何形状,那么它需要集成LocationService类,一旦几何形状被创建,它可以根据图层渲染来定义样式。如果要素图层有子类型或模版,那么这些可以用来设置渲染器和其他的一些默认属性。一旦这些属性和渲染器被设置之后,这些要素需要通过要素图层的applyEdits()方法发送到服务器。更多关于这些步骤的细节可以参考下面的介绍,目前已有现成的几何编辑模版来演示这些步骤。

增加地图触摸事件

当用户触摸地图时,需要在MapView对象中添加添加监听器来捕获要素的位置。对于点,这可能是一个简单的OnSingleTapListener,对于多边形或线,可能是MapOnTouchListener(写意图)或更复杂的OnSingleTapListener类,这个类在要素开始编辑和结束时(可能通过长按或双击)具有记录的逻辑

新要素首先可以加入到图形图层中,这样在它被编辑时用户就可以看到要素(查看绘制图形模版来获取更多的信息)。如果你的要素图层有子类型,模版或定义域,那么在一个安卓的微调器,或对话框,或视图中可以为用户显示这些选项。一个子类型或模版中默认的渲染器和属性都可以用于要素添加,这样节省了用户添加这些信息的时间。ArcGISFeatureLayer类有一些实用的方法,以帮助实现这一点,查看createFeatureWithType()和createFeatureWithTemplate()方法,下面的一个示例使用了createFeatureWithTemplate()方法。

在服务器上使用编辑器

当要素被捕获时,它可以被发送到ArcGISFeatureLayer.applyEdits()方法中。这种异步的方法可以用来添加新的要素,删除要素,并更新现有的要素。要素做为图形对象被添加进来,包括几何形状,属性和渲染器,新增的图形作为第一个参数传递,服务器会分配给这个要素一个新的ObjectID。如下方法如示:

一个新的CallbackListener监听器用来处理异步响应,它需要从applyEdits()方法来创建。onCallback()方法接收一个多维数组对象FeatureEditResult[ ][ ],返回的结果集包含每个增加,删除和更新的FeatureEditResult对象。在上面的代码中,editResult[0]提供了增加的结果,editResult[1]是删除的结果,editResult[2]是更新的结果。每一个要素编辑都会返回FeatureEditResult对象。即使编辑时有错误,onCallback()方法也会被调用,所以你需要象上述一样添加一些代码来检查成功还是失败。如果发生错误,onError()方法会在onCallback之后被触发。

编辑现有的几何形状

本主题介绍了使设备能够编辑现有的几何特性所需要的步骤。

我需要做什么才能对现有的几何进行编辑?

为了使设备能够编辑现有的要素,需要执行下面三个基本步骤:

  • 选择要编辑的要素,然后为用户展现几何形状。
  • 为用户提供编辑几何形状的工具,例如,拖动顶点或执行几何操作,比如分割,合并,或剪切等。
  • 把编辑结果发送到服务器。

要素选择

要素图层包含了一个特殊的选择模式来使得要素选择变的更容易,当你实例化要素图层时,你可以使用ArcGISFeatureLayer.MODE类来设置它,并把它发送到构造器或ArcGISFeatureLayer.OPTIONS类中。在这种模式下,要素只有当被选择时才从服务器检索并返回,在这个图层的基础上,你可以提供一个额外的动态地图服务层以显示所有可用的功能。为了选择要素,你需要创建一个查询对象,然后在要素图层上调用selectFeatures()方法来传递一个回调函数。具体请参考ArcGIS Rumtime SDK for Android中的AttributeEditor示例。

提供编辑工具

为了提供编辑工具,你需要把MapView对象上的每个监听事件都互相挂接,以此来响应客户端的事件。这包括在一个多边形上点击顶点来使它移动,GeometryEngine类提供了可以运行在本地设备上的几何操作(不是运行在ArcGIS Server实例上的几何操作),提供很多方法帮助你实现几何编辑。对于选择一个顶点的操作来说,几何引擎有一个getNearestVertex()方法,该方法需要一个点和一个几何形状(在这种情况下就是所选择的要素),并返回在几何形状中最接近这个点的顶点。你可以在屏幕上显示这个顶点并且提供额外的触摸监听事件,这样用户就可以移动它了。 几何引擎也提供了大量的几何运算例如剪辑,缓冲和连接等,这些可用于在地图上整合新的图形来编辑现有的图形,例如使用新绘制的多边形来裁剪现有的多边形。

应用编辑

编辑一个现有要素的几何形状属于要素更新(不是新增或删除,这些是其他的操作类型)。为了做到这一点,你要使用ArcGISFeatureLayer.applyEdits()这个异步方法,更新的图形做为第3个参数传递,被更新的图形对象不需要包含太多的属性,但是必须包含ObjectID属性,这样才能编辑成功。具体方法如下:

一个新的CallbackListener监听器用来处理异步响应,它需要从applyEdits()方法来创建。onCallback()方法接收一个多维数组对象FeatureEditResult[ ][ ],返回的结果集包含每个增加,删除和更新的FeatureEditResult对象。在上面的代码中,editResult[0]提供了增加的结果,editResult[1]是删除的结果,editResult[2]是更新的结果。每一个要素编辑都会返回FeatureEditResult对象。即使编辑时有错误,onCallback()方法也会被调用,所以你需要象上述一样添加一些代码来检查成功还是失败。如果发生错误,onError()方法会在onCallback之后被触发。

编辑属性

对现有要素执行属性编辑有如下几个步骤。这些逻辑和信息也可以很容易地应用到新要素的属性编辑中来。一个属性编辑模版已经开发出来帮助你理解怎么样编写一个属性编辑的应用程序,这个是基于ArcGIS API for Android SDK的,可以通过Eclipse插件获得。

我需要什么来编辑属性?

当编写应用程序来编辑一个要素的属性时,你需要了解关于这个正在编辑的要素图层的一些信息。这包括可编辑字段的信息,每个字段包括的数据的类型,还有是否一个字段代表了一个子类型或域,并且它们的值是什么。ArcGISFeatureLayer类为你提供了所有这些信息并保证了数据的完整,一旦你收集到了这些信息,你需要呈现给用户,这样他们就可以进行编辑了。当数据被添加进来之后,你可以使用applyEdits()方法把编辑请求发送到服务器。关于这些步骤的更多细节可以参考下面的介绍。

检查图层字段

图层字段信息是属性编辑的关键,它可以从要素图层的getFields()方法中获得,这个方法返回一个数组字段对象。一个字段对象会指明是否这个字段是可以编辑的,并且字段是什么类型的(这样可以知道用户能够输入什么类型的数据)。下面一个简短的例子说明了如何检查图层字段:

这段代码介绍了用户可以通过键盘输入(字符串,数值和日期)来确定可编辑的字段

下面的方法用来确定字段的类型(文本,日期,数值和小数点),并且允许你添加逻辑运算来处理每个字段类型:

把可编辑字段呈现给用户

一旦你知道了什么类型的数据是可以编辑的,你就可以用最合适的格式把它呈现给用户。ArcGIS API for Android为你提供丰富多样的视图元素,EditText对象可能是其中最关键的视图元素,它允许用户输入,并且非常灵活,它的数据类型的大小和字段的长段是可以设置的,这样可以随时显示最合适的软键盘。

下面的EditText布局xml文件演示了当只输入一个浮点型数值时是如何设置字段的(查看安卓的inputType属性):

对于域和子类型,可以使用Spinner对象,这是一个下拉列表,可以使用适配器填充其中的内容。 下面看一下属性编辑模版是如何使用这个方法来创建一个弹出式窗口的。

确保数据的完整性

在你提交数据之前,最好把数据转换成正确的格式,用户输入的值(从一个EditText或Spinner视图而来的)将做为一个字符串返回。上面的代码段是用来确定可用的字段类型,这样可以把字符串值相应的解析为需要的数据类型(数值,日期,双精度等等)。

使用FeatureLayer.applyEdits()方法

编辑现有要素的属性在本质上就是一个要素编辑(不是新增或删除,这些是其他的操作类型),为了做到这一点,你可以使用ArcGISFeatureLayers.applyEdits()异步方法,更新的图形做为第3个参数传递,被更新的图形对象不需要包含所有的属性,但是必须包含ObjectID属性,这样才能编辑成功。具体方法如下:

从applyEdits()方法中需要创建一个新的CallbackListener监听来处理异步响应,onCallback()方法接收一个FeatureEditResult[ ][ ]的多维数组对象的参数,返回的结果集包含每个增加,删除和更新的FeatureEditResult对象。在上面的代码中,editResult[0]提供了增加的结果,editResult[1]是删除的结果,editResult[2]是更新的结果,每个要素编辑都会返回FeatureEditResult对象。 即使编辑时有错误,onCallback()方法也会被调用,所以你需要象上述一样添加一些代码来检查成功还是失败。如果发生错误,onError()方法会在onCallback()方法之后被触发。

更多API参考资源

http://resources.arcgis.com/en/help/android-sdk/concepts/index.html#//011900000024000000