diff options
| -rw-r--r-- | app/maps/network_map.rb | 2 | ||||
| -rw-r--r-- | app/maps/stop_area_map.rb | 20 | ||||
| -rw-r--r-- | app/models/referential.rb | 42 | ||||
| -rw-r--r-- | spec/requests/referentials_spec.rb | 2 | 
4 files changed, 46 insertions, 20 deletions
| diff --git a/app/maps/network_map.rb b/app/maps/network_map.rb index 4271133bb..c1104e877 100644 --- a/app/maps/network_map.rb +++ b/app/maps/network_map.rb @@ -1,6 +1,6 @@  class NetworkMap < ApplicationMap -  attr_reader :referential, :network, :network_style +  attr_reader :network, :network_style    def initialize(network, network_style = nil)      @network = network diff --git a/app/maps/stop_area_map.rb b/app/maps/stop_area_map.rb index 0e02654e9..65c8b72fd 100644 --- a/app/maps/stop_area_map.rb +++ b/app/maps/stop_area_map.rb @@ -1,6 +1,6 @@  class StopAreaMap < ApplicationMap -  attr_reader :referential, :stop_area +  attr_reader :stop_area    attr_accessor :editable    alias_method :editable?, :editable @@ -19,15 +19,23 @@ class StopAreaMap < ApplicationMap        page.assign "edit_stop_area_layer", kml_layer(stop_area, { :default => editable? }, :style_map => StyleMap::EditStopAreaStyleMap.new.style_map)        page << map.add_layer(:edit_stop_area_layer) - -     if editable? -        # TODO virer ce code inline +       +       +      if editable? +       page.assign "referential_projection", projection_type.present? ? projection("EPSG:" + projection_type) : JsVar.new("undefined")   +        # TODO virer ce code inline                 page << <<EOF          edit_stop_area_layer.events.on({                             'afterfeaturemodified': function(event) {                               geometry = event.feature.geometry.clone().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));                              $('#stop_area_longitude').val(geometry.x);                              $('#stop_area_latitude').val(geometry.y); + +                            if(referential_projection != undefined) +                            { +                              projection_geometry = event.feature.geometry.clone().transform(new OpenLayers.Projection("EPSG:900913"), referential_projection ); +                              $('#stop_area_x').val(projection_geometry.x); +                              $('#stop_area_y').val(projection_geometry.y);                                                   }                             }                          });  EOF @@ -38,6 +46,10 @@ EOF        page << map.set_center(center.to_google.to_openlayers, 16, false, true)      end    end +   +  def projection_type +    stop_area.referential.projection_type +  end    def ready?      center.present? diff --git a/app/models/referential.rb b/app/models/referential.rb index 758e3f9eb..068b1df68 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -10,8 +10,8 @@ class Referential < ActiveRecord::Base    validates_uniqueness_of :name    validates_format_of :slug, :with => %r{\A[0-9a-z_]+\Z}    validates_format_of :prefix, :with => %r{\A[0-9a-zA-Z_]+\Z} -  validates_format_of :upper_corner, :with => %r{\A[0-9]+\.?[0-9]*\, [0-9]+\.?[0-9]*\Z} -  validates_format_of :lower_corner, :with => %r{\A[0-9]+\.?[0-9]*\, [0-9]+\.?[0-9]*\Z} +  validates_format_of :upper_corner, :with => %r{\A-?[0-9]+\.?[0-9]*\,-?[0-9]+\.?[0-9]*\Z} +  validates_format_of :lower_corner, :with => %r{\A-?[0-9]+\.?[0-9]*\,-?[0-9]+\.?[0-9]*\Z}    attr_accessor :resources    attr_accessor :upper_corner @@ -56,7 +56,6 @@ class Referential < ActiveRecord::Base    def define_default_attributes      self.time_zone ||= Time.zone.name -    self.bounds ||= GeoRuby::SimpleFeatures::Envelope.from_coordinates( [ [-5.2, 42.25], [8.23, 51.1] ] ).to_polygon.as_ewkt # bounds for France by default    end    def switch @@ -94,30 +93,43 @@ class Referential < ActiveRecord::Base      imports.create(:resources => resources) if resources    end -  before_save :update_envelope  -  before_create :update_envelope -  def update_envelope -    self.bounds = GeoRuby::SimpleFeatures::Envelope.from_coordinates([ [@lower_corner.x, @lower_corner.y], [ @upper_corner.x, @upper_corner.y ] ]).to_polygon.as_ewkt() -  end -    def upper_corner -    "#{envelope.upper_corner.x}, #{envelope.upper_corner.y}" +    envelope.upper_corner    end    def upper_corner=(upper_corner) -    @upper_corner = GeoRuby::SimpleFeatures::Point.from_coordinates( upper_corner.split(",") ) +    if String === upper_corner +      upper_corner = (upper_corner.blank? ? nil : GeoRuby::SimpleFeatures::Point::from_lat_lng(Geokit::LatLng.normalize(upper_corner), 4326)) +    end + +    envelope.tap do |envelope| +      envelope.upper_corner = upper_corner +      self.bounds = envelope.to_polygon.as_ewkt +    end    end    def lower_corner     -    "#{envelope.lower_corner.x}, #{envelope.lower_corner.y}" +    envelope.lower_corner    end    def lower_corner=(lower_corner) -    @lower_corner = GeoRuby::SimpleFeatures::Point.from_coordinates( lower_corner.split(",") ) +    if String === lower_corner +      lower_corner = (lower_corner.blank? ? nil : GeoRuby::SimpleFeatures::Point::from_lat_lng(Geokit::LatLng.normalize(lower_corner), 4326)) +    end + +    envelope.tap do |envelope| +      envelope.lower_corner = lower_corner +      self.bounds = envelope.to_polygon.as_ewkt +    end +  end + +  def default_bounds +    GeoRuby::SimpleFeatures::Envelope.from_coordinates( [ [-5.2, 42.25], [8.23, 51.1] ] ).to_polygon.as_ewkt    end -  def envelope     -    GeoRuby::SimpleFeatures::Geometry.from_ewkt(read_attribute(:bounds)).envelope +  def envelope +    bounds = read_attribute(:bounds) +    GeoRuby::SimpleFeatures::Geometry.from_ewkt(bounds.present? ? bounds : default_bounds ).envelope    end  end diff --git a/spec/requests/referentials_spec.rb b/spec/requests/referentials_spec.rb index 54e63c33c..9204c76e9 100644 --- a/spec/requests/referentials_spec.rb +++ b/spec/requests/referentials_spec.rb @@ -33,6 +33,8 @@ describe "Referentials" do        visit new_referential_path        fill_in "Nom", :with => "Test"        fill_in "Code", :with => "test" +      fill_in "Point haut/droite emprise par défaut", :with => "0.0, 0.0" +      fill_in "Point bas/gauche emprise par défaut", :with => "1.0, 1.0"        click_button "Créer Espace de données"        Referential.where(:name => "Test").should_not be_nil | 
