【发布时间】:2012-08-21 23:26:47
【问题描述】:
我有一个表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;
除此之外,我必须再找到一个距离大于上面找到的点但小于其余点的点。
【问题讨论】:
-
双纬度1 = Math.toRadians(26.5534d);双 lon1 = Math.toRadians(75.4925d);双 lat2 = Math.toRadians(28.3650d);双 lon2 = Math.toRadians(77.1232d);双 dellat = (lat2 - lat1);双德隆 = (lon2 - lon1);双 R = 6371;双 a = Math.sin((dellat) / 2) * Math.sin((dellat) / 2) + Math.cos(lat1) * Math.cos(lat2) * Math.sin((dellon) / 2) * Math.sin((dellon) / 2);双 c = 2 * (Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)));双 d = R * c; System.out.println("km = " + d);
-
在循环中计算每个点与点 A 的几何距离,并找出与所有点的两个最小或最小距离。
-
如果您只关心几何中的点,而不关心点之间的线段,您可以将多边形的边界转换为 MULTIPOINT,找到最近的点,将其删除,然后找到第二个最近点。
-
很难解读您添加的评论。为此目的,使用适当的格式更新您的问题。还要在您的问题中为大功能添加一些解释:它应该做什么?它到底在哪里失败?结果应该是什么样子(示例值)?
-
如果您关心线段上的点,则第二近点的定义不明确。假设您有直线 y=1,点 x=2,y=2。直线上最近的点是 x=2, y=1。第二个最近的点将是“紧邻”x=2, y=1,但对于您选择的任何点(例如 x=2.01,y=1),还有另一个更接近的点(x=2.005,y=1)。
标签: postgresql postgis plpgsql