ropenlayer 0.0.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +9 -0
- data/Manifest.txt +0 -20
- data/PostInstall.txt +1 -2
- data/README.rdoc +161 -23
- data/lib/generators/ropenlayer/install/INSTALL +16 -0
- data/lib/generators/ropenlayer/install/USAGE +7 -0
- data/lib/generators/ropenlayer/install/install_generator.rb +20 -0
- data/lib/generators/ropenlayer/install/templates/config/initializers/ropenlayer.rb +13 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/add_point_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/add_point_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/blank.gif +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/close.gif +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/default_marker.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/drag-rectangle-off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/drag-rectangle-on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_line_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_line_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_point_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_point_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_polygon_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/draw_polygon_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/edit_map.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/edit_map_active.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/editing_tool_bar.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/layers_switch.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/layers_switch_active.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/move_feature_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/move_feature_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/navigation_history.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/none_button.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/overview_replacement.gif +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/pan-panel-NOALPHA.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/pan-panel.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/pan-panel_active.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/pan_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/pan_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/panning-hand-off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/panning-hand-on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/remove_point_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/remove_point_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/ruler.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/save_features_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/save_features_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/view_next_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/view_next_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/view_previous_off.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/view_previous_on.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/zoom-panel-NOALPHA.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/zoom-panel.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/images/ropenlayer/zoom-panel_active.png +0 -0
- data/lib/generators/ropenlayer/install/templates/public/stylesheets/ropenlayer.css +430 -0
- data/lib/generators/ropenlayer/migration/USAGE +10 -0
- data/lib/generators/ropenlayer/migration/migration_generator.rb +22 -0
- data/lib/generators/ropenlayer/migration/templates/migration.rb +31 -0
- data/lib/ropenlayer/acts_as/mapper.rb +147 -0
- data/lib/ropenlayer/acts_as/nodeable.rb +109 -0
- data/lib/ropenlayer/acts_as.rb +138 -0
- data/lib/ropenlayer/category.rb +14 -0
- data/lib/ropenlayer/form_builder.rb +69 -0
- data/lib/ropenlayer/icon.rb +12 -0
- data/lib/ropenlayer/js_helper/jquery.rb +63 -0
- data/lib/ropenlayer/js_helper/prototype.rb +51 -0
- data/lib/ropenlayer/localization.rb +6 -0
- data/lib/ropenlayer/node.rb +38 -0
- data/lib/ropenlayer/openlayer/box_control/base.rb +57 -0
- data/lib/ropenlayer/openlayer/box_control/edit_map.rb +85 -0
- data/lib/ropenlayer/openlayer/box_control/layers_select.rb +17 -0
- data/lib/ropenlayer/openlayer/control.rb +42 -0
- data/lib/ropenlayer/openlayer/feature.rb +119 -0
- data/lib/ropenlayer/openlayer/js.rb +63 -0
- data/lib/ropenlayer/openlayer/layer/base.rb +88 -0
- data/lib/ropenlayer/openlayer/layer/elements_marker.rb +20 -0
- data/lib/ropenlayer/openlayer/layer/elements_vector.rb +35 -0
- data/lib/ropenlayer/openlayer/map.rb +192 -0
- data/lib/ropenlayer.rb +59 -14
- data/ropenlayer.gemspec +11 -8
- metadata +94 -17
- data/lib/ropenlayer/box_control/base.rb +0 -47
- data/lib/ropenlayer/box_control/edit_map.rb +0 -79
- data/lib/ropenlayer/box_control/layers_select.rb +0 -16
- data/lib/ropenlayer/control.rb +0 -40
- data/lib/ropenlayer/js.rb +0 -62
- data/lib/ropenlayer/layer/base.rb +0 -87
- data/lib/ropenlayer/layer/elements_marker.rb +0 -18
- data/lib/ropenlayer/layer/elements_vector.rb +0 -33
- data/lib/ropenlayer/map.rb +0 -176
@@ -0,0 +1,109 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module ActsAs
|
3
|
+
|
4
|
+
# acts_as_localizable_on: give to the model facilities to store and draw object in a map.
|
5
|
+
#
|
6
|
+
# class Team < ActiveRecord::Base
|
7
|
+
# acts_as_map :default_layer => :google_streets, :nodes => [ :offices ]
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# class Office < ActiveRecord::Base
|
11
|
+
# belongs_to :team
|
12
|
+
# acts_as_localizable_on :team
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# Avalaible options:
|
16
|
+
#
|
17
|
+
# All the options can be mapped to a Proc object that will bind self or a Symbol which perform send(:symbol) method.
|
18
|
+
# - :name, :Name of the point. By default, Just another Element
|
19
|
+
# - :popup_content:Content of the popup, if set, element will render a popup in click with this xhtml content. by default, is false
|
20
|
+
# - :icon_url: Icon url to show, by default, /images/ropenlayer/default_marker.png
|
21
|
+
# - :color: Background color, by default transparent
|
22
|
+
#
|
23
|
+
# Examples
|
24
|
+
#
|
25
|
+
# Build a Map of the team offices with custom icons
|
26
|
+
#
|
27
|
+
# # on app/models/team.rb
|
28
|
+
# class Team < ActiveRecord::Base
|
29
|
+
# has_many :offices
|
30
|
+
# acts_as_map :default_layer => :google_streets, :latitude => 40000.23, :longitude => 54555.233, :zoom => 3
|
31
|
+
# :nodes => [ :offices ]
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# # on app/models/office.rb
|
35
|
+
# class Office < ActiveRecord::Base
|
36
|
+
# belongs_to :team
|
37
|
+
# acts_as_localizable_on :team, :icon_url => Proc.new{|o| o.main ? '/images/main_office.png' : '/images/office.png' },
|
38
|
+
# :color => Proc.new{|o| o.main ? 'red' : 'blue' },
|
39
|
+
# :popup_content => :full_description
|
40
|
+
#
|
41
|
+
# def full_description
|
42
|
+
# %( #{ name } - #{ address } )
|
43
|
+
# end
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
#
|
47
|
+
# on your view, just
|
48
|
+
#
|
49
|
+
# apps/views/offices/index.html
|
50
|
+
#
|
51
|
+
# <div id="offices_for_team_map" style="width: 500px; height: 400px;"></div>
|
52
|
+
# <%= raw @team.ropenlayer_map(:id => 'offices_for_team_map').to_js %>
|
53
|
+
module Nodeable
|
54
|
+
|
55
|
+
class << self
|
56
|
+
def included(base)
|
57
|
+
|
58
|
+
base.class_eval do
|
59
|
+
|
60
|
+
has_one :node, :as => :nodeable, :dependent => :destroy, :include => :localizations, :class_name => "Ropenlayer::Node"
|
61
|
+
accepts_nested_attributes_for :node
|
62
|
+
|
63
|
+
base.send :include, InstanceMethods
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
module InstanceMethods
|
69
|
+
|
70
|
+
def node_data
|
71
|
+
attributes_config = self.class.ropenlayer_node_config[:attributes] || {}
|
72
|
+
|
73
|
+
node_map_attributes = { }
|
74
|
+
[ :name, :popup_content, :icon_url, :color ].each do |attribute|
|
75
|
+
node_map_attributes[attribute] = eval_node_attribute(attributes_config[attribute]) unless attributes_config[attribute].nil?
|
76
|
+
end
|
77
|
+
|
78
|
+
if self.node.localizations.any?
|
79
|
+
node_map_attributes[:id] = self.node.id
|
80
|
+
node_map_attributes[:geometry] = self.node.geometry
|
81
|
+
node_map_attributes[:longitude] = self.node.localizations.first.longitude
|
82
|
+
node_map_attributes[:latitude] = self.node.localizations.first.latitude
|
83
|
+
node_map_attributes[:localizations] = self.node.localizations.map{|l| { :latitude => l.latitude, :longitude => l.longitude }}
|
84
|
+
else
|
85
|
+
node_map_attributes = nil
|
86
|
+
end
|
87
|
+
node_map_attributes
|
88
|
+
end
|
89
|
+
|
90
|
+
def ensure_nodeable_model
|
91
|
+
raise "Model `#{ self.class }` doesnt acts as nodeable" unless self.class.methods.include?("acts_as_nodeable") and self.class.acts_as_nodeable
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
95
|
+
def eval_node_attribute(attribute)
|
96
|
+
case attribute
|
97
|
+
when Symbol
|
98
|
+
return self.send(attribute)
|
99
|
+
when Proc
|
100
|
+
return attribute.call(self)
|
101
|
+
else
|
102
|
+
return attribute
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1,138 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module ActsAs
|
3
|
+
|
4
|
+
# acts_as_map: give to the model map construiction and build facilities.
|
5
|
+
#
|
6
|
+
# class Team < ActiveRecord::Base
|
7
|
+
# acts_as_map :default_layer => :google_streets
|
8
|
+
# end
|
9
|
+
#
|
10
|
+
# Avalaible options:
|
11
|
+
#
|
12
|
+
# - :longitude, :latitude, :zoom : Default starting values for map. Can be a float (latitude, longitude) or integer (zoom) object, so values will be parsed as them are.
|
13
|
+
# A Symbol, in this case, ropenlayer will send :symbol method to mapper instance, or a valid Proc object
|
14
|
+
# - :default_layer: Default layer for visualization. For avalaible layers see Ropenlayer::Openlayer::Map
|
15
|
+
# - :nodes: Relations which can be pointed on the map. Relations are expected to have acts_as_localizable_on behaviour in their class
|
16
|
+
#
|
17
|
+
# Examples
|
18
|
+
#
|
19
|
+
# Build a Map with static features, just for localization
|
20
|
+
#
|
21
|
+
# class Team < ActiveRecord::Base
|
22
|
+
# acts_as_map :default_layer => :google_streets, :latitude => 40000.23, :longitude => 54555.233, :zoom => 3
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# Build a Map with Proc calls to perform automatic localization on forms
|
26
|
+
#
|
27
|
+
# class Team < ActiveRecord
|
28
|
+
#
|
29
|
+
# has_many :offices
|
30
|
+
# has_one :main_office, :conditions => { :main => true }
|
31
|
+
#
|
32
|
+
# acts_as_map :default_layer => :google_streets, :longitude => :main_office_longitude, :latitude => :main_office_latitude, :zoom => :main_office_zoom
|
33
|
+
# :nodes => [ :offices ]
|
34
|
+
#
|
35
|
+
# def main_office_longitude
|
36
|
+
# main_office.longitude
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def main_office_longitude=(value)
|
40
|
+
# main_office_longitude = value
|
41
|
+
# end
|
42
|
+
#
|
43
|
+
# def main_office_latitude
|
44
|
+
# main_office.latitude
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# def main_office_latitude=(value)
|
48
|
+
# main_office.latitude = value
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# def main_office_longitude
|
52
|
+
# main_office.longitude
|
53
|
+
# end
|
54
|
+
#
|
55
|
+
# def main_office_zoom=(value)
|
56
|
+
# main_office.zoom = value
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
def acts_as_map(options = {})
|
62
|
+
|
63
|
+
class_eval do
|
64
|
+
|
65
|
+
cattr_reader :acts_as_mapper, :ropenlayer_mapper_config, :localizable
|
66
|
+
|
67
|
+
send("class_variable_set", "@@acts_as_mapper", true)
|
68
|
+
send("class_variable_set", "@@ropenlayer_mapper_config", options)
|
69
|
+
|
70
|
+
include Ropenlayer::ActsAs::Mapper
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# acts_as_localizable_on: give to the model facilities to store and draw object in a map.
|
76
|
+
#
|
77
|
+
# class Team < ActiveRecord::Base
|
78
|
+
# acts_as_map :default_layer => :google_streets, :nodes => [ :offices ]
|
79
|
+
# end
|
80
|
+
#
|
81
|
+
# class Office < ActiveRecord::Base
|
82
|
+
# belongs_to :team
|
83
|
+
# acts_as_localizable_on :team
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# Avalaible options:
|
87
|
+
#
|
88
|
+
# All the options can be mapped to a Proc object that will bind self or a Symbol which perform send(:symbol) method.
|
89
|
+
# - :name, :Name of the point. By default, Just another Element
|
90
|
+
# - :popup_content:Content of the popup, if set, element will render a popup in click with this xhtml content. by default, is false
|
91
|
+
# - :icon_url: Icon url to show, by default, /images/ropenlayer/default_marker.png
|
92
|
+
# - :color: Background color, by default transparent
|
93
|
+
#
|
94
|
+
# Examples
|
95
|
+
#
|
96
|
+
# Build a Map of the team offices with custom icons
|
97
|
+
#
|
98
|
+
# # on app/models/team.rb
|
99
|
+
# class Team < ActiveRecord::Base
|
100
|
+
# has_many :offices
|
101
|
+
# acts_as_map :default_layer => :google_streets, :latitude => 40000.23, :longitude => 54555.233, :zoom => 3
|
102
|
+
# :nodes => [ :offices ]
|
103
|
+
# end
|
104
|
+
#
|
105
|
+
# # on app/models/office.rb
|
106
|
+
# class Office < ActiveRecord::Base
|
107
|
+
# belongs_to :team
|
108
|
+
# acts_as_localizable_on :team, :icon_url => Proc.new{|o| o.main ? '/images/main_office.png' : '/images/office.png' },
|
109
|
+
# :color => Proc.new{|o| o.main ? 'red' : 'blue' },
|
110
|
+
# :popup_content => :full_description
|
111
|
+
#
|
112
|
+
# def full_description
|
113
|
+
# %( #{ name } - #{ address } )
|
114
|
+
# end
|
115
|
+
# end
|
116
|
+
#
|
117
|
+
#
|
118
|
+
# on your view, just
|
119
|
+
#
|
120
|
+
# apps/views/offices/index.html
|
121
|
+
#
|
122
|
+
# <div id="offices_for_team_map" style="width: 500px; height: 400px;"></div>
|
123
|
+
# <%= raw @team.ropenlayer_map(:id => 'offices_for_team_map').to_js %>
|
124
|
+
def acts_as_localizable_on(relation, options = {})
|
125
|
+
|
126
|
+
class_eval do
|
127
|
+
|
128
|
+
cattr_reader :acts_as_nodeable
|
129
|
+
cattr_reader :ropenlayer_node_config
|
130
|
+
|
131
|
+
send("class_variable_set", "@@acts_as_nodeable", true)
|
132
|
+
send("class_variable_set", "@@ropenlayer_node_config", options)
|
133
|
+
|
134
|
+
include Ropenlayer::ActsAs::Nodeable
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
class Category < ActiveRecord::Base
|
3
|
+
|
4
|
+
set_table_name :ropenlayer_categories
|
5
|
+
|
6
|
+
belongs_to :mapper, :polymorphic => true
|
7
|
+
|
8
|
+
#before_save :ensure_format, Proc.new {|category| category.color.match(/^\#/) ? '' : category.color = "##{ category.color }"
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module FormBuilder
|
3
|
+
|
4
|
+
def map_localization(options = {}, map_div_options = {})
|
5
|
+
self.object.ensure_mapper_model
|
6
|
+
self.object.ensure_localizable_model
|
7
|
+
|
8
|
+
klass_config = self.object.class.ropenlayer_mapper_config
|
9
|
+
dom_id_map = "ropenlayer_#{ @template.params[:action] }_#{ @template.params[:controller] }"
|
10
|
+
|
11
|
+
map = self.object.build_map(dom_id_map, klass_config)
|
12
|
+
|
13
|
+
map_div_options.merge!(:id => dom_id_map)
|
14
|
+
|
15
|
+
return_tag = ''
|
16
|
+
|
17
|
+
[ :longitude , :latitude, :zoom ].each do |data|
|
18
|
+
id_hidden_value = "#{ self.object.class.name.underscore }_#{ klass_config[data] }"
|
19
|
+
map.form_localizations_fields[data] = id_hidden_value
|
20
|
+
return_tag << hidden_field(klass_config[data], :id => id_hidden_value)
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
return_tag << "#{ @template.content_tag("div", '', map_div_options) } #{ @template.javascript_tag map.to_js }"
|
25
|
+
return_tag << localization_helper(map)
|
26
|
+
@template.raw return_tag
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def map_nodes_editor(mapper_relation, options = {}, map_div_options = {})
|
31
|
+
self.object.ensure_nodeable_model
|
32
|
+
mapper = self.object.send(mapper_relation)
|
33
|
+
mapper.ensure_mapper_model
|
34
|
+
|
35
|
+
mapper_config = mapper.class.ropenlayer_mapper_config
|
36
|
+
nodeable_config = self.object.class.ropenlayer_node_config
|
37
|
+
|
38
|
+
mapper_config.merge!(:edit_map => true)
|
39
|
+
|
40
|
+
dom_id_map = "ropenlayer_#{ mapper.class }_#{ @template.params[:action] }_#{ @template.params[:controller] }"
|
41
|
+
map = mapper.build_map(dom_id_map, mapper_config)
|
42
|
+
|
43
|
+
map_div_options.merge!(:id => dom_id_map)
|
44
|
+
|
45
|
+
|
46
|
+
return_tag = ''
|
47
|
+
|
48
|
+
self.object.node ||= self.object.build_node # FIXME has_many relation!
|
49
|
+
|
50
|
+
self.fields_for :node do |node_form|
|
51
|
+
return_tag << node_form.hidden_field(:geometry_string)
|
52
|
+
end
|
53
|
+
|
54
|
+
return_tag << @template.javascript_tag("#{ map.js_helper.create_new_feature_callback(map, self) }") unless map.options[:add_feature_callback] != map.class::DEFAULT_ADD_FEATURE_CALLBACK
|
55
|
+
return_tag << "#{ @template.content_tag("div", '', map_div_options) }#{ @template.javascript_tag map.to_js }"
|
56
|
+
|
57
|
+
@template.raw return_tag
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
private
|
62
|
+
def localization_helper(ropenlayer_object)
|
63
|
+
@template.link_to_function 'Store localization', "a = #{ ropenlayer_object.js_id }.getCenter(); long_dom = getElementById('#{ ropenlayer_object.form_localizations_fields[:longitude] }'); long_dom.value = a['lon']; lat_dom = getElementById('#{ ropenlayer_object.form_localizations_fields[:latitude] }'); lat_dom.value = a['lat']; b = #{ ropenlayer_object.js_id }.getZoom(); zoom_dom = getElementById('#{ ropenlayer_object.form_localizations_fields[:zoom] }'); zoom_dom.value = b; #{ ropenlayer_object.js_notification_area }.innerHTML = 'kk'"
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
class Icon < ActiveRecord::Base
|
3
|
+
|
4
|
+
set_table_name :ropenlayer_icons
|
5
|
+
|
6
|
+
belongs_to :mapper, :polymorphic => true
|
7
|
+
|
8
|
+
#has_attached_file :logo, :styles => { :'48' => "48x48", :'64' => "64x64", :'128' => "128x128", :'256' => "256x256" }
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module JsHelper
|
3
|
+
module Jquery
|
4
|
+
|
5
|
+
def self.create_xhtml_element(element_type, attributes = {})
|
6
|
+
|
7
|
+
inner_html = attributes.delete(:inner_html)
|
8
|
+
|
9
|
+
|
10
|
+
js_element = Ropenlayer::Openlayer::Js.new("$('<#{ element_type }")
|
11
|
+
|
12
|
+
|
13
|
+
attributes.each do |name, value|
|
14
|
+
if name.to_s.match(/^on/)
|
15
|
+
gsub_value = value.gsub("'","\\\\'")
|
16
|
+
else
|
17
|
+
gsub_value = value.gsub("'","")
|
18
|
+
end
|
19
|
+
|
20
|
+
js_element.body << %( #{ name }="#{ gsub_value }" )
|
21
|
+
|
22
|
+
end
|
23
|
+
js_element.body << ">"
|
24
|
+
js_element.body << inner_html.gsub("'","") if inner_html
|
25
|
+
|
26
|
+
js_element.body << "</#{ element_type }>')"
|
27
|
+
js_element.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.create_new_feature_callback(map, form)
|
31
|
+
Ropenlayer::Openlayer::Js.new("function addFeatureToMap(feature) {
|
32
|
+
|
33
|
+
total_features = feature.layer.features.length;
|
34
|
+
|
35
|
+
// Right now, just one feature for node
|
36
|
+
if(total_features > 1) {
|
37
|
+
first_feature = feature.layer.features[0];
|
38
|
+
feature.layer.removeFeatures(first_feature);
|
39
|
+
}
|
40
|
+
//update_geomtry
|
41
|
+
$('##{ form.object.class.name.underscore }_node_attributes_geometry_string').attr('value', feature.geometry);
|
42
|
+
|
43
|
+
}").to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.insert_into_xhtml_element(js_element, content)
|
47
|
+
Ropenlayer::Openlayer::Js.new("$(#{ js_element }).append(#{ content })").to_s
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.update_xhtml_element(js_element, content)
|
51
|
+
Ropenlayer::Openlayer::Js.new("#{ js_element }.innerHTML = #{ content }").to_s
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.hide_xhtml_element(js_element)
|
55
|
+
Ropenlayer::Openlayer::Js.new("$(#{ js_element }).hide()").to_s
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.toggle_xhtml_element(js_element)
|
59
|
+
Ropenlayer::Openlayer::Js.new("$(#{ js_element }).toggle()").to_s
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module JsHelper
|
3
|
+
module Prototype
|
4
|
+
|
5
|
+
def self.create_xhtml_element(element_type, attributes = {})
|
6
|
+
inner_html = attributes.delete(:inner_html)
|
7
|
+
|
8
|
+
return_js = Ropenlayer::Openlayer::Js.new_method("Element", :args => [ "'#{ element_type }'" ], :propierties => attributes)
|
9
|
+
return_js.body << ".update(#{ inner_html })" if inner_html
|
10
|
+
return_js.to_s
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def self.create_new_feature_callback(map, form)
|
15
|
+
Ropenlayer::Openlayer::Js.new("function addFeatureToMap(feature) {
|
16
|
+
|
17
|
+
total_features = feature.layer.features.size();
|
18
|
+
|
19
|
+
// Right now, just one feature for node
|
20
|
+
if(total_features > 1) {
|
21
|
+
first_feature = feature.layer.features.first();
|
22
|
+
feature.layer.removeFeatures(first_feature);
|
23
|
+
}
|
24
|
+
//update_geomtry
|
25
|
+
$('#{ form.object.class.name.underscore }_node_attributes_geometry_string').value = feature.geometry;
|
26
|
+
|
27
|
+
}").to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.insert_into_xhtml_element(js_element, content)
|
31
|
+
Ropenlayer::Openlayer::Js.new("#{ js_element }.insert(#{ content })").to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.update_xhtml_element(js_element, content)
|
35
|
+
Ropenlayer::Openlayer::Js.new("#{ js_element }.update(#{ content })").to_s
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.hide_xhtml_element(js_element)
|
39
|
+
Ropenlayer::Openlayer::Js.new("#{ js_element }.hide()").to_s
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.toggle_xhtml_element(js_element)
|
43
|
+
Ropenlayer::Openlayer::Js.new("#{ js_element }.toggle()").to_s
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
class Node < ActiveRecord::Base
|
3
|
+
|
4
|
+
attr_accessor :geometry_string
|
5
|
+
|
6
|
+
set_table_name :ropenlayer_nodes
|
7
|
+
|
8
|
+
GEOMETRY_TYPES = %w( POINT LINESTRING POLYGON )
|
9
|
+
|
10
|
+
belongs_to :map, :polymorphic => true
|
11
|
+
|
12
|
+
has_many :localizations, :class_name => 'Ropenlayer::Localization'
|
13
|
+
|
14
|
+
has_one :icon, :class_name => 'Ropenlayer::Icon'
|
15
|
+
has_one :category, :class_name => 'Ropenlayer::Category'
|
16
|
+
|
17
|
+
|
18
|
+
def geometry_string
|
19
|
+
"#{ geometry }(#{ localizations.map{|l| "#{ l.longitude } #{ l.latitude }"}.join(',')})"
|
20
|
+
end
|
21
|
+
|
22
|
+
def geometry_string=(data)
|
23
|
+
self.geometry = data.split('(').first
|
24
|
+
localizations_split = data.split('(').last.gsub(')', '').split(',')
|
25
|
+
|
26
|
+
self.localizations = []
|
27
|
+
order = 0
|
28
|
+
localizations_split.each do |data|
|
29
|
+
self.localizations << self.localizations.new(:longitude => data.split.first, :latitude => data.split.last, :order => order = order.next)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module Openlayer
|
3
|
+
module BoxControl
|
4
|
+
class Base
|
5
|
+
|
6
|
+
attr_reader :map
|
7
|
+
attr_reader :name
|
8
|
+
attr_reader :js_links_id
|
9
|
+
|
10
|
+
attr_accessor :links
|
11
|
+
|
12
|
+
|
13
|
+
def initialize(name, map, options = {})
|
14
|
+
@name = name
|
15
|
+
@map = map
|
16
|
+
@links = []
|
17
|
+
|
18
|
+
@js_id = "#{ map.js_id }_#{ name }"
|
19
|
+
@js_control_id = "#{ @js_id }_control"
|
20
|
+
@js_links_id = "#{ @js_id }_links"
|
21
|
+
@js_panel_id = "#{ @js_id }_panel"
|
22
|
+
|
23
|
+
@css_class = options[:css_class] || "olCustomControl#{ @name.camelize }"
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
def to_js
|
28
|
+
|
29
|
+
create_links_container = @map.js_helper.create_xhtml_element("div", { :class => "'#{ @css_class }Links'", :style => "'display: none;'", :id => "'#{ @js_links_id }'" })
|
30
|
+
create_openlayer_control = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Control.Button", :propierties => { :displayClass => "'#{ @css_class }'",
|
31
|
+
:trigger => "function() { #{ @map.js_helper.toggle_xhtml_element(@js_links_id) } }" }).to_s
|
32
|
+
create_openlayer_panel = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Control.Panel", :propierties => { :displayClass => "'#{ @css_class }Panel'",
|
33
|
+
:defaultControl => "#{ @js_control_id }" }).to_s
|
34
|
+
|
35
|
+
%( // Adding #{ @name } box control
|
36
|
+
|
37
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_control_id, create_openlayer_control).to_js }
|
38
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_links_id, create_links_container).to_js }
|
39
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_panel_id, create_openlayer_panel).to_js }
|
40
|
+
|
41
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @js_panel_id }.addControls([#{ @js_control_id }])").to_js }
|
42
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @map.js_id }.addControls([#{ @js_panel_id }])").to_js }
|
43
|
+
|
44
|
+
#{ Ropenlayer::Openlayer::Js.new(@map.js_helper.insert_into_xhtml_element("#{ @js_control_id }.div", @js_links_id)).to_js }
|
45
|
+
|
46
|
+
#{ links.inject('') do |links_string, link_config|
|
47
|
+
link_config[:inner_html] = "'#{ link_config.delete(:text) }'"
|
48
|
+
links_string << Ropenlayer::Openlayer::Js.new(@map.js_helper.insert_into_xhtml_element(@js_links_id, @map.js_helper.create_xhtml_element("a", link_config ))).to_js
|
49
|
+
links_string
|
50
|
+
end }
|
51
|
+
|
52
|
+
)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module Openlayer
|
3
|
+
module BoxControl
|
4
|
+
class EditMap < Base
|
5
|
+
def initialize(map)
|
6
|
+
super('edit_map', map, :css_class => 'olControlEditMapControl')
|
7
|
+
Ropenlayer::Openlayer::BoxControl::EditMap.controls.each do |control_name, control_options|
|
8
|
+
|
9
|
+
|
10
|
+
@links << { :id => "'link_to_edit_map_control_#{ control_name }'",
|
11
|
+
:class => "'olControlEditMapControlLink with_icon action_#{ control_name }'",
|
12
|
+
:text => "'#{ control_options[:description] }'",
|
13
|
+
:title => "'#{ control_options[:description] }'",
|
14
|
+
:onclick => %( #{ map.js_helper.update_xhtml_element(map.js_notification_area, "'#{ control_options[:help]}'") }; \
|
15
|
+
#{ map.js_helper.hide_xhtml_element(@js_links_id) }; \
|
16
|
+
#{ map.js_id }ActivateEditControl('#{ control_name }'); return false ) }
|
17
|
+
|
18
|
+
end
|
19
|
+
@links << { :id => "'link_to_edit_map_control_cancel'",
|
20
|
+
:class => "'olControlEditMapControlLink with_icon action_cancel'",
|
21
|
+
:text => "Cancelar",
|
22
|
+
:onclick => %( #{ map.js_id }ActivateEditControl('none'); #{ map.js_helper.hide_xhtml_element(@js_links_id) }; return false) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_js
|
26
|
+
%(
|
27
|
+
var #{ map.js_id }EditMapControls = {};
|
28
|
+
function #{ map.js_id }ActivateEditControl(selectedControl) {
|
29
|
+
for(key in #{ map.js_id }EditMapControls) {
|
30
|
+
var control = #{ map.js_id }EditMapControls[key];
|
31
|
+
if(selectedControl == key) {
|
32
|
+
control.activate();
|
33
|
+
} else {
|
34
|
+
control.deactivate();
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
#{ new_elements_layer = Ropenlayer::Openlayer::Layer::Base.new(:new_elements, @map)
|
39
|
+
new_elements_layer.to_js }
|
40
|
+
|
41
|
+
#{ Ropenlayer::Openlayer::BoxControl::EditMap.controls.inject('') do |edit_controls_js, control_array|
|
42
|
+
control_name = control_array.first
|
43
|
+
control_options = control_array.last
|
44
|
+
control_options[:args] = [ new_elements_layer.js_id, control_options[:args]].flatten
|
45
|
+
control_options[:propierties][:featureAdded] = map.options[:add_feature_callback] || 'false' # FIXME
|
46
|
+
|
47
|
+
edit_controls_js << %( #{ Ropenlayer::Openlayer::Js.new_var("#{ map.js_id }_#{ control_name }",
|
48
|
+
"#{ Ropenlayer::Openlayer::Js.new_method(control_options[:method], control_options) }").to_js }
|
49
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }.addControl(#{ map.js_id }_#{ control_name })").to_js }
|
50
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }EditMapControls['#{ control_name }'] = #{ map.js_id }_#{ control_name }").to_js }
|
51
|
+
)
|
52
|
+
edit_controls_js
|
53
|
+
end }
|
54
|
+
|
55
|
+
#{ super }
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
def self.controls
|
61
|
+
{ :add_point => {:method => "OpenLayers.Control.DrawFeature",
|
62
|
+
:args => [ "OpenLayers.Handler.Point" ],
|
63
|
+
:propierties => { },
|
64
|
+
:description => 'Crear un punto',
|
65
|
+
:help => 'Para crear un punto en el mapa, haga click en la posición deseada'
|
66
|
+
},
|
67
|
+
:add_line => { :method => "OpenLayers.Control.DrawFeature",
|
68
|
+
:args => [ "OpenLayers.Handler.Path" ],
|
69
|
+
:propierties => { },
|
70
|
+
:description => 'Crear una línea',
|
71
|
+
:help => 'Para crear un punto en el mapa, haga click en la posición deseada'
|
72
|
+
|
73
|
+
},
|
74
|
+
:add_polygon => { :method => "OpenLayers.Control.DrawFeature",
|
75
|
+
:args => [ "OpenLayers.Handler.Polygon" ],
|
76
|
+
:propierties => { },
|
77
|
+
:description => 'Crear un polígono',
|
78
|
+
:help => 'Para crear un punto en el mapa, haga click en la posición deseada'
|
79
|
+
}
|
80
|
+
}
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Ropenlayer
|
2
|
+
module Openlayer
|
3
|
+
module BoxControl
|
4
|
+
class LayersSelect < Base
|
5
|
+
def initialize(map)
|
6
|
+
super('layers_select', map, :css_class => 'olControlLayersBoxControl')
|
7
|
+
map.layers.uniq.each do |layer|
|
8
|
+
@links << { :id => "'link_to_base_layer_#{ layer.name }'",
|
9
|
+
:class => "'olControlLayersBoxControl'",
|
10
|
+
:text => " » Usar Mapa #{ layer.config[:description] }",
|
11
|
+
:onclick => "#{ map.js_id }.setBaseLayer(#{ layer.js_id }); #{ map.js_helper.hide_xhtml_element(@js_links_id ) }; return false;" }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|