1.拉取镜像dockerpull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest#或者已经编译了x86的postgis 16.4dockerpull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:16.4# 或者已经编译了x86的postgis、pgvector的18.3dockerpull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.3# arrch64架构dockerpull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_postgres-with-gis:18.32.创建一个 postgres 容器并启动dockerrun-it--namepostgres--restart always-ePOSTGRES_PASSWORD='Yo5WYypu0mCCheOU'-eALLOW_IP_RANGE=0.0.0.0/0-v/data/postgres:/var/lib/postgresql-p30432:5432-dregistry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest3.进入postgres容器dockerexec-itpostgresbash4.升级apt-getapt-getupdate5.安装postgisapt-getinstallpostgis 最好是指定版本安装,默认可能会是17apt-getinstallpostgresql-16-postgis-3如果是升级# 升级所有包,包括PostgreSQL和PostGISsudoaptupgrade# 或者只升级PostgreSQL相关包sudoaptupgrade postgresql-16 postgresql-16-postgis-3*如果报错ERROR: PostGIS builtforPostgreSQL17.0cannot be loadedinPostgreSQL16.4CONTEXT: PL/pgSQLfunctioninline_code_block line15at RAISE解决方案为了解决这个问题,你需要安装适用于 PostgreSQL 16 的 PostGIS 版本。卸载现有的 PostGIS如果已经安装了 PostgreSQL 17 的 PostGIS,可以先卸载它:apt-getremove--purgepostgresql-17-postgis-3安装适用于 PostgreSQL 16 的 PostGIS根据系统安装 PostgreSQL 16 的 PostGIS:apt-getupdateapt-getinstallpostgresql-16-postgis-3rm-f/usr/share/postgresql/16/extension/postgis.controlrm-f/etc/alternatives/postgresql-17-postgis.controltouch/usr/share/postgresql/16/extension/postgis.controlecho"# postgis extension"/usr/share/postgresql/16/extension/postgis.controlecho"comment = 'PostGIS geometry and geography spatial types and functions'"/usr/share/postgresql/16/extension/postgis.controlecho"default_version = '3.5.1'"/usr/share/postgresql/16/extension/postgis.controlecho"module_pathname = '\$libdir/postgis-3'"/usr/share/postgresql/16/extension/postgis.controlecho"relocatable = false"/usr/share/postgresql/16/extension/postgis.control如果使用 Docker,可以手动安装 PostGIS:6.创建postgis扩展 (去连接客户端或者登录pgsql)create extension postgis;create extension postgis_topology;create extension fuzzystrmatch;create extension postgis_tiger_geocoder;create extension address_standardizer;-- 删除扩展(注意:某些扩展有依赖关系,需要按正确顺序删除) DROP EXTENSION IF EXISTS address_standardizer;DROP EXTENSION IF EXISTS postgis_tiger_geocoder;DROP EXTENSION IF EXISTS fuzzystrmatch;DROP EXTENSION IF EXISTS postgis_topology;DROP EXTENSION IF EXISTS postgis;#2. 创建扩展(PostgreSQL 能够存储、索引和查询向量数据(高维数组))CREATE EXTENSION IF NOT EXISTS vector;#-- 3. 验证扩展是否安装成功SELECT * FROM pg_extension WHERE extname='vector';这些扩展提供了额外的功能。以下是每个扩展的简要说明:create extension postgis;这个命令安装 PostGIS 扩展,它为 PostgreSQL 提供地理空间数据类型和功能,使得数据库能够存储、查询和处理地理信息(如点、线和多边形)。create extension postgis_topology;该命令安装 PostGIS 的拓扑扩展,允许用户在地理数据中建立拓扑关系。拓扑是关于空间对象之间关系的数学描述,适合用于处理更复杂的地理数据模型。create extension fuzzystrmatch;这个扩展提供模糊字符串匹配的功能,包括多种算法,用于比较和匹配相似的字符串。这在处理数据清理、地址标准化等场景时非常有用。create extension postgis_tiger_geocoder;安装 PostGIS TIGER Geocoder 扩展,该扩展使用 TIGER 数据库(来自美国地理调查局)来进行地址解析和反向地理编码,可以将地址转换为地理坐标。create extension address_standardizer;这个扩展用于地址标准化,可以帮助用户将地址数据规范化为一致的格式,从而提高地址数据的质量和可用性,尤其是在进行地理分析时。会在模式下出现spatial_ref_sys 表,想加上注释,如下COMMENT ON TABLE spatial_ref_sys IS'存储空间参考系统信息的表,包含EPSG编号、投影信息和坐标系定义';COMMENT ON COLUMN spatial_ref_sys.srid IS'空间参考系统的唯一标识符(通常为EPSG编号,例如WGS84的编号是4326)';COMMENT ON COLUMN spatial_ref_sys.auth_name IS'定义空间参考系统的授权机构名称(例如EPSG)';COMMENT ON COLUMN spatial_ref_sys.auth_srid IS'由授权机构分配的编号(通常与SRID相同)';COMMENT ON COLUMN spatial_ref_sys.srtext IS'空间参考系统的文本描述(WKT格式)';COMMENT ON COLUMN spatial_ref_sys.proj4text IS'描述投影信息的Proj4表达式';spatial_ref_sys 是 PostGIS 扩展中的一个重要系统表。它包含与空间参考系统 (Spatial Reference Systems, SRS) 相关的信息,用于描述地理数据的坐标系和投影信息。表的作用空间参考系统:记录地理数据的坐标系定义,例如经纬度 (WGS84)、UTM、国家平面坐标系统等。投影转换:帮助在不同的空间参考系统之间进行几何变换和投影。标准化:根据 EPSG 编号 (European Petroleum Survey Group) 提供标准化的参考。如何使用空间函数案例:基于 PostGIS 的 PostgreSQL 空间函数调用案例。这些示例涵盖了多种空间分析和几何操作。请根据你的需求调整表名和列名。创建几何类型SELECT ST_GeomFromText('POINT(30 10)',4326);计算两个点之间的距离SELECT ST_Distance(ST_GeomFromText('POINT(30 10)',4326), ST_GeomFromText('POINT(10 30)',4326));计算多边形面积SELECT ST_Area(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326));检查点是否在多边形内SELECT ST_Contains(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326), ST_GeomFromText('POINT(20 30)',4326));获取多边形的边界SELECT ST_Boundary(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326));创建缓冲区SELECT ST_Buffer(ST_GeomFromText('POINT(30 10)',4326),5);计算多边形的周长SELECT ST_Perimeter(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326));计算中心点SELECT ST_Centroid(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326));获取最小外接矩形SELECT ST_Envelope(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326));计算交集SELECT ST_Intersection(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326), ST_GeomFromText('POLYGON((35 15, 45 45, 25 45, 15 25, 35 15))',4326));计算并集SELECT ST_Union(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326), ST_GeomFromText('POLYGON((35 15, 45 45, 25 45, 15 25, 35 15))',4326));检查相交SELECT ST_Intersects(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))',4326), ST_GeomFromText('POLYGON((35 15, 45 45, 25 45, 15 25, 35 15))',