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"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.syncgdb.MainActivity"> <!-- MapView -->
<com.esri.android.map.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
mapoptions.MapType="Topo"
mapoptions.ZoomLevel="5"
mapoptions.center="28.671298, 104.066404" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="离线数据同步"
android:id="@+id/btnSync"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" /> </RelativeLayout>

2.3、实现离线地理数据库同步

基本思路:

  1. 获取.geodatabase文件存储路径
  2. 根据FeatureService服务获取FeatureServiceInfo服务参数信息
  3. 根据FeatureServiceInfo信息同步离线地理数据库
  4. 在UI线程中反馈同步结果

完整代码

package com.example.syncgdb;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast; import com.esri.android.map.FeatureLayer;
import com.esri.android.map.MapView;
import com.esri.core.ags.FeatureServiceInfo;
import com.esri.core.geodatabase.Geodatabase;
import com.esri.core.geodatabase.GeodatabaseFeatureTable;
import com.esri.core.geodatabase.GeodatabaseFeatureTableEditErrors;
import com.esri.core.map.CallbackListener;
import com.esri.core.tasks.geodatabase.GeodatabaseStatusCallback;
import com.esri.core.tasks.geodatabase.GeodatabaseStatusInfo;
import com.esri.core.tasks.geodatabase.GeodatabaseSyncTask;
import com.esri.core.tasks.geodatabase.SyncGeodatabaseParameters; import java.io.File;
import java.io.FileNotFoundException;
import java.util.Map; public class MainActivity extends AppCompatActivity { protected static final String TAG = "syncGDB";
private Context context; private MapView mMapView;//地图容器 private static String onlineFeatureLayerUrl = "http://192.168.1.212:6080/arcgis/rest/services/testdata/FeatureServer";//在线FeatureLayer地址
private static String localGdbFilePath;//离线GDB地址 private GeodatabaseSyncTask gdbSyncTask;//离线地理数据库下载Task
private ProgressDialog mProgressDialog;//状态框 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); this.context = this;
this.mMapView = (MapView)findViewById(R.id.map); //设置离线地理数据库存储路径
localGdbFilePath = createGeodatabaseFilePath();
//加载离线地理数据库
addFeatureLayer(localGdbFilePath); mProgressDialog = new ProgressDialog(context);
//设置点击进度对话框外的区域对话框不消失
mProgressDialog.setCanceledOnTouchOutside(false);
mProgressDialog.setTitle("正在同步离线地理数据库副本到服务器"); //绑定按钮设置下载事件
Button btnSyncGDB = (Button)this.findViewById(R.id.btnSync);
btnSyncGDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SyncOfflineData();//同步离线地理数据库
}
});
} /**
* Geodatabase文件存储路径
*/
static String createGeodatabaseFilePath() {
return Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "/RuntimeOfflineEdit"
+ File.separator + "demo.geodatabase";
} /**
* 读取Geodatabase中离线地图信息
* @param featureLayerPath 离线Geodatabase文件路径
*/
private void addFeatureLayer(String featureLayerPath) { Geodatabase localGdb = null;
try {
localGdb = new Geodatabase(featureLayerPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
} // 添加FeatureLayer到MapView中
if (localGdb != null) {
for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseTables()) {
if (gdbFeatureTable.hasGeometry()){
FeatureLayer layer = new FeatureLayer(gdbFeatureTable);
mMapView.addLayer(layer);
}
}
}
} /**
* 同步离线地理数据库
*/
private void SyncOfflineData() { Log.i(TAG, "Sync GeoDatabase");
// create a dialog to update user on progress
mProgressDialog.show(); gdbSyncTask = new GeodatabaseSyncTask(onlineFeatureLayerUrl, null);
gdbSyncTask.fetchFeatureServiceInfo(new CallbackListener<FeatureServiceInfo>() { @Override
public void onError(Throwable arg0) {
Log.e(TAG, "获取FeatureServiceInfo失败");
} @Override
public void onCallback(FeatureServiceInfo fsInfo) {
if (fsInfo.isSyncEnabled()) {
SyncGeodatabase(fsInfo);
}
}
});
} /**
* 根据FeatureServiceInfo信息获取离线地理数据库同步信息
* @param featureServerInfo 服务参数信息
*/
private void SyncGeodatabase(FeatureServiceInfo featureServerInfo) {
try {
// 创建一个离线地理数据库
Geodatabase gdb = new Geodatabase(localGdbFilePath); // 获取离线地理数据库同步参数
final SyncGeodatabaseParameters syncParams = gdb.getSyncParameters(); CallbackListener<Map<Integer, GeodatabaseFeatureTableEditErrors>> syncResponseCallback
= new CallbackListener<Map<Integer, GeodatabaseFeatureTableEditErrors>>() { @Override
public void onCallback(Map<Integer, GeodatabaseFeatureTableEditErrors> objs) {
mProgressDialog.dismiss();
if (objs != null) {
if (objs.size() > 0) {
showMakeText("同步完成,但是发生错误");
} else {
showMakeText("同步完成:同步成功");
}
} else {
showMakeText("同步完成:同步成功");
}
} @Override
public void onError(Throwable e) {
Log.e(TAG, "", e);
mProgressDialog.dismiss();
Toast.makeText(context, "Error:"+e.toString(), Toast.LENGTH_SHORT).show();
} }; GeodatabaseStatusCallback statusCallback = new GeodatabaseStatusCallback() { @Override
public void statusUpdated(GeodatabaseStatusInfo status) {
final String progress = status.getStatus().toString();
//在UI线程更新下载状态
((Activity)context).runOnUiThread(new Runnable(){
@Override
public void run() {
mProgressDialog.setMessage("数据同步中,请稍后……");
}
});
}
}; // 执行同步
gdbSyncTask.syncGeodatabase(syncParams, gdb, statusCallback, syncResponseCallback); } catch (Exception e) {
e.printStackTrace();
}
} /**
* 在UI线程中执行状态提示
* @param msg
*/
private void showMakeText(final String msg) {
//在UI线程更新下载状态
((Activity)context).runOnUiThread(new Runnable(){
@Override
public void run() {
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
});
} }

