mncheck.py 4.6 KB

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