全部產品
Search
文件中心

PolarDB:ST_AsHMT

更新時間:Aug 09, 2024

將一組geometry對象按照指定範圍和指定解析度轉換為熱力矩陣瓦片(HeatMapTile)。

文法

bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, int4 value default 1, boolean point_mode default false);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, int4 value);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, int4 value, boolean point_mode);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, float8 value);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, float8 value, boolean point_mode);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, int4 value, cstring config);
bytea ST_AsHMT(geometry geometry_set, geometry extent, int4 width, int4 height, float8 value, cstring config);

傳回值

返回一個基於protobuf的位元據結構用於表示每個網格點上數值。proto檔案如下所示:

syntax = "proto2";
option optimize_for = LITE_RUNTIME;

message HMT {
    required Type type = 1; // data value type
    required uint32 rows = 2;   // rows of matrix
    required uint32 columns = 3; // columns of matrix
    required uint32 srid = 4; // columns of matrix
    required float  xmin = 5; // xmin
    required float  ymin = 6; // ymin
    required float  xmax = 7; // xmax
    required float  ymax = 8; // ymax

    oneof matrix {
        intMatrix intValues = 10;
        doubleMatrix doubleValues = 11;
    }

    message intMatrix {
        repeated sint32 values = 12 [packed = true];
    }

    message doubleMatrix {
        repeated double values = 13 [packed = true];
    }

    enum Type {
        INT32 = 0;
        DOUBLE = 1;
    }
}
說明

其中:

  • 類型(Type)根據參數傳入來確定,包括int32和double,前者可以計算數量等資訊,後者可以計算指標等資訊。

  • rows為矩陣對應的行數,columns為矩陣對應的列數。

  • matrix中數值為對應Type類型數組,按行方式進行組織。

  • 矩陣按照x遞增、y遞減的方式進行組織,可以方便地轉換為圖片格式。

  • 可通過ST_HMTAsArray函數將返回的結果轉換為數組的表示方式。

參數

參數名稱

描述

geometry_set

彙總函式使用的幾何欄欄位。

extent

需要統計的地理範圍,只擷取其外包框。可結合ST_TileEnvelope函數進行使用。

width

統計的網格的寬度,對應到結果的columns。

height

統計的網格的高度,對應到結果的rows。

value

需要進行統計的數值,統計時會針對該數值進行求和計算。

point_mode

是否採用點模式,如使用點模式僅統計落入網格內的點。

config

基於JSON表示的字串,用於表示熱力圖的樣式。

描述

將一組geometry對象按照指定範圍和指定解析度轉換為熱力矩陣。

如果資料的空間參考與傳入的空間範圍的空間參考不一致,會自動將資料的空間參考轉換為傳入的空間參考,並進行統計。

config為JSON字串表示的計算方式,具體說明如下:

參數名稱

描述

類型

預設值

說明

type

彙總的類型。

string

sum

取值如下:

  • sum

  • min

  • max

  • avg

point_mod

是否使用點模式。

boolean

false

-

說明

使用int4類型計算sum時可能會由於INT32的限制(-2147483648到2147483647)無法獲得正確的傳回值,建議使用float8類型。

樣本

-- create table
CREATE TABLE test_table AS
SELECT i num,
    ST_SetSrid(st_makepoint((i-0.5)::numeric, (i-0.5)::numeric), 4326) geom,
    i*100::int4 weight,
    i*i*i::float8 volume
FROM generate_series(1, 10) i;

-- count quantity
SELECT ST_AsHMT(geom, --geometry type
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    1024,        -- Width, in pixel
    800        -- height
)
FROM test_table;

---------
\x080010a0061880083284...

-- count value
SELECT ST_AsHMT(geom, --geometry type
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    1024,        -- Width
    800,       -- height
    weight     -- value column
)
FROM test_table;
---------
\x080010a0061880...

-- complex count
SELECT ST_AsHMT(geom, --geometry type
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    1024,        -- Width
    800,        -- height
    weight / volume * 1.2     -- complex value
)
FROM test_table;
---------
\x080110a0061880083a85...

-- point mode
SELECT ST_AsHMT(geom, --geometry type
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    1024,        -- Width, in pixel
    800,        -- height,
    1::integer,  -- value
    true        -- point mode
)
FROM test_table;
---------
\x080010a0061880083...

-- where clause
SELECT ST_AsHMT(geom, --geometry type
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    1024,        -- Width, in pixel
    800        -- height
)
FROM test_table
WHERE num <5;
---------
\x080010a00618...

-- average 
SELECT ST_AsHMT(the_geom,
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    256,        -- Width, in pixel
    256        -- height
    weight, 
    '{"type":"avg"}'::cstring)
FROM test_table;
---------
\x080010a00618...

-- Use min, point mode 
SELECT ST_AsHMT(the_geom,
    ST_MakeEnvelope(0, 0, 10, 10, 4326), -- Extent
    256,        -- Width, in pixel
    256        -- height
    weight, 
    '{"type":"min", "point_mode":true}'::cstring)
FROM test_table;
---------
\x080010a00618...