active_road 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +15 -0
  2. data/.rspec +1 -0
  3. data/.travis.yml +7 -2
  4. data/Gemfile +8 -2
  5. data/Guardfile +2 -6
  6. data/README.md +69 -9
  7. data/Rakefile +8 -7
  8. data/active_road.gemspec +19 -15
  9. data/app/models/active_road/access_link.rb +4 -4
  10. data/app/models/active_road/access_point.rb +5 -9
  11. data/app/models/active_road/boundary.rb +41 -0
  12. data/app/models/active_road/junction.rb +4 -18
  13. data/app/models/active_road/junction_conditionnal_cost.rb +2 -0
  14. data/app/models/active_road/junctions_physical_road.rb +5 -0
  15. data/app/models/active_road/logical_road.rb +5 -4
  16. data/app/models/active_road/osm_pbf_importer.rb +293 -0
  17. data/app/models/active_road/osm_pbf_importer_level_db.rb +784 -0
  18. data/app/models/active_road/path.rb +40 -9
  19. data/app/models/active_road/physical_road.rb +22 -27
  20. data/app/models/active_road/physical_road_conditionnal_cost.rb +3 -1
  21. data/app/models/active_road/request_conditionnal_cost_linker.rb +59 -0
  22. data/app/models/active_road/street_number.rb +60 -57
  23. data/app/models/active_road/terra_importer.rb +161 -0
  24. data/db/migrate/20120419093427_add_kind_to_physical_roads.rb +2 -2
  25. data/db/migrate/20140206091734_create_boundaries.rb +16 -0
  26. data/db/migrate/20140210132933_add_attributes_to_physical_road.rb +9 -0
  27. data/db/migrate/20140219095521_add_boundary_id_to_logical_road.rb +5 -0
  28. data/db/migrate/20140228072448_add_boundary_id_to_physical_road.rb +5 -0
  29. data/db/migrate/20140304141150_add_marker_to_physical_road.rb +5 -0
  30. data/db/migrate/20140310083550_add_tags_to_street_number.rb +5 -0
  31. data/db/migrate/20140317153437_add_index_to_conditionnal_costs.rb +6 -0
  32. data/db/migrate/20140602160047_add_physical_road_index_to_junctions_physical_road.rb +5 -0
  33. data/lib/active_road.rb +8 -2
  34. data/lib/active_road/engine.rb +4 -1
  35. data/lib/active_road/shortest_path/finder.rb +37 -46
  36. data/lib/active_road/simulation_tool.rb +73 -0
  37. data/lib/active_road/version.rb +1 -1
  38. data/lib/tasks/activeroad_tasks.rake +88 -4
  39. data/script/benchmark_import_kyotocabinet.rb +148 -0
  40. data/script/benchmark_shortest_path.rb +22 -0
  41. data/script/count_tag_in_osm_data.rb +114 -0
  42. data/script/import-tiger-numbers +3 -3
  43. data/spec/dummy/db/schema.rb +2 -1
  44. data/spec/dummy/db/structure.sql +100 -11
  45. data/spec/factories/boundary.rb +8 -0
  46. data/spec/factories/junction.rb +1 -1
  47. data/spec/factories/physical_road.rb +1 -2
  48. data/spec/fixtures/test.osm +120 -0
  49. data/spec/fixtures/test.osm.bz2 +0 -0
  50. data/spec/fixtures/test.osm.pbf +0 -0
  51. data/spec/lib/active_road/shortest_path/finder_spec.rb +143 -90
  52. data/spec/lib/active_road/shortest_path/performance_finder_spec.rb +59 -0
  53. data/spec/models/active_road/access_point_spec.rb +9 -18
  54. data/spec/models/active_road/junction_conditionnal_cost_spec.rb +4 -4
  55. data/spec/models/active_road/junction_spec.rb +34 -11
  56. data/spec/models/active_road/logical_road_spec.rb +20 -19
  57. data/spec/models/active_road/osm_pbf_importer_level_db_spec.rb +410 -0
  58. data/spec/models/active_road/path_spec.rb +1 -1
  59. data/spec/models/active_road/physical_road_conditionnal_cost_spec.rb +4 -4
  60. data/spec/models/active_road/physical_road_spec.rb +14 -3
  61. data/spec/models/active_road/request_conditionnal_cost_linker_spec.rb +65 -0
  62. data/spec/models/active_road/shared_examples/osm_pbf_importer_spec.rb +148 -0
  63. data/spec/models/active_road/street_number_spec.rb +58 -58
  64. data/spec/models/active_road/terra_importer_spec.rb +140 -0
  65. data/spec/spec_helper.rb +14 -9
  66. data/spec/support/geometry_support.rb +36 -0
  67. data/spec/support/profile.rb +19 -0
  68. data/tmp/performance/.gitignore +0 -0
  69. data/travis/before_install.sh +5 -9
  70. data/travis/before_script.sh +7 -7
  71. metadata +118 -121
  72. data/app/models/active_road/physical_road_filter.rb +0 -41
  73. data/app/models/active_road/terra_import.rb +0 -148
  74. data/spec/models/active_road/physical_road_filter_spec.rb +0 -85
  75. data/spec/models/active_road/terra_import_spec.rb +0 -113
  76. data/spec/support/georuby_ext.rb +0 -15
