React+MapBox Geojson 올리기 (Height 속성 활용하기 )

2025. 3. 4. 23:51·Dev

📍MapBox로 3D GeoJSON 표현하기

GeoJSON 데이터를 MapBox에서 3D로 표현하고 싶다면, Height 속성을 이용해 3D 효과를 적용할 수 있다.


1️⃣ MapBox 기본 세팅

이전 글에서 MapBox 기본 세팅 방법을 다루었다. 기본 설정이 이미 되어있다면, 이 단계는 건너뛰어도 된다!

React+Mapbox 초기 세팅 🌍


2️⃣ GeoJSON 레이어 추가하기

GeoJSON에 있는 height 속성을 기반으로 3D 효과를 주기 위해서, paint 속성을 설정해야 한다.

여기서 중요한 점은 리터럴 함수를 사용하여 GeoJSON의 특정 필드를 참조할 수 있다는 점이다!

 

필요한 paint 속성:

  • 'fill-extrusion-color': 폴리곤의 색상. GeoJSON에 color 속성이 없으면, 직접 값을 지정할 수 있다.
  • 'fill-extrusion-height': 폴리곤의 높이. height 속성을 사용하여 높이를 지정할 수 있다.
  • 'fill-extrusion-base': 폴리곤의 시작 높이. 예를 들어, base_height 속성으로 기준 높이를 조정할 수 있다.
  • 'fill-extrusion-opacity': 폴리곤의 투명도. 0에서 1 사이의 값을 지정하여 투명도를 조절할 수 있다. 
'fill-extrusion-color': ['get', 'color'], //geojson의 color property 값
'fill-extrusion-height': ['get', 'height'], //geojson의 height property 값
'fill-extrusion-base': ['get', 'base_height'], //geojson의 base_height property 값
'fill-extrusion-opacity': 0.8

3️⃣ fill-extrusion-height vs fill-extrusion-base

  • fill-extrusion-height
    1. 폴리곤의 전체 높이를 설정하는 속성이다.
    2. 폴리곤이 얼마나 높은지 (즉, z축으로 얼마나 솟아나는지) 결정한다.
    3. 예시: fill-extrusion-height: 100;이라고 설정하면, 해당 폴리곤은 100 미터의 높이로 표시된다.
  1. fill-extrusion-base
    1. 입체 폴리곤의 기준 높이를 설정하는 속성이다.
    2. 폴리곤이 시작하는 지면의 높이를 결정한다. 이 속성은 높이(fill-extrusion-height)와 함께 사용되어 폴리곤의 시작점을 조정할 수 있다.
    3. 예시: fill-extrusion-base: 50;라고 설정하면, 해당 폴리곤은 50 미터 위에서 시작하여 높이만큼 추가적으로 뻗어 나간다. 따라서, 만약 fill-extrusion-height가 100이라면, 이 폴리곤은 50미터에서 시작하여 150미터까지 올라간다.

4️⃣ 전체 코드

import mapboxgl from 'mapbox-gl';
import 'mapbox-gl/dist/mapbox-gl.css';
import { useEffect, useRef } from 'react';
import './App.css';

function App() {
  const mapRef = useRef<mapboxgl.Map | null>(null);
  const mapContainerRef = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    mapboxgl.accessToken = 'YOUR_MAPBOX_ACCESS_TOKEN';
    mapRef.current = new mapboxgl.Map({
      container: mapContainerRef.current as HTMLDivElement,
      style: 'mapbox://styles/mapbox/streets-v11',
      center: [-87.61694, 41.86625],
      zoom: 15.99,
      pitch: 40,
      bearing: 20,
      antialias: true
    });

    mapRef.current.on('load', () => {
      mapRef.current?.addSource('floorplan', {
        type: 'geojson',
        data: 'https://docs.mapbox.com/mapbox-gl-js/assets/indoor-3d-map.geojson'
      });

      mapRef.current?.addLayer({
        id: 'room-extrusion',
        type: 'fill-extrusion',
        source: 'floorplan',
        paint: {
          'fill-extrusion-color': ['get', 'color'],
          'fill-extrusion-height': ['get', 'height'],
          'fill-extrusion-base': ['get', 'base_height'],
          'fill-extrusion-opacity': 0.8
        }
      });
    });

    return () => {
      mapRef.current?.remove();
    };
  }, []);

  return (
    <>
      <div id='map-container' ref={mapContainerRef} />
    </>
  )
}

export default App;

 


참고

Extrude polygons for 3D indoor mapping

'Dev' 카테고리의 다른 글

직접 써본 FSD (Feature-Sliced Design) 적용기: 깔끔함과 혼란 사이  (0) 2025.04.05
[OAuth] OAuth 2.0을 파헤쳐보자 🔍 + 소셜로그인 예제  (0) 2025.03.05
[OAuth] GCP (Google Cloud Platform)에서 Client ID 생성하기 🪪  (0) 2025.03.05
[OAuth] OAuth란? 🤔  (0) 2025.03.04
React+Mapbox 초기 세팅 🌍  (0) 2025.03.04
'Dev' 카테고리의 다른 글
  • [OAuth] OAuth 2.0을 파헤쳐보자 🔍 + 소셜로그인 예제
  • [OAuth] GCP (Google Cloud Platform)에서 Client ID 생성하기 🪪
  • [OAuth] OAuth란? 🤔
  • React+Mapbox 초기 세팅 🌍
Lucy96
Lucy96
개발새발 프론트엔드 개발자
  • Lucy96
    Lucy dev ✨
    Lucy96
  • 전체
    오늘
    어제
    • 분류 전체보기 (18)
      • JavaScript (3)
      • React (1)
      • HTTP (1)
      • GIS (1)
      • 회고 (3)
      • Dev (7)
      • CSS (1)
      • DB (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    CSS
    Google Cloud Platform
    콜백큐
    논블로킹
    JavaScript
    토스모닥불
    Hoisting
    sessionStorage
    webapis
    이벤트루프
    oauth
    BEM
    localStorage
    자바스크립트엔진
    회고
    프론트엔드
    gcp
    HTTP
    cliend id
    react
    토스
    geojson
    블로킹
    OAuth 2.0
    Mapbox
    scss
    Cookie
    cors
    scope
    소셜로그인
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Lucy96
React+MapBox Geojson 올리기 (Height 속성 활용하기 )
상단으로

티스토리툴바