I have list of points and I want to create a polygon.
First I need to sort points for that I tried:
- Find the center point of all points
- Calculated angle from the center to each point,
- Based on angle sorted the points
but in some cases it's given an irregular polygon:
def createrIntersectionPoly(self, geom):
bbx = geom.boundingBox()
features = [x for x in self.roadedgelayer.getFeatures(
QgsFeatureRequest().setFilterRect(bbx).setFlags(QgsFeatureRequest.ExactIntersect))]
vertices = [j for i in features for j in i.geometry().vertices() if
QgsGeometry().fromPointXY(QgsPointXY(j)).within(geom)]
if len(vertices) > 3:
centerpoint = self.getCenterPoint(vertices)
pointsorder = {self.getLineAngele(i, centerpoint): i for i in vertices}
# print(pointsorder)
polygonpoints = [QgsPointXY(pointsorder[i]) for i in sorted(pointsorder.keys())]
self.intpolylayer.startEditing()
polygoem = QgsGeometry().fromPolygonXY([polygonpoints])
feat = QgsFeature(self.intpolylayer.fields())
feat.setGeometry(polygoem)
self.intpolylayer.addFeature(feat)
self.intpolylayer.commitChanges()
@staticmethod
def getCenterPoint(vertices):
totalpoints = len(vertices)
centerpointx = sum([i.x() for i in vertices]) / totalpoints
centerpointy = sum([i.y() for i in vertices]) / totalpoints
return QgsPoint(QgsPointXY(centerpointx, centerpointy))
@staticmethod
def getLineAngele(point1, point2):
rad = math.atan2(point1.x() - point2.x(), point1.y() - point2.y())
return rad * (180 / math.pi) if rad > 0 else 360 + (rad * (180 / math.pi))
But when point in u shape polygon creates zigzag
How can I sort points to create a polygon?