1#ifndef OSMSCOUT_ELEVATION_SERVICE_H
2#define OSMSCOUT_ELEVATION_SERVICE_H
49template <
typename DataLoader>
53 DataLoader &dataLoader;
54 MagnificationLevel loadTileMag;
59 dataLoader(dataLoader), loadTileMag(loadTileMag)
64 std::vector<ElevationPoint> result;
65 ElevationProfile(way, [&result](
const Distance &,
const std::vector<ElevationPoint> &points){
66 result.insert(result.end(), points.begin(), points.end());
72 const std::function<
void(
const Distance &distance,
const std::vector<ElevationPoint> &points)>& callback,
83 std::vector<ContoursData> contours;
86 for (
size_t i=0; i < way.size()-1; i+=1){
87 std::vector<ElevationPoint> result;
92 if (i%100==0 && breaker && breaker->IsAborted()){
96 if (!loadBox.Includes(a1) || !loadBox.Includes(a2)) {
101 if (tileBox.GetCount() > 100){
102 osmscout::log.Warn() <<
"Too huge area for loading " << loadBox.GetDisplayText();
106 assert(loadBox.Includes(a1));
107 assert(loadBox.Includes(a2));
108 contours = dataLoader.LoadContours(loadBox);
113 for (
const auto &contour:contoursData.contours) {
114 if (!lineBox.Intersects(contour->GetBoundingBox())){
118 EleFeatureValue *eleValue=contoursData.reader.GetValue(contour->GetFeatureValueBuffer());
119 if (eleValue==
nullptr) {
123 for (
size_t bi=0; bi < contour->nodes.size()-1; bi+=1){
124 GeoCoord b1=contour->nodes[bi].GetCoord();
125 GeoCoord b2=contour->nodes[bi+1].GetCoord();
146 if (!result.empty()) {
148 if (a.distance != b.distance) {
149 return a.distance < b.distance;
151 if (a.elevation != b.elevation) {
152 return a.elevation < b.elevation;
154 return a.coord < b.coord;
156 pointCnt += result.size();
157 callback(distance, result);
size_t ElevationProfile(const std::vector< GeoCoord > &way, const std::function< void(const Distance &distance, const std::vector< ElevationPoint > &points)> &callback, const BreakerRef &breaker=nullptr)
Definition ElevationService.h:71
TileIdBox(const TileId &a, const TileId &b)
std::vector< ElevationPoint > ElevationProfile(const std::vector< GeoCoord > &way)
Definition ElevationService.h:62
ElevationService(DataLoader &dataLoader, MagnificationLevel loadTileMag=Magnification::magSuburb)
Definition ElevationService.h:57
MagnificationLevel()=default
Definition EleFeature.h:31
int16_t GetEle() const
Definition EleFeature.h:49
static TileId GetTile(const Magnification &magnification, const GeoCoord &coord)
OSMSCOUT_API Distance GetEllipsoidalDistance(double aLon, double aLat, double bLon, double bLat)
bool GetLineIntersection(const N &a1, const N &a2, const N &b1, const N &b2, I &intersection)
Definition Geometry.h:274
OSMSCOUT_API Log log
Definition LoggerImpl.h:95
Distance Meters(double m)
Definition Distance.h:358
std::shared_ptr< Way > WayRef
Definition Way.h:213
std::shared_ptr< Breaker > BreakerRef
Definition Breaker.h:64
FeatureValueReader< EleFeature, EleFeatureValue > EleFeatureValueReader
Definition EleFeature.h:108
Definition ElevationService.h:36
EleFeatureValueReader reader
Definition ElevationService.h:37
std::vector< WayRef > contours
Definition ElevationService.h:38
Definition ElevationService.h:42
WayRef contour
Definition ElevationService.h:46
GeoCoord coord
Definition ElevationService.h:45
Distance elevation
Definition ElevationService.h:44
Distance distance
Definition ElevationService.h:43