用 Cesium 製作旅館地圖
GIS 是個很冷門的題材,但要建構一個完整的 GIS 系統,
其背後的演算法很複雜, 如果不是公司專案因素,我會碰到 GIS 的機會,
大概只有某天突然想起「口罩地圖」然後很想看那是怎麼實作的時候吧 XD
環境建立
Cesium 是我過去在公司的專案上用到的一套 GIS 工具,
有人的地方就有江湖,有 JS 的地方就有 React,所以...它也有 React 的封裝版,
叫做 Resium,但這邊先示範原生的 CDN 為主:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<!-- Include the CesiumJS JavaScript and CSS files -->
<script src="https://cesium.com/downloads/cesiumjs/releases/1.119/Build/Cesium/Cesium.js"></script>
<link
href="https://cesium.com/downloads/cesiumjs/releases/1.119/Build/Cesium/Widgets/widgets.css"
rel="stylesheet"
/>
</head>
<body>
<div id="cesiumContainer"></div>
</body>
<script type="module">
const viewer = new Cesium.Viewer("cesiumContainer");
</script>
</html>
GIS 的要素
除了建構工具的選擇外,GIS 不外乎就是下面的要素:
- 座標
- 事件
- 圖層
也就是說我們只要有這些資訊,就能做到簡單的互動地圖了!
座標
要在地圖上準確定義出某個東西的座標,要用什麼當作參考呢?
就是經緯度!因此在串接資料時,只要資料來源裡面是有經緯度的,
那就一定能在地圖上標示出來。
以 高雄城市資料平台 高雄市一般旅館資料為例,將 JSON 檔下載下來後,
甚至能直接看到中文命名的屬性:
{
// 略...
"經度Lng": "120.2956306",
"緯度Lat": "22.6270351964"
}
接下來可以透過這些座標資料在地圖上生成圖示。
目前起始畫面是從外太空看向整個地球的,所以我希望改變起始位置,
一樣需要用到高雄的經緯度 (120.3119, 22.6208)
,控制畫面移動的東西是 camera:
viewer.camera.setView({
destination: Cesium.Cartesian3.fromDegrees(120.3119, 22.6208, 10000),
});
高雄城市資料平台有給 JSON 格式的資料,所以直接 fetch 它即可:
fetch(
"https://api.kcg.gov.tw/api/service/Get/8ed53368-e292-4e2a-80a7-434cf497220c"
).then((response) => {
response.json().then((res) => {
res.data.forEach((item) => {
addBillboard(item);
});
});
});
// 產生圖示的函式
function addBillboard(data) {
console.log(data);
}
確認資料能夠接上之後,就可以來實作 addBillboard
這個函式,
Cesium 可以生成不同類型的實例並顯示在畫面上,這邊要示範的是 Billboard