7 votes

Dessiner la portée des caméras avec Postgis

Je travaille sur les données d'une caméra. J'ai quelques points qui consistent en des attributs d'azimut, d'angle, de distance, et bien sûr de champ de coordonnées. Dans postgresql postgis, je veux dessiner des formes comme celle-ci avec des fonctions.

Comment puis-je dessiner cette forme de gamme rose ? Je dois d'abord dessiner un cercle de 360 degrés, puis extraire ma forme... Je ne sais pas comment ?

enter image description here

4voto

Nate Points 1328

Je voudrais créer un cercle autour du point (x,y) avec votre distance de rayon, puis utilisez les informations ci-dessous pour créer un triangle dont la hauteur est supérieure au rayon.

Ensuite, en utilisant ces deux polygones, faites une ST_Intersection entre les deux géométries.

NOTE : Cette méthode ne fonctionne que si l'angle est inférieur à 180 degrés.

Notez que si vous étendez les bords extérieurs et que vous les rencontrez avec un angle de 90 degrés à partir du point central de votre arc, vous avez un angle et un côté adjacent. Maintenant vous pouvez SOH CAH TOA !

Extend and make right triangles

Obtenir les points B et C

Soit le point A = (x,y)

Pour obtenir le meilleur point :

point B = (x + rayon, y + (r * tan(angle))))

pour obtenir le point bas :

point C = (x + rayon, y - (r * tan(angle))))

Faites pivoter votre triangle vers votre azimut

Maintenant que vous avez le triangle, vous devez le faire pivoter vers votre azimut, avec un point de pivot de A. Cela signifie que le point A doit être à l'origine lorsque vous effectuez la rotation. La rotation est la partie la plus délicate. Elle est utilisée en infographie tout le temps. (En fait, si vous connaissez OpenGL, vous pouvez lui faire faire la rotation pour vous).

NOTE : Cette méthode effectue une rotation dans le sens inverse des aiguilles d'une montre d'un angle (thêta) autour de l'origine. Vous devrez peut-être ajuster votre azimut en conséquence.

Première étape : traduire votre triangle de sorte que A (votre x,y d'origine) soit à 0,0. Ce que vous avez ajouté/soustrait à x et y, faites de même pour les deux autres points.

(Vous devez le traduire parce que vous avez besoin que le point A soit à l'origine)

Deuxième étape : Faites ensuite pivoter les points B et C à l'aide d'une matrice de rotation. Plus d'informations aquí mais je vais vous donner la formule :

Rotation matrix

Your new point is (x', y')

Faites de même pour les points B et C.

Troisième étape : Traduisez-les à l'endroit d'origine en ajoutant ou en soustrayant. Si vous avez soustrait x la dernière fois, ajoutez-le cette fois-ci.

Enfin, utilisez les points {A,B,C} pour créer un triangle.

Et ensuite faire une ST_Intersection(geom_circle,geom_triangle) ;

Comme cela nécessite beaucoup de calculs, il serait préférable d'écrire un programme qui effectue tous ces calculs et remplit ensuite un tableau.

0voto

Richard Law Points 155

PostGIS prend en charge les courbes, donc une façon d'y parvenir qui pourrait nécessiter moins de mathématiques de votre part serait de faire quelque chose comme :

SELECT ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')

Ceci décrit un secteur avec une origine à 0,0, un rayon de 10 degrés (coordonnées géographiques), et un angle d'ouverture de 45°.

Enveloppé de fonctions supplémentaires pour le convertir d'une véritable courbe en une LINESTRING de réduire la précision des coordonnées et de le transformer en WKT :

SELECT ST_AsText(ST_SnapToGrid(ST_CurveToLine(ST_GeomFromText('COMPOUNDCURVE((0 0, 0 10), CIRCULARSTRING(0 10, 7.071 7.071, 10 0), (10 0, 0 0))')), 0.01))

Donne :

enter image description here

Cette méthode nécessite quelques informations pré-calculées (la position du centre, des deux sommets adjacents et d'un autre point sur le bord du segment), mais elle a l'avantage de produire une géométrie réellement courbe. Elle fonctionne également avec les segments dont les angles d'ouverture sont supérieurs à 180°.

Un conseil : le 7.071 Les positions x et y utilisées dans l'exemple peuvent être calculées comme suit :

  • x = {radius} cos {angle} = 10 cos 45 ≈ 7.0171
  • y = {radius} sin {angle} = 10 sin 45 ≈ 7.0171

Cas particuliers : à l'antiméridien, et aux pôles.

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