model.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. import logging
  5. from qgis.core import QgsWkbTypes, QgsGeometry, QgsPoint
  6. from PyQt5.QtCore import QVariant
  7. logger = logging.getLogger("mncheck")
  8. class QgsModel():
  9. GEOM_UNKNOWN = 0
  10. GEOM_POINT = 1
  11. GEOM_LINE = 2
  12. GEOM_POLYGON = 3
  13. GEOM_MULTIPOINT = 4
  14. GEOM_MULTILINE = 5
  15. GEOM_MULTIPOLYGON = 6
  16. GEOM_NAMES = {0: "(AUCUN)", 1: "POINT", 2: "LIGNE", 3: "POLYGONE",
  17. 4: "MULTI-POINT", 5:"MULTI-LIGNE", 6:"MULTI-POLYGONE"}
  18. layername = ""
  19. pk = ""
  20. geom_type = 0
  21. bounding_box = (0,0,1,1)
  22. schema = {}
  23. def __init__(self, qgs_feature):
  24. self._feature = qgs_feature
  25. attributes = dict(zip([f.name() for f in qgs_feature.fields()], qgs_feature.attributes()))
  26. for attr, value in attributes.items():
  27. if isinstance(value, QVariant):
  28. value = value.value() if not value.isNull() else ""
  29. setattr(self, attr, value)
  30. self.geom = qgs_feature.geometry()
  31. self.points = self._extract_points()
  32. def is_geometry_valid(self):
  33. return self._feature.geometry().isGeosValid()
  34. def get_geom_type(self):
  35. return QgsWkbTypes.singleType(self._feature.geometry().wkbType())
  36. def get_bounding_box(self):
  37. bb = self._feature.geometry().boundingBox()
  38. return (bb.xMinimum(), bb.yMinimum(), bb.xMaximum(), bb.yMaximum())
  39. def _extract_points(self):
  40. if self.geom.isNull():
  41. return []
  42. multi_geom = QgsGeometry()
  43. temp_geom = []
  44. if self.geom.type() == 0: # it's a point
  45. if self.geom.isMultipart():
  46. temp_geom = self.geom.asMultiPoint()
  47. else:
  48. temp_geom.append(self.geom.asPoint())
  49. elif self.geom.type() == 1: # it's a line
  50. if self.geom.isMultipart():
  51. multi_geom = self.geom.asMultiPolyline() #multi_geog is a multiline
  52. for i in multi_geom: #i is a line
  53. temp_geom.extend( i )
  54. else:
  55. temp_geom = self.geom.asPolyline()
  56. elif self.geom.type() == 2: # it's a polygon
  57. if self.geom.isMultipart():
  58. multi_geom = self.geom.asMultiPolygon() #multi_geom is a multipolygon
  59. for i in multi_geom: #i is a polygon
  60. for j in i: #j is a line
  61. temp_geom.extend( j )
  62. else:
  63. multi_geom = self.geom.asPolygon() #multi_geom is a polygon
  64. for i in multi_geom: #i is a line
  65. temp_geom.extend( i )
  66. return [QgsPoint(p) for p in temp_geom]