PostGIS-ラインまたはポリゴン内のポイントを取得します


10

markerアプリ用に作成する線またはポリゴンの中心点を取得する必要があります。マーカーをクリックすると、ジオメトリが表示されます(ラインまたはポリゴン)。以前は機能さST_Centroidせていました。

結果は、重心がジオメトリの外にあるいくつかのポリゴンまたはラインのネストを解除することを期待したものです。これらのラインまたはポリゴンに必要なのは、「最も中心点」を取得することですが、ジオメトリの内側にあります。

これどうやってするの?解決策はありますか?

回答:


9

ドキュメントから:ST_PointOnSurface —サーフェス上にあることが保証されているPOINTを返します。


4
ラインの場合、フラクション0.5のST_LineInterpolatePointは完全なはずですpostgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184 '10

ST_PointOnSurface()は線で動作します!(thx Postgis)
WKT

はい!ST_PointOnSurface()が任意の点をとるように見えるので、あなたは正しい@ user30184です。わかりませんが、ドキュメントの例ではLineStringの最初の点をとっています。
Jose Hermosilla Rodrigo 2016年

7

私の場合、各ジオメトリを離散テーブルに持っています。私がしたことは:

  1. ラインの場合 -> ST_LineInterpolatePoint()0.5係数。
  2. ポリゴンの場合-> ST_Centroid()がそのジオメトリ内にあるかどうかをテストします。もしそうST_Centroid()なら、私が選ぶならそうでなければ、最良の選択PointOnSurface()です。

これがクエリです:

SELECT
    CASE WHEN (SELECT the_geom FROM points WHERE gid = d.gid) IS NOT NULL
    THEN (SELECT the_geom FROM points WHERE gid = d.gid)
    WHEN (SELECT the_geom FROM lines WHERE gid = d.gid) IS NOT NULL
    THEN ST_LineInterpolatePoint((SELECT the_geom FROM lines WHERE gid = d.gid), 0.5)
    WHEN (SELECT the_geom FROM polygons WHERE gid = d.gid AND ST_Intersects(ST_Centroid(the_geom),the_geom)) IS NOT NULL
    THEN ST_Centroid((SELECT the_geom FROM polygons WHERE gid = d.gid))
    ELSE ST_PointOnSurface((SELECT the_geom FROM polygons WHERE gid = d.gid))
    END AS center
FROM someTable d

5
&&演算子はbboxのみをチェックします。ST_intersects()を使用することもできます。
WKT 2016年

あなたが正しい。私は間違っていた。回答を更新します。ありがとう!
Jose Hermosilla Rodrigo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.