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

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

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

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

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

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

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

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

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

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

Ответ 1

Мне удалось получить эту работу сейчас, используя подсказку здесь:
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')

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

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

InitSpatiaMetaData() error:"table spatial_ref_sys already exists"

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

Ответ 2

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

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

Ответ 3

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

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

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