ST_PointOnSurfaceはどのように計算されますか?


21

PostGISのドキュメントには、ST_PointOnSurface「表面上にあることが保証されたポイント」を返すと記載されています。PostGISが非自明な実装を提供していることは確かですが、この関数を簡単に実装してドキュメントを満足させる結果を得ることができますが、実際の実用性はほとんどありません。

PostGISのこの導入は、素敵な比較とのコントラストを提供ST_CentroidしてをST_PointOnSurfaceし、「[ST_PointOnSurface]は実質的に多くの計算コスト重心操作よりもある」と述べています。

ST_PointOnSurface計算方法の詳細な説明はありますか?私はを使用ST_Centroidしていますが、重心がジオメトリの外側にあるデータのエッジケースに遭遇しました。私はそれST_PointOnSurfaceが正しい代替品であると信じていますが、関数名とドキュメントには不確実性の余地が残されています。

さらに、ST_PointOnSurface重心が既にジオメトリ内にある場合でも、発生する計算費用はかかりますか?


非凸ポリゴンの重心が常に含まれているわけではないため、正確に存在します。名前の紛らわしい部分である場合、高さとDEMとは関係ありません。実装の詳細はコードで最もよくチェックされますが、GIS.seでより良い答えが得られると思います。
lynxlynxlynx

GIS.seの良い点。この質問をそこに移行する方法はありますか?両方の機能が存在する理由を理解しています。私が作業しているポリゴンジオメトリの表面には無限に多くのポイントがあるため、名前がわかりにくいと感じています。ただし、これらのポイントの小さなサブセットのみが私の目的に役立ちます。私はそれをどのように使いたいかについて理にかなっているポイントを得ていることを知りたいです。

回答:


24

いくつかの実験に基づいてST_PointOnSurface()、ジオメトリがポリゴンの場合、おおよそ次のように機能すると思います。

  1. ポリゴンの北と南の範囲の中間にある東西の光線をトレースします。
  2. ポリゴンと交差する光線の最長セグメントを見つけます。
  3. このセグメントに沿った中間点を返します。

それは理にかなっていないかもしれないので、ここではポリゴンを北と南に分割する光線のスケッチです:

             _
            / \             <-- northern extent
           /   \
          /     \
         /       \
        /         \      __
       /           \    /  \
      /_ _ _ P _ _ _\  / _ _\  P = point-on-surface
     /               \/      \
    /                         \
   /            C              \   C = centroid
  /                             \
 /                              /
/______________________________/  <-- southern extent

このように、ST_PointOnSurface()ST_Centroid()さえ凸多角形で、通常は異なる点です。

名前の「表面」の唯一の理由は、ジオメトリに3Dラインがある場合、結果は単に頂点の1つになるからだと思います。

より多くの説明(およびより良い命名)が有用であったことに同意し、GEOSプログラマーがこの問題にもう少し光を当てることを願っています。


3
libgeosコードを見るとあなたは正しいと思います。水平二等分線が見つかった後、最も広い交差点の中点が使用されます。
mjobrien
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.