pg_sphere是支持球形数据类型、计算函数和操作符的开源PostgreSQL插件。主要解决球形(例如,地球)对象上的点、线、面如何表示的问题,同时支持计算点、线、面之间的距离或面积等功能。
前提条件
支持的PolarDB PostgreSQL版的版本如下:
PostgreSQL 14(内核小版本14.5.1.0及以上)
PostgreSQL 11(内核小版本1.1.27及以上)
您可通过如下语句查看PolarDB PostgreSQL版的内核小版号:
PostgreSQL 14
SELECT version();
PostgreSQL 11
SHOW polar_version;
使用指南
安装/卸载插件
安装插件。
CREATE EXTENSION pg_sphere;
卸载插件。
DROP EXTENSION pg_sphere;
数据类型
pg_sphere插件支持以下类型的对象:
Point:点。
Euler transformation:欧拉变换。
Circle:圆。
Line:线。
Ellipses:椭圆。
Path:路径。
Polygon:多边形。
以Point为例来说明如何创建对象。球面上的点有以下三种表示方法:
用经度和纬度指定位置,单位为弧度。
SELECT spoint '(0.1,-0.2)';
显示结果如下:
spoint -------------- (0.1 , -0.2) (1 row)
用经度和纬度指定位置,单位为度。
SELECT spoint '( 10.1d, -90d)';
显示结果如下:
spoint ---------------------------------------- (0.176278254451427 , -1.5707963267949) (1 row)
使用DMS(度、分、秒)来标识经度和纬度。
SELECT spoint '( 10d 12m 11.3s, -13d 14m)';
显示结果如下:
spoint ------------------------------------------ (0.178078367649387 , -0.230965237680583) (1 row)
说明将圆周360等分,一等分对应的圆心角是1度。将1度对应的弧长60等分,一等分对应的圆心角是1分。将1分对应的弧长60等分,一等分对应的圆心角是1秒。
构造器
构造器用于通过其他数据类型来构造球形数据类型,构造器支持Point、Euler transformation、Circle、Line、Ellipses、Path、Polygon等类型。
以Point为例来说明如何创建。通过经纬度来构造球形点(得到一个经度为270,纬度为-30的球面位置):
SELECT spoint (270.0 * pi() / 180.0, -30.0 * pi() / 180.0) AS spoint;
显示结果如下:
spoint
-----------------------------------------
(4.71238898038469 , -0.523598775598299)
(1 row)
操作符
pg_sphere插件支持以下操作符:
Casting:投影。
Equality:相等。
Contain and overlap:包含和重叠。
Crossing of lines:线条相交。
Distance:距离。
Length and circumference:长度和周长。
Center:中点。
以Distance为例计算两个圆之间的距离。
SELECT 180 * ( scircle '<(0d,20d),2d>' <-> scircle '<(0d,40d),2d>' ) / pi() AS dist;
显示结果如下:
dist
------
16
(1 row)
函数
pg_sphere插件支持以下计算函数:
面积计算函数。
路径计算函数。
距离计算函数。
以面积计算函数和点计算函数为例,说明如何使用函数。
以
pi
为单位计算一个球形的面积。SELECT area( scircle '<(0d,90d),60d>' ) / pi() AS area;
显示结果如下:
area ------ 1 (1 row)
获取一个球形点的经度和纬度,单位为度。
说明pg_sphere插件中的
long(spoint)
函数已更改为long_sphere(spoint)
函数。SELECT long_sphere ( spoint '(10d,20d)' ) * 180.0 / pi() AS longitude;
显示结果如下;
longitude ------------ 10 (1 row)
SELECT lat ( spoint '(10d,20d)' ) * 180.0 / pi() AS latitude;
显示结果如下:
latitude ---------- 20 (1 row)
相关参考
pg_sphere的详细说明可参考pg_sphere官方帮助文档。