web-dev-qa-db-ja.com

空間ST_Union集約関数に相当するMySQLですか?

私はMysqlのDB空間プロジェクトに取り組んでおり、図形のグループに対して結合操作を実行しようとしていました。 SQL Server関数 UnionAggregate に似たもの、またはPostGIS空間集計関数 ST_Union

例(SQL SERVERの場合):

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

ST_GeomFromWKBは、Mysqlで同じ仕事をします。

enter image description here

2番目の部分で、UnionAggregate関数+ group by:

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

enter image description here

Mysqlで同様の操作(集約+グループ化)を実行する方法。

ありがとう。

3
Yassine LAADIDI

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が行うことと、私が必要とすることである、各「エリアコード」の形状の集約結合を可能にします。

2
Yassine LAADIDI