ST_Intersectionの使用方法


15

ここに私がやろうとしていることについての簡単な要約があります:Postgresには、「a」と「b」の3つのテーブルがあり、それぞれにPolygon列があり、「c」にPoint列があります。ここでやろうとしているのは、「a」、「b」、「c」の間のジオメトリの交差を取得し、そのようなジオメトリをOpenLayersベクターレイヤーに表示することです。

OpenLayersでStringの任意の種類のジオメトリを表示する方法は既に知っていますが、PostGISのST_Intersection関数で問題が発生しています。これを実行しています。

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

ここで、a.geomとb.geomは両方ともジオメトリ列であり、次のエラーメッセージが表示されます。

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

また、次のようなST_AsTextを使用して、結果のジオメトリをテキストとして表現しようとしました。

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

しかし、それは私にこのエラーメッセージを送信します:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

何が間違っているのか分かりませんが、ポリゴンのWKTをOpenLayersに表示したいだけです。WKTからジオメトリを表示する方法は次のとおりです。

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

更新:次を試しました:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

しかし、次のエラーメッセージが表示されます。

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

有効なポリゴンのみが評価されていることを確認するためにisvalidを追加しましたが、エラーはST_Intersection(a、b)にあり、a、b、cの両方が同じSRIDを持っているので、本当に混乱しています。あまりに質問しますが、私はPostGISが初めてなので、あまり気にしないでください。ありがとう。


1
何がSELECT PostGIS_Full_Version();戻りますか?
マイクT

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "Rel。4.7.1、2009年9月23日" USE_STATS
Uriel

回答:


8

私の推測では、交差点がNULLを返すと失敗します。したがって、WKTを作成する前に、実際に交差点があるかどうかをチェックするwhere句を追加する必要があります。


私はこれを試しました:SELECT ST_Intersection(a.geom、b.geom)as intersection_ab FROM a INNER JOIN b ON ST_Intersection(a、b)WHERE ST_Overlaps(a.geom、b.geom)AND ST_isvalid(a.geom)= 't 'AND ST_isvalid(b.geom)=' t '; しかし、それは同じエラーを返しました:**エラー:関数st_intersection(a、b)は存在しません。ヒント:指定された名前と引数のタイプに一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。**私は本当にこれで立ち往生しています、あなたが私を助けることができるならば、私は本当にそれを感謝します。
ウリエル

summary(a.geom)とsummary(b.geom)を試して、値を調べてください。
暗闇

概要--------------------------リング0が1つのリング[0]に4つのリングがありますリング0が1つのリング[0]に5つのリングがありますポイント1リングのポリゴン[BS]リング0には10ポイントがあります
Uriel

ええ、それはST_Intersection(a.geom、b.geom)ないST_Intersection(A、B)でなければなりません
アンダーダーク

6

手がかりは

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

エラーメッセージに、st_intersectionをそのように使用することはできないと書かれています。他の答えを要約すると、次のようなものを使用する必要があります。

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

私の知る限りでは使用しても意味はありませんst_overlapsST_Intersectsはを同じ文では、彼らはかなり似ています


4

ポリゴンの異なるレイヤー間でテストしますが、レイヤーの1つに少なくとも無効なジオメトリがあると失敗しました。ST_isvalid(the_geom)を使用してポリゴンの妥当性を確認しましたか?それが鍵かもしれません。


私はこれを試しました:SELECT ST_Intersection(a.geom、b.geom)as intersection_ab FROM a INNER JOIN b ON ST_Intersection(a、b)WHERE ST_Overlaps(a.geom、b.geom)AND ST_isvalid(a.geom)= 't 'AND ST_isvalid(b.geom)=' t '; しかし、それは同じエラーを返しました:**エラー:関数st_intersection(a、b)は存在しません。ヒント:指定された名前と引数のタイプに一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。**私は本当に、なぜそれが機能していないによう迷ってしまいました
ウリエル

2

次のようなものを試してください:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

ソース


私も試してみましたが、同じエラーメッセージが返されます。ヒント:指定された名前と引数のタイプに一致する関数はありません。明示的な型キャストを追加する必要がある場合があります。
ウリエル

「ST_Intersection(a.geom、b.geom)でINNER JOIN b ON」を使用する場合はどうですか?
CaptDragon

エラー:JOIN / ONの引数は、ジオメトリではなくブール型である必要があります。
ウリエル

shizer ...このタイプのクエリは私にとってうまくいくので、データまたは何かに問題があるはずです。
CaptDragon

AND ST_isvalid(a.geom)= 't' AND ST_isvalid(b.geom)= 't';を追加しました。最後に有効なジオメトリのみを評価しますが、st_intersection(a、b)にエラーがあることを教えてくれます
Uriel

1

無効なジオメトリを除外しようとしましたが、機能しませんでした。そのため、最終的には無効なジオメトリをすべて削除してからこれを使用する必要がありました。

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

ご覧のとおり、ST_Intersection(a、b)の部分を省略しましたが、これは非常にうまく機能しました。こっちで。


0

この問題は一度ありました。

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

この方法でこのエラーを解決できました。
-利用QGIS
-データベースからベクトル層を追加
-エラーメッセージからポイントを取り、QGISでそれを検索
   「QuickWKT」(プラグイン)がそれを見つけるために使用することができ
そして、あなたは問題がラインストリングが表示されます-
編集モードをオンにします-
- 「ノードツール」を選択して緑色のノードを表示します(ノードの問題)
-ノードをオーバーラップノードから遠ざけます
-変更を保存します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.