Установите 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();"
создает правильную базу данных.