0

我正在对空间数据库运行一些查询,并希望将数据直接导入 R。此页面建议我可以执行以下操作:

library(RSQLite)
sqldrv <- dbDriver("SQLite") 
con <- dbConnect(sqldrv, dbname = "/path/to/db.sqlite",loadable.extensions = TRUE)  
spatialitestatus <- dbGetQuery(con, "SELECT load_extension('libspatialite.dylib')")

但是当我这样做时,R 会出现以下错误:

 *** caught segfault ***
address 0x0, cause 'memory not mapped'

Traceback:
 1: .Call("RS_SQLite_fetch", rsId, nrec = n, PACKAGE = .SQLitePkgName)
 2: sqliteFetch(rs, n = -1, ...)
 3: sqliteQuickSQL(conn, statement, ...)
 4: dbGetQuery(con, "SELECT load_extension('/usr/local/lib/libspatialite.dylib')")
 5: dbGetQuery(con, "SELECT load_extension('/usr/local/lib/libspatialite.dylib')")

就我而言,spatialite 是使用 Homebrew 从源代码构建的,我通常使用的 sqlite 版本也是如此。在 libspatialite homebrew 定义中,它说它取决于 sqlite > 3.7.3。我自制的 sqlite 版本是 3.7.17

我不确定默认情况下会引入哪个版本的 sqlite RSQLite,但我认为它是 RSQLite 源包中包含的 3.7.17 版本。我尝试使用从源代码构建 RSQLite install.packages(c("RSQLite"), type="source"),希望它只会使用我的 sqlite 版本,但它看起来不像。或者,如果确实如此,它仍然会崩溃。

最后,我应该提到我在两个版本的 R 下尝试了这个,结果相同:

  • 从 CRAN 以二进制形式下载的 R 3.0.0
  • R 3.0.1 以源代码形式下载并通过自制软件安装

更新:

使用 Ubuntu FOSS GIS 存储库提供的 libspatialite5 在 Ubuntu 13.04 中确认了崩溃。

4

1 回答 1

2

似乎最新版本的 libspatialite (4.x) 存在问题。此外,加载自制的 libspatialite3 扩展工作,但随后的查询导致相同的段错误。

最后,我的(短期、临时、骇人听闻的)解决方案是创建一个 R 包,该包编译它自己的 spaceite 并加载它。RSQLite.spatialite 可以在这里找到

于 2013-08-10T22:19:14.087 回答