加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:44:57 所属栏目:百科 来源:网络整理
导读:我有一个表地理围栏存储多边形的几何。 我也有一个点A在几何体内。我要做的是找到位于多边形几何体表面上的点A的两个最近点。 PostGIS中的函数: CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry,decimal lat,decimal lon) RETURNS VARCHAR AS$B
我有一个表地理围栏存储多边形的几何。

我也有一个点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;

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

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

其他然后这一点,我必须找到一个更多的距离大于然后点找到以上,但小于其余的点。

我假设你想找到通过最接近问题点的多边形的边缘

为了从线[A,B]获得点’C’的距离’d’
首先翻译所有点,A为0,0

B -= A  //vector subtraction
C -= A

然后归一化B,使其长度为1.0

len = sqrt( B . B) //dotproduct of two vectors is the length squared
B /= len  //scalar divide by length

从A找到与C成直角的长度

dotp = B . C  //dot product again
closestPointOnLine =  B * dotp  //scalar multiply

现在得到距离

diff = (C - ClosestPointOnLine)
d = sqrt(diff . diff)

不知道如何在SQL中做到这一点。您将需要对多边形上的每个边做上述操作,然后找到最小值’d’

顺便说一下,B和C的叉积的符号现在会告诉你点是否在多边形的内部

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读