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.MapViewandroid: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" /><Buttonandroid: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;//离线地理数据库下载Taskprivate ProgressDialog mProgressDialog;//状态框@Overrideprotected 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() {@Overridepublic 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 progressmProgressDialog.show();gdbSyncTask = new GeodatabaseSyncTask(onlineFeatureLayerUrl, null);gdbSyncTask.fetchFeatureServiceInfo(new CallbackListener<FeatureServiceInfo>() {@Overridepublic void onError(Throwable arg0) {Log.e(TAG, "获取FeatureServiceInfo失败");}@Overridepublic 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>>() {@Overridepublic void onCallback(Map<Integer, GeodatabaseFeatureTableEditErrors> objs) {mProgressDialog.dismiss();if (objs != null) {if (objs.size() > 0) {showMakeText("同步完成,但是发生错误");} else {showMakeText("同步完成:同步成功");}} else {showMakeText("同步完成:同步成功");}}@Overridepublic void onError(Throwable e) {Log.e(TAG, "", e);mProgressDialog.dismiss();Toast.makeText(context, "Error:"+e.toString(), Toast.LENGTH_SHORT).show();}};GeodatabaseStatusCallback statusCallback = new GeodatabaseStatusCallback() {@Overridepublic void statusUpdated(GeodatabaseStatusInfo status) {final String progress = status.getStatus().toString();//在UI线程更新下载状态((Activity)context).runOnUiThread(new Runnable(){@Overridepublic 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(){@Overridepublic 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服务

文章若无特殊说明均为原创,原创作品,允许转载,转载时请务必以超链接形式标明文章出处、作者信息和本声明。
博客:http://www.cnblogs.com/gis-luq​ 作者:gis-luq 邮箱:luqiang.gis@foxmail.com

转载于:https://www.cnblogs.com/telwanggs/p/6434490.html

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

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

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

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

    1.前言 在上一篇我们已经实现了离线地理数据库的下载,这一篇我们着重介绍离线数据库的加载与编辑. 由于ArcGIS Runtime SDK for Android 10.2.X版本并没提供要素绘制功能 ...

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

    1.前言 1.1.环境准备: ArcGIS for Desktop 10.4.1(10.2.1以上版本即可) ArcGIS for Server 10.4.1 (10.2.1以上版本即可) Postg ...

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

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

  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 Android开发笔记》——(9)、空间数据的容器-地图MapView

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

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

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

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

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

最新文章

  1. oracle创建DBLink连接
  2. android检测蓝牙设备连接不上,Android检查设备连接状态
  3. puppet 自定义facter
  4. latex快速入门教程
  5. 绝!关于pip的15个使用小技巧
  6. freeswitch 发update sip消息_LeetCode LCP 05——发 LeetCoin
  7. VMware ubuntu20.04 server随win10自动启动与关闭
  8. eBPF学习记录(二)使用bpftrace开发eBPF程序
  9. sorted()函数快速实现字典输出
  10. python 闯关之路二(模块的应用)
  11. java中装饰器_java设计模式之装饰器模式以及在java中作用
  12. 哪个大佬有c#三层架构写的餐饮管理系统源代码
  13. 如何确保网站的安全性
  14. linux服务器 ip地址,查看linux服务器的IP地址
  15. 抖音的显性和隐形限流的根本原因
  16. 说话人识别的特征选取
  17. 工作太闲闹心怎么办啊
  18. c 语言程序编辑,C语言程序编辑学习篇—编程者说之C语言
  19. php 豆瓣api_想调用豆瓣电影 api,谁开发过整套的 php 开源吗?或者指点下
  20. NSString 遇到的坑

热门文章

  1. (84)FPGA面试题-多bit跨时钟域
  2. (81)FPGA复位激励(task)
  3. (67)Verilog HDL模块条件例化
  4. python嵌套循环优化_减少循环嵌套,提升代码运行速度!你不知道的3个实用Python函数...
  5. java python c++比喻图_Java/Python/PHP/C++图文详解它们之间的尿性
  6. vs2010 导出创建dll 导入使用dll 导出有命名空间的类 函数 外部函数
  7. 1006.arm 板中杀死进程
  8. STM32F103--DHT11的配置
  9. STM32网络电路设计
  10. RTL8201EL介绍