ここに私がやろうとしていることについての簡単な要約があります: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が初めてなので、あまり気にしないでください。ありがとう。
SELECT PostGIS_Full_Version();
戻りますか?