29

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

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

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;

除了这一点之外,我必须再找到一个距离大于上面找到的点但小于其余点的点。

4

4 回答 4

1

我假设您想找到最接近相关点的多边形边缘

距离问题

要获得点 'C' 到线 [A,B] 的距离 '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 的叉积的符号现在将告诉您该点是否在多边形内部

于 2013-01-30T03:40:16.100 回答
1

1)有点左场的想法,但是要找到离您的目的地最近的第二个点,为什么不找到离您已经找到的点最近的点呢?

2)或者,与您的具体问题更密切相关,

  • 在点的某个合理范围内找到点的集合,
  • 找到该集合与位于多边形边界上的点集合的交集(我猜这可能是另一个 PostGIS 函数;有一段时间没有使用 postG,所以我不确定)

3)进一步进入左侧字段,将一些数据集转储到 Mongo 并使用 $near 函数... http://docs.mongodb.org/manual/reference/operator/near/

于 2013-01-15T20:53:58.660 回答
1

如果包含线,边界多边形上通常没有第二最近点。就像没有第二个最接近零的实数一样。要么你只想考虑角落的点,就像马库斯建议的那样。或者你只有一个最近的点。

于 2013-01-13T01:53:04.823 回答
1

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

所以它就像

SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;

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

于 2013-01-04T13:21:34.203 回答