aboutsummaryrefslogtreecommitdiffstats
path: root/app/maps/stop_area_map.rb
blob: 07321834b1582a27caf64749a30ea0ad288817f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class StopAreaMap < ApplicationMap

  attr_reader :stop_area

  attr_accessor :editable
  alias_method :editable?, :editable

  def initialize(stop_area)
    @stop_area = stop_area
  end

  def customize_map(map, page)
      if stop_area.children.present?
        page.assign "children_layer", kml_layer(stop_area, { :children => true }, :style_map => Design::StopAreasStyleMap.new(helpers).style_map)
        page << map.add_layer(:children_layer)
        page << map.add_control( hover_control_display_name(:children_layer) )
      end
      if stop_area.routing_stops.present?
        page.assign "routing_layer", kml_layer(stop_area, { :routing => true }, :style_map => Design::StopAreasStyleMap.new(helpers).style_map)
        page << map.add_layer(:routing_layer)
        page << map.add_control( hover_control_display_name(:routing_layer) )
        page << map.zoom_to_extent(bounds.to_google.to_openlayers) if bounds
      else


        if stop_area.new_record?
          page << <<EOF
          var createStyleMap = function() {
            var defProp = {strokeColor: "black", strokeOpacity: 1, strokeWidth: 2, fillColor: "white", fillOpacity: 1};
            var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]);
            return new OpenLayers.StyleMap({'default': defStyle});
          };
          var edit_stop_area_layer = new OpenLayers.Layer.Vector( "edit_stop_area_layer", {styleMap: createStyleMap()});

EOF
        else
          page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => Design::EditStopAreaStyleMap.new(helpers).style_map)
        end

        page << <<EOF
        var createAddressStyleMap = function() {
          var defProp = {fill: false, stroke: false, label: "\uf041", labelAlign: "cb", labelXOffset: 0, labelYOffset: 0, fontSize:"20px", fontOpacity: 1, fontFamily: "FontAwesome", labelOutlineWidth: 2};
          var defStyle = OpenLayers.Util.applyDefaults(defProp, OpenLayers.Feature.Vector.style["default"]);
          return new OpenLayers.StyleMap({'default': defStyle, });
        };
        var address_layer = new OpenLayers.Layer.Vector( "address_layer", {styleMap: createAddressStyleMap()});

        var removeAddress = function() {
          address_layer.destroyFeatures();
        };

        var addAddress = function( lat, lng, name ) {
          var wgs84point = new OpenLayers.Geometry.Point( lat, lng);
          var point = transformedGeometry( wgs84point, "EPSG:4326", "EPSG:900913" )
          var feature = new OpenLayers.Feature.Vector( point, { name: name});
          address_layer.addFeatures( [feature]);

          var bounds = new OpenLayers.Bounds();
          bounds.extend( feature.geometry.getBounds());
          for (var x in edit_stop_area_layer.features) {
              bounds.extend( edit_stop_area_layer.features[x].geometry.getBounds());
          }
          map.zoomToExtent(bounds.scale(2), true);
        };
        var transformedGeometry = function( geometry, origin, target ) {
          return geometry.clone().transform( new OpenLayers.Projection( origin ), new OpenLayers.Projection( target ));
        }
EOF
        page << map.add_layer(:address_layer)
        page << map.add_layer(:edit_stop_area_layer)

        if editable?
          page.assign "referential_projection", projection_type.present? ? projection("EPSG:" + projection_type) : JsVar.new("undefined")

          # TODO virer ce code inline
          page << <<EOF

          var getEventWGS84 = function( event) {
            return transformedGeometry( event.geometry, "EPSG:900913", "EPSG:4326");
          }
          var getEventProjection = function( event, projCode) {
            return transformedGeometry( event.geometry, "EPSG:900913", projCode);
          }
          var updateStopAreaCoordinates = function( event ) {
            var geometry = getEventWGS84( event );
            $('#stop_area_coordinates').val( geometry.y.toString()+ ","+ geometry.x.toString());
          }
          var updateStopAreaProjectionXY = function( event, projCode ) {
            var geometry = getEventProjection( event, projCode);
            $('#stop_area_projection_xy').val( geometry.x.toString()+ ","+ geometry.y.toString());
          }

          var drawControl = new OpenLayers.Control.DrawFeature( edit_stop_area_layer, OpenLayers.Handler.Point,
              { featureAdded: function(event) {
              console.log( "featureAdded" );
                  updateStopAreaCoordinates( event);
                  if( typeof referential_projection !== 'undefined') {
                    updateStopAreaProjectionXY( event, referential_projection.projCode);
                  }
                  this.deactivate();
                }
              });

          var dragControl = new OpenLayers.Control.DragFeature( edit_stop_area_layer,
              { autoActivate: true,
                onComplete: function(event) {
                  updateStopAreaCoordinates( event);
                  if( typeof referential_projection !== 'undefined') {
                    updateStopAreaProjectionXY( event, referential_projection.projCode);
                  }
                },
              });
            map.addControl( dragControl);
            map.addControl( drawControl);
EOF

          if stop_area.new_record?
          page << <<EOF
            drawControl.activate();
EOF
          end
        end

      page << map.set_center(center.to_google.to_openlayers, 16, false, true)
      end
  end

  def projection_type
    stop_area.projection
  end

  def ready?
    center.present?
  end

  def center
    stop_area.geometry or stop_area.default_position
  end

  def bounds
    # for ITL only
    @bounds ||= GeoRuby::SimpleFeatures::Point.bounds(stop_area.routing_stops.collect(&:geometry).compact)
  end

end