Q3C 环境搭建和基本使用

本文介绍 Q3C 环境搭建和基本使用。

1. Q3C 是什么

GIS 和空间数据库相关教程

建议参考 《空间数据库》课程整理汇总在新窗口打开 获得有关 GIS 和空间数据库的相关内容。

Q3C在新窗口打开 是由 Sergey Koposov 开发的 PostgreSQL 插件,用于创建空间数据库索引。

PostGIS 可能是 PostgreSQL 生态下最好的空间数据库插件,而 Q3C 则是一个小众的空间数据库,主要由 C 语言编写,提供了基本的创建空间索引和空间查询函数。

为了使用 Q3C,你需要安装一个 PostgreSQL(9.1 或更高)。Q3C 1.4.x 支持 PostgreSQL 9.1 以前的版本,如果需要旧版本支持请使用 1.4.x。

2. 安装 Q3C

本文所使用的 Dockerfile
FROM postgres:14.7-bullseye
WORKDIR /app

RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list \
    && echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list \
    && apt update \
    && apt install apt-transport-https ca-certificates -y \
    && apt install git -y \
    && apt install build-essential postgresql-server-dev-14 liblz4-dev libreadline-dev zlib1g-dev -y \
    && git clone https://github.com/segasai/q3c.git \
    && cd q3c \
    && make \
    && make install \
    && cd .. \
    && rm -rf q3c \
    && apt remove build-essential postgresql-server-dev-14 liblz4-dev libreadline-dev zlib1g-dev -y \
    && apt autoremove -y \
    && apt clean

EXPOSE 5432
CMD [ "postgres" ]

测试:

docker build -t q3c:v1 .
docker run -itd \
    --name pg_q3c \
    -p 5432:5432 \
    -e POSTGRES_PASSWORD=password \
    -e POSTGRES_USER=postgres \
    q3c:v1

下面我们以 PostgreSQL 14.7 示例,我们使用 Docker 创建 PostgreSQL 14.7 环境,如果你已经安装可以跳过 Docker 部分。

docker pull postgres:14.7-bullseye
docker run -itd \
    --name pg_q3c \
    -p 5432:5432 \
    -e POSTGRES_PASSWORD=password \
    -e POSTGRES_USER=postgres \
    postgres:14.7-bullseye

docker exec -it pg_q3c bash

安装基本工具,确保 apt 可用 HTTPS 通信,如果这一步更新失败或较慢可用更换源:

apt update
apt install apt-transport-https ca-certificates -y

可选 更换源(Debian 11 bullseye,阿里云):

mv /etc/apt/sources.list /etc/apt/sources.list-bak
echo '
deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib
deb http://mirrors.aliyun.com/debian-security/ bullseye-security main
deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib
deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib
' > /etc/apt/sources.list

apt update

下载源代码,并安装编译依赖:

apt install git
git clone https://github.com/segasai/q3c.git
apt install build-essential postgresql-server-dev-14 liblz4-dev libreadline-dev zlib1g-dev -y

编译:

cd q3c
make
make install

这一步如果没有出错安装就完成了。

现在我们检查一下安装效果:

su postgres
cd
psql

然后在 PostgreSQL 提供的命令行界面种操作,创建数据库。

在指定数据库中使用下面的 SQL 来创建插件:

CREATE EXTENSION q3c;

Q3C 常见操作:

-- 在指定数据库中使用 Q3C 插件
CREATE EXTENSION q3c;

-- 查看当前 Q3C 版本
SELECT q3c_version();

-- 修改当前数据库使用的 Q3C 版本
ALTER EXTENSION q3c UPDATE TO 'A.B.C';

-- 查看系统中安装了哪些 Q3C 版本
SELECT * FROM pg_available_extension_versions WHERE name ='q3c';

3. 开始使用

为了开始使用 Q3C 进行搜索和交叉匹配,你应该在你的表中创建索引。

在这个演示中,我们假设你有一个名为 "mytable" 的表,其中有 "ra""dec" 列(使用度数表示的赤经和赤纬)。

首先,你将需要创建空间索引,使用命令。

CREATE INDEX ON mytable (q3c_ang2ipix(ra, dec));

下一个过程是可选的,但强烈建议:使用新创建的索引对表进行聚簇。聚簇过程是根据 Q3C 空间索引值对磁盘上的数据进行排序的过程,如果你的表非常大,这将确保更快的查询。

如果数据已经以有序的方式摄入数据库(即沿着球形区域),聚簇步骤可以省略(尽管仍然推荐)。如果你的数据集很大,聚簇步骤可能需要一段时间(几个小时)。

CLUSTER mytable_q3c_ang2ipix_idx ON mytable;

另外,你也可以不使用 CLUSTER,而是在建立索引之前自己对表进行重新排序(可能更快):

CREATE TABLE mytable1 AS SELECT * FROM mytable ORDER BY q3c_ang2ipix(ra, dec);

最后一步是分析你的表:

ANALYZE mytable;

现在你应该能够使用 Q3C 查询了。

4. 可用函数