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>