ngageoint/geopackage-android 从 android 编写 GPKG

问题描述 投票:0回答:1

我有一个项目,我必须将坐标数据导出到 GPKG 中,其中媒体作为 blob 从我的应用程序中导出,以便可以在 QGIS 中打开。 我在这个领域完全没有经验,并且已经奋斗了好几天才找到可行的东西。

我的想法是在我的资产文件中拥有一个已经构建的 gpkg,使用 ngageoint/geopackage-android (和 ios)打开它并填充 FeatureTable / FeatureRow / GeometryColumns。

所以我已经准备好一个 GPKG 和我的 3 个表,其余的都是由 QGIS 生成的。

我也有所有的触发器:

在 Android 上,我像这样插入功能行:

private fun manageExportTrackPointsGpkg(geoPackage: GeoPackage, appPoint: AppPoint) {
   val featureDao = geoPackage.getFeatureDao("track_points")

   val point = Point(appPoint.latitude, appPoint.longitude)

   val newRow = featureDao.newRow()
   newRow.geometry = GeoPackageGeometryData.createAndWrite(point)
   /// other values...
   newRow.setValue("timeStamp", ...)
        
   featureDao.insert(newRow)
}

这部分有效(我认为)。

但是表 gpkg_contents 没有更新。所以我手动完成:

val trackPointsFeatureDao = geoPackage.getFeatureDao("track_points")
val trackPointsContent = trackPointsFeatureDao.contents
trackPointsContent.lastChange = Date()
trackPointsContent.minY = pointMinY
trackPointsContent.maxY = pointMaxY
trackPointsContent.minX = pointMinX
trackPointsContent.maxX = pointMaxX
val update = geoPackage.contentsDao.update(trackPointsContent)

表格现已更新。

但是空间表的触发器不起作用,因此空间数据未填充。

CREATE TRIGGER "rtree_track_points_geom_insert" AFTER INSERT ON "track_points" WHEN (new."geom" NOT NULL AND NOT ST_IsEmpty(NEW."geom")) BEGIN INSERT OR REPLACE INTO "rtree_track_points_geom" VALUES (NEW."fid",ST_MinX(NEW."geom"), ST_MaxX(NEW."geom"),ST_MinY(NEW."geom"), ST_MaxY(NEW."geom")); END

显然 ST_IsEmpty 不存在?

所以当我在 QGIS 上加载 gpkg 时,什么也没有显示。 我找不到任何方法来更新空间表,并且原始查询不起作用

(1) no such module: rtree in "INSERT INTO rtree_track_points_geom(minx, maxx, miny, maxy) VALUES (?, ?, ?, ?)"

我无法找到有关如何使用该库写入 GPKG 的明确文档。

我做错了什么?如何轻松写入GPKG?

提前致谢。

android kotlin android-sqlite qgis geopackage
1个回答
0
投票

您的问题,找不到rtree模块似乎表明正在触发触发器,并且正在尝试将行插入或替换到rtree_track_points_geom表中,但模块rtree不是注册模块.

  • 虚拟表,即rtree_track_points_geom,是由模块“控制”的特殊表。

    • 从 SQL 语句的角度来看,虚拟表对象看起来就像任何其他表或视图。但在幕后,虚拟表上的查询和更新会调用虚拟表对象的回调方法,而不是在数据库文件上读写。按照https://www.sqlite.org/vtab.html

rtree(R*Tree)模块是 SQLite 提供的模块,但默认情况下处于禁用状态。

SQLite 的 makefile 有一个用于构建合并的“sqlite3.c”目标,以包含核心 SQLite 库以及 FTS3、FTS5、RTREE、DBSTAT、JSON1、RBU 和 SESSION 扩展的所有 C 代码。该文件包含大约 238K 行代码(如果省略空行和注释,则为 145K),大小超过 8.4 MB(截至 2021 年 12 月 29 日)。

虽然“sqlite3.c”合并文件中包含各种扩展,但使用#ifdef语句禁用它们。使用编译时选项激活扩展,例如:

  • -DSQLITE_ENABLE_FTS3
  • -DSQLITE_ENABLE_FTS5
  • -DSQLITE_ENABLE_RTREE
  • -DSQLITE_ENABLE_DBSTAT_VTAB
  • -DSQLITE_ENABLE_RBU
  • -DSQLITE_ENABLE_SESSION

表示 FTS3 和 FTS5 通常在 Android 发行版中启用。

要解决此问题,您需要一个包含启用的 RTree 的 SQLite 发行版。

您可能会发现这很有用Android SQLite R-Tree - 如何安装模块?

© www.soinside.com 2019 - 2024. All rights reserved.