源代码托管地址:http://git.oschina.net/gis-luq/RuntimeOfflineEdit

3、数据同步结果

相关内容列表

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

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

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

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

《ArcGIS Runtime SDK for Android开发笔记》——数据制作篇:发布具有同步能力的FeatureService服务

《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步的更多相关文章

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

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

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

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

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

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

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

    1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...

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

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

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

    1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...

  7. 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境

    1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...

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

    1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...

  9. 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载

    ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...

随机推荐

  1. django' 前端 self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split'

    form 表单 post之后 ,重新定向当前页面的get请求 这是因为,form表单提交的时候,按钮在form表单里面

  2. 老男孩python作业1

    作业1:编写登陆接口 (1)输入用户名密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 作业2:多级菜单 (1)三级菜单 (2)可依次选择进入各子菜单 (3)所需新知识点:列表.字典 任务1思 ...

  3. Luogu P1108 低价购买 DP

    第一问求最长下降子序列,不提: 第二问:借鉴了最短路的方法??? 我们求出来了每个位置的最长下降子序列的长度,那么刻意这样这样转移 if f[i]==f[j]+1&&a[i]<a ...

  4. 113th LeetCode Weekly Contest Largest Time for Given Digits

    Given an array of 4 digits, return the largest 24 hour time that can be made. The smallest 24 hour t ...

  5. UVA - 11388 唯一分解定理

    题意:给出G和L,求最小的a使得gcd(a,b)=G,lcm(a,b)=L 显然a>=G,所以a取G,b要满足质因子质数为L的同次数,b取L //此处应有代码

  6. springboot+Druid+oracle 配置p6spy

    p6spy可以将带参数的sql直接打出来方便调试. 1.gradle中引入 compile group: 'p6spy', name: 'p6spy', version: '3.8.1' 2.reso ...

  7. (转)linux命令详解之useradd命令使用方法

    linux命令详解之useradd命令使用方法 原文:http://blog.csdn.net/u011537073/article/details/51987121 Linux 系统是一个多用户多任 ...

  8. Spark Shell启动时遇到<console>:14: error: not found: value spark import spark.implicits._ <console>:14: error: not found: value spark import spark.sql错误的解决办法(图文详解)

    不多说,直接上干货! 最近,开始,进一步学习spark的最新版本.由原来经常使用的spark-1.6.1,现在来使用spark-2.2.0-bin-hadoop2.6.tgz. 前期博客 Spark ...

  9. ElasticSearch mapping中字段属性总结

  10. Nmap原理02 - 版本探测介绍(上)

    Nmap原理02 - 版本探测介绍(上) 1.介绍 本文将介绍如何通过修改或添加nmap-service-probes文件来实现对nmap中未知服务的探测,首先介绍服务和版本探测的相关信息,然后介绍服 ...