Mysql

MySQL 等效於空間 ST_Union 聚合函式?

  • June 22, 2018

我正在 Mysql 中開發一個數據庫空間項目,我試圖對一組形狀執行聯合操作。我正在尋找類似於 SQL Server 函式UnionAggregate或 PostGIS Spatial Aggregate 函式的東西ST_Union

例如(在 SQL SERVER 中):

SELECT
       geometry::STGeomFromWKB(Shape,27582),
       area_code
FROM area_table 
WHERE area_code='xxxxxxx';

ST_GeomFromWKB 在 Mysql 中做同樣的工作。

在此處輸入圖像描述

在第二部分中,使用UnionAggregate函式 + group by :

select 
       dbo.UnionAggregate((geometry::STGeomFromWKB(Shape,27582)).MakeValid()),
       area_code
FROM area_table 
WHERE area_code='xxxxxxx'
GROUP BY area_code;

在此處輸入圖像描述

任何想法如何在 Mysql 中執行類似的操作(聚合+分組)。

謝謝。

我找到了另一種使用ST_Union執行聯合聚合的替代方法。我遇到了一些問題,因為這個 Mysql 函式只有 2 個參數作為輸入。

作為解決方案,我創建了自己的函式,如下所示:

CREATE FUNCTION `fct_create_geom_collection`(ac CHAR(8))          
RETURNS GEOMETRY
BEGIN
                   DECLARE position INT;
                   DECLARE sortie BOOLEAN DEFAULT FALSE;
                   -- get all area_IDs
                   DECLARE curgeom CURSOR FOR
                   SELECT DISTINCT area_ID     
                   FROM area_table  
                   WHERE area_code= ac ORDER BY area_ID;
                   DECLARE CONTINUE HANDLER FOR NOT FOUND SET sortie = TRUE; 

   OPEN curgeom;   
                 -- get the first area_id
                  FETCH curgeom INTO position ;
                 -- put the shape into @var_g_0 for this area_id
                  SELECT ST_GeomFromWKB(Shape,27582) INTO @var_g_0 
                  FROM area_table  
                  WHERE area_ID = position  ;              
   LLD: LOOP
   IF sortie THEN
   LEAVE LLD;
   END IF;
                   -- get the second area_id
                   FETCH curgeom INTO position  ;
                   -- put the second  shape into @var_g for this area_id
                   SELECT ST_GeomFromWKB(Shape,27582) INTO @var_g 
                   FROM area_table  
                   WHERE area_ID    = position   ;

                   -- performing a union operation between @var_g_0 and @var_g
                   SET @geom = ST_UNION(@var_g_0,@var_g); -- enclosed st_union                 
                   -- put the result into @var_g_0
                   SET @var_g_0 = @geom;   

                  END LOOP;
                  CLOSE curgeom;
                  RETURN ST_GeomFromText(ST_ASTEXT(@geom)); 
                -- RETURN ST_GeomFromWKB(@geom); 

END$$

此功能為每個“區號”啟用聚合聯合形狀,這是 UnionAggregate 所做的以及我需要的。

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