Deux points les plus proches sur la limite de la géométrie Postgis
j'ai une table geofences
quels magasinsgeometry
de polygone.
j'ai aussi un point A
qui est à l'intérieur de la géométrie. Ce que je dois faire est de trouver les deux points les plus proches du point A
qui se trouvent à la surface de la géométrie du polygone.
Fonction dans 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;
je veux juste trouver deux points sur la limite de la géométrie du polygone. Tout comme j'en ai trouvé un dans la requête:
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;
autre que ce point je dois trouvez un de plus avec la distance plus grande que le point trouver ci-dessus, mais plus petit que le reste des points.
4 réponses
je suppose que vous voulez trouver le bord du polygone qui passe le plus près du point en question
pour obtenir la distance " d "du point" C " par rapport à la ligne [A, B] Tout d'abord traduire tous les points donc A est à 0,0
B -= A //vector subtraction
C -= A
Puis normaliser B de sorte qu'il est de longueur 1,0
len = sqrt( B . B) //dotproduct of two vectors is the length squared
B /= len //scalar divide by length
trouver la longueur de A qui est à angle droit de C
dotp = B . C //dot product again
closestPointOnLine = B * dotp //scalar multiply
Maintenant obtenir la distance
diff = (C - ClosestPointOnLine)
d = sqrt(diff . diff)
ne savez Pas comment faire qu'en SQL. Vous aurez besoin de faire la ci-dessus pour chaque bord sur votre polygone, et ensuite trouver la plus petite valeur d'
d'ailleurs le signe du produit croisé de B et C vous dira maintenant si le point est à l'intérieur du polygone ou non
Utilisez ST_DumpPoints () pour vider les points du polygone, puis sélectionnez de cet ordre Par ST_Distance à une limite 2. ?
Donc, c'est quelque chose comme
SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;
(suppose qu'il s'agit d'un select intérieur où poly est le polygone, A est le point à comparer à et geom est la colonne geom d'un des points dans le poly étant comparé)
il n'y a généralement pas de deuxième point le plus proche sur le polygone, si vous incluez les lignes. Tout comme il n'y a pas de vrai nombre deuxième plus proche de zéro. Soit vous voulez seulement considérer les points aux coins, comme Markus suggère. Ou vous n'avez qu'un point le plus proche.
1) une sorte d'idée de champ gauche, mais pour trouver le deuxième-point le plus proche de votre destination, pourquoi ne pas trouver le point le plus proche du point que vous avez déjà trouvé?
2) Ou, plus germaine à votre question spécifique,
- trouver l'ensemble des points à l'intérieur de certains éventail raisonnable de le point,
- trouver l'intersection de cet ensemble avec l'ensemble des points situés sur la frontière polygonale (qui je devine peut-être une autre fonction PostGIS; n'ont pas utilisé postG dans un moment donc je ne suis pas sûr)
3) plus loin dans le champ gauche, videz une partie de vos données dans Mongo et utilisez la fonction $near... http://docs.mongodb.org/manual/reference/operator/near/