pg_sphere(球面数据计算)

pg_sphere是支持球形数据类型、计算函数和操作符的开源PostgreSQL插件。主要解决球形(例如,地球)对象上的点、线、面如何表示的问题,同时支持计算点、线、面之间的距离或面积等功能。

前提条件

支持的PolarDB PostgreSQL版(兼容Oracle)版本如下:

  • Oracle语法兼容 2.0(内核小版本2.0.14.1.0及以上)

  • Oracle语法兼容 1.0(内核小版本1.1.27及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本号:

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官方帮助文档