Установите Spatialite для Python (GeoDjango) на OS X

Я рву свои волосы, пытаясь установить Spatialite для GeoDjango!

Я уже использую Homebrew, это обычно просто и удобно, поэтому я сначала попытался следовать инструкциям Homebrew для GeoDjango.

Но это останавливается до установки любой базы данных, то есть Spatialite. Следующим шагом является попытка установить Spatialite, но в Django docs нет инструкций для Homebrew.

Я нашел этот учебник, который выглядит идеально - это Homebrew и виртуально дружественная установка Spatialite для GeoDjango.

Но это не работает... кажется, что мой pysqlite связан с версией SQLite без пространственной поддержки, которая поставляется с OS X, а не с версией Spatial-ised, которую я установил из Homebrew, я получаю эту ошибку, когда Django пытался подключиться к базе данных:

"Библиотека pysqlite не поддерживает загрузку расширений C. Как SQLite, так и pysqlite должны быть настроены так, чтобы загрузка расширений могла использовать SpatiaLite".

Автор pysqlite не ответил на мои просьбы о помощи на Github, и я ничего не нашел через Google.

Поэтому я вернулся к чертежной доске и решил следовать "инструкциям, специфичным для Mac OS X" в документации GeoDjango..., установив различные географические библиотеки из двоичных пакетов KyngChaos.

В документах написано "Установите пакеты в порядке, указанном выше", но я обнаружил, что не могу установить UnixImageIO без установки PROJ первый. Ссылка на документы для загрузки бинарных файлов Spatialite ( http://www.gaia-gis.it/spatialite-2.3.1/binaries.html) не работает, поэтому вместо этого я использовал "Spatialite Tools v4.1" из KyngChaos.

Переходя к следующему шагу, я получаю эту ошибку:

$ 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, и у него просто одна и та же ошибка "И SQLite, и pysqlite должны быть настроены так, чтобы разрешать загрузку расширений", которую я все равно получил по маршруту Homebrew.

Я нашел этот билет #17756 для добавления pyspatialite поддержка Джанго - pyspatialite должен быть более простым способом pip install все, но, к сожалению, это тоже не работает (см. комментарии к нижней части билета).

Я немного неохотно начинаю пытаться собирать все из исходного кода вручную, так как кажется вероятным, что я просто снова столкнусь с теми же проблемами, но потрачу на поиски загадочных ошибок компилятора, магических флагов, путей и т. Д.,

Я готов сдаться и просто использовать Postgres/PostGIS.

3 ответа

Решение

Я смог заставить это работать сейчас, используя подсказку здесь:
https://github.com/ghaering/pysqlite/issues/60

Я не уверен, что он использовал реальные пути, которые это исправили, или же кеги 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')

(возможно, я должен был сделать pip install . как предложено в выпуске github)

теперь spatialite geodjango.db "SELECT InitSpatialMetaData();" успешно, хотя и с игнорируемой ошибкой:

InitSpatiaMetaData() error:"table spatial_ref_sys already exists"

то есть, вероятно, даже не нужно запускать эту команду

Когда я рассказывал об этом, я следовал этим инструкциям https://docs.djangoproject.com/en/dev/ref/contrib/gis/install/spatialite/

pysqlite2

Если вы решили использовать более новую версию pysqlite2 вместо модуля sqlite3 Python stdlib, то вам нужно убедиться, что он может загружать внешние расширения (т. Е. Необходим необходимый метод enable_load_extension, чтобы можно было загрузить SpatiaLite).

Это может включать в себя создание его самостоятельно. Для этого скачайте pysqlite2 2.6 и untar:

$ 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

У меня была такая же ошибка: SQLite header and source version mismatch,

Для меня было достаточно обновить libsqlite3-dev,

После этого вызывая $ spatialite geo.db "SELECT InitSpatialMetaData();" создает правильную базу данных.

Другие вопросы по тегам