PostGIS-선이나 다각형 안에 점을 가져옵니다


10

marker앱 을 만들려면 선 또는 다각형의 중심점을 가져와야합니다 . 마커를 클릭하면 형상 (선 또는 다각형)이 나타납니다. 나는 ST_Centroid그것을 작동시키는 데 사용 했다.

결과는 중심이 형상에서 벗어난 일부 다각형 또는 선을 예상하지 못한 것입니다. 이 선이나 다각형에 대해 원하는 것은 "가장 중심점"이지만 지오메트리 내부를 얻는 것입니다.

어떻게해야합니까? 해결책이 있습니까?

답변:


9

문서에서 : ST_PointOnSurface — 표면에 놓인 POINT를 반환합니다.


4
ST_LineInterpolatePoint 라인이 0.5 인 경우 postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184

ST_PointOnSurface ()는 Lines와 함께 작동합니다! (thx Postgis)
WKT

예! ST_PointOnSurface () 행의 경우 임의의 점을 취하는 것처럼 보이므로 @ user30184가 맞습니다.하지만 확실하지 않지만 doc 예제에서는 LineString의 첫 번째 점을 사용합니다.
Jose Hermosilla Rodrigo

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

네가 옳아. 내가 틀렸어. 답변을 업데이트하겠습니다. 감사!
Jose Hermosilla Rodrigo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.