在RSQLite中加载空间扩展崩溃R(OS X& Ubuntu)

时间:2013-08-07 15:21:27

标签: r sqlite spatialite

我正在针对一个空间数据库运行一些查询,并希望将数据直接输入到R. This page建议我可以这样做:

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自制定义中,它说它依赖于sqlite&gt; 3.7.3。我自制的sqlite版本是3.7.17

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

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

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

UPDATE:

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

1 个答案:

答案 0 :(得分:2)

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

最后,我的(短期的,临时的,hackish)解决方案是创建一个R包,它编译自己的spaceite并加载它。 RSQLite.spatialite can be found here