一、PostGIS是什么,有什么用?
PostGIS 是 PostgreSQL 数据库的开源地理空间扩展,通过为 PostgreSQL 增加地理空间数据类型、索引、函数和操作符,使其成为功能强大的空间数据库,广泛应用于 GIS(地理信息系统)、位置服务(LBS)、物流调度等需要处理地理空间数据的场景。
二、核心定位与发展背景
起源:2001 年由 Refractions Research 公司发起,2004 年成为开源项目(遵循 GPL 协议),目前由全球社区维护(最新长期支持版为 3.3.x)。
定位:填补 PostgreSQL 在地理空间数据存储与分析上的空白,提供与商业空间数据库(如 Oracle Spatial)同等的能力,但保持开源免费。
生态:与 GDAL(地理数据转换工具)、QGIS(开源 GIS 客户端)、GeoServer(地图发布服务)等主流 GIS 工具深度集成,是开源 GIS 技术栈的核心组件。
三、核心功能与技术细节
1. 空间数据类型
(1)几何类型(Geometry)
几何类型是 PostGIS 最基础的空间数据类型,用于表示 平面坐标系(投影坐标系) 中的几何对象,支持二维(2D)和三维(3D)数据。
常见子类型:
类型 | 描述 | 示例 WKT(Well-Known Text) |
---|---|---|
POINT | 单个坐标点(如商铺、基站、采样点) | POINT(116.4 39.9) |
| 由多个点组成的线(如道路、河流、管线) | LINESTRING(0 0, 1 1, 2 2) |
| 闭合的多边形(含外环和内环,如行政区域、湖泊、建筑物轮廓) | POLYGON((0 0, 0 1, 1 1, 0 0)) |
| 多个点组成的集合(如同一区域内的多个商铺、多个采样点) | MULTIPOINT((0 0), (1 1)) 两个独立点,分别位于 (0,0) 和 (1,1),无任何空间关联 |
| 多条线的集合(如同一区域内的多条道路、多条河流) | MULTILINESTRING((0 0,1 1),(2 2,3 3)) 第一条线:(0,0)→(1,1)(斜线); 第二条线:(2,2)→(3,3)(与第一条线平行的斜线) |
| 多个多边形的集合(如同一国家内的多个省份、同一区域内的多个湖泊) | MULTIPOLYGON(((0 0,0 1,1 1,0 0)),((2 2,2 3,3 3,2 2))) 第一个正方形:左下角 (0,0),右上角 (1,1); 第二个正方形:左下角 (2,2),右上角 (3,3); 两个正方形无重叠,属于同一多多边形集合。 |
| 混合几何对象的集合 | GEOMETRYCOLLECTION(POINT(1 1), LINESTRING(2 2,3 3)) 一个点(位于 (1,1))和一条线(由 (2,2)→(3,3) 组成),两者无空间关联 |
(2)地理类型(Geography)
地理类型基于 球体模型(WGS84 坐标系),适用于大范围地理计算(如全球距离、面积),直接使用经纬度坐标(单位:度)。与几何类型的区别
特性 | Geometry | Geography |
---|---|---|
坐标系 | 平面坐标系(投影坐标系) | 球面坐标系(WGS84) |
计算方式 | 欧几里得几何(平面距离) | 测地线(球面距离) |
适用场景 | 局部区域(城市、国家) | 全球范围(跨国、跨洲) |
(3) 栅格类型(Raster)
用于存储 栅格数据(如卫星影像、DEM 数字高程模型),支持波段操作和像素级分析。核心操作
-
波段读取:获取栅格的像素值。
-
重采样:调整栅格分辨率。
-
地图代数:对多个栅格进行数学运算。
(4)三维几何类型(3D Geometry)
在几何类型基础上添加 Z(高程) 或 M(度量值,如时间、温度) 维度,支持高程或三维建模,满足更复杂的场景需求:
类型名称 | 定义 | 示例(WKT 格式) |
---|---|---|
POINT Z | 三维点(x,y,z) | POINT Z(121.47 31.23 10.5) (经纬度 + 海拔 10.5 米) |
LINESTRING M | 带度量值的线(x,y,m) | LINESTRING M(0 0 0, 1 0 10, 1 1 20) (路径 + 累积距离 0→10→20 米) |
POLYGON ZM | 三维 + 度量值的面(x,y,z,m) | POLYGON ZM((0 0 0 0, 2 0 0 10, 2 2 0 20, 0 2 0 30, 0 0 0 0)) (面 + 高度 + 度量) |
(5)空间参考标识(SRID)
每个空间数据必须关联 SRID(Spatial Reference System Identifier),定义坐标系规则。常用 SRID:
-
4326:WGS84 经纬度(地理坐标系)。
-
3857:Web Mercator(投影坐标系,用于谷歌地图)。
2. 坐标参考系统(CRS)支持
PostGIS 通过 spatial_ref_sys
表存储全球主流坐标系(如 EPSG:4326 为 WGS84 经纬度,EPSG:3857 为 Web 墨卡托投影),确保数据在不同坐标系间的转换和分析。
示例:将经纬度(EPSG:4326)转换为平面坐标(EPSG:3857):
sql
SELECT ST_Transform(ST_GeomFromText('POINT(121.47 31.23)', 4326), 3857);
如想了解常见投影坐标系 EPSG可以滑动到最下面
3. 空间索引
PostGIS 支持高效的空间索引(基于 GiST 或 SP-GiST 树结构),加速空间查询(如范围查询、相交判断):
- GiST 索引:默认空间索引类型,适用于几何 / 地理类型,支持
&&
(包围盒相交)、ST_Intersects
(几何相交)等操作符。 - SP-GiST 索引:针对大规模数据优化的索引(PostGIS 2.2+ 支持),减少索引存储和查询时间(尤其适用于面数据)。
示例:为 city
表的 geom
列创建 GiST 索引:
sql
CREATE INDEX idx_city_geom ON city USING GIST (geom);
4. 空间函数与操作符
PostGIS 提供数百个空间函数,覆盖几何运算、空间关系判断、测量计算等场景:
功能分类 | 典型函数 / 操作符 | 示例 |
---|---|---|
几何创建 | ST_GeomFromText (WKT 转几何)、ST_GeomFromGeoJSON (GeoJSON 转几何) | ST_GeomFromText('LINESTRING(0 0,1 1)', 4326) (创建线对象) |
空间关系 | ST_Intersects (相交)、ST_Contains (包含)、ST_DWithin (距离范围内) | SELECT * FROM stores WHERE ST_DWithin(geom, ST_MakePoint(121,31), 1000) (查询 1000 米内的商店) |
几何运算 | ST_Buffer (缓冲区)、ST_Union (合并)、ST_Intersection (交集) | ST_Buffer(ST_MakePoint(121,31), 0.1) (创建半径 0.1 度的缓冲区) |
测量计算 | ST_Distance (距离)、ST_Area (面积)、ST_Length (长度) | ST_Distance(geom1, geom2, true) (计算球面距离,单位米) |
拓扑分析 | ST_Touches (邻接)、ST_Crosses (交叉)、ST_Within (包含于) | SELECT * FROM regions WHERE ST_Within(city.geom, regions.geom) (查询城市所在的区域) |
5. 栅格数据支持(PostGIS Raster)
PostGIS 扩展模块 postgis_raster
支持存储和分析栅格数据(如卫星影像、DEM 数字高程模型),可与矢量数据联动分析:
- 栅格类型:
raster
,支持多波段存储(如红、绿、蓝、近红外波段)。 - 功能示例:栅格裁剪(
ST_Clip
)、波段统计(ST_BandStatistics
)、栅格转矢量(ST_AsTiles
)。
6. 拓扑数据模型(PostGIS Topology)
扩展模块 postgis_topology
提供拓扑数据模型,用于管理要素间的严格邻接关系(如行政区划边界共享、管网连接):
- 支持创建拓扑层(
topology
),自动维护面、边、节点的关联关系(如修改一条边会同步更新相邻面的边界)。
附
常见投影坐标系 EPSG 代码表
以下为广泛使用的投影坐标系及其核心参数:
EPSG 代码 | 坐标系名称 | 投影类型 | 适用区域 | 单位 | 典型用途 |
---|---|---|---|---|---|
3857 | WGS 84 / Pseudo-Mercator | Web Mercator | 全球 | 米 | 在线地图(Google Maps, OpenStreetMap) |
4326 | WGS 84 | 地理坐标系(非投影) | 全球 | 度 | GPS 数据、原始经纬度存储 |
32633 | WGS 84 / UTM zone 33N | 横轴墨卡托 (UTM) | 北半球(经度 12°E–18°E) | 米 | 欧洲局部地图、工程测量 |
32649 | WGS 84 / UTM zone 49N | 横轴墨卡托 (UTM) | 北半球(经度 108°E–114°E) | 米 | 中国东部地区 |
26910 | NAD83 / UTM zone 10N | 横轴墨卡托 (UTM) | 北美西海岸(-126°W–-120°W) | 米 | 美国、加拿大区域地图 |
2278 | NAD83 / Texas Centric Albers | 阿尔伯斯等积圆锥 | 美国得克萨斯州 | 米 | 区域等面积分析 |
27700 | OSGB36 / British National Grid | 横轴墨卡托 | 英国 | 米 | 英国地形图、城市规划 |
3035 | ETRS89 / LAEA Europe | 兰勃特等积方位 | 欧洲 | 米 | 欧盟统计、跨区域分析 |