728x90

๋งํฌ ๋„๋กœ ๊ตํ†ต๋ง ๋ฐ์ดํ„ฐ๋ฅผ CesiumJS์— ์˜ฌ๋ฆฌ๋Š” ์ƒ˜ํ”Œ

 

๊ฒฐ๊ณผ ์š”์•ฝ

๋”๋ณด๊ธฐ

โœ… Did

  • shp → kml || geojson (geojson์€ ์ข€ ๊นจ์ง„๋‹ค) in QGIS
  • ๋งํฌ ๋ฐ์ดํ„ฐ๋ฅผ cesium asset ์ €์žฅ์†Œ์— ์˜ฌ๋ฆฌ๊ธฐ
  • ๋งํฌ ๋ฐ์ดํ„ฐ ํ‘œ์ถœํ•˜๊ธฐ

 

โŽ Did Not

  • 3d ์ง€๋„์— KML Asset ์˜ฌ๋ฆฌ๊ธฐ
    • ๋ฌธ์ œ ์ƒํ™ฉ: 3D ๋ฐฐ๊ฒฝ ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌปํžˆ๊ณ , ๊ฑด๋ฌผ๊ณผ ํ•จ๊ป˜ ์˜ฌ๋ฆฌ๋ฉด ๋ชจ๋‘ ์ž„์˜์˜ ๊ณ ๋„ ๊ฐ’์ด ์ฃผ์–ด์ง€๋Š”์ง€ ๊ณต์ค‘์— ๋–  ์žˆ๋‹ค.
    • ์˜์‹ฌ๋˜๋Š” ๋ถ€๋ถ„: 2D์—์„œ๋Š” ๋ฌธ์ œ ์—†์ด ๋ฐ์ดํ„ฐ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•œ๊ฑธ ๋ณด๋ฉด ๊ณ ๋„ ์„ค์ •๊ณผ ๊ด€๋ จ๋œ ๋ญ”๊ฐ€์ธ ๋“ฏ. KML ๋ณ€ํ™˜ ๊ณผ์ •์—์„œ ์ผ๋ถ€ ํƒœ๊ทธ ๊ฐ’์ด NULL๋กœ ์ €์žฅ๋จ. KML์˜ ์›๋ณธ๋ฐ์ดํ„ฐ ๋˜ํ•œ 2D ๋ฐ์ดํ„ฐ์ด๊ธด ํ•จ
    • ์‹œ๋„ํ•œ ๊ฒƒ: ์ด ๊ธ€๋ณด๊ณ  <altitudeMode> ์†์„ฑ์— absolute ๊ฐ’์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ ๋ณ€ํ•จ ์—†์Œ
    • ์‹œ๋„ํ•  ๊ฒƒ: ์†์„ฑ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ฃผ๊ฑฐ๋‚˜ GeoServer์—์„œ WMS๋กœ ๊ฐ€์ ธ์˜จ ๋ ˆ์ด์–ด ์ถ”๊ฐ€ํ•˜๊ธฐ

 

โœ”๏ธ To do

  • Try: 3D์ง€๋„์— Asset ์˜ฌ๋ฆฌ๊ธฐ ์‹œ๋„ ์˜ˆ์ • ํ•ญ๋ชฉ
  • ๊ฒฝ์œ„๋„ ์ž…๋ ฅ๋ฐ›๊ณ  ํ•ด๋‹น ์œ„์น˜์— 3D๋ชจ๋ธ ์ถ”๊ฐ€
  • ์‹œ๊ฐ„ ํ๋ฆ„์ด ํฌํ•จ๋œ CZML ํ‘œ์ถœ

 

CesiumJS์˜ ๊ธฐ๋Šฅ์„ ํƒ์ƒ‰ํ•˜๊ณ  ์‹ถ์€๊ฑฐ๋ผ๋ฉด ๊ตณ์ด ์›น์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•  ํ•„์š” ์—†์ด, ์ œ๊ณต๋œ ์ƒŒ๋“œ๋ฐ•์Šค ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

Cesium Sandcastle

The Cesium Sandcastle provides an interactive environment for testing Cesium code.

sandcastle.cesium.com

 

์Šคํƒ

  • NodeJS 16.13.2.
  • Express 4.17.2.
  • CesiumJS 1.90.

 


 

์›น ์„œ๋ฒ„์™€ ํ‘œ์ถœ์šฉ ํŽ˜์ด์ง€

