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. 微信小程序之页面之间传递值

    页面之间传值有三种方式 1.url传值 2.本地存储传值 3.全局变量传值 1.url传值: 通过url传值的需要通过option来获取参数值. 更多详情可以访问小程序-navigateTo章节. A ...

  2. Jprofiler的安装部署及使用

    本地与远程安装同版本的jprofiler.以本地Windows操作系统,远程AIX操作系统为例,详细介绍安装配置步骤.本次测试使用的均是jp6版本. 一.安装Jprofiler服务端 一 般情况下,J ...

  3. poj1182 食物链 带权并查集

    题目传送门 题目大意:大家都懂. 思路: 今天给实验室的学弟学妹们讲的带权并查集,本来不想细讲的,但是被学弟学妹们的态度感动了,所以写了一下这个博客,思想在今天白天已经讲过了,所以直接上代码. 首先, ...

  4. Wannafly挑战赛14 - E 并查集维护线性基区间

    给一个1-base数组{a},有N次操作,每次操作会使一个位置无效.一个区间的权值定义为这个区间里选出一些数的异或和的最大值.求在每次操作前,所有不包含无效位置的区间的权值的最大值. 线性基删除不知道 ...

  5. Codeforces - 912B 位运算

    求[1,n]内k的值的异或和使其值最大 k=1是肯定是n k>1,设pos是n的最高位,那答案就是(1ll<<(pos+1))-1 这里用到一个性质是当S=2^i-1时,a xor ...

  6. .Net支持Redis哨兵模式

    csredis 博客 csRedisgit地址 csRedis3.2.1 Nuget地址 (在使用csredis3.2.1获取sentinel时产生运行时异常,调查问题最后发现是获取sentinel的 ...

  7. Q942 增减字符串匹配

    给定只含 "I"(增大)或 "D"(减小)的字符串 S ,令 N = S.length. 返回 [0, 1, ..., N] 的任意排列 A 使得对于所有 i ...

  8. RNN(recurrent neural network)学习笔记

    参考:https://www.jianshu.com/p/9dc9f41f0b29  以及<白话深度学习与TensorFlow> 与前馈神经网络.卷积神经网络等不同之处在于,RNN具有一定 ...

  9. fixed

    之前我们见的fixed就是固定在低端.后来我遇到一个问题 如果  这样写: div{ position: fixed; left: 0; bottom: 0; } 内容吧div撑开,有多少算多少 di ...

  10. java泛型中的各种限制

    java和其他语言一样,都支持泛型,包括泛型类和泛型方法,但是java的泛型比较特殊.因为java的泛型并不是在java诞生之初就加入的,在很长的一段时间里,java是没有泛型的,在需要泛型的地方,统 ...