active_road 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|