From f94f493aa5a691446cbbfb361a7d0993e1829431 Mon Sep 17 00:00:00 2001 From: Alex Zolotarev Date: Wed, 27 Apr 2011 10:59:20 +0200 Subject: [PATCH] Updated borders-from-osm generator with any tag from command line support --- generator/borders_generator.cpp | 22 +++++++++++++++---- generator/borders_generator.hpp | 3 ++- generator/generator_tests/osm_parser_test.cpp | 8 ++++++- generator/generator_tool/generator_tool.cpp | 11 ++++++---- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/generator/borders_generator.cpp b/generator/borders_generator.cpp index a1801b7b5e..31d8997675 100644 --- a/generator/borders_generator.cpp +++ b/generator/borders_generator.cpp @@ -55,7 +55,9 @@ namespace osm } }; - void GenerateBordersFromOsm(string const & osmFile, string const & outFile) + void GenerateBordersFromOsm(string const & tagAndOptValue, + string const & osmFile, + string const & outFile) { OsmRawData osmData; { @@ -66,10 +68,22 @@ namespace osm CHECK(ParseXML(source, parser), ("Invalid XML")); } + // extract search tag key and value + size_t const delimeterPos = tagAndOptValue.find('='); + string const searchKey = tagAndOptValue.substr(0, delimeterPos); + string searchValue; + if (delimeterPos != string::npos) + searchValue = tagAndOptValue.substr(delimeterPos + 1, string::npos); + // find country borders relation - OsmIds relationIds = osmData.RelationsByKey("ISO3166-1"); - CHECK(!relationIds.empty(), ("No relation with key 'ISO3166-1' found")); - CHECK_EQUAL(relationIds.size(), 1, ("More than one relation with key 'ISO3166-1' found")); + OsmIds relationIds; + if (searchValue.empty()) + relationIds = osmData.RelationsByKey(searchKey); + else + relationIds = osmData.RelationsByTag(OsmTag(searchKey, searchValue)); + CHECK(!relationIds.empty(), ("No relation found with tag", searchKey, searchValue)); + CHECK_EQUAL(relationIds.size(), 1, ("Found more than one relation with tag", + searchKey, searchValue)); OsmRelation countryRelation = osmData.RelationById(relationIds[0]); diff --git a/generator/borders_generator.hpp b/generator/borders_generator.hpp index 2dedd0e294..cf69d8beb5 100644 --- a/generator/borders_generator.hpp +++ b/generator/borders_generator.hpp @@ -8,7 +8,8 @@ namespace osm { - void GenerateBordersFromOsm(string const & osmFile, string const & outFile); + void GenerateBordersFromOsm(string const & tagAndOptValue, string const & osmFile, + string const & outFile); /// @return false if borderFile can't be opened bool LoadBorders(string const & borderFile, vector & outBorders); } diff --git a/generator/generator_tests/osm_parser_test.cpp b/generator/generator_tests/osm_parser_test.cpp index 298b1f6d49..28f04670e7 100644 --- a/generator/generator_tests/osm_parser_test.cpp +++ b/generator/generator_tests/osm_parser_test.cpp @@ -191,11 +191,17 @@ UNIT_TEST(BordersGenerator) f.Write(gOsmXml, ARRAY_SIZE(gOsmXml) - 1); // -1 to skip last zero } - GenerateBordersFromOsm(inputFile, outputFile); + GenerateBordersFromOsm("ISO3166-1", inputFile, outputFile); vector borders; LoadBorders(outputFile, borders); TEST_EQUAL(borders.size(), 2, ()); + GenerateBordersFromOsm("admin_level=4", inputFile, outputFile); + borders.clear(); + LoadBorders(outputFile, borders); + TEST_EQUAL(borders.size(), 1, ()); + + FileWriter::DeleteFileX(inputFile); FileWriter::DeleteFileX(outputFile); } diff --git a/generator/generator_tool/generator_tool.cpp b/generator/generator_tool/generator_tool.cpp index d672c762e8..bacf3c6aef 100644 --- a/generator/generator_tool/generator_tool.cpp +++ b/generator/generator_tool/generator_tool.cpp @@ -52,8 +52,9 @@ DEFINE_int32(generate_world_scale, -1, "If specified, features for zoomlevels [0 DEFINE_bool(split_by_polygons, false, "Use kml shape files to split planet by regions and countries"); DEFINE_int32(simplify_countries_level, -1, "If positive, simplifies country polygons. Recommended values [10..15]"); DEFINE_bool(merge_coastlines, false, "If defined, tries to merge coastlines when renerating World file"); -DEFINE_bool(generate_borders, false, - "Create binary country .borders file for osm xml file given in 'output' parameter"); +DEFINE_string(generate_borders, "", + "Create binary country .borders file for osm xml file given in 'output' parameter," + "specify tag name and optional value: ISO3166-1 or admin_level=4"); string AddSlashIfNeeded(string const & str) { @@ -196,11 +197,13 @@ int main(int argc, char ** argv) update::GenerateFilesList(path); } - if (FLAGS_generate_borders) + if (!FLAGS_generate_borders.empty()) { if (!FLAGS_output.empty()) { - osm::GenerateBordersFromOsm(path + FLAGS_output + ".osm", path + FLAGS_output + ".borders"); + osm::GenerateBordersFromOsm(FLAGS_generate_borders, + path + FLAGS_output + ".osm", + path + FLAGS_output + ".borders"); } else {