《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:离线矢量数据同步
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、实现离线地理数据库同步
基本思路:
- 获取.geodatabase文件存储路径
- 根据FeatureService服务获取FeatureServiceInfo服务参数信息
- 根据FeatureServiceInfo信息同步离线地理数据库
- 在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开发笔记》——离在线一体化技术:离线矢量数据同步的更多相关文章
- 《ArcGIS Runtime SDK for Android开发笔记》
开发笔记之基础教程 ArcGIS Runtime SDK for Android 各版本下载地址 <ArcGIS Runtime SDK for Android开发笔记>——(1).And ...
- 《ArcGIS Runtime SDK for Android开发笔记》——离在线一体化技术:概述
1.前言 数据生产和数据展示是常见的两大专业级移动GIS应用场景,这里我们针对数据生产环节的ArcGIS的离在线一体化技术给大家做一个基本的介绍和梳理. 使用ArcGIS离在线一体化技术首先需要以下基 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
1.前言 学习ArcGIS Runtime SDK开发,其实最推荐的学习方式是直接看官方的教程.示例代码和帮助文档,因为官方的示例一般来说都是目前技术最新,也是最详尽的.对于ArcGIS Runtim ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)(转)
1.前言 在上一篇的内容里我们介绍了基于Android Studio构建ArcGIS Runtime SDK for Android开发环境的基本流程,流程中我们采用的是基于Gradle的构建方式,在 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析
1.前言 Android Studio 是第一个Google官方的 Android 开发环境.其他工具,例如 Eclipse,在 Android Studio 发布之前已经有了大规模的使用.为了帮助开 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView
1.前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版预 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
1.前言 2015年1月15日,发布ArcGIS Runtime SDK for Android v10.2.5版本.从该版本开始默认支持android studio开发环境,示例代码的默认开发环境也 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(15)、要素绘制Drawtools3.0工具DEMO
1.前言 移动GIS项目开发中点线面的要素绘制及编辑是最常用的操作,在ArcGIS Runtime SDK for iOS 自带AGSSketchLayer类可以帮助用户快速实现要素的绘制,图形编辑. ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(11)、ArcGIS Runtime SDK常见空间数据加载
ArcGIS Runtime SDK for Android 支持多种类型空间数据源.每一种都提供了相应的图层来直接加载,图层Layer是空间数据的载体,其主要继承关系及类型说明如下图所示: 转载请注 ...
随机推荐
- Qt 学习之路 2(32):贪吃蛇游戏(2)
Qt 学习之路 2(32):贪吃蛇游戏(2) 豆子 2012年12月27日 Qt 学习之路 2 55条评论 下面我们继续上一章的内容.在上一章中,我们已经完成了地图的设计,当然是相当简单的.在我们的游 ...
- 关于Apache显示port 80 in use 无法解决的情况,这个世界对程序媛太不友好了
学到Ajax时下载了Apache,百度的安装教程,配置文件参数分别是: 1. httpd.conf里的80改为8000或者其他的,共三处(用记事本打开,按ctrl+F找方便) 2. httpd-ssl ...
- centos用ifconfig不显示ip地址的解决方法
解决办法: 第一步: 输入ip addr 发现ens33中并不包含IP内容 第二步: 输入cd /etc/sysconfig/network-scripts/ 回车 然后输入 ls 回车 第三步:选 ...
- Linux之旅
如今 linux 随着云服务的狂扫全球之势,对吾等准开发人员而言也不可继续视而不见了,硬着头皮调用情绪开始 Linux 之旅. 一.主机准备 既然 Linux,必然和日常工作的环境产生了“冲突”,经过 ...
- Tensorlflow-解决非线性回归问题
import tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt #使用numpy生成200个随机点,范围从-0.5到0 ...
- HDU - 6188
用vis表贪心异常方便 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #defi ...
- Hibernate复合主键的注解
[转自] http://blog.csdn.net/happylee6688/article/details/17636801 最近做项目用到了Hibernate框架,采用了纯面向对象的思想,使用OR ...
- Oracle9i之xmltype应用(2)
Oracle 9i提供的XML内置特性: Oracle 9i支持XMLType类型,它是一种Oracle 9i系统定义的对象类型.XMLType有内置的函数,有力的提供了推XML的创建,索检,索引等功 ...
- PIE SDK面元素的绘制
1. 功能简介 在数据的处理中会用到线元素的绘制,目前PIE SDK支持IFillSymbol接口,FillSymbol对象是用于修饰填充面状对象的符号,它包括MarkerFillSymbol(由点状 ...
- ABP Zero集成微信小程序登录
首先是ABPZero的第三方登录模块,通过调用第三方的登录接口返回用户信息,再交给ABP的登录验证模块去执行对应的登录注册. 涉及的数据库表主要是这两个表,AbpUsers存储了用户信息,AbpUse ...