【问题标题】:Load spatialite extension in RSQLite crashes R (OS X & Ubuntu)在 SQLite 崩溃 R(OSX 和 Ubuntu)中加载空间扩展
【发布时间】:2013-08-07 15:21:26
【问题描述】:

我正在对空间数据库运行一些查询,并希望将数据直接导入 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 > 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 以源代码形式下载并通过自制软件安装

更新:

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

【问题讨论】:

  • Mac 分支的维护者 Simon Urbanek 建议不要使用任何 MacPorts、Homebrew 或 Fink 来安装外部包。
  • 外部包是什么意思?非 R 系统库?对于spatialite,我什至不知道在哪里下载预构建的二进制文件。如果我是从源代码构建,我会完全按照 homebrew 的方式进行。
  • 是的,如果您更喜欢非 R 系统库。 markmail.org/message/… 据我了解,问题出现是因为源被构建到“错误”目录中。通过发布到 Mac-R 邮件列表,您可以获得更多知识渊博的建议。
  • 据我所知,没有任何版本的 libspatialite 可通过 R 打包方式获得。

标签: r sqlite spatialite


【解决方案1】:

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

最后,我的(短期的、临时的、骇人听闻的)解决方案是创建一个 R 包,它编译自己的空间数据并加载它。 RSQLite.spatialite can be found here.

【讨论】:

    猜你喜欢
    • 2017-01-16
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2012-02-04
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多