Java 使用ESRI android API打开文件地理数据库

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

有一段时间,我试图在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/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);
}