我正在针对一个空间数据库运行一些查询,并希望将数据直接输入到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下尝试了相同的结果:
使用Ubuntu FOSS GIS存储库提供的libspatialite5在Ubuntu 13.04中确认崩溃。
答案 0 :(得分:2)
似乎最近版本的libspatialite(4.x)存在问题。此外,加载自制的libspatialite3扩展可以工作,但后续查询导致了相同的段错误。
最后,我的(短期的,临时的,hackish)解决方案是创建一个R包,它编译自己的spaceite并加载它。 RSQLite.spatialite can be found here