PostGIS'de poligonun içindeki bir noktayı nasıl bulabilirim?


22

PostGIS’te belirli bir poligonda olması garanti edilen bir noktayı nasıl bulabilirim?

ST_Centroidİşlevin farkındayım . Bununla birlikte, centroid her zaman bir poligonda değildir, aşağıya bakın:

çokgen dışında yatan bir centroid

Ayrıca, çokgen sınırında olan bir nokta kullanmaktan kaçınmak istiyorum, ama bunun yerine sınırın içinde olanı (ve çörek şeklindeki çokgenlerde bir delik içinde değil) kullanmaktan kaçınmak istiyorum.

Yanıtlar:


17

Size poligonunuzun içinde bir nokta söyleyen bir PostGIS işlevi arıyorsanız, o zaman ST_PointOnSurface işlevi size ihtiyacınız olanı verebilir.

SELECT 
   ST_AsText(ST_PointOnSurface('POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))'::geometry));

   st_astext
----------------
 POINT(2.5 2.5)
(1 row)

6

Bu işlevi PostGIS posta listesinde buldum. Sanırım istediğin bu:

CREATE OR REPLACE FUNCTION point_inside_geometry(param_geom geometry)
  RETURNS geometry AS
$$
  DECLARE
     var_cent geometry := ST_Centroid(param_geom);
     var_result geometry := var_cent;
  BEGIN
  -- If the centroid is outside the geometry then 
  -- calculate a box around centroid that is guaranteed to intersect the geometry
  -- take the intersection of that and find point on surface of intersection
 IF NOT ST_Intersects(param_geom, var_cent) THEN
  var_result := ST_PointOnSurface(ST_Intersection(param_geom, ST_Expand(var_cent, ST_Distance(var_cent,param_geom)*2) ));
 END IF;
 RETURN var_result;
  END;
  $$
  LANGUAGE plpgsql IMMUTABLE STRICT
  COST 100;

Bu çözümün, ST_PointOnSurface'ten daha centroid'e daha yakın bir nokta vermesini seviyorum, ama aynı zamanda poligonun kenarına daha yakın bir nokta üretti. ST_PointOnSurface, herhangi bir kenardan mümkün olduğunca uzak bir nokta seçmiş gibi görünüyor. Sanırım sizin için doğru çözümü seçtiği sürece bir zevk meselesi.
dslh
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.