diff options
Diffstat (limited to 'app/maps/route_section_map.rb')
| -rw-r--r-- | app/maps/route_section_map.rb | 67 |
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 |
