前提条件
前提条件必须满足10.2.1以上的arcgis服务才可以,但是如果低于10.2.7的arcgis那么编辑和同步必须是同一个线程,所以我们前提必须要在10.2.7以上的arcgis服务下进行。服务端需要是桌面生成并且需要勾选同步功能,或者使用catlog生成也可以。地图文档和移动端的坐标系一样即可。还有需要注意的地方是勾选默认地图隐藏或显示问题,这个由自己的需求而定。一般情况下我建议如果是多个Table的话默认隐藏,因为切换的时候直接可以在移动端去控制。
判断是否开启同步功能
当我们拿到地图服务连接时,我们便可以尝试去做生成,我一般使用FeatureService服务,mapService没有试过。代码如下,我们来详细讲解一下。
task是非常重要的一个东西,他为我们做了一个开端,事实上它是用来判断这个链接或者是这个服务是否支持同步功能,不支持同步功能的服务是无法进行生成Geodatabase的,所以在回调里面我们可以看到onError方法和onCallback方法,在onCallback方法里面我们去判断我们拿到的FeatureServiceInfo是否具有同步功能,如果有的话,我们方可执行下一步,否则所有的东西都免谈。那我们继续看下一步创建的操作。
task = new GeodatabaseSyncTask(url, null);
task.fetchFeatureServiceInfo(new CallbackListener<FeatureServiceInfo>() {
public void onError(Throwable e) {
Log.e("------------", "下载失败");
}
public void onCallback(FeatureServiceInfo objs) {
if (objs.isSyncEnabled()) {
createGeodatabase(objs);
}
}
});
生成Geodatabase
下面代码是生成的代码,params类似请求条件一样,这里尤其要注意mapView.getExtent()这个决定你生成Geodatabase的范围,因为你生成Geodatabase能不能查看到要素不仅仅是因为服务端生成地图文档导致的,而且也会因为你的mapView.getExtent()不对导致你看不到你的要素。gbResponseCallback 这个回调对象只会告诉你生成的成功与否,他本身并不会去生成Geodatabase,真正生成的是submitTask方法,里面有条件params、file文件路径、是否启用缓存(一般我们都是用false)、statusCallback状态回调(事实上只有成功了才会使用submitTask方法)、gdbResponseCallback(成功与否的回调),这里我们一个条件两个回调都有了,我们主要还是缺一个文件,file指这个Geodatabase全路径,包括后缀名。切记不是file对象,而是String。
private void createGeodatabase(FeatureServiceInfo objs) {
params = new GenerateGeodatabaseParameters(objs, mapView.getExtent(),
mapView.getSpatialReference());
gbResponseCallback = new CallbackListener<String>() {
public void onError(Throwable e) {
Log.e("------", "生成失败");
}
public void onCallback(String objs) {
Log.e("------", "生成成功");
updateFeatureLayer(objs);
}
};
callback = new GeodatabaseStatusCallback() {
public void statusUpdated(GeodatabaseStatusInfo status) {
}
};
submitTask(params, localGdbFilePath, callback, gbResponseCallback);
}
private void submitTask(GenerateGeodatabaseParameters params, String file,
GeodatabaseStatusCallback statusCallback,
CallbackListener<String> gdbResponseCallback) {
task.generateGeodatabase(params, file, false, statusCallback,
gdbResponseCallback);
}
同步方法
同步代码如下,SyncGeodatabaseParameters主要用来针对Geodatabase的,就是你需要同步的Geodatabase文件。statusCallback是指你同步成功与否的回调方法,里面有状态的返回码,至于Listener并没有太多可以使用的地方,至少我这么认为,最后我们还需要使用GeodatabaseSyncTask去进行同步操作。但是这个方法我写到工具类里面没有成功过,我放在了activity下面便可以使用,虽然我的是10.2.7。
public void syncGeodatabase(Geodatabase geodatabase,
GeodatabaseSyncTask task, String url) {
// 同步的params,一般来说请求对象
SyncGeodatabaseParameters syncparams = null;
try {
// 第一个参数就是你的geodatabase文件
syncparams = geodatabase.getSyncParameters();
} catch (Exception e) {
e.printStackTrace();
}
GeodatabaseStatusCallback statusCallback = new GeodatabaseStatusCallback() {
public void statusUpdated(GeodatabaseStatusInfo status) {
String a = status.getStatus().toString();
// 这里有很多状态,会在文档上显示
if (a.equals("Completed"))
Log.e("-----------", status.getStatus() + "");
}
};
CallbackListener<Map<Integer, GeodatabaseFeatureTableEditErrors>> syncResponseCallback = new CallbackListener<Map<Integer, GeodatabaseFeatureTableEditErrors>>() {
public void onCallback(
Map<Integer, GeodatabaseFeatureTableEditErrors> objs) {
// TODO Auto-generated method stub
}
public void onError(Throwable e) {
// TODO Auto-generated method stub
}
};
// 最后我们还是需要GeodatabaseSyncTask进行同步
if (task == null) {
Log.e("syncError", "同步出错");
task = new GeodatabaseSyncTask(url, null);
}
task.syncGeodatabase(syncparams, geodatabase, statusCallback,
syncResponseCallback);
Log.e("syncError", "同步成功");
}
这些状态可以供大家挑选,我一般只看completed和failed,in_progress是进行中pending是准备中
后面我们会继续介绍编辑和查询,本人刚做gis几个月,轻喷!!!