aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/chouette/route_section.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/chouette/route_section.rb')
-rw-r--r--app/models/chouette/route_section.rb126
1 files changed, 64 insertions, 62 deletions
diff --git a/app/models/chouette/route_section.rb b/app/models/chouette/route_section.rb
index 3ce4232be..e4b4347e7 100644
--- a/app/models/chouette/route_section.rb
+++ b/app/models/chouette/route_section.rb
@@ -1,81 +1,83 @@
-class Chouette::RouteSection < Chouette::TridentActiveRecord
- belongs_to :departure, class_name: 'Chouette::StopArea'
- belongs_to :arrival, class_name: 'Chouette::StopArea'
- has_many :journey_pattern_sections
- has_many :journey_patterns, through: :journey_pattern_sections, dependent: :destroy
+module Chouette
+ class RouteSection < Chouette::TridentActiveRecord
+ belongs_to :departure, class_name: 'Chouette::StopArea'
+ belongs_to :arrival, class_name: 'Chouette::StopArea'
+ has_many :journey_pattern_sections
+ has_many :journey_patterns, through: :journey_pattern_sections, dependent: :destroy
- validates :departure, :arrival, :processed_geometry, presence: true
+ validates :departure, :arrival, :processed_geometry, presence: true
- scope :by_endpoint_name, ->(endpoint, name) do
- joins("INNER JOIN stop_areas #{endpoint} ON #{endpoint}.id = route_sections.#{endpoint}_id").where(["#{endpoint}.name ilike ?", "%#{name}%"])
- end
- scope :by_line_id, ->(line_id) do
- joins(:journey_pattern_sections, :journey_patterns).joins('INNER JOIN routes ON journey_patterns.route_id = routes.id').where("routes.line_id = #{line_id}")
- end
+ scope :by_endpoint_name, ->(endpoint, name) do
+ joins("INNER JOIN stop_areas #{endpoint} ON #{endpoint}.id = route_sections.#{endpoint}_id").where(["#{endpoint}.name ilike ?", "%#{name}%"])
+ end
+ scope :by_line_id, ->(line_id) do
+ joins(:journey_pattern_sections, :journey_patterns).joins('INNER JOIN routes ON journey_patterns.route_id = routes.id').where("routes.line_id = #{line_id}")
+ end
- def stop_areas
- [departure, arrival].compact
- end
+ def stop_areas
+ [departure, arrival].compact
+ end
- def default_geometry
- points = stop_areas.collect(&:geometry).compact
- GeoRuby::SimpleFeatures::LineString.from_points(points) if points.many?
- end
+ def default_geometry
+ points = stop_areas.collect(&:geometry).compact
+ GeoRuby::SimpleFeatures::LineString.from_points(points) if points.many?
+ end
- def name
- stop_areas.map do |stop_area|
- stop_area.try(:name) or '?'
- end.join(' - ') + " (#{geometry_description})"
- end
+ def name
+ stop_areas.map do |stop_area|
+ stop_area.try(:name) or '?'
+ end.join(' - ') + " (#{geometry_description})"
+ end
- def via_count
- input_geometry ? [ input_geometry.points.count - 2, 0 ].max : 0
- end
+ def via_count
+ input_geometry ? [ input_geometry.points.count - 2, 0 ].max : 0
+ end
- def geometry_description
- if input_geometry || processed_geometry
- [ "#{distance.to_i}m" ].tap do |parts|
- parts << "#{via_count} #{'via'.pluralize(via_count)}" if via_count > 0
- end.join(' - ')
- else
- "-"
+ def geometry_description
+ if input_geometry || processed_geometry
+ [ "#{distance.to_i}m" ].tap do |parts|
+ parts << "#{via_count} #{'via'.pluralize(via_count)}" if via_count > 0
+ end.join(' - ')
+ else
+ "-"
+ end
end
- end
- DEFAULT_PROCESSOR = Proc.new { |section| section.input_geometry || section.default_geometry.try(:to_rgeo) }
+ DEFAULT_PROCESSOR = Proc.new { |section| section.input_geometry || section.default_geometry.try(:to_rgeo) }
- @@processor = DEFAULT_PROCESSOR
- cattr_accessor :processor
+ @@processor = DEFAULT_PROCESSOR
+ cattr_accessor :processor
- def instance_processor
- no_processing || processor.nil? ? DEFAULT_PROCESSOR : processor
- end
+ def instance_processor
+ no_processing || processor.nil? ? DEFAULT_PROCESSOR : processor
+ end
+
+ def process_geometry
+ if input_geometry_changed? || processed_geometry.nil?
+ self.processed_geometry = instance_processor.call(self)
+ self.distance = processed_geometry.to_georuby.to_wgs84.spherical_distance if processed_geometry
+ end
- def process_geometry
- if input_geometry_changed? || processed_geometry.nil?
- self.processed_geometry = instance_processor.call(self)
- self.distance = processed_geometry.to_georuby.to_wgs84.spherical_distance if processed_geometry
+ true
end
+ before_validation :process_geometry
- true
- end
- before_validation :process_geometry
+ def editable_geometry=(geometry)
+ self.input_geometry = geometry
+ end
- def editable_geometry=(geometry)
- self.input_geometry = geometry
- end
+ def editable_geometry
+ input_geometry.try(:to_georuby) or default_geometry
+ end
- def editable_geometry
- input_geometry.try(:to_georuby) or default_geometry
- end
+ def editable_geometry_before_type_cast
+ editable_geometry.to_ewkt
+ end
- def editable_geometry_before_type_cast
- editable_geometry.to_ewkt
- end
+ def geometry(mode = nil)
+ mode ||= :processed
+ mode == :editable ? editable_geometry : processed_geometry.to_georuby
+ end
- def geometry(mode = nil)
- mode ||= :processed
- mode == :editable ? editable_geometry : processed_geometry.to_georuby
end
-
-end
+end \ No newline at end of file