[前][次][番号順一覧][スレッド一覧]

mysql:16589

From: 落合 司郎 <落合 司郎 <s.ochiai@xxxxxxxxxx>>
Date: Thu, 28 May 2020 09:09:33 +0900
Subject: [mysql 16589] ST_UNION(g1,g2)で不具合

いつもお世話になります。

MySQL8.0.19でgeometryをどの程度扱えるかテスト中のものです。
MySQL8.0.19でのgeometry操作はとても優れていると思いますが、以下の3つの問題に遭遇しました。
これが解決できれば、MySQL8.0.19にバージョンアップし、geometry操作部分を組み込もうと考えています。

今回気が付いた不具合の中で最も困る不具合は、1.のバーテックスが欠落し、ポリゴンの形状が変化するという現象です。
この問題の解決策をご存じの方がいましたら、教えてください。

1.UNIONした結果、元のポリゴンのバーテックスが欠落し、ポリゴンの形状が変化する

SET
@P1 = ST_PolyFromText("POLYGON((-62433.2910828833 
2764.5257215282,-62714.9493259382 2766.5330010955,-62716.6003004125 
2535.38538802008,-62434.9346417331 2533.37815598129,-62153.269040846 
2531.37996004138,-62151.6328976062 2762.52747827366,-62433.2910828833 
2764.5257215282))", 2451),
@P2 = ST_PolyFromText("POLYGON((-62431.6474412822 
2995.67336637473,-62713.2982683394 2997.68069345994,-62714.9493259382 
2766.5330010955,-62433.2910828833 2764.5257215282,-62151.6328976062 
2762.52747827366,-62149.9966719884 2993.67507581609,-62431.6474412822 
2995.67336637473))", 2451),
@P1uP2 = ST_UNION(@P1,@P2);

select 
ST_AsText(@P1uP2),ST_IsValid(ST_UNION(@P1,@P2)),ST_Overlaps(@P1,@P2),ST_AREA(@P1),ST_AREA(@P2),ST_AREA(@P1)+ST_AREA(@P2),ST_AREA(@P1uP2);

# ST_AsText(@P1uP2), ST_IsValid(ST_UNION(@P1,@P2)), 
ST_Overlaps(@P1,@P2), ST_AREA(@P1), ST_AREA(@P2), 
ST_AREA(@P1)+ST_AREA(@P2), ST_AREA(@P1uP2)
'POLYGON((-62153.269040846 2531.37996004138,-62149.9966719884 
2993.67507581609,-62431.6474412822 2995.67336637473,-62713.2982683394 
2997.68069345994,-62714.9493259382 2766.5330010955,-62716.6003004125 
2535.38538802008,-62434.9346417331 2533.37815598129,-62153.269040846 
2531.37996004138))', '1', '0', '130217.51844157779', 
'130214.13530906526', '260431.65375064305', '260431.66320649907'

ST_UNION(g1,g2)を実行して(g1,g2)の共有部以外のバーテックスが欠落すると、ポリゴンの形状が変化し、(g1,g2)に隣接する他のポリゴンとの境に隙間あるいは重複が生じます。

参照)UNIONで元のバーテックスが欠落.xlsx


2.隣接するポリゴンの境界線上に対応するバーテックスが欠落している場合、interior 
ringsが発生する場合がある

SET
@P3 = ST_PolyFromText("POLYGON ((-33628.830041193497891 
22254.767782529699616,-33909.85213830810244 
22255.855599316299049,-34190.874266213199007 
22256.952469054598623,-34471.896425159400678 
22258.058391754399054,-34472.809786426303617 
22026.907656302701071,-34473.723101996998594 
21795.757001126199611,-34475.549596044897044 
21333.455931586999213,-34194.497654526901897 
21332.350111490701238,-33913.445744081502198 
21331.25334351589845,-33632.393864457902964 
21330.165627653201227,-33351.342015396301576 
21329.086963893001666,-33350.458571511197079 
21560.237357149300806,-33349.575083417701535 
21791.387830698600737,-33348.6915511167972 
22022.538384542898712,-33347.807974609801022 
22253.689018685399788,-33628.830041193497891 22254.767782529699616))", 
2451),
@P4 = ST_PolyFromText("POLYGON ((-32504.741955510398839 
22250.507044712601783,-32785.763932025598479 
22251.558649786198657,-33066.785938308603363 
22252.619307773999026,-33347.807974609801022 
22253.689018685399788,-33348.6915511167972 
22022.538384542898712,-33349.575083417701535 
21791.387830698600737,-33351.342015396301576 
21329.086963893001666,-33070.290196648100391 
21328.017352225899231,-32789.238407948701933 
21326.956792642500659,-32508.186649047398532 
21325.905285133598227,-32227.134919690899551 
21324.862829690100625,-32226.281255972000508 
21556.013124928300385,-32225.427549534801074 
21787.163500481899973,-32224.57380038050178 
22018.313956352798414,-32223.720008510001207 
22249.464492544200766,-32504.741955510398839 22250.507044712601783))", 
2451),

select 
ST_AsText(ST_UNION(@P3,@P4)),ST_IsValid(ST_UNION(@P3,@P4)),ST_Overlaps(@P3,@P4),ST_AREA(@P3),ST_AREA(@P4),ST_AREA(@P3)+ST_AREA(@P4),ST_AREA(ST_UNION(@P3,@P4));

# ST_AsText(ST_UNION(@P3,@P4)), ST_IsValid(ST_UNION(@P3,@P4)), 
ST_Overlaps(@P3,@P4), ST_AREA(@P3), ST_AREA(@P4), 
ST_AREA(@P3)+ST_AREA(@P4), ST_AREA(ST_UNION(@P3,@P4))
POLYGON((-33347.8079746098 22253.6890186854,-33628.8300411935 
22254.7677825297,-33909.8521383081 22255.8555993163,-34190.8742662132 
22256.9524690546,-34471.8964251594 22258.0583917544,-34472.8097864263 
22026.9076563027,-34473.723101997 21795.7570011262,-34475.5495960449 
21333.455931587,-34194.4976545269 21332.3501114907,-33913.4457440815 
21331.2533435159,-33632.3938644579 21330.1656276532,-33351.3420153963 
21329.086963893,-33070.2901966481 21328.0173522259,-32789.2384079487 
21326.9567926425,-32508.1866490474 21325.9052851336,-32227.1349196909 
21324.8628296901,-32226.281255972 21556.0131249283,-32225.4275495348 
21787.1635004819,-32224.5738003805 22018.3139563528,-32223.72000851 
22249.4644925442,-32504.7419555104 22250.5070447126,-32785.7639320256 
22251.5586497862,-33066.7859383086 22252.619307774,-33347.8079746098 
22253.6890186854),(-33351.3420153963 21329.086963893,-33350.4585715112 
21560.2373571493,-33349.5750834177 21791.3878306986,-33351.3420153963 
21329.086963893)), 1, 0, 1039405.490673892, 1039403.5708021005, 
2078809.0614759924, 2078809.0614759957

上で発生したinterior ringsはたまたまか、面積0のinterior ringsでした。
ST_Buffer()やST_union()などのSpatial Operator Functionsは、geometry 
argumentとしてValidでないポリゴンを適用できないので、上記のように結果としてinterior 
ringsが発生すると、のちの操作に不具合が出る可能性があります。
なお、ST_UNION(@P3,@P4)の結果をワーク変数@P3uP4にsetすると、@P3uP4にはinterior 
ringsは含まれていませんでした。

参照)interior_rings発生.xlsx


3.隣接するポリゴンの境界線上に対応するバーテックスが欠落している場合でも、interior 
ringsが発生しない場合もある

SET @P5 = ST_PolyFromText("POLYGON ((-61869.9747698488 
2760.5382713143,-62151.6328976062 2762.5274782737,-62153.2690408460 
2531.3799600414,-61871.6034974929 2529.3908001828,-61589.9380114108 
2527.4106763882,-61588.3166993481 2758.5581006328,-61869.9747698488 
2760.5382713143))", 2451);
SET @P6 = ST_PolyFromText("POLYGON ((-62153.2690408460 
2531.3799600414,-62149.9966719884 2993.6750758161,-62431.6474412822 
2995.6733663747,-62713.2982683394 2997.6806934599,-62714.9493259382 
2766.5330010955,-62716.6003004125 2535.3853880201,-62434.9346417331 
2533.3781559813,-62153.2690408460 2531.3799600414))", 2451);
SET @P5uP6 = ST_PolyFromText("POLYGON ((-62153.26904084600 
2531.37996004138,-61871.60349749290 2529.39080018284,-61589.93801141080 
2527.41067638817,-61588.31669934810 2758.55810063278,-61869.97476984880 
2760.53827131434,-62151.63284159400 2762.52747787807,-62149.99667198840 
2993.67507581609,-62431.64744128220 2995.67336637473,-62713.29826833940 
2997.68069345994,-62714.94932593820 2766.53300109550,-62716.60030041250 
2535.38538802008,-62434.93464173310 2533.37815598129,-62153.26904084600 
2531.37996004138))", 2451);

select 
ST_AsText(@P5uP6),ST_IsValid(ST_UNION(@P5,@P6)),ST_Overlaps(@P5,@P6),ST_AREA(@P5),ST_AREA(@P6),ST_AREA(@P5)+ST_AREA(@P6),ST_AREA(@P5uP6);
select 
ST_AsText(ST_UNION(@P5,@P6)),ST_IsValid(ST_UNION(@P5,@P6)),ST_Overlaps(@P5,@P6),ST_AREA(@P5),ST_AREA(@P6),ST_AREA(@P5)+ST_AREA(@P6),ST_AREA(ST_UNION(@P5,@P6));
select 
ST_AsText(ST_Intersection(@P5,@P6)),ST_AREA(ST_Intersection(@P5,@P6));

参照)バーテックス欠落ポリゴンのST_UNION成功例.xlsx

-- 
=====================
株式会社 大洋画地
落合 司郎
s.ochiai@xxxxxxxxxx
==============================


添付ファイル

[前][次][番号順一覧][スレッド一覧]