<commit_before>#include "osm2nav.h"
#include <stdio.h>

#include <iostream>
#include <boost/lexical_cast.hpp>

#include "type/data.h"
#include "third_party/osmpbfreader/osmpbfreader.h"
#include "osm_tags_reader.h"
#include "georef/georef.h"
#include "georef/adminref.h"
#include "utils/functions.h"

namespace navitia { namespace georef {

struct OSMHouseNumber{
    type::GeographicalCoord coord;
    int number;

    OSMHouseNumber(): number(-1){}

};

struct Node {
public:
    uint32_t uses;
    int32_t idx;
    uint64_t ref_node; // Identifiant OSM du noeud
    navitia::type::GeographicalCoord coord;
    Node() : uses(0), idx(-1),ref_node(-1){}

    /// Incrémente le nombre d'utilisations, on lui passe l'index qu'il devra avoit
    /// Retourne vrai si c'est un nouveau nœud (càd utilisé au moins 2 fois et n'avait pas encore d'idx)
    /// Ca permet d'éviter d'utiliser deux fois le même nœud
    bool increment_use(int idx){
        uses++;
        if(this->idx == -1 && uses > 1){
            this->idx = idx;
            return true;
        } else {
            return false;
        }
    }
};

struct OSMWay {
    const static uint8_t CYCLE_FWD = 0;
    const static uint8_t CYCLE_BWD = 1;
    const static uint8_t CAR_FWD = 2;
    const static uint8_t CAR_BWD = 3;
    const static uint8_t FOOT_FWD = 4;
    const static uint8_t FOOT_BWD = 5;

    /// Propriétés du way : est-ce qu'on peut "circuler" dessus
    std::bitset<8> properties;

    /// Nodes qui composent le way
    std::vector<uint64_t> refs;

    /// Idx du way dans navitia
    /// N'est pas toujours renseigné car tous les ways dans OSM ne sont pas des rues
    navitia::type::idx_t idx;
};

using namespace CanalTP;

struct OSMAdminRef{
    std::string level;
    std::string insee;
    std::string name;
    std::string postcode;
    type::GeographicalCoord coord;
    References refs;
};



struct Visitor{
    log4cplus::Logger logger;
    std::unordered_map<uint64_t,References> references;
    std::unordered_map<uint64_t, Node> nodes;
    std::unordered_map<uint64_t, OSMHouseNumber> housenumbers;
    std::unordered_map<uint64_t, OSMAdminRef> OSMAdminRefs;
    int total_ways;
    int total_house_number;

    std::unordered_map<uint64_t, OSMWay> ways;
    georef::GeoRef & geo_ref;
    //Pour charger les données administratives
    navitia::georef::Levels levellist;
    std::map<std::string,std::string>::iterator iter;

    Visitor(GeoRef & to_fill) : total_ways(0), total_house_number(0), geo_ref(to_fill){}

    void add_osm_housenumber(uint64_t osmid, const Tags & tags){
        if(tags.find("addr:housenumber") != tags.end()){
            OSMHouseNumber osm_hn;
            osm_hn.number = str_to_int(tags.at("addr:housenumber"));
            if (osm_hn.number > 0 ){
                this->housenumbers[osmid] = osm_hn;
            }
        }
    }

    void node_callback(uint64_t osmid, double lon, double lat, const Tags & tags){
            Node node;
            node.coord.set_lat(lat);
            node.coord.set_lon(lon);
            node.ref_node = osmid;
            this->nodes[osmid] = node;
            add_osm_housenumber(osmid, tags);
    }

    void way_callback(uint64_t osmid, const Tags &tags, const std::vector<uint64_t> &refs){
        total_ways++;

        OSMWay w;
        w.refs = refs;
        w.properties = parse_way_tags(tags);
        // Est-ce que au moins une propriété fait que la rue est empruntable (voiture, vélo, piéton)
        // Alors on le garde comme way navitia
        if(w.properties.any()){
            georef::Way gr_way;
            gr_way.idx = geo_ref.ways.size();
            gr_way.uri = std::to_string(w.idx);
            if(tags.find("name") != tags.end())
                gr_way.name = tags.at("name");
            geo_ref.ways.push_back(gr_way);
            w.idx = gr_way.idx;
        }else{
            // Dans le cas où la maison est dessinée par un way et non pas juste par un node
             add_osm_housenumber(refs.front(), tags);
        }
        ways[osmid] = w;
    }

