【问题标题】:Install Spatialite for python (GeoDjango) on OS X在 OS X 上安装 Spatialite for python (GeoDjango)
【发布时间】:2013-12-28 15:08:19
【问题描述】:

我正在为 GeoDjango 安装 Spatialite!

我已经在使用 Homebrew,它通常简单方便,所以我最初尝试关注 Homebrew instructions 获取 GeoDjango。

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

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

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

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

pysqlite 的作者没有回复my pleas for help on Github 也没有通过谷歌找到任何东西。

所以我回到绘图板并决定遵循 GeoDjango 文档中的"Mac OS X-specific instructions"...通过安装 KyngChaos 二进制包中的各种地理库。

文档说“按照上面列出的顺序安装软件包”,但我发现如果不先安装 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

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

还有其他人 here on SO 走上了 KyngChaos 路线,结果却是相同的“SQLite 和 pysqlite 都必须配置为允许加载扩展” 我从无论如何都是自制路线。

我发现 this ticket #17756 为 Django 添加了 pyspatialite 支持 - pyspatialite 应该是 pip install 一切的更简单方法,但不幸的是它也不起作用(请参阅票底部的 cmets)。

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

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

【问题讨论】:

    标签: django sqlite geodjango pysqlite spatialite


    【解决方案1】:

    当我安装这个时,我按照这个说明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 文档(我已经完成)更复杂
    • 我错过了哪一部分,抱歉回答不完整
    • 我已经构建了启用扩展支持的 pysqlite,但它似乎与我的 SQLite 系统安装而不是我通过 Homebrew 安装的支持 GIS 的 SQLite 相关联...问题在此处详述github.com/ghaering/pysqlite/issues/60
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案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"

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

      【讨论】:

        猜你喜欢
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        • 2013-07-12
        相关资源
        最近更新 更多