在OS X上安装python(GeoDjango)的Spatialite

时间:2013-12-10 21:28:48

标签: django sqlite geodjango pysqlite spatialite

我正在试图为GeoDjango安装Spatialite!

我已经在使用Homebrew了,它通常很简单方便,所以我最初尝试按照Homebrew instructions进行GeoDjango。

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

我发现this tutorial看起来很完美 - 一个Homebrew和virtualenv友好的Spatialite for GeoDjango安装。

但它不起作用......似乎我的pysqlite与OS X附带的非空间启用的SQLite版本相关联,而不是我从Homebrew安装的Spatial-ised版本,当Django尝试连接到db时,我收到此错误:

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

pysqlite的作者尚未回复my pleas for help on Github而我没有通过Google找到任何内容。

所以我回到绘图板并决定遵循GeoDjango文档中的"Mac OS X-specific instructions" ...通过安装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

目前还不确定是什么问题。

还有其他人here on SO已经离开了KyngChaos路线并且最终得到了相同的“SQLite和pysqlite都必须配置为允许加载扩展”错误我得到了无论如何,从Homebrew路线。

我发现this ticket #17756用于向Django添加pyspatialite支持 - pyspatialite应该是pip install所有内容的简单方法,但不幸的是它也不起作用(请参阅对底票的评论)。

我有点不愿意开始尝试从源头手动构建所有东西,因为我似乎可能会再次遇到同样的问题,但花费数小时谷歌搜索关于神秘的编译器错误,魔术标志和路径等的信息一路上。

我准备放弃并使用Postgres / PostGIS。

3 个答案:

答案 0 :(得分:3)

当我正在进行此操作时,请按照此说明https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/spatialite/#pysqlite2

进行操作

<强> pysqlite2

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

这可能涉及自己构建它。为此,请下载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

答案 1 :(得分:3)

我现在可以使用这里的提示来实现这一点:
https://github.com/ghaering/pysqlite/issues/60#issuecomment-50345210

我不确定它是否使用了修复它的真实路径,或者只是Homebrew桶或底层软件包已经更新,现在安装得很干净。不过,它现在有效。

我在下面的步骤中重现:

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

(brew报道我有现有版本,我取消了它们并安装了上面评论的最新版本)

然后修改setup.cfg以注释掉#define=SQLITE_OMIT_LOAD_EXTENSION并指定路径:

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

激活了我想要安装的virtualenv,然后

python setup.py build
python setup.py install

build_static仍然失败,clang: error: no such file or directory: 'sqlite3.c'

(也许我应该按照github问题的建议完成pip install .

现在spatialite geodjango.db "SELECT InitSpatialMetaData();"成功了,尽管有一个可忽略的错误:

InitSpatiaMetaData() error:"table spatial_ref_sys already exists"

即。它可能甚至不需要运行该命令

答案 2 :(得分:1)

我遇到了同样的错误:SQLite header and source version mismatch

对我而言,更新libsqlite3-dev就足够了。

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