GeoDjango 使用 PostgreSQL 前如何安装 PostGIS 并创建空间数据库
2026/9/13 3:49:53 网站建设 项目流程

GeoDjango 使用 PostgreSQL 前如何安装 PostGIS 并创建空间数据库

【免费下载链接】djangoThe Web framework for perfectionists with deadlines.项目地址: https://gitcode.com/GitHub_Trending/dj/django

在 Django 项目里启用 GeoDjango 并以 PostgreSQL 作为空间数据库时,PostgreSQL 本身并不直接支持地理对象——需要先安装 PostGIS 把它变成空间数据库,再创建一个启用了postgis扩展的数据库。本文按 安装 PostGIS 的官方文档 和 GeoDjango 安装文档 给出这条完整路径:安装 PostGIS 与配套地理库、创建空间数据库并启用扩展,最后通过 Django 的migrate验证。

准备条件

按 GeoDjango Installation,GeoDjango 安装总体上需要三样东西:Python 与 Django、一个空间数据库、一组地理空间库。其中:

  • PostgreSQL 支持版本为 15+,且必须要求 PostGIS(PostGIS 在文档中被推荐,因为它是"最成熟、功能最丰富的开源空间数据库")。
  • PostGIS 支持版本为 3.2–3.6,配套的库版本要求见 Installing Geospatial libraries:GEOS(3.10–3.14)、PROJ(6.x–9.x,PostgreSQL 和 SQLite 才需要)、GDAL(3.3–3.13)都是必装项。
  • Python 数据库适配器:使用 GeoDjango 配 PostGIS 时,需要psycopgpsycopg2模块。
  • 如果打算从源码编译 PostGIS,文档要求先安装 GEOS、PROJ、GDAL 这三个库,并按 PostGIS requirements 检查是否还需要其他库。

安装 PostGIS(以 Debian/Ubuntu 为例)

在 Debian/Ubuntu 上,官方文档建议直接安装以下软件包(x替换为你要安装的 PostgreSQL 版本号):

sudo apt-get install postgresql-x postgresql-x-postgis-3 postgresql-server-dev-x python3-psycopg3

这条命令同时解决了 PostGIS 扩展和psycopg适配器两个依赖。文档同时说明:也可以 build from source,但编译时要求紧跟上游说明。

另外,Installing Geospatial libraries 建议在 Debian/Ubuntu 上安装地理库:

sudo apt-get install binutils libproj-dev gdal-bin

这两个命令都会修改系统软件包环境,需要 root 权限。macOS 和 Windows 的平台特定安装方式(Homebrew、Stack Builder 等)在 安装文档 中有专门章节,本文不展开。

创建空间数据库并启用 postgis 扩展

PostGIS 通过 PostgreSQL 的扩展机制提供空间功能。安装 PostGIS 文档 给出的操作是(<db name>替换为你自己的数据库名):

$ createdb <db name> $ psql <db name> > CREATE EXTENSION postgis;

执行CREATE EXTENSION postgis;时,当前数据库用户必须是 superuser。文档同时说明:这条命令在migrate过程中也会执行,所以如果你让 Django 自己管理迁移,也可以不手工执行。

如果不想手工进psql,文档给出的替代方式是在项目中写一个迁移操作:

from django.contrib.postgres.operations import CreateExtension from django.db import migrations class Migration(migrations.Migration): operations = [CreateExtension("postgis"), ...]

两个可选扩展,仅在你确认需要时再装:

  • 要用 PostGIS 的 raster 功能,启用postgis_raster:通过上面的CreateExtension迁移操作,或直接执行CREATE EXTENSION postgis_raster;
  • postgis_topology:GeoDjango 目前没有用到 PostGIS 的 topology 功能,文档只是说如果将来要用可以再执行CREATE EXTENSION postgis_topology;

文档示例:创建 geodjango 用户和数据库

安装 PostGIS 文档 展示了以postgres用户在 SQL Shell 中创建geodjango空间数据库和用户的方式:

postgres# CREATE USER geodjango PASSWORD 'my_passwd'; postgres# CREATE DATABASE geodjango OWNER geodjango;

这是文档中的示例:my_passwd只是示例值,实际使用时替换为你自己的密码。数据库管理入口可以是 pgAdmin,也可以是 SQL Shell(文档以Start --> PostgreSQL X --> SQL Shell菜单路径为例)。

在 Django 中配置 postgis 后端

数据库就绪后,GeoDjango Tutorial 给出的最小配置是编辑settings.py

DATABASES = { "default": { "ENGINE": "django.contrib.gis.db.backends.postgis", "NAME": "geodjango", "USER": "geo", }, }

ENGINE必须是空间后端之一,PostgreSQL 对应的是django.contrib.gis.db.backends.postgis(见 GeoDjango Database API)。注意不要写成 Django 普通 PostgreSQL 后端——安装文档 明确要求把ENGINE设置为一个 spatial backend。

同时把django.contrib.gis加入INSTALLED_APPS,例如:

INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", "django.contrib.gis", "world", ]

不加django.contrib.gis的话,gis 模板无法被定位,geographic admin、KML sitemaps 等功能不能正常工作。

运行 migrate 验证

CREATE EXTENSION postgis;会在migrate过程中执行,因此 GeoDjango Tutorial 的migrate流程本身就是验证手段。文档示例的输出(示例结果):

$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, world Running migrations: ... Applying world.0001_initial... OK

教程还建议先用sqlmigrate预览建表 SQL,确认生成的是空间列,例如文档示例中的geometry(MULTIPOLYGON,4326)列和USING GIST索引,再执行migrate。如果迁移顺利通过,说明 PostGIS 扩展和空间后端都已生效。

库找不到时的排查

GeoDjango Installation 指出,GeoDjango 安装中最常见的问题是外部共享库(GEOS、GDAL)找不到,通常是系统不知道从源码编译安装的库放在哪里。文档给出的处理顺序:

  • 设置LD_LIBRARY_PATH(例如在 bash profile 里export LD_LIBRARY_PATH=/usr/local/lib),或以 root 身份把路径写进/etc/ld.so.conf后执行sudo ldconfig
  • 在 Linux 上确认安装了binutils:GeoDjango 通过ctypes.util.find_library找库,它依赖objdump程序。Debian/Ubuntu 可用sudo apt-get install binutils,Red Hat/CentOS 用sudo yum install binutils
  • 库在非常规位置时,也可以在 settings 里直接指定完整路径,例如GEOS_LIBRARY_PATH = '/home/bob/local/lib/libgeos_c.so'(必须指向 C 共享库libgeos_c.so,不是libgeos.so)或GDAL_LIBRARY_PATH

找不到库时的报错形如(来自 Installing Geospatial libraries):

ImportError: Could not find the GEOS library (tried "geos_c"). Try setting GEOS_LIBRARY_PATH in your settings.

下一步

数据库和后端都通了之后,可以按 GeoDjango Tutorial 继续:用ogrinspect从 shapefile 生成模型,用layermapping导入空间数据;更多 API 参考 GeoDjango 文档索引。

【免费下载链接】djangoThe Web framework for perfectionists with deadlines.项目地址: https://gitcode.com/GitHub_Trending/dj/django

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询