import React, {useState, useEffect} from 'react'; import {createRoot} from 'react-dom/client'; import {Map} from 'react-map-gl'; import maplibregl from 'maplibre-gl'; import {AmbientLight, PointLight, LightingEffect} from '@deck.gl/core'; import DeckGL from '@deck.gl/react'; import {PolygonLayer} from '@deck.gl/layers'; import {TripsLayer} from '@deck.gl/geo-layers'; import { Box } from '@mui/system'; // Source data CSV, Attribution to CARTO, OpenStreetMap contributors to deck.gl trips-layer example const DATA_URL = { // BUILDINGS:'https://raw.githubusercontent.com/visgl/deck.gl-data/master/examples/trips/buildings.json', // eslint-disable-line BUILDINGS: '/map1.json' }; const ambientLight = new AmbientLight({ color: [255, 255, 255], intensity: 6.0 }); const pointLight = new PointLight({ color: [255, 255, 255], intensity: 1.0, position: [-6.4741164, 53.4622087, 8000] }); // const lightingEffect = new LightingEffect({ambientLight, pointLight}); const lightingEffect = new LightingEffect({ambientLight, pointLight}); const material = { ambient: 0.1, diffuse: 0.6, shininess: 32, specularColor: [60, 64, 70] }; const DEFAULT_THEME = { buildingColor: [51, 204, 255], trailColor0: [253, 128, 93], trailColor1: [23, 184, 190], material, effects: [lightingEffect] }; const INITIAL_VIEW_STATE = { longitude: -6.269218, latitude: 53.342505, zoom: 14.64, pitch: 59.31, bearing: 0 }; const MAP_STYLE = 'https://basemaps.cartocdn.com/gl/dark-matter-nolabels-gl-style/style.json'; const landCover = [ [ [-74.0, 40.7], [-74.02, 40.7], [-74.02, 40.72], [-74.0, 40.72] ] ]; export default function Map3D({ buildings = DATA_URL.BUILDINGS, initialViewState = INITIAL_VIEW_STATE, mapStyle = MAP_STYLE, theme = DEFAULT_THEME, }) { const [buildingData, setBuildingData] = useState(null); const [viewState, setViewState] = useState(initialViewState); // Add this line to manage view state useEffect(() => { fetch(buildings) .then((response) => response.json()) .then((json) => { const allData = json.datasets[0].data.allData.map(([feature]) => feature); setBuildingData(allData); }) .catch((error) => { console.error('Error fetching buildings data:', error); }); }, [buildings]); if (!buildingData) { return
Loading...
; } const layers = [ new PolygonLayer({ id: 'ground', data: landCover, getPolygon: f => f, stroked: false, getFillColor: [0, 0, 0, 0] }), new PolygonLayer({ id: 'buildings', data: buildingData, extruded: true, wireframe: false, opacity: 0.5, getPolygon: (f) => f.geometry.coordinates[0][0], getElevation: (f) => f.properties.Height_Met, getFillColor: theme.buildingColor, material: theme.material, }) ]; const onViewStateChange = ({ viewState }) => { setViewState(viewState); }; return (
Longitude: {viewState.longitude.toFixed(6)}
Latitude: {viewState.latitude.toFixed(6)}
Zoom: {viewState.zoom.toFixed(2)}
Pitch: {viewState.pitch.toFixed(2)}
Bearing: {viewState.bearing.toFixed(2)}
); }