9ml

3. 追跡した位置情報をGoogle Mapに表示する

GoogleMapに表示する場合は、Google Maps Javascript APIのAPIキーが必要です。毎月200ドル分は無料ですが、超過分は有料です。

<div>
	<p id="status">現在位置を取得中</p>
	<p id="latitude">latitude:</p>
	<p id="longitude">longitude:</p>
	<p id="accuracy">accuracy:</p>
	<p id="timestamp">timestamp:</p>
	<button id='startTracking'>startTracking</button>
	<button id='stopTracking'>stopTracking</button>
</div>

<div id="map" style="height: 400px; width: 100%; margin: 20px 0;"></div>

<script>
let watchId = null;
let map;
let marker;
let path;
let locations = [];


function initMap() {
	// マップの位置を初期化
	map = new google.maps.Map(document.getElementById('map'), {
		zoom: 15,
		center: { lat: 35.6812, lng: 139.7671 },
		mapTypeId: google.maps.MapTypeId.ROADMAP
	});
	// 移動経路を示すPolylineを初期化
	path = new google.maps.Polyline({
		path: locations,
		geodesic: true,
		strokeColor: '#ff0000',
		strokeOpacity: 1.0,
		strokeWeight: 2
	});
	
	path.setMap(map);

}


function updateMap(latitude, longitude) {

	const position = { lat: latitude, lng: longitude };
	// 地図の中心を現在位置に更新
	map.setCenter(position);
	// マーカーがなければ作成または位置の更新
	if (!marker) {
		marker = new google.maps.Marker({
			position: position,
			map: map,
			title: '現在位置'
		});
	} else {
		marker.setPosition(position);
	}
	// 移動経路を更新
	locations.push(position);
	path.setPath(locations);
}



function startTracking() {
	if ('geolocation' in navigator) {
		document.getElementById('status').textContent = '追跡中...';
		// 経路をリセット
		locations = [];
		if (path) {
			path.setPath(locations);
		}
		
		watchId = navigator.geolocation.watchPosition(
		
			function(position) {
			
				const latitude = position.coords.latitude;
				const longitude = position.coords.longitude;
				const accuracy = position.coords.accuracy;
				const timestamp = new Date(position.timestamp).toLocaleString();
				
				document.getElementById('status').textContent = '位置情報を追跡中';
				document.getElementById('latitude').textContent = `latitude: ${latitude}`;
				document.getElementById('longitude').textContent = `longitude: ${longitude}`;
				document.getElementById('accuracy').textContent = `accuracy: ${accuracy}m`;
				document.getElementById('timestamp').textContent = `timestamp: ${timestamp}`;
				
				updateMap(latitude, longitude);
				console.log( latitude + '/' + longitude );
			
			},
			function(error) {
			
				let errorMessage = '';
				switch(error.code) {
					case error.PERMISSION_DENIED:
						errorMessage = '位置情報の使用が許可されていません';
						break;
					case error.POSITION_UNAVAILABLE:
						errorMessage = '位置情報が取得できませんでした';
						break;
					case error.TIMEOUT:
						errorMessage = '位置情報の取得がタイムアウトになりました';
						break;
					default:
						errorMessage = 'その他のエラー:' + error.message; 
				}
				document.getElementById('status').textContent = '失敗:' + errorMessage;
				console.error(errorMessage);
			},
			{
				enableHighAccuracy: true, // 構成度の位置情報を取得
				timeout: 10000, // タイムアウト10秒
				maximumAge: 0 // 常に最新の位置情報を使用
			}
		
		);
	
	} else {
		document.getElementById('status').textContent = 'Geolocationはサポートされていません。';	
	}
}

function stopTracking() {
	if (watchId !== null) {
		navigator.geolocation.clearWatch(watchId);
		watchId = null;
		document.getElementById('status').textContent = '追跡を停止しました';
	}
}


document.getElementById('startTracking').addEventListener('click', startTracking);
document.getElementById('stopTracking').addEventListener('click', stopTracking);

// Google Maps APIの読み込み
function loadGoogleMapsAPI() {
	const script = document.createElement('script');
	script.src = 'https://maps.googleapis.com/maps/api/js?key=AIzaSyBc4f0GB_-ZGxU4-oPdzy4VfVLckM_NRNo&callback=initMap';
	script.async = true;
	script.defer = true;
	document.head.appendChild(script);
}
loadGoogleMapsAPI();
</script>
ホームに戻る