@@ -1,41 +0,0 @@
1
- # Filter Physical Road by :
2
- # - constraints
3
- class ActiveRoad::PhysicalRoadFilter
4
- attr_accessor :relation, :constraints
5
-
6
- def initialize(constraints = {}, relation = ActiveRoad::PhysicalRoad.scoped )
7
- @relation, @constraints = relation, constraints
8
- end
9
-
10
- # Must define an sql request with forbidden tags
11
- def sql_request
12
- sql_request = ""
13
- constraints.each do |key, value|
14
- if !( (constraints.keys.first.present? && constraints.keys.first == key) )
15
- sql_request += " AND "
16
- end
17
-
18
- sql_request += "(tags -> '#{new_key}')::int > :#{key}"
19
-
20
- # if key.to_s.include? "min_"
21
- # new_key = key.to_s.gsub("min_", "")
22
- # sql_request += "(tags -> '#{new_key}')::int > :#{key}"
23
- # elsif key.to_s.include? "max_"
24
- # new_key = key.to_s.gsub("max_", "")
25
- # sql_request += "(tags -> '#{new_key}')::int < :#{key}"
26
- # else
27
- # sql_request += "tags -> '#{key}' != :#{key}"
28
- # end
29
- end
30
- sql_request
31
- end
32
-
33
- def filter
34
- if constraints.present?
35
- @relation = @relation.where(constraints)
36
- else
37
- @relation
38
- end
39
- end
40
-
41
- end
@@ -1,148 +0,0 @@
1
- module ActiveRoad
2
- class TerraImport
3
- attr_reader :parser
4
-
5
- def initialize(xml_file)
6
- @parser = ::Saxerator.parser(File.new(xml_file))
7
- end
8
-
9
- def extract
10
- parser.for_tag(:LogicalRoad).each do |logical_road|
11
- LogicalRoadXml.new(logical_road).import
12
- end
13
-
14
- parser.for_tag(:TrajectoryArc).each do |physical_road|
15
- TrajectoryArcXml.new(physical_road).import
16
- end
17
-
18
- parser.for_tag(:TrajectoryNode).each do |junction|
19
- TrajectoryNodeXml.new(junction).import
20
- end
21
-
22
- parser.for_tag(:StreetNumber).each do |street_number|
23
- StreetNumberXml.new(street_number).import
24
- end
25
-
26
- end
27
-
28
- class ElementXml
29
- attr_reader :xml
30
-
31
- def initialize(xml)
32
- @xml = xml
33
- end
34
-
35
- def objectid
36
- xml['ObjectId']
37
- end
38
-
39
- def geometry
40
- GeoRuby::SimpleFeatures::Geometry.from_ewkt( xml['Geometry'] )
41
- end
42
-
43
- end
44
-
45
- class LogicalRoadXml < ElementXml
46
-
47
- def name
48
- xml['Name']
49
- end
50
-
51
- def import
52
- ActiveRoad::LogicalRoad.create :name => name, :objectid => objectid
53
- end
54
-
55
- end
56
-
57
- class TrajectoryArcXml < ElementXml
58
-
59
- def logical_road
60
- ActiveRoad::LogicalRoad.find_by_objectid( logical_road_id )
61
- end
62
-
63
- def logical_road_id
64
- xml['LogicalRoadRef']
65
- end
66
-
67
- def minimum_width
68
- xml['MinimumWidth']
69
- end
70
-
71
- def length
72
- xml['Length']
73
- end
74
-
75
- def tags
76
- {}
77
- end
78
-
79
- def import
80
- ActiveRoad::PhysicalRoad.create(:geometry => geometry, :tags => tags, :logical_road_id => logical_road_id, :objectid => objectid, :minimum_with => minimum_width, :length_in_meter => length) if (geometry) #&& logical_road)
81
- end
82
-
83
- end
84
-
85
- class TrajectoryNodeXml < ElementXml
86
-
87
- def tags
88
- {} #xml['Tags'].to_s
89
- end
90
-
91
- # def height
92
- # xml['Height'] || 0
93
- # end
94
-
95
- # def physical_road
96
- # ActiveRoad::PhysicalRoad.find_by_objectid( physical_road_id )
97
- # end
98
-
99
- # def physical_road_id
100
- # xml['PhysicalRoadRef']
101
- # end
102
-
103
- def physical_roads
104
- physical_roads = []
105
- if(xml['TrajectoryArcRef'].class == Saxerator::Builder::StringElement)
106
- physical_roads << ActiveRoad::PhysicalRoad.find_by_objectid( xml['TrajectoryArcRef'].to_s )
107
- else
108
- xml['TrajectoryArcRef'].each do |trajectory_arc_ref|
109
- physical_road = ActiveRoad::PhysicalRoad.find_by_objectid( trajectory_arc_ref.to_s )
110
- physical_roads << physical_road if physical_road.present?
111
- end
112
- end
113
- physical_roads
114
- end
115
-
116
- def import
117
- junction = ActiveRoad::Junction.create :objectid => objectid, :tags => tags, :geometry => geometry
118
- junction.physical_roads << physical_roads
119
- end
120
-
121
- end
122
-
123
- class StreetNumberXml < ElementXml
124
- # TODO : Fix location_on_road value
125
- def physical_road
126
- ActiveRoad::PhysicalRoad.find_by_objectid( physical_road_ref )
127
- end
128
-
129
- def physical_road_ref
130
- xml['TrajectoryArcRef']
131
- end
132
-
133
- def number
134
- xml['Number']
135
- end
136
-
137
- def location_on_road
138
- xml['LocationOnRoad'] || 0
139
- end
140
-
141
- def import
142
- ActiveRoad::StreetNumber.create(:number => number , :objectid => objectid, :geometry => geometry, :location_on_road => location_on_road)#, :physical_road_id => physical_road.id)
143
- end
144
-
145
- end
146
-
147
- end
148
- end
@@ -1,85 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveRoad::PhysicalRoadFilter do
4
-
5
- # describe "#sql_request" do
6
-
7
- # it "should return sql_request with min key" do
8
- # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"min_size" => "2"})
9
- # physical_road_filter.sql_request.should == "(tags -> 'size')::int > :min_size"
10
- # end
11
-
12
- # it "should return sql_request with max key" do
13
- # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"max_size" => "2"})
14
- # physical_road_filter.sql_request.should == "(tags -> 'size')::int < :max_size"
15
- # end
16
-
17
- # it "should return sql_request with default key" do
18
- # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"pedestrian" => "true"})
19
- # physical_road_filter.sql_request.should == "tags -> 'pedestrian' != :pedestrian"
20
- # end
21
-
22
- # it "should return sql_request with 3 parameter" do
23
- # physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({"pedestrian" => "true", "max_size" => "2", "min_size" => "1"})
24
- # physical_road_filter.sql_request.should == "tags -> 'pedestrian' != :pedestrian AND (tags -> 'size')::int < :max_size AND (tags -> 'size')::int > :min_size"
25
- # end
26
-
27
- # end
28
-
29
- describe "#filter" do
30
-
31
- let!( :physical_road ) { create( :physical_road ) }
32
- let!( :physical_road2 ) { create( :physical_road ) }
33
- let!( :physical_road3 ) { create( :physical_road ) }
34
-
35
- it "should return physical roads which contains minimum_width <= narrow" do
36
- physical_road.update_attribute :minimum_width, :wide
37
- physical_road2.update_attribute :minimum_width, :cramped
38
-
39
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:minimum_width => [:wide, :enlarged, :narrow]})
40
- physical_road_filter.filter.should =~ [physical_road, physical_road3]
41
- end
42
-
43
- it "should return physical roads which contains slope <= medium" do
44
- physical_road.update_attribute :slope, :medium
45
- physical_road2.update_attribute :slope, :steep
46
-
47
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:slope => [:flat, :medium] })
48
- physical_road_filter.filter.should =~ [physical_road, physical_road3]
49
- end
50
-
51
- it "should return physical roads which contains cant <= medium" do
52
- physical_road.update_attribute :cant, :medium
53
- physical_road2.update_attribute :cant, :steep
54
-
55
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:cant => [:flat, :medium] })
56
- physical_road_filter.filter.should =~ [physical_road, physical_road3]
57
- end
58
-
59
- it "should return physical roads which contains physical_road_type == path_link" do
60
- physical_road.update_attribute :physical_road_type, :path_link
61
- physical_road2.update_attribute :physical_road_type, :crossing
62
-
63
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:physical_road_type => :path_link})
64
- physical_road_filter.filter.should =~ [physical_road, physical_road3]
65
-
66
- end
67
-
68
- it "should return physical roads which contains transport_mode == pedestrian" do
69
- physical_road.update_attribute :transport_mode, :pedestrian
70
- physical_road2.update_attribute :transport_mode, :bike
71
-
72
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:transport_mode => [:pedestrian, nil]})
73
- physical_road_filter.filter.should =~ [physical_road, physical_road3]
74
- end
75
-
76
- it "should return physical roads which contains covering == asphalt_road or pavement" do
77
- physical_road.update_attribute :covering, :asphalt_road
78
- physical_road2.update_attribute :covering, :pavement
79
-
80
- physical_road_filter = ActiveRoad::PhysicalRoadFilter.new({:covering => [:pavement, :asphalt_road, nil]})
81
- physical_road_filter.filter.should =~ [physical_road, physical_road2, physical_road3]
82
- end
83
- end
84
-
85
- end
@@ -1,113 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe ActiveRoad::TerraImport do
4
-
5
- describe "test big xml file" do
6
- let(:xml_file) { File.expand_path("../../../fixtures/terra.xml", __FILE__) }
7
-
8
- subject { ActiveRoad::TerraImport.new( xml_file ) }
9
-
10
- before :each do
11
- subject.extract
12
- end
13
-
14
- # it "should have import all logical roads" do
15
- # ActiveRoad::LogicalRoad.all.size.should == 4
16
- # end
17
-
18
- it "should have import all physical roads" do
19
- ActiveRoad::PhysicalRoad.all.size.should == 78
20
- end
21
-
22
- it "should have import all junctions" do
23
- ActiveRoad::Junction.all.size.should == 70
24
- end
25
-
26
- it "should have import all street number" do
27
- ActiveRoad::StreetNumber.all.size.should == 20
28
- end
29
- end
30
-
31
- describe "test minimal xml file" do
32
- let(:xml_file) { File.expand_path("../../../fixtures/terra_minimal.xml", __FILE__) }
33
-
34
- subject { ActiveRoad::TerraImport.new( xml_file ) }
35
-
36
- before :each do
37
- subject.extract
38
- end
39
-
40
- it "should have import one physical road" do
41
- ActiveRoad::PhysicalRoad.all.size.should == 1
42
-
43
- physical_road = ActiveRoad::PhysicalRoad.first
44
-
45
- physical_road.objectid.should == "ign-obj-205"
46
- end
47
-
48
- it "should have import 2 junctions" do
49
- ActiveRoad::Junction.all.size.should == 2
50
-
51
- junction1 = ActiveRoad::Junction.first
52
- junction2 = ActiveRoad::Junction.last
53
-
54
- junction1.objectid.should == "ign-obj-55"
55
- junction1.physical_roads.first.objectid.should == "ign-obj-205"
56
- junction2.objectid.should == "ign-obj-56"
57
- junction2.physical_roads.first.objectid.should == "ign-obj-205"
58
- end
59
- end
60
-
61
- end
62
-
63
- describe ActiveRoad::TerraImport::TrajectoryNodeXml do
64
- let(:trajectory_node_xml) { File.expand_path("../../../fixtures/trajectory_node.xml", __FILE__) }
65
- let(:parser) { Saxerator.parser(File.new(trajectory_node_xml)) }
66
-
67
- let(:trajectory_node) { ActiveRoad::TerraImport::TrajectoryNodeXml.new(parser.for_tag(:TrajectoryNode).first) }
68
-
69
- it "should have an object id" do
70
- trajectory_node.objectid.should == "ign-obj-93"
71
- end
72
-
73
- it "should have tags" do
74
- trajectory_node.tags.should == {}
75
- end
76
-
77
- it "should have a geometry" do
78
- trajectory_node.geometry.should_not be_nil
79
- end
80
-
81
- # it "should have an height" do
82
- # trajectory_node.height.should == 5
83
- # end
84
-
85
- end
86
-
87
- describe ActiveRoad::TerraImport::TrajectoryArcXml do
88
- let(:trajectory_arc_xml) { File.expand_path("../../../fixtures/trajectory_arc.xml", __FILE__) }
89
- let(:parser) { Saxerator.parser(File.new(trajectory_arc_xml)) }
90
-
91
- let(:trajectory_arc) { ActiveRoad::TerraImport::TrajectoryArcXml.new(parser.for_tag(:TrajectoryArc).first) }
92
-
93
- it "should have an object id" do
94
- trajectory_arc.objectid.should == "ign-obj-132"
95
- end
96
-
97
- it "should have tags" do
98
- trajectory_arc.tags.should == {}
99
- end
100
-
101
- it "should have a geometry" do
102
- trajectory_arc.geometry.should_not be_nil
103
- end
104
-
105
- it "should have a minimum width" do
106
- trajectory_arc.minimum_width.should == "wide"
107
- end
108
-
109
- it "should have a length in meter" do
110
- trajectory_arc.length.should == "62.59449394845691"
111
- end
112
-
113
- end
@@ -1,15 +0,0 @@
1
- def geometry_from_text(text, srid = 4326)
2
- GeoRuby::SimpleFeatures::Geometry.from_ewkt "SRID=#{srid};#{text}"
3
- end
4
-
5
- def point(x=0.0, y=0.0, srid = 4326)
6
- GeoRuby::SimpleFeatures::Point.from_x_y x, y, srid
7
- end
8
-
9
- def line_string(*points)
10
- if points.one? and String === points.first
11
- geometry_from_text("LINESTRING(#{points.first})")
12
- else
13
- GeoRuby::SimpleFeatures::LineString.from_points(points, points.first.srid)
14
- end
15
- end