MNT.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import os
  2. import tempfile
  3. import py7zr
  4. def ConstruitMNT(nom, listeLambert, dossier, reduction=1):
  5. """
  6. Construit un fichier RCL simple à partir de tuiles Lambert.
  7. Format RCL :
  8. ligne 1 : facteur
  9. ligne 2 : largeur
  10. ligne 3 : hauteur
  11. ligne 4 : liste des altitudes
  12. reduction :
  13. 1 = résolution originale
  14. 2 = moyenne sur blocs 2x2
  15. 5 = moyenne sur blocs 5x5
  16. """
  17. dossier = dossier + "MNT"
  18. if reduction < 1:
  19. raise ValueError("La réduction doit être >= 1")
  20. taille = int(len(listeLambert) ** 0.5)
  21. if taille * taille != len(listeLambert):
  22. raise ValueError("La liste ne forme pas un carré complet")
  23. terrain = []
  24. with tempfile.TemporaryDirectory() as tmp:
  25. for ligne_tuile in range(taille):
  26. ligne_fichiers = listeLambert[
  27. ligne_tuile * taille:
  28. (ligne_tuile + 1) * taille
  29. ]
  30. fichiers = []
  31. for lambert in ligne_fichiers:
  32. archive_path = os.path.join(
  33. dossier,
  34. f"RGEALTI_FXX_{lambert.replace(';','_')}_MNT_LAMB93_IGN69.asc.7z"
  35. )
  36. with py7zr.SevenZipFile(
  37. archive_path,
  38. "r"
  39. ) as archive:
  40. noms = archive.getnames()
  41. archive.extractall(tmp)
  42. nom_asc = None
  43. for fichier in noms:
  44. if fichier.endswith(".asc"):
  45. nom_asc = os.path.join(tmp, fichier)
  46. break
  47. f = open(nom_asc, "r")
  48. for _ in range(6):
  49. next(f)
  50. fichiers.append(f)
  51. for _ in range(1000):
  52. ligne = []
  53. for f in fichiers:
  54. ligne.extend(
  55. float(x)
  56. for x in f.readline().split()
  57. )
  58. terrain.append(ligne)
  59. for f in fichiers:
  60. f.close()
  61. # -------------------------------
  62. # Réduction par moyenne
  63. # -------------------------------
  64. if reduction > 1:
  65. nouvelle_hauteur = len(terrain) // reduction
  66. nouvelle_largeur = len(terrain[0]) // reduction
  67. nouveau = []
  68. for y in range(nouvelle_hauteur):
  69. ligne = []
  70. for x in range(nouvelle_largeur):
  71. somme = 0
  72. nombre = 0
  73. for yy in range(
  74. y * reduction,
  75. (y + 1) * reduction
  76. ):
  77. for xx in range(
  78. x * reduction,
  79. (x + 1) * reduction
  80. ):
  81. somme += terrain[yy][xx]
  82. nombre += 1
  83. ligne.append(
  84. somme / nombre
  85. )
  86. nouveau.append(ligne)
  87. terrain = nouveau
  88. hauteur = len(terrain)
  89. largeur = len(terrain[0])
  90. donnees = []
  91. for ligne in terrain:
  92. donnees.extend(ligne)
  93. with open(nom + ".rcl", "w") as f:
  94. f.write("1\n")
  95. f.write(str(largeur) + "\n")
  96. f.write(str(hauteur) + "\n")
  97. f.write(str(donnees))
  98. print(
  99. f"RCL créé : {nom}.rcl "
  100. f"({largeur} x {hauteur})"
  101. )