    // Once all the ways and nodes are read, we count how many times a node is used to detect intersections
    void count_nodes_uses() {<commit_msg>Georef : correction de bug dans l’uri des adresses<commit_after>#include "osm2nav.h"
#include <stdio.h>

#include <iostream>
#include <boost/lexical_cast.hpp>

#include "type/data.h"
#include "third_party/osmpbfreader/osmpbfreader.h"
#include "osm_tags_reader.h"
#include "georef/georef.h"
#include "georef/adminref.h"
#include "utils/functions.h"

namespace navitia { namespace georef {

struct OSMHouseNumber{
    type::GeographicalCoord coord;
    int number;

    OSMHouseNumber(): number(-1){}

};

struct Node {
public:
    uint32_t uses;
    int32_t idx;
    uint64_t ref_node; // Identifiant OSM du noeud
    navitia::type::GeographicalCoord coord;
    Node() : uses(0), idx(-1),ref_node(-1){}

    /// Incrémente le nombre d'utilisations, on lui passe l'index qu'il devra avoit
    /// Retourne vrai si c'est un nouveau nœud (càd utilisé au moins 2 fois et n'avait pas encore d'idx)
    /// Ca permet d'éviter d'utiliser deux fois le même nœud
    bool increment_use(int idx){
        uses++;
        if(this->idx == -1 && uses > 1){
            this->idx = idx;
            return true;
        } else {
            return false;
        }
    }
};

struct OSMWay {
    const static uint8_t CYCLE_FWD = 0;
    const static uint8_t CYCLE_BWD = 1;
    const static uint8_t CAR_FWD = 2;
    const static uint8_t CAR_BWD = 3;
    const static uint8_t FOOT_FWD = 4;
    const static uint8_t FOOT_BWD = 5;

    /// Propriétés du way : est-ce qu'on peut "circuler" dessus
    std::bitset<8> properties;

    /// Nodes qui composent le way
    std::vector<uint64_t> refs;

    /// Idx du way dans navitia
    /// N'est pas toujours renseigné car tous les ways dans OSM ne sont pas des rues
    navitia::type::idx_t idx;
};

using namespace CanalTP;

struct OSMAdminRef{
    std::string level;
    std::string insee;
    std::string name;
    std::string postcode;
    type::GeographicalCoord coord;
    References refs;
};



struct Visitor{
    log4cplus::Logger logger;
    std::unordered_map<uint64_t,References> references;
    std::unordered_map<uint64_t, Node> nodes;
    std::unordered_map<uint64_t, OSMHouseNumber> housenumbers;
    std::unordered_map<uint64_t, OSMAdminRef> OSMAdminRefs;
    int total_ways;
    int total_house_number;

    std::unordered_map<uint64_t, OSMWay> ways;
    georef::GeoRef & geo_ref;
    //Pour charger les données administratives
    navitia::georef::Levels levellist;
    std::map<std::string,std::string>::iterator iter;

    Visitor(GeoRef & to_fill) : total_ways(0), total_house_number(0), geo_ref(to_fill){}

    void add_osm_housenumber(uint64_t osmid, const Tags & tags){
        if(tags.find("addr:housenumber") != tags.end()){
            OSMHouseNumber osm_hn;
            osm_hn.number = str_to_int(tags.at("addr:housenumber"));
            if (osm_hn.number > 0 ){
                this->housenumbers[osmid] = osm_hn;
            }
        }
    }

    void node_callback(uint64_t osmid, double lon, double lat, const Tags & tags){
            Node node;
            node.coord.set_lat(lat);
            node.coord.set_lon(lon);
            node.ref_node = osmid;
            this->nodes[osmid] = node;
            add_osm_housenumber(osmid, tags);
    }

    void way_callback(uint64_t osmid, const Tags &tags, const std::vector<uint64_t> &refs){
        total_ways++;

        OSMWay w;
        w.refs = refs;
        w.properties = parse_way_tags(tags);
        // Est-ce que au moins une propriété fait que la rue est empruntable (voiture, vélo, piéton)
        // Alors on le garde comme way navitia
        if(w.properties.any()){
            georef::Way gr_way;
            gr_way.idx = geo_ref.ways.size();
            gr_way.uri = std::to_string(osmid);
            if(tags.find("name") != tags.end())
                gr_way.name = tags.at("name");
            geo_ref.ways.push_back(gr_way);
            w.idx = gr_way.idx;
        }else{
            // Dans le cas où la maison est dessinée par un way et non pas juste par un node
             add_osm_housenumber(refs.front(), tags);
        }
        ways[osmid] = w;
    }

    // Once all the ways and nodes are read, we count how many times a node is used to detect intersections
    void count_nodes_uses() {
{'fraction_non_alphanumeric': 0.11153343627509206, 'fraction_numerical': 0.01211545314170329, 'mean_word_length': 2.6137339055793993, 'pattern_counts': {'":': 0, '<': 27, '<?xml version=': 0, '>': 39, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7432026', 'n_tokens_mistral': 3062, 'n_tokens_neox': 2920, 'n_words': 733}