Welcome to mirror list, hosted at ThFree Co, Russian Federation.

data_generator.cpp « generator - github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 3100708201220f99d362886787157a63ae8708c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "data_generator.hpp"
#include "data_cache_file.hpp"
#include "first_pass_parser.hpp"
#include "osm_decl.hpp"

#include "../base/std_serialization.hpp"
#include "../base/logging.hpp"

#include "../std/bind.hpp"


namespace data
{

template <class TNodesHolder>
class FileHolder : public cache::BaseFileHolder<TNodesHolder, cache::DataFileWriter, FileWriter>
{
  typedef cache::BaseFileHolder<TNodesHolder, cache::DataFileWriter, FileWriter> base_type;

  typedef typename base_type::user_id_t user_id_t;

  template <class TMap, class TVec>
  void add_id2rel_vector(TMap & rMap, user_id_t relid, TVec const & v)
  {
    for (size_t i = 0; i < v.size(); ++i)
      rMap.write(v[i].first, relid);
  }

public:
  FileHolder(TNodesHolder & nodes, string const & dir) : base_type(nodes, dir) {}

  void AddNode(uint64_t id, double lat, double lng)
  {
    this->m_nodes.AddPoint(id, lat, lng);
  }

  void AddWay(user_id_t id, WayElement const & e)
  {
    this->m_ways.Write(id, e);
  }

  void AddRelation(user_id_t id, RelationElement const & e)
  {
    this->m_relations.Write(id, e);

    add_id2rel_vector(this->m_nodes2rel, id, e.nodes);
    add_id2rel_vector(this->m_ways2rel, id, e.ways);
  }

  void SaveIndex()
  {
    this->m_ways.SaveOffsets();
    this->m_relations.SaveOffsets();

    this->m_nodes2rel.flush_to_file();
    this->m_ways2rel.flush_to_file();
  }
};


class points_in_file_base
{
protected:
  FileWriter m_file;
  progress_policy m_progress;

public:
  points_in_file_base(string const & name, size_t factor) : m_file(name.c_str())
  {
    m_progress.Begin(name, factor);
  }

  uint64_t GetCount() const { return m_progress.GetCount(); }
};

class points_in_file : public points_in_file_base
{
public:
  points_in_file(string const & name) : points_in_file_base(name, 1000) {}

  void AddPoint(uint64_t id, double lat, double lng)
  {
    LatLon ll;
    ll.lat = lat;
    ll.lon = lng;
    m_file.Seek(id * sizeof(ll));
    m_file.Write(&ll, sizeof(ll));

    m_progress.Inc();
  }
};

class points_in_file_light : public points_in_file_base
{
public:
  points_in_file_light(string const & name) : points_in_file_base(name, 10000) {}

  void AddPoint(uint64_t id, double lat, double lng)
  {
    LatLonPos ll;
    ll.pos = id;
    ll.lat = lat;
    ll.lon = lng;
    m_file.Write(&ll, sizeof(ll));

    m_progress.Inc();
  }
};

template <class TNodesHolder>
bool GenerateImpl(string const & dir)
{
  try
  {
    TNodesHolder nodes(dir + NODES_FILE);
    typedef FileHolder<TNodesHolder> holder_t;
    holder_t holder(nodes, dir);

    FirstPassParser<holder_t> parser(holder);
    ParseXMLFromStdIn(parser);

    LOG(LINFO, ("Added points count = ", nodes.GetCount()));

    holder.SaveIndex();
  }
  catch (Writer::Exception const & e)
  {
    LOG(LERROR, ("Error with file ", e.what()));
    return false;
  }

  return true;
}

bool GenerateToFile(string const & dir, bool lightNodes)
{
  if (lightNodes)
    return GenerateImpl<points_in_file_light>(dir);
  else
    return GenerateImpl<points_in_file>(dir);
}

}