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

前端之家收集整理的这篇文章主要介绍了postgresql – Postgis几何边界上的两个最近点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个表地理围栏存储多边形的几何。

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

PostGIS中的函数

  1. CREATE OR REPLACE FUNCTION accuracyCheck(Polygon geometry,decimal lat,decimal lon)
  2. RETURNS VARCHAR AS
  3. $BODY$
  4.  
  5. DECLARE height DECIMAL;
  6. DECLARE accuracy VARCHAR(250);
  7.  
  8. BEGIN
  9.  
  10. CREATE TEMPORARY TABLE closePointStorage AS
  11. SELECT ST_AsText(ST_ClosestPoint(geometry,ST_GeomFromText('POINT(lat lon)',0)
  12. )
  13. ) AS closestPoint
  14. FROM (
  15. SELECT ST_GeomFromText(geometry) as geometry
  16. FROM gfe_geofences
  17. WHERE is_active=true
  18. ) As tempName;
  19.  
  20. CREATE TEMPORARY TABLE areaStorage ON COMMIT DROP AS
  21. SELECT ST_Area(ST_GeomFromText('Polygon((23.0808622876029 96.1304006624291,28.0808622876029 99.1304006624291,100 200,23.0808622876029 96.1304006624291
  22. ))',0)
  23. ) AS area;
  24.  
  25. CREATE TEMPORARY TABLE distanceStorage ON COMMIT DROP AS
  26. SELECT ST_Distance(
  27. ST_GeomFromText('POINT(23.0808622876029 96.1304006624291)',-1),ST_GeomFromText('POINT(28.0808622876029 99.1304006624291)',-1)
  28. ) AS distance;
  29.  
  30. height = (SELECT area FROM areaStorage)
  31. /(0.5*(SELECT distance FROM distanceStorage));
  32.  
  33. IF height < (SELECT radius_meters
  34. FROM gfe_geofences Where is_active=true) THEN
  35. accuracy = "FullConfirm";
  36. RETURN accuracy;
  37. ELSE
  38. accuracy = "PartiallyConfirm";
  39. RETURN accuracy;
  40. END IF;
  41.  
  42. END;
  43. $BODY$ LANGUAGE plpgsql;

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

  1. CREATE TEMPORARY TABLE closePointStorage AS
  2. SELECT ST_AsText(ST_ClosestPoint(geometry,0)
  3. )
  4. ) AS closestPoint
  5. FROM (
  6. SELECT ST_GeomFromText(geometry) as geometry
  7. FROM gfe_geofences
  8. WHERE is_active=true
  9. )
  10. AS tempName;

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

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

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

  1. B -= A //vector subtraction
  2. C -= A

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

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

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

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

现在得到距离

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

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

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

猜你在找的Postgre SQL相关文章