晴歩雨描

晴れた日は外に出て歩き、雨の日は部屋で絵を描く

Leaflet地図:「新潟酒蔵マップ」作成。CSVファイルから。サンプルソース。

地図データを扱うJavaScript ライブラリ「Leaflet」を使って、地図表示を試してきた。

今回、「新潟酒蔵マップ」を作成した。

「LinkData」のデータを使わせてもらった。

「LinkData」のデータをCSVファイルにして、CSVファイルを読み込む方式にした。

→→→ https://ok2nd.github.io/leaflet/csv-niigata_sake.html

f:id:art2nd:20210616143304j:plain

マーカーをクリックすると、代表銘柄などが表示される。

f:id:art2nd:20210616143307j:plain

【プログラムソース一部抜粋】

function csv2map(csv) {
	var place = Array();
	line = csv.split("\n");
	for (var i=0; i<line.length; ++i) {
		data = line[i].split(',');
		if (data.length > 2) {
			var memo = '<b>代表銘柄:' + data[5] + '</b><br>' + data[10];
			place.push([data[0], data[1], data[2], data[4], memo]);
		}
	}
	place2map(place, false, true);	// place[0] = ['地名', 緯度, 経度, URL, 補足メモ]; 3番目引数true: URL有り
}
function place2map(place, others, url) {
	map = L.map('map');
	var tileLayer = L.tileLayer('https://mt1.google.com/vt/lyrs=r&x={x}&y={y}&z={z}', {
		attribution: '<a href="https://developers.google.com/maps/documentation" target="_blank">Google Map</a>'
	});
	tileLayer.addTo(map);
	iconMarkers = L.featureGroup();
	if (typeof others !== 'undefined') {
		var iconBlue = L.icon({
			iconUrl: 'icon/ltblue-dot.png',
			iconRetinaUrl: 'icon/ltblue-dot.png',
			iconSize: [32, 32],
			iconAnchor: [14, 27],
			popupAnchor: [1, -22],
		});
		placeMarker(others, iconBlue, '#aff', url);
	}
	if (typeof place !== 'undefined') {
		var iconRed = L.icon({
			iconUrl: 'icon/red-dot.png',
			iconRetinaUrl: 'icon/red-dot.png',
			iconSize: [32, 32],
			iconAnchor: [14, 27],
			popupAnchor: [1, -22],
		});
		placeMarker(place, iconRed, '#ff4', url);
	}
	map.fitBounds(iconMarkers.getBounds());
	var Basic_Map = new Array();
	Basic_Map[ 0 ] = L.tileLayer('https://mt1.google.com/vt/lyrs=r&x={x}&y={y}&z={z}', {
		attribution: '<a href="https://developers.google.com/maps/documentation" target="_blank">Google Map</a>'
	});
	Basic_Map[ 1 ] = L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
		attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors',
		continuousWorld: false
	});
	Basic_Map[ 2 ] = 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>'
	});
	Basic_Map[ 3 ] = L.tileLayer('https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg', {
		attribution: '<a href="https://maps.gsi.go.jp/development/ichiran.html" target="_blank">地理院タイル</a>'
	});
	Basic_Map[ 4 ] = L.tileLayer('https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
		attribution: 'Tiles © <a href="http://www.esrij.com/"> Esri Japan </a>'
	});
	var baseMap = {
		'Google マップ': Basic_Map[ 0 ],
		'OpenStreetMap': Basic_Map[ 1 ],
		'国土地理院 標準地図': Basic_Map[ 2 ],
		'国土地理院 写真': Basic_Map[ 3 ],
		'Esri World Topo Map': Basic_Map[ 4 ]
	};
	L.control.layers(baseMap).addTo(map);
	map.addControl(new L.Control.Fullscreen({	// フルスクリーンボタン
		title: {
			'false': '最大化',
			'true': '元に戻す'
		}
	}));
	L.easyButton('fas fa-map-marker-alt', function(btn, easyMap) {	// 現在地表示ボタン
		currentWatchReset();
		currentWatch();
	}).addTo(map);
	L.easyButton('fa fa-times', function(btn, easyMap) {
		currentWatchReset();
	}).addTo(map);
	L.easyButton('fa fa-reply-all', function(btn, easyMap) {
		currentWatchReset();
		if (currentWatchBtn) {
			currentWatchBtn.state('current-watch');
			currentWatchBtn = null;
		}
		map.fitBounds(iconMarkers.getBounds());
	}).addTo(map);
	map.on('click', onMapClick);
}