ํ•ด๋ณด๋ ค ํ•˜๋Š” ๊ฒƒ์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ธ๋ฐ, ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์–ด๋ดค์ž ์•„์ง ํ•˜๋Š” ์ผ์€ ํ‘œ์ถœ์šฉ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ผ ๋ฐ–์— ์—†๋‹ค. (๋งŒ์•ฝ ๋กœ์ปฌ์—์„œ HTML๋งŒ ๊ฐ€์ง€๊ณ  ํ…Œ์ŠคํŠธํ•ด๋ด์•ผ์ง€ ํ•œ๋‹ค๋ฉด ๊ทธ๋ƒฅ ์œ„์— ์ƒŒ๋“œ๋ฐ•์Šค ํŽ˜์ด์ง€ ๊ฐ€์„œ ํ•˜๋Š” ๊ฒŒ ๋‚ซ๋‹ค.) ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ง€๋„ ํ‘œ์ถœ์ด์•ผ ์‚ฌ์šฉ์ž ์ปดํ“จํ„ฐ์—์„œ ํ•˜๋Š”๊ฑฐ๊ณ  ์„œ๋ฒ„๊ฐ€ ํ•˜๋Š” ์ผ์€ DB์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ๋‹ค์ฃผ๋Š” ๊ฒŒ ์ฃผ์ผ๊ฒƒ ๊ฐ™์•„์„œ ๋น„๋™๊ธฐ! ๊ทธ๋Ÿผ NodeJS! ์ด๋Ÿฐ ๋‹จ์ˆœํ•œ ์ƒ๊ฐ์œผ๋กœ NodeJS๋ฅผ ์„ ํƒํ–ˆ๋‹ค. ์‚ฌ์‹ค ๊ทธ๋™์•ˆ Spring๊ณผ Tomcat๋งŒ ์จ๋ด์„œ ๋‹ค๋ฅธ ๊ฒƒ๋„ ์ฐ๋จนํ•ด๋ณด์ž๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ปธ๋‹ค.

cesium ion์€ asset ์ €์žฅ์†Œ๋กœ amazon s3๋ฅผ ์ง€์›ํ•œ๋‹ค.

nodejs ์ฐ๋จน ์งง์€ ํ›„๊ธฐ: Spring์ด J๋ผ๋ฉด NodeJs๋Š” P์ด๋‹ค. ์ „์— Vue ์ผ์„ ๋•Œ๋„ ๋Š๊ผˆ์ง€๋งŒ ๋‚˜ ๊ฐ™์€ ์‚ฌ๋žŒ์ด ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ŠคํŒŒ๊ฒŒํ‹ฐ ์žฅ์ธ์œผ๋กœ ์ „์งํ•˜๋Š” ๊ฒƒ์€ ์‹์€์ฃฝ ๋จน๊ธฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

NodeJS ์„ค์น˜ํ•˜๊ณ  ์ฒซ ํŽ˜์ด์ง€ ์ ‘๊ทผํ•˜๋Š” ์ƒ˜ํ”Œ

 

 

ํ‘œ์ถœ์šฉ ํŽ˜์ด์ง€์— CesiumJS ์ ์šฉํ•˜๊ธฐ

์ด ๊ธ€์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ผํ•˜๋ฉด ๋œ๋‹ค.

1. Cesium JS ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ํ† ํฐ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ

 

Cesium ion

 

cesium.com

 

 

2. Cesium ํด๋ผ์ด์–ธํŠธ ์„ค์น˜ํ•˜๊ธฐ

NPM์œผ๋กœ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ๋กœ์ปฌ์— ์„ค์น˜ํ•ด๋„ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์ฐจํ”ผ ํ‘œ์ถœ์šฉ์ธ๋ฐ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์„ ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“ค์ง€, ๋ผ๋Š” ๋งˆ์ธ๋“œ๋กœ CDN์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

<script src="https://cesium.com/downloads/cesiumjs/releases/1.90/Build/Cesium/Cesium.js"></script>
<link href="https://cesium.com/downloads/cesiumjs/releases/1.90/Build/Cesium/Widgets/widgets.css" rel="stylesheet">

 

 

3. ํ‘œ์ถœ ํŽ˜์ด์ง€ main.html

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <script src="https://cesium.com/downloads/cesiumjs/releases/1.90/Build/Cesium/Cesium.js"></script>
  <link href="https://cesium.com/downloads/cesiumjs/releases/1.90/Build/Cesium/Widgets/widgets.css" rel="stylesheet">
</head>

<body>
  <div id="cesiumContainer"></div>
  <script>
      Cesium.Ion.defaultAccessToken = '๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ';

		// ๊ธฐ๋ณธ ์ง€ํ˜•
      const viewer = new Cesium.Viewer('cesiumContainer', {
          terrainProvider: Cesium.createWorldTerrain()
      });

		// ๊ฑด๋ฌผ
      const buildingTileset = viewer.scene.primitives.add(Cesium.createOsmBuildings());
      
		// ์นด๋ฉ”๋ผ ์œ„์น˜
      viewer.camera.flyTo({
		/// fromDegrees(๊ฒฝ๋„, ์œ„๋„ [, ๋†’์ด])
          destination: Cesium.Cartesian3.fromDegrees(126.97698794172634, 37.57834971978493, 400),
          orientation: {
              heading: Cesium.Math.toRadians(0.0),
              pitch: Cesium.Math.toRadians(-15.0),
          }
      });
  </script>
