python: Aide à implémenter un algorithme pour trouver le minimum-area-rectangle pour des points donnés afin de calculer la longueur de l'axe majeur et mineur
J'ai un ensemble de points (points noirs en coordonnées géographiques de la valeur) provenant de l'enveloppe convexe (en bleu) d'un polygone (rouge). voir la Figure:
[(560023.44957588764,6362057.3904932579),
(560023.44957588764,6362060.3904932579),
(560024.44957588764,6362063.3904932579),
(560026.94957588764,6362068.3904932579),
(560028.44957588764,6362069.8904932579),
(560034.94957588764,6362071.8904932579),
(560036.44957588764,6362071.8904932579),
(560037.44957588764,6362070.3904932579),
(560037.44957588764,6362064.8904932579),
(560036.44957588764,6362063.3904932579),
(560034.94957588764,6362061.3904932579),
(560026.94957588764,6362057.8904932579),
(560025.44957588764,6362057.3904932579),
(560023.44957588764,6362057.3904932579)]
J'ai besoin de calculer la majeures et mineures de l'axe de la longueur des étapes suivantes (forme ce post écrire dans la R-projet et dans Java) ou à la suite de la cet exemple de procédure
- Calculer l'enveloppe convexe d'un nuage.
- Pour chaque bord de l'enveloppe convexe:
2a. calculer le bord de l'orientation,
2b. rotation de l'enveloppe convexe à l'aide de cette orientation afin de calculer facilement le rectangle de délimitation de la zone avec un min/max de x/y de la rotation de l'enveloppe convexe,
2c. Magasin de l'orientation correspondant à la superficie minimale trouvé, - Retourner le rectangle correspondant à la zone minimale trouvé.
Après ce que nous savons de la La l'angle Thêta (représenté l'orientation du rectangle de délimitation par rapport à l'axe des y de l'image). Le minimum et le maximum de un et b sur tous les points limites sont
trouvé:
- un(xi,yi) = xi*cos Theta + yi sin Theta
- b(xi,yi) = xi*sin Theta + yi cos Theta
Les valeurs (a_max - a_min) et (b_max - b_min) a défini la longueur et la largeur, respectivement,
le rectangle de délimitation pour une direction Thêta.
source d'informationauteur Gianni Spear
Vous devez vous connecter pour publier un commentaire.
J'ai juste mis en œuvre moi-même, alors j'ai pensé que je voudrais déposer ma version ici pour les autres à voir:
Voici quatre exemples dans l'action. Pour chaque exemple, j'ai généré 4 points aléatoires et trouvé la boîte englobante.
(modifier par @heltonbiker)
Un code simple pour le traçage:
(fin edit)
C'est relativement rapide, trop pour ces échantillons sur 4 points:
Lien vers la même réponse sur les sig.stackexchange pour ma propre référence.
Il y a un module qui fait déjà sur github.
https://github.com/BebeSparkelSparkel/MinimumBoundingBox
Tout ce que vous devez faire est d'insérer votre nuage de points.
Vous pouvez obtenir les majeurs et mineurs de l'axe des longueurs par:
Il renvoie également la zone, rectangle centre, rectangle, l'angle et les points d'angle.
J'ai trouvé recette pour calculer convexe coques.
Si nous parlons de "solutions complètes" (une fonction pour faire tout genre de trucs), j'ai trouvé que
arcpy
qui fait partie deArcGIS
programme. Il fournitMinimumBoundingGeometry_management
fonction qui ressemble à ce que vous recherchez. Mais il n'est pas open source. Malheureusement, il y a un manque de python bibliothèques SIG open source.OpenCV a cette. Voir ceci:
http://docs.opencv.org/trunk/dd/d49/tutorial_py_contour_features.html
7.b. Tourné Rectangle
Avec
Vous pouvez obtenir la longueur et la largeur du rectangle, ainsi que son angle. Vous pouvez également calculer les angles, si vous souhaitez dessiner.