Ich habe eine Tabelle geofences
, die geometry
von Polygon speichert.Zwei nächste Punkte auf der Grenze der Postgis-Geometrie
Ich habe auch einen Punkt A
, die in der Geometrie ist. Was ich zu tun habe, ist die beiden nächsten Punkte von Punkt A
zu finden, die auf der Oberfläche der Polygongeometrie liegen.
Funktion in 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;
Ich möchte nur zwei Punkte auf der Grenze der Polygongeometrie zu finden. Genau wie ich habe eine von der Frage gefunden:
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;
Andere dann diesem Punkt Ich habe noch eine finden, mit Abstand größer ist dann der Punkt oben finden, aber kleiner als die übrigen Punkte.
double lat1 = Math.toRadians (26.5534d); \t \t double lon1 = Math.toRadians (75.4925d); \t \t double lat2 = Math.toRadians (28.3650d); \t \t doppelt lon2 = Math.toRadians (77.1232d); \t \t double dellat = (lat2 - lat1); \t \t Doppeldellon = (lon2 - lon1); \t \t doppelt R = 6371; \t \t Doppel a = Math.sin ((dellat)/2) * Math.sin ((dellat)/2) \t \t \t \t + Math.cos (LAT1) * Math.cos (LAT2) * Math.sin ((dellon)/2) \t \t \t \t * Math.sin ((dellon)/2); \t \t Doppel-c = 2 * (Math.atan2 (Math.sqrt (a), Math.sqrt (1 - a))); \t \t doppelt d = R * c; \t \t System.out.println ("Wert der Entfernung in km =" + d); –
berechnet die Entfernung in Schleife für jeden Punkt von Geometrie mit Punkt A und finden Sie die beiden kleinsten oder minimalen Abstand von allem. –
Wenn Sie nur die Punkte in der Geometrie und nicht die Liniensegmente zwischen Punkten interessieren, können Sie die Grenze des Polygons in ein MULTIPOINT umwandeln, den nächsten Punkt finden, entfernen und dann den zweitnächsten Punkt finden. –