aboutsummaryrefslogtreecommitdiffstats
path: root/app/maps/route_section_map.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/maps/route_section_map.rb')
-rw-r--r--app/maps/route_section_map.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/app/maps/route_section_map.rb b/app/maps/route_section_map.rb
new file mode 100644
index 000000000..cfa40d481
--- /dev/null
+++ b/app/maps/route_section_map.rb
@@ -0,0 +1,67 @@
+class RouteSectionMap < ApplicationMap
+
+ attr_reader :route_section
+
+ attr_accessor :editable
+ alias_method :editable?, :editable
+
+ def initialize(route_section, editable = false)
+ @route_section = route_section
+ @editable = editable
+ end
+
+ def customize_map(map, page)
+ # layers order seems to matter for ModifyFeature control
+ route_section.stop_areas.each do |stop_area|
+ layer = "stop_area_#{stop_area.id}".to_sym
+ page.assign layer.to_s, kml_layer(stop_area, :styleMap => Design::StopAreasStyleMap.new(helpers).style_map)
+ page << map.add_layer(layer)
+ page << map.add_control( hover_control_display_name(layer) )
+ end
+
+ geometry_options = {}.tap do |options|
+ options[:mode] = :editable if editable?
+ end
+ geometry_uneditable_kml_layer = kml_layer(route_section, :styleMap => Design::RouteSectionSelectorStyleMap.new(helpers).style_map)
+ page << map.add_layer(geometry_uneditable_kml_layer)
+
+ if route_section.input_geometry
+ geometry_editable_layer = kml_layer(route_section, geometry_options, {}) # , :styleMap => Design::LineStyleMap.new(style: nil).style_map)
+ else
+ points = route_section.stop_areas.map{|point| OpenLayers::Geometry::Point.new(point.longitude, point.latitude).transform("EPSG:4326", "EPSG:900913")}
+ geometry_editable_layer = OpenLayers::Layer::Vector.new("user_geometry", {:projection => projection("EPSG:4326"), :styleMap => Design::RouteSectionStyleMap.new(helpers).style_map})
+ #geometry_editable_layer = OpenLayers::Layer::Vector.new("user_geometry", {:projection => projection("EPSG:4326")})
+ geometry_editable_features = OpenLayers::Feature::Vector.new(OpenLayers::Geometry::LineString.new(points))
+ page.assign :geometry_editable_features, geometry_editable_features
+ end
+
+ if editable
+ page.assign :user_geometry, geometry_editable_layer
+
+ page << "user_geometry.addFeatures([geometry_editable_features])" if geometry_editable_features
+
+ page << map.add_layer(:user_geometry)
+
+ page.assign :modify_feature, OpenLayers::Control::ModifyFeature.new(:user_geometry, autoActivate: true)
+ page << map.add_control( :modify_feature )
+ else
+ page << map.add_layer(geometry_editable_layer)
+ end
+
+ page << map.zoom_to_extent(bounds.to_google.to_openlayers) if bounds
+ end
+
+ def bounds
+ @bounds ||=
+ if route_section.geometry.present?
+ route_section.geometry.bounds
+ elsif route_section.stop_areas.present?
+ GeoRuby::SimpleFeatures::Point.bounds route_section.stop_areas.collect(&:geometry)
+ end
+ end
+
+ def ready?
+ bounds.present?
+ end
+
+end