Leaflet Quick Start Guide: PHP で出力された GeoJSON の利用
データベース MySQL に保管されているデータを PHP スクリプトで GeoJSON 形式で出力し, それを地図上にプロットすることを考える.
前提: PHP
PHP スクリプトからデータベースにアクセスし,GeoJSON が出力されるようにする. なお,hostname として自分のホスト名を指定すること.
jquery を利用したプロット方法
head 内で jquery を読み込む
<script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>
script 内で以下のように書く.
$.getJSON( "http://10.164.5.205/~sugiyama/get_geojson.php?hostname=sugiyama", function (data) { L.geoJson(data, { pointToLayer: function (feature, latlng) { if (feature.properties.temp >= 30) { return L.circle(latlng,50, {color: 'red'}) } if (feature.properties.temp < 30) { return L.circle(latlng,50, {color: 'blue'}) } } }).addTo(mymap); })
まとめ
以下のような HTML を作成すると,松江高専付近の地図に 温度に応じた色違いのサークルが表示されるはずである (高専内からのみアクセス可). <URL:leaflet-samples/> の leaflet-04.html をダウンロードして用いてみよ. なお,サークルをクリックしたときに時刻や温度を表示し,さらに右下に凡例を入れている.
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="robots" content="noindex" /> <title>Leafletチュートリアル</title> <!-- Leaflet's CSS --> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.4.0/dist/leaflet.css" integrity="sha512-puBpdR0798OZvTTbP4A8Ix/l+A4dHDD0DGqYW6RQ+9jxkRFclaxxQb/SJAWZfWAkuyeQUytO7+7N4QKrDh+drA==" crossorigin=""/> <!-- Leaflet JavaScript file --> <script src="https://unpkg.com/leaflet@1.4.0/dist/leaflet.js" integrity="sha512-QVftwZFqvtRNi0ZyCtsznlKSWOStnDORoefr1enyq5mVL4tmKB3S/EnC3rRJcxCPavG10IcrVGSmPh6Qw5lwrg==" crossorigin=""></script> <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script> <style> .legend { padding: 6px 8px; font: 14px/16px Arial, Helvetica, sans-serif; background: white; background: rgba(255,255,255,0.8); box-shadow: 0 0 15px rgba(0,0,0,0.2); border-radius: 5px; line-height: 17px; color: #555; } .legend i { width: 17px; height: 17px; float: left; margin-right: 8px; } #mapid { height: 600px; } </style> </head> <body> <div id="mapid"></div> <script> var mymap = L.map('mapid').setView([35.495897, 133.025808], 14); // データソースは国土地理院 L.tileLayer( 'https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { attribution: '© <a href="https://maps.gsi.go.jp/development/ichiran.html" target="_blank">地理院タイル</a>' }).addTo(mymap); // $.getJSON( "sample.geojson", function (data) { $.getJSON( "http://10.164.5.205/~sugiyama/get_geojson.php?hostname=sugiyama", function (data) { var point = L.geoJson(data, { pointToLayer: function (feature, latlng) { if (feature.properties.temp >= 35) { return L.circle(latlng,50, {color: '#800026'}) } else if (feature.properties.temp > 30) { return L.circle(latlng,50, {color: '#BD0026'}) } else if (feature.properties.temp > 25) { return L.circle(latlng,50, {color: '#E31A1C'}) } else if (feature.properties.temp > 20) { return L.circle(latlng,50, {color: '#FC4E2A'}) } else if (feature.properties.temp > 15) { return L.circle(latlng,50, {color: '#FD8D3C'}) } else if (feature.properties.temp > 10) { return L.circle(latlng,50, {color: '#FEB24C'}) } else if (feature.properties.temp > 5) { return L.circle(latlng,50, {color: '#FED976'}) } else { return L.circle(latlng,50, {color: '#FFEDA0'}) } }, onEachFeature: function (feature, layer) { layer.bindPopup(feature.properties.time + ":" + feature.properties.temp+ "℃"); } }) point.addTo(mymap); }) function getValue1(x) { return x >= 35 ? "#800026" : x >= 30 ? "#BD0026" : x >= 25 ? "#E31A1C" : x >= 20 ? "#FC4E2A" : x >= 15 ? "#FD8D3C" : x >= 10 ? "#FEB24C" : x >= 5 ? "#FED976" : "#FFEDA0"; } var legend = L.control({position: 'bottomright'}); legend.onAdd = function(map) { var div = L.DomUtil.create('div', 'legend'); var grades1 = [0, 5, 10, 15, 20, 25, 30, 35]; div.innerHTML += '気温 <br>'; div.innerHTML += '<i style="background:' + getValue1(grades1[7]) + '"></i> ' + '≧' + grades1[7] + '<br>' for (var i = 0; i < grades1.length-1; i++) { div.innerHTML += '<i style="background:' + getValue1(grades1[6-i]) + '"></i> ' + grades1[6-i] + '–' + grades1[6-i + 1] + '<br>'; } return div; }; legend.addTo(mymap); </script> </body> </html>