// mapping.jsの部分
const map = L.map('map').setView([39.0192, 139.7523], 11); //setview:開いたときに最初に表示される場所を指定する。
var osmTile = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
// location.jsの部分
let currentLocationMarker = null;
let geoErrorShown = false;
if (navigator.geolocation) {
const ask = confirm("現在地を取得しますか?");
if (ask) {
navigator.geolocation.watchPosition(
position => {
const lat = position.coords.latitude;
const lng = position.coords.longitude;
geoErrorShown = false;
if(!currentLocationMarker) {
currentLocationMarker = L.marker([lat, lng])
.addTo(map)
.bindPopup("現在地")
.openPopup();
map.setView([lat, lng], 16);
} else {
currentLocationMarker.setLatLng([lat, lng]);
}
},
error => {
if (!geoErrorShown) {
alert("現在地が取得できませんでした");
geoErrorShown = true;
}
},
{
enableHighAccuracy: false,
timeout: 10000,
maximumAge: 30000
}
);
}
} else {
alert("このブラウザでは現在地取得が使えません");
}
// OSRMルート表示用の変数
let routeLayer = null;
// 現在地からchten.csvの地点までのルートを引く関数
async function routeFromCurrentLocation(toLat, toLng) {
//現在地が未取得の場合
if (!currentLocationMarker) {
alert("先に現在地を取得してください");
return;
}
// 現在地の座標
const from = currentLocationMarker.getLatLng();
const fromLat = from.lat;
const fromLng = from.lng;
// OSRMのURL
const url = `https://router.project-osrm.org/route/v1/driving/${fromLng},${fromLat};${toLng},${toLat}?overview=full&geometries=geojson`;
// OSRMへアクセス
const response = await fetch(url);
const data = await response.json();
if (!data.routes || data.routes.length === 0) {
alert("ルートが見つかりません");
return;
}
// ルート座標(lng,lat → lat,lngに変換)
const routeCoords = data.routes[0].geometry.coordinates.map(c => [c[1], c[0]]);
// 距離(km)と時間(分)
const distance = (data.routes[0].distance / 1000).toFixed(2);
const duration = (data.routes[0].duration / 60).toFixed(1);
// 既存ルートを削除
if (routeLayer) {
map.removeLayer(routeLayer);
}
// ルート描画
routeLayer = L.polyline(routeCoords, {
weight: 5
}).addTo(map);
map.fitBounds(routeLayer.getBounds());
alert(`距離:${distance} km\n時間:約${duration}分`);
}
// fetch.jsの部分(追加部分あり)
// CSV読み込み
fetch('uMap1.csv') //「chiten.csv」をください、とブラウザがサーバーに取りに行く命令
.then(res => res.text()) //サーバーから返ってきたデータの"箱"の中身をテキストとして読み取る
.then(text => {
// fetchで読み込んだ直後のCSVは\nつきの1本の長い文字列なので行ごとに分ける
const lines = text.split('\n');
// 最初の行(i=0行目)はヘッダー(name,lat,lng)なのでスキップ
for (let i = 1; i < lines.length; i++) {
const line = lines[i].trim(); //i番目の行を取り出し、trim()で前後の空白を消す
if (line === "") continue; // もし空行だったら次の行へ(スキップ)
const [desc, name, lat, lng] = line.split(','); // カンマ(,)で分ける
const latNum = parseFloat(lat); // 緯度・経度を数値に変換
const lngNum = parseFloat(lng);
const layer = ["菓子類","その他食料品","その他食料品・飲料","タバコ類","衣類","化粧品・香水","病院","クリニック","調剤薬局","ドラッグストア"];
// マーカー(ピン)を追加
if (isNaN(latNum) || isNaN(lngNum)) continue; //緯度か経度のどちらかが「数値」でなければ、次のcsvの行に行く
//var ovlLayers = {};
var item = desc.split("\\n")[0];
var url1 = desc.match(/\[\[(.+)\]\]/g)[0];
var url = url1.substr(2, url1.indexOf(']]'));
marker = L.marker([latNum, lngNum], {
icon: L.divIcon({
//html: '<a class="marker">あ</a>',
className: 'marker1',
iconSize: [20, 20]
}),
}).addTo(map) //L.marker()で地図上にマーカーを立てるように指示 bindPopupはマーカーをクリックした時にふきだしを表示させる
.bindPopup(`
<b>${name}</b><br>${desc.replace(/\\n/g, '<br>').replace(/\[\[(.+)\]\]/g, `<a href=\"${url}\">${url}</a>`)}<br>
<button onclick = "routeFromCurrentLocation(${latNum}, ${lngNum})">現在地からの道のりを見る</button>
`); //これを押すことにより、現在地から地点までのルートを計算して表示
//ovlLayers[item] = {item : marker};
//console.log(ovlLayers);
}
});
//var baseLayers = {'OpenStreetMap': osmTile};
// マーカーを2つオーバーレイレイヤに指定
// ベースレイヤとオーバーレイレイヤをマップに追加
//L.control.layers(baseLayers, ovlLayers).addTo(map);