Skip to content

Commit 6c77705

Browse files
committed
feat: uplaod json
1 parent 52528a4 commit 6c77705

File tree

6 files changed

+78
-17
lines changed

6 files changed

+78
-17
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
},
3333
"devDependencies": {
3434
"@eslint/js": "^9.25.0",
35+
"@types/geojson": "^7946.0.16",
3536
"@types/react": "^19.1.2",
3637
"@types/react-dom": "^19.1.2",
3738
"@vitejs/plugin-react": "^4.4.1",

src/components/header.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export default function Header() {
1616
const dispatch = useStacDispatch();
1717

1818
async function onSelectExample(details: MenuSelectionDetails) {
19+
setHref(details.value);
1920
dispatch({ type: "set-href", href: details.value });
2021
}
2122

src/components/map.tsx

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { type DeckProps } from "@deck.gl/core";
1+
import { Layer, type DeckProps } from "@deck.gl/core";
22
import { MapboxOverlay } from "@deck.gl/mapbox";
33
import { GeoArrowPolygonLayer } from "@geoarrow/deck.gl-layers";
4+
import { GeoJsonLayer } from "deck.gl";
45
import "maplibre-gl/dist/maplibre-gl.css";
56
import { useEffect, useRef, useState } from "react";
67
import {
@@ -18,8 +19,10 @@ function DeckGLOverlay(props: DeckProps) {
1819
}
1920

2021
export default function Map() {
21-
const { table, bbox } = useStac();
22-
const [layers, setLayers] = useState<GeoArrowPolygonLayer[]>([]);
22+
const { table, bbox, geojson } = useStac();
23+
const [tableLayer, setTableLayer] = useState<GeoArrowPolygonLayer>();
24+
const [geoJsonLayer, setGeoJsonLayer] = useState<Layer>();
25+
const [layers, setLayers] = useState<Layer[]>([]);
2326
const mapRef = useRef<MapRef>(null);
2427
const mapStyle = useColorModeValue(
2528
"positron-gl-style",
@@ -40,9 +43,9 @@ export default function Map() {
4043
autoHighlight: true,
4144
highlightColor: [252, 192, 38],
4245
});
43-
setLayers([layer]);
46+
setTableLayer(layer);
4447
} else {
45-
setLayers([]);
48+
setTableLayer(undefined);
4649
}
4750
}, [table]);
4851

@@ -60,6 +63,33 @@ export default function Map() {
6063
}
6164
}, [bbox]);
6265

66+
useEffect(() => {
67+
if (geojson) {
68+
const layer = new GeoJsonLayer({
69+
id: "geojson",
70+
data: geojson,
71+
stroked: false,
72+
filled: true,
73+
pickable: true,
74+
getFillColor: [160, 160, 180, 200],
75+
});
76+
setGeoJsonLayer(layer);
77+
} else {
78+
setGeoJsonLayer(undefined);
79+
}
80+
}, [geojson]);
81+
82+
useEffect(() => {
83+
const layers = [];
84+
if (geoJsonLayer) {
85+
layers.push(geoJsonLayer);
86+
}
87+
if (tableLayer) {
88+
layers.push(tableLayer);
89+
}
90+
setLayers(layers);
91+
}, [geoJsonLayer, tableLayer]);
92+
6393
return (
6494
<MaplibreMap
6595
ref={mapRef}

src/components/panel.tsx

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from "@chakra-ui/react";
1212
import { useDuckDb } from "duckdb-wasm-kit";
1313
import { useEffect, useState } from "react";
14-
import { LuInfo, LuUpload } from "react-icons/lu";
14+
import { LuFilter, LuInfo, LuSearch, LuUpload } from "react-icons/lu";
1515
import { useStac, useStacDispatch } from "./stac/hooks";
1616
import type { StacValue } from "./stac/types";
1717

@@ -49,14 +49,21 @@ export default function Panel() {
4949
// This should always be true since we set maxFiles to 1
5050
if (fileUpload.acceptedFiles.length == 1) {
5151
const file = fileUpload.acceptedFiles[0];
52-
if (db) {
53-
(async () => {
54-
const buffer = await file.arrayBuffer();
55-
// TODO do we need to clean up, eventually?
56-
db.registerFileBuffer(file.name, new Uint8Array(buffer));
57-
dispatch({ type: "set-href", href: file.name });
58-
})();
59-
}
52+
(async () => {
53+
if (file.name.endsWith(".parquet")) {
54+
if (db) {
55+
const buffer = await file.arrayBuffer();
56+
// TODO do we need to clean up, eventually?
57+
db.registerFileBuffer(file.name, new Uint8Array(buffer));
58+
dispatch({ type: "set-href", href: file.name });
59+
}
60+
} else {
61+
const text = await file.text();
62+
const value = JSON.parse(text);
63+
dispatch({ type: "set-href" });
64+
dispatch({ type: "set-value", value });
65+
}
66+
})();
6067
}
6168
}, [fileUpload.acceptedFiles, db, dispatch]);
6269

@@ -83,6 +90,12 @@ export default function Panel() {
8390
<Tabs.Trigger value="value">
8491
<LuInfo></LuInfo>
8592
</Tabs.Trigger>
93+
<Tabs.Trigger value="search" disabled={true}>
94+
<LuSearch></LuSearch>
95+
</Tabs.Trigger>
96+
<Tabs.Trigger value="filter" disabled={true}>
97+
<LuFilter></LuFilter>
98+
</Tabs.Trigger>
8699
<Tabs.Trigger value="upload">
87100
<LuUpload></LuUpload>
88101
</Tabs.Trigger>

src/components/stac/provider.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,26 @@ function reducer(state: StacState, action: StacAction) {
6666
href: action.href,
6767
value: undefined,
6868
table: undefined,
69+
geojson: undefined,
6970
};
7071
} else {
7172
return state;
7273
}
73-
case "set-value":
74-
return { ...state, value: action.value };
74+
case "set-value": {
75+
const newState = { ...state, value: action.value };
76+
if (
77+
["Feature", "FeatureCollection"].includes(action.value.type) &&
78+
action.value.geometry !== null
79+
) {
80+
// @ts-expect-error We know that we want this here
81+
newState.geojson = action.value;
82+
}
83+
if (action.value.bbox !== undefined) {
84+
// @ts-expect-error Man this is hard
85+
newState.bbox = action.value.bbox;
86+
}
87+
return newState;
88+
}
7589
case "set-table":
7690
return { ...state, table: action.table };
7791
case "set-bbox":

src/components/stac/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Table } from "apache-arrow";
2+
import type { Feature, FeatureCollection } from "geojson";
23
import { type Dispatch } from "react";
34
import type { StacCatalog, StacCollection, StacItem } from "stac-ts";
45

@@ -18,11 +19,12 @@ export type StacState = {
1819
href?: string;
1920
value?: StacValue;
2021
table?: Table;
22+
geojson?: Feature | FeatureCollection;
2123
bbox?: number[];
2224
};
2325

2426
export type StacAction =
25-
| { type: "set-href"; href: string }
27+
| { type: "set-href"; href?: string }
2628
| { type: "set-value"; value: StacValue }
2729
| { type: "set-table"; table: Table }
2830
| { type: "set-bbox"; bbox: number[] };

0 commit comments

Comments
 (0)