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,42 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
class Control
|
|
4
|
+
|
|
5
|
+
attr_reader :config
|
|
6
|
+
attr_reader :name
|
|
7
|
+
attr_reader :js_id
|
|
8
|
+
attr_reader :map
|
|
9
|
+
|
|
10
|
+
def self.build_collection(map)
|
|
11
|
+
map.control_names.inject([]) do |controls, control_name|
|
|
12
|
+
controls << new(control_name, map)
|
|
13
|
+
controls
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def initialize(name, map)
|
|
18
|
+
@name = name
|
|
19
|
+
@map = map
|
|
20
|
+
@js_id = "#{ map.js_id }_#{ name }"
|
|
21
|
+
@config = Ropenlayer::Openlayer::Control.configs[name]
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def to_js
|
|
25
|
+
%(// Adding #{ @name } control
|
|
26
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_id, "#{ Ropenlayer::Openlayer::Js.new_method(@config[:method], @config) }").to_js }
|
|
27
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }.addControl(#{ @js_id })").to_js }
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
def self.configs
|
|
33
|
+
{ :layers_switcher => { :method => "OpenLayers.Control.LayerSwitcher", :args => "" },
|
|
34
|
+
:mouse_position => { :method => "OpenLayers.Control.MousePosition", :args => "" },
|
|
35
|
+
:pan_panel => { :method => "OpenLayers.Control.PanPanel", :args => "" },
|
|
36
|
+
:navigation => { :method => "OpenLayers.Control.Navigation", :args => "" },
|
|
37
|
+
:zoom_panel => { :method => "OpenLayers.Control.ZoomPanel", :args => "" },
|
|
38
|
+
:scale_line => { :method => "OpenLayers.Control.ScaleLine", :args => "" }}
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
class Feature
|
|
4
|
+
|
|
5
|
+
DEFAULT_ICON_SIZE = [ 40, 34 ]
|
|
6
|
+
DEFAULT_ICON_URL = "/images/ropenlayer/default_marker.png"
|
|
7
|
+
|
|
8
|
+
attr_reader :map
|
|
9
|
+
|
|
10
|
+
def self.draw_collection(map_object)
|
|
11
|
+
features = map_object.draw_features
|
|
12
|
+
feature_objects = features.inject([]) do |objects, feature_data|
|
|
13
|
+
objects << new(map_object, feature_data)
|
|
14
|
+
objects
|
|
15
|
+
end
|
|
16
|
+
%( //Adding features
|
|
17
|
+
#{ feature_objects.map(&:to_js) } )
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def initialize(map, attributes)
|
|
21
|
+
@map = map
|
|
22
|
+
@id = attributes[:id] || raise("No defined id for feature #{ attributes.inspect }")
|
|
23
|
+
@js_id = "#{ @map.js_id }node#{ @id }"
|
|
24
|
+
@name = attributes[:name] || 'Another Feature'
|
|
25
|
+
@popup_content = attributes[:popup_content] || false
|
|
26
|
+
@geometry = attributes[:geometry] || raise("No defined geometry for feature #{ attributes.inspect }")
|
|
27
|
+
@longitude = attributes[:longitude] || raise("No defined longitude for feature #{ attributes.inspect }")
|
|
28
|
+
@latitude = attributes[:latitude] || raise("No defined latitude for feature #{ attributes.inspect }")
|
|
29
|
+
@icon_url = attributes[:icon_url]
|
|
30
|
+
@icon_size = attributes[:icon_size]
|
|
31
|
+
@color = attributes[:color]
|
|
32
|
+
@localizations = attributes[:localizations]
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def to_js
|
|
36
|
+
%( #{ build_main_geometry }
|
|
37
|
+
#{ build_vector_feature }
|
|
38
|
+
#{ build_main_icon }
|
|
39
|
+
#{ build_main_feature }
|
|
40
|
+
|
|
41
|
+
#{ build_marker_click_function if @popup_content }
|
|
42
|
+
|
|
43
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @map.markers_layer.js_id }.addMarker(#{ @js_id }MainMarker)").to_js }
|
|
44
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @map.vectors_layer.js_id }.addFeatures([#{ @js_id }VectorFeature, #{ @js_id }MainFeature])").to_js }
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
def build_main_geometry
|
|
53
|
+
case @geometry
|
|
54
|
+
when "POINT"
|
|
55
|
+
return Ropenlayer::Openlayer::Js.new_var("#{ @js_id }MainGeometry", Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.Point", :args => [ @longitude, @latitude ]).to_s).to_js
|
|
56
|
+
when "LINESTRING"
|
|
57
|
+
return %( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }LinearPoints", "[]").to_js }
|
|
58
|
+
#{ @localizations.inject('') do |points_in_line, localization|
|
|
59
|
+
point_in_line = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.Point", :args => [ localization[:longitude], localization[:latitude] ]).to_s
|
|
60
|
+
points_in_line << Ropenlayer::Openlayer::Js.new("#{ @js_id }LinearPoints.push(#{ point_in_line }) ").to_js
|
|
61
|
+
points_in_line
|
|
62
|
+
end }
|
|
63
|
+
#{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }MainGeometry", Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.LineString", :args => ["#{ @js_id }LinearPoints"]).to_s).to_js } )
|
|
64
|
+
when "POLYGON"
|
|
65
|
+
return %( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }LinearPoints", "[]").to_js }
|
|
66
|
+
#{ @localizations.inject('') do |points_in_line, localization|
|
|
67
|
+
point_in_line = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.Point", :args => [ localization[:longitude], localization[:latitude] ]).to_s
|
|
68
|
+
points_in_line << Ropenlayer::Openlayer::Js.new("#{ @js_id }LinearPoints.push(#{ point_in_line }) ").to_js
|
|
69
|
+
points_in_line
|
|
70
|
+
end }
|
|
71
|
+
#{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }LinearRing", Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.LinearRing", :args => ["#{ @js_id }LinearPoints"]).to_s).to_js }
|
|
72
|
+
#{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }MainGeometry", Ropenlayer::Openlayer::Js.new_method("OpenLayers.Geometry.Polygon", :args => ["#{ @js_id }LinearRing"]).to_s).to_js } )
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def build_vector_feature
|
|
77
|
+
vector_feature_method = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Feature.Vector", :args => [ "#{ @js_id }MainGeometry" ]).to_s
|
|
78
|
+
%( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }VectorFeature", vector_feature_method).to_js }
|
|
79
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @js_id }VectorFeature.attributes = { name: '#{ @name }', favColor: 'red', fillColor: '#{ @color }' }").to_js } )
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def build_main_icon
|
|
83
|
+
icon_size = (@icon_size and @icon_size.is_a?(Array)) ? @icon_size : DEFAULT_ICON_SIZE
|
|
84
|
+
icon_url = (@icon_url and @icon_url.is_a?(String)) ? @icon_url : DEFAULT_ICON_URL
|
|
85
|
+
|
|
86
|
+
size_method = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Size", :args => icon_size).to_s
|
|
87
|
+
offset_method = Ropenlayer::Openlayer::Js.new("function(size){ return new OpenLayers.Pixel(-(size.w/2), -(size.h/2)) }").to_s
|
|
88
|
+
|
|
89
|
+
icon_method = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Icon", :args => [ "'#{ icon_url }'", size_method, 'null', offset_method ]).to_s
|
|
90
|
+
%( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }Icon", icon_method).to_js } )
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def build_main_feature
|
|
94
|
+
main_feature_lonlat = Ropenlayer::Openlayer::Js.new_method("OpenLayers.LonLat", :args => [ @longitude, @latitude ]).to_s
|
|
95
|
+
main_feature_method = Ropenlayer::Openlayer::Js.new_method("OpenLayers.Feature", :args => [ @map.vectors_layer.js_id, main_feature_lonlat ]).to_s
|
|
96
|
+
%( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }MainFeature", main_feature_method).to_js }
|
|
97
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @js_id }MainFeature.data.icon = #{ @js_id }Icon").to_js }
|
|
98
|
+
#{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id }MainMarker", "#{ @js_id }MainFeature.createMarker()").to_js } )
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def build_marker_click_function
|
|
102
|
+
function_content = %(
|
|
103
|
+
if (this.popup == null) {
|
|
104
|
+
this.popup = this.createPopup(true);
|
|
105
|
+
this.popup.setBackgroundColor('#16b87d');
|
|
106
|
+
this.popup.setContentHTML('#{ @popup_content }');
|
|
107
|
+
#{ @map.js_id }.addPopup(this.popup);
|
|
108
|
+
this.popup.show();
|
|
109
|
+
} else {
|
|
110
|
+
this.popup.toggle();
|
|
111
|
+
}
|
|
112
|
+
OpenLayers.Event.stop(evt);
|
|
113
|
+
)
|
|
114
|
+
%( #{ Ropenlayer::Openlayer::Js.new_var("#{ @js_id}MarkerClickFunction", "function(event) {#{ function_content }}").to_js }
|
|
115
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @js_id }MainMarker.events.register('mousedown', #{ @js_id }MainFeature, #{ @js_id}MarkerClickFunction)").to_js } )
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
class Js
|
|
4
|
+
|
|
5
|
+
attr_accessor :body
|
|
6
|
+
|
|
7
|
+
# == Ropenlayer::Openlayer::Js
|
|
8
|
+
#
|
|
9
|
+
# Just a simple JS constructor for objects methods calls and variable setting
|
|
10
|
+
def initialize(initialize_string = '')
|
|
11
|
+
@body = initialize_string
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# create a new js method
|
|
15
|
+
#
|
|
16
|
+
# Ropenlayer::Openlayer::Js.new_method("Element.create", "div", { :class => 'eyecandy', :id => 'my_id'}).to_s
|
|
17
|
+
# #=> new Element.create("div", { "class":"eyecandy","id":"my_id"});
|
|
18
|
+
#
|
|
19
|
+
def self.new_method(method, options = {})
|
|
20
|
+
js_object = new
|
|
21
|
+
args = options[:args] || []
|
|
22
|
+
propierties = options[:propierties] || {}
|
|
23
|
+
|
|
24
|
+
js_object.body = "new #{ method }("
|
|
25
|
+
js_object.body << "#{ args.join(', ') }" if args.any?
|
|
26
|
+
|
|
27
|
+
if propierties.keys.any?
|
|
28
|
+
|
|
29
|
+
js_object.body << ", " if args.any?
|
|
30
|
+
|
|
31
|
+
js_object.body << propierties.keys.inject("{") do |propierties_string, propierty|
|
|
32
|
+
propierties_string << "'#{ propierty }': #{ propierties[propierty] }"
|
|
33
|
+
propierties_string << ", " unless propierties.keys.last == propierty
|
|
34
|
+
propierties_string
|
|
35
|
+
end
|
|
36
|
+
js_object.body << "}"
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
js_object.body << ")"
|
|
40
|
+
js_object
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# create a new js global variable:
|
|
44
|
+
#
|
|
45
|
+
# Ropenlayer::Js.new_var("test", "1").to_s
|
|
46
|
+
# #=> var test = "1"
|
|
47
|
+
#
|
|
48
|
+
def self.new_var(name, value)
|
|
49
|
+
new("var #{ name } = #{ value }")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def to_s
|
|
54
|
+
@body
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def to_js
|
|
58
|
+
"#{ @body };"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
module Layer
|
|
4
|
+
class Base
|
|
5
|
+
|
|
6
|
+
attr_reader :config
|
|
7
|
+
attr_reader :name
|
|
8
|
+
attr_reader :js_id
|
|
9
|
+
attr_reader :map
|
|
10
|
+
|
|
11
|
+
def self.build_collection(map)
|
|
12
|
+
map.layer_names.uniq.inject([]) do |layers, layer_name|
|
|
13
|
+
layers << new(layer_name, map)
|
|
14
|
+
layers
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def initialize(name, map)
|
|
19
|
+
@name = name
|
|
20
|
+
@map = map
|
|
21
|
+
@js_id = "#{ map.js_id }_#{ name }"
|
|
22
|
+
@config = self.class.layers_config[name]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_js
|
|
26
|
+
%( // Adding #{ @name } layer
|
|
27
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_id, "#{ Ropenlayer::Openlayer::Js.new_method(@config[:method], @config) }").to_js }
|
|
28
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ map.js_id }.addLayer(#{ @js_id })").to_js } )
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
# return a hash with config options for Ropenlayer layers.
|
|
33
|
+
# U can override this method as ur wish to get config from other places, for example, AR.
|
|
34
|
+
def self.layers_config
|
|
35
|
+
{ :osm => { :method => "OpenLayers.Layer.OSM",
|
|
36
|
+
:args => [ "'Usar Mapa OSM'" ],
|
|
37
|
+
:propierties => { },
|
|
38
|
+
:description => 'Mapa Libre OSM' },
|
|
39
|
+
|
|
40
|
+
:wms => { :method => "OpenLayers.Layer.WMS",
|
|
41
|
+
:args => [ "'OpenLayers WMS'", "'http://vmap0.tiles.osgeo.org/wms/vmap0'" ],
|
|
42
|
+
:propierties => { :layers => "'basic'" },
|
|
43
|
+
:description => 'Mapa Libre WMS'},
|
|
44
|
+
|
|
45
|
+
:wms => { :method => "OpenLayers.Layer.WMS",
|
|
46
|
+
:args => [ "'OpenLayers WMS'", "'http://vmap0.tiles.osgeo.org/wms/vmap0'" ],
|
|
47
|
+
:propierties => { :layers => "'basic'" },
|
|
48
|
+
:description => 'Mapa Libre WMS' },
|
|
49
|
+
|
|
50
|
+
:google_streets => { :method => "OpenLayers.Layer.Google",
|
|
51
|
+
:args => [ "'Google Streets'" ],
|
|
52
|
+
:propierties => { :numZoomLevels => "20" },
|
|
53
|
+
:description => 'Mapa StreetsGoogle' },
|
|
54
|
+
|
|
55
|
+
:google_satellite => { :method => "OpenLayers.Layer.Google",
|
|
56
|
+
:args => [ "'Google Satellite'" ],
|
|
57
|
+
:propierties => { :type => "google.maps.MapTypeId.SATELLITE", :numZoomLevels => "22" },
|
|
58
|
+
:description => 'Mapa Satélite de Google' },
|
|
59
|
+
|
|
60
|
+
:google_physical => { :method => "OpenLayers.Layer.Google",
|
|
61
|
+
:args => [ "'Google Physical'" ],
|
|
62
|
+
:propierties => { :type => "google.maps.MapTypeId.TERRAIN" },
|
|
63
|
+
:description => 'Mapa Físico de Google' },
|
|
64
|
+
|
|
65
|
+
:google_hybrid => { :method => "OpenLayers.Layer.Google",
|
|
66
|
+
:args => [ "'Google Hybrid'" ],
|
|
67
|
+
:propierties => { :type => "google.maps.MapTypeId.HYBRID", :numZoomLevels => "22" },
|
|
68
|
+
:description => 'Mapa Híbrido de Google' },
|
|
69
|
+
|
|
70
|
+
:yahoo => { :method => "OpenLayers.Layer.Yahoo",
|
|
71
|
+
:args => [ ],
|
|
72
|
+
:propierties => { },
|
|
73
|
+
:description => 'Mapa Yahoo' },
|
|
74
|
+
:new_elements => { :method => "OpenLayers.Layer.Vector",
|
|
75
|
+
:args => [ "'Vector Layer for create elements'" ],
|
|
76
|
+
:propierties => { },
|
|
77
|
+
:description => 'New Vectors Layer' },
|
|
78
|
+
|
|
79
|
+
:vector_elements => { :method => "OpenLayers.Layer.Vector",
|
|
80
|
+
:args => [ "'Capa de Marcadores''" ],
|
|
81
|
+
:propierties => { },
|
|
82
|
+
:description => 'Capa para marcadores de elements' }
|
|
83
|
+
}
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
module Layer
|
|
4
|
+
class ElementsMarker < Base
|
|
5
|
+
|
|
6
|
+
def initialize(map)
|
|
7
|
+
super(:marker_elements, map)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
def self.layers_config
|
|
12
|
+
{ :marker_elements => { :method => "OpenLayers.Layer.Markers",
|
|
13
|
+
:args => [ "'Capa de Marcadores'" ],
|
|
14
|
+
:propierties => { },
|
|
15
|
+
:description => 'Capa para marcadores de elements' } }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
module Layer
|
|
4
|
+
class ElementsVector < Base
|
|
5
|
+
|
|
6
|
+
def initialize(map)
|
|
7
|
+
super(:vector_elements, map)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
private
|
|
11
|
+
def self.layers_config
|
|
12
|
+
{ :vector_elements => { :method => "OpenLayers.Layer.Vector",
|
|
13
|
+
:args => [ "'Capa de Elementos'" ],
|
|
14
|
+
:propierties => { :styleMap => "#{ Ropenlayer::Openlayer::Js.new_method("OpenLayers.StyleMap", :propierties => { :default => default_vector_style_parameters.to_json }) }" },
|
|
15
|
+
:description => 'Capa para marcadores de elements' } }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def self.default_vector_style_parameters
|
|
19
|
+
{ :cursor => 'normal',
|
|
20
|
+
:graphicWidth => 48,
|
|
21
|
+
:graphicHeight => 48,
|
|
22
|
+
:strokeColor => '${fillColor}',
|
|
23
|
+
:strokeOpacity => 0.8,
|
|
24
|
+
:strokeWidth => 5,
|
|
25
|
+
:fillColor => '${fillColor}',
|
|
26
|
+
:fillOpacity => 0.8,
|
|
27
|
+
:pointRadius => 30,
|
|
28
|
+
:pointerEvents => 'visiblePainted',
|
|
29
|
+
:fontSize => '12px',
|
|
30
|
+
:fontWeight => 'bold' }
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
module Ropenlayer
|
|
2
|
+
module Openlayer
|
|
3
|
+
class Map
|
|
4
|
+
|
|
5
|
+
attr_reader :js_id
|
|
6
|
+
attr_reader :div_id
|
|
7
|
+
attr_reader :js_propierties
|
|
8
|
+
attr_reader :options
|
|
9
|
+
|
|
10
|
+
attr_reader :layer_names
|
|
11
|
+
attr_reader :layers
|
|
12
|
+
|
|
13
|
+
attr_reader :js_helper
|
|
14
|
+
|
|
15
|
+
attr_accessor :layers_select
|
|
16
|
+
|
|
17
|
+
attr_accessor :control_names
|
|
18
|
+
attr_accessor :controls
|
|
19
|
+
|
|
20
|
+
attr_accessor :markers_layer
|
|
21
|
+
attr_accessor :vectors_layer
|
|
22
|
+
attr_accessor :js_notification_area
|
|
23
|
+
|
|
24
|
+
attr_accessor :form_localizations_fields
|
|
25
|
+
|
|
26
|
+
attr_accessor :draw_features
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# used to scope js variables created with the map. Js name will be created with this prefix + plus dom_id argument
|
|
30
|
+
MAP_JS_PREFIX = 'olObject'
|
|
31
|
+
DEFAULT_ADD_FEATURE_CALLBACK = 'addFeatureToMap'
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# == Initialize
|
|
35
|
+
#
|
|
36
|
+
# Create a map object with parsed attributes. Ropenlayer manage two ids for each map.
|
|
37
|
+
# - js_div, use to scope all the variables names to draw js output.
|
|
38
|
+
# - div_id, the dom_id passed as argument to construtor. For example
|
|
39
|
+
#
|
|
40
|
+
# For example
|
|
41
|
+
#
|
|
42
|
+
# m = Ropenlayer::Openlayer::Map.new('group_map')
|
|
43
|
+
# => <Ropenlayer::Openlayer::Map:0xf7344fe8>
|
|
44
|
+
# m.js_id
|
|
45
|
+
# => "olObject_group_map"
|
|
46
|
+
# n.div_id
|
|
47
|
+
# => "group_map"
|
|
48
|
+
#
|
|
49
|
+
# To draw map, just call to_js method. For example, in a rails 3.x application
|
|
50
|
+
#
|
|
51
|
+
# <%= raw javascript_tag(Ropenlayer::Openlayer::Map.new('group_map').to_js) %>
|
|
52
|
+
#
|
|
53
|
+
# Ropenlayer::Openlayer::Map use this options
|
|
54
|
+
#
|
|
55
|
+
# - layers: Select which layers are used in map. For a list of available layers see <tt>Ropenlayer::Openlayer::Laye::Baser</tt>
|
|
56
|
+
# - default_layer: Default layer at render. Default layers.first
|
|
57
|
+
# - layer_select: If true, map will render a control for change between differents layers
|
|
58
|
+
# - controls: Select which controls are used in map. For a list of available controlse see <tt>Ropenlayer::Openlayer::Control</tt>
|
|
59
|
+
# - latitude: Specify default latitude for map. Map will be pointed at this latitude at render.
|
|
60
|
+
# - longitude: Specify default longitude for map. Map will be pointed at this longitude at render.
|
|
61
|
+
# - zoom: Specify default zoom for map. Map will be render with this zoom enable.
|
|
62
|
+
# - edit_map: If true, map will display a custom control what enable edit capabilities with map
|
|
63
|
+
#
|
|
64
|
+
# Map object accepts other options scoped in :map_js_options key.
|
|
65
|
+
#
|
|
66
|
+
# - theme: CSS theme used to display. By default none is used
|
|
67
|
+
# - projection: Specify projection. Argument must be a valid OpenLayers.Projection JS object. See more on
|
|
68
|
+
# - units: Units for measure. By default: "'m'"
|
|
69
|
+
# - maxResolution: maxResolution of the map, by default word length: "156543.0339"
|
|
70
|
+
# - meaxExtentd: Bound for projection. Must be valid OpenLayers.Bounds object. By default world length bound. See for more info.
|
|
71
|
+
#
|
|
72
|
+
# After display objects, you can, ofc, call methods from openlayers api to instace js variable. For example
|
|
73
|
+
#
|
|
74
|
+
# <% map = Ropenlayer::Openlayer::Map.new('group_map') %>
|
|
75
|
+
# <%= raw javascript_tag map.to_js %>
|
|
76
|
+
# <%= raw javascript_tag "#{ map.js_id }.setCenter(new OpenLayers.LonLat(0,0), 10);" %>
|
|
77
|
+
#
|
|
78
|
+
# Will call the setCenter OpenLayer.Map JS method to map.js_id js instace object
|
|
79
|
+
#
|
|
80
|
+
def initialize(dom_id, options = {})
|
|
81
|
+
@js_id = "#{ MAP_JS_PREFIX }_#{ dom_id }"
|
|
82
|
+
@div_id = "#{ dom_id }"
|
|
83
|
+
|
|
84
|
+
options[:add_feature_callback] ||= DEFAULT_ADD_FEATURE_CALLBACK
|
|
85
|
+
@options = options
|
|
86
|
+
|
|
87
|
+
@js_propierties = map_js_propierties(options[:map_js_options])
|
|
88
|
+
|
|
89
|
+
@layer_names = @options[:layers] || self.class.default_layers
|
|
90
|
+
if options[:default_layer]
|
|
91
|
+
def_layer = @layer_names.delete(options[:default_layer])
|
|
92
|
+
@layer_names = @layer_names.push(def_layer).reverse if def_layer
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
@layers = Ropenlayer::Openlayer::Layer::Base.build_collection(self)
|
|
96
|
+
|
|
97
|
+
@control_names = @options[:controls] || self.class.default_controls
|
|
98
|
+
@controls = Ropenlayer::Openlayer::Control.build_collection(self)
|
|
99
|
+
|
|
100
|
+
@latitude = @options[:latitude] || self.class.default_latitude
|
|
101
|
+
@longitude = @options[:longitude] || self.class.default_longitude
|
|
102
|
+
@zoom = @options[:zoom] || self.class.default_zoom
|
|
103
|
+
|
|
104
|
+
@layers_select = @options[:layer_select].nil? or @options[:layer_select]
|
|
105
|
+
@edit_map = @options[:edit_map]
|
|
106
|
+
|
|
107
|
+
@markers_layer = Ropenlayer::Openlayer::Layer::ElementsMarker.new(self)
|
|
108
|
+
@vectors_layer = Ropenlayer::Openlayer::Layer::ElementsVector.new(self)
|
|
109
|
+
|
|
110
|
+
@draw_features = options[:draw_features] || []
|
|
111
|
+
|
|
112
|
+
@js_notification_area = "#{ @js_id }_notification_area"
|
|
113
|
+
@form_localizations_fields = {}
|
|
114
|
+
|
|
115
|
+
@js_helper = Ropenlayer.js_helper
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def map_js_propierties(map_js_options = {})
|
|
119
|
+
map_js_options ||= {}
|
|
120
|
+
propierties = {}
|
|
121
|
+
|
|
122
|
+
propierties[:div] = "'#{ div_id }'"
|
|
123
|
+
propierties[:controls] = "[]"
|
|
124
|
+
|
|
125
|
+
propierties[:theme] = map_js_options[:theme] || "'/stylesheets/ropenlayer.css'"
|
|
126
|
+
propierties[:projection] = map_js_options[:projection] || "#{ Ropenlayer::Openlayer::Js.new_method("OpenLayers.Projection", :args => ["'EPSG:900913'"]) }"
|
|
127
|
+
propierties[:units] = map_js_options[:units] || "'m'"
|
|
128
|
+
propierties[:maxResolution] = map_js_options[:units] || "156543.0339"
|
|
129
|
+
propierties[:maxExtent] = map_js_options[:maxExtent] || "#{ Ropenlayer::Openlayer::Js.new_method("OpenLayers.Bounds", :args => ["-20037508", "-20037508", "20037508", "20037508.34"]) }"
|
|
130
|
+
propierties
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def set_center
|
|
135
|
+
%(// Setting center
|
|
136
|
+
#{ Ropenlayer::Openlayer::Js.new("#{ @js_id }.setCenter(#{ Ropenlayer::Openlayer::Js.new_method("OpenLayers.LonLat", :args => [ @longitude, @latitude ]) }, #{ @zoom })").to_js } )
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def add_notification_area
|
|
140
|
+
%(// Notification area
|
|
141
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_notification_area, Ropenlayer::Openlayer::Js.new(@js_helper.create_xhtml_element('div', { :class => "'olMapNotificationArea'",
|
|
142
|
+
:style => "'display: none;'",
|
|
143
|
+
:id => "'#{ @js_notification_area }'" })).to_js) }
|
|
144
|
+
)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def self.default_layers
|
|
149
|
+
[ :google_hybrid, :google_streets, :wms, :google_satellite, :google_physical, :osm ]
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def self.default_latitude
|
|
153
|
+
4580313.35287
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def self.default_longitude
|
|
157
|
+
263274.20626803
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def self.default_zoom
|
|
161
|
+
4
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def self.default_controls
|
|
165
|
+
[ :scale_line, :mouse_position, :pan_panel, :navigation, :zoom_panel ]
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Map to JS OpenLayer construtor
|
|
169
|
+
def to_js
|
|
170
|
+
%( // Ropenlayer::Openlayer::Map.to_s OpenLayers Cartographic JS project licensed under BSD~style license. More information can be found at http://openlayers.org/
|
|
171
|
+
#{ Ropenlayer::Openlayer::Js.new_var(@js_id, Ropenlayer::Openlayer::Js.new_method("OpenLayers.Map", :propierties => @js_propierties)).to_js }
|
|
172
|
+
|
|
173
|
+
#{ add_notification_area }
|
|
174
|
+
|
|
175
|
+
#{ @layers.map(&:to_js) }
|
|
176
|
+
#{ @controls.map(&:to_js) }
|
|
177
|
+
|
|
178
|
+
#{ set_center }
|
|
179
|
+
|
|
180
|
+
#{ Ropenlayer::Openlayer::BoxControl::LayersSelect.new(self).to_js if @layers_select }
|
|
181
|
+
#{ Ropenlayer::Openlayer::BoxControl::EditMap.new(self).to_js if @edit_map }
|
|
182
|
+
|
|
183
|
+
#{ @vectors_layer.to_js }
|
|
184
|
+
#{ @markers_layer.to_js }
|
|
185
|
+
|
|
186
|
+
#{ Ropenlayer::Openlayer::Feature.draw_collection(self) if @draw_features.any? }
|
|
187
|
+
)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
data/lib/ropenlayer.rb
CHANGED
|
@@ -1,17 +1,62 @@
|
|
|
1
|
-
$:.unshift(File.dirname(__FILE__)) unless
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
require '
|
|
5
|
-
require '
|
|
6
|
-
require '
|
|
7
|
-
require 'ropenlayer/js'
|
|
8
|
-
require 'ropenlayer/box_control/base'
|
|
9
|
-
require 'ropenlayer/box_control/edit_map'
|
|
10
|
-
require 'ropenlayer/box_control/layers_select'
|
|
11
|
-
require 'ropenlayer/layer/base'
|
|
12
|
-
require 'ropenlayer/layer/elements_marker'
|
|
13
|
-
require 'ropenlayer/layer/elements_vector'
|
|
1
|
+
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
|
2
|
+
|
|
3
|
+
# Rubygems and Rails Stuff
|
|
4
|
+
require 'rubygems'
|
|
5
|
+
require 'rails'
|
|
6
|
+
require 'active_record'
|
|
14
7
|
|
|
15
8
|
module Ropenlayer
|
|
16
|
-
|
|
9
|
+
|
|
10
|
+
VERSION = '0.3.0'
|
|
11
|
+
|
|
12
|
+
autoload :Node, 'ropenlayer/node'
|
|
13
|
+
autoload :Localization, 'ropenlayer/localization'
|
|
14
|
+
autoload :ActsAs, 'ropenlayer/acts_as'
|
|
15
|
+
autoload :FormBuilder, 'ropenlayer/form_builder'
|
|
16
|
+
|
|
17
|
+
module ActsAs
|
|
18
|
+
autoload :Mapper, 'ropenlayer/acts_as/mapper'
|
|
19
|
+
autoload :Nodeable, 'ropenlayer/acts_as/nodeable'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
module JsHelper
|
|
23
|
+
autoload :Jquery, 'ropenlayer/js_helper/jquery'
|
|
24
|
+
autoload :Prototype, 'ropenlayer/js_helper/prototype'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module Openlayer
|
|
28
|
+
autoload :Js, 'ropenlayer/openlayer/js'
|
|
29
|
+
autoload :Map, 'ropenlayer/openlayer/map'
|
|
30
|
+
autoload :Control, 'ropenlayer/openlayer/control'
|
|
31
|
+
autoload :Feature, 'ropenlayer/openlayer/feature'
|
|
32
|
+
|
|
33
|
+
module BoxControl
|
|
34
|
+
autoload :Base, 'ropenlayer/openlayer/box_control/base'
|
|
35
|
+
autoload :EditMap, 'ropenlayer/openlayer/box_control/edit_map'
|
|
36
|
+
autoload :LayersSelect, 'ropenlayer/openlayer/box_control/layers_select'
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
module Layer
|
|
40
|
+
autoload :Base, 'ropenlayer/openlayer/layer/base'
|
|
41
|
+
autoload :ElementsMarker, 'ropenlayer/openlayer/layer/elements_marker'
|
|
42
|
+
autoload :ElementsVector, 'ropenlayer/openlayer/layer/elements_vector'
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
mattr_accessor :js_helper
|
|
48
|
+
@@js_helper = Ropenlayer::JsHelper::Jquery
|
|
49
|
+
|
|
50
|
+
def self.setup
|
|
51
|
+
yield self
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Railtie < Rails::Railtie
|
|
55
|
+
initializer 'ropenlayer.initialize' do
|
|
56
|
+
ActiveRecord::Base.extend Ropenlayer::ActsAs
|
|
57
|
+
ActiveSupport.on_load(:action_view) do
|
|
58
|
+
ActionView::Helpers::FormBuilder.send :include, Ropenlayer::FormBuilder
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
17
62
|
end
|
data/ropenlayer.gemspec
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'lib', 'ropenlayer')
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
s.
|
|
4
|
+
|
|
5
|
+
# define gem
|
|
6
|
+
s.name = "ropenlayer"
|
|
7
|
+
s.version = Ropenlayer::VERSION
|
|
8
|
+
s.summary = "Ropenlayer is a wrapper constructor for openlayer javascript library written in ruby. It aims to provide an easy way to build maps and display it on webs."
|
|
7
9
|
s.description = "Ropenlayer is a wrapper constructor for openlayer javascript library written in ruby. It aims to provide an easy way to build maps and display it on webs."
|
|
8
|
-
s.authors
|
|
9
|
-
s.email
|
|
10
|
-
s.homepage
|
|
11
|
-
s.files
|
|
10
|
+
s.authors = ['Gnoxys' ]
|
|
11
|
+
s.email = ['development@gnoxys.net']
|
|
12
|
+
s.homepage = 'http://gitorious.org/gnoxys/ropenlayer'
|
|
13
|
+
s.files = `git ls-files`.split("\n")
|
|
12
14
|
|
|
15
|
+
# dependencies
|
|
13
16
|
s.add_runtime_dependency('json_pure', '~> 1.2.3')
|
|
17
|
+
s.add_runtime_dependency('rails', '~> 3.0.3')
|
|
14
18
|
s.add_development_dependency('rspec', '~> 2.3.0')
|
|
15
|
-
|
|
16
19
|
if RUBY_VERSION < '1.9'
|
|
17
20
|
s.add_development_dependency('ruby-debug', '~> 0.10.3')
|
|
18
21
|
end
|