@macrostrat/column-views 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/age-axis.js +2 -2
- package/dist/age-axis.js.map +1 -1
- package/dist/age-axis.module.sass.cjs +6 -1
- package/dist/age-axis.module.sass.cjs.map +1 -1
- package/dist/age-axis.module.sass.js +4 -1
- package/dist/age-axis.module.sass.js.map +1 -1
- package/dist/age-model-overlay.js +2 -2
- package/dist/age-model-overlay.js.map +1 -1
- package/dist/age-model-overlay.module.sass.cjs +6 -1
- package/dist/age-model-overlay.module.sass.cjs.map +1 -1
- package/dist/age-model-overlay.module.sass.js +4 -1
- package/dist/age-model-overlay.module.sass.js.map +1 -1
- package/dist/column.js +2 -2
- package/dist/column.js.map +1 -1
- package/dist/column.module.sass.cjs +6 -1
- package/dist/column.module.sass.cjs.map +1 -1
- package/dist/column.module.sass.js +4 -1
- package/dist/column.module.sass.js.map +1 -1
- package/dist/correlation-chart/main.js +2 -2
- package/dist/correlation-chart/main.js.map +1 -1
- package/dist/correlation-chart/main.module.sass.cjs +6 -1
- package/dist/correlation-chart/main.module.sass.cjs.map +1 -1
- package/dist/correlation-chart/main.module.sass.js +4 -1
- package/dist/correlation-chart/main.module.sass.js.map +1 -1
- package/dist/data-provider/store.cjs +1 -1
- package/dist/data-provider/store.cjs.map +1 -1
- package/dist/data-provider/store.js +1 -1
- package/dist/data-provider/store.js.map +1 -1
- package/dist/facets/carbon-isotopes/isotopes-column.js +2 -2
- package/dist/facets/carbon-isotopes/isotopes-column.js.map +1 -1
- package/dist/facets/carbon-isotopes/isotopes-column.module.sass.cjs +6 -1
- package/dist/facets/carbon-isotopes/isotopes-column.module.sass.cjs.map +1 -1
- package/dist/facets/carbon-isotopes/isotopes-column.module.sass.js +4 -1
- package/dist/facets/carbon-isotopes/isotopes-column.module.sass.js.map +1 -1
- package/dist/facets/detrital-zircon/index.js +2 -2
- package/dist/facets/detrital-zircon/index.js.map +1 -1
- package/dist/facets/detrital-zircon/index.module.sass.cjs +6 -1
- package/dist/facets/detrital-zircon/index.module.sass.cjs.map +1 -1
- package/dist/facets/detrital-zircon/index.module.sass.js +4 -1
- package/dist/facets/detrital-zircon/index.module.sass.js.map +1 -1
- package/dist/facets/fossils/index.js +2 -2
- package/dist/facets/fossils/index.js.map +1 -1
- package/dist/facets/fossils/taxon-ranges.js +2 -2
- package/dist/facets/fossils/taxon-ranges.js.map +1 -1
- package/dist/facets/fossils/taxon-ranges.module.sass.cjs +6 -1
- package/dist/facets/fossils/taxon-ranges.module.sass.cjs.map +1 -1
- package/dist/facets/fossils/taxon-ranges.module.sass.js +4 -1
- package/dist/facets/fossils/taxon-ranges.module.sass.js.map +1 -1
- package/dist/facets/measurements/base.js +2 -2
- package/dist/facets/measurements/base.js.map +1 -1
- package/dist/facets/measurements/base.module.sass.cjs +6 -1
- package/dist/facets/measurements/base.module.sass.cjs.map +1 -1
- package/dist/facets/measurements/base.module.sass.js +4 -1
- package/dist/facets/measurements/base.module.sass.js.map +1 -1
- package/dist/index.cjs +10 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/maps/_shared/styles.cjs +6 -1
- package/dist/maps/_shared/styles.cjs.map +1 -1
- package/dist/maps/_shared/styles.js +6 -1
- package/dist/maps/_shared/styles.js.map +1 -1
- package/dist/maps/column-navigation/mapbox/keyboard-navigation.d.ts +1 -1
- package/dist/maps/index.d.ts +1 -0
- package/dist/maps/units-overlay/index.cjs +254 -0
- package/dist/maps/units-overlay/index.cjs.map +1 -0
- package/dist/maps/units-overlay/index.d.ts +14 -0
- package/dist/maps/units-overlay/index.js +252 -0
- package/dist/maps/units-overlay/index.js.map +1 -0
- package/dist/section.js +2 -2
- package/dist/section.js.map +1 -1
- package/dist/unit-details/panel.js +2 -2
- package/dist/unit-details/panel.js.map +1 -1
- package/dist/unit-details/panel.module.sass.cjs +6 -1
- package/dist/unit-details/panel.module.sass.cjs.map +1 -1
- package/dist/unit-details/panel.module.sass.js +4 -1
- package/dist/unit-details/panel.module.sass.js.map +1 -1
- package/dist/unit-details/popover.js +2 -2
- package/dist/unit-details/popover.js.map +1 -1
- package/dist/unit-details/popover.module.sass.cjs +6 -1
- package/dist/unit-details/popover.module.sass.cjs.map +1 -1
- package/dist/unit-details/popover.module.sass.js +4 -1
- package/dist/unit-details/popover.module.sass.js.map +1 -1
- package/dist/units/boxes.js +2 -2
- package/dist/units/boxes.js.map +1 -1
- package/dist/units/boxes.module.sass.cjs +6 -1
- package/dist/units/boxes.module.sass.cjs.map +1 -1
- package/dist/units/boxes.module.sass.js +4 -1
- package/dist/units/boxes.module.sass.js.map +1 -1
- package/dist/units/colors.cjs +79 -18
- package/dist/units/colors.cjs.map +1 -1
- package/dist/units/colors.d.ts +17 -4
- package/dist/units/colors.js +79 -18
- package/dist/units/colors.js.map +1 -1
- package/dist/units/composite.js +2 -2
- package/dist/units/composite.js.map +1 -1
- package/dist/units/composite.module.sass.cjs +6 -1
- package/dist/units/composite.module.sass.cjs.map +1 -1
- package/dist/units/composite.module.sass.js +4 -1
- package/dist/units/composite.module.sass.js.map +1 -1
- package/dist/units/index.cjs +2 -0
- package/dist/units/index.cjs.map +1 -1
- package/dist/units/index.js +3 -0
- package/dist/units/index.js.map +1 -1
- package/dist/units/resolvers.cjs +11 -0
- package/dist/units/resolvers.cjs.map +1 -1
- package/dist/units/resolvers.d.ts +5 -0
- package/dist/units/resolvers.js +11 -0
- package/dist/units/resolvers.js.map +1 -1
- package/package.json +10 -9
- package/src/data-provider/store.ts +1 -0
- package/src/maps/_shared/styles.ts +10 -3
- package/src/maps/index.ts +1 -0
- package/src/maps/unit-map.stories.ts +64 -0
- package/src/maps/units-overlay/index.ts +336 -0
- package/src/units/colors.ts +137 -25
- package/src/units/resolvers.ts +16 -0
|
@@ -3,7 +3,12 @@ import { buildGeoJSONSource } from "@macrostrat/mapbox-utils";
|
|
|
3
3
|
function buildColumnsStyle(color) {
|
|
4
4
|
let columnColor = color ?? getCSSVariable("--text-subtle-color", "black");
|
|
5
5
|
const columnSelectedColor = getCSSVariable("--selection-color", "purple");
|
|
6
|
-
columnColor = [
|
|
6
|
+
columnColor = [
|
|
7
|
+
"coalesce",
|
|
8
|
+
["feature-state", "color"],
|
|
9
|
+
["get", "color"],
|
|
10
|
+
columnColor
|
|
11
|
+
];
|
|
7
12
|
return {
|
|
8
13
|
sources: {
|
|
9
14
|
columns: buildGeoJSONSource()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sources":["../../../src/maps/_shared/styles.ts"],"sourcesContent":["import { getCSSVariable } from \"@macrostrat/color-utils\";\nimport { buildGeoJSONSource } from \"@macrostrat/mapbox-utils\";\nimport type { Style } from \"mapbox-gl\";\n\nexport function buildColumnsStyle(color: string): Style {\n let columnColor
|
|
1
|
+
{"version":3,"file":"styles.js","sources":["../../../src/maps/_shared/styles.ts"],"sourcesContent":["import { getCSSVariable } from \"@macrostrat/color-utils\";\nimport { buildGeoJSONSource } from \"@macrostrat/mapbox-utils\";\nimport type { Style } from \"mapbox-gl\";\n\nexport function buildColumnsStyle(color: string): Style {\n let columnColor: any =\n color ?? getCSSVariable(\"--text-subtle-color\", \"black\");\n const columnSelectedColor = getCSSVariable(\"--selection-color\", \"purple\");\n\n // If color is in the feature state or geojson properties, use that as second choice\n\n columnColor = [\n \"coalesce\",\n [\"feature-state\", \"color\"],\n [\"get\", \"color\"],\n columnColor,\n ];\n\n return {\n sources: {\n columns: buildGeoJSONSource(),\n },\n version: 8,\n layers: [\n {\n id: \"columns-fill\",\n type: \"fill\",\n source: \"columns\",\n paint: {\n \"fill-color\": columnColor,\n \"fill-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"selected\"], false],\n 0.5,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.3,\n 0.1,\n ],\n },\n },\n {\n id: \"columns-line\",\n type: \"line\",\n source: \"columns\",\n paint: {\n \"line-color\": columnColor,\n \"line-width\": 2,\n \"line-opacity\": 0.5,\n },\n },\n {\n id: \"columns-points\",\n type: \"circle\",\n source: \"columns\",\n paint: {\n \"circle-radius\": 4,\n \"circle-color\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"selected\"], false],\n columnSelectedColor,\n columnColor,\n ],\n \"circle-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"selected\"], false],\n 1,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.7,\n 0.5,\n ],\n },\n filter: [\"==\", \"$type\", \"Point\"],\n },\n ],\n };\n}\n"],"names":[],"mappings":";;AAIO,SAAS,kBAAkB,OAAsB;AACtD,MAAI,cACF,SAAS,eAAe,uBAAuB,OAAO;AACxD,QAAM,sBAAsB,eAAe,qBAAqB,QAAQ;AAIxE,gBAAc;AAAA,IACZ;AAAA,IACA,CAAC,iBAAiB,OAAO;AAAA,IACzB,CAAC,OAAO,OAAO;AAAA,IACf;AAAA,EAAA;AAGF,SAAO;AAAA,IACL,SAAS;AAAA,MACP,SAAS,mBAAA;AAAA,IAAmB;AAAA,IAE9B,SAAS;AAAA,IACT,QAAQ;AAAA,MACN;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,UACd,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,UAAU,GAAG,KAAK;AAAA,YAChD;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,MAEF;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,UACd,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,MAEF;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,UAAU,GAAG,KAAK;AAAA,YAChD;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,kBAAkB;AAAA,YAChB;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,UAAU,GAAG,KAAK;AAAA,YAChD;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QAEF,QAAQ,CAAC,MAAM,SAAS,OAAO;AAAA,MAAA;AAAA,IACjC;AAAA,EACF;AAEJ;"}
|
|
@@ -4,7 +4,7 @@ interface KeyboardNavProps {
|
|
|
4
4
|
export declare function ColumnKeyboardNavigation(props: KeyboardNavProps): any;
|
|
5
5
|
export declare function buildKeyboardNavigationStyle(color?: string): {
|
|
6
6
|
sources: {
|
|
7
|
-
"column-links":
|
|
7
|
+
"column-links": import('mapbox-gl').GeoJSONSourceSpecification;
|
|
8
8
|
};
|
|
9
9
|
layers: ({
|
|
10
10
|
id: string;
|
package/dist/maps/index.d.ts
CHANGED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const dataProvider = require("@macrostrat/data-provider");
|
|
4
|
+
const uiComponents = require("@macrostrat/ui-components");
|
|
5
|
+
const mapboxReact = require("@macrostrat/mapbox-react");
|
|
6
|
+
const React = require("react");
|
|
7
|
+
const mapboxUtils = require("@macrostrat/mapbox-utils");
|
|
8
|
+
const resolvers = require("../../units/resolvers.cjs");
|
|
9
|
+
const mapStyles = require("@macrostrat/map-styles");
|
|
10
|
+
const colorUtils = require("@macrostrat/color-utils");
|
|
11
|
+
const pMap = require("p-map");
|
|
12
|
+
const colors = require("../../units/colors.cjs");
|
|
13
|
+
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
|
14
|
+
const pMap__default = /* @__PURE__ */ _interopDefault(pMap);
|
|
15
|
+
function MacrostratUnitsOverlay(props) {
|
|
16
|
+
const { time, ageSpan = 0.05, patterns = false } = props;
|
|
17
|
+
const lithMap = dataProvider.useLithologies();
|
|
18
|
+
mapboxReact.useMapStyleOperator(
|
|
19
|
+
(map) => {
|
|
20
|
+
if (!patterns) return;
|
|
21
|
+
mapStyles.setupStyleImageManager(map, { verbose: false });
|
|
22
|
+
},
|
|
23
|
+
[patterns]
|
|
24
|
+
);
|
|
25
|
+
const params = React.useMemo(() => {
|
|
26
|
+
let project;
|
|
27
|
+
if (Number.isFinite(props.project)) {
|
|
28
|
+
project = [props.project];
|
|
29
|
+
} else if (!Array.isArray(props.project)) {
|
|
30
|
+
project = void 0;
|
|
31
|
+
}
|
|
32
|
+
const projectCompat = project != null && project.length > 0 ? project[0] : void 0;
|
|
33
|
+
return {
|
|
34
|
+
age_bottom: time + ageSpan / 2,
|
|
35
|
+
age_top: time - ageSpan / 2,
|
|
36
|
+
response: "long",
|
|
37
|
+
project: projectCompat
|
|
38
|
+
};
|
|
39
|
+
}, [time, ageSpan, props.project]);
|
|
40
|
+
const units = uiComponents.useAPIResult("/units", params);
|
|
41
|
+
const columns = dataProvider.useMacrostratColumns(params.project, false);
|
|
42
|
+
mapboxReact.useMapStyleOperator(
|
|
43
|
+
(map) => {
|
|
44
|
+
if (columns == null) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const data = {
|
|
48
|
+
type: "FeatureCollection",
|
|
49
|
+
features: columns
|
|
50
|
+
};
|
|
51
|
+
mapboxUtils.setGeoJSON(map, "columns", data);
|
|
52
|
+
},
|
|
53
|
+
[columns]
|
|
54
|
+
);
|
|
55
|
+
mapboxReact.useMapStyleOperator(
|
|
56
|
+
(map) => {
|
|
57
|
+
if (units == null || columns == null || lithMap == null) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const getColorForLithology = (data) => {
|
|
61
|
+
return lithMap?.get(data.lith_id)?.color ?? null;
|
|
62
|
+
};
|
|
63
|
+
const unitsMap = postProcessUnits(units, getColorForLithology);
|
|
64
|
+
handleUnitsLayerUpdate(map, unitsMap, columns);
|
|
65
|
+
if (patterns) {
|
|
66
|
+
handlePatternOverlayUpdate(
|
|
67
|
+
map,
|
|
68
|
+
unitsMap,
|
|
69
|
+
columns,
|
|
70
|
+
getColorForLithology
|
|
71
|
+
).then(() => {
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
[units, lithMap, columns, patterns]
|
|
76
|
+
);
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function handleUnitsLayerUpdate(map, unitsMap, columns) {
|
|
80
|
+
for (const column of columns) {
|
|
81
|
+
const col_id = column.properties.col_id;
|
|
82
|
+
const info = unitsMap.get(Number(col_id));
|
|
83
|
+
const color = info?.color;
|
|
84
|
+
map.setFeatureState(
|
|
85
|
+
{ source: "columns", id: col_id },
|
|
86
|
+
{
|
|
87
|
+
color,
|
|
88
|
+
shown: color != null
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async function handlePatternOverlayUpdate(map, unitsMap, columns, getColor) {
|
|
94
|
+
const colsWithPatterns = [];
|
|
95
|
+
const patternIDs = /* @__PURE__ */ new Set();
|
|
96
|
+
for (const column of columns) {
|
|
97
|
+
const col_id = column.properties.col_id;
|
|
98
|
+
const info = unitsMap.get(Number(col_id));
|
|
99
|
+
if (info == null) continue;
|
|
100
|
+
const pattern = getPatternSpec(info?.liths, getColor);
|
|
101
|
+
if (pattern == null) continue;
|
|
102
|
+
colsWithPatterns.push({
|
|
103
|
+
type: "Feature",
|
|
104
|
+
geometry: column.geometry,
|
|
105
|
+
properties: {
|
|
106
|
+
col_id,
|
|
107
|
+
pattern
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
patternIDs.add(pattern);
|
|
111
|
+
}
|
|
112
|
+
const patternsToLoad = patternIDs.values().filter((d) => !map.hasImage(d));
|
|
113
|
+
const mapper = async (patternID) => {
|
|
114
|
+
try {
|
|
115
|
+
await mapStyles.loadStyleImage(map, patternID, { pixelRatio: 10 });
|
|
116
|
+
} catch (e) {
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
await pMap__default.default(patternsToLoad, mapper, { concurrency: 5 });
|
|
120
|
+
const patternData = {
|
|
121
|
+
type: "FeatureCollection",
|
|
122
|
+
features: colsWithPatterns
|
|
123
|
+
};
|
|
124
|
+
mapboxUtils.setGeoJSON(map, "column-patterns", patternData);
|
|
125
|
+
}
|
|
126
|
+
const cachedColors = /* @__PURE__ */ new Map();
|
|
127
|
+
function getDarkenedColor(color) {
|
|
128
|
+
if (cachedColors.has(color)) {
|
|
129
|
+
return cachedColors.get(color);
|
|
130
|
+
}
|
|
131
|
+
const c1 = colorUtils.asChromaColor(color).set("hsl.l", 0.4).set("hsl.s", 0.8).hex();
|
|
132
|
+
cachedColors.set(color, c1);
|
|
133
|
+
return c1;
|
|
134
|
+
}
|
|
135
|
+
function postProcessUnits(units, getColor) {
|
|
136
|
+
const unitsByColumn = /* @__PURE__ */ new Map();
|
|
137
|
+
for (const unit of units) {
|
|
138
|
+
const col_id = Number(unit.col_id);
|
|
139
|
+
if (!unitsByColumn.has(col_id)) {
|
|
140
|
+
unitsByColumn.set(col_id, [unit]);
|
|
141
|
+
} else {
|
|
142
|
+
unitsByColumn.set(col_id, [...unitsByColumn.get(col_id), unit]);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const res = /* @__PURE__ */ new Map();
|
|
146
|
+
for (const [col_id, unitList] of unitsByColumn.entries()) {
|
|
147
|
+
const liths = colors.flattenLithologies(unitList.map((u) => u.lith));
|
|
148
|
+
res.set(col_id, {
|
|
149
|
+
col_id,
|
|
150
|
+
units: unitList,
|
|
151
|
+
liths,
|
|
152
|
+
color: colors.getMixedColorForData(liths, getColor)
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
return res;
|
|
156
|
+
}
|
|
157
|
+
function getPatternSpec(liths, getColor) {
|
|
158
|
+
const patternData = resolvers.getBestFGDCPatternForLithologyList(liths);
|
|
159
|
+
if (patternData == null) return null;
|
|
160
|
+
let { patternID, lith } = patternData;
|
|
161
|
+
const color = getDarkenedColor(getColor(lith));
|
|
162
|
+
return `fgdc:${patternID}:${color}:transparent`;
|
|
163
|
+
}
|
|
164
|
+
function buildUnitsStyle(opts = {}) {
|
|
165
|
+
const { color = null, patterns = false } = opts;
|
|
166
|
+
let columnBaseColor = color ?? colorUtils.getCSSVariable("--text-subtle-color", "black");
|
|
167
|
+
colorUtils.getCSSVariable("--selection-color", "purple");
|
|
168
|
+
let columnColor = [
|
|
169
|
+
"coalesce",
|
|
170
|
+
["feature-state", "color"],
|
|
171
|
+
["get", "color"],
|
|
172
|
+
columnBaseColor
|
|
173
|
+
];
|
|
174
|
+
const baseStyle = {
|
|
175
|
+
sources: {
|
|
176
|
+
columns: mapboxUtils.buildGeoJSONSource()
|
|
177
|
+
},
|
|
178
|
+
version: 8,
|
|
179
|
+
layers: [
|
|
180
|
+
{
|
|
181
|
+
id: "columns-fill",
|
|
182
|
+
type: "fill",
|
|
183
|
+
source: "columns",
|
|
184
|
+
paint: {
|
|
185
|
+
"fill-color": columnColor,
|
|
186
|
+
"fill-opacity": [
|
|
187
|
+
"case",
|
|
188
|
+
["boolean", ["feature-state", "shown"], false],
|
|
189
|
+
0.8,
|
|
190
|
+
["boolean", ["feature-state", "hover"], false],
|
|
191
|
+
0.3,
|
|
192
|
+
0.1
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: "columns-line",
|
|
198
|
+
type: "line",
|
|
199
|
+
source: "columns",
|
|
200
|
+
paint: {
|
|
201
|
+
"line-color": columnColor,
|
|
202
|
+
"line-width": 1,
|
|
203
|
+
"line-opacity": 0.5
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: "columns-points",
|
|
208
|
+
type: "circle",
|
|
209
|
+
source: "columns",
|
|
210
|
+
paint: {
|
|
211
|
+
"circle-radius": 4,
|
|
212
|
+
"circle-color": [
|
|
213
|
+
"case",
|
|
214
|
+
["boolean", ["feature-state", "shown"], false],
|
|
215
|
+
columnColor,
|
|
216
|
+
columnBaseColor
|
|
217
|
+
],
|
|
218
|
+
"circle-opacity": [
|
|
219
|
+
"case",
|
|
220
|
+
["boolean", ["feature-state", "shown"], false],
|
|
221
|
+
0.8,
|
|
222
|
+
["boolean", ["feature-state", "hover"], false],
|
|
223
|
+
0.3,
|
|
224
|
+
0.1
|
|
225
|
+
]
|
|
226
|
+
},
|
|
227
|
+
filter: ["==", "$type", "Point"]
|
|
228
|
+
}
|
|
229
|
+
]
|
|
230
|
+
};
|
|
231
|
+
if (!patterns) {
|
|
232
|
+
return baseStyle;
|
|
233
|
+
}
|
|
234
|
+
const patternStyle = {
|
|
235
|
+
sources: {
|
|
236
|
+
"column-patterns": mapboxUtils.buildGeoJSONSource()
|
|
237
|
+
},
|
|
238
|
+
layers: [
|
|
239
|
+
{
|
|
240
|
+
id: "columns-fill-pattern",
|
|
241
|
+
type: "fill",
|
|
242
|
+
source: "column-patterns",
|
|
243
|
+
paint: {
|
|
244
|
+
"fill-pattern": ["get", "pattern"],
|
|
245
|
+
"fill-opacity": 1
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
]
|
|
249
|
+
};
|
|
250
|
+
return mapboxUtils.mergeStyles(baseStyle, patternStyle);
|
|
251
|
+
}
|
|
252
|
+
exports.MacrostratUnitsOverlay = MacrostratUnitsOverlay;
|
|
253
|
+
exports.buildUnitsStyle = buildUnitsStyle;
|
|
254
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/maps/units-overlay/index.ts"],"sourcesContent":["import {\n useLithologies,\n useMacrostratColumns,\n} from \"@macrostrat/data-provider\";\nimport { useAPIResult } from \"@macrostrat/ui-components\";\nimport { useMapStyleOperator } from \"@macrostrat/mapbox-react\";\nimport { FeatureCollection } from \"geojson\";\nimport { useMemo } from \"react\";\nimport { mergeStyles, setGeoJSON } from \"@macrostrat/mapbox-utils\";\nimport { UnitLithology, UnitLong } from \"@macrostrat/api-types\";\nimport { flattenLithologies, getMixedColorForData } from \"../../units\";\nimport { getBestFGDCPatternForLithologyList } from \"../../units/resolvers\";\nimport {\n setupStyleImageManager,\n loadStyleImage,\n StyleFragment,\n} from \"@macrostrat/map-styles\";\nimport { asChromaColor, getCSSVariable } from \"@macrostrat/color-utils\";\nimport { buildGeoJSONSource } from \"@macrostrat/mapbox-utils\";\nimport pMap from \"p-map\";\n\nexport interface UnitsOverlayProps {\n time: number;\n ageSpan?: number;\n project?: number | number[];\n patterns?: boolean;\n}\n\nexport function MacrostratUnitsOverlay(props: UnitsOverlayProps) {\n const { time, ageSpan = 0.05, patterns = false } = props;\n const lithMap = useLithologies();\n\n useMapStyleOperator(\n (map) => {\n if (!patterns) return;\n setupStyleImageManager(map, { verbose: false });\n },\n [patterns],\n );\n\n const params = useMemo(() => {\n let project: number[] | undefined;\n if (Number.isFinite(props.project)) {\n project = [props.project as number];\n } else if (!Array.isArray(props.project)) {\n project = undefined;\n }\n // Project can only be a single project for now\n const projectCompat =\n project != null && project.length > 0 ? project[0] : undefined;\n\n return {\n age_bottom: time + ageSpan / 2,\n age_top: time - ageSpan / 2,\n response: \"long\",\n project: projectCompat,\n };\n }, [time, ageSpan, props.project]);\n\n const units: UnitLong[] = useAPIResult(\"/units\", params);\n const columns = useMacrostratColumns(params.project, false);\n\n // Set up basic columns layer\n useMapStyleOperator(\n (map) => {\n if (columns == null) {\n return;\n }\n const data: FeatureCollection = {\n type: \"FeatureCollection\",\n features: columns,\n };\n setGeoJSON(map, \"columns\", data);\n },\n [columns],\n );\n\n useMapStyleOperator(\n (map) => {\n if (units == null || columns == null || lithMap == null) {\n return;\n }\n\n const getColorForLithology = (data: UnitLithology): string | null => {\n return lithMap?.get(data.lith_id)?.color ?? null;\n };\n\n const unitsMap = postProcessUnits(units, getColorForLithology);\n handleUnitsLayerUpdate(map, unitsMap, columns);\n if (patterns) {\n handlePatternOverlayUpdate(\n map,\n unitsMap,\n columns,\n getColorForLithology,\n ).then(() => {});\n }\n },\n [units, lithMap, columns, patterns],\n );\n\n return null;\n}\n\nfunction handleUnitsLayerUpdate(\n map,\n unitsMap: Map<number, UnitsDisplayInfo>,\n columns: any[],\n) {\n // Update feature states\n for (const column of columns) {\n const col_id = column.properties.col_id;\n const info = unitsMap.get(Number(col_id));\n const color = info?.color;\n map.setFeatureState(\n { source: \"columns\", id: col_id },\n {\n color,\n shown: color != null,\n },\n );\n }\n}\n\nasync function handlePatternOverlayUpdate(\n map,\n unitsMap: Map<number, UnitsDisplayInfo>,\n columns: any[],\n getColor: LithologyColorGetter,\n) {\n // synthesize patterns not yet in cache\n\n const colsWithPatterns = [];\n const patternIDs = new Set<string>();\n // Update feature states\n for (const column of columns) {\n const col_id = column.properties.col_id;\n const info = unitsMap.get(Number(col_id));\n if (info == null) continue;\n const pattern = getPatternSpec(info?.liths, getColor);\n if (pattern == null) continue;\n\n colsWithPatterns.push({\n type: \"Feature\",\n geometry: column.geometry,\n properties: {\n col_id,\n pattern,\n },\n });\n patternIDs.add(pattern);\n }\n\n const patternsToLoad = patternIDs.values().filter((d) => !map.hasImage(d));\n\n const mapper = async (patternID) => {\n try {\n await loadStyleImage(map, patternID, { pixelRatio: 10 });\n } catch (e) {}\n };\n // Load all pattern images\n await pMap(patternsToLoad, mapper, { concurrency: 5 });\n\n // Set data for pattern layer\n // This is inefficient but the only way to set per-feature patterns in Mapbox\n const patternData: FeatureCollection = {\n type: \"FeatureCollection\",\n features: colsWithPatterns,\n };\n setGeoJSON(map, \"column-patterns\", patternData);\n}\n\nconst cachedColors = new Map<string, string>();\n\nfunction getDarkenedColor(color: string): string {\n /** Memoized function to get a darkened version of a color for pattern use */\n if (cachedColors.has(color)) {\n return cachedColors.get(color);\n }\n const c1 = asChromaColor(color).set(\"hsl.l\", 0.4).set(\"hsl.s\", 0.8).hex();\n cachedColors.set(color, c1);\n return c1;\n}\n\ninterface UnitsDisplayInfo {\n col_id: number;\n units: UnitLong[];\n color: string;\n liths: UnitLithology[];\n}\n\ntype LithologyColorGetter = (val: UnitLithology) => string | null;\n\nfunction postProcessUnits(\n units: UnitLong[],\n getColor: LithologyColorGetter,\n): Map<number, UnitsDisplayInfo> {\n // Group by col_id\n const unitsByColumn: Map<number, UnitLong[]> = new Map();\n for (const unit of units) {\n const col_id = Number(unit.col_id);\n if (!unitsByColumn.has(col_id)) {\n unitsByColumn.set(col_id, [unit]);\n } else {\n unitsByColumn.set(col_id, [...unitsByColumn.get(col_id), unit]);\n }\n }\n\n // Summarize units for display\n const res = new Map<number, UnitsDisplayInfo>();\n for (const [col_id, unitList] of unitsByColumn.entries()) {\n const liths = flattenLithologies(unitList.map((u) => u.lith));\n res.set(col_id, {\n col_id,\n units: unitList,\n liths,\n color: getMixedColorForData(liths, getColor),\n });\n }\n\n return res;\n}\n\nfunction getPatternSpec(\n liths: UnitLithology[],\n getColor: LithologyColorGetter,\n): string | null {\n const patternData = getBestFGDCPatternForLithologyList(liths);\n if (patternData == null) return null;\n let { patternID, lith } = patternData;\n const color = getDarkenedColor(getColor(lith));\n return `fgdc:${patternID}:${color}:transparent`;\n}\n\ntype UnitsStyleOptions = {\n color?: string;\n patterns?: boolean;\n};\n\nexport function buildUnitsStyle(opts: UnitsStyleOptions = {}): StyleFragment {\n const { color = null, patterns = false } = opts;\n\n let columnBaseColor: any =\n color ?? getCSSVariable(\"--text-subtle-color\", \"black\");\n const columnSelectedColor = getCSSVariable(\"--selection-color\", \"purple\");\n\n // If color is in the feature state or geojson properties, use that as second choice\n\n let columnColor: any = [\n \"coalesce\",\n [\"feature-state\", \"color\"],\n [\"get\", \"color\"],\n columnBaseColor,\n ];\n\n const baseStyle: StyleFragment = {\n sources: {\n columns: buildGeoJSONSource(),\n },\n version: 8,\n layers: [\n {\n id: \"columns-fill\",\n type: \"fill\",\n source: \"columns\",\n paint: {\n \"fill-color\": columnColor,\n \"fill-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n 0.8,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.3,\n 0.1,\n ],\n },\n },\n {\n id: \"columns-line\",\n type: \"line\",\n source: \"columns\",\n paint: {\n \"line-color\": columnColor,\n \"line-width\": 1,\n \"line-opacity\": 0.5,\n },\n },\n {\n id: \"columns-points\",\n type: \"circle\",\n source: \"columns\",\n paint: {\n \"circle-radius\": 4,\n \"circle-color\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n columnColor,\n columnBaseColor,\n ],\n \"circle-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n 0.8,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.3,\n 0.1,\n ],\n },\n filter: [\"==\", \"$type\", \"Point\"],\n },\n ],\n };\n\n if (!patterns) {\n return baseStyle;\n }\n\n const patternStyle: StyleFragment = {\n sources: {\n \"column-patterns\": buildGeoJSONSource(),\n },\n layers: [\n {\n id: \"columns-fill-pattern\",\n type: \"fill\",\n source: \"column-patterns\",\n paint: {\n \"fill-pattern\": [\"get\", \"pattern\"],\n \"fill-opacity\": 1,\n },\n },\n ],\n };\n\n return mergeStyles(baseStyle, patternStyle);\n}\n"],"names":["useLithologies","useMapStyleOperator","setupStyleImageManager","useMemo","useAPIResult","useMacrostratColumns","setGeoJSON","loadStyleImage","pMap","asChromaColor","flattenLithologies","getMixedColorForData","getBestFGDCPatternForLithologyList","getCSSVariable","buildGeoJSONSource","mergeStyles"],"mappings":";;;;;;;;;;;;;;AA4BO,SAAS,uBAAuB,OAA0B;AAC/D,QAAM,EAAE,MAAM,UAAU,MAAM,WAAW,UAAU;AACnD,QAAM,UAAUA,aAAAA,eAAA;AAEhBC,cAAAA;AAAAA,IACE,CAAC,QAAQ;AACP,UAAI,CAAC,SAAU;AACfC,gBAAAA,uBAAuB,KAAK,EAAE,SAAS,MAAA,CAAO;AAAA,IAChD;AAAA,IACA,CAAC,QAAQ;AAAA,EAAA;AAGX,QAAM,SAASC,MAAAA,QAAQ,MAAM;AAC3B,QAAI;AACJ,QAAI,OAAO,SAAS,MAAM,OAAO,GAAG;AAClC,gBAAU,CAAC,MAAM,OAAiB;AAAA,IACpC,WAAW,CAAC,MAAM,QAAQ,MAAM,OAAO,GAAG;AACxC,gBAAU;AAAA,IACZ;AAEA,UAAM,gBACJ,WAAW,QAAQ,QAAQ,SAAS,IAAI,QAAQ,CAAC,IAAI;AAEvD,WAAO;AAAA,MACL,YAAY,OAAO,UAAU;AAAA,MAC7B,SAAS,OAAO,UAAU;AAAA,MAC1B,UAAU;AAAA,MACV,SAAS;AAAA,IAAA;AAAA,EAEb,GAAG,CAAC,MAAM,SAAS,MAAM,OAAO,CAAC;AAEjC,QAAM,QAAoBC,aAAAA,aAAa,UAAU,MAAM;AACvD,QAAM,UAAUC,aAAAA,qBAAqB,OAAO,SAAS,KAAK;AAG1DJ,cAAAA;AAAAA,IACE,CAAC,QAAQ;AACP,UAAI,WAAW,MAAM;AACnB;AAAA,MACF;AACA,YAAM,OAA0B;AAAA,QAC9B,MAAM;AAAA,QACN,UAAU;AAAA,MAAA;AAEZK,6BAAW,KAAK,WAAW,IAAI;AAAA,IACjC;AAAA,IACA,CAAC,OAAO;AAAA,EAAA;AAGVL,cAAAA;AAAAA,IACE,CAAC,QAAQ;AACP,UAAI,SAAS,QAAQ,WAAW,QAAQ,WAAW,MAAM;AACvD;AAAA,MACF;AAEA,YAAM,uBAAuB,CAAC,SAAuC;AACnE,eAAO,SAAS,IAAI,KAAK,OAAO,GAAG,SAAS;AAAA,MAC9C;AAEA,YAAM,WAAW,iBAAiB,OAAO,oBAAoB;AAC7D,6BAAuB,KAAK,UAAU,OAAO;AAC7C,UAAI,UAAU;AACZ;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA,EACA,KAAK,MAAM;AAAA,QAAC,CAAC;AAAA,MACjB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,SAAS,SAAS,QAAQ;AAAA,EAAA;AAGpC,SAAO;AACT;AAEA,SAAS,uBACP,KACA,UACA,SACA;AAEA,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,OAAO,WAAW;AACjC,UAAM,OAAO,SAAS,IAAI,OAAO,MAAM,CAAC;AACxC,UAAM,QAAQ,MAAM;AACpB,QAAI;AAAA,MACF,EAAE,QAAQ,WAAW,IAAI,OAAA;AAAA,MACzB;AAAA,QACE;AAAA,QACA,OAAO,SAAS;AAAA,MAAA;AAAA,IAClB;AAAA,EAEJ;AACF;AAEA,eAAe,2BACb,KACA,UACA,SACA,UACA;AAGA,QAAM,mBAAmB,CAAA;AACzB,QAAM,iCAAiB,IAAA;AAEvB,aAAW,UAAU,SAAS;AAC5B,UAAM,SAAS,OAAO,WAAW;AACjC,UAAM,OAAO,SAAS,IAAI,OAAO,MAAM,CAAC;AACxC,QAAI,QAAQ,KAAM;AAClB,UAAM,UAAU,eAAe,MAAM,OAAO,QAAQ;AACpD,QAAI,WAAW,KAAM;AAErB,qBAAiB,KAAK;AAAA,MACpB,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,IACF,CACD;AACD,eAAW,IAAI,OAAO;AAAA,EACxB;AAEA,QAAM,iBAAiB,WAAW,OAAA,EAAS,OAAO,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,CAAC;AAEzE,QAAM,SAAS,OAAO,cAAc;AAClC,QAAI;AACF,YAAMM,UAAAA,eAAe,KAAK,WAAW,EAAE,YAAY,IAAI;AAAA,IACzD,SAAS,GAAG;AAAA,IAAC;AAAA,EACf;AAEA,QAAMC,cAAAA,QAAK,gBAAgB,QAAQ,EAAE,aAAa,GAAG;AAIrD,QAAM,cAAiC;AAAA,IACrC,MAAM;AAAA,IACN,UAAU;AAAA,EAAA;AAEZF,yBAAW,KAAK,mBAAmB,WAAW;AAChD;AAEA,MAAM,mCAAmB,IAAA;AAEzB,SAAS,iBAAiB,OAAuB;AAE/C,MAAI,aAAa,IAAI,KAAK,GAAG;AAC3B,WAAO,aAAa,IAAI,KAAK;AAAA,EAC/B;AACA,QAAM,KAAKG,WAAAA,cAAc,KAAK,EAAE,IAAI,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,EAAE,IAAA;AACpE,eAAa,IAAI,OAAO,EAAE;AAC1B,SAAO;AACT;AAWA,SAAS,iBACP,OACA,UAC+B;AAE/B,QAAM,oCAA6C,IAAA;AACnD,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,OAAO,KAAK,MAAM;AACjC,QAAI,CAAC,cAAc,IAAI,MAAM,GAAG;AAC9B,oBAAc,IAAI,QAAQ,CAAC,IAAI,CAAC;AAAA,IAClC,OAAO;AACL,oBAAc,IAAI,QAAQ,CAAC,GAAG,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AAGA,QAAM,0BAAU,IAAA;AAChB,aAAW,CAAC,QAAQ,QAAQ,KAAK,cAAc,WAAW;AACxD,UAAM,QAAQC,OAAAA,mBAAmB,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC5D,QAAI,IAAI,QAAQ;AAAA,MACd;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA,OAAOC,OAAAA,qBAAqB,OAAO,QAAQ;AAAA,IAAA,CAC5C;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eACP,OACA,UACe;AACf,QAAM,cAAcC,UAAAA,mCAAmC,KAAK;AAC5D,MAAI,eAAe,KAAM,QAAO;AAChC,MAAI,EAAE,WAAW,KAAA,IAAS;AAC1B,QAAM,QAAQ,iBAAiB,SAAS,IAAI,CAAC;AAC7C,SAAO,QAAQ,SAAS,IAAI,KAAK;AACnC;AAOO,SAAS,gBAAgB,OAA0B,IAAmB;AAC3E,QAAM,EAAE,QAAQ,MAAM,WAAW,UAAU;AAE3C,MAAI,kBACF,SAASC,0BAAe,uBAAuB,OAAO;AAC5BA,aAAAA,eAAe,qBAAqB,QAAQ;AAIxE,MAAI,cAAmB;AAAA,IACrB;AAAA,IACA,CAAC,iBAAiB,OAAO;AAAA,IACzB,CAAC,OAAO,OAAO;AAAA,IACf;AAAA,EAAA;AAGF,QAAM,YAA2B;AAAA,IAC/B,SAAS;AAAA,MACP,SAASC,YAAAA,mBAAA;AAAA,IAAmB;AAAA,IAE9B,SAAS;AAAA,IACT,QAAQ;AAAA,MACN;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,UACd,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,MACF;AAAA,MAEF;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,UACd,cAAc;AAAA,UACd,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,MAEF;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,YACd;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA;AAAA,UAAA;AAAA,UAEF,kBAAkB;AAAA,YAChB;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA,CAAC,WAAW,CAAC,iBAAiB,OAAO,GAAG,KAAK;AAAA,YAC7C;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QAEF,QAAQ,CAAC,MAAM,SAAS,OAAO;AAAA,MAAA;AAAA,IACjC;AAAA,EACF;AAGF,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,eAA8B;AAAA,IAClC,SAAS;AAAA,MACP,mBAAmBA,YAAAA,mBAAA;AAAA,IAAmB;AAAA,IAExC,QAAQ;AAAA,MACN;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,gBAAgB,CAAC,OAAO,SAAS;AAAA,UACjC,gBAAgB;AAAA,QAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGF,SAAOC,YAAAA,YAAY,WAAW,YAAY;AAC5C;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { StyleFragment } from '@macrostrat/map-styles';
|
|
2
|
+
export interface UnitsOverlayProps {
|
|
3
|
+
time: number;
|
|
4
|
+
ageSpan?: number;
|
|
5
|
+
project?: number | number[];
|
|
6
|
+
patterns?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function MacrostratUnitsOverlay(props: UnitsOverlayProps): any;
|
|
9
|
+
type UnitsStyleOptions = {
|
|
10
|
+
color?: string;
|
|
11
|
+
patterns?: boolean;
|
|
12
|
+
};
|
|
13
|
+
export declare function buildUnitsStyle(opts?: UnitsStyleOptions): StyleFragment;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { useLithologies, useMacrostratColumns } from "@macrostrat/data-provider";
|
|
2
|
+
import { useAPIResult } from "@macrostrat/ui-components";
|
|
3
|
+
import { useMapStyleOperator } from "@macrostrat/mapbox-react";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { setGeoJSON, buildGeoJSONSource, mergeStyles } from "@macrostrat/mapbox-utils";
|
|
6
|
+
import { getBestFGDCPatternForLithologyList } from "../../units/resolvers.js";
|
|
7
|
+
import { setupStyleImageManager, loadStyleImage } from "@macrostrat/map-styles";
|
|
8
|
+
import { getCSSVariable, asChromaColor } from "@macrostrat/color-utils";
|
|
9
|
+
import pMap from "p-map";
|
|
10
|
+
import { flattenLithologies, getMixedColorForData } from "../../units/colors.js";
|
|
11
|
+
function MacrostratUnitsOverlay(props) {
|
|
12
|
+
const { time, ageSpan = 0.05, patterns = false } = props;
|
|
13
|
+
const lithMap = useLithologies();
|
|
14
|
+
useMapStyleOperator(
|
|
15
|
+
(map) => {
|
|
16
|
+
if (!patterns) return;
|
|
17
|
+
setupStyleImageManager(map, { verbose: false });
|
|
18
|
+
},
|
|
19
|
+
[patterns]
|
|
20
|
+
);
|
|
21
|
+
const params = useMemo(() => {
|
|
22
|
+
let project;
|
|
23
|
+
if (Number.isFinite(props.project)) {
|
|
24
|
+
project = [props.project];
|
|
25
|
+
} else if (!Array.isArray(props.project)) {
|
|
26
|
+
project = void 0;
|
|
27
|
+
}
|
|
28
|
+
const projectCompat = project != null && project.length > 0 ? project[0] : void 0;
|
|
29
|
+
return {
|
|
30
|
+
age_bottom: time + ageSpan / 2,
|
|
31
|
+
age_top: time - ageSpan / 2,
|
|
32
|
+
response: "long",
|
|
33
|
+
project: projectCompat
|
|
34
|
+
};
|
|
35
|
+
}, [time, ageSpan, props.project]);
|
|
36
|
+
const units = useAPIResult("/units", params);
|
|
37
|
+
const columns = useMacrostratColumns(params.project, false);
|
|
38
|
+
useMapStyleOperator(
|
|
39
|
+
(map) => {
|
|
40
|
+
if (columns == null) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const data = {
|
|
44
|
+
type: "FeatureCollection",
|
|
45
|
+
features: columns
|
|
46
|
+
};
|
|
47
|
+
setGeoJSON(map, "columns", data);
|
|
48
|
+
},
|
|
49
|
+
[columns]
|
|
50
|
+
);
|
|
51
|
+
useMapStyleOperator(
|
|
52
|
+
(map) => {
|
|
53
|
+
if (units == null || columns == null || lithMap == null) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const getColorForLithology = (data) => {
|
|
57
|
+
return lithMap?.get(data.lith_id)?.color ?? null;
|
|
58
|
+
};
|
|
59
|
+
const unitsMap = postProcessUnits(units, getColorForLithology);
|
|
60
|
+
handleUnitsLayerUpdate(map, unitsMap, columns);
|
|
61
|
+
if (patterns) {
|
|
62
|
+
handlePatternOverlayUpdate(
|
|
63
|
+
map,
|
|
64
|
+
unitsMap,
|
|
65
|
+
columns,
|
|
66
|
+
getColorForLithology
|
|
67
|
+
).then(() => {
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
[units, lithMap, columns, patterns]
|
|
72
|
+
);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
function handleUnitsLayerUpdate(map, unitsMap, columns) {
|
|
76
|
+
for (const column of columns) {
|
|
77
|
+
const col_id = column.properties.col_id;
|
|
78
|
+
const info = unitsMap.get(Number(col_id));
|
|
79
|
+
const color = info?.color;
|
|
80
|
+
map.setFeatureState(
|
|
81
|
+
{ source: "columns", id: col_id },
|
|
82
|
+
{
|
|
83
|
+
color,
|
|
84
|
+
shown: color != null
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
async function handlePatternOverlayUpdate(map, unitsMap, columns, getColor) {
|
|
90
|
+
const colsWithPatterns = [];
|
|
91
|
+
const patternIDs = /* @__PURE__ */ new Set();
|
|
92
|
+
for (const column of columns) {
|
|
93
|
+
const col_id = column.properties.col_id;
|
|
94
|
+
const info = unitsMap.get(Number(col_id));
|
|
95
|
+
if (info == null) continue;
|
|
96
|
+
const pattern = getPatternSpec(info?.liths, getColor);
|
|
97
|
+
if (pattern == null) continue;
|
|
98
|
+
colsWithPatterns.push({
|
|
99
|
+
type: "Feature",
|
|
100
|
+
geometry: column.geometry,
|
|
101
|
+
properties: {
|
|
102
|
+
col_id,
|
|
103
|
+
pattern
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
patternIDs.add(pattern);
|
|
107
|
+
}
|
|
108
|
+
const patternsToLoad = patternIDs.values().filter((d) => !map.hasImage(d));
|
|
109
|
+
const mapper = async (patternID) => {
|
|
110
|
+
try {
|
|
111
|
+
await loadStyleImage(map, patternID, { pixelRatio: 10 });
|
|
112
|
+
} catch (e) {
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
await pMap(patternsToLoad, mapper, { concurrency: 5 });
|
|
116
|
+
const patternData = {
|
|
117
|
+
type: "FeatureCollection",
|
|
118
|
+
features: colsWithPatterns
|
|
119
|
+
};
|
|
120
|
+
setGeoJSON(map, "column-patterns", patternData);
|
|
121
|
+
}
|
|
122
|
+
const cachedColors = /* @__PURE__ */ new Map();
|
|
123
|
+
function getDarkenedColor(color) {
|
|
124
|
+
if (cachedColors.has(color)) {
|
|
125
|
+
return cachedColors.get(color);
|
|
126
|
+
}
|
|
127
|
+
const c1 = asChromaColor(color).set("hsl.l", 0.4).set("hsl.s", 0.8).hex();
|
|
128
|
+
cachedColors.set(color, c1);
|
|
129
|
+
return c1;
|
|
130
|
+
}
|
|
131
|
+
function postProcessUnits(units, getColor) {
|
|
132
|
+
const unitsByColumn = /* @__PURE__ */ new Map();
|
|
133
|
+
for (const unit of units) {
|
|
134
|
+
const col_id = Number(unit.col_id);
|
|
135
|
+
if (!unitsByColumn.has(col_id)) {
|
|
136
|
+
unitsByColumn.set(col_id, [unit]);
|
|
137
|
+
} else {
|
|
138
|
+
unitsByColumn.set(col_id, [...unitsByColumn.get(col_id), unit]);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const res = /* @__PURE__ */ new Map();
|
|
142
|
+
for (const [col_id, unitList] of unitsByColumn.entries()) {
|
|
143
|
+
const liths = flattenLithologies(unitList.map((u) => u.lith));
|
|
144
|
+
res.set(col_id, {
|
|
145
|
+
col_id,
|
|
146
|
+
units: unitList,
|
|
147
|
+
liths,
|
|
148
|
+
color: getMixedColorForData(liths, getColor)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
return res;
|
|
152
|
+
}
|
|
153
|
+
function getPatternSpec(liths, getColor) {
|
|
154
|
+
const patternData = getBestFGDCPatternForLithologyList(liths);
|
|
155
|
+
if (patternData == null) return null;
|
|
156
|
+
let { patternID, lith } = patternData;
|
|
157
|
+
const color = getDarkenedColor(getColor(lith));
|
|
158
|
+
return `fgdc:${patternID}:${color}:transparent`;
|
|
159
|
+
}
|
|
160
|
+
function buildUnitsStyle(opts = {}) {
|
|
161
|
+
const { color = null, patterns = false } = opts;
|
|
162
|
+
let columnBaseColor = color ?? getCSSVariable("--text-subtle-color", "black");
|
|
163
|
+
getCSSVariable("--selection-color", "purple");
|
|
164
|
+
let columnColor = [
|
|
165
|
+
"coalesce",
|
|
166
|
+
["feature-state", "color"],
|
|
167
|
+
["get", "color"],
|
|
168
|
+
columnBaseColor
|
|
169
|
+
];
|
|
170
|
+
const baseStyle = {
|
|
171
|
+
sources: {
|
|
172
|
+
columns: buildGeoJSONSource()
|
|
173
|
+
},
|
|
174
|
+
version: 8,
|
|
175
|
+
layers: [
|
|
176
|
+
{
|
|
177
|
+
id: "columns-fill",
|
|
178
|
+
type: "fill",
|
|
179
|
+
source: "columns",
|
|
180
|
+
paint: {
|
|
181
|
+
"fill-color": columnColor,
|
|
182
|
+
"fill-opacity": [
|
|
183
|
+
"case",
|
|
184
|
+
["boolean", ["feature-state", "shown"], false],
|
|
185
|
+
0.8,
|
|
186
|
+
["boolean", ["feature-state", "hover"], false],
|
|
187
|
+
0.3,
|
|
188
|
+
0.1
|
|
189
|
+
]
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
id: "columns-line",
|
|
194
|
+
type: "line",
|
|
195
|
+
source: "columns",
|
|
196
|
+
paint: {
|
|
197
|
+
"line-color": columnColor,
|
|
198
|
+
"line-width": 1,
|
|
199
|
+
"line-opacity": 0.5
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: "columns-points",
|
|
204
|
+
type: "circle",
|
|
205
|
+
source: "columns",
|
|
206
|
+
paint: {
|
|
207
|
+
"circle-radius": 4,
|
|
208
|
+
"circle-color": [
|
|
209
|
+
"case",
|
|
210
|
+
["boolean", ["feature-state", "shown"], false],
|
|
211
|
+
columnColor,
|
|
212
|
+
columnBaseColor
|
|
213
|
+
],
|
|
214
|
+
"circle-opacity": [
|
|
215
|
+
"case",
|
|
216
|
+
["boolean", ["feature-state", "shown"], false],
|
|
217
|
+
0.8,
|
|
218
|
+
["boolean", ["feature-state", "hover"], false],
|
|
219
|
+
0.3,
|
|
220
|
+
0.1
|
|
221
|
+
]
|
|
222
|
+
},
|
|
223
|
+
filter: ["==", "$type", "Point"]
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
};
|
|
227
|
+
if (!patterns) {
|
|
228
|
+
return baseStyle;
|
|
229
|
+
}
|
|
230
|
+
const patternStyle = {
|
|
231
|
+
sources: {
|
|
232
|
+
"column-patterns": buildGeoJSONSource()
|
|
233
|
+
},
|
|
234
|
+
layers: [
|
|
235
|
+
{
|
|
236
|
+
id: "columns-fill-pattern",
|
|
237
|
+
type: "fill",
|
|
238
|
+
source: "column-patterns",
|
|
239
|
+
paint: {
|
|
240
|
+
"fill-pattern": ["get", "pattern"],
|
|
241
|
+
"fill-opacity": 1
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
]
|
|
245
|
+
};
|
|
246
|
+
return mergeStyles(baseStyle, patternStyle);
|
|
247
|
+
}
|
|
248
|
+
export {
|
|
249
|
+
MacrostratUnitsOverlay,
|
|
250
|
+
buildUnitsStyle
|
|
251
|
+
};
|
|
252
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/maps/units-overlay/index.ts"],"sourcesContent":["import {\n useLithologies,\n useMacrostratColumns,\n} from \"@macrostrat/data-provider\";\nimport { useAPIResult } from \"@macrostrat/ui-components\";\nimport { useMapStyleOperator } from \"@macrostrat/mapbox-react\";\nimport { FeatureCollection } from \"geojson\";\nimport { useMemo } from \"react\";\nimport { mergeStyles, setGeoJSON } from \"@macrostrat/mapbox-utils\";\nimport { UnitLithology, UnitLong } from \"@macrostrat/api-types\";\nimport { flattenLithologies, getMixedColorForData } from \"../../units\";\nimport { getBestFGDCPatternForLithologyList } from \"../../units/resolvers\";\nimport {\n setupStyleImageManager,\n loadStyleImage,\n StyleFragment,\n} from \"@macrostrat/map-styles\";\nimport { asChromaColor, getCSSVariable } from \"@macrostrat/color-utils\";\nimport { buildGeoJSONSource } from \"@macrostrat/mapbox-utils\";\nimport pMap from \"p-map\";\n\nexport interface UnitsOverlayProps {\n time: number;\n ageSpan?: number;\n project?: number | number[];\n patterns?: boolean;\n}\n\nexport function MacrostratUnitsOverlay(props: UnitsOverlayProps) {\n const { time, ageSpan = 0.05, patterns = false } = props;\n const lithMap = useLithologies();\n\n useMapStyleOperator(\n (map) => {\n if (!patterns) return;\n setupStyleImageManager(map, { verbose: false });\n },\n [patterns],\n );\n\n const params = useMemo(() => {\n let project: number[] | undefined;\n if (Number.isFinite(props.project)) {\n project = [props.project as number];\n } else if (!Array.isArray(props.project)) {\n project = undefined;\n }\n // Project can only be a single project for now\n const projectCompat =\n project != null && project.length > 0 ? project[0] : undefined;\n\n return {\n age_bottom: time + ageSpan / 2,\n age_top: time - ageSpan / 2,\n response: \"long\",\n project: projectCompat,\n };\n }, [time, ageSpan, props.project]);\n\n const units: UnitLong[] = useAPIResult(\"/units\", params);\n const columns = useMacrostratColumns(params.project, false);\n\n // Set up basic columns layer\n useMapStyleOperator(\n (map) => {\n if (columns == null) {\n return;\n }\n const data: FeatureCollection = {\n type: \"FeatureCollection\",\n features: columns,\n };\n setGeoJSON(map, \"columns\", data);\n },\n [columns],\n );\n\n useMapStyleOperator(\n (map) => {\n if (units == null || columns == null || lithMap == null) {\n return;\n }\n\n const getColorForLithology = (data: UnitLithology): string | null => {\n return lithMap?.get(data.lith_id)?.color ?? null;\n };\n\n const unitsMap = postProcessUnits(units, getColorForLithology);\n handleUnitsLayerUpdate(map, unitsMap, columns);\n if (patterns) {\n handlePatternOverlayUpdate(\n map,\n unitsMap,\n columns,\n getColorForLithology,\n ).then(() => {});\n }\n },\n [units, lithMap, columns, patterns],\n );\n\n return null;\n}\n\nfunction handleUnitsLayerUpdate(\n map,\n unitsMap: Map<number, UnitsDisplayInfo>,\n columns: any[],\n) {\n // Update feature states\n for (const column of columns) {\n const col_id = column.properties.col_id;\n const info = unitsMap.get(Number(col_id));\n const color = info?.color;\n map.setFeatureState(\n { source: \"columns\", id: col_id },\n {\n color,\n shown: color != null,\n },\n );\n }\n}\n\nasync function handlePatternOverlayUpdate(\n map,\n unitsMap: Map<number, UnitsDisplayInfo>,\n columns: any[],\n getColor: LithologyColorGetter,\n) {\n // synthesize patterns not yet in cache\n\n const colsWithPatterns = [];\n const patternIDs = new Set<string>();\n // Update feature states\n for (const column of columns) {\n const col_id = column.properties.col_id;\n const info = unitsMap.get(Number(col_id));\n if (info == null) continue;\n const pattern = getPatternSpec(info?.liths, getColor);\n if (pattern == null) continue;\n\n colsWithPatterns.push({\n type: \"Feature\",\n geometry: column.geometry,\n properties: {\n col_id,\n pattern,\n },\n });\n patternIDs.add(pattern);\n }\n\n const patternsToLoad = patternIDs.values().filter((d) => !map.hasImage(d));\n\n const mapper = async (patternID) => {\n try {\n await loadStyleImage(map, patternID, { pixelRatio: 10 });\n } catch (e) {}\n };\n // Load all pattern images\n await pMap(patternsToLoad, mapper, { concurrency: 5 });\n\n // Set data for pattern layer\n // This is inefficient but the only way to set per-feature patterns in Mapbox\n const patternData: FeatureCollection = {\n type: \"FeatureCollection\",\n features: colsWithPatterns,\n };\n setGeoJSON(map, \"column-patterns\", patternData);\n}\n\nconst cachedColors = new Map<string, string>();\n\nfunction getDarkenedColor(color: string): string {\n /** Memoized function to get a darkened version of a color for pattern use */\n if (cachedColors.has(color)) {\n return cachedColors.get(color);\n }\n const c1 = asChromaColor(color).set(\"hsl.l\", 0.4).set(\"hsl.s\", 0.8).hex();\n cachedColors.set(color, c1);\n return c1;\n}\n\ninterface UnitsDisplayInfo {\n col_id: number;\n units: UnitLong[];\n color: string;\n liths: UnitLithology[];\n}\n\ntype LithologyColorGetter = (val: UnitLithology) => string | null;\n\nfunction postProcessUnits(\n units: UnitLong[],\n getColor: LithologyColorGetter,\n): Map<number, UnitsDisplayInfo> {\n // Group by col_id\n const unitsByColumn: Map<number, UnitLong[]> = new Map();\n for (const unit of units) {\n const col_id = Number(unit.col_id);\n if (!unitsByColumn.has(col_id)) {\n unitsByColumn.set(col_id, [unit]);\n } else {\n unitsByColumn.set(col_id, [...unitsByColumn.get(col_id), unit]);\n }\n }\n\n // Summarize units for display\n const res = new Map<number, UnitsDisplayInfo>();\n for (const [col_id, unitList] of unitsByColumn.entries()) {\n const liths = flattenLithologies(unitList.map((u) => u.lith));\n res.set(col_id, {\n col_id,\n units: unitList,\n liths,\n color: getMixedColorForData(liths, getColor),\n });\n }\n\n return res;\n}\n\nfunction getPatternSpec(\n liths: UnitLithology[],\n getColor: LithologyColorGetter,\n): string | null {\n const patternData = getBestFGDCPatternForLithologyList(liths);\n if (patternData == null) return null;\n let { patternID, lith } = patternData;\n const color = getDarkenedColor(getColor(lith));\n return `fgdc:${patternID}:${color}:transparent`;\n}\n\ntype UnitsStyleOptions = {\n color?: string;\n patterns?: boolean;\n};\n\nexport function buildUnitsStyle(opts: UnitsStyleOptions = {}): StyleFragment {\n const { color = null, patterns = false } = opts;\n\n let columnBaseColor: any =\n color ?? getCSSVariable(\"--text-subtle-color\", \"black\");\n const columnSelectedColor = getCSSVariable(\"--selection-color\", \"purple\");\n\n // If color is in the feature state or geojson properties, use that as second choice\n\n let columnColor: any = [\n \"coalesce\",\n [\"feature-state\", \"color\"],\n [\"get\", \"color\"],\n columnBaseColor,\n ];\n\n const baseStyle: StyleFragment = {\n sources: {\n columns: buildGeoJSONSource(),\n },\n version: 8,\n layers: [\n {\n id: \"columns-fill\",\n type: \"fill\",\n source: \"columns\",\n paint: {\n \"fill-color\": columnColor,\n \"fill-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n 0.8,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.3,\n 0.1,\n ],\n },\n },\n {\n id: \"columns-line\",\n type: \"line\",\n source: \"columns\",\n paint: {\n \"line-color\": columnColor,\n \"line-width\": 1,\n \"line-opacity\": 0.5,\n },\n },\n {\n id: \"columns-points\",\n type: \"circle\",\n source: \"columns\",\n paint: {\n \"circle-radius\": 4,\n \"circle-color\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n columnColor,\n columnBaseColor,\n ],\n \"circle-opacity\": [\n \"case\",\n [\"boolean\", [\"feature-state\", \"shown\"], false],\n 0.8,\n [\"boolean\", [\"feature-state\", \"hover\"], false],\n 0.3,\n 0.1,\n ],\n },\n filter: [\"==\", \"$type\", \"Point\"],\n },\n ],\n };\n\n if (!patterns) {\n return baseStyle;\n }\n\n const patternStyle: StyleFragment = {\n sources: {\n \"column-patterns\": buildGeoJSONSource(),\n },\n layers: [\n {\n id: \"columns-fill-pattern\",\n type: \"fill\",\n source: \"column-patterns\",\n paint: {\n \"fill-pattern\": [\"get\", \"pattern\"],\n \"fill-opacity\": 1,\n },\n },\n ],\n };\n\n return mergeStyles(baseStyle, patternStyle);\n}\n"],"names":[],"mappings":"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"}
|
package/dist/section.js
CHANGED
|
@@ -2,13 +2,13 @@ import { useMemo } from "react";
|
|
|
2
2
|
import { useMacrostratIntervals, Timescale, TimescaleOrientation } from "@macrostrat/timescale";
|
|
3
3
|
import { ColumnAxisType, SVG } from "@macrostrat/column-components";
|
|
4
4
|
import h$1 from "@macrostrat/hyper";
|
|
5
|
-
import
|
|
5
|
+
import h$2 from "./column.module.sass.js";
|
|
6
6
|
import { useMacrostratBaseURL } from "@macrostrat/data-provider";
|
|
7
7
|
import { Value } from "@macrostrat/data-components";
|
|
8
8
|
import { useMacrostratColumnData, useMacrostratUnits, MacrostratColumnProvider } from "./data-provider/store.js";
|
|
9
9
|
import { LabelTrackerProvider, SectionLabelsColumn, CompositeUnitsColumn } from "./units/composite.js";
|
|
10
10
|
import { Duration } from "./unit-details/panel.js";
|
|
11
|
-
const h = h$1.styled(
|
|
11
|
+
const h = h$1.styled(h$2);
|
|
12
12
|
function SectionsColumn(props) {
|
|
13
13
|
const {
|
|
14
14
|
unconformityLabels = true,
|