29 votes

Deux points les plus proches sur la frontière de la géométrie Postgis

J'ai une table geofences qui stocke geometry de polygone.

J'ai aussi un point d' A qui est à l'intérieur de la géométrie. Ce que j'ai à faire est de trouver les deux points les plus proches du point A qui se trouvent sur la surface de la géométrie de 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 frontière du polygone de la géométrie. Tout comme j'ai trouvé l'un de 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;

D'autres ensuite ce stade, je dois en trouver un plus avec la distance plus grande que la point trouver ci-dessus, mais plus petite que le reste des points.

1voto

stitty Points 192

Je suis en supposant 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 " de la ligne [A,B] 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 d'Un qui est à angle droit par rapport à C

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

Maintenant obtenir la distance

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

Vous ne savez pas comment le faire en SQL. Vous aurez besoin de faire la ci-dessus pour chaque bord sur votre polygone, et ensuite trouver la plus petite valeur d'

Par la façon dont le signe de la croix-produit de B et C va maintenant vous dire si le point est à l'intérieur du polygone ou pas

0voto

Markus Mikkolainen Points 2228

Utilisez ST_DumpPoints () pour vider les points du polygone, puis sélectionnez dans cet ordre par ST_Distance jusqu'à une limite 2.?

C'est donc quelque chose comme

 SELECT * from ST_DumpPoints(poly) order by ST_Distance(A,geom) asc limit 2;
 

(suppose qu'il s'agit d'une sélection interne où poly est le polygone, A est le point à comparer et geom est la colonne geom de l'un des points du poly à comparer)

0voto

flup Points 12250

Il n'y a généralement pas de deuxième point le plus proche sur le polygone de limite, si vous incluez les lignes. Tout comme il n'y a pas de deuxième nombre réel proche de zéro. Soit vous ne souhaitez considérer que les points dans les coins, comme le suggère Markus. Ou vous n'avez qu'un seul point le plus proche.

0voto

jsh Points 1067

1) une Sorte de champ gauche idée, 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 ce jeu avec l'ensemble des points situés sur les bords du polygone (qui je suppose peut-être une autre PostGIS fonction, vous n'avez pas utilisé postG dans un moment donc je ne suis pas sûr)

3) plus Loin dans le champ à gauche, vidage de certains de votre jeu de données en Mongo et utiliser le $près de fonction... http://docs.mongodb.org/manual/reference/operator/near/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X