- 公開されたオープンデータを利用するアプリを作成し、利活用するイメージ図です。
- Case.
- GoogleMap上に鯖江市内でWifiを使用できる場所をマッピング
サンプルコード:index.html
<!DOCTYPE html> <html> <head> <meta charset='utf-8'/>wifisabae <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script> <script src="js/wifisabae.js"></script> <link rel="stylesheet" href="css/style.css"> </head> <body></body> </html>
サンプルコード:style.css
@CHARSET "UTF-8"; #list { width: 300px; height: 500px; display: inline-block; outline: 1px gray solid; text-align: left; } #liblist { width: 100%; marin-top: 4px; border-top: 1px solid black; height: 500px; overflow-y: scroll; } #map { display: inline-block; width: 500px; height: 500px; }
サンプルコード:wifi_mapping.js
var map; onload = function() { map = new google.maps.Map($("map"), { center: new google.maps.LatLng( 36.208823, 138.251953), zoom: 5, }); $('liblist').markers = []; update(); makeHelp(); }; var update = function(pref) { clear('liblist'); selected(null); var opendataurl = "http://www3.city.sabae.fukui.jp/xml/wifi/wifi.xml"; xml2json(opendataurl, "ret"); }; var bksel; var selected = function(div) { if (bksel != null) bksel.className = ""; if (div != null) div.className = "selected"; bksel = div; }; var parseInt2 = function(n) { var n = parseInt(n); if (isNaN(n)) return "-"; return n; }; var ret = function(data) { var bounds = new google.maps.LatLngBounds(); var list = $('liblist'); for (var i = 0; i < list.markers.length; i++) list.markers[i].setMap(null); list.markers = []; data = data.dataroot.wifi; for (var i = 0; i < data.length; i++) { var d = data[i]; var div = create('div'); div.textContent = d.name; list.appendChild(div); div.data = d; var ll = new google.maps.LatLng( d.latitude, d.longitude); d.pos = ll; bounds.extend(ll); var marker = makeMarker(map, ll, d); list.markers[i] = marker; marker.data = d; div.marker = marker; google.maps.event.addListener( marker, "mouseover", function(e) { var divs = $('liblist').childNodes; for (var i = 0; i < divs.length; i++) { if (divs[i].data.no == this.data.no) { selected(divs[i]); $('liblist').scrollTop = divs[i].offsetTop - $('liblist').offsetTop; break; } } }); google.maps.event.addListener( marker, "click", function(e) { openInfo(this); }); div.onclick = function(e) { selected(e.srcElement); var d = this.data; map.setCenter(new google.maps.LatLng( d.latitude, d.longitude)); map.setZoom(17); openInfo(e.srcElement.marker); }; } map.fitBounds(bounds); }; makeMarker = function(map, pos, data) { var avail = data.name.indexOf('月予定') == -1; var opb = [ "W", "0000bb" ]; var opr = [ "W", "aaaaff" ]; var opy = [ "W", "bbbb00" ]; var opw = [ "W", "bbbbbb" ]; var opo = [ "W", "00bbbb" ]; var woman = parseInt2(data.woman); var man = parseInt2(data.man); var handicapped = parseInt2(data.handicapped); var babybed = parseInt2(data.babybed); var ostomate = parseInt2(data.ostomate); var op = avail ? opb : opr; var area = parseInt(data.area); new google.maps.Circle({ map: map, center: pos, fillColor: op[1], fillOpacity: .2, strokeWeight: 0, radius: area }); return new google.maps.Marker({ position: pos, map: map, draggable: false, icon: 'http://chart.apis.google.com/chart?' + 'chst=d_map_pin_letter&chld=' + op[0] + '|' + op[1] + '|FFFFFF' }); }; var xml2json = function(url, callback) { var host = "sabae.cc"; var base = "http://" + host + "/proxy/ITqT5WkhCf2yn1s9?cnv=xml2json"; var url2 = base + "&cache=no&callback=" + callback + "&url=" + encodeURI(url); jsonp(url2); }; var jsonp = function(url) { var head = document.getElementsByTagName("head")[0]; var script = document.createElement("script"); script.setAttribute("src", url); script.setAttribute("type", "text/javascript"); script.setAttribute("id", 'jsonp'); head.appendChild(script); }; if ($ == null) { var $ = function(id) { return document.getElementById(id); }; } var create = function(tag, id) { var res = document.createElement(tag); if (id != null) res.id = id; return res; }; var clear = function(id) { var div = typeof id == "string" ? $(id) : id; while (div.hasChildNodes()) { div.removeChild(div.lastChild); } div.scrollTop = 0; div.scrollLeft = 0; };