| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- '''
- @author: olivier.massot, 2018
- '''
- import logging
- from qgis.core import QgsWkbTypes, QgsGeometry, QgsPoint
- from PyQt5.QtCore import QVariant
- logger = logging.getLogger("mncheck")
- class QgsModel():
-
- GEOM_UNKNOWN = 0
- GEOM_POINT = 1
- GEOM_LINE = 2
- GEOM_POLYGON = 3
- GEOM_MULTIPOINT = 4
- GEOM_MULTILINE = 5
- GEOM_MULTIPOLYGON = 6
-
- GEOM_NAMES = {0: "(AUCUN)", 1: "POINT", 2: "LIGNE", 3: "POLYGONE",
- 4: "MULTI-POINT", 5:"MULTI-LIGNE", 6:"MULTI-POLYGONE"}
-
- layername = ""
- pk = ""
- geom_type = 0
- bounding_box = (0,0,1,1)
- schema = {}
- def __init__(self, qgs_feature):
-
- self._feature = qgs_feature
-
- attributes = dict(zip([f.name() for f in qgs_feature.fields()], qgs_feature.attributes()))
-
- for attr, value in attributes.items():
- if isinstance(value, QVariant):
- value = value.value() if not value.isNull() else ""
- setattr(self, attr, value)
-
- self.geom = qgs_feature.geometry()
-
- self.points = self._extract_points()
-
- def is_geometry_valid(self):
- return self._feature.geometry().isGeosValid()
-
- def get_geom_type(self):
- return QgsWkbTypes.singleType(self._feature.geometry().wkbType())
-
- def get_bounding_box(self):
- bb = self._feature.geometry().boundingBox()
- return (bb.xMinimum(), bb.yMinimum(), bb.xMaximum(), bb.yMaximum())
-
- def _extract_points(self):
- if self.geom.isNull():
- return []
-
- multi_geom = QgsGeometry()
- temp_geom = []
-
- if self.geom.type() == 0: # it's a point
- if self.geom.isMultipart():
- temp_geom = self.geom.asMultiPoint()
- else:
- temp_geom.append(self.geom.asPoint())
- elif self.geom.type() == 1: # it's a line
- if self.geom.isMultipart():
- multi_geom = self.geom.asMultiPolyline() #multi_geog is a multiline
- for i in multi_geom: #i is a line
- temp_geom.extend( i )
- else:
- temp_geom = self.geom.asPolyline()
- elif self.geom.type() == 2: # it's a polygon
- if self.geom.isMultipart():
- multi_geom = self.geom.asMultiPolygon() #multi_geom is a multipolygon
- for i in multi_geom: #i is a polygon
- for j in i: #j is a line
- temp_geom.extend( j )
- else:
- multi_geom = self.geom.asPolygon() #multi_geom is a polygon
- for i in multi_geom: #i is a line
- temp_geom.extend( i )
-
- return [QgsPoint(p) for p in temp_geom]
|