有一段时间我试图在版本10.2中使用ESRI api在Android上打开文件godatabase。
我有一个用Arccatalog 10.1制作的文件godatabase。它包含一层。我可以在Arcmap中打开它,所以这里的一切看起来都很好。 地理数据库位于名为android.gdb的文件夹中 我将其复制到microSD卡并尝试使用以下代码打开它:
new com.esri.core.gdb.Geodatabase("/mnt/sdcard2/android.gdb");
“/mnt/sdcard2/android.gdb”文件存在且是一个文件夹,我有读写权限。
我收到一个RuntimeException,其中包含无法打开goedatabase文件的消息。
任何人都有类似的问题吗?
答案 0 :(得分:1)
用于android的ESRI运行时api无法打开那种数据库。它使用在SQLLite中构建的专有版本的地理数据库。您需要在ArcGisOnline或ArcServer 10.2中发布服务并调用GeodatabaseSyncTask对象,以便以正确的格式将数据库版本添加到设备上。在已发布的要素服务上,您需要确保启用了同步。然后,您可以使用此代码调用您的要素服务并将其存储在本地。此代码基于此ESRI示例 - https://developers.arcgis.com/android/sample-code/offline-editor/
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);
}
答案 1 :(得分:1)
要加载本地文件,您需要使用ArcGIS Desktop 10.2.1或更高版本生成具有* .geodatabase文件扩展名的运行时地理数据库文件。请参阅此处的说明:http://resources.arcgis.com/en/help/main/10.2/index.html#//00660000045q000000