</body>
</html>

 

 

4. ๊ฒฐ๊ณผ

๊ด‘ํ™”๋ฌธ ์•ž์ชฝ์œผ๋กœ ์นด๋ฉ”๋ผ๊ฐ€ ์ด๋™ํ•˜๊ฒŒ ์„ค์ •ํ•จ.

 

 

5. ๋งํฌ ๋ฐ์ดํ„ฐ ์—…๋กœ๋“œํ•˜๊ธฐ

(๋ฏธ์™„๋ฃŒ)

์›๋ž˜๋Š” ์œ„์˜ ๊ฐ€์ด๋“œ ๋‚ด์šฉ๋Œ€๋กœ ์—…๋กœ๋“œ ๊ณผ์ •๊นŒ์ง€ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ, ํ…Œ์ŠคํŠธํ•˜๋˜ ์ค‘ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋‚˜์„œ ์ผ์‹œ์ •์ง€

์ƒ๊ฐํ–ˆ๋˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. shp์„ kml๋กœ ๋ณ€ํ™˜ <- ์ด ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ ์••์ถ•์ด ์•ˆ๋ผ์„œ ํŒŒ์ผ ๋ฒ”์œ„๋ฅผ ์„œ์šธ ์‚ฌ์ด์ฆˆ๋กœ cropํ•จ (QGIS)
  2. kml์„ Amazon S3(Asset Storage)์— ์ €์žฅ
  3. ํ‘œ์ถœ
<script>
Cesium.Ion.defaultAccessToken = "๋ฐœ๊ธ‰๋ฐ›์€ํ† ํฐ";

var viewer = new Cesium.Viewer("cesiumContainer");

var promise = Cesium.IonResource.fromAssetId(์ €์žฅ๋œ ์—์…‹ ์•„์ด๋””)
  .then(function (resource) {
    return Cesium.KmlDataSource.load(resource, {
      camera: viewer.scene.camera,
      canvas: viewer.scene.canvas,
    });
  })
  .then(function (dataSource) {
    return viewer.dataSources.add(dataSource);
  })
  .then(function (dataSource) {
    return viewer.zoomTo(dataSource);
  })
  .otherwise(function (error) {
    console.log(error);
  });
</script>

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด 2D ์ง€๋„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. viewer ์ƒ์„ฑ ์‹œ {terrainProvider: Cesium.createWorldTerrain()} ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†์–ด ์ง€ํ˜•์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

 

 

 

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ฑด๋ฌผ์€ ๋†’์ด๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ˜์˜ํ•œ ์ƒํƒœ๋กœ ์ถ”๊ฐ€๋˜๊ณ , ๋งํฌ ๋ฐ์ดํ„ฐ๋Š” ์ง€ํ˜• ๋†’์ด์— ํŒŒ๋ฌปํ˜€๋ฒ„๋ฆฐ๋‹ค.

// ์ง€ํ˜• ๋ฐ์ดํ„ฐ ์„ค์ •
var viewer = new Cesium.Viewer('cesiumContainer', {
            terrainProvider: Cesium.createWorldTerrain()
        });

// 3D ๊ฑด๋ฌผ ๋ฐ์ดํ„ฐ ์„ค์ •
const buildingTileset = viewer.scene.primitives.add(Cesium.createOsmBuildings());

2D ๋งต์— 3D ๊ฑด๋ฌผ์„ ๊ทธ๋ƒฅ ์˜ฌ๋ ธ์„ ๊ฒฝ์šฐ, ๊ฑด๋ฌผ์— ์ด๋ฏธ ๊ณ ๋„ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‚˜๋ณด๋‹ค.

์ง€๊ธˆ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ๊นŒ ๋งํฌ ์›๋ณธ ๋ฐ์ดํ„ฐ๊ฐ€ 2D๋ผ์„œ ๊ทธ๋Ÿฐ ๋“ฏ. ๊ทผ๋ฐ ๋‹จ์ˆœํžˆ altitude ๋ชจ๋“œ ์†์„ฑ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ฑธ๋กœ๋Š” ๋ถ€์กฑํ•œ ๋ชจ์–‘์ด๋‹ค.

 

 

 


์ฐธ๊ณ  ์ž๋ฃŒ

728x90

+ Recent posts