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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
# -*- coding: utf-8 -*-
#
# google_map.rb - embeded Google Map for tDiary, use Google Maps JavaScript API V3.
# https://developers.google.com/maps/documentation/javascript/tutorial
#
# Copyright (C) 2010, tamoot <tamoot+tdiary@gmail.com>
# You can redistribute it and/or modify it under GPL2.
#
def google_map(lat, lon, params = {})
params.merge!(:lat => lat, :lon => lon)
google_map_common(params)
end
def google_geomap(address, params = {})
params.merge!(:address => address)
google_map_common(params)
end
def google_map_common(params)
params[:id] ||= ''
params[:lat] ||= 0.0
params[:lon] ||= 0.0
params[:address] ||= nil
params[:zoom] ||= 10
params[:html] ||= nil
params[:title] ||= nil
params[:width] ||= 320
params[:height] ||= 240
params[:type] ||= :ROADMAP
params[:overview]||= false
if feed?
require 'cgi'
url = nil
if params[:lat].nonzero? && params[:lon].nonzero?
query = "#{params[:lat]},#{params[:lon]}"
url = %Q|https://maps.google.com/maps?q=#{CGI::escape(query)}|
elsif params[:address] != nil
query = params[:address]
url = %Q|https://maps.google.com/maps?q=#{CGI::escape(query)}|
end
return %Q|<a href="#{url}">#{url}</a>| if url
end
dom_id = "#{@gmap_date.strftime("%Y%m%d")}_#{@gmap_count}"
params.merge!(:id => dom_id)
@gmap_data << params
@gmap_count += 1
%Q|<div class="gmap" id="#{dom_id}" style="width : #{params[:width]}px; height : #{params[:height]}px;"></div>|
end
add_header_proc do
if /\A(?:latest|day|month|nyear|preview)\z/ =~ @mode
%Q|<script type="text/javascript" src="//maps.google.com/maps/api/js?key=#{@conf['google_map.key']}"></script>\n|
end
end
add_body_enter_proc do |date|
@gmap_data = []
@gmap_date = date
@gmap_count = 0
''
end
add_body_leave_proc do |date|
gmap_scripts = ''
if !feed? && @gmap_data.any?
gmap_scripts = %Q|<script type="text/javascript">\n<!--\n|
@gmap_data.each do |data|
if data[:address]
gmap_scripts << google_geomap_script(data)
else
gmap_scripts << google_map_script(data)
end
end
gmap_scripts << %Q|//-->\n</script>\n|
end
gmap_scripts
end
add_conf_proc('google_map', 'Google Maps', 'etc') do
if @mode == 'saveconf' then
@conf['google_map.key'], = @cgi.params['google_map.key']
end
<<-HTML
<h3 class="subtitle">Google Maps API Key</h3>
<p>API Key (see <a href="https://developers.google.com/maps/documentation/javascript/get-api-key">developers.google.com/maps</a>)</p>
<p><input name="google_map.key" value="#{h @conf['google_map.key']}" size="50"></p>
HTML
end
def google_map_script(hash)
str = ''
str << %Q|google.maps.event.addDomListener(window, 'load', function() {\n|
str << %Q| var mapdiv = document.getElementById("#{hash[:id]}");\n|
str << %Q| if(mapdiv){\n|
str << %Q| var myOptions = {\n|
str << %Q| zoom: #{hash[:zoom]},\n|
str << %Q| overviewMapControl: #{hash[:overview]},\n|
str << %Q| overviewMapControlOptions: {\n|
str << %Q| opened: #{hash[:overview]}\n|
str << %Q| },\n|
str << %Q| center: new google.maps.LatLng(#{hash[:lat]}, #{hash[:lon]}),\n|
str << %Q| mapTypeId: google.maps.MapTypeId.#{hash[:type]},\n|
str << %Q| scaleControl: true\n|
str << %Q| };\n|
str << %Q| var gMap = new google.maps.Map(mapdiv, myOptions);\n|
# set Marker
if hash[:title]
str << %Q| var marker = new google.maps.Marker({\n|
str << %Q| position: new google.maps.LatLng(#{hash[:lat]}, #{hash[:lon]}),\n|
str << %Q| map: gMap,\n|
str << %Q| title: '#{hash[:title]}'\n|
str << %Q| });\n|
# set InfoWindow
if hash[:html]
str << %Q| var infowindow = new google.maps.InfoWindow({\n|
str << %Q| content: '<span style="color: #000000;">#{hash[:html]}</span>',\n|
str << %Q| size: new google.maps.Size(350, 200)\n|
str << %Q| });\n|
str << %Q| infowindow.open(gMap, marker);\n|
end # :html
end # :title
str << %Q| };\n|
str << %Q|});\n|
str
end
def google_geomap_script(hash)
str = ''
str << %Q|google.maps.event.addDomListener(window, 'load', function() {\n|
str << %Q| var mapdiv = document.getElementById("#{hash[:id]}");\n|
str << %Q| if(mapdiv){\n|
str << %Q| var geocoder = new google.maps.Geocoder();\n|
str << %Q| if(geocoder) {\n|
str << %Q| geocoder.geocode( { 'address': '#{hash[:address]}'}, function(results, status) {\n|
str << %Q| if (status == google.maps.GeocoderStatus.OK) {\n|
str << %Q| var geoLat = results[0].geometry.location;\n|
str << %Q| var myOptions = {\n|
str << %Q| zoom: #{hash[:zoom]},\n|
str << %Q| overviewMapControl: #{hash[:overview]},\n|
str << %Q| overviewMapControlOptions: {\n|
str << %Q| opened: #{hash[:overview]}\n|
str << %Q| },\n|
str << %Q| center: geoLat,\n|
str << %Q| mapTypeId: google.maps.MapTypeId.#{hash[:type]},\n|
str << %Q| scaleControl: true\n|
str << %Q| };\n|
str << %Q| var gMap = new google.maps.Map(mapdiv, myOptions);\n|
# set Marker
if hash[:title]
str << %Q| var marker = new google.maps.Marker({\n|
str << %Q| position: geoLat,\n|
str << %Q| map: gMap,\n|
str << %Q| title: '#{hash[:title]}'\n|
str << %Q| });\n|
# set InfoWindow
if hash[:html]
str << %Q| var infowindow = new google.maps.InfoWindow({\n|
str << %Q| content: '<span style="color: #000000;">#{hash[:html]}</span>',\n|
str << %Q| size: new google.maps.Size(350, 200)\n|
str << %Q| });\n|
str << %Q| infowindow.open(gMap, marker);\n|
end # :html
end # :title
str << %Q| }else{\n|
str << %Q| alert("Geocode was not successful for the following reason: " + status)\n|
str << %Q| }\n|
str << %Q| });\n|
str << %Q| }\n|
str << %Q| }\n|
str << %Q|});\n|
str
end
# Local Variables:
# mode: ruby
# indent-tabs-mode: t
# tab-width: 3
# ruby-indent-level: 3
# End:
# vim: ts=3
|