mn3_apd.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. '''
  2. Schéma de validation des données MN2
  3. @author: olivier.massot, 2018
  4. '''
  5. import logging
  6. from qgis.core import QgsProject
  7. from core.cerberus_ import is_positive_int, is_positive_float
  8. from core.checking import BaseChecker
  9. from core.mncheck import QgsModel
  10. logger = logging.getLogger("mncheck")
  11. SCHEMA_NAME = "Schéma MN v3 APD"
  12. XMIN, XMAX, YMIN, YMAX = 1341999, 1429750, 8147750, 8294000
  13. CRS = 'EPSG:3949' # Coordinate Reference System
  14. TOLERANCE = 0.5
  15. STATUTS = ['ETUDE PRELIMINAIRE', 'ETUDE DE DIAGNOSTIC', 'AVANT-PROJET PROJET', 'PROJET', 'PASSATION DES MARCHES DE TRAVAUX',
  16. 'ETUDE D EXECUTION', 'TRAVAUX' , 'RECOLEMENT', 'MAINTIEN EN CONDITIONS OPERATIONNELLES']
  17. ##### Modeles
  18. class SiteTelecom(QgsModel):
  19. layername = "SITE_TELECOM"
  20. geom_type = QgsModel.GEOM_POINT
  21. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  22. pk = "ST_CODE"
  23. schema = {'ST_CODE': {'type': 'string', 'empty': False},
  24. 'ST_NOM': {'type': 'string', 'empty': False},
  25. 'ST_TYPFCT': {'type': 'string', 'empty': False, 'allowed': ['SITE HEBERGEMENT',
  26. 'NOEUD RACCORDEMENT OPTIQUE',
  27. 'SOUS-REPARTITEUR OPTIQUE',
  28. 'SOUS-REPARTITEUR OPTIQUE COLOCALISE',
  29. 'NOEUD RACCORDEMENT D ABONNES',
  30. 'NOEUD RACCORDEMENT D ABONNES - HAUT DEBIT',
  31. 'NOEUD RACCORDEMENT D ABONNES - MONTEE EN DEBIT']},
  32. 'ST_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
  33. 'ST_NBPRISE': {'empty': False, 'validator': is_positive_int}
  34. }
  35. class SiteClient(QgsModel):
  36. layername = "SITE_CLIENT"
  37. geom_type = QgsModel.GEOM_POINT
  38. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  39. schema = {'SC_TYPFON': {'type': 'string', 'empty': False, 'allowed': ['RESIDENTIEL', 'PROFESSIONNEL', 'OPERATEUR', 'TECHNIQUE']},
  40. 'SC_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
  41. 'SC_NBPRISE': {'empty': False, 'validator': is_positive_int},
  42. 'SC_NBPRHAB': {'empty': False, 'validator': is_positive_int},
  43. 'SC_NBPRPRO': {'empty': False, 'validator': is_positive_int},
  44. 'SC_ID_SITE': {'type': 'string', 'empty': False},
  45. 'SC_NUM_RUE': {'type': 'string', 'empty': False},
  46. 'SC_REPET': {'type': 'string', 'empty': False},
  47. 'SC_DNUBAT': {'type': 'string', 'empty': False},
  48. 'SC_DESC': {'type': 'string', 'empty': False},
  49. 'SC_NOM_RUE': {'type': 'string', 'empty': False},
  50. 'SC_NOM_COM': {'type': 'string', 'empty': False},
  51. 'SC_ETAT': {'type': 'string', 'empty': False, 'allowed': ['VALIDE', 'OBSOLETE', 'NOUVEAU', 'FUTUR']},
  52. 'SC_ATT_PTO': {'empty': False, 'validator': is_positive_float}
  53. }
  54. class Cable(QgsModel):
  55. layername = "CABLE"
  56. geom_type = QgsModel.GEOM_LINE
  57. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  58. schema = {'CA_TYPFON': {'type': 'string', 'empty': False, 'allowed': ['COLLECTE TRANSPORT DISTRIBUTION', 'COLLECTE', 'COLLECTE TRANSPORT', 'COLLECTE DISTRIBUTION', 'TRANSPORT DISTRIBUTION', 'TRANSPORT', 'DISTRIBUTION', 'RACCORDEMENT FINAL', 'BOUCLE METROPOLITAINE', 'LONGUE DISTANCE (LONG HAUL)', 'NON COMMUNIQUE']},
  59. 'CA_TYPSTR': {'type': 'string', 'empty': False, 'allowed': ['CONDUITE', 'AERIEN', 'COLONNE MONTANTE', 'IMMERGE', 'FACADE']},
  60. 'CA_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]},
  61. 'CA_CAPFO': {'empty': False, 'validator': is_positive_int},
  62. 'CA_MODULO': {'empty': False, 'validator': is_positive_int},
  63. 'CA_SUPPORT': {'type': 'string', 'empty': False, 'allowed': ['0', '1']}
  64. }
  65. class Zapbo(QgsModel):
  66. layername = "ZAPBO"
  67. geom_type = QgsModel.GEOM_POLYGON
  68. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  69. schema = {'ZP_NBPRISE': {'empty': False, 'validator': is_positive_int},
  70. 'ZP_ISOLE': {'type': 'string', 'empty': False, 'allowed': ['0', '1']},
  71. 'ZP_STATUT': {'type': 'string', 'empty': False, 'allowed': [STATUTS]}
  72. }
  73. class Zasro(QgsModel):
  74. layername = "ZASRO"
  75. geom_type = QgsModel.GEOM_POLYGON
  76. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  77. schema = {'ZS_CODE': {'type': 'string', 'empty': False},
  78. 'ZS_NBPRISE': {'empty': False, 'validator': is_positive_int}
  79. }
  80. class Adduction(QgsModel):
  81. layername = "ADDUCTION"
  82. geom_type = QgsModel.GEOM_LINE
  83. bounding_box = (XMIN,YMIN,XMAX,YMAX)
  84. schema = {'AD_ISOLE': {'type': 'string', 'empty': False, 'allowed': ['0', '1']},
  85. 'AD_LONG': {'empty': False, 'validator': is_positive_float}
  86. }
  87. models = []
  88. ####### Validateur
  89. class Mn3ApdChecker(BaseChecker):
  90. def setUp(self):
  91. self.dataset = {}
  92. for model in models:
  93. model.layer = next((l for l in QgsProject.instance().mapLayers().values() \
  94. if l.name().lower() == model.layername.lower()), None)
  95. self.dataset[model] = [model(f) for f in model.layer.getFeatures()] if model.layer else []
  96. checkers = [Mn3ApdChecker]