PostGIS - Bir çizginin veya çokgenin içinde bir nokta al


10

markerUygulamam için bir çizginin veya çokgenin merkez noktasını almam gerekiyor . Böylece bir işaretçiyi tıklattığınızda geometri görünür (çizgi veya çokgen). Kullandığım ST_Centroidçalışması için.

Sonuç olarak, sentroidlerin geometrinin dışında olduğu bazı çokgenleri veya çizgileri dürüstçe bekledim. Bu çizgiler veya çokgenler için ne istiyorum "en merkez noktası" ama geometri içinde elde etmektir.

Bunu nasıl yapabilirim? Bir çözüm var mı?

Yanıtlar:


9

Dokümandan : ST_PointOnSurface - Yüzeyde yatması garanti edilen bir POINT döndürür.


4
0,5 kesirli ST_LineInterpolatePoint satırları için mükemmel olmalıdır postgis.net/docs/manual-2.1/ST_LineInterpolatePoint.html
user30184

ST_PointOnSurface (), Lines ile çalışır! (thx Postgis)
WKT

Evet! Haklısın @ user30184 çünkü ST_PointOnSurface () satırları için bir nokta keyfi alır, emin değilim ama doc örneğinde bir LineString ilk noktasını alır gibi görünüyor.
Jose Hermosilla Rodrigo

7

Benim durumumda disktint tablolarında her geometri var. Yaptığım şey:

  1. Hatlar için -> ST_LineInterpolatePoint()0.5 faktörü ile.
  2. Çokgenler için -> ST_Centroid()Geometrisinin içinde olup olmadığını test edin . Eğer öyleyse, ST_Centroid()en iyi seçimdir, eğer değilse PointOnSurface().

İşte sorgu:

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
&& operatörü yalnızca bbox'ı kontrol eder. ST_intersects () öğesini kullanmak isteyebilirsiniz.
WKT

Haklısın. Ben hatalıydım. Cevabımı güncelleyeceğim. Teşekkürler!
Jose Hermosilla Rodrigo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.