在OS X上为Python(GeoDjango)安装Spatialite

10

我一直在尝试为GeoDjango安装Spatialite,但是遇到了很多问题。

我已经在使用Homebrew了,它通常很容易和方便,所以我最初尝试遵循GeoDjango的Homebrew说明

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

我找到了这篇文章,看起来非常完美-可以为GeoDjango安装Homebrew和virtualenv友好的Spatialite。

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

"The pysqlite library does not support C extension loading. Both SQLite and pysqlite must be configured to allow the loading of extensions to use SpatiaLite."

pysqlite的作者没有回应我的Github请求,我也没有在Google上找到任何有用的信息。

所以我回到原点,决定遵循GeoDjango文档中的"Mac OS X-specific instructions",通过从KyngChaos二进制包中安装各种地理库来安装Spatialite。

文档说“按照上面列出的顺序安装软件包”,但是我发现我无法在不先安装PROJ的情况下安装UnixImageIO。文档中下载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

目前我不是很确定问题出在哪里。

这里的某个人也采用了KyngChaos的方法,并最终遇到了与我从Homebrew方法中得到的相同的错误提示“Both SQLite and pysqlite must be configured to allow the loading of extensions”。

我发现这个票 #17756为Django添加pyspatialite支持 - pyspatialite应该是使用pip install安装所有东西的更简单的方法,但不幸的是它也无法工作(请参见票底部的评论)。

我有点不愿意开始尝试手动构建所有内容,因为我觉得我很可能会再次遇到相同的问题,同时还要花费数小时搜索有关神秘编译器错误、魔法标志和路径等信息。

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

3个回答

4
我现在已经可以让它工作了,使用了这里的提示:
https://github.com/ghaering/pysqlite/issues/60#issuecomment-50345210 我不确定是使用真实路径解决了问题,还是Homebrew正在更新kegs或底层包并且现在可以干净地安装。无论如何,现在它都能工作了。
下面是我采取的步骤:
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

激活虚拟环境并将其安装在我想要的位置,然后...

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" 也就是说,可能根本不需要运行该命令。

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

谢谢,但您需要阅读我问题中的所有内容,我的问题比只是按照Django文档(我已经这样做了)更加复杂。 - Anentropic
我错过了哪一部分,抱歉回答不完整。 - user1959508
我已经构建了启用扩展支持的pysqlite,但它似乎链接到我的系统安装的SQLite,而不是通过Homebrew安装的GIS-enabled SQLite...问题详见此处https://github.com/ghaering/pysqlite/issues/60 - Anentropic

1

我遇到了相同的错误:SQLite头文件和源代码版本不匹配

对我来说,只需更新libsqlite3-dev即可。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接