active_road 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +9 -0
- data/.rvmrc +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +14 -0
- data/Guardfile +26 -0
- data/LICENSE.txt +19 -0
- data/README.md +37 -0
- data/Rakefile +46 -0
- data/active_road.gemspec +38 -0
- data/app/models/active_road/access_link.rb +44 -0
- data/app/models/active_road/access_point.rb +65 -0
- data/app/models/active_road/base.rb +5 -0
- data/app/models/active_road/junction.rb +52 -0
- data/app/models/active_road/junction_conditionnal_cost.rb +13 -0
- data/app/models/active_road/logical_road.rb +41 -0
- data/app/models/active_road/path.rb +85 -0
- data/app/models/active_road/physical_road.rb +65 -0
- data/app/models/active_road/physical_road_conditionnal_cost.rb +10 -0
- data/app/models/active_road/physical_road_filter.rb +41 -0
- data/app/models/active_road/street_number.rb +81 -0
- data/app/models/active_road/terra_import.rb +148 -0
- data/config/database.yml +20 -0
- data/config/database.yml.ci +12 -0
- data/config/routes.rb +2 -0
- data/db/init.sql +6 -0
- data/db/migrate/20110914160756_create_street_numbers.rb +18 -0
- data/db/migrate/20120201114800_create_physical_roads.rb +17 -0
- data/db/migrate/20120201162800_create_logical_roads.rb +16 -0
- data/db/migrate/20120203154500_create_junctions.rb +25 -0
- data/db/migrate/20120401083409_create_physical_roads_spatial_index.rb +9 -0
- data/db/migrate/20120419093427_add_kind_to_physical_roads.rb +10 -0
- data/db/migrate/20121010125851_create_junction_conditionnal_costs.rb +13 -0
- data/db/migrate/20121011124923_create_physical_road_conditionnal_costs.rb +13 -0
- data/db/migrate/20121012134251_add_start_end_ref_to_junction_conditionnal_cost.rb +6 -0
- data/db/migrate/20121012134440_add_tags_junction.rb +5 -0
- data/db/migrate/20121012134457_add_tags_physical_road.rb +5 -0
- data/db/migrate/20121106095002_add_objectid_to_street_number.rb +5 -0
- data/db/migrate/20130419155438_add_length_and_minimum_width_to_physical_road.rb +6 -0
- data/db/migrate/20130507162801_setup_hstore.rb +9 -0
- data/db/migrate/20130509075631_change_tags_type_for_physical_road.rb +10 -0
- data/db/migrate/20130509081745_index_physical_roads_tags.rb +9 -0
- data/db/migrate/20130513134422_change_tags_type_for_junction.rb +10 -0
- data/db/migrate/20130513134511_index_junctions_tags.rb +9 -0
- data/db/migrate/20130607114951_change_length_name_for_physical_road.rb +11 -0
- data/db/migrate/20130801151637_add_constraints_to_physical_roads.rb +37 -0
- data/db/migrate/20130809155019_add_height_and_waiting_constraint_to_junction.rb +6 -0
- data/db/migrate/20130812143049_fix_waiting_constraint_type_for_junction.rb +11 -0
- data/lib/active_road.rb +19 -0
- data/lib/active_road/engine.rb +13 -0
- data/lib/active_road/migration.rb +15 -0
- data/lib/active_road/shortest_path.rb +2 -0
- data/lib/active_road/shortest_path/finder.rb +172 -0
- data/lib/active_road/version.rb +3 -0
- data/lib/tasks/activeroad_tasks.rake +4 -0
- data/log/.gitignore +0 -0
- data/script/console +2 -0
- data/script/import-tiger-numbers +201 -0
- data/script/rails +9 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +6 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/.gitkeep +0 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +56 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +20 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +4 -0
- data/spec/dummy/db/schema.rb +87 -0
- data/spec/dummy/db/structure.sql +10250 -0
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/factories/junction.rb +18 -0
- data/spec/factories/junction_conditionnal_cost.rb +13 -0
- data/spec/factories/logical_road.rb +8 -0
- data/spec/factories/physical_road.rb +9 -0
- data/spec/factories/physical_road_conditionnal_cost.rb +9 -0
- data/spec/factories/street_number.rb +11 -0
- data/spec/fixtures/terra.xml +1772 -0
- data/spec/fixtures/terra_minimal.xml +28 -0
- data/spec/fixtures/trajectory_arc.xml +10 -0
- data/spec/fixtures/trajectory_node.xml +11 -0
- data/spec/lib/active_road/shortest_path/finder_spec.rb +157 -0
- data/spec/models/active_road/access_point_spec.rb +36 -0
- data/spec/models/active_road/junction_conditionnal_cost_spec.rb +28 -0
- data/spec/models/active_road/junction_spec.rb +25 -0
- data/spec/models/active_road/logical_road_spec.rb +46 -0
- data/spec/models/active_road/path_spec.rb +7 -0
- data/spec/models/active_road/physical_road_conditionnal_cost_spec.rb +19 -0
- data/spec/models/active_road/physical_road_filter_spec.rb +85 -0
- data/spec/models/active_road/physical_road_spec.rb +17 -0
- data/spec/models/active_road/street_number_spec.rb +78 -0
- data/spec/models/active_road/terra_import_spec.rb +113 -0
- data/spec/spec_helper.rb +46 -0
- data/spec/support/georuby_ext.rb +15 -0
- data/travis/before_install.sh +10 -0
- data/travis/before_script.sh +9 -0
- metadata +460 -0
data/config/routes.rb
ADDED
data/db/init.sql
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
create language plpgsql;
|
2
|
+
|
3
|
+
\i /usr/share/postgresql-8.3-postgis/lwpostgis.sql;
|
4
|
+
\i /usr/share/postgresql-8.3-postgis/spatial_ref_sys.sql;
|
5
|
+
|
6
|
+
INSERT INTO spatial_ref_sys (srid, auth_name, auth_srid, srtext, proj4text)VALUES (900913,'EPSG',900913,'PROJCS["WGS84 / Simple Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS_1984", 6378137.0, 298.257223563]],PRIMEM["Greenwich", 0.0],UNIT["degree", 0.017453292519943295],AXIS["Longitude", EAST],AXIS["Latitude", NORTH]],PROJECTION["Mercator_1SP_Google"],PARAMETER["latitude_of_origin", 0.0],PARAMETER["central_meridian", 0.0],PARAMETER["scale_factor", 1.0],PARAMETER["false_easting", 0.0],PARAMETER["false_northing", 0.0],UNIT["m", 1.0],AXIS["x", EAST],AXIS["y", NORTH],AUTHORITY["EPSG","900913"]]','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs');
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class CreateStreetNumbers < ActiveRoad::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :street_numbers do |t|
|
4
|
+
t.string :number
|
5
|
+
t.float :location_on_road
|
6
|
+
t.belongs_to :physical_road
|
7
|
+
t.point :geometry, :srid => ActiveRoad.srid
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :street_numbers, [:number, :physical_road_id]
|
12
|
+
add_index :street_numbers, :physical_road_id
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.down
|
16
|
+
drop_table :street_numbers
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class CreatePhysicalRoads < ActiveRoad::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :physical_roads do |t|
|
4
|
+
t.string :objectid
|
5
|
+
t.belongs_to :logical_road
|
6
|
+
t.line_string :geometry, :srid => ActiveRoad.srid
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
|
10
|
+
add_index :physical_roads, :objectid, :uniq => true
|
11
|
+
add_index :physical_roads, :logical_road_id
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.down
|
15
|
+
drop_table :physical_roads
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateLogicalRoads < ActiveRoad::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :logical_roads do |t|
|
4
|
+
t.string :name
|
5
|
+
t.string :objectid
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :logical_roads, :objectid, :uniq => true
|
10
|
+
add_index :logical_roads, :name
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
drop_table :logical_roads
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
class CreateJunctions < ActiveRoad::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :junctions do |t|
|
4
|
+
t.string :objectid
|
5
|
+
t.point :geometry, :srid => ActiveRoad.srid
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
|
9
|
+
add_index :junctions, :objectid, :uniq => true
|
10
|
+
|
11
|
+
create_table :junctions_physical_roads, :id => false do |t|
|
12
|
+
t.belongs_to :physical_road
|
13
|
+
t.belongs_to :junction
|
14
|
+
end
|
15
|
+
|
16
|
+
# Generated name is too long for PostgreSQL
|
17
|
+
add_index :junctions_physical_roads, [:physical_road_id, :junction_id], :name => 'junctions_physical_roads_ids', :uniq => true
|
18
|
+
add_index :junctions_physical_roads, [:junction_id]
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.down
|
22
|
+
drop_table :junctions
|
23
|
+
drop_table :junctions_physical_roads
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class AddKindToPhysicalRoads < ActiveRecord::Migration
|
2
|
+
def change
|
3
|
+
add_column :physical_roads, :kind, :string
|
4
|
+
|
5
|
+
ActiveRoad::PhysicalRoad.reset_column_information
|
6
|
+
ActiveRoad::PhysicalRoad.update_all :kind => "road"
|
7
|
+
|
8
|
+
add_index :physical_roads, :kind
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateJunctionConditionnalCosts < ActiveRoad::Migration
|
2
|
+
def up
|
3
|
+
create_table :junction_conditionnal_costs do |t|
|
4
|
+
t.belongs_to :junction
|
5
|
+
t.float :cost
|
6
|
+
t.string :tags
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
drop_table :junction_conditionnal_costs
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreatePhysicalRoadConditionnalCosts < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
create_table :physical_road_conditionnal_costs do |t|
|
4
|
+
t.belongs_to :physical_road
|
5
|
+
t.float :cost
|
6
|
+
t.string :tags
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
drop_table :physical_road_conditionnal_costs
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class ChangeLengthNameForPhysicalRoad < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
remove_column :physical_roads, :length
|
4
|
+
add_column :physical_roads, :length_in_meter, :float, :default => 0
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
remove_column :physical_roads, :length_in_meter
|
9
|
+
add_column :physical_roads, :length, :integer
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
class AddConstraintsToPhysicalRoads < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
remove_column :physical_roads, :minimum_width
|
4
|
+
remove_column :physical_roads, :kind
|
5
|
+
|
6
|
+
add_column :physical_roads, :minimum_width, :string
|
7
|
+
add_column :physical_roads, :transport_mode, :string
|
8
|
+
add_column :physical_roads, :uphill, :float
|
9
|
+
add_column :physical_roads, :downhill, :float
|
10
|
+
add_column :physical_roads, :slope, :string
|
11
|
+
add_column :physical_roads, :cant, :string
|
12
|
+
add_column :physical_roads, :covering, :string
|
13
|
+
add_column :physical_roads, :steps_count, :integer
|
14
|
+
add_column :physical_roads, :banisters_available, :boolean
|
15
|
+
add_column :physical_roads, :tactile_band, :boolean
|
16
|
+
add_column :physical_roads, :physical_road_type, :string
|
17
|
+
|
18
|
+
add_index :physical_roads, :physical_road_type
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def down
|
23
|
+
remove_column :physical_roads, :minimum_width
|
24
|
+
remove_column :physical_roads, :transport_mode
|
25
|
+
remove_column :physical_roads, :uphill
|
26
|
+
remove_column :physical_roads, :downhill
|
27
|
+
remove_column :physical_roads, :slope
|
28
|
+
remove_column :physical_roads, :cant
|
29
|
+
remove_column :physical_roads, :covering
|
30
|
+
remove_column :physical_roads, :steps_count
|
31
|
+
remove_column :physical_roads, :banisters_available
|
32
|
+
remove_column :physical_roads, :tactile_band
|
33
|
+
remove_column :physical_roads, :physical_road_type
|
34
|
+
|
35
|
+
add_column :physical_roads, :minimum_width, :integer
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class FixWaitingConstraintTypeForJunction < ActiveRecord::Migration
|
2
|
+
def up
|
3
|
+
remove_column :junctions, :waiting_constraint
|
4
|
+
add_column :junctions, :waiting_constraint, :float
|
5
|
+
end
|
6
|
+
|
7
|
+
def down
|
8
|
+
remove_column :junctions, :waiting_constraint
|
9
|
+
add_column :junctions, :waiting_constraint, :time
|
10
|
+
end
|
11
|
+
end
|
data/lib/active_road.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "active_road/engine"
|
2
|
+
require 'erb'
|
3
|
+
|
4
|
+
module ActiveRoad
|
5
|
+
|
6
|
+
def self.srid
|
7
|
+
4326
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.database_configuration
|
11
|
+
YAML::load(ERB.new(IO.read( File.expand_path('../../config/database.yml', __FILE__))).result)
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
require "active_road/shortest_path"
|
17
|
+
require "active_road/shortest_path/finder"
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module ActiveRoad
|
2
|
+
if defined?(Rails)
|
3
|
+
require "active_road/migration"
|
4
|
+
|
5
|
+
class Engine < ::Rails::Engine
|
6
|
+
|
7
|
+
initializer "active_road.factories", :after => "factory_girl.set_factory_paths" do
|
8
|
+
FactoryGirl.definition_file_paths << File.expand_path('../../../spec/factories', __FILE__) if defined?(FactoryGirl)
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class ActiveRoad::Migration < ActiveRecord::Migration
|
2
|
+
# def connection
|
3
|
+
# # @connection can be wrapped (with CommandRecorder in Rails 3.2 for example)
|
4
|
+
# if roads_connection?(@connection)
|
5
|
+
# @connection
|
6
|
+
# else
|
7
|
+
# @connection = ActiveRoad::Base.connection
|
8
|
+
# end
|
9
|
+
# end
|
10
|
+
|
11
|
+
# def roads_connection?(connection)
|
12
|
+
# connection.respond_to?(:current_database) and
|
13
|
+
# connection.current_database == ActiveRoad::Base.connection.current_database
|
14
|
+
# end
|
15
|
+
end
|
@@ -0,0 +1,172 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# This class find the shortest path between a departure and an arrival with :
|
3
|
+
# - weight functions
|
4
|
+
# - tags to find selected physical roads
|
5
|
+
#
|
6
|
+
# A classic result would be with a point for departure and arrival :
|
7
|
+
# Paths ==> 1 : Departure Point
|
8
|
+
# |=> 2 : Access Link
|
9
|
+
# |=> 3 : Path between AccessPoint and a Junction
|
10
|
+
# |=> ... : Path between a Junction and another Junction
|
11
|
+
# |=> n-2 : Path between a Junction and an Access Point
|
12
|
+
# |=> n-1 : Access Link
|
13
|
+
# |=> n : Arrival Point
|
14
|
+
|
15
|
+
|
16
|
+
require 'shortest_path/finder'
|
17
|
+
|
18
|
+
class ActiveRoad::ShortestPath::Finder < ShortestPath::Finder
|
19
|
+
|
20
|
+
attr_accessor :speed, :physical_road_filter, :follow_way_filter, :user_weights
|
21
|
+
|
22
|
+
def initialize(departure, arrival, speed = 4, constraints = {}, user_weights = {})
|
23
|
+
super departure, arrival
|
24
|
+
@speed = speed * 1000 / 3600 # Convert speed in meter/second
|
25
|
+
@follow_way_filter, @physical_road_filter = {}, {}
|
26
|
+
constraints.each do |key, value|
|
27
|
+
if key == :uphill || key == :downhill || key == :height
|
28
|
+
@follow_way_filter[key] = value # filter to use with follow_way? method
|
29
|
+
else
|
30
|
+
@physical_road_filter[key] = value # filter to use with physical_roads
|
31
|
+
end
|
32
|
+
end
|
33
|
+
@user_weights = user_weights # Not used
|
34
|
+
end
|
35
|
+
|
36
|
+
def destination_accesses
|
37
|
+
@destination_accesses ||= ActiveRoad::AccessPoint.to(destination, physical_road_filter)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Return a time in second from node to destination
|
41
|
+
# TODO : Tenir compte de la sinuosité de la route???
|
42
|
+
def time_heuristic(node)
|
43
|
+
if node.respond_to?(:arrival)
|
44
|
+
node.arrival.to_geometry.spherical_distance(destination) / speed
|
45
|
+
else
|
46
|
+
node.to_geometry.spherical_distance(destination) / speed
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Return a distance in meter from node to destination
|
51
|
+
def distance_heuristic(node)
|
52
|
+
if node.respond_to?(:arrival)
|
53
|
+
node.arrival.to_geometry.spherical_distance(destination)
|
54
|
+
else
|
55
|
+
node.to_geometry.spherical_distance(destination)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def path_weights(path)
|
60
|
+
path_weights = 0
|
61
|
+
|
62
|
+
# Add path weight
|
63
|
+
path_weights += path_weight(path.length_in_meter) if path.respond_to?(:length_in_meter)
|
64
|
+
|
65
|
+
# Add junction weight if it's a junction with a waiting constraint
|
66
|
+
if path.class != GeoRuby::SimpleFeatures::Point && path.departure.class == ActiveRoad::Junction && path.departure && path.departure.waiting_constraint
|
67
|
+
path_weights += path.departure.waiting_constraint
|
68
|
+
end
|
69
|
+
|
70
|
+
# TODO Refactor user weights
|
71
|
+
# if path.respond_to?(:road) # PhysicalRoad only no AccessLink
|
72
|
+
# path_tags = path.road.tags
|
73
|
+
|
74
|
+
# user_weights.each do |key, value|
|
75
|
+
# if path_tags.keys.include? key
|
76
|
+
# min, max, percentage = value[0], value[1], value[2]
|
77
|
+
# if min <= path_tags[key].to_i && path_tags[key].to_i <= max
|
78
|
+
# path_weights += path_weight(path_length, percentage)
|
79
|
+
# end
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
|
84
|
+
path_weights
|
85
|
+
end
|
86
|
+
|
87
|
+
def path_weight( length_in_meter = 0, percentage = 1 )
|
88
|
+
(length_in_meter / speed) * percentage
|
89
|
+
end
|
90
|
+
|
91
|
+
def geometry
|
92
|
+
@geometry ||= GeoRuby::SimpleFeatures::LineString.merge path.collect { |n| n.to_geometry }.select { |g| GeoRuby::SimpleFeatures::LineString === g }
|
93
|
+
end
|
94
|
+
|
95
|
+
# Use to profile code
|
96
|
+
def self.example
|
97
|
+
from = (ENV['FROM'] or "30.030238,-90.061541")
|
98
|
+
to = (ENV['TO'] or "29.991739,-90.06918")
|
99
|
+
|
100
|
+
ActiveRoad::ShortestPath::Finder.new GeoRuby::SimpleFeatures::Point.from_lat_lng(from), GeoRuby::SimpleFeatures::Point.from_lat_lng(to)
|
101
|
+
end
|
102
|
+
|
103
|
+
#-----------------------------------------
|
104
|
+
# Overwrite ShortestPath::Finder methods
|
105
|
+
#-----------------------------------------
|
106
|
+
|
107
|
+
def visited?(node)
|
108
|
+
super(respond_to?(:arrival) ? node.arrival : node)
|
109
|
+
end
|
110
|
+
|
111
|
+
def visit(node)
|
112
|
+
super(respond_to?(:arrival) ? node.arrival : node)
|
113
|
+
end
|
114
|
+
|
115
|
+
def search_heuristic(node)
|
116
|
+
shortest_distances[node] + time_heuristic(node)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Update context with uphill, downhill and height
|
120
|
+
# TODO : Fix arguments node is not a node but a path a point or an access link!!
|
121
|
+
def refresh_context( node, context = {} )
|
122
|
+
context_uphill = context[:uphill] ? context[:uphill] : 0
|
123
|
+
context_downhill = context[:downhill] ? context[:downhill] : 0
|
124
|
+
context_height = context[:height] ? context[:height] : 0
|
125
|
+
|
126
|
+
if( node.class == ActiveRoad::Path )
|
127
|
+
departure = node.departure
|
128
|
+
physical_road = node.physical_road
|
129
|
+
|
130
|
+
node_uphill = ( physical_road && physical_road.uphill) ? physical_road.uphill : 0
|
131
|
+
node_downhill = (physical_road && physical_road.downhill) ? physical_road.downhill : 0
|
132
|
+
node_height = (departure.class != ActiveRoad::AccessPoint && departure && departure.height) ? departure.height : 0
|
133
|
+
|
134
|
+
return { :uphill => (context_uphill + node_uphill), :downhill => (context_downhill + node_downhill), :height => (context_height + node_height) }
|
135
|
+
else
|
136
|
+
return {:uphill => context_uphill, :downhill => context_downhill, :height => context_height}
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# Follow way depends from uphill, downhill, height and heuristics
|
141
|
+
def follow_way?(node, destination, weight, context={})
|
142
|
+
# Check that arguments in the context is less than the object parameters
|
143
|
+
request = true
|
144
|
+
request = request && context[:uphill] <= follow_way_filter[:uphill] if follow_way_filter[:uphill] && context[:uphill].present?
|
145
|
+
request = request && context[:downhill] <= follow_way_filter[:downhill] if follow_way_filter[:downhill] && context[:downhill].present?
|
146
|
+
request = request && context[:height] <= follow_way_filter[:height] if follow_way_filter[:height] && context[:height].present?
|
147
|
+
request = request && search_heuristic(node) + weight < time_heuristic(source) * 10
|
148
|
+
end
|
149
|
+
|
150
|
+
def ways(node, context={})
|
151
|
+
paths =
|
152
|
+
if GeoRuby::SimpleFeatures::Point === node
|
153
|
+
ActiveRoad::AccessLink.from(node, physical_road_filter)
|
154
|
+
else
|
155
|
+
node.paths(physical_road_filter)
|
156
|
+
end
|
157
|
+
|
158
|
+
unless GeoRuby::SimpleFeatures::Point === node # For the first point to access physical roads
|
159
|
+
destination_accesses.select do |destination_access|
|
160
|
+
if node.access_to_road?(destination_access.physical_road)
|
161
|
+
paths << ActiveRoad::Path.new(:departure => node.arrival, :arrival => destination_access, :physical_road => destination_access.physical_road)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
array = paths.collect do |path|
|
167
|
+
[ path, path_weights(path)]
|
168
|
+
end
|
169
|
+
Hash[array]
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|