mncheck.py 3.9 KB

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