def iter_download_pdfs(cadastreWebsite, code_departement, code_commune, ratio=PDF_DOWNLOAD_PIXELS_RATIO, mode=PDF_DOWNLOAD_SPLIT_MODE, nb=PDF_DOWNLOAD_SPLIT_NB, size=PDF_DOWNLOAD_SPLIT_SIZE, wait=PDF_DOWNALOD_WAIT_SECONDS,force_bbox=None): cadastreWebsite.set_departement(code_departement) cadastreWebsite.set_commune(code_commune) projection = cadastreWebsite.get_projection() bbox = cadastreWebsite.get_bbox() write_string_to_file(projection + ":%f,%f,%f,%f" % bbox, code_commune + ".bbox") if force_bbox: bbox = OSMToCadastreTransform(projection).transform_bbox( BoundingBox(*force_bbox)) if mode=="SIZE": liste = decoupage_bbox_cadastre_size(bbox, size, ratio) else: liste = decoupage_bbox_cadastre_nb(bbox, nb, ratio) for ((i,j), sous_bbox, (largeur,hauteur)) in liste: pdf_filename = code_commune + ("-%d-%d" % (i,j)) + ".pdf" bbox_filename = code_commune + ("-%d-%d" % (i,j)) + ".bbox" sous_bbox_str = projection + (":%f,%f,%f,%f" % sous_bbox) #sys.stdout.write((pdf_filename + " " + sous_bbox_str + "\n").encode("utf-8")) #sys.stdout.flush(); write_string_to_file(sous_bbox_str, bbox_filename) if not (os.path.exists(pdf_filename) and os.path.exists(pdf_filename + ".ok")): if os.path.exists(pdf_filename + ".ok"): os.remove(pdf_filename + ".ok") write_stream_to_file( cadastreWebsite.open_pdf(sous_bbox, largeur, hauteur), pdf_filename) open(pdf_filename + ".ok", 'a').close() time.sleep(wait) yield pdf_filename
def iter_download_parcelles_xml(cadastreWebsite, index_parcelles): # La requette vers le site du cadastre pour récupéré les fichiers xml correspondant au cadastre # est limité à 2000 résultats. # On utilise donc les limites extraites depuis les export pdf du cadastre pour creer un index spatial, # et évaluer le nombre de parcelles qui sont dans une zonne donnée, afin de la découper de tel sorte qu'il # ait moins de 2000 résultats. for name, bbox in decoupe_bbox_selon_taille_index( cadastreWebsite.get_bbox(), index_parcelles, MAX_PARCELLES_PAR_BBOX, cadastreWebsite.code_commune + "-parcelles"): filename = name + ".xml" ok_filename = filename + ".ok" sys.stdout.write((filename + "\n").encode("utf-8")) sys.stdout.flush() if not (os.path.exists(filename) and os.path.exists(ok_filename)): if os.path.exists(filename): os.remove(filename) if os.path.exists(ok_filename): os.remove(ok_filename) xmlstring = cadastreWebsite.get_parcelles(*bbox) write_string_to_file(xmlstring, filename) open(ok_filename, 'a').close() time.sleep(ATTENTE_EN_SECONDE_ENTRE_DOWNLOAD) else: xmlstring = open(filename).read() yield xmlstring
def cadastre_vers_pdfs(argv): i = 1 ratio=PDF_DOWNLOAD_PIXELS_RATIO mode=PDF_DOWNLOAD_SPLIT_MODE nb=PDF_DOWNLOAD_SPLIT_NB size=PDF_DOWNLOAD_SPLIT_SIZE wait=PDF_DOWNALOD_WAIT_SECONDS bbox=None while i < len(argv): if argv[i].startswith("-"): if argv[i] in ["-h", "-help","--help"]: print_help() return elif argv[i] in ["-r", "-ratio","--ratio"]: ratio = float(argv[i+1]) del(argv[i:i+2]) elif argv[i] in ["-s", "-size","--size"]: size = int(argv[i+1]) mode = "SIZE" del(argv[i:i+2]) elif argv[i] in ["-n", "-nb","--nb"]: nb = int(argv[i+1]) mode = "NB" del(argv[i:i+2]) elif argv[i] in ["-w", "-wait","--wait"]: wait = float(argv[i+1]) del(argv[i:i+2]) elif argv[i] in ["-b", "-bbox","--bbox"]: bbox = argv[i+1] if not BBOX_OPTION_FORMAT.match(bbox): command_line_error(u"paramètre bbox invalide: " + bbox) return bbox = map(float,bbox.split(",")) del(argv[i:i+2]) else: command_line_error(u"option invalide: " + argv[i]) return else: i = i + 1 if len(argv) == 1: command_line_open_cadastre(argv) elif len(argv) == 2: error = command_line_open_cadastre(argv) if error: command_line_error(error) elif len(argv) > 3: command_line_error(u"trop d'arguments") else: cadastreWebsite = command_line_open_cadastre(argv) if type(cadastreWebsite) in [str, unicode]: command_line_error(cadastreWebsite, help=False) else: code_departement = cadastreWebsite.code_departement code_commune = cadastreWebsite.code_commune nom_commune = cadastreWebsite.communes[code_commune] sys.stdout.write((u"Teléchargement des PDFs de la commune " + code_commune + " : " + nom_commune + "\n").encode("utf-8")) sys.stdout.flush() write_string_to_file("", code_commune + "-" + nom_commune + ".txt") return list(iter_download_pdfs(cadastreWebsite, code_departement, code_commune,mode=mode,size=size,nb=nb,ratio=ratio,wait=wait,force_bbox=bbox))
def iter_download_pdfs(cadastreWebsite, code_departement, code_commune, ratio=PDF_DOWNLOAD_PIXELS_RATIO, mode=PDF_DOWNLOAD_SPLIT_MODE, nb=PDF_DOWNLOAD_SPLIT_NB, size=PDF_DOWNLOAD_SPLIT_SIZE, wait=PDF_DOWNALOD_WAIT_SECONDS, force_bbox=None): cadastreWebsite.set_departement(code_departement) cadastreWebsite.set_commune(code_commune) projection = cadastreWebsite.get_projection() bbox = cadastreWebsite.get_bbox() write_string_to_file(projection + ":%f,%f,%f,%f" % bbox, code_commune + ".bbox") if force_bbox: bbox = OSMToCadastreTransform(projection).transform_bbox( BoundingBox(*force_bbox)) if mode == "SIZE": liste = decoupage_bbox_cadastre_size(bbox, size, ratio) else: liste = decoupage_bbox_cadastre_nb(bbox, nb, ratio) for ((i, j), sous_bbox, (largeur, hauteur)) in liste: pdf_filename = code_commune + ("-%d-%d" % (i, j)) + ".pdf" bbox_filename = code_commune + ("-%d-%d" % (i, j)) + ".bbox" sous_bbox_str = projection + (":%f,%f,%f,%f" % sous_bbox) #sys.stdout.write((pdf_filename + " " + sous_bbox_str + "\n").encode("utf-8")) #sys.stdout.flush(); write_string_to_file(sous_bbox_str, bbox_filename) if not (os.path.exists(pdf_filename) and os.path.exists(pdf_filename + ".ok")): if os.path.exists(pdf_filename + ".ok"): os.remove(pdf_filename + ".ok") write_stream_to_file( cadastreWebsite.open_pdf(sous_bbox, largeur, hauteur), pdf_filename) open(pdf_filename + ".ok", 'a').close() time.sleep(wait) yield pdf_filename
def cadastre_vers_adresses(argv): download = True merge_adresses = True bis = True i = 1 while i < len(argv): if argv[i].startswith("-"): if argv[i] in ["-h", "-help","--help"]: print_help() return elif argv[i] in ["-nobis"]: bis = False del(argv[i:i+1]) elif argv[i] in ["-nd", "-nodownload"]: download = False del(argv[i:i+1]) elif argv[i] in ["-data"]: merge_adresses = False del(argv[i:i+1]) else: command_line_error(u"option invalide: " + argv[i]) return else: i = i + 1 if len(argv) <= 1: command_line_open_cadastre(argv) return elif len(argv) == 2: error = command_line_open_cadastre(argv) if error: command_line_error(error) elif len(argv) > 3: command_line_error(u"trop d'arguments") else: try: cadastreWebsite = command_line_open_cadastre(argv) if type(cadastreWebsite) in [str, unicode]: command_line_error(cadastreWebsite, help=False) return else: code_departement = cadastreWebsite.code_departement code_commune = cadastreWebsite.code_commune nom_commune = cadastreWebsite.communes[code_commune] write_string_to_file("", code_commune + "-" + nom_commune + ".txt") except urllib2.URLError: if download: command_line_error(u"problème de connexion au site du cadastre") return else: sys.stdout.write(u"problème de connexion au site du cadastre\n".encode("utf-8")); code_departement = argv[1] code_commune = argv[2] nom_commune = "inconnu" if download: sys.stdout.write((u"Teléchargement des adresses cadastrales de la commune " + code_commune + " : " + nom_commune + "\n").encode("utf-8")) #sys.stdout.write((u"Téléchargement des exports PDF du cadastre.\n").encode("utf-8")) sys.stdout.flush() pdfs = iter_download_pdfs(cadastreWebsite, code_departement, code_commune) #sys.stdout.write((u"Conversion au format SVG:\n").encode("utf-8")) #svgs = pdfs_vers_svgs(pdfs) else: pdfs = glob.glob(code_commune + "-[0-9]*-[0-9]*.pdf") pdfs.sort() projection, limite_parcelles, numeros, quartiers, nom_rues = parse_pdfs_parcelles_numeros_quartiers_nom_rues(pdfs) polygones_parcelles, index_polygones_parcelles = polygones_et_index_des_limite_parcelles(limite_parcelles) sys.stdout.write((u"Chargement des infos xml (id et position) d'environ %d parcelles:\n" % len(polygones_parcelles)).encode("utf-8")) sys.stdout.flush() if download: xmls = iter_download_parcelles_xml(cadastreWebsite, index_polygones_parcelles) else: xmls = imap(lambda f:open(f).read().decode("utf-8"), glob.glob(code_commune + "-parcelles*.xml")) parcelles = Parcelle.parse_xml_strings(xmls) info_pdf_count = (len(parcelles) + MAX_PARCELLES_PAR_INFO_PDF - 1) / MAX_PARCELLES_PAR_INFO_PDF sys.stdout.write((u"Chargement des infos pdf (adresses) des %d parcelles trouvées [%d pdfs]:\n" % (len(parcelles), info_pdf_count)).encode("utf-8")) sys.stdout.flush() if download: info_pdfs = iter_download_parcelles_info_pdf(cadastreWebsite, parcelles.keys()) else: info_pdfs = glob.glob(code_commune + "-parcelles-*.pdf") for fid,adresses in parse_adresses_of_parcelles_info_pdfs(info_pdfs, code_commune).iteritems(): parcelles[fid].adresses = adresses sys.stdout.write((u"Associe les limites et les parcelles.\n").encode("utf-8")) sys.stdout.flush() match_parcelles_et_limites(parcelles, polygones_parcelles, index_polygones_parcelles) transform_to_osm = CadastreToOSMTransform(projection).transform_point transform_from_osm = OSMToCadastreTransform(projection).transform_point # Ecrit un fichier OSM de résultat sys.stdout.write((u"Sauve fichiers de numéros, de parcelles et de noms.\n").encode("utf-8")) sys.stdout.flush() OsmWriter(generate_osm_housenumbers(numeros, transform_to_osm)).write_to_file(code_commune + "-housenumbers.osm") osm_parcelles = generate_osm_parcelles(parcelles, transform_to_osm) if bis: determine_osm_parcelles_bis_ter_quater(osm_parcelles) OsmWriter(osm_parcelles).write_to_file(code_commune + "-parcelles.osm") osm_noms = generate_osm_noms(quartiers, nom_rues, transform_to_osm) OsmWriter(osm_noms).write_to_file(code_commune + "-noms.osm") if merge_adresses: sys.stdout.write((u"Associe la position des numéros aux parcelles:\n").encode("utf-8")) sys.stdout.flush() match_parcelles_et_numeros(parcelles, numeros) # Ecrit un fichier OSM de résultat osm = generate_osm_adresses(parcelles, numeros, transform_to_osm) # TODO: remplacer dans les numéros les lettres B,T et Q par # bis, ter ou quater si: # - pour un numéros dans une (ou des) relation(s) rue, il n'y a pas le # meme numéro dans la rue avec une autre lettre que B T ou Q # - pour un numéros sans relation rue, si il n'y a pas dans les 150m? # le même numéro avec une autre lettre que B T ou Q # pour ça ont doit pouvoir réutiliser l'index spatial utilise # dans la fonction match_parcelles_et_numeros() if bis: determine_osm_adresses_bis_ter_quater(osm) try: cherche_fantoir_et_osm_highways(code_departement, code_commune, osm, osm_noms) except: traceback.print_exc() transforme_place_en_highway(osm) OsmWriter(osm).write_to_file(code_commune + "-adresses.osm")
def cadastre_vers_adresses(argv): download = True merge_adresses = True bis = True i = 1 while i < len(argv): if argv[i].startswith("-"): if argv[i] in ["-h", "-help", "--help"]: print_help() return elif argv[i] in ["-nobis"]: bis = False del (argv[i:i + 1]) elif argv[i] in ["-nd", "-nodownload"]: download = False del (argv[i:i + 1]) elif argv[i] in ["-data"]: merge_adresses = False del (argv[i:i + 1]) else: command_line_error(u"option invalide: " + argv[i]) return else: i = i + 1 if len(argv) <= 1: command_line_open_cadastre(argv) return elif len(argv) == 2: error = command_line_open_cadastre(argv) if error: command_line_error(error) elif len(argv) > 3: command_line_error(u"trop d'arguments") else: try: cadastreWebsite = command_line_open_cadastre(argv) if type(cadastreWebsite) in [str, unicode]: command_line_error(cadastreWebsite, help=False) return else: code_departement = cadastreWebsite.code_departement code_commune = cadastreWebsite.code_commune nom_commune = cadastreWebsite.communes[code_commune] write_string_to_file("", code_commune + "-" + nom_commune + ".txt") except urllib2.URLError: if download: command_line_error( u"problème de connexion au site du cadastre") return else: sys.stdout.write( u"problème de connexion au site du cadastre\n".encode( "utf-8")) code_departement = argv[1] code_commune = argv[2] nom_commune = "inconnu" if download: sys.stdout.write( (u"Teléchargement des adresses cadastrales de la commune " + code_commune + " : " + nom_commune + "\n").encode("utf-8")) #sys.stdout.write((u"Téléchargement des exports PDF du cadastre.\n").encode("utf-8")) sys.stdout.flush() pdfs = iter_download_pdfs(cadastreWebsite, code_departement, code_commune) #sys.stdout.write((u"Conversion au format SVG:\n").encode("utf-8")) #svgs = pdfs_vers_svgs(pdfs) else: pdfs = glob.glob(code_commune + "-[0-9]*-[0-9]*.pdf") pdfs.sort() projection, limite_parcelles, numeros, quartiers, nom_rues = parse_pdfs_parcelles_numeros_quartiers_nom_rues( pdfs) polygones_parcelles, index_polygones_parcelles = polygones_et_index_des_limite_parcelles( limite_parcelles) sys.stdout.write(( u"Chargement des infos xml (id et position) d'environ %d parcelles:\n" % len(polygones_parcelles)).encode("utf-8")) sys.stdout.flush() if download: xmls = iter_download_parcelles_xml(cadastreWebsite, index_polygones_parcelles) else: xmls = imap(lambda f: open(f).read().decode("utf-8"), glob.glob(code_commune + "-parcelles*.xml")) parcelles = Parcelle.parse_xml_strings(xmls) info_pdf_count = (len(parcelles) + MAX_PARCELLES_PAR_INFO_PDF - 1) / MAX_PARCELLES_PAR_INFO_PDF sys.stdout.write(( u"Chargement des infos pdf (adresses) des %d parcelles trouvées [%d pdfs]:\n" % (len(parcelles), info_pdf_count)).encode("utf-8")) sys.stdout.flush() if download: info_pdfs = iter_download_parcelles_info_pdf( cadastreWebsite, parcelles.keys()) else: info_pdfs = glob.glob(code_commune + "-parcelles-*.pdf") for fid, adresses in parse_adresses_of_parcelles_info_pdfs( info_pdfs, code_commune).iteritems(): parcelles[fid].adresses = adresses sys.stdout.write( (u"Associe les limites et les parcelles.\n").encode("utf-8")) sys.stdout.flush() match_parcelles_et_limites(parcelles, polygones_parcelles, index_polygones_parcelles) transform_to_osm = CadastreToOSMTransform(projection).transform_point transform_from_osm = OSMToCadastreTransform(projection).transform_point # Ecrit un fichier OSM de résultat sys.stdout.write( (u"Sauve fichiers de numéros, de parcelles et de noms.\n" ).encode("utf-8")) sys.stdout.flush() OsmWriter(generate_osm_housenumbers( numeros, transform_to_osm)).write_to_file(code_commune + "-housenumbers.osm") osm_parcelles = generate_osm_parcelles(parcelles, transform_to_osm) if bis: determine_osm_parcelles_bis_ter_quater(osm_parcelles) OsmWriter(osm_parcelles).write_to_file(code_commune + "-parcelles.osm") osm_noms = generate_osm_noms(quartiers, nom_rues, transform_to_osm) OsmWriter(osm_noms).write_to_file(code_commune + "-noms.osm") if merge_adresses: sys.stdout.write( (u"Associe la position des numéros aux parcelles:\n" ).encode("utf-8")) sys.stdout.flush() match_parcelles_et_numeros(parcelles, numeros) # Ecrit un fichier OSM de résultat osm = generate_osm_adresses(parcelles, numeros, transform_to_osm) # TODO: remplacer dans les numéros les lettres B,T et Q par # bis, ter ou quater si: # - pour un numéros dans une (ou des) relation(s) rue, il n'y a pas le # meme numéro dans la rue avec une autre lettre que B T ou Q # - pour un numéros sans relation rue, si il n'y a pas dans les 150m? # le même numéro avec une autre lettre que B T ou Q # pour ça ont doit pouvoir réutiliser l'index spatial utilise # dans la fonction match_parcelles_et_numeros() if bis: determine_osm_adresses_bis_ter_quater(osm) try: cherche_fantoir_et_osm_highways(code_departement, code_commune, osm, osm_noms) except: traceback.print_exc() transforme_place_en_highway(osm) OsmWriter(osm).write_to_file(code_commune + "-adresses.osm")
def cadastre_vers_pdfs(argv): i = 1 ratio = PDF_DOWNLOAD_PIXELS_RATIO mode = PDF_DOWNLOAD_SPLIT_MODE nb = PDF_DOWNLOAD_SPLIT_NB size = PDF_DOWNLOAD_SPLIT_SIZE wait = PDF_DOWNALOD_WAIT_SECONDS bbox = None while i < len(argv): if argv[i].startswith("-"): if argv[i] in ["-h", "-help", "--help"]: print_help() return elif argv[i] in ["-r", "-ratio", "--ratio"]: ratio = float(argv[i + 1]) del (argv[i:i + 2]) elif argv[i] in ["-s", "-size", "--size"]: size = int(argv[i + 1]) mode = "SIZE" del (argv[i:i + 2]) elif argv[i] in ["-n", "-nb", "--nb"]: nb = int(argv[i + 1]) mode = "NB" del (argv[i:i + 2]) elif argv[i] in ["-w", "-wait", "--wait"]: wait = float(argv[i + 1]) del (argv[i:i + 2]) elif argv[i] in ["-b", "-bbox", "--bbox"]: bbox = argv[i + 1] if not BBOX_OPTION_FORMAT.match(bbox): command_line_error(u"paramètre bbox invalide: " + bbox) return bbox = map(float, bbox.split(",")) del (argv[i:i + 2]) else: command_line_error(u"option invalide: " + argv[i]) return else: i = i + 1 if len(argv) == 1: command_line_open_cadastre(argv) elif len(argv) == 2: error = command_line_open_cadastre(argv) if error: command_line_error(error) elif len(argv) > 3: command_line_error(u"trop d'arguments") else: cadastreWebsite = command_line_open_cadastre(argv) if type(cadastreWebsite) in [str, unicode]: command_line_error(cadastreWebsite, help=False) else: code_departement = cadastreWebsite.code_departement code_commune = cadastreWebsite.code_commune nom_commune = cadastreWebsite.communes[code_commune] sys.stdout.write( (u"Teléchargement des PDFs de la commune " + code_commune + " : " + nom_commune + "\n").encode("utf-8")) sys.stdout.flush() write_string_to_file("", code_commune + "-" + nom_commune + ".txt") return list( iter_download_pdfs(cadastreWebsite, code_departement, code_commune, mode=mode, size=size, nb=nb, ratio=ratio, wait=wait, force_bbox=bbox))