Mariadb

如何通過在 MariaDB 中聚合點 (ST_MakeLine) 來構造 LINESTRING?

  • January 21, 2019

假設我有一張有 3 個點的表格,

CREATE TABLE foo ( id int PRIMARY KEY, geog point );
INSERT INTO foo (id, geog) VALUES
 ( 1, Point(0,0) ),
 ( 2, Point(1,1) ),
 ( 3, Point(2,2) );

我如何LINESTRING在這三個不同的行中用這三個點建構一個。由此產生的 WKT 應該是LINESTRING( 0 0, 1 1, 2 2 )?


PostGIS 使用名為ST_MakeLine

SELECT ST_MakeLine(geog)
FROM foo
ORDER BY id;

由於 MariaDB(和 MySQL)缺乏所有空間聚合,目前唯一的方法是創建 WKT,並強制 MySQL 解析該 WKT。

SELECT ST_AsText(
 ST_GeomFromText(CONCAT(
   'LINESTRING (',
   GROUP_CONCAT(CONCAT(ST_X(geog),' ',ST_Y(geog)) SEPARATOR ','),
   ')'
 ))
)
FROM foo
ORDER BY id;
-- returns LINESTRING (0 0,1 1,2 2) 

內側部分

GROUP_CONCAT(CONCAT(ST_X(geog),' ',ST_Y(geog)) SEPARATOR ',')

創建點列表,然後我們將其包裝LINESTRING ( $pointlist )並提供給ST_GeomFromText()


ℹ 有特定類型的版本ST_GeomFromText,但至少在 MariaDB 中,它們似乎沒有什麼不同,除了增加混亂

引用自:https://dba.stackexchange.com/questions/227638