diff --git a/Extractor/XMLParser.cpp b/Extractor/XMLParser.cpp index e0deb29f5..26c31ebd2 100644 --- a/Extractor/XMLParser.cpp +++ b/Extractor/XMLParser.cpp @@ -41,9 +41,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include XMLParser::XMLParser(const char * filename, ExtractorCallbacks* ec, ScriptingEnvironment& se) : BaseParser(ec, se) { - SimpleLogger().Write(logWARNING) << - "Parsing plain .osm/.osm.bz2 is deprecated. Switch to .pbf"; - inputReader = inputReaderFactory(filename); } diff --git a/extractor.cpp b/extractor.cpp index 5da11cc1c..deae476a9 100644 --- a/extractor.cpp +++ b/extractor.cpp @@ -193,6 +193,11 @@ int main (int argc, char *argv[]) { (get_timestamp() - parsing_start_time) << " seconds"; + if( externalMemory.all_edges_list.empty() ) { + SimpleLogger().Write(logWARNING) << "The input data is empty, exiting."; + return -1; + } + externalMemory.PrepareData(output_file_name, restrictionsFileName); delete parser; diff --git a/features/step_definitions/data.rb b/features/step_definitions/data.rb index 1e9fa7149..d6cea41da 100644 --- a/features/step_definitions/data.rb +++ b/features/step_definitions/data.rb @@ -2,6 +2,10 @@ Given /^the profile "([^"]*)"$/ do |profile| set_profile profile end +Given(/^the import format "(.*?)"$/) do |format| + set_input_format format +end + Given /^a grid size of (\d+) meters$/ do |meters| set_grid_size meters end diff --git a/features/support/data.rb b/features/support/data.rb index c389e4e0a..1d9522994 100644 --- a/features/support/data.rb +++ b/features/support/data.rb @@ -13,7 +13,7 @@ WAY_SPACING = 100 DEFAULT_GRID_SIZE = 100 #meters PROFILES_PATH = '../profiles' BIN_PATH = '../build' - +DEFAULT_INPUT_FORMAT = 'osm' DEFAULT_ORIGIN = [1,1] class Location @@ -25,6 +25,15 @@ class Location end end +def set_input_format format + raise '*** Input format must be eiter "osm" or "pbf"' unless ['pbf','osm'].include? format.to_s + @input_format = format.to_s +end + +def input_format + @input_format || DEFAULT_INPUT_FORMAT +end + def sanitized_scenario_title @sanitized_scenario_title ||= @scenario_title.gsub /[^0-9A-Za-z.\-]/, '_' end @@ -244,8 +253,8 @@ def write_timestamp end def reprocess - use_pbf = true Dir.chdir TEST_FOLDER do + use_pbf = (input_format=='pbf') write_osm write_timestamp convert_osm_to_pbf if use_pbf diff --git a/features/testbot/protobuffer.feature b/features/testbot/protobuffer.feature new file mode 100644 index 000000000..016a233be --- /dev/null +++ b/features/testbot/protobuffer.feature @@ -0,0 +1,156 @@ +@routing @pbf +Feature: Importing protobuffer (.pbf) format +# Test normally read .osm, which is faster than .pbf files, +# since we don't need to use osmosis to first convert to .pbf +# The scenarios in this file test the ability to import .pbf files, +# including nodes, way, restictions, and a various special situations. + + Background: + Given the profile "testbot" + And the import format "pbf" + + Scenario: Testbot - Protobuffer import, nodes and ways + Given the node map + | | | | d | + | a | b | c | | + | | | | e | + + And the ways + | nodes | highway | oneway | + | abc | primary | | + | cd | primary | yes | + | ce | river | | + | de | primary | | + + When I route I should get + | from | to | route | + | d | c | de,ce | + | e | d | de | + + + Scenario: Testbot - Protobuffer import, turn restiction relations + Given the node map + | | n | | + | w | j | e | + | | s | | + + And the ways + | nodes | oneway | + | sj | yes | + | nj | -1 | + | wj | -1 | + | ej | -1 | + + And the relations + | type | way:from | way:to | node:via | restriction | + | restriction | sj | wj | j | no_left_turn | + + When I route I should get + | from | to | route | + | s | w | | + | s | n | sj,nj | + | s | e | sj,ej | + + + Scenario: Testbot - Protobuffer import, distances at longitude 45 + Given the node locations + | node | lat | lon | + | a | 80 | 45 | + | b | 0 | 45 | + + And the ways + | nodes | + | ab | + + When I route I should get + | from | to | route | distance | + | a | b | ab | 8905559m ~0.1% | + + Scenario: Testbot - Protobuffer import, distances at longitude 80 + Given the node locations + | node | lat | lon | + | a | 80 | 80 | + | b | 0 | 80 | + + And the ways + | nodes | + | ab | + + When I route I should get + | from | to | route | distance | + | a | b | ab | 8905559m ~0.1% | + + Scenario: Testbot - Protobuffer import, empty dataset + Given the node map + | | + + Given the ways + | nodes | + + When I preprocess data + Then "osrm-extract" should return code 255 + + + Scenario: Testbot - Protobuffer import, streetnames with UTF characters + Given the node map + | a | b | c | d | + + And the ways + | nodes | name | + | ab | Scandinavian København | + | bc | Japanese 東京 | + | cd | Cyrillic Москва | + + When I route I should get + | from | to | route | + | a | b | Scandinavian København | + | b | c | Japanese 東京 | + | c | d | Cyrillic Москва | + + Scenario: Testbot - Protobuffer import, bearing af 45 degree intervals + Given the node map + | b | a | h | + | c | x | g | + | d | e | f | + + And the ways + | nodes | + | xa | + | xb | + | xc | + | xd | + | xe | + | xf | + | xg | + | xh | + + When I route I should get + | from | to | route | compass | bearing | + | x | a | xa | N | 0 | + | x | b | xb | NW | 315 | + | x | c | xc | W | 270 | + | x | d | xd | SW | 225 | + | x | e | xe | S | 180 | + | x | f | xf | SE | 135 | + | x | g | xg | E | 90 | + | x | h | xh | NE | 45 | + + + Scenario: Testbot - Protobuffer import, rraffic signals should incur a delay + Given the node map + | a | b | c | + | d | e | f | + + And the nodes + | node | highway | + | e | traffic_signals | + + And the ways + | nodes | + | abc | + | def | + + When I route I should get + | from | to | route | time | distance | + | a | c | abc | 20s +-1 | 200m +-1 | + | d | f | def | 27s +-1 | 200m +-1 | diff --git a/prepare.cpp b/prepare.cpp index 08a116dcc..5664a5035 100644 --- a/prepare.cpp +++ b/prepare.cpp @@ -236,17 +236,17 @@ int main (int argc, char *argv[]) { std::vector edgeList; NodeID nodeBasedNodeNumber = readBinaryOSRMGraphFromStream(in, edgeList, bollardNodes, trafficLightNodes, &internalToExternalNodeMapping, inputRestrictions); in.close(); + + if( edgeList.empty() ) { + SimpleLogger().Write(logWARNING) << "The input data is empty, exiting."; + return -1; + } + SimpleLogger().Write() << inputRestrictions.size() << " restrictions, " << bollardNodes.size() << " bollard nodes, " << trafficLightNodes.size() << " traffic lights"; - if( edgeList.empty() ) { - SimpleLogger().Write(logWARNING) << "The input data is broken. " - "It is impossible to do any turns in this graph"; - return -1; - } - /*** * Building an edge-expanded graph from node-based input an turn restrictions */