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 ==============================