1 #ifndef OSMSCOUT_ELEVATION_SERVICE_H 2 #define OSMSCOUT_ELEVATION_SERVICE_H 48 template <
typename DataLoader>
52 DataLoader &dataLoader;
53 MagnificationLevel loadTileMag;
57 MagnificationLevel loadTileMag = Magnification::magSuburb):
58 dataLoader(dataLoader), loadTileMag(loadTileMag)
63 std::vector<ElevationPoint> result;
64 ElevationProfile(way, [&result](
const Distance &,
const std::vector<ElevationPoint> &points){
65 result.insert(result.end(), points.begin(), points.end());
71 std::function<
void(
const Distance &distance,
const std::vector<ElevationPoint> &points)> callback,
80 GeoCoord intersection;
82 std::vector<ContoursData> contours;
85 for (
size_t i=0; i < way.size()-1; i+=1){
86 std::vector<ElevationPoint> result;
89 GeoBox lineBox(a1,a2);
91 if (i%100==0 && breaker && breaker->IsAborted()){
95 if (!loadBox.Includes(a1) || !loadBox.Includes(a2)) {
98 TileIdBox tileBox(tile1, tile2);
99 loadBox=tileBox.GetBoundingBox(Magnification(loadTileMag));
100 if (tileBox.GetCount() > 100){
101 osmscout::log.
Warn() <<
"Too huge area for loading " << loadBox.GetDisplayText();
105 assert(loadBox.Includes(a1));
106 assert(loadBox.Includes(a2));
107 contours = dataLoader.LoadContours(loadBox);
112 for (
const auto &contour:contoursData.contours) {
113 if (!lineBox.Intersects(contour->GetBoundingBox())){
117 EleFeatureValue *eleValue=contoursData.reader.GetValue(contour->GetFeatureValueBuffer());
118 if (eleValue==
nullptr) {
122 for (
size_t bi=0; bi < contour->nodes.size()-1; bi+=1){
123 GeoCoord b1=contour->nodes[bi].GetCoord();
124 GeoCoord b2=contour->nodes[bi+1].GetCoord();
145 if (!result.empty()) {
153 return a.
coord < b.coord;
155 pointCnt += result.size();
156 callback(distance, result);
165 #endif //OSMSCOUT_ELEVATION_SERVICE_H
GeoCoord coord
Definition: ElevationService.h:44
size_t ElevationProfile(const std::vector< GeoCoord > &way, std::function< void(const Distance &distance, const std::vector< ElevationPoint > &points)> callback, BreakerRef breaker=nullptr)
Definition: ElevationService.h:70
std::vector< ElevationPoint > ElevationProfile(const std::vector< GeoCoord > &way)
Definition: ElevationService.h:61
std::shared_ptr< Breaker > BreakerRef
Definition: Breaker.h:65
Definition: ElevationService.h:40
EleFeatureValueReader reader
Definition: ElevationService.h:36
std::shared_ptr< Way > WayRef
Definition: Way.h:202
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:258
Distance elevation
Definition: ElevationService.h:43
WayRef contour
Definition: ElevationService.h:45
Distance distance
Definition: ElevationService.h:42
ElevationService(DataLoader &dataLoader, MagnificationLevel loadTileMag=Magnification::magSuburb)
Definition: ElevationService.h:56
Distance Meters(double m)
Definition: Distance.h:358
Log & Warn(bool state)
Definition: Logger.h:462
Definition: ElevationService.h:34
std::vector< WayRef > contours
Definition: ElevationService.h:37
Definition: TypeFeatures.h:1297
uint32_t GetEle() const
Definition: TypeFeatures.h:1316
static TileId GetTile(const Magnification &magnification, const GeoCoord &coord)