/
legend_image.rb
executable file
·69 lines (54 loc) · 1.84 KB
/
legend_image.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# encoding: utf-8
module ArcServer
module Util
class LegendImage
DEFAULT_LEGEND_WIDTH = 250
def initialize(map_server)
@map_server = map_server
end
def get_image
legend_image = Magick::Image.new(*determine_legend_size)
gc = Magick::Draw.new
gc.stroke_antialias(false)
gc.text_antialias = false
gc.density = "96x96"
y = 0
legend_info.each do |legend|
name = legend[:name]
gc.text(10, y+=30, name)
gc.draw(legend_image)
y -= 15
legend_classes = legend[:legend_groups][0][:legend_classes]
legend_classes.each do |legend_class|
img = Magick::Image.read_inline(legend_class[:symbol_image][:image_data]).first
legend_image.composite!(img, 20, y+=25, Magick::OverCompositeOp)
gc.text(50, y+14, legend_class[:label]) unless legend_class[:label].nil?
gc.draw(legend_image)
img.destroy!
end
y += 5
end
legend_image
end
private
def determine_legend_size
width = DEFAULT_LEGEND_WIDTH
height = legend_info.inject(0) do |h, legend|
legend_classes = legend[:legend_groups][0][:legend_classes]
# expand the legend width if labels are present
legend_classes.each do |legend_class|
if label = legend_class[:label]
label_width = label.length * 10
width = width > label_width ? width : label_width
end
end
h += (20 + (25 * legend_classes.length))
end
[width, height + 20]
end
def legend_info
@legend_info ||= @map_server.get_legend_info
end
end
end
end