Skip to content

Commit be5153f

Browse files
committed
Finished reactive paint function
1 parent d10d841 commit be5153f

File tree

2 files changed

+10
-52
lines changed

2 files changed

+10
-52
lines changed

src/lib/components/data-vis/map/Map.svelte

Lines changed: 6 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,11 @@
8787
tileSource = "http://localhost:8080/{z}/{x}/{y}.pbf",
8888
paintObject,
8989
geojsonPromoteId = "areanm",
90-
vectorMetricProperty = "Index of Multiple Deprivation (IMD) Rank",
90+
vectorMetricProperty = "Index of Multiple Deprivation (IMD) Decile",
9191
vectorLayerName = "LSOA",
9292
borderColor = "#003300",
9393
labelSourceLayer = "place",
94+
externalData = null,
9495
}: {
9596
data: object[];
9697
paintObject?: object;
@@ -142,10 +143,9 @@
142143
vectorLayerName?: string;
143144
borderColor?: string;
144145
labelSourceLayer?: string;
145-
usingExternalData: false;
146+
externalData?: object;
146147
} = $props();
147148
148-
let usingExternalData = false;
149149
const tileSourceId = "lsoas";
150150
const promoteProperty = "LSOA21NM";
151151
@@ -180,7 +180,6 @@
180180
);
181181
182182
let filteredGeoJsonData = $derived(filterGeo(geojsonData, year));
183-
$inspect(breakCount);
184183
185184
let fillColors: string[] = $derived(
186185
setCustomPalette == true
@@ -190,54 +189,11 @@
190189
191190
let tooFewColors = $derived(fillColors.length < breakCount);
192191
193-
let paint = $derived(() => {
194-
if (!map || !loaded) return;
195-
196-
const values = extractVectorMetricValues(
197-
map,
198-
vectorLayerName,
199-
vectorMetricProperty,
200-
);
201-
202-
if (!values || values.length === 0) return;
203-
204-
let breaks: number[];
205-
206-
if (breaksType === "quantile") {
207-
breaks = quantileBreaks(values, breakCount);
208-
} else if (breaksType === "jenks") {
209-
breaks = jenksBreaks(values, breakCount);
210-
} else {
211-
const min = Math.min(...values);
212-
const max = Math.max(...values);
213-
const step = (max - min) / breakCount;
214-
breaks = Array.from(
215-
{ length: breakCount },
216-
(_, i) => min + step * (i + 1),
217-
);
218-
}
219-
220-
const paint = createPaintObjectFromMetric(
221-
vectorMetricProperty,
222-
breaks,
223-
fillColors,
224-
fillOpacity,
225-
);
226-
227-
map.setPaintProperty(vectorLayerName, "fill-color", paint["fill-color"]);
228-
map.setPaintProperty(
229-
vectorLayerName,
230-
"fill-opacity",
231-
paint["fill-opacity"],
232-
);
233-
});
234-
235192
$effect(() => {
236193
if (tooFewColors) {
237194
console.warn("Too few colours for the number of breaks");
238195
}
239196
});
240-
241197
let map: maplibregl.Map | undefined = $state();
242198
243199
let loaded = $state(false);
@@ -282,10 +238,8 @@
282238
283239
if (cooperativeGestures) {
284240
map?.cooperativeGestures.enable();
285-
$inspect(cooperativeGestures);
286241
} else {
287242
map?.cooperativeGestures.disable();
288-
$inspect(cooperativeGestures);
289243
}
290244
291245
if (interactive) {
@@ -324,7 +278,7 @@
324278
: customBreaks,
325279
);
326280
let vectorPaintObject = $derived(
327-
usingExternalData
281+
externalData != null
328282
? createPaintObjectFromMetric(metric, breaks, fillColors, fillOpacity)
329283
: createPaintObjectFromMetric(
330284
vectorMetricProperty,
@@ -455,6 +409,7 @@
455409
{#if geoSource == "file"}
456410
<GeoJSON id="areas" data={merged} promoteId={geojsonPromoteId}>
457411
<FillLayer
412+
id="main-fill-layer"
458413
paint={{
459414
"fill-color": ["coalesce", ["get", "color"], "lightgrey"],
460415
"fill-opacity": changeOpacityOnHover
@@ -480,6 +435,7 @@
480435
/>
481436
{#if showBorder}
482437
<LineLayer
438+
id="border-layer"
483439
layout={{ "line-cap": "round", "line-join": "round" }}
484440
paint={{
485441
"line-color": hoverStateFilter(borderColor, "orange"),

src/lib/components/data-vis/map/mapUtils.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,14 @@ export function quantileBreaks(data: number[], numBreaks: number): number[] {
115115
}
116116
export function createPaintObjectFromMetric(
117117
metricProperty: string,
118-
breaks: (string | number)[],
118+
breaks: number[],
119119
fillColors: string[],
120120
fillOpacity: number = 0.4,
121121
): object {
122122
const usableLength = Math.min(breaks.length, fillColors.length);
123123

124+
breaks.sort((a, b) => a - b);
125+
124126
function parseNumberWithCommas(value: string | number): number {
125127
if (typeof value === "number") return value;
126128
const cleaned = value.toString().replace(/,/g, "").trim();
@@ -131,7 +133,7 @@ export function createPaintObjectFromMetric(
131133
const matchExpression: [string, any, ...any[]] = [
132134
"step",
133135
["to-number", ["get", metricProperty]],
134-
"rgba(0,0,0,0)", // Default color
136+
"#d3d3d3", // Default color
135137
];
136138

137139
for (let i = 0; i < usableLength; i++) {

0 commit comments

Comments
 (0)