Outils pour utilisateurs

Outils du site


informatique:ign_bdortho

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:ign_bdortho [08/04/2026 10:04] – [IGN BdOrtho] cyrilleinformatique:ign_bdortho [10/07/2026 09:06] (Version actuelle) – [Outils] cyrille
Ligne 3: Ligne 3:
 Des versions de la BdOrtho sont accessibles en [[/glossaire/TMS|TMS]] via https://data.geopf.fr/tms/1.0.0/ Des versions de la BdOrtho sont accessibles en [[/glossaire/TMS|TMS]] via https://data.geopf.fr/tms/1.0.0/
  
-Il y a aussi des version à télécharger sur <del>https://geoservices.ign.fr/telechargement-api/BDORTHO</del> https://cartes.gouv.fr/rechercher-une-donnee/dataset/IGNF_BD-ORTHO+Il y a aussi des version à télécharger sur <del>https://geoservices.ign.fr/telechargement-api/BDORTHO</del> le lien est maintenant https://cartes.gouv.fr/rechercher-une-donnee/dataset/IGNF_BD-ORTHO -> penser à scroller !! 
 + 
 +Pour récupérer automatiquement ou détecter les nouveautés: 
 +  * https://data.geopf.fr/telechargement/resource/BDORTHO?format=JP2-E080&page=2 
 +  * https://data.geopf.fr/telechargement/resource/BDORTHO?zone=D036&format=JP2-E080&page=1 
 +  * la réponse (Atom) contient les entrées pour la pagination: ''page'', ''pagesize'', ''pagecount'', ''totalentries'
  
 ===== Indre-et-Loire (37) ===== ===== Indre-et-Loire (37) =====
  
-  * https://geoservices.ign.fr/telechargement-api/BDORTHO?zone=D037+  * <del>https://geoservices.ign.fr/telechargement-api/BDORTHO?zone=D037</del>
   * 20 cm en RVB au 01/01/2025 BDORTHO_2-0_RVB-0M20_JP2-E080_LAMB93_D037_2025-01-01   * 20 cm en RVB au 01/01/2025 BDORTHO_2-0_RVB-0M20_JP2-E080_LAMB93_D037_2025-01-01
   * 7 fichiers 7z contenant des images au format JP2/JPEG2000 pour 28.3 Go   * 7 fichiers 7z contenant des images au format JP2/JPEG2000 pour 28.3 Go
Ligne 16: Ligne 21:
 ===== Outils ===== ===== Outils =====
  
