model.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. geom_type = 0
  20. bounding_box = (0,0,1,1)
  21. schema = {}
  22. def __init__(self, qgs_feature):
  23. self._feature = qgs_feature
  24. attributes = dict(zip([f.name() for f in qgs_feature.fields()], qgs_feature.attributes()))
  25. for attr, value in attributes.items():
  26. if isinstance(value, QVariant):
  27. value = value.value() if not value.isNull() else ""
  28. setattr(self, attr, value)
  29. self.geom = qgs_feature.geometry()
  30. self.points = self._extract_points()
  31. def is_geometry_valid(self):
  32. return self._feature.geometry().isGeosValid()
  33. def get_geom_type(self):
  34. return QgsWkbTypes.singleType(self._feature.geometry().wkbType())
  35. def get_bounding_box(self):
  36. bb = self._feature.geometry().boundingBox()
  37. return (bb.xMinimum(), bb.yMinimum(), bb.xMaximum(), bb.yMaximum())
  38. def _extract_points(self):
  39. if self.geom.isNull():
  40. return []
  41. multi_geom = QgsGeometry()
  42. temp_geom = []
  43. if self.geom.type() == 0: # it's a point
  44. if self.geom.isMultipart():
  45. temp_geom = self.geom.asMultiPoint()
  46. else:
  47. temp_geom.append(self.geom.asPoint())
  48. elif self.geom.type() == 1: # it's a line
  49. if self.geom.isMultipart():
  50. multi_geom = self.geom.asMultiPolyline() #multi_geog is a multiline
  51. for i in multi_geom: #i is a line
  52. temp_geom.extend( i )
  53. else:
  54. temp_geom = self.geom.asPolyline()
  55. elif self.geom.type() == 2: # it's a polygon
  56. if self.geom.isMultipart():
  57. multi_geom = self.geom.asMultiPolygon() #multi_geom is a multipolygon
  58. for i in multi_geom: #i is a polygon
  59. for j in i: #j is a line
  60. temp_geom.extend( j )
  61. else:
  62. multi_geom = self.geom.asPolygon() #multi_geom is a polygon
  63. for i in multi_geom: #i is a line
  64. temp_geom.extend( i )
  65. return [QgsPoint(p) for p in temp_geom]