【10.2移动新特性】揭秘ArcGIS 10.2移动产品的离线功能【下:服务模式】

ArcGIS 10.2中的离线模式


        ArcGIS 10.2提供了两种离线模式,分别称为“服务模式”和“桌面模式”。

        1、服务模式

        即数据被发布成要素服务,用户可从服务器上下载部分或全部的数据并保存为一个Runtime Geodatabase,用来进行离线应用;该模式适合大量用户同时工作的场景。

        2、桌面模式

        Esri在ArcGIS 10.2.1的桌面产品中提供了专门的工具来制作Runtime Geodatabase,内容可以是要素、表格数据、切片缓存、网络数据集,用来实现离线的数据、离线的地理编码和离线的路径分析等功能。桌面模式适合单用户场景,创建的离线数据目前为只读型,可用来进行展示和查询。


服务模式


        服务模式中,需要先将数据发布成要素服务。发布要素服务的方法和步骤与ArcGIS 10.1一致,不过要想通过服务进行数据的下载和同步等操作,服务需要提供一些能力,并且数据也需要相关的设置。


服务配置


1、服务需要具备FeatureService能力


【10.2移动新特性】揭秘ArcGIS 10.2移动产品的离线功能【下:服务模式】

2、Feature Service要具备同步的能力

【10.2移动新特性】揭秘ArcGIS 10.2移动产品的离线功能【下:服务模式】


数据需求

  • 在数据集上启用归档
  • 包括Global IDs的数据集
  • 关系类和附件必须使用一个全局ID主键(如果有附件的话)


数据下载


        服务发布好之后,就可以使用ArcGISRuntime SDK来下载数据、实现离线功能了。下载关键点如下:

    • 通过GeodatabaseTask获取FeatureService服务信息
    • 通过Geodatabase创建本地Geodatabase数据库
    • 数据下载所需的参数类GenerateGeodatabaseParameters
    • 通过GeodatabaseStatusCallback类获取数据下载和创建数据库的相关状态
    • 通过CallbackListener<Geodatabase>回调函数处理下载的数据,我们可以在这里将下载的数据显示到地图上。
    • 下载的数据都以FeatureTable表的形势存储在本地数据库中。

Android API示例


         以ArcGIS for AndroidAPI为例,采用服务模式,使用API中暴露的GeodatabaseTask类来下载数据生成Geodatabase;重载的GeodatabaseTask类的构造函数有一个CallbackLister监听,该监听是一个后台任务,用来从服务上下载数据并存储在移动端本地的geodatabase中,示例代码如下: 

/**

 * Create the GeodatabaseTask from the feature service URL w/o credentials.

 */

private void downloadData(String url) {

         Log.i(TAG, "Create GeoDatabase");

         // create a dialog to update user on progress

         dialog = ProgressDialog.show(mMapView.getContext(), "Download Data",

                          "Create local runtime geodatabase");

         dialog.show();

         // create the GeodatabaseTask

         gdbTask = new GeodatabaseTask(url, null,

                          new CallbackListener() {

                                   // Handle errors

                                   public void onError(Throwable e) {Log.e(TAG, "Error occured creating Geodatabase Task");

                                            dialog.dismiss();

                                   }

 

                                   // Handle success

                                   public void onCallback(FeatureServiceInfo objs) {

                                            // create the geodatabase

                                            createGeodatabase();

                                   }

                          });

}

        

        上述代码中的downloadData方法的输入参数是要素服务的url,当弹出对话框之后,创建了GeodatabaseTask对象和CallbackListener监听,该监听有以下两个方法:

    • onError:该方法在创建对象失败时调用,可在此加入日志跟踪等代码;
    • onCallback:创建对象成功时调用,可将创建本地geodatabase的代码写在其中。如这里我们创建了createGeodatabase方法,用来传递参数,创建离线的geodatabase数据库文件,示例代码如下:

/**

 * Set up parameters to pass the the submitTask() method. A

 * CallbackListener is used for the response.

 */

private static void createGeodatabase() {

         // set up the parameters to generate a geodatabase

         GenerateGeodatabaseParameters params = new GenerateGeodatabaseParameters(

                          layerIds, mMapView.getExtent(), mMapView.getSpatialReference(),

                          returnAttachments, syncModel, mMapView.getSpatialReference());

 

         // a callback which fires when the task has completed or failed.

         CallbackListener gdbResponseCallback = new CallbackListener() {

                  public void onCallback(final Geodatabase gdb) {

                          Log.i(TAG, "Geodatabase is: " + gdb.getPath());

                          dialog.dismiss();

                          // update map with local feature layer from geodatabase

                          updateFeatureLayer(gdb.getPath());

                  }

                  public void onError(Throwable e) {

                          Log.e(TAG, "Error creating geodatabase");

                          dialog.dismiss();

                  }

         };

 

         // a callback which updates when the status of the task changes

         GeodatabaseStatusCallback statusCallback = new GeodatabaseStatusCallback() {

                  public void statusUpdated(GeodatabaseStatusInfo status) {

                          Log.i(TAG, status.getStatus().toString());

                  }

         };

 

         // create the fully qualified path for geodatabase file

         localGdbFilePath = createGeodatabaseFilePath();

 

         // get geodatabase based on params

         submitTask(params, localGdbFilePath, statusCallback, gdbResponseCallback);

}

 

        

        从代码中可以看出,传递的参数主要包括:

    • geodatabase中包含的图层,即可指定下载哪些图层;
    • 图层的范围,即可指定数据的下载范围;
    • Geodatabase的空间参考;
    • 是否返回附件;
    • 同步方式,可选择一次同步一个图层,或者同步所有图层;
    • 图层过滤信息等;

        使用GenerateGeodatabaseParameters类来传递这些参数,这个类有多个构造函数,用户可以根据需要进行选择。之后,我们创建了CallbackListener监听来处理geodatabase创建成功和失败的情况。另外,还创建了GeodatabaseStatusCallback来检查创建的过程,当geodatabasetask更新的时候,执行statusUpdated方法,有效的更新状态可存储在枚举变量GeodatabaseStatusInfo.Status中,最后将创建的geodatabase的名称和路径返回:


/*
*Request database, poll server to get status, and download the file
 */
private static void submitTask(GenerateGeodatabaseParameters params,
        String file, GeodatabaseStatusCallback statusCallback,
        CallbackListener gdbResponseCallback) {
    // submit task
    gdbTask.submitGenerateGeodatabaseJobAndDownload(params, file,statusCallback,gdbResponseCallback);

} 

        

        GeodatabaseTask.submitGenerateGeodatabaseJobAndDownload()方法在幕后做了很多工作,它向服务器请求当前服务的当前状态,下载数据到指定目录下,并存储在geodatabase中。

        可通过示例向导加载“CreateRuntime Geodatabase Android SDK”查看相应源码。




【10.2移动新特性】揭秘ArcGIS 10.2移动产品的离线功能【下:服务模式】

上一篇:解决IntelliJ在导入Android SVN项目出错问题


下一篇:百度地图 JNI ERROR (app bug): accessed stale local reference 错误解决方法