pg_eviltransform

基于PostGIS ST_Transform 的 BD09/GCJ02 坐标转换扩展

概览

扩展包名版本分类许可证语言
pg_eviltransform0.0.4GISMITRust
ID扩展名BinLibLoadCreateTrustReloc模式
1580pg_eviltransformeviltransform_internal
相关扩展postgis postgis pgrouting pg_geohash h3 q3c earthdistance tzf geoip

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY0.0.41817161514pg_eviltransformpostgis
RPMPIGSTY0.0.41817161514pg_eviltransform_$vpostgis36_$v
DEBPIGSTY0.0.41817161514postgresql-$v-eviltransformpostgresql-$v-postgis
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
d12.x86_64
d12.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
d13.x86_64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
d13.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
u22.x86_64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
u22.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
u24.x86_64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
u24.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
u26.x86_64
u26.aarch64
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4
PIGSTY 0.0.4

构建

您可以使用 pig build 命令构建 pg_eviltransform 扩展的 RPM / DEB 包:

pig build pkg pg_eviltransform         # 构建 RPM / DEB 包

安装

您可以直接安装 pg_eviltransform 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_eviltransform;          # 当前活跃 PG 版本安装
pig ext install -y pg_eviltransform -v 18  # PG 18
pig ext install -y pg_eviltransform -v 17  # PG 17
pig ext install -y pg_eviltransform -v 16  # PG 16
pig ext install -y pg_eviltransform -v 15  # PG 15
pig ext install -y pg_eviltransform -v 14  # PG 14
dnf install -y pg_eviltransform_18       # PG 18
dnf install -y pg_eviltransform_17       # PG 17
dnf install -y pg_eviltransform_16       # PG 16
dnf install -y pg_eviltransform_15       # PG 15
dnf install -y pg_eviltransform_14       # PG 14
apt install -y postgresql-18-eviltransform   # PG 18
apt install -y postgresql-17-eviltransform   # PG 17
apt install -y postgresql-16-eviltransform   # PG 16
apt install -y postgresql-15-eviltransform   # PG 15
apt install -y postgresql-14-eviltransform   # PG 14

创建扩展

CREATE EXTENSION pg_eviltransform CASCADE;  -- 依赖: postgis

用法

来源:

pg_eviltransform 扩展了 PostGIS,增加了涉及中国 GCJ-02 和 BD-09 系统的坐标转换。版本 0.0.4 还通过 ST_JenksBins 数组和聚合重载添加了精确的 Jenks 自然断点分类。

坐标转换

CREATE EXTENSION postgis;
CREATE EXTENSION pg_eviltransform;

-- WGS84 to GCJ-02 using a readable coordinate-system name.
SELECT ST_EvilTransform(
    ST_SetSRID('POINT(120 30)'::geometry, 4326),
    'GCJ02'
);

-- BD-09 to Web Mercator.
SELECT ST_EvilTransform(
    ST_SetSRID('POINT(120.011070620552 30.0038830555128)'::geometry, 990002),
    3857
);

自定义 SRID 为:990001 对应 GCJ-02,990002 对应 BD-09。当两端均未使用自定义系统时,ST_EvilTransform 将委托给 PostGIS 的 ST_Transform;否则在必要时通过 WGS84 (4326) 转换。

Jenks 自然断点

-- Array form; NULL elements are ignored.
SELECT ST_JenksBins(ARRAY[1, 2, NULL, 10, 11]::numeric[], 2);

-- Streaming aggregate form for a large table.
SELECT ST_JenksBins(value, 7)
FROM measurements;

-- Return lower rather than upper bin edges.
SELECT ST_JenksBins(value, 7, true)
FROM measurements;

数组输入支持 numeric, double precision, real, bigint, integer, 和 smallint。聚合输入为 numericdouble precision;当需要时请将其他数值列转换为这些类型。

API 索引和注意事项

  • ST_EvilTransform(geometry, integer|text)ST_EvilTransform(geometry, text, integer|text):四个重载对应于 PostGIS 的 ST_Transform 接口。
  • ST_JenksBins(values[], breaks [, invert]):对数组进行分类并返回 double precision[] 边界值。
  • ST_JenksBins(value, breaks [, invert]):流式聚合,避免生成 array_agg
  • PostGIS 是运行时先决条件,在安装 pg_eviltransform 之前必须已安装。
  • Jenks 输入必须是有限的且 breaks 至少为一。numeric 值会被转换为有限的 f64,因此返回的边界值为浮点数。
  • 当唯一值的数量不超过 breaks 时,结果将是排序后的唯一值集合;没有有效输入行将返回 NULL