forked from organicmaps/organicmaps
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeature_maker.cpp
103 lines (86 loc) · 2.43 KB
/
feature_maker.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
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
#include "generator/feature_maker.hpp"
#include "generator/holes.hpp"
#include "generator/osm2type.hpp"
#include "generator/osm_element.hpp"
#include "generator/type_helper.hpp"
#include "indexer/classificator.hpp"
#include "indexer/feature_visibility.hpp"
#include "indexer/ftypes_matcher.hpp"
#include <utility>
using namespace feature;
namespace generator
{
void FeatureMakerSimple::ParseParams(FeatureParams & params, OsmElement & p) const
{
ftype::GetNameAndType(&p, params, [] (uint32_t type) {
return classif().IsTypeValid(type);
});
}
bool FeatureMakerSimple::BuildFromNode(OsmElement & p, FeatureParams const & params)
{
FeatureBuilder fb;
fb.SetCenter(MercatorBounds::FromLatLon(p.m_lat, p.m_lon));
fb.SetOsmId(base::MakeOsmNode(p.m_id));
fb.SetParams(params);
m_queue.push(std::move(fb));
return true;
}
bool FeatureMakerSimple::BuildFromWay(OsmElement & p, FeatureParams const & params)
{
auto const & nodes = p.Nodes();
if (nodes.size() < 2)
return false;
FeatureBuilder fb;
m2::PointD pt;
for (uint64_t ref : nodes)
{
if (!m_cache.GetNode(ref, pt.y, pt.x))
return false;
fb.AddPoint(pt);
}
fb.SetOsmId(base::MakeOsmWay(p.m_id));
fb.SetParams(params);
if (fb.IsGeometryClosed())
{
HolesProcessor processor(p.m_id, m_cache);
m_cache.ForEachRelationByWay(p.m_id, processor);
fb.SetHoles(processor.GetHoles());
fb.SetArea();
}
else
{
fb.SetLinear(params.m_reverseGeometry);
}
m_queue.push(std::move(fb));
return true;
}
bool FeatureMakerSimple::BuildFromRelation(OsmElement & p, FeatureParams const & params)
{
HolesRelation helper(m_cache);
helper.Build(&p);
auto const & holesGeometry = helper.GetHoles();
auto & outer = helper.GetOuter();
auto const size = m_queue.size();
auto const func = [&](FeatureBuilder::PointSeq const & pts, std::vector<uint64_t> const & ids)
{
FeatureBuilder fb;
for (uint64_t id : ids)
fb.AddOsmId(base::MakeOsmWay(id));
for (auto const & pt : pts)
fb.AddPoint(pt);
fb.AddOsmId(base::MakeOsmRelation(p.m_id));
if (!fb.IsGeometryClosed())
return;
fb.SetHoles(holesGeometry);
fb.SetParams(params);
fb.SetArea();
m_queue.push(std::move(fb));
};
outer.ForEachArea(true /* collectID */, func);
return size != m_queue.size();
}
void FeatureMaker::ParseParams(FeatureParams & params, OsmElement & p) const
{
ftype::GetNameAndType(&p, params);
}
} // namespace generator