Можно ли разделить группы точек по цвету на дисплее карт gmaps4rails Google?
У меня есть карта отображения адресов, которые используются для доставки. Каждый адрес находится на определенном маршруте доставки, поэтому было бы очень удобно, чтобы точки отображались разными цветами в зависимости от маршрута доставки.
Потенциально отображается несколько сотен адресов доставки, но обычно только несколько маршрутов доставки. Читая документацию, это возможно при использовании разных изображений, но, поскольку я не контролирую количество маршрутов, я бы предпочел установить динамическое изменение цвета существующего значка по умолчанию. Пока у меня есть следующее в моем контроллере:
@json = @company.addresses.where(:route_id => @premise.routes).to_gmaps4rails do |address, marker|
marker.title "#{address.route.name}"
# address route can be differentiated with address.route.id
end
Цель состоит в том, чтобы все адреса с определенным идентификатором маршрута были одного цвета.
2 ответа
Мой ответ довольно длинный, но, кажется, работает нормально. Я взял некоторый код из найденного мной поста, который может генерировать цвета, которые, вероятно, будут разными и удобочитаемыми.
Я назначаю разные буквы для каждого рынка на основе первой буквы названия маршрута. Затем назначается цвет, который является уникальным и последовательным для каждого маршрута. Это означает, что даже если два маршрута имеют одну и ту же первую букву, есть большая вероятность, что они будут иметь разные цвета.
Без сомнения, есть много рефакторинга!
def index
@premise = @company.premises.find(params[:premise]) if params[:premise]
#only generate the map info if a premise has been selected
if @premise.present?
@json = @company.addresses.approved.where(:route_id => @premise.routes).to_gmaps4rails do |address, marker|
marker.picture({
:picture => "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=#{address.route.name[0]}|#{random_colour_by_index(address.route.name)}|000000"
})
marker.title "#{address.route.name}"
end
end
end
private
def random_colour_by_index(index)
@colour ||= Hash.new
@colour[index] ||= array_rgb_to_hex(hsv_to_rgb(rand, 0.5, 0.95))
end
def array_rgb_to_hex(rgb)
rgb.inject("") { |hex, element| hex + single_rgb_to_hex(element) }
end
def single_rgb_to_hex(rgb)
hex = rgb.to_s(16)
rgb < 16 ? "0#{hex}" : hex
end
def hsv_to_rgb(h, s, v)
h_i = (h*6).to_i
f = h*6 - h_i
p = v * (1 - s)
q = v * (1 - f*s)
t = v * (1 - (1 - f) * s)
r, g, b = v, t, p if h_i==0
r, g, b = q, v, p if h_i==1
r, g, b = p, v, t if h_i==2
r, g, b = p, q, v if h_i==3
r, g, b = t, p, v if h_i==4
r, g, b = v, p, q if h_i==5
[(r*256).to_i, (g*256).to_i, (b*256).to_i]
end
Вы можете использовать RMagic http://www.imagemagick.org/RMagick/doc/ чтобы создать новое изображение маркера для каждого маршрута на лету и кэшировать его, используя карту с route.id в качестве индекса.