从零开始学习PostGIS,掌握空间数据库的核心概念、安装配置和基础操作
按照推荐顺序学习,循序渐进掌握PostGIS基础
安装PostgreSQL和PostGIS扩展
了解空间数据和几何类型
学习基础空间查询函数
完成基础查询练习
PostGIS是PostgreSQL的空间数据库扩展,它为PostgreSQL添加了存储、查询和分析空间数据的能力。 通过PostGIS,您可以在数据库中直接处理地理信息系统(GIS)数据,无需额外的GIS软件。
PostGIS基于OGC(开放地理空间联盟)标准,学习时建议先了解基本的空间数据概念, 这样可以更好地理解后续的课程内容。
PostGIS的安装相对简单,主要有两种方式:通过包管理器安装或从源码编译。 下面介绍在不同操作系统上的安装方法。
# 安装PostgreSQL
sudo apt update
sudo apt install postgresql postgresql-contrib
# 安装PostGIS
sudo apt install postgis postgresql-14-postgis-3
# 验证安装
sudo -u postgres psql -c "CREATE EXTENSION postgis;"
# 安装PostgreSQL
sudo yum install postgresql-server postgresql-contrib
# 初始化数据库
sudo postgresql-setup --initdb
# 安装PostGIS
sudo yum install postgis_14
# 启动服务
sudo systemctl start postgresql
# 使用Homebrew安装
brew install postgresql
brew install postgis
# 启动PostgreSQL
brew services start postgresql
# 创建数据库
createdb mydb
psql -d mydb -c "CREATE EXTENSION postgis;"
安装完成后,可以通过以下命令验证PostGIS是否正确安装:
-- 查看PostGIS版本
SELECT PostGIS_Version();
-- 查看完整版本信息
SELECT PostGIS_Full_Version();
PostGIS扩展了PostgreSQL的数据类型系统,添加了专门用于存储空间数据的几何类型。 理解这些数据类型是使用PostGIS的基础。
表示二维或三维空间中的单个点
-- 创建点几何
ST_MakePoint(116.4074, 39.9042)
ST_MakePoint(116.4074, 39.9042, 100)
表示连接一系列点的线
-- 创建线几何
ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(1, 1),
ST_MakePoint(2, 0)
])
表示封闭的区域
-- 创建面几何
ST_MakePolygon(ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(0, 1),
ST_MakePoint(1, 1),
ST_MakePoint(1, 0),
ST_MakePoint(0, 0)
]))
多个点的集合
-- 创建多点几何
ST_MultiPoint(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(1, 1),
ST_MakePoint(2, 2)
])
多条线的集合
-- 创建多线几何
ST_MultiLineString(ARRAY[
ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(1, 1)
]),
ST_MakeLine(ARRAY[
ST_MakePoint(2, 2),
ST_MakePoint(3, 3)
])
])
多个面的集合
-- 创建多面几何
ST_MultiPolygon(ARRAY[
ST_MakePolygon(ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(0, 1),
ST_MakePoint(1, 1),
ST_MakePoint(1, 0),
ST_MakePoint(0, 0)
]))
])
创建几何数据时必须指定SRID(空间参考系统标识符), 常用的SRID包括4326(WGS84坐标系)和3857(Web墨卡托投影)。
PostGIS提供了丰富的空间函数来处理几何数据。以下是一些最常用的基础查询函数。
判断两个几何是否相交
SELECT ST_Intersects(
ST_MakePoint(0, 0),
ST_MakePoint(0, 0)
); -- 返回 true
判断一个几何是否包含另一个
SELECT ST_Contains(
ST_MakePolygon(ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(0, 2),
ST_MakePoint(2, 2),
ST_MakePoint(2, 0),
ST_MakePoint(0, 0)
])),
ST_MakePoint(1, 1)
); -- 返回 true
判断两个几何是否在指定距离内
SELECT ST_DWithin(
ST_MakePoint(0, 0),
ST_MakePoint(1, 1),
2
); -- 返回 true
计算两个几何之间的距离
SELECT ST_Distance(
ST_MakePoint(0, 0),
ST_MakePoint(3, 4)
); -- 返回 5.0
计算几何的面积
SELECT ST_Area(ST_MakePolygon(ST_MakeLine(ARRAY[
ST_MakePoint(0, 0),
ST_MakePoint(0, 2),
ST_MakePoint(2, 2),
ST_MakePoint(2, 0),
ST_MakePoint(0, 0)
]))); -- 返回 4.0
创建几何的缓冲区
SELECT ST_Buffer(
ST_MakePoint(0, 0),
1
); -- 返回半径为1的圆
通过实际操作来巩固所学知识。以下是一些基础练习,帮助您熟悉PostGIS的基本操作。
创建一个包含城市信息的表,包括城市名称、位置和人口。
为每个城市创建一个50公里的缓冲区,找出缓冲区重叠的区域
计算每个城市100公里范围内的人口总数和平均密度
找到一个位置,使其到三个城市的总距离最小