sql >> データベース >  >> RDS >> PostgreSQL

st_intersectionが非ポリゴンを返すのはなぜですか?

    ST_intersect 相対トポロジに応じて、いくつかのジオメトリタイプを返します。

    たとえば、ST_intersectを実行します 隣接する2つのポリゴンで、共有境界の共通部分を返します。

    (たとえば、pgadminで確認できるように)単一のテーブルを出力しますが、QGISのブラウザスウォッチでは、異なるジオメトリタイプ(たとえば、POLYGON、MULTIPOLY、LINE、およびPOINT)の複数のテーブルとして表示されますが(やや紛らわしい)同じ名前。

    視覚的には、左側の付随するアイコンを観察することで、それらを区別することができます:

    ただし、たとえばST_Dimensionを使用してWHEREフィルタを追加することにより、必要なジオメトリのタイプを選択できます。 :

    SELECT      a.*,
                b.*,
                st_intersection(a.geom, b.geom) as geom
    FROM        a,b
    WHERE       st_intersects(a.geom, b.geom) 
                AND ST_Dimension(st_intersects(a.geom, b.geom)) = 2;
    

    または、パフォーマンスのために、次のような方法で書き直します。

    SELECT clipped.* 
    FROM (
             SELECT a.id, b."fieldName",
                 (ST_Dump(ST_Intersection(a.geom, b.geom))).geom AS geom
             FROM "public"."table_A_name" AS a INNER JOIN "public"."table_B_name" AS b   
             ON ST_Intersects(a.geom, b.geom)
         ) AS clipped
    WHERE ST_Dimension("clipped"."geom") = 2;
    

    後者のソリューションは、ST_Intersectionを許可する匿名の一時テーブルを作成します 一度だけ実行します。

    トリックがST_Dimension("clipped"."geom") = 2にあることに気づいたかもしれません。 。

    ST_Dimensions ST_Intersectionからの出力をフィルタリングします ポリゴン(トポロジの次元が2)のみを保持するようにします。




    1. バックグラウンドプロセス

    2. SQLServer2012/2014での隠れたパフォーマンスと管理性の向上

    3. MySQLまたはMariaDB用のHAソリューションを作成する際の信頼性の低いネットワークへの対処

    4. PHPコードがHTMLの前に実行されるのはなぜですか?