-P'tit script Python pour découper les JP2 en JPG 640 pixels pour Yolo:+P'tit script Python pour découper les JP2 en JPG 640 pixels pour Yolo (//utilisé pour [[/informatique/ai_lm/ai_vision#panneaux_solaires_photovoltaiques|AI Vision panneaux photovoltaiques]]//: 
 + 
 +📢 À noter que c'est plusieurs heures de traitement, ~> 4h selon les départements et les dossiers des tuiles font entre 20 et 30 Go.
  
 <code python> <code python>
 """ """
 Installation: Installation:
-pip install rasterio pillow numpy tqdm+pip3 install rasterio pillow numpy tqdm
 """ """
 import rasterio import rasterio
Ligne 34: Ligne 41:
 import argparse import argparse
 import sys import sys
 +
 +#os.environ["GDAL_CACHEMAX"] = "24000000000"
  
 def decouper_fichier_jp2(fichier, dossier_sortie, taille=640): def decouper_fichier_jp2(fichier, dossier_sortie, taille=640):
Ligne 44: Ligne 53:
         shutil.copy(fichier_tab, os.path.join(sous_dossier, f"{nom_base}.tab"))         shutil.copy(fichier_tab, os.path.join(sous_dossier, f"{nom_base}.tab"))
     # Découpe le fichier JP2 en tuiles JPG     # Découpe le fichier JP2 en tuiles JPG
 +    # optimize only for write "blockxsize=taille*100, blockysize=taille*100"
 +    # GDAL possède un cache interne (GDAL_CACHEMAX) qui garde les blocs décompressés en mémoire.
 +    # Si un bloc est relu pour deux tuiles adjacentes, il est servi depuis le cache sans décompression supplémentaire.
 +    # Par défaut ce cache est à 5% de la RAM, mais on peut l'augmenter via :
 +    #os.environ["GDAL_CACHEMAX"] = "12000000000"
 +    #with rasterio.Env(CPL_DEBUG=True, GDAL_CACHEMAX=12000000000):
     with rasterio.open(fichier) as src:     with rasterio.open(fichier) as src:
         h, w = src.shape         h, w = src.shape
Ligne 49: Ligne 64:
         nb_tuiles_w = w // taille         nb_tuiles_w = w // taille
         total_tuiles = nb_tuiles_h * nb_tuiles_w         total_tuiles = nb_tuiles_h * nb_tuiles_w
 +        # Update progress bar every 100 tiles instead of every tile
 +        update_interval = 50
 +        tile_count = 0
         # réserve un buffer pour limiter une allocation à chaque tuile.         # réserve un buffer pour limiter une allocation à chaque tuile.
         buffer = np.empty((src.count, taille, taille), dtype=np.uint8)         buffer = np.empty((src.count, taille, taille), dtype=np.uint8)
-        with tqdm(total=total_tuiles, desc=f"Traitement de {nom_base}") as pbar:+        with tqdm(total=total_tuiles, desc=f"Découpe {nom_base}") as pbar:
             for y in range(0, h, taille):             for y in range(0, h, taille):
                 for x in range(0, w, taille):                 for x in range(0, w, taille):
Ligne 60: Ligne 78:
                         img = Image.fromarray(tile_rgb)                         img = Image.fromarray(tile_rgb)
                         img.save(f"{sous_dossier}/{nom_base}_x{x}_y{y}.jpg")                         img.save(f"{sous_dossier}/{nom_base}_x{x}_y{y}.jpg")
-                        pbar.update(1)+                        tile_count += 1 
 +                        if tile_count % update_interval == 0: 
 +                            pbar.update(update_interval) 
 +            pbar.update(tile_count % update_interval)
  
 def decouper_jp2_en_tuiles_parallele(dossier_entree, dossier_sortie, taille=640, nb_threads=4): def decouper_jp2_en_tuiles_parallele(dossier_entree, dossier_sortie, taille=640, nb_threads=4):
Ligne 66: Ligne 87:
     fichiers = glob.glob(os.path.join(dossier_entree, "*.jp2"))     fichiers = glob.glob(os.path.join(dossier_entree, "*.jp2"))
     #fichiers = glob.glob(os.path.join(dossier_entree, "37-2025-0505-6715-LA93-0M20-E080.jp2"))     #fichiers = glob.glob(os.path.join(dossier_entree, "37-2025-0505-6715-LA93-0M20-E080.jp2"))
-    with ThreadPoolExecutor(max_workers=nb_threads) as executor: +    with tqdm(total=len(fichiers), desc=f"Dossier {os.path.basename(dossier_entree)}", unit="image") as pbar: 
-        futures = [executor.submit(decouper_fichier_jp2, fichier, dossier_sortie, taille) for fichier in fichiers] +        with ThreadPoolExecutor(max_workers=nb_threads) as executor: 
-        for future in as_completed(futures): +            futures = [executor.submit(decouper_fichier_jp2, fichier, dossier_sortie, taille) for fichier in fichiers] 
-            future.result()  # Attend la fin de chaque tâche+            for future in as_completed(futures): 
 +                future.result()  # Attend la fin de chaque tâche 
 +                pbar.update(1)
  
 if __name__ == "__main__": if __name__ == "__main__":
Ligne 76: Ligne 99:
     parser.add_argument("folder_in", help="Dossier des images à traiter (obligatoire)")     parser.add_argument("folder_in", help="Dossier des images à traiter (obligatoire)")
     parser.add_argument("folder_out", help="Dossier de sorties pour les tuiles découpées (obligatoire)")     parser.add_argument("folder_out", help="Dossier de sorties pour les tuiles découpées (obligatoire)")
-    parser.add_argument("--threads", type=int, default=4, help="Combien de threads pour la découpe(défaut: 4).")+    parser.add_argument("--threads", type=int, default=4, help="Combien de threads pour la découpe (défaut: 4).")
     args = parser.parse_args()     args = parser.parse_args()
  
informatique/ign_bdortho.1775635441.txt.gz · Dernière modification : de cyrille

Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante : CC0 1.0 Universal
CC0 1.0 Universal Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki