Java 使用ESRI android API打开文件地理数据库
有一段时间,我试图在android上使用10.2版的ESRI api打开文件godatabase 我有一个用Arccatalog 10.1制作的文件数据库。它包含一层。我可以在Arcmap中打开它,这样这里的一切看起来都很好。 地理数据库位于名为android.gdb的文件夹中 我将其复制到microSD卡,并尝试使用以下代码打开它:Java 使用ESRI android API打开文件地理数据库,java,android,gis,esri,Java,Android,Gis,Esri,有一段时间,我试图在android上使用10.2版的ESRI api打开文件godatabase 我有一个用Arccatalog 10.1制作的文件数据库。它包含一层。我可以在Arcmap中打开它,这样这里的一切看起来都很好。 地理数据库位于名为android.gdb的文件夹中 我将其复制到microSD卡,并尝试使用以下代码打开它: new com.esri.core.gdb.Geodatabase("/mnt/sdcard2/android.gdb"); “/mnt/sdcard2/and
new com.esri.core.gdb.Geodatabase("/mnt/sdcard2/android.gdb");
“/mnt/sdcard2/android.gdb”文件存在,是一个文件夹,我有读写权限
我得到了一个RuntimeException,消息是数据库文件无法打开
有人对此有类似的问题吗?用于android的ESRI运行时api将无法打开此类数据库。它使用SQLLite中内置的地理数据库的专有版本。您需要在ArcGisOnline或ArcServer 10.2中发布服务,并调用GeodatabaseSyncTask对象,以便在设备上获得正确格式的数据库版本。在发布的功能服务上,您需要确保已启用同步。然后,您可以利用此代码调用功能部件服务并将其存储在本地。此代码基于此ESRI样本--
public void LoadGdb(用户凭据、多边形范围、空间引用spatRef){
mapExtent=范围;
mapSpatialRef=spatRef;
String replicaUrl=callingActivity.getResources().getString(R.String.feature\u service\u url);
gdbTask=新的GeodatabaseSyncTask(复制URL、凭据);
gdbTask.fetchFeatureServiceInfo(新CallbackListener(){
@凌驾
公共无效申报人(可丢弃的e){
Log.e(标签“,”e);
}
@凌驾
公共void onCallback(FeatureServiceInfo objs){
if(objs.isSyncEnabled()){
requestGdbInOneMethod(gdbTask、mapExtent、mapSpatialRef);
}
}
});
}
受保护的void requestGdbInOneMethod(GeodatabaseSyncTask GeodatabaseSyncTask、多边形范围、空间参考spatRef){
GenerateGeodatabaseParameters=new GenerateGeodatabaseParameters({0,1},区段,
spatRef,true,SyncModel.LAYER,spatRef);
CallbackListener GDBResponsecCallback=新CallbackListener(){
@凌驾
公用void onCallback(字符串obj){
试一试{
//在GenerateGoDatabase之后调用此onCallback
//调用GeodatabaseSyncTask上的函数。
//您可以存储对此数据库的引用,也可以加载它
//并将其指向gdbFileName位置
地理数据库myGeodatabase=(地理数据库)obj;
}catch(filenotfounde异常){
e、 printStackTrace();
}
}
@凌驾
公共无效申报人(可丢弃的e){
Log.e(标签“,”e);
}
};
GeodatabaseStatusCallback statusCallback=新的GeodatabaseStatusCallback(){
@凌驾
公共无效状态已更新(GeodatabaseStatusInfo状态){
showMessage(callingActivity,status.getStatus().toString());
}
};
//!!gdbFileName是路径和文件名的字符串
//地理数据存储的位置。
geodatabaseSyncTask.generateGeodatabase(参数、gdbFileName、false、statusCallback、gdbResponseCallback);
}
要加载本地文件,您需要使用ArcGIS Desktop 10.2.1或更高版本生成扩展名为*.Geodatabase的运行时地理数据库文件。请参见此处的说明:
public void LoadGdb(UserCredentials credentials, Polygon extent, SpatialReference spatRef){
mapExtent = extent;
mapSpatialRef = spatRef;
String replicaUrl = callingActivity.getResources().getString(R.string.feature_service_url);
gdbTask = new GeodatabaseSyncTask(replicaUrl, credentials);
gdbTask.fetchFeatureServiceInfo(new CallbackListener<FeatureServiceInfo>() {
@Override
public void onError(Throwable e) {
Log.e(TAG, "", e);
}
@Override
public void onCallback(FeatureServiceInfo objs) {
if (objs.isSyncEnabled()) {
requestGdbInOneMethod(gdbTask, mapExtent, mapSpatialRef);
}
}
});
}
protected void requestGdbInOneMethod(GeodatabaseSyncTask geodatabaseSyncTask, Polygon extent, SpatialReference spatRef) {
GenerateGeodatabaseParameters params = new GenerateGeodatabaseParameters({0, 1}, extent,
spatRef, true, SyncModel.LAYER, spatRef);
CallbackListener<String> gdbResponseCallback = new CallbackListener<String>() {
@Override
public void onCallback(String obj) {
try {
// This onCallback gets called after the generateGeodatabase
// function on the GeodatabaseSyncTask is called.
// You can store a reference to this database or you can load it
// with your code and point it to the gdbFileName location
Geodatabase myGeodatabase = (Geodatabase)obj;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "", e);
}
};
GeodatabaseStatusCallback statusCallback = new GeodatabaseStatusCallback() {
@Override
public void statusUpdated(GeodatabaseStatusInfo status) {
showMessage(callingActivity, status.getStatus().toString());
}
};
// !! THE gdbFileName is a string of the path and filename
// where the geodatabse will be stored.
geodatabaseSyncTask.generateGeodatabase(params, gdbFileName, false, statusCallback, gdbResponseCallback);
}