forked from mapsme/omim
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtowns_dumper.cpp
71 lines (62 loc) · 1.9 KB
/
towns_dumper.cpp
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
#include "towns_dumper.hpp"
#include "geometry/distance_on_sphere.hpp"
#include "geometry/tree4d.hpp"
#include "base/logging.hpp"
#include <fstream>
#include <string>
#include <vector>
namespace
{
uint64_t constexpr kTownsEqualityMeters = 500000;
} // namespace
TownsDumper::TownsDumper() {}
void TownsDumper::FilterTowns()
{
LOG(LINFO, ("Preprocessing started. Have", m_records.size(), "towns."));
m4::Tree<Town> resultTree;
std::vector<Town> towns;
towns.reserve(m_records.size());
for (auto const & town : m_records)
{
if (town.capital)
resultTree.Add(town);
else
towns.push_back(town);
}
sort(towns.begin(), towns.end());
LOG(LINFO, ("Tree of capitals has size", resultTree.GetSize(), "towns has size:", towns.size()));
m_records.clear();
while (!towns.empty())
{
auto const & top = towns.back();
bool isUniq = true;
resultTree.ForEachInRect(
MercatorBounds::RectByCenterXYAndSizeInMeters(MercatorBounds::FromLatLon(top.point),
kTownsEqualityMeters),
[&top, &isUniq](Town const & candidate)
{
if (ms::DistanceOnEarth(top.point, candidate.point) < kTownsEqualityMeters)
isUniq = false;
});
if (isUniq)
resultTree.Add(top);
towns.pop_back();
}
resultTree.ForEach([this](Town const & town)
{
m_records.push_back(town);
});
LOG(LINFO, ("Preprocessing finished. Have", m_records.size(), "towns."));
}
void TownsDumper::Dump(std::string const & filePath)
{
FilterTowns();
ASSERT(!filePath.empty(), ());
std::ofstream stream(filePath);
stream.precision(9);
for (auto const & record : m_records)
{
std::string const isCapital = record.capital ? "t" : "f";
stream << record.point.lat << ";" << record.point.lon << ";" << record.id << ";" << isCapital << std::endl;
}
}