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