diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-06-21 11:46:32 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-07-23 10:25:09 +0300 |
commit | de84454400b0c35f8556957e4945cd7f68b6c8e6 (patch) | |
tree | f88a7acfac7344e79719ebb2091820dd697833a8 /generator | |
parent | eead0e66ec4f397ecb67aedc8bf252c370efff31 (diff) |
[altitude] The first version of writing to mwm and reading from altitude information.
Diffstat (limited to 'generator')
-rw-r--r-- | generator/altitude_generator.cpp | 86 | ||||
-rw-r--r-- | generator/altitude_generator.hpp | 8 | ||||
-rw-r--r-- | generator/feature_builder.cpp | 6 | ||||
-rw-r--r-- | generator/generator.pro | 2 | ||||
-rw-r--r-- | generator/generator_tool/generator_tool.cpp | 7 | ||||
-rw-r--r-- | generator/routing_generator.cpp | 3 |
6 files changed, 106 insertions, 6 deletions
diff --git a/generator/altitude_generator.cpp b/generator/altitude_generator.cpp new file mode 100644 index 0000000000..06ef4941a9 --- /dev/null +++ b/generator/altitude_generator.cpp @@ -0,0 +1,86 @@ +#include "generator/routing_generator.hpp" +#include "generator/srtm_parser.hpp" + +#include "defines.hpp" + +#include "routing/routing_helpers.hpp" + +#include "indexer/feature.hpp" +#include "indexer/feature_altitude.hpp" +#include "indexer/feature_data.hpp" +#include "indexer/feature_processor.hpp" + +#include "coding/file_container.hpp" +#include "coding/varint.hpp" + +#include "coding/internal/file_data.hpp" + +#include "base/assert.hpp" +#include "base/logging.hpp" +#include "base/string_utils.hpp" + +#include "std/map.hpp" +#include "std/type_traits.hpp" + +using namespace feature; + +namespace +{ +static_assert(is_same<TAltitude, generator::SrtmTile::THeight>::value, ""); +static_assert(kInvalidAltitude == generator::SrtmTile::kInvalidHeight, ""); + +class Processor +{ +public: + Processor(string const & srtmPath) : m_srtmManager(srtmPath) {} + map<uint32_t, Altitudes> const & GetFeatureAltitudes() const { return m_featureAltitudes; } + + void operator()(FeatureType const & f, uint32_t const & id) + { + f.ParseTypes(); + f.ParseHeader2(); + if (!routing::IsRoad(feature::TypesHolder(f))) + return; + + f.ParseGeometry(FeatureType::BEST_GEOMETRY); + size_t const pointsCount = f.GetPointsCount(); + if (pointsCount == 0) + return; + + Altitudes alts(m_srtmManager.GetHeight(MercatorBounds::ToLatLon(f.GetPoint(0))), + m_srtmManager.GetHeight(MercatorBounds::ToLatLon(f.GetPoint(pointsCount - 1)))); + m_featureAltitudes[id] = alts; + } + +private: + generator::SrtmTileManager m_srtmManager; + map<uint32_t, Altitudes> m_featureAltitudes; +}; +} // namespace + +namespace routing +{ +void BuildRoadFeatureAltitude(string const & srtmPath, string const & baseDir, string const & countryName) +{ + LOG(LINFO, ("srtmPath =", srtmPath, "baseDir =", baseDir, "countryName =", countryName)); + string const altPath = baseDir + countryName + "." + ALTITUDE_TAG; + string const mwmPath = baseDir + countryName + DATA_FILE_EXTENSION; + + // Writing section with altitude information. + { + FilesContainerW altCont(mwmPath, FileWriter::OP_WRITE_EXISTING); + FileWriter w = altCont.GetWriter(ALTITUDE_TAG); + + Processor processor(srtmPath); + feature::ForEachFromDat(mwmPath, processor); + map<uint32_t, Altitudes> const & featureAltitudes = processor.GetFeatureAltitudes(); + + for (auto const & a : featureAltitudes) + { + Altitude altitude(a.first /* feature id */, a.second /* feature altitudes */); + altitude.Serialize(w); + } + LOG(LINFO, ("Altitude was written for", featureAltitudes.size(), "features.")); + } +} +} // namespace routing diff --git a/generator/altitude_generator.hpp b/generator/altitude_generator.hpp new file mode 100644 index 0000000000..0881724df2 --- /dev/null +++ b/generator/altitude_generator.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include "std/string.hpp" + +namespace routing +{ +void BuildRoadFeatureAltitude(string const & srtmPath, string const & baseDir, string const & countryName); +} // namespace routing diff --git a/generator/feature_builder.cpp b/generator/feature_builder.cpp index 62c165788c..33013febb3 100644 --- a/generator/feature_builder.cpp +++ b/generator/feature_builder.cpp @@ -2,6 +2,7 @@ #include "routing/bicycle_model.hpp" #include "routing/car_model.hpp" +#include "routing/routing_helpers.hpp" #include "routing/pedestrian_model.hpp" #include "indexer/feature_impl.hpp" @@ -230,10 +231,7 @@ namespace bool FeatureBuilder1::IsRoad() const { - static routing::PedestrianModel const pedModel; - static routing::BicycleModel const bicModel; - return routing::CarModel::Instance().HasRoadType(m_params.m_Types) || - pedModel.HasRoadType(m_params.m_Types) || bicModel.HasRoadType(m_params.m_Types); + return routing::IsRoad(m_params.m_Types); } bool FeatureBuilder1::PreSerialize() diff --git a/generator/generator.pro b/generator/generator.pro index 3ac4cdfacd..2a2d3289d7 100644 --- a/generator/generator.pro +++ b/generator/generator.pro @@ -15,6 +15,7 @@ INCLUDEPATH *= $$ROOT_DIR/3party/gflags/src \ QT *= core SOURCES += \ + altitude_generator.cpp \ booking_dataset.cpp \ booking_scoring.cpp \ borders_generator.cpp \ @@ -41,6 +42,7 @@ SOURCES += \ unpack_mwm.cpp \ HEADERS += \ + altitude_generator.hpp \ booking_dataset.hpp \ booking_scoring.hpp \ borders_generator.hpp \ diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index 0aff559f45..34298623ac 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -1,3 +1,4 @@ +#include "generator/altitude_generator.hpp" #include "generator/borders_generator.hpp" #include "generator/borders_loader.hpp" #include "generator/check_model.hpp" @@ -63,13 +64,14 @@ DEFINE_bool(fail_on_coasts, false, "Stop and exit with '255' code if some coastl DEFINE_bool(generate_addresses_file, false, "Generate .addr file (for '--output' option) with full addresses list."); DEFINE_string(osrm_file_name, "", "Input osrm file to generate routing info"); DEFINE_bool(make_routing, false, "Make routing info based on osrm file"); -DEFINE_bool(make_cross_section, false, "Make corss section in routing file for cross mwm routing"); +DEFINE_bool(make_cross_section, false, "Make cross section in routing file for cross mwm routing"); DEFINE_string(osm_file_name, "", "Input osm area file"); DEFINE_string(osm_file_type, "xml", "Input osm area file type [xml, o5m]"); DEFINE_string(user_resource_path, "", "User defined resource path for classificator.txt and etc."); DEFINE_string(booking_data, "", "Path to booking data in .tsv format"); DEFINE_string(booking_reference_path, "", "Path to mwm dataset for match booking addresses"); DEFINE_uint64(planet_version, my::SecondsSinceEpoch(), "Version as seconds since epoch, by default - now"); +DEFINE_string(srtm_path, "", "Path to srtm directory. If it's set generates section with altitude information about road features."); int main(int argc, char ** argv) { @@ -245,6 +247,9 @@ int main(int argc, char ** argv) if (FLAGS_dump_feature_names != "") feature::DumpFeatureNames(datFile, FLAGS_dump_feature_names); + if (!FLAGS_srtm_path.empty()) + routing::BuildRoadFeatureAltitude(FLAGS_srtm_path, path, FLAGS_output); + if (FLAGS_unpack_mwm) UnpackMwm(datFile); diff --git a/generator/routing_generator.cpp b/generator/routing_generator.cpp index 8d1f345726..35395e17f7 100644 --- a/generator/routing_generator.cpp +++ b/generator/routing_generator.cpp @@ -15,12 +15,13 @@ #include "indexer/feature.hpp" #include "indexer/ftypes_matcher.hpp" #include "indexer/index.hpp" -#include "geometry/mercator.hpp" #include "geometry/distance_on_sphere.hpp" +#include "geometry/mercator.hpp" #include "coding/file_container.hpp" #include "coding/read_write_utils.hpp" + #include "coding/internal/file_data.hpp" #include "base/logging.hpp" |