Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-06-21 11:46:32 +0300
committerVladimir Byko-Ianko <v.bykoianko@corp.mail.ru>2016-07-23 10:25:09 +0300
commitde84454400b0c35f8556957e4945cd7f68b6c8e6 (patch)
treef88a7acfac7344e79719ebb2091820dd697833a8 /generator
parenteead0e66ec4f397ecb67aedc8bf252c370efff31 (diff)
[altitude] The first version of writing to mwm and reading from altitude information.
Diffstat (limited to 'generator')
-rw-r--r--generator/altitude_generator.cpp86
-rw-r--r--generator/altitude_generator.hpp8
-rw-r--r--generator/feature_builder.cpp6
-rw-r--r--generator/generator.pro2
-rw-r--r--generator/generator_tool/generator_tool.cpp7
-rw-r--r--generator/routing_generator.cpp3
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"