docker安装的postgres同时安装postgis、pgvector 扩展

1.拉取镜像

docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest
#或者已经编译了x86的postgis 16.4
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:16.4
# 或者已经编译了x86的postgis、pgvector的18.3
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres-with-gis:18.3
# arrch64架构
docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_postgres-with-gis:18.3

2.创建一个 postgres 容器并启动

docker run -it --name postgres--restart always -e POSTGRES_PASSWORD='Yo5WYypu0mCCheOU' -e ALLOW_IP_RANGE=0.0.0.0/0 -v /data/postgres:/var/lib/postgresql -p 30432:5432 -d registry.cn-hangzhou.aliyuncs.com/qiluo-images/postgres:latest

3.进入postgres容器

docker exec -it postgres bash

4.升级apt-get

apt-get update

5.安装postgis

apt-get install postgis
最好是指定版本安装,默认可能会是17
apt-get install postgresql-16-postgis-3

如果是升级

# 升级所有包,包括PostgreSQL和PostGIS
sudo apt upgrade
# 或者只升级PostgreSQL相关包
sudo apt upgrade postgresql-16 postgresql-16-postgis-3*

如果报错

ERROR:  PostGIS built for PostgreSQL 17.0 cannot be loaded in PostgreSQL 16.4
CONTEXT:  PL/pgSQL function inline_code_block line 15 at RAISE

解决方案
为了解决这个问题,你需要安装适用于 PostgreSQL 16 的 PostGIS 版本。

  1. 卸载现有的 PostGIS
    如果已经安装了 PostgreSQL 17 的 PostGIS,可以先卸载它:
apt-get remove --purge postgresql-17-postgis-3
  1. 安装适用于 PostgreSQL 16 的 PostGIS
    根据系统安装 PostgreSQL 16 的 PostGIS:
apt-get update
apt-get install postgresql-16-postgis-3
rm -f /usr/share/postgresql/16/extension/postgis.control
rm -f /etc/alternatives/postgresql-17-postgis.control
touch /usr/share/postgresql/16/extension/postgis.control
echo "# postgis extension" > /usr/share/postgresql/16/extension/postgis.control
echo "comment = 'PostGIS geometry and geography spatial types and functions'" >> /usr/share/postgresql/16/extension/postgis.control
echo "default_version = '3.5.1'" >> /usr/share/postgresql/16/extension/postgis.control 
echo "module_pathname = '\$libdir/postgis-3'" >> /usr/share/postgresql/16/extension/postgis.control
echo "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 空间函数调用案例。这些示例涵盖了多种空间分析和几何操作。请根据你的需求调整表名和列名。

  1. 创建几何类型
SELECT ST_GeomFromText('POINT(30 10)', 4326);
  1. 计算两个点之间的距离
SELECT ST_Distance(
    ST_GeomFromText('POINT(30 10)', 4326),
    ST_GeomFromText('POINT(10 30)', 4326)
);
  1. 计算多边形面积
SELECT ST_Area(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326));
  1. 检查点是否在多边形内
SELECT ST_Contains(
    ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326),
    ST_GeomFromText('POINT(20 30)', 4326)
);
  1. 获取多边形的边界
SELECT ST_Boundary(
    ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326)
);
  1. 创建缓冲区
SELECT ST_Buffer(ST_GeomFromText('POINT(30 10)', 4326), 5);
  1. 计算多边形的周长
SELECT ST_Perimeter(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326));
  1. 计算中心点
SELECT ST_Centroid(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326));
  1. 获取最小外接矩形
SELECT ST_Envelope(ST_GeomFromText('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', 4326));
  1. 计算交集
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)
);
  1. 计算并集
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)
);
  1. 检查相交
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))', 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀͜͡傀儡师

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值