Merge PR #970 'experimental/cuke_import_format' into develop

This commit is contained in:
Dennis Luxen 2014-04-01 12:02:56 +02:00
commit 0ef7a72b33
6 changed files with 182 additions and 11 deletions

View File

@ -41,9 +41,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <boost/ref.hpp> #include <boost/ref.hpp>
XMLParser::XMLParser(const char * filename, ExtractorCallbacks* ec, ScriptingEnvironment& se) : BaseParser(ec, se) { 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); inputReader = inputReaderFactory(filename);
} }

View File

@ -193,6 +193,11 @@ int main (int argc, char *argv[]) {
(get_timestamp() - parsing_start_time) << (get_timestamp() - parsing_start_time) <<
" seconds"; " seconds";
if( externalMemory.all_edges_list.empty() ) {
SimpleLogger().Write(logWARNING) << "The input data is empty, exiting.";
return -1;
}
externalMemory.PrepareData(output_file_name, restrictionsFileName); externalMemory.PrepareData(output_file_name, restrictionsFileName);
delete parser; delete parser;

View File

@ -2,6 +2,10 @@ Given /^the profile "([^"]*)"$/ do |profile|
set_profile profile set_profile profile
end end
Given(/^the import format "(.*?)"$/) do |format|
set_input_format format
end
Given /^a grid size of (\d+) meters$/ do |meters| Given /^a grid size of (\d+) meters$/ do |meters|
set_grid_size meters set_grid_size meters
end end

View File

@ -13,7 +13,7 @@ WAY_SPACING = 100
DEFAULT_GRID_SIZE = 100 #meters DEFAULT_GRID_SIZE = 100 #meters
PROFILES_PATH = '../profiles' PROFILES_PATH = '../profiles'
BIN_PATH = '../build' BIN_PATH = '../build'
DEFAULT_INPUT_FORMAT = 'osm'
DEFAULT_ORIGIN = [1,1] DEFAULT_ORIGIN = [1,1]
class Location class Location
@ -25,6 +25,15 @@ class Location
end end
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 def sanitized_scenario_title
@sanitized_scenario_title ||= @scenario_title.gsub /[^0-9A-Za-z.\-]/, '_' @sanitized_scenario_title ||= @scenario_title.gsub /[^0-9A-Za-z.\-]/, '_'
end end
@ -244,8 +253,8 @@ def write_timestamp
end end
def reprocess def reprocess
use_pbf = true
Dir.chdir TEST_FOLDER do Dir.chdir TEST_FOLDER do
use_pbf = (input_format=='pbf')
write_osm write_osm
write_timestamp write_timestamp
convert_osm_to_pbf if use_pbf convert_osm_to_pbf if use_pbf

View File

@ -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 |

View File

@ -236,17 +236,17 @@ int main (int argc, char *argv[]) {
std::vector<ImportEdge> edgeList; std::vector<ImportEdge> edgeList;
NodeID nodeBasedNodeNumber = readBinaryOSRMGraphFromStream(in, edgeList, bollardNodes, trafficLightNodes, &internalToExternalNodeMapping, inputRestrictions); NodeID nodeBasedNodeNumber = readBinaryOSRMGraphFromStream(in, edgeList, bollardNodes, trafficLightNodes, &internalToExternalNodeMapping, inputRestrictions);
in.close(); in.close();
if( edgeList.empty() ) {
SimpleLogger().Write(logWARNING) << "The input data is empty, exiting.";
return -1;
}
SimpleLogger().Write() << SimpleLogger().Write() <<
inputRestrictions.size() << " restrictions, " << inputRestrictions.size() << " restrictions, " <<
bollardNodes.size() << " bollard nodes, " << bollardNodes.size() << " bollard nodes, " <<
trafficLightNodes.size() << " traffic lights"; 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 * Building an edge-expanded graph from node-based input an turn restrictions
*/ */