@macrostrat/column-views 2.1.4 → 2.2.1
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 +13 -0
- package/dist/esm/{column-views.77b49a43.js → column-views.0265cf7f.js} +52 -23
- package/dist/esm/column-views.0265cf7f.js.map +1 -0
- package/dist/esm/{column-views.4ab0ec82.js → column-views.073c42da.js} +142 -76
- package/dist/esm/column-views.073c42da.js.map +1 -0
- package/dist/esm/column-views.079119f4.js +17 -0
- package/dist/esm/column-views.079119f4.js.map +1 -0
- package/dist/esm/{column-views.5e2dc19d.js → column-views.0ce9b697.js} +3 -3
- package/dist/esm/{column-views.5e2dc19d.js.map → column-views.0ce9b697.js.map} +1 -1
- package/dist/esm/{column-views.448c0687.css → column-views.1151416d.css} +5 -5
- package/dist/esm/column-views.1151416d.css.map +1 -0
- package/dist/esm/{column-views.686d21ad.js → column-views.22ec902b.js} +4 -1
- package/dist/esm/column-views.22ec902b.js.map +1 -0
- package/dist/esm/{column-views.42b89c52.js → column-views.29a551f6.js} +60 -27
- package/dist/esm/column-views.29a551f6.js.map +1 -0
- package/dist/esm/{column-views.fbc7401f.js → column-views.2aef5df8.js} +5 -5
- package/dist/esm/{column-views.fbc7401f.js.map → column-views.2aef5df8.js.map} +1 -1
- package/dist/esm/{column-views.ab0380ed.js → column-views.2e854496.js} +3 -3
- package/dist/esm/{column-views.ab0380ed.js.map → column-views.2e854496.js.map} +1 -1
- package/dist/esm/{column-views.7ca9e1cd.js → column-views.2eceafb5.js} +19 -21
- package/dist/esm/column-views.2eceafb5.js.map +1 -0
- package/dist/esm/{column-views.b17f793f.css → column-views.321af3ae.css} +7 -1
- package/dist/esm/{column-views.686d21ad.js.map → column-views.321af3ae.css.map} +1 -1
- package/dist/esm/{column-views.75ea6dbe.js → column-views.382c486d.js} +11 -6
- package/dist/esm/column-views.382c486d.js.map +1 -0
- package/dist/esm/column-views.3a7179c4.js +137 -0
- package/dist/esm/column-views.3a7179c4.js.map +1 -0
- package/dist/esm/{column-views.8e3dec90.js → column-views.413217dc.js} +2 -2
- package/dist/esm/column-views.413217dc.js.map +1 -0
- package/dist/esm/column-views.418f948f.js +15 -0
- package/dist/esm/{column-views.38a305a0.js.map → column-views.418f948f.js.map} +1 -1
- package/dist/esm/{column-views.4d22c21c.js → column-views.41e5f0dc.js} +22 -4
- package/dist/esm/column-views.41e5f0dc.js.map +1 -0
- package/dist/esm/{column-views.676cb1d3.js → column-views.469a4952.js} +3 -3
- package/dist/esm/{column-views.676cb1d3.js.map → column-views.469a4952.js.map} +1 -1
- package/dist/esm/column-views.4ed90896.js +105 -0
- package/dist/esm/column-views.4ed90896.js.map +1 -0
- package/dist/esm/{column-views.547b2730.js → column-views.53722d0a.js} +19 -15
- package/dist/esm/column-views.53722d0a.js.map +1 -0
- package/dist/esm/{column-views.39657bbf.js → column-views.54f8b909.js} +7 -2
- package/dist/esm/column-views.54f8b909.js.map +1 -0
- package/dist/esm/{column-views.b72918ce.css → column-views.562db43a.css} +10 -2
- package/dist/esm/column-views.562db43a.css.map +1 -0
- package/dist/esm/{column-views.9e1c82fe.js → column-views.58b891df.js} +2 -2
- package/dist/esm/{column-views.9e1c82fe.js.map → column-views.58b891df.js.map} +1 -1
- package/dist/esm/{column-views.86619334.js → column-views.60365cdb.js} +2 -2
- package/dist/esm/{column-views.86619334.js.map → column-views.60365cdb.js.map} +1 -1
- package/dist/esm/column-views.6698b95a.js +108 -0
- package/dist/esm/column-views.6698b95a.js.map +1 -0
- package/dist/esm/column-views.6e7082db.js +16 -0
- package/dist/esm/column-views.6e7082db.js.map +1 -0
- package/dist/esm/column-views.70164236.js +206 -0
- package/dist/esm/column-views.70164236.js.map +1 -0
- package/dist/esm/{column-views.2ff3dd8b.js → column-views.748dce47.js} +31 -60
- package/dist/esm/column-views.748dce47.js.map +1 -0
- package/dist/esm/{column-views.775846c9.js → column-views.7683bb52.js} +9 -40
- package/dist/esm/column-views.7683bb52.js.map +1 -0
- package/dist/esm/{column-views.e7ab5af0.js → column-views.787d7696.js} +3 -3
- package/dist/esm/{column-views.e7ab5af0.js.map → column-views.787d7696.js.map} +1 -1
- package/dist/esm/{column-views.f20eb583.js → column-views.81bddbee.js} +6 -8
- package/dist/esm/column-views.81bddbee.js.map +1 -0
- package/dist/esm/{column-views.cc5244c4.js → column-views.8284c3a9.js} +91 -55
- package/dist/esm/column-views.8284c3a9.js.map +1 -0
- package/dist/esm/{column-views.f08929e2.js → column-views.88d63dd0.js} +5 -3
- package/dist/esm/column-views.88d63dd0.js.map +1 -0
- package/dist/esm/{column-views.935ef6f7.js → column-views.8b623b27.js} +2 -2
- package/dist/esm/{column-views.935ef6f7.js.map → column-views.8b623b27.js.map} +1 -1
- package/dist/esm/{column-views.3f246167.js → column-views.8c296309.js} +5 -5
- package/dist/esm/column-views.8c296309.js.map +1 -0
- package/dist/esm/{column-views.64a84c43.js → column-views.a3fabf0f.js} +38 -30
- package/dist/esm/column-views.a3fabf0f.js.map +1 -0
- package/dist/esm/column-views.abeab9aa.js +184 -0
- package/dist/esm/column-views.abeab9aa.js.map +1 -0
- package/dist/esm/{column-views.02f3732a.js → column-views.adec2e4c.js} +40 -20
- package/dist/esm/column-views.adec2e4c.js.map +1 -0
- package/dist/esm/{column-views.9892f825.js → column-views.aecf25bc.js} +75 -42
- package/dist/esm/column-views.aecf25bc.js.map +1 -0
- package/dist/esm/{column-views.1f7fb650.js → column-views.b08d82e6.js} +3 -3
- package/dist/esm/{column-views.1f7fb650.js.map → column-views.b08d82e6.js.map} +1 -1
- package/dist/esm/{column-views.769fa0ee.js → column-views.b29f8718.js} +2 -2
- package/dist/esm/{column-views.769fa0ee.js.map → column-views.b29f8718.js.map} +1 -1
- package/dist/esm/column-views.b7016f82.css +54 -0
- package/dist/esm/column-views.b7016f82.css.map +1 -0
- package/dist/esm/{column-views.0732894f.js → column-views.bbc77227.js} +2 -2
- package/dist/esm/{column-views.0732894f.js.map → column-views.bbc77227.js.map} +1 -1
- package/dist/esm/column-views.c2fbcba8.js +15 -0
- package/dist/esm/{column-views.0a159282.js.map → column-views.c2fbcba8.js.map} +1 -1
- package/dist/esm/{column-views.e3b9a317.js → column-views.c3495702.js} +2 -2
- package/dist/esm/{column-views.e3b9a317.js.map → column-views.c3495702.js.map} +1 -1
- package/dist/esm/{column-views.f7523c1d.js → column-views.c92a359e.js} +2 -2
- package/dist/esm/{column-views.f7523c1d.js.map → column-views.c92a359e.js.map} +1 -1
- package/dist/esm/{column-views.243da806.js → column-views.cae1a6a1.js} +3 -3
- package/dist/esm/{column-views.243da806.js.map → column-views.cae1a6a1.js.map} +1 -1
- package/dist/esm/{column-views.cdadc5c2.js → column-views.cc733361.js} +7 -1
- package/dist/esm/column-views.cc733361.js.map +1 -0
- package/dist/esm/{column-views.a195109e.js → column-views.d86555b0.js} +2 -2
- package/dist/esm/{column-views.a195109e.js.map → column-views.d86555b0.js.map} +1 -1
- package/dist/esm/{column-views.a6301a41.js → column-views.df34441c.js} +6 -8
- package/dist/esm/column-views.df34441c.js.map +1 -0
- package/dist/esm/{column-views.97d542eb.js → column-views.e17f00d3.js} +4 -4
- package/dist/esm/column-views.e17f00d3.js.map +1 -0
- package/dist/esm/{column-views.7715e35e.js → column-views.e1bc3cfa.js} +3 -3
- package/dist/esm/{column-views.7715e35e.js.map → column-views.e1bc3cfa.js.map} +1 -1
- package/dist/esm/{column-views.8d4ce558.css → column-views.e33ac5c9.css} +26 -9
- package/dist/esm/column-views.e33ac5c9.css.map +1 -0
- package/dist/esm/column-views.ea4ebbb7.js +31 -0
- package/dist/esm/column-views.ea4ebbb7.js.map +1 -0
- package/dist/esm/{column-views.78bd3f09.js → column-views.f0b0fc56.js} +2 -2
- package/dist/esm/{column-views.78bd3f09.js.map → column-views.f0b0fc56.js.map} +1 -1
- package/dist/esm/column-views.faacfc3c.js +92 -0
- package/dist/esm/column-views.faacfc3c.js.map +1 -0
- package/dist/esm/{column-views.d48cb0d8.js → column-views.fcf25ec6.js} +7 -1
- package/dist/esm/column-views.fcf25ec6.js.map +1 -0
- package/dist/esm/index.d.ts +264 -441
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +12 -12
- package/dist/node/column-views.0201566d.js +2 -0
- package/dist/node/column-views.0201566d.js.map +1 -0
- package/dist/node/column-views.07c503d3.js +2 -0
- package/dist/node/column-views.07c503d3.js.map +1 -0
- package/dist/node/{column-views.3a55ecd7.css → column-views.0840b115.css} +2 -2
- package/dist/node/column-views.0840b115.css.map +1 -0
- package/dist/node/column-views.0b3a384e.js +2 -0
- package/dist/node/column-views.0b3a384e.js.map +1 -0
- package/dist/node/column-views.0bd15ee4.js +2 -0
- package/dist/node/column-views.0bd15ee4.js.map +1 -0
- package/dist/node/{column-views.2a6b842d.js → column-views.0e7ac946.js} +2 -2
- package/dist/node/column-views.0e7ac946.js.map +1 -0
- package/dist/node/column-views.108db52e.js +2 -0
- package/dist/node/column-views.108db52e.js.map +1 -0
- package/dist/node/column-views.1261be59.js +2 -0
- package/dist/node/column-views.1261be59.js.map +1 -0
- package/dist/node/column-views.16f336ee.js +2 -0
- package/dist/node/column-views.16f336ee.js.map +1 -0
- package/dist/node/column-views.18d54bbb.js +2 -0
- package/dist/node/column-views.18d54bbb.js.map +1 -0
- package/dist/node/column-views.19a84c01.js +2 -0
- package/dist/node/column-views.19a84c01.js.map +1 -0
- package/dist/node/column-views.1a3c399e.js +2 -0
- package/dist/node/column-views.1a3c399e.js.map +1 -0
- package/dist/node/column-views.29483479.js +2 -0
- package/dist/node/column-views.29483479.js.map +1 -0
- package/dist/node/column-views.29eb25bd.css +2 -0
- package/dist/node/column-views.29eb25bd.css.map +1 -0
- package/dist/node/column-views.312db572.js +2 -0
- package/dist/node/column-views.312db572.js.map +1 -0
- package/dist/node/{column-views.2ca669bc.js → column-views.32344397.js} +2 -2
- package/dist/node/{column-views.2ca669bc.js.map → column-views.32344397.js.map} +1 -1
- package/dist/node/column-views.44952ae6.js +2 -0
- package/dist/node/column-views.44952ae6.js.map +1 -0
- package/dist/node/{column-views.a372c943.js → column-views.45a03acc.js} +2 -2
- package/dist/node/{column-views.a372c943.js.map → column-views.45a03acc.js.map} +1 -1
- package/dist/node/{column-views.0cbd4a3f.js → column-views.48a3cfa3.js} +2 -2
- package/dist/node/{column-views.0cbd4a3f.js.map → column-views.48a3cfa3.js.map} +1 -1
- package/dist/node/{column-views.42db0bb8.js → column-views.4b4c214a.js} +2 -2
- package/dist/node/{column-views.42db0bb8.js.map → column-views.4b4c214a.js.map} +1 -1
- package/dist/node/column-views.50a992d3.css +2 -0
- package/dist/node/column-views.50a992d3.css.map +1 -0
- package/dist/node/{column-views.65f091ea.js → column-views.54363c13.js} +2 -2
- package/dist/node/{column-views.65f091ea.js.map → column-views.54363c13.js.map} +1 -1
- package/dist/node/{column-views.858b5cf4.js → column-views.554d44a7.js} +2 -2
- package/dist/node/{column-views.858b5cf4.js.map → column-views.554d44a7.js.map} +1 -1
- package/dist/node/column-views.573cb29d.js +2 -0
- package/dist/node/column-views.573cb29d.js.map +1 -0
- package/dist/node/{column-views.492b4917.js → column-views.57dd069c.js} +2 -2
- package/dist/node/{column-views.492b4917.js.map → column-views.57dd069c.js.map} +1 -1
- package/dist/node/{column-views.2e4e357d.js → column-views.588b02a1.js} +2 -2
- package/dist/node/{column-views.2e4e357d.js.map → column-views.588b02a1.js.map} +1 -1
- package/dist/node/column-views.5a8bc8e3.js +2 -0
- package/dist/node/column-views.5a8bc8e3.js.map +1 -0
- package/dist/node/column-views.5f3b0b04.js +2 -0
- package/dist/node/column-views.5f3b0b04.js.map +1 -0
- package/dist/node/column-views.6099a3a9.js +2 -0
- package/dist/node/column-views.6099a3a9.js.map +1 -0
- package/dist/node/column-views.6919fd2a.js +2 -0
- package/dist/node/column-views.6919fd2a.js.map +1 -0
- package/dist/node/{column-views.45fab61b.js → column-views.6b8424fd.js} +2 -2
- package/dist/node/{column-views.45fab61b.js.map → column-views.6b8424fd.js.map} +1 -1
- package/dist/node/column-views.7425d37b.js +2 -0
- package/dist/node/column-views.7425d37b.js.map +1 -0
- package/dist/node/column-views.77ace3a2.js +2 -0
- package/dist/node/column-views.77ace3a2.js.map +1 -0
- package/dist/node/column-views.7f9c7448.js +2 -0
- package/dist/node/column-views.7f9c7448.js.map +1 -0
- package/dist/node/column-views.92e29010.js +2 -0
- package/dist/node/column-views.92e29010.js.map +1 -0
- package/dist/node/{column-views.7010a03b.js → column-views.93febe9b.js} +2 -2
- package/dist/node/{column-views.7010a03b.js.map → column-views.93febe9b.js.map} +1 -1
- package/dist/node/{column-views.51bc87ca.js → column-views.94c84716.js} +2 -2
- package/dist/node/{column-views.51bc87ca.js.map → column-views.94c84716.js.map} +1 -1
- package/dist/node/column-views.a16cd1f2.js +2 -0
- package/dist/node/column-views.a16cd1f2.js.map +1 -0
- package/dist/node/{column-views.eeca917f.js → column-views.a1e29a15.js} +2 -2
- package/dist/node/{column-views.eeca917f.js.map → column-views.a1e29a15.js.map} +1 -1
- package/dist/node/column-views.aae09aca.js +2 -0
- package/dist/node/column-views.aae09aca.js.map +1 -0
- package/dist/node/column-views.abe0a664.js +2 -0
- package/dist/node/column-views.abe0a664.js.map +1 -0
- package/dist/node/{column-views.a2274834.js → column-views.ae9536b3.js} +2 -2
- package/dist/node/{column-views.a2274834.js.map → column-views.ae9536b3.js.map} +1 -1
- package/dist/node/column-views.aef76eee.js +2 -0
- package/dist/node/column-views.aef76eee.js.map +1 -0
- package/dist/node/column-views.cd7b223b.css +2 -0
- package/dist/node/column-views.cd7b223b.css.map +1 -0
- package/dist/node/{column-views.df97f28e.js → column-views.ce5904a6.js} +2 -2
- package/dist/node/{column-views.df97f28e.js.map → column-views.ce5904a6.js.map} +1 -1
- package/dist/node/column-views.d4545f9f.js +2 -0
- package/dist/node/column-views.d4545f9f.js.map +1 -0
- package/dist/node/{column-views.c7f6fc0a.js → column-views.d529d3aa.js} +2 -2
- package/dist/node/{column-views.c7f6fc0a.js.map → column-views.d529d3aa.js.map} +1 -1
- package/dist/node/{column-views.2d957a97.js → column-views.db4ccacc.js} +2 -2
- package/dist/node/column-views.db4ccacc.js.map +1 -0
- package/dist/node/column-views.e2562224.js +2 -0
- package/dist/node/column-views.e2562224.js.map +1 -0
- package/dist/node/column-views.e803e4ae.css +2 -0
- package/dist/node/column-views.e803e4ae.css.map +1 -0
- package/dist/node/column-views.ebe61439.js +2 -0
- package/dist/node/column-views.ebe61439.js.map +1 -0
- package/dist/node/column-views.edb4ba54.js +2 -0
- package/dist/node/column-views.edb4ba54.js.map +1 -0
- package/dist/node/column-views.f0f5cefd.js +2 -0
- package/dist/node/column-views.f0f5cefd.js.map +1 -0
- package/dist/node/column-views.f1ad131a.js +2 -0
- package/dist/node/column-views.f1ad131a.js.map +1 -0
- package/dist/node/{column-views.58d2f993.js → column-views.f7d72702.js} +2 -2
- package/dist/node/{column-views.58d2f993.js.map → column-views.f7d72702.js.map} +1 -1
- package/dist/node/{column-views.e3ba0594.js → column-views.fcdc74c4.js} +2 -2
- package/dist/node/{column-views.e3ba0594.js.map → column-views.fcdc74c4.js.map} +1 -1
- package/dist/node/index.js +1 -1
- package/dist/node/index.js.map +1 -1
- package/package.json +15 -13
- package/src/age-axis.module.sass +4 -2
- package/src/age-axis.ts +49 -15
- package/src/age-model-overlay.ts +22 -1
- package/src/column.module.sass +29 -9
- package/src/column.ts +99 -24
- package/src/correlation-chart/main.ts +11 -3
- package/src/correlation-chart/prepare-data.ts +7 -4
- package/src/correlation-chart/stories/correlation-chart.stories.ts +26 -1
- package/src/data-provider/base.ts +32 -24
- package/src/data-provider/fetch.ts +10 -3
- package/src/data-provider/index.ts +1 -0
- package/src/data-provider/store.ts +74 -13
- package/src/{units/selection.ts → data-provider/unit-selection.ts} +22 -8
- package/src/facets/base-sample-column.module.sass +14 -0
- package/src/facets/base-sample-column.ts +114 -0
- package/src/facets/detrital-zircon/index.ts +31 -63
- package/src/facets/fossils/index.module.sass +43 -13
- package/src/facets/fossils/index.ts +232 -158
- package/src/facets/fossils/provider.ts +121 -25
- package/src/facets/index.ts +1 -0
- package/src/facets/measurements/index.ts +1 -2
- package/src/maps/column-correlation/state.ts +0 -1
- package/src/prepare-units/composite-scale.ts +183 -155
- package/src/prepare-units/dynamic-scales.ts +298 -0
- package/src/prepare-units/helpers.ts +99 -87
- package/src/prepare-units/index.ts +77 -51
- package/src/prepare-units/types.ts +138 -0
- package/src/prepare-units/utils.ts +29 -1
- package/src/section.ts +46 -9
- package/src/unit-details/panel.module.sass +8 -1
- package/src/unit-details/panel.ts +123 -53
- package/src/unit-details/popover.ts +6 -1
- package/src/units/boxes.ts +2 -7
- package/src/units/composite.ts +7 -50
- package/src/units/index.ts +0 -1
- package/dist/esm/column-views.02f3732a.js.map +0 -1
- package/dist/esm/column-views.0a159282.js +0 -13
- package/dist/esm/column-views.1e055ed5.js +0 -53
- package/dist/esm/column-views.1e055ed5.js.map +0 -1
- package/dist/esm/column-views.2ff3dd8b.js.map +0 -1
- package/dist/esm/column-views.3048acc1.js +0 -66
- package/dist/esm/column-views.3048acc1.js.map +0 -1
- package/dist/esm/column-views.38a305a0.js +0 -13
- package/dist/esm/column-views.39657bbf.js.map +0 -1
- package/dist/esm/column-views.3f246167.js.map +0 -1
- package/dist/esm/column-views.42b89c52.js.map +0 -1
- package/dist/esm/column-views.448c0687.css.map +0 -1
- package/dist/esm/column-views.4ab0ec82.js.map +0 -1
- package/dist/esm/column-views.4d22c21c.js.map +0 -1
- package/dist/esm/column-views.547b2730.js.map +0 -1
- package/dist/esm/column-views.64a84c43.js.map +0 -1
- package/dist/esm/column-views.75ea6dbe.js.map +0 -1
- package/dist/esm/column-views.775846c9.js.map +0 -1
- package/dist/esm/column-views.77b49a43.js.map +0 -1
- package/dist/esm/column-views.7ca9e1cd.js.map +0 -1
- package/dist/esm/column-views.8703a35b.js +0 -163
- package/dist/esm/column-views.8703a35b.js.map +0 -1
- package/dist/esm/column-views.8d4ce558.css.map +0 -1
- package/dist/esm/column-views.8e3dec90.js.map +0 -1
- package/dist/esm/column-views.97d542eb.js.map +0 -1
- package/dist/esm/column-views.9892f825.js.map +0 -1
- package/dist/esm/column-views.a6301a41.js.map +0 -1
- package/dist/esm/column-views.b17f793f.css.map +0 -1
- package/dist/esm/column-views.b3c1eb9e.js +0 -16
- package/dist/esm/column-views.b3c1eb9e.js.map +0 -1
- package/dist/esm/column-views.b72918ce.css.map +0 -1
- package/dist/esm/column-views.c71c321c.js +0 -104
- package/dist/esm/column-views.c71c321c.js.map +0 -1
- package/dist/esm/column-views.cc5244c4.js.map +0 -1
- package/dist/esm/column-views.cdadc5c2.js.map +0 -1
- package/dist/esm/column-views.d48cb0d8.js.map +0 -1
- package/dist/esm/column-views.f08929e2.js.map +0 -1
- package/dist/esm/column-views.f20eb583.js.map +0 -1
- package/dist/node/column-views.085f4a51.js +0 -2
- package/dist/node/column-views.085f4a51.js.map +0 -1
- package/dist/node/column-views.0dfc7ef7.js +0 -2
- package/dist/node/column-views.0dfc7ef7.js.map +0 -1
- package/dist/node/column-views.1a0b56fc.js +0 -2
- package/dist/node/column-views.1a0b56fc.js.map +0 -1
- package/dist/node/column-views.2926f656.css +0 -2
- package/dist/node/column-views.2926f656.css.map +0 -1
- package/dist/node/column-views.2a6b842d.js.map +0 -1
- package/dist/node/column-views.2d957a97.js.map +0 -1
- package/dist/node/column-views.307661d1.css +0 -2
- package/dist/node/column-views.307661d1.css.map +0 -1
- package/dist/node/column-views.33752461.js +0 -2
- package/dist/node/column-views.33752461.js.map +0 -1
- package/dist/node/column-views.38357d4a.js +0 -2
- package/dist/node/column-views.38357d4a.js.map +0 -1
- package/dist/node/column-views.3a55ecd7.css.map +0 -1
- package/dist/node/column-views.3eeac38d.js +0 -2
- package/dist/node/column-views.3eeac38d.js.map +0 -1
- package/dist/node/column-views.45168c80.js +0 -2
- package/dist/node/column-views.45168c80.js.map +0 -1
- package/dist/node/column-views.4ca62e5d.js +0 -2
- package/dist/node/column-views.4ca62e5d.js.map +0 -1
- package/dist/node/column-views.6ae7bb69.js +0 -2
- package/dist/node/column-views.6ae7bb69.js.map +0 -1
- package/dist/node/column-views.6f7a432f.js +0 -2
- package/dist/node/column-views.6f7a432f.js.map +0 -1
- package/dist/node/column-views.755f726e.js +0 -2
- package/dist/node/column-views.755f726e.js.map +0 -1
- package/dist/node/column-views.758b9bc1.js +0 -2
- package/dist/node/column-views.758b9bc1.js.map +0 -1
- package/dist/node/column-views.78d3f3c5.js +0 -2
- package/dist/node/column-views.78d3f3c5.js.map +0 -1
- package/dist/node/column-views.80fcf105.js +0 -2
- package/dist/node/column-views.80fcf105.js.map +0 -1
- package/dist/node/column-views.8cfed88b.js +0 -2
- package/dist/node/column-views.8cfed88b.js.map +0 -1
- package/dist/node/column-views.91043465.js +0 -2
- package/dist/node/column-views.91043465.js.map +0 -1
- package/dist/node/column-views.976a829b.js +0 -2
- package/dist/node/column-views.976a829b.js.map +0 -1
- package/dist/node/column-views.99fb74c0.js +0 -2
- package/dist/node/column-views.99fb74c0.js.map +0 -1
- package/dist/node/column-views.9b7a9ae1.js +0 -2
- package/dist/node/column-views.9b7a9ae1.js.map +0 -1
- package/dist/node/column-views.9de31cdb.js +0 -2
- package/dist/node/column-views.9de31cdb.js.map +0 -1
- package/dist/node/column-views.a4e6d4ad.js +0 -2
- package/dist/node/column-views.a4e6d4ad.js.map +0 -1
- package/dist/node/column-views.a501cea0.js +0 -2
- package/dist/node/column-views.a501cea0.js.map +0 -1
- package/dist/node/column-views.a7256aa7.js +0 -2
- package/dist/node/column-views.a7256aa7.js.map +0 -1
- package/dist/node/column-views.c4b409e1.css +0 -2
- package/dist/node/column-views.c4b409e1.css.map +0 -1
- package/dist/node/column-views.cef1b814.js +0 -2
- package/dist/node/column-views.cef1b814.js.map +0 -1
- package/dist/node/column-views.d6708353.js +0 -2
- package/dist/node/column-views.d6708353.js.map +0 -1
- package/dist/node/column-views.d9add589.js +0 -2
- package/dist/node/column-views.d9add589.js.map +0 -1
- package/dist/node/column-views.dfb2361a.js +0 -2
- package/dist/node/column-views.dfb2361a.js.map +0 -1
- package/dist/node/column-views.e9515ec1.js +0 -2
- package/dist/node/column-views.e9515ec1.js.map +0 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import type { UnitLong } from "@macrostrat/api-types";
|
|
2
|
+
import { scaleLinear } from "d3-scale";
|
|
3
|
+
import { getUnitHeightRange } from "./utils";
|
|
4
|
+
import { ColumnAxisType } from "@macrostrat/column-components";
|
|
5
|
+
import { mergeAgeRanges, MergeMode } from "@macrostrat/stratigraphy-utils";
|
|
6
|
+
import type {
|
|
7
|
+
ApproxHeightScaleOptions,
|
|
8
|
+
ExtUnit,
|
|
9
|
+
HybridScaleDefinition,
|
|
10
|
+
HybridScaleOptions,
|
|
11
|
+
PackageScaleInfo,
|
|
12
|
+
} from "./types";
|
|
13
|
+
import { HybridScaleType, HeightMethod } from "./types";
|
|
14
|
+
|
|
15
|
+
interface BaseSurface {
|
|
16
|
+
index: number;
|
|
17
|
+
age: number;
|
|
18
|
+
units_below: number[];
|
|
19
|
+
units_above: number[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function buildColumnSurfaces<T extends UnitLong>(
|
|
23
|
+
units: T[],
|
|
24
|
+
tolerance: number = 0.001,
|
|
25
|
+
): BaseSurface[] {
|
|
26
|
+
/** Compute age surfaces for a column based on unit tops and bottoms */
|
|
27
|
+
const surfaces: Omit<BaseSurface, "index">[] = [];
|
|
28
|
+
for (const unit of units) {
|
|
29
|
+
// Top surface
|
|
30
|
+
surfaces.push({
|
|
31
|
+
age: unit.t_age,
|
|
32
|
+
units_below: [unit.unit_id],
|
|
33
|
+
units_above: [],
|
|
34
|
+
});
|
|
35
|
+
// Bottom surface
|
|
36
|
+
surfaces.push({
|
|
37
|
+
age: unit.b_age,
|
|
38
|
+
units_above: [unit.unit_id],
|
|
39
|
+
units_below: [],
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Merge duplicate surfaces (same age)
|
|
44
|
+
const mergedSurfaces: Omit<BaseSurface, "index">[] = [];
|
|
45
|
+
for (const surface of surfaces) {
|
|
46
|
+
const existingSurface = mergedSurfaces.find(
|
|
47
|
+
(s) => Math.abs(s.age - surface.age) < tolerance,
|
|
48
|
+
);
|
|
49
|
+
if (existingSurface) {
|
|
50
|
+
existingSurface.units_above.push(...surface.units_above);
|
|
51
|
+
existingSurface.units_below.push(...surface.units_below);
|
|
52
|
+
} else {
|
|
53
|
+
mergedSurfaces.push(surface);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Sort surfaces by age (ascending)
|
|
58
|
+
mergedSurfaces.sort((a, b) => a.age - b.age);
|
|
59
|
+
|
|
60
|
+
return mergedSurfaces.map((s, i) => ({ ...s, index: i }));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface AgeDomainUnitInfo {
|
|
64
|
+
t_age: number;
|
|
65
|
+
b_age: number;
|
|
66
|
+
units: ExtUnit[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function getUnitsInAgeDomains(
|
|
70
|
+
surfaces: BaseSurface[],
|
|
71
|
+
units: ExtUnit[],
|
|
72
|
+
): AgeDomainUnitInfo[] {
|
|
73
|
+
// Get unit IDs represented between the same surface, and the proportion of their total height represented
|
|
74
|
+
const domainUnitInfo: AgeDomainUnitInfo[] = [];
|
|
75
|
+
for (let i = 0; i < surfaces.length - 1; i++) {
|
|
76
|
+
const topSurface = surfaces[i];
|
|
77
|
+
const bottomSurface = surfaces[i + 1];
|
|
78
|
+
const unitsInDomain = units.filter((unit) => {
|
|
79
|
+
return (
|
|
80
|
+
unit.t_age <= topSurface.age + 0.001 &&
|
|
81
|
+
unit.b_age >= bottomSurface.age - 0.001
|
|
82
|
+
);
|
|
83
|
+
});
|
|
84
|
+
domainUnitInfo.push({
|
|
85
|
+
t_age: topSurface.age,
|
|
86
|
+
b_age: bottomSurface.age,
|
|
87
|
+
units: unitsInDomain,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
return domainUnitInfo;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function proportionOfUnitInDomain(
|
|
94
|
+
unit: ExtUnit,
|
|
95
|
+
t_age: number,
|
|
96
|
+
b_age: number,
|
|
97
|
+
): number {
|
|
98
|
+
// Compute the proportion of a unit's height that lies within the given age domain
|
|
99
|
+
|
|
100
|
+
const rng = getUnitHeightRange(unit, ColumnAxisType.AGE);
|
|
101
|
+
const rng1: [number, number] = [b_age, t_age];
|
|
102
|
+
// Compute overlap
|
|
103
|
+
|
|
104
|
+
const mergedRange = mergeAgeRanges([rng, rng1], MergeMode.Inner);
|
|
105
|
+
|
|
106
|
+
const unitHeight = Math.abs(rng[1] - rng[0]);
|
|
107
|
+
const mergedHeight = Math.abs(mergedRange[1] - mergedRange[0]);
|
|
108
|
+
|
|
109
|
+
return mergedHeight / unitHeight;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function buildHybridScale<T extends UnitLong>(
|
|
113
|
+
def: HybridScaleDefinition,
|
|
114
|
+
units: T[],
|
|
115
|
+
domain: [number, number],
|
|
116
|
+
options: HybridScaleOptions = {},
|
|
117
|
+
): PackageScaleInfo {
|
|
118
|
+
const surfaces = buildColumnSurfaces(units);
|
|
119
|
+
|
|
120
|
+
const filteredSurfaces = surfaces.filter(
|
|
121
|
+
(s) => s.age < Math.max(...domain) && s.age > Math.min(...domain),
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const s1 = [
|
|
125
|
+
{ index: -1, age: Math.min(...domain), units_above: [], units_below: [] },
|
|
126
|
+
...filteredSurfaces,
|
|
127
|
+
{
|
|
128
|
+
index: -1,
|
|
129
|
+
age: Math.max(...domain),
|
|
130
|
+
units_above: [],
|
|
131
|
+
units_below: [],
|
|
132
|
+
},
|
|
133
|
+
];
|
|
134
|
+
|
|
135
|
+
const { type, ...rest } = def;
|
|
136
|
+
|
|
137
|
+
if (type === HybridScaleType.EquidistantSurfaces) {
|
|
138
|
+
return buildScaleFromSurfacesSimple(s1, options);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return buildApproximateHeightScale(s1, units, { ...options, ...rest });
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function getApproximateHeight(
|
|
145
|
+
unit: ExtUnit,
|
|
146
|
+
method: HeightMethod = HeightMethod.Maximum,
|
|
147
|
+
): number | null {
|
|
148
|
+
// Get approximate height of a unit based on specified method
|
|
149
|
+
const heights = [];
|
|
150
|
+
let minHeight = unit.min_thick;
|
|
151
|
+
if (method === HeightMethod.Minimum || method === HeightMethod.Average) {
|
|
152
|
+
const h = unit.min_thick;
|
|
153
|
+
if (h != null && !isNaN(h) && h > 0) heights.push(h);
|
|
154
|
+
}
|
|
155
|
+
if (method === HeightMethod.Average || method === HeightMethod.Maximum) {
|
|
156
|
+
const h = unit.max_thick;
|
|
157
|
+
if (h != null && !isNaN(h) && h > 0) heights.push(h);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (heights.length === 0) return null;
|
|
161
|
+
|
|
162
|
+
if (method === HeightMethod.Average) {
|
|
163
|
+
return heights.reduce((sum, h) => sum + h, 0) / heights.length;
|
|
164
|
+
} else {
|
|
165
|
+
return heights[0];
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function buildApproximateHeightScale(
|
|
170
|
+
surfaces: BaseSurface[],
|
|
171
|
+
units: UnitLong[],
|
|
172
|
+
options: HybridScaleOptions & ApproxHeightScaleOptions = {},
|
|
173
|
+
): PackageScaleInfo {
|
|
174
|
+
/** Build a variable age scale that places age surfaces equally far apart in height space.
|
|
175
|
+
* It is presumed that gaps are already removed from the unit set provided.
|
|
176
|
+
* */
|
|
177
|
+
|
|
178
|
+
const {
|
|
179
|
+
pixelScale = 1, // pixels per meter
|
|
180
|
+
pixelOffset = 0,
|
|
181
|
+
minHeight = 5,
|
|
182
|
+
heightMethod = HeightMethod.Maximum,
|
|
183
|
+
// Default height for when height is unknown
|
|
184
|
+
defaultHeight = 100,
|
|
185
|
+
} = options;
|
|
186
|
+
|
|
187
|
+
// Get units associated with each surface
|
|
188
|
+
// Note: we could hoist this if it proved useful for other scale types
|
|
189
|
+
const domainInfo = getUnitsInAgeDomains(surfaces, units as ExtUnit[]);
|
|
190
|
+
|
|
191
|
+
// Compute the height in pixels for each surface
|
|
192
|
+
|
|
193
|
+
const surfaceHeights = [];
|
|
194
|
+
const ageDomain = [];
|
|
195
|
+
let lastHeight = pixelOffset;
|
|
196
|
+
|
|
197
|
+
for (const domain of domainInfo) {
|
|
198
|
+
if (lastHeight == pixelOffset) {
|
|
199
|
+
surfaceHeights.push(lastHeight);
|
|
200
|
+
ageDomain.push(domain.t_age);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Approximate height based on units in this domain
|
|
204
|
+
const units = domain.units;
|
|
205
|
+
let unitHeightInfo: { unit: ExtUnit; height: number }[] = [];
|
|
206
|
+
|
|
207
|
+
for (const unit of units) {
|
|
208
|
+
const proportion = proportionOfUnitInDomain(
|
|
209
|
+
unit,
|
|
210
|
+
domain.t_age,
|
|
211
|
+
domain.b_age,
|
|
212
|
+
);
|
|
213
|
+
const height = getApproximateHeight(unit, heightMethod);
|
|
214
|
+
if (height != null) {
|
|
215
|
+
unitHeightInfo.push({ unit, height: height * proportion });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
let thisHeight = 0;
|
|
220
|
+
if (unitHeightInfo.length === 0) {
|
|
221
|
+
thisHeight = defaultHeight; // Default height if no units with height info
|
|
222
|
+
} else {
|
|
223
|
+
// Normalize weights (take the mean)
|
|
224
|
+
|
|
225
|
+
const meanHeight =
|
|
226
|
+
unitHeightInfo.reduce((sum, d) => sum + d.height, 0) /
|
|
227
|
+
unitHeightInfo.length;
|
|
228
|
+
|
|
229
|
+
if (meanHeight == 0) {
|
|
230
|
+
thisHeight = defaultHeight; // Arbitrary height for zero-height intervals
|
|
231
|
+
} else if (meanHeight < minHeight) {
|
|
232
|
+
thisHeight = minHeight; // Minimum height
|
|
233
|
+
} else {
|
|
234
|
+
thisHeight = meanHeight;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
lastHeight += thisHeight;
|
|
239
|
+
surfaceHeights.push(lastHeight);
|
|
240
|
+
ageDomain.push(domain.b_age);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Build a piecewise linear scale mapping age to pixel height
|
|
244
|
+
const pixelRange = surfaceHeights.map((h) => h * pixelScale);
|
|
245
|
+
|
|
246
|
+
const scale = scaleLinear().domain(ageDomain).range(pixelRange);
|
|
247
|
+
|
|
248
|
+
const heightDomain = surfaceHeights.map((h) => lastHeight - h);
|
|
249
|
+
|
|
250
|
+
const heightScale = scaleLinear().domain(heightDomain).range(pixelRange);
|
|
251
|
+
|
|
252
|
+
const domain: [number, number] = [
|
|
253
|
+
ageDomain[ageDomain.length - 1],
|
|
254
|
+
ageDomain[0],
|
|
255
|
+
];
|
|
256
|
+
|
|
257
|
+
return {
|
|
258
|
+
scale,
|
|
259
|
+
pixelScale: null, // pixels per unit
|
|
260
|
+
domain,
|
|
261
|
+
pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),
|
|
262
|
+
heightScale,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
export function buildScaleFromSurfacesSimple(
|
|
267
|
+
surfaces: BaseSurface[],
|
|
268
|
+
options: HybridScaleOptions = {},
|
|
269
|
+
): PackageScaleInfo {
|
|
270
|
+
/** Build a variable age scale that places age surfaces equally far apart in height space.
|
|
271
|
+
* It is presumed that gaps are already removed from the unit set provided.
|
|
272
|
+
* */
|
|
273
|
+
|
|
274
|
+
const { pixelScale = 30 } = options;
|
|
275
|
+
|
|
276
|
+
const domain: [number, number] = [
|
|
277
|
+
surfaces[surfaces.length - 1].age,
|
|
278
|
+
surfaces[0].age,
|
|
279
|
+
];
|
|
280
|
+
// Compute the height in pixels for each surface
|
|
281
|
+
|
|
282
|
+
const surfaceHeights = surfaces.map((surface, i) => {
|
|
283
|
+
return i * pixelScale;
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// Build a piecewise linear scale mapping age to pixel height
|
|
287
|
+
const ageDomain = surfaces.map((s) => s.age);
|
|
288
|
+
const pixelRange = surfaceHeights;
|
|
289
|
+
|
|
290
|
+
const scale = scaleLinear().domain(ageDomain).range(pixelRange);
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
scale,
|
|
294
|
+
pixelScale: null, // pixels per unit
|
|
295
|
+
domain,
|
|
296
|
+
pixelHeight: Math.abs(pixelRange[pixelRange.length - 1] - pixelRange[0]),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
@@ -2,48 +2,27 @@ import type { BaseUnit, UnitLong } from "@macrostrat/api-types";
|
|
|
2
2
|
import { group } from "d3-array";
|
|
3
3
|
import { ColumnAxisType } from "@macrostrat/column-components";
|
|
4
4
|
import {
|
|
5
|
-
unitsOverlap,
|
|
6
|
-
getUnitHeightRange,
|
|
7
5
|
createUnitSorter,
|
|
8
6
|
ensureArray,
|
|
9
7
|
ensureRealFloat,
|
|
10
|
-
|
|
8
|
+
getUnitHeightRange,
|
|
9
|
+
unitsOverlap,
|
|
11
10
|
} from "./utils";
|
|
12
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
AgeRangeRelationship,
|
|
13
|
+
compareAgeRanges,
|
|
14
|
+
} from "@macrostrat/stratigraphy-utils";
|
|
15
|
+
import type { ExtUnit, SectionInfo, StratigraphicPackage } from "./types";
|
|
13
16
|
|
|
14
17
|
const dt = 0.001;
|
|
15
18
|
|
|
16
|
-
export interface StratigraphicPackage {
|
|
17
|
-
/** A collection of stratigraphic information organized in time, corresponding
|
|
18
|
-
* to single or multiple columns. */
|
|
19
|
-
t_age: number;
|
|
20
|
-
b_age: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface SectionInfo<T extends UnitLong = ExtUnit>
|
|
24
|
-
extends StratigraphicPackage {
|
|
25
|
-
/** A time-bounded part of a single stratigraphic column. */
|
|
26
|
-
section_id: number | number[];
|
|
27
|
-
units: T[];
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface ExtUnit extends UnitLong {
|
|
31
|
-
bottomOverlap: boolean;
|
|
32
|
-
overlappingUnits: number[];
|
|
33
|
-
column?: number;
|
|
34
|
-
/* Positions (ages or heights) where the unit is clipped to its containing section.
|
|
35
|
-
* This is relevant if we are filtering by age/height/depth range.
|
|
36
|
-
*/
|
|
37
|
-
t_clip_pos?: number;
|
|
38
|
-
b_clip_pos?: number;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
19
|
export function preprocessUnits<T extends UnitLong = UnitLong>(
|
|
42
20
|
section: SectionInfo<T>,
|
|
43
21
|
axisType: ColumnAxisType = ColumnAxisType.AGE,
|
|
44
22
|
): ExtUnit[] {
|
|
45
23
|
/** Preprocess units to add overlapping units and columns. */
|
|
46
|
-
|
|
24
|
+
let units = section.units;
|
|
25
|
+
|
|
47
26
|
let divisions = units.map((...args) => extendDivision(...args, axisType));
|
|
48
27
|
for (let d of divisions) {
|
|
49
28
|
const overlappingUnits = divisions.filter((u) =>
|
|
@@ -63,8 +42,8 @@ export function preprocessUnits<T extends UnitLong = UnitLong>(
|
|
|
63
42
|
}
|
|
64
43
|
|
|
65
44
|
// If unit overlaps the edges of a section, set the clip positions
|
|
45
|
+
const [b_pos, t_pos] = getUnitHeightRange(d, axisType);
|
|
66
46
|
if (axisType == ColumnAxisType.AGE) {
|
|
67
|
-
const [b_pos, t_pos] = getUnitHeightRange(d, axisType);
|
|
68
47
|
if (b_pos > section.b_age) {
|
|
69
48
|
d.b_clip_pos = section.b_age;
|
|
70
49
|
}
|
|
@@ -72,14 +51,24 @@ export function preprocessUnits<T extends UnitLong = UnitLong>(
|
|
|
72
51
|
d.t_clip_pos = section.t_age;
|
|
73
52
|
}
|
|
74
53
|
}
|
|
54
|
+
if (axisType == ColumnAxisType.DEPTH) {
|
|
55
|
+
if (b_pos > section.b_pos) {
|
|
56
|
+
d.b_clip_pos = section.b_pos;
|
|
57
|
+
}
|
|
58
|
+
if (t_pos < section.t_pos) {
|
|
59
|
+
d.t_clip_pos = section.t_pos;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// if (axisType == ColumnAxisType.HEIGHT) {
|
|
63
|
+
// if (b_pos < section.b_pos) {
|
|
64
|
+
// d.b_clip_pos = section.b_pos;
|
|
65
|
+
// }
|
|
66
|
+
// if (t_pos > section.t_pos) {
|
|
67
|
+
// d.t_clip_pos = section.t_pos;
|
|
68
|
+
// }
|
|
69
|
+
// }
|
|
75
70
|
}
|
|
76
71
|
|
|
77
|
-
// TODO: we may want to re-enable this simpler processing for sections,
|
|
78
|
-
// but we want it to be less universally applied.
|
|
79
|
-
// if (axisType != ColumnAxisType.AGE) {
|
|
80
|
-
// return preprocessSectionUnits(divisions, axisType);
|
|
81
|
-
// }
|
|
82
|
-
//
|
|
83
72
|
return divisions;
|
|
84
73
|
}
|
|
85
74
|
|
|
@@ -89,8 +78,15 @@ function extendDivision(
|
|
|
89
78
|
divisions: UnitLong[],
|
|
90
79
|
axisType: ColumnAxisType = ColumnAxisType.AGE,
|
|
91
80
|
): ExtUnit {
|
|
81
|
+
// TODO: make this configurable
|
|
82
|
+
let tolerance = 0.001; // 1 kyr tolerance for age columns
|
|
83
|
+
if (axisType != ColumnAxisType.AGE) {
|
|
84
|
+
tolerance = 0.01; // 1cm tolerance for height/depth columns
|
|
85
|
+
}
|
|
86
|
+
|
|
92
87
|
const overlappingUnits = divisions.filter(
|
|
93
|
-
(d) =>
|
|
88
|
+
(d) =>
|
|
89
|
+
d.unit_id != unit.unit_id && unitsOverlap(unit, d, axisType, tolerance),
|
|
94
90
|
);
|
|
95
91
|
const u_pos = getUnitHeightRange(unit, axisType);
|
|
96
92
|
const bottomOverlap = overlappingUnits.some((d) => {
|
|
@@ -111,14 +107,10 @@ function extendDivision(
|
|
|
111
107
|
};
|
|
112
108
|
}
|
|
113
109
|
|
|
114
|
-
export function
|
|
110
|
+
export function groupUnitsIntoSectionsBySectionID<T extends UnitLong>(
|
|
115
111
|
units: T[],
|
|
116
112
|
axisType: ColumnAxisType = ColumnAxisType.AGE,
|
|
117
113
|
): SectionInfo<T>[] {
|
|
118
|
-
if (axisType != ColumnAxisType.AGE) {
|
|
119
|
-
return groupUnitsIntoSectionByOverlap(units, axisType);
|
|
120
|
-
}
|
|
121
|
-
|
|
122
114
|
/** Group units into sections by section_id.
|
|
123
115
|
* This works for large-scale Macrostrat columns, where units are grouped by section_id.
|
|
124
116
|
* */
|
|
@@ -127,13 +119,15 @@ export function groupUnitsIntoSections<T extends UnitLong>(
|
|
|
127
119
|
|
|
128
120
|
const groups1 = groups.map(([section_id, sectionUnits]) => {
|
|
129
121
|
const [b_age, t_age] = getSectionAgeRange(sectionUnits);
|
|
122
|
+
const [b_pos, t_pos] = getSectionPosRange(sectionUnits, axisType);
|
|
123
|
+
|
|
130
124
|
// sort units by position
|
|
131
125
|
sectionUnits.sort(unitComparator);
|
|
132
|
-
return { section_id, t_age, b_age, units: sectionUnits };
|
|
126
|
+
return { section_id, t_age, b_age, b_pos, t_pos, units: sectionUnits };
|
|
133
127
|
});
|
|
134
128
|
// Sort sections by increasing top age, then increasing bottom age.
|
|
135
129
|
// Sections have no relative ordinal position other than age...
|
|
136
|
-
const compareSections = createUnitSorter(
|
|
130
|
+
const compareSections = createUnitSorter(axisType) as (
|
|
137
131
|
a: StratigraphicPackage,
|
|
138
132
|
b: StratigraphicPackage,
|
|
139
133
|
) => number;
|
|
@@ -147,7 +141,7 @@ interface WorkingSection {
|
|
|
147
141
|
heightRange?: [number, number];
|
|
148
142
|
}
|
|
149
143
|
|
|
150
|
-
function
|
|
144
|
+
export function groupUnitsIntoSectionsByOverlap<T extends UnitLong>(
|
|
151
145
|
units: T[],
|
|
152
146
|
axisType: ColumnAxisType = ColumnAxisType.AGE,
|
|
153
147
|
): SectionInfo<T>[] {
|
|
@@ -161,8 +155,10 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
|
|
|
161
155
|
for (const unit of units) {
|
|
162
156
|
// Check if the unit overlaps with any existing section
|
|
163
157
|
const heightRange = getUnitHeightRange(unit, axisType);
|
|
164
|
-
let section: WorkingSection | undefined = sectionList.find(
|
|
165
|
-
|
|
158
|
+
let section: WorkingSection | undefined = sectionList.find(
|
|
159
|
+
(s) =>
|
|
160
|
+
compareAgeRanges(heightRange, s.heightRange) !==
|
|
161
|
+
AgeRangeRelationship.Disjoint,
|
|
166
162
|
);
|
|
167
163
|
if (section == null) {
|
|
168
164
|
// No overlap, create a new section
|
|
@@ -174,10 +170,17 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
|
|
|
174
170
|
// Overlap, merge the unit into the section
|
|
175
171
|
section.units.push(unit);
|
|
176
172
|
// Update the height range
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
173
|
+
if (axisType == ColumnAxisType.DEPTH || axisType == ColumnAxisType.AGE) {
|
|
174
|
+
section.heightRange = [
|
|
175
|
+
Math.max(section.heightRange[0], heightRange[0]),
|
|
176
|
+
Math.min(section.heightRange[1], heightRange[1]),
|
|
177
|
+
];
|
|
178
|
+
} else {
|
|
179
|
+
section.heightRange = [
|
|
180
|
+
Math.min(section.heightRange[0], heightRange[0]),
|
|
181
|
+
Math.max(section.heightRange[1], heightRange[1]),
|
|
182
|
+
];
|
|
183
|
+
}
|
|
181
184
|
}
|
|
182
185
|
}
|
|
183
186
|
// We should have a section for each unit, now we can convert to SectionInfo
|
|
@@ -185,23 +188,58 @@ function groupUnitsIntoSectionByOverlap<T extends UnitLong>(
|
|
|
185
188
|
|
|
186
189
|
return sectionList.map((section, i) => {
|
|
187
190
|
const [b_age, t_age] = getSectionAgeRange(section.units);
|
|
191
|
+
const [b_pos, t_pos] = getSectionPosRange(section.units, axisType);
|
|
188
192
|
return {
|
|
189
193
|
// Negative section IDs are used to indicate that these are synthetic sections
|
|
190
194
|
section_id: -i,
|
|
191
|
-
t_age
|
|
192
|
-
b_age
|
|
195
|
+
t_age,
|
|
196
|
+
b_age,
|
|
197
|
+
t_pos,
|
|
198
|
+
b_pos,
|
|
193
199
|
units: section.units as T[],
|
|
194
200
|
};
|
|
195
201
|
});
|
|
196
202
|
}
|
|
197
203
|
|
|
204
|
+
export function getSectionPosRange(
|
|
205
|
+
units: BaseUnit[],
|
|
206
|
+
axisType: ColumnAxisType,
|
|
207
|
+
): [number, number] {
|
|
208
|
+
/** Get the overall position range of a set of units. */
|
|
209
|
+
const t_positions = units.map((d) => {
|
|
210
|
+
switch (axisType) {
|
|
211
|
+
case ColumnAxisType.AGE:
|
|
212
|
+
return d.t_age;
|
|
213
|
+
case ColumnAxisType.DEPTH:
|
|
214
|
+
case ColumnAxisType.HEIGHT:
|
|
215
|
+
case ColumnAxisType.ORDINAL:
|
|
216
|
+
return d.t_pos;
|
|
217
|
+
default:
|
|
218
|
+
throw new Error(`Unknown axis type: ${axisType}`);
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
const b_positions = units.map((d) => {
|
|
222
|
+
switch (axisType) {
|
|
223
|
+
case ColumnAxisType.AGE:
|
|
224
|
+
return d.b_age;
|
|
225
|
+
case ColumnAxisType.DEPTH:
|
|
226
|
+
case ColumnAxisType.HEIGHT:
|
|
227
|
+
case ColumnAxisType.ORDINAL:
|
|
228
|
+
return d.b_pos;
|
|
229
|
+
default:
|
|
230
|
+
throw new Error(`Unknown axis type: ${axisType}`);
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
if (axisType == ColumnAxisType.AGE || axisType == ColumnAxisType.DEPTH) {
|
|
234
|
+
return [Math.max(...b_positions), Math.min(...t_positions)];
|
|
235
|
+
} else {
|
|
236
|
+
return [Math.min(...b_positions), Math.max(...t_positions)];
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
198
240
|
export function getSectionAgeRange(units: BaseUnit[]): [number, number] {
|
|
199
241
|
/** Get the overall age range of a set of units. */
|
|
200
|
-
|
|
201
|
-
const b_ages = units.map((d) => d.b_age);
|
|
202
|
-
const t_age = Math.min(...t_ages);
|
|
203
|
-
const b_age = Math.max(...b_ages);
|
|
204
|
-
return [b_age, t_age];
|
|
242
|
+
return getSectionPosRange(units, ColumnAxisType.AGE);
|
|
205
243
|
}
|
|
206
244
|
|
|
207
245
|
export function mergeOverlappingSections<T extends UnitLong>(
|
|
@@ -235,38 +273,14 @@ export function mergeOverlappingSections<T extends UnitLong>(
|
|
|
235
273
|
return newSections;
|
|
236
274
|
}
|
|
237
275
|
|
|
238
|
-
function
|
|
239
|
-
units: UnitLong[],
|
|
240
|
-
axisType: ColumnAxisType = ColumnAxisType.DEPTH,
|
|
241
|
-
): ExtUnit[] {
|
|
242
|
-
/** Preprocess units for a "section" column type, which is guaranteed to be simpler. */
|
|
243
|
-
// We have to assume the units are ordered...
|
|
244
|
-
let thickness = 0;
|
|
245
|
-
return units.map((unit, i) => {
|
|
246
|
-
let u1 = preprocessSectionUnit(unit, i, units, thickness, axisType);
|
|
247
|
-
thickness += Math.abs(u1.t_pos - u1.b_pos);
|
|
248
|
-
return u1;
|
|
249
|
-
});
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
function preprocessSectionUnit(
|
|
253
|
-
unit: UnitLong,
|
|
254
|
-
i: number,
|
|
255
|
-
units: UnitLong[],
|
|
256
|
-
accumulatedThickness: number = 0,
|
|
257
|
-
axisType: ColumnAxisType = ColumnAxisType.DEPTH,
|
|
258
|
-
): ExtUnit {
|
|
276
|
+
export function preprocessSectionUnit(unit: UnitLong): UnitLong {
|
|
259
277
|
/** Preprocess a single unit for a "section" column type.
|
|
260
|
-
*
|
|
278
|
+
* This mostly handles vagaries of eODP-style columns.
|
|
261
279
|
* */
|
|
262
280
|
|
|
263
281
|
let b_pos = unit.b_pos;
|
|
264
282
|
let t_pos = unit.t_pos;
|
|
265
283
|
|
|
266
|
-
if (b_pos == t_pos && axisType == ColumnAxisType.ORDINAL) {
|
|
267
|
-
t_pos = t_pos - 1;
|
|
268
|
-
}
|
|
269
|
-
|
|
270
284
|
let unit_name = unit.unit_name;
|
|
271
285
|
|
|
272
286
|
// eODP columns sometimes have overlapping core sections, which are encoded in the name field
|
|
@@ -285,7 +299,5 @@ function preprocessSectionUnit(
|
|
|
285
299
|
b_pos: ensureRealFloat(b_pos),
|
|
286
300
|
t_pos: ensureRealFloat(t_pos),
|
|
287
301
|
unit_name,
|
|
288
|
-
bottomOverlap: false,
|
|
289
|
-
overlappingUnits: [],
|
|
290
302
|
};
|
|
291
303
|
}
|