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.

29
demandé sur Erwin Brandstetter 2012-08-27 17:07:02

4 réponses

je suppose que vous voulez trouver le bord du polygone qui passe le plus près du point en question

distance from line problem

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

1
répondu stitty 2013-01-30 21:40:15

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é)

0
répondu Markus Mikkolainen 2013-01-04 13:21:34

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.

0
répondu flup 2013-01-13 01:53:04

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/

0
répondu jsh 2013-01-15 20:53:58