Postgis几何边界上的两个最近点

Sat*_*rma 29 postgresql postgis plpgsql

我有一个geofences存储geometry多边形的表.

我还有一个A在几何体内部的点.我要做的是找到A位于多边形几何体表面上的点的两个最近点.

PostGIS中的功能:

CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry
                                        ,decimal lat
                                        ,decimal lon)
  RETURNS VARCHAR AS
$BODY$

DECLARE height DECIMAL;
DECLARE accuracy VARCHAR(250);

BEGIN 

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) As tempName;

CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291
                                        ,28.0808622876029 99.1304006624291
                                        ,100              200
                                        ,23.0808622876029 96.1304006624291
                                        ))'
                              ,0)
              ) AS area;

CREATE TEMPORARY TABLE distanceStorage ON COMMIT DROP AS
SELECT ST_Distance(
          ST_GeomFromText('POINT(23.0808622876029 96.1304006624291)',-1)
         ,ST_GeomFromText('POINT(28.0808622876029 99.1304006624291)',-1)
         ) AS distance;

height = (SELECT area FROM areaStorage)
        /(0.5*(SELECT distance FROM distanceStorage));

IF height < (SELECT radius_meters
             FROM gfe_geofences Where is_active=true) THEN
   accuracy = "FullConfirm";
   RETURN accuracy;
ELSE
   accuracy = "PartiallyConfirm";
   RETURN accuracy;
END IF;

END;
$BODY$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

我只想在多边形几何的边界上找到两个点.就像我从查询中找到一个:

CREATE TEMPORARY TABLE closePointStorage AS
SELECT ST_AsText(ST_ClosestPoint(geometry
                                ,ST_GeomFromText('POINT(lat lon)',0)
                                )
                ) AS closestPoint 
FROM  (
   SELECT ST_GeomFromText(geometry) as geometry
   FROM gfe_geofences
   WHERE is_active=true
   ) 
AS tempName;
Run Code Online (Sandbox Code Playgroud)

除此之外,我必须找到一个距离大于上面的点但比其余点更小的距离.

Mar*_*nen 1

使用 ST_DumpPoints() 转储多边形的点,然后按 ST_Distance 到 A limit 2 的顺序选择。 ?

所以它就像是

SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;
Run Code Online (Sandbox Code Playgroud)

(假设这是一个内部选择,其中 poly 是多边形,A 是要比较的点,geom 是要比较的多边形中的点之一的 geom 列)