aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/chouette/access_point.rb
diff options
context:
space:
mode:
authorXinhui2016-02-22 14:17:18 +0100
committerXinhui2016-02-22 14:17:18 +0100
commitd49f47b4ac1db2cd88b96d830772bb7773924601 (patch)
tree191c7b9cda9edf939792e7780df4e7460d685a4a /app/models/chouette/access_point.rb
parent633004afc5861a6e8158948ddfecd73bf4dd86a8 (diff)
downloadchouette-core-d49f47b4ac1db2cd88b96d830772bb7773924601.tar.bz2
Merge model from ninoxe gem
Diffstat (limited to 'app/models/chouette/access_point.rb')
-rw-r--r--app/models/chouette/access_point.rb162
1 files changed, 162 insertions, 0 deletions
diff --git a/app/models/chouette/access_point.rb b/app/models/chouette/access_point.rb
new file mode 100644
index 000000000..43c8e1b3a
--- /dev/null
+++ b/app/models/chouette/access_point.rb
@@ -0,0 +1,162 @@
+require 'geokit'
+require 'geo_ruby'
+
+class Chouette::AccessPoint < Chouette::TridentActiveRecord
+ # FIXME http://jira.codehaus.org/browse/JRUBY-6358
+ self.primary_key = "id"
+ include Geokit::Mappable
+ has_many :access_links, :dependent => :destroy
+ belongs_to :stop_area
+
+ attr_accessor :access_point_type
+ attr_writer :coordinates
+
+ validates_presence_of :name
+ validates_presence_of :access_type
+
+ validates_presence_of :latitude, :if => :longitude
+ validates_presence_of :longitude, :if => :latitude
+ validates_numericality_of :latitude, :less_than_or_equal_to => 90, :greater_than_or_equal_to => -90, :allow_nil => true
+ validates_numericality_of :longitude, :less_than_or_equal_to => 180, :greater_than_or_equal_to => -180, :allow_nil => true
+
+ validates_format_of :coordinates, :with => %r{\A *-?(0?[0-9](\.[0-9]*)?|[0-8][0-9](\.[0-9]*)?|90(\.[0]*)?) *\, *-?(0?[0-9]?[0-9](\.[0-9]*)?|1[0-7][0-9](\.[0-9]*)?|180(\.[0]*)?) *\Z}, :allow_nil => true, :allow_blank => true
+
+ def self.nullable_attributes
+ [:street_name, :country_code, :comment, :long_lat_type, :zip_code, :city_name]
+ end
+
+ before_save :coordinates_to_lat_lng
+
+ def combine_lat_lng
+ if self.latitude.nil? || self.longitude.nil?
+ ""
+ else
+ self.latitude.to_s+","+self.longitude.to_s
+ end
+ end
+
+ def coordinates
+ @coordinates || combine_lat_lng
+ end
+
+ def coordinates_to_lat_lng
+ if ! @coordinates.nil?
+ if @coordinates.empty?
+ self.latitude = nil
+ self.longitude = nil
+ else
+ self.latitude = BigDecimal.new(@coordinates.split(",").first)
+ self.longitude = BigDecimal.new(@coordinates.split(",").last)
+ end
+ @coordinates = nil
+ end
+ end
+
+ def to_lat_lng
+ Geokit::LatLng.new(latitude, longitude) if latitude and longitude
+ end
+
+ def geometry
+ GeoRuby::SimpleFeatures::Point.from_lon_lat(longitude, latitude, 4326) if latitude and longitude
+ end
+
+ def geometry=(geometry)
+ geometry = geometry.to_wgs84
+ self.latitude, self.longitude, self.long_lat_type = geometry.lat, geometry.lng, "WGS84"
+ end
+
+ def position
+ geometry
+ end
+
+ def position=(position)
+ position = nil if String === position && position == ""
+ position = Geokit::LatLng.normalize(position), 4326 if String === position
+ self.latitude = position.lat
+ self.longitude = position.lng
+ end
+
+ def default_position
+ stop_area.geometry or stop_area.default_position
+ end
+
+
+ def access_point_type
+ access_type && Chouette::AccessPointType.new(access_type.underscore)
+ end
+
+ def access_point_type=(access_point_type)
+ self.access_type = (access_point_type ? access_point_type.camelcase : nil)
+ end
+
+ @@access_point_types = nil
+ def self.access_point_types
+ @@access_point_types ||= Chouette::AccessPointType.all.select do |access_point_type|
+ access_point_type.to_i >= 0
+ end
+ end
+
+ def generic_access_link_matrix
+ matrix = Array.new
+ hash = Hash.new
+ access_links.each do |link|
+ hash[link.link_key] = link
+ end
+ key=Chouette::AccessLink.build_link_key(self,stop_area,"access_point_to_stop_area")
+ if hash.has_key?(key)
+ matrix << hash[key]
+ else
+ link = Chouette::AccessLink.new
+ link.access_point = self
+ link.stop_area = stop_area
+ link.link_orientation_type = "access_point_to_stop_area"
+ matrix << link
+ end
+ key=Chouette::AccessLink.build_link_key(self,stop_area,"stop_area_to_access_point")
+ if hash.has_key?(key)
+ matrix << hash[key]
+ else
+ link = Chouette::AccessLink.new
+ link.access_point = self
+ link.stop_area = stop_area
+ link.link_orientation_type = "stop_area_to_access_point"
+ matrix << link
+ end
+ matrix
+ end
+
+ def detail_access_link_matrix
+ matrix = Array.new
+ hash = Hash.new
+ access_links.each do |link|
+ hash[link.link_key] = link
+ end
+ stop_area.children_at_base.each do |child|
+ key=Chouette::AccessLink.build_link_key(self,child,"access_point_to_stop_area")
+ if hash.has_key?(key)
+ matrix << hash[key]
+ else
+ link = Chouette::AccessLink.new
+ link.access_point = self
+ link.stop_area = child
+ link.link_orientation_type = "access_point_to_stop_area"
+ matrix << link
+ end
+ key=Chouette::AccessLink.build_link_key(self,child,"stop_area_to_access_point")
+ if hash.has_key?(key)
+ matrix << hash[key]
+ else
+ link = Chouette::AccessLink.new
+ link.access_point = self
+ link.stop_area = child
+ link.link_orientation_type = "stop_area_to_access_point"
+ matrix << link
+ end
+ end
+ matrix
+ end
+
+ def geometry_presenter
+ Chouette::Geometry::AccessPointPresenter.new self
+ end
+end