mncheck.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. import importlib
  5. import inspect
  6. import logging
  7. import pkgutil
  8. from qgis.core import QgsWkbTypes, QgsGeometry, QgsPoint
  9. from PyQt5.QtCore import QVariant
  10. from core.checking import BaseChecker
  11. logger = logging.getLogger("mncheck")
  12. def list_schemas():
  13. import schemas
  14. return [name for _, name, ispkg in pkgutil.iter_modules(schemas.__path__) if not (ispkg or name[0] == '_')]
  15. def get_schema(schema_name):
  16. return importlib.import_module("schemas." + schema_name)
  17. def get_checkers(schema):
  18. return [cls for _, cls in inspect.getmembers(schema, predicate=inspect.isclass) \
  19. if issubclass(cls, BaseChecker) and not cls is BaseChecker]
  20. class QgsModel():
  21. GEOM_UNKNOWN = 0
  22. GEOM_POINT = 1
  23. GEOM_LINE = 2
  24. GEOM_POLYGON = 3
  25. GEOM_MULTIPOINT = 4
  26. GEOM_MULTILINE = 5
  27. GEOM_MULTIPOLYGON = 6
  28. GEOM_NAMES = {0: "(AUCUN)", 1: "POINT", 2: "LIGNE", 3: "POLYGONE",
  29. 4: "MULTI-POINT", 5:"MULTI-LIGNE", 6:"MULTI-POLYGONE"}
  30. layername = ""
  31. geom_type = 0
  32. bounding_box = (0,0,1,1)
  33. schema = {}
  34. pk = ""
  35. def __init__(self, qgs_feature):
  36. self._feature = qgs_feature
  37. self.__dict__.update(self.attributes())
  38. @staticmethod
  39. def _clean_attr(self, value=None):
  40. if isinstance(value, QVariant):
  41. return value.value() if not value.isNull() else ""
  42. elif value is None:
  43. return ""
  44. else:
  45. return value
  46. @property
  47. def feature(self):
  48. return self._feature
  49. def attributes(self):
  50. return dict(zip([f.name() for f in self._feature.fields()],
  51. [QgsModel._clean_attr(a) for a in self._feature.attributes()]))
  52. @property
  53. def geom(self):
  54. return self._feature.geometry()
  55. def is_geometry_valid(self):
  56. return self._feature.geometry().isGeosValid()
  57. def get_geom_type(self):
  58. return QgsWkbTypes.singleType(self._feature.geometry().wkbType())
  59. def get_bounding_box(self):
  60. bb = self._feature.geometry().boundingBox()
  61. return (bb.xMinimum(), bb.yMinimum(), bb.xMaximum(), bb.yMaximum())
  62. def get_points(self):
  63. if self.geom.isNull():
  64. return []
  65. multi_geom = QgsGeometry()
  66. temp_geom = []
  67. if self.geom.type() == 0: # it's a point
  68. if self.geom.isMultipart():
  69. temp_geom = self.geom.asMultiPoint()
  70. else:
  71. temp_geom.append(self.geom.asPoint())
  72. elif self.geom.type() == 1: # it's a line
  73. if self.geom.isMultipart():
  74. multi_geom = self.geom.asMultiPolyline() #multi_geog is a multiline
  75. for i in multi_geom: #i is a line
  76. temp_geom.extend( i )
  77. else:
  78. temp_geom = self.geom.asPolyline()
  79. elif self.geom.type() == 2: # it's a polygon
  80. if self.geom.isMultipart():
  81. multi_geom = self.geom.asMultiPolygon() #multi_geom is a multipolygon
  82. for i in multi_geom: #i is a polygon
  83. for j in i: #j is a line
  84. temp_geom.extend( j )
  85. else:
  86. multi_geom = self.geom.asPolygon() #multi_geom is a polygon
  87. for i in multi_geom: #i is a line
  88. temp_geom.extend( i )
  89. return [QgsPoint(p) for p in temp_geom]
  90. def validate(schema_name):
  91. try:
  92. schema = get_schema(schema_name)
  93. except ModuleNotFoundError:
  94. logger.critical(f"Le schéma {schema_name} n'existe pas")
  95. return
  96. results = schema.checker.run()
  97. return results