From 18e76f543d5a2bae84b15b7cbaff622809deb6e7 Mon Sep 17 00:00:00 2001 From: Max Tobias Weber Date: Tue, 24 Mar 2026 09:20:22 +0100 Subject: [PATCH] add TreeLayer stage 1 --- src/components/TreeLayer/TreeLayer_1.tsx | 82 ++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/components/TreeLayer/TreeLayer_1.tsx diff --git a/src/components/TreeLayer/TreeLayer_1.tsx b/src/components/TreeLayer/TreeLayer_1.tsx new file mode 100644 index 0000000..e52ec0b --- /dev/null +++ b/src/components/TreeLayer/TreeLayer_1.tsx @@ -0,0 +1,82 @@ +import { useCallback, useEffect, useState } from "react"; +import { MlSceneGraphLayer } from "@mapcomponents/deck-gl"; +import Box from "@mui/material/Box"; +import Divider from "@mui/material/Divider"; +import Paper from "@mui/material/Paper"; +import Typography from "@mui/material/Typography"; + +interface TreeFeature { + type: "Feature"; + properties: { + leaf_type?: string; + height?: string | number; + [key: string]: unknown; + }; + geometry: { + type: "Point"; + coordinates: [number, number] | [number, number, number]; + }; +} + +const getPosition = (d: unknown): [number, number, number] => { + const f = d as TreeFeature; + const [lon, lat] = f.geometry.coordinates; + return [lon, lat, 0]; +}; + +interface TreeLayerProps { + mapId?: string; + sizeScale?: number; +} + +const TreeLayer = ({ mapId, sizeScale = 15 }: TreeLayerProps) => { + const [pineFeatures, setPineFeatures] = useState([]); + const [broadleafFeatures, setBroadleafFeatures] = useState([]); + + useEffect(() => { + fetch("/assets/trees.geojson") + .then((res) => res.json()) + .then((data: { features: TreeFeature[] }) => { + const features = data.features; + setPineFeatures( + features.filter((f) => f.properties.leaf_type === "needleleaved") + ); + setBroadleafFeatures( + features.filter((f) => f.properties.leaf_type !== "needleleaved") + ); + }); + }, []); + + return ( + <> + {pineFeatures.length > 0 && ( + + )} + {broadleafFeatures.length > 0 && ( + + )} + + ); +}; + +export default TreeLayer;