Exemplo n.º 1
0
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
Exemplo n.º 3
0
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))
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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_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")
Exemplo n.º 7
0
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")
Exemplo n.º 8
0
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))