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

时间:2014-02-02 11:37:50

标签: java android gis esri

有一段时间我试图在版本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文件的消息。

任何人都有类似的问题吗?

2 个答案:

答案 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