맵에 선을 추가하는 방법 - Amazon Location Service

맵에 선을 추가하는 방법

Amazon Location Service를 사용하면 사전 레코딩된 GPS 추적을 선-문자열로 추가하고 실시간 GPS 추적을 동적 맵에 추가할 수 있습니다.

사전 레코딩된 선 추가

이 예제에서는 사전 레코딩된 GPS 추적을 동적 맵에 GeoJSON(main.js)으로 추가합니다. 이렇게 하려면 맵에 소스(예: GeoJSON)와 선택한 선 스타일이 있는 계층을 추가해야 합니다.

index.html
<!DOCTYPE html> <html lang="en"> <head> <title>Add a line on the map</title> <meta property="og:description" content="Initialize a map in an HTML element with MapLibre GL JS." /> <meta charset='utf-8'> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@4.x/dist/maplibre-gl.css' /> <link rel='stylesheet' href='style.css' /> <script src='https://unpkg.com/maplibre-gl@4.x/dist/maplibre-gl.js'></script> <script src='main.js'></script> </head> <body> <!-- Map container --> <div id="map"></div> <script> const apiKey = "<API_KEY>"; const mapStyle = "Standard"; const awsRegion = "eu-central-1"; const styleUrl = `https://maps.geo.${awsRegion}.amazonaws.com/v2/styles/${mapStyle}/descriptor?key=${apiKey}`; const map = new maplibregl.Map({ container: 'map', style: styleUrl, center: [-123.126575, 49.290585], zoom: 12.5 }); map.on('load', () => { map.addSource('vancouver-office-to-stanley-park-route', { type: 'geojson', data: routeGeoJSON }); map.addLayer({ id: 'vancouver-office-to-stanley-park-route', type: 'line', source: 'vancouver-office-to-stanley-park-route', layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': '#008296', 'line-width': 2 } }); }); </script> </body> </html>
style.css
body { margin: 0; padding: 0; } html, body, #map { height: 100%; }
main.js
const routeGeoJSON = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "LineString", coordinates: [ [-123.117011, 49.281306], [-123.11785, 49.28011], ... [-123.135735, 49.30106] ] }, properties: { name: "Amazon YVR to Stanley Park", description: "An evening walk from Amazon office to Stanley Park." } } ] };

실시간으로 선 추가

이 예제에서는 새 GPS 좌표를 하나씩 추가하여 실시간 GPS 추적을 생성하는 방법을 시뮬레이션합니다. 실시간 데이터 업데이트를 추적하는 데 유용합니다.

index.html
<!DOCTYPE html> <html lang="en"> <head> <title>Add a line on the map in real-time</title> <meta property="og:description" content="Initialize a map in an HTML element with MapLibre GL JS." /> <meta charset='utf-8'> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@4.x/dist/maplibre-gl.css' /> <link rel='stylesheet' href='style.css' /> <script src='https://unpkg.com/maplibre-gl@4.x/dist/maplibre-gl.js'></script> <script src='main.js'></script> </head> <body> <!-- Map container --> <div id="map"></div> <script> const apiKey = "<API_KEY>"; const mapStyle = "Standard"; const awsRegion = "eu-central-1"; const styleUrl = `https://maps.geo.${awsRegion}.amazonaws.com/v2/styles/${mapStyle}/descriptor?key=${apiKey}`; const map = new maplibregl.Map({ container: 'map', style: styleUrl, center: [-123.126575, 49.290585], zoom: 12.5 }); map.on('load', () => { const coordinates = routeGeoJSON.features[0].geometry.coordinates; routeGeoJSON.features[0].geometry.coordinates = [coordinates[0], coordinates[20]]; map.addSource('vancouver-office-to-stanley-park-route', { type: 'geojson', data: routeGeoJSON }); map.addLayer({ id: 'vancouver-office-to-stanley-park-route', type: 'line', source: 'vancouver-office-to-stanley-park-route', layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': '#008296', 'line-width': 2 } }); map.jumpTo({center: coordinates[0], zoom: 14}); map.setPitch(30); let i = 0; const timer = window.setInterval(() => { if (i < coordinates.length) { routeGeoJSON.features[0].geometry.coordinates.push(coordinates[i]); map.getSource('vancouver-office-to-stanley-park-route').setData(routeGeoJSON); map.panTo(coordinates[i]); i++; } else { window.clearInterval(timer); } }, 100); }); </script> </body> </html>
style.css
body { margin: 0; padding: 0; } html, body, #map { height: 100%; }
main.js
const routeGeoJSON = { type: "FeatureCollection", features: [ { type: "Feature", geometry: { type: "LineString", coordinates: [ [-123.117011, 49.281306], [-123.11785, 49.28011], ... [-123.135735, 49.30106] ] }, properties: { name: "Amazon YVR to Stanley Park", description: "An evening walk from Amazon office to Stanley Park." } } ] };

개발자 팁

범위 맞춤: 선 좌표의 범위를 계산하여 맵 범위에 선을 맞출 수 있습니다.

const coordinates = routeGeoJSON.features[0].geometry.coordinates; const bounds = coordinates.reduce((bounds, coord) => bounds.extend(coord), new maplibregl.LngLatBounds(coordinates[0], coordinates[0])); map.fitBounds(bounds, { padding: 20 });