J'essaie de créer un algorithme similaire à la zone de délimitation minimale (bien qu'il puisse finir par ne rien ressembler). Dans ce cas, l'angle sera passé en paramètre et étant donné l'angle, j'ai besoin du plus petit rectangle couvrant tous mes points / polygones. Jusqu'à présent, ma ligne de pensée est de trouver le centre de mes points (algorithme centroïde), et de là créer deux lignes parallèles avec le même angle que l'angle paramétrique, et deux autres lignes perpendiculaires à celles-ci. Ensuite, en utilisant l'itération, déplacez ces lignes vers l'extérieur (dans des directions opposées) jusqu'à ce qu'elles contiennent tous les points. Il n'a pas non plus besoin d'être une zone de délimitation minimale exacte, des travaux approximatifs (je suppose que cela dépend de la taille de chaque étape d'itération).
Voici mon code jusqu'à présent. J'ai déjà dissous tous mes polygones en un seul. Je prends ensuite une coque convexe pour réduire les sommets. J'ai ensuite mis tous les sommets dans une liste - je ne sais pas si cela aide encore ...
a = layer.getFeatures()
for feat in a:
geom = feat.geometry()
a = geom.convexHull()
vertexId = QgsVertexId()
vertices = []
b = a.constGet().nextVertex(vertexId)
while b[0]:
vertices.append(b[1])
b = a.constGet().nextVertex(vertexId)
Remarques: À un moment donné, je dois passer l'angle de la boîte. J'utilise QGIS 3 et je dois le créer en Python. La couche «couche» a une géométrie, le polygone dissous de tous les autres polygones - peut-être qu'une itération n'est pas nécessaire pour y accéder.
Veuillez me faire savoir si je devrais transmettre plus de détails / informations.
Réponses:
Voici le code complet. Il contient trop de lignes (bien plus que nécessaire pour sûr) mais cela fonctionne. Vous pouvez maintenant le nettoyer si vous le souhaitez.
En résumé, l'algorithme calcule la distance maximale entre les lignes parallèles qui ont la pente définie par le paramètre de rotation et passent par les points. Pour chaque point, une ligne «horizontale» et «verticale» sera créée. Ces noms sont juste orientatifs car ils sont définis à la position 0 (rotation = 0). Ainsi, pour chaque point externe, il sera créé ces 2 lignes posibles puis, de manière itérative, le poligon sera créé sur la base des 4 externes, ou dit autrement, où la distance des lignes parallèles est maximale.
Une dernière chose: il est conçu pour être utilisé dans QGIS 3.8 avec de l'herbe.
la source