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 |
