9

我正在努力为 GeoDjango 安装 Spatialite!

我已经在使用 Homebrew,它通常简单方便,所以我最初尝试按照GeoDjango的Homebrew 说明进行操作。

但这没有安装任何数据库,即 Spatialite。下一步是尝试安装 Spatialite 本身,但 Django 文档没有提供特定于 Homebrew 的说明。

我发现这个教程看起来很完美——一个 Homebrew 和 virtualenv-friendly 安装的 Spatialite for GeoDjango。

但它不起作用......似乎我pysqlite的链接是与 OS X 附带的非空间启用版本的 SQLite 相关联,而不是我从 Homebrew 安装的空间化版本,当 Django 尝试时出现此错误连接到数据库:

“pysqlite 库不支持 C 扩展加载。SQLite 和 pysqlite 都必须配置为允许加载扩展才能使用 SpatiaLite。”

pysqlite 的作者没有回应我在 Github 上的求助请求,我也没有通过谷歌找到任何东西。

所以我回到绘图板并决定遵循 GeoDjango 文档中的“Mac OS X 特定说明” ......通过安装来自 KyngChaos 二进制包的各种地理库。

文档说“按照上面列出的顺序安装软件包”,但我发现如果不先安装就无法UnixImageIO安装PROJ。文档中下载 Spatialite 二进制文件的链接 ( http://www.gaia-gis.it/spatialite-2.3.1/binaries.html ) 已损坏,因此我使用了 KyngChaos 的“Spatialite Tools v4.1”。

继续下一步,我收到此错误:

$ spatialite geodjango.db "SELECT InitSpatialMetaData();"  
SQLite header and source version mismatch  
2013-10-17 12:57:35 c78be6d786c19073b3a6730dfe3fb1be54f5657a  
2013-09-03 17:11:13 7dd4968f235d6e1ca9547cda9cf3bd570e1609ef

目前还不确定出了什么问题。

SO上还有其他人已经走了KyngChaos路线,最终得到了我从Homebrew路线得到的相同的“SQLite和pysqlite都必须配置为允许加载扩展”错误。

我发现这张票 #17756用于添加pyspatialite对 Django 的支持 -pyspatialite应该是一种更简单的方法,pip install但不幸的是它也不起作用(请参阅票底部的评论)。

我有点不愿意开始尝试手动从源代码构建所有内容,因为我可能会再次遇到同样的问题,但要花几个小时在谷歌上搜索有关神秘编译器错误、魔术标志和路径等的信息.

我准备放弃,只使用 Postgres/PostGIS。

4

3 回答 3

4

I was able to get this working now, using the tip here:
https://github.com/ghaering/pysqlite/issues/60#issuecomment-50345210

I'm not sure if it was using the real paths that fixed it, or just the Homebrew kegs or underlying packages have been updated and now install cleanly. Still, it works now.

I reproduce below the steps I took:

brew update
brew install sqlite  # 3.8.5
brew install libspatialite  # 4.2.0
brew install spatialite-tools  # 4.1.1

git clone https://github.com/ghaering/pysqlite.git
cd pysqlite

(where brew reported I had existing versions I unlinked them and installed the latest as commented above)

then edited setup.cfg to comment out #define=SQLITE_OMIT_LOAD_EXTENSION and specify the paths:

include_dirs=/usr/local/opt/sqlite/include
library_dirs=/usr/local/opt/sqlite/lib

activated the virtualenv where I want it installed, then

python setup.py build
python setup.py install

(build_static still fails with clang: error: no such file or directory: 'sqlite3.c')

(maybe I should have done pip install . as suggested in the github issue)

now the spatialite geodjango.db "SELECT InitSpatialMetaData();" succeeds, albeit with an ignorable error:

InitSpatiaMetaData() error:"table spatial_ref_sys already exists"

i.e. it's probably not even necessary to run that command

于 2014-09-08T09:37:15.003 回答
3

当我安装这个时,我按照这个说明https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/spatialite/#pysqlite2

pysqlite2

如果您决定使用更新版本的 pysqlite2 而不是 sqlite3 Python stdlib 模块,那么您需要确保它可以加载外部扩展(即所需的 enable_load_extension 方法可用,以便可以加载 SpatiaLite)。

这可能涉及自己构建它。为此,请下载 pysqlite2 2.6,然后解压缩:

$ wget https://pypi.python.org/packages/source/p/pysqlite/pysqlite-2.6.3.tar.gz
$ tar xzf pysqlite-2.6.3.tar.gz
$ cd pysqlite-2.6.3

接下来,使用文本编辑器(例如,emacs 或 vi)编辑 setup.cfg 文件,如下所示:

[build_ext]
#define=
include_dirs=/usr/local/include
library_dirs=/usr/local/lib
libraries=sqlite3
#define=SQLITE_OMIT_LOAD_EXTENSION
于 2013-12-21T00:35:55.237 回答
1

我有同样的错误:SQLite header and source version mismatch

对我来说,更新就足够了libsqlite3-dev

之后调用$ spatialite geo.db "SELECT InitSpatialMetaData();"创建适当的数据库。

于 2014-09-08T08:11:53.017 回答