ropenlayer 0.0.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|