diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index ddb40fa83..3b2ad9ef1 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -2,10 +2,16 @@ name: "πŸ“¦ Workspace packages" # Stage 2 of ROADMAP.md (outcome 2): loop_common/loop_interpolation live under # packages/ as independent uv-workspace members so the interpolation code is -# usable outside the LoopStructural framework. This job installs and tests -# them on their own, separately from the root LoopStructural test suite in -# tester.yml. loopstructural-test waits on packages-test (needs:) so the root -# suite only runs once loop_common/loop_interpolation are confirmed working. +# usable outside the LoopStructural framework. Stage 4 (outcomes 5, 7) added +# loopstructural_visualisation (packages-test matrix, below) and map2loop +# (map2loop-test, its own job: map2loop hard-depends on GDAL bindings, which +# aren't pip-installable on Windows/macOS the way this matrix installs +# everything else, so it only runs on ubuntu with an apt-installed libgdal β€” +# matching map2loop's own upstream CI, which uses conda for the same reason). +# This job installs and tests packages on their own, separately from the root +# LoopStructural test suite in tester.yml. loopstructural-test waits on both +# jobs (needs:) so the root suite only runs once every workspace package is +# confirmed working. on: push: @@ -32,7 +38,7 @@ jobs: strategy: fail-fast: false matrix: - package: [loop_common, loop_interpolation] + package: [loop_common, loop_interpolation, loopstructuralvisualisation] os: ${{ fromJSON(vars.BUILD_OS)}} python-version: ${{ fromJSON(vars.PYTHON_VERSIONS)}} steps: @@ -52,10 +58,54 @@ jobs: - name: pytest run: | - uv run pytest packages/${{ matrix.package }}/tests + uv run --package ${{ matrix.package }} pytest packages/${{ matrix.package }}/tests + + map2loop-test: + # Separate job (not part of the packages-test matrix above): map2loop + # imports osgeo/gdal at module load time, which has no pip-installable + # wheel on Windows/macOS (confirmed: building GDAL from the PyPI sdist + # fails without system libgdal headers). Scoped to ubuntu-latest only, + # installing libgdal via apt, mirroring how map2loop's own upstream CI + # special-cases GDAL per-OS (it uses conda-forge everywhere). Revisit + # widening the OS matrix if/when a reliable cross-platform GDAL install + # path is found. + name: map2loop (python ${{ matrix.python-version }}) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ${{ fromJSON(vars.PYTHON_VERSIONS) }} + steps: + - uses: actions/checkout@v4 + + - name: Install GDAL system libraries + run: | + sudo apt-get update + sudo apt-get install -y gdal-bin libgdal-dev + echo "CPLUS_INCLUDE_PATH=/usr/include/gdal" >> "$GITHUB_ENV" + echo "C_INCLUDE_PATH=/usr/include/gdal" >> "$GITHUB_ENV" + + - name: Set up uv + uses: astral-sh/setup-uv@v3 + with: + version: "latest" + + - name: Set up Python ${{ matrix.python-version }} + run: uv python install ${{ matrix.python-version }} + + - name: Install package with test extras + run: | + uv sync --package map2loop --extra tests --python ${{ matrix.python-version }} + GDAL_VERSION=$(gdal-config --version) + uv pip install "gdal==${GDAL_VERSION}" + + - name: pytest + run: | + uv run --package map2loop pytest packages/map2loop/tests + loopstructural-test: name: LoopStructural (python ${{ matrix.python-version }}) - needs: packages-test + needs: [packages-test, map2loop-test] runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index 97ac389fd..6c2f3dc95 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -6,16 +6,21 @@ permissions: contents: read jobs: - # loop_common/loop_interpolation (ROADMAP.md Stage 2) are workspace-local - # deps of LoopStructural (see [tool.uv.sources] in pyproject.toml). They - # must land on PyPI before the LoopStructural sdist below is uploaded, or - # `pip install LoopStructural` breaks for anyone not using uv. + # loop_common/loop_interpolation/loopstructural_visualisation are + # workspace-local deps of LoopStructural (see [tool.uv.sources] in + # pyproject.toml) β€” loop_common/loop_interpolation are runtime deps, + # loopstructural_visualisation backs the `visualisation`/`docs` extras. + # They must land on PyPI before the LoopStructural sdist below is + # uploaded, or `pip install LoopStructural[...]` breaks for anyone not + # using uv. map2loop (ROADMAP.md Stage 4, outcome 7) has no such reverse + # dependency β€” it rides in the same matrix purely for its own independent + # PyPI publishing, not for a gating reason. make_sdist_packages: name: Make SDist (${{ matrix.package }}) runs-on: ubuntu-latest strategy: matrix: - package: [loop_common, loop_interpolation] + package: [loop_common, loop_interpolation, map2loop, loopstructural_visualisation] steps: - uses: actions/checkout@v4 @@ -36,7 +41,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - package: [loop_common, loop_interpolation] + package: [loop_common, loop_interpolation, map2loop, loopstructural_visualisation] steps: - uses: actions/download-artifact@v4 with: diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 43156337e..74515f3b8 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,5 +1,7 @@ { "LoopStructural": "1.7.0", "packages/loop_common": "0.0.2", - "packages/loop_interpolation": "0.0.1" + "packages/loop_interpolation": "0.0.1", + "packages/map2loop": "3.3.1", + "packages/loopstructural_visualisation": "0.1.17" } diff --git a/INTRUSIONS.md b/INTRUSIONS.md new file mode 100644 index 000000000..bbaf3ee99 --- /dev/null +++ b/INTRUSIONS.md @@ -0,0 +1,443 @@ +# Intrusions Module β€” Review, User Guide & Hardening Plan + +This document is the "dedicated discussion" input for **ROADMAP.md's Stage 6 +(outcome 8: intrusion workflow hardened, possibly rewritten)**. It has four +parts: + +1. **How the module works today** β€” architecture summary. +2. **User guide** β€” what data and parameters are actually required to build + an intrusion, worked from the one working example in the codebase. +3. **Review findings** β€” concrete bugs, dead code, and design smells, each + with a file:line. +4. **Simplification & hardening plan** β€” a phased proposal for Stage 6. + +Everything here was verified against the code as of commit `160c6e2a` +(2026-08-05), not against docs or memory of older versions. + +**Status (2026-08-05): Phases A-C below are done.** The fixes, the data- +contract validation, and new regression tests (including one that exercises +`marginal_faults` end-to-end for the first time, and one that pins the newly- +discovered `intrusion_steps` breakage β€” see finding 1) are all in +`tests/unit/modelling/intrusions/test_intrusions.py`. Findings are left +in place below as the historical record of what was found and fixed; +each fixed item is marked **[FIXED]**. Phase D (the larger +simplification/rewrite) is still the open item for the dedicated Stage 6 +discussion. + +--- + +## 1. Architecture summary + +Files in `LoopStructural/modelling/intrusions/`: + +| File | Role | +|---|---| +| `intrusion_frame.py` | `IntrusionFrame(StructuralFrame)` β€” marker subclass, no added behaviour. | +| `intrusion_frame_builder.py` | `IntrusionFrameBuilder(StructuralFrameBuilder)` β€” builds the curvilinear coordinate system (`c0`=growth away from the reference contact, `c1`=position along strike, `c2`=lateral/side distance), optionally conditioned by fault "steps" and "marginal faults". | +| `intrusion_builder.py` | `IntrusionBuilder(BaseBuilder)` β€” given the frame, prepares per-side/per-contact data and fits RBF interpolators over `(c1, c2)` for lateral thresholds and `(c1, c2)` for vertical thresholds, constrained by a "conceptual model" function. | +| `intrusion_feature.py` | `IntrusionFeature(BaseFeature)` β€” evaluates a signed-distance-like scalar field to the intrusion contact from the frame + the fitted thresholds. | +| `geom_conceptual_models.py` | Three conceptual-geometry functions: `ellipse_function`, `constant_function`, `obliquecone_function`. | +| `geometric_scaling_functions.py` | Empirical lengthβ†’thickness scaling from the literature (pluton/laccolith/sill scaling laws) β€” see bugs, this is **not wired up**. | +| `intrusion_support_functions.py` | Fast-marching "shortest path" helpers. **Dead code** β€” see Β§3. | + +Entry point: `GeologicalModel.create_and_add_intrusion(...)` β†’ +`_build_intrusion(...)` (`LoopStructural/modelling/core/geological_model.py:1373-1525`), +registered in the `FeatureBuilderRegistry` under `"intrusion"`. + +Build sequence inside `_build_intrusion`: + +``` +IntrusionFrameBuilder.set_intrusion_frame_parameters(intrusion_data, params) +IntrusionFrameBuilder.create_constraints_for_c0() # synthesise c0=0 points/gradients +IntrusionFrameBuilder.set_intrusion_frame_data(frame_data) +IntrusionFrameBuilder.build(...) # -> IntrusionFrame +IntrusionBuilder(frame, lateral_extent_model=..., vertical_extent_model=...) +IntrusionBuilder.set_data_for_extent_calculation(intrusion_data) +IntrusionBuilder.update_build_arguments({"geometric_scaling_parameters": ...}) +# lazy: IntrusionBuilder.build() runs on first evaluate_value() via up_to_date() +``` + +--- + +## 2. User guide β€” what's required to build an intrusion + +As of 2026-08-05, `tests/unit/modelling/intrusions/test_intrusions.py` +covers: a tabular intrusion built from a single roof-or-floor contact plus +one stratigraphic conformable feature as the inflation-gradient proxy +(`load_tabular_intrusion()`, the original path), and β€” new β€” one +`marginal_faults` example built from scratch +(`test_intrusion_marginal_faults`/`_build_marginal_fault_model`) showing a +sill offset against a single bounding fault. `intrusion_steps` is *not* +demonstrated as working, because it currently can't be β€” see Β§3, finding 1; +`test_intrusion_steps_broken_with_current_stratigraphic_column` pins the +failure instead. The shortest-path network method remains undemonstrated +and is now dead code (Β§3, finding 5) rather than just untested. + +### 2.1 Two blocks of input data + +Both blocks live in `model.data` (one `pandas.DataFrame`, distinguished by +`feature_name`), matching `intrusion_name` and `intrusion_frame_name` passed +to `create_and_add_intrusion`. + +**A. Intrusion frame data** (`feature_name == intrusion_frame_name`) β€” this +is an ordinary structural-frame dataset, the same schema used for faults and +fold frames: rows tagged `coord` 0/1/2, each with either a `val` (point lies +on that isovalue) or a gradient (`nx, ny, nz`, vector the coordinate's +gradient should be parallel to). You do **not** need to supply `coord=0` +data yourselves β€” `IntrusionFrameBuilder.set_intrusion_frame_data` (`intrusion_frame_builder.py:935-978`) +synthesises coord-0 point and gradient constraints from the intrusion +contact data below and appends them for you. You only need to supply +`coord=1` and `coord=2` constraints (an origin point + two orthogonal +direction vectors is enough β€” see the example). + +**B. Intrusion contact data** (`feature_name == intrusion_name`) β€” points +on the intrusion margin: + +| Column | Required? | Meaning | +|---|---|---| +| `X, Y, Z` | yes | point location | +| `intrusion_contact_type` | yes | `"roof"`/`"top"` or `"floor"`/`"base"` β€” which margin this point is on | +| `intrusion_side` | yes for lateral extent | boolean; `True` marks points used to constrain the lateral (lengthwise) margins. Split into "min side"/"max side" by the sign of `c2` at that point. | +| `intrusion_anisotropy` | only for steps/marginal-faults/shortest-path | name of the host-rock series or fault feature the point is associated with | + +None of these columns are validated: a missing `intrusion_contact_type` +column raises a bare pandas `KeyError` deep inside `set_intrusion_frame_c0_data` +with no indication of what's wrong (see Β§3, finding 3). + +### 2.2 `intrusion_frame_parameters` dict + +Passed to `create_and_add_intrusion(..., intrusion_frame_parameters={...})`. + +| Key | Default | Notes | +|---|---|---| +| `contact` | `"floor"` | which `intrusion_contact_type` value is the *reference* contact used to build `c0=0` | +| `contact_anisotropies` | `None` | **de facto required** β€” a list of series-type features; `create_constraints_for_c0` unconditionally indexes `[0]` (`intrusion_frame_builder.py:890`) to get an inflation-gradient proxy. Omitting it, or passing `[]`, crashes with `TypeError`/`IndexError`, not a helpful error. | +| `g_w` | `None` β†’ 100 pts | weight/count controlling how many synthetic gradient constraints get added for `c0` | +| `intrusion_steps` | `None` | **currently broken, don't use** β€” see Β§3, finding 1. Was meant to be a dict of step definitions, each needing `structure` (fault), `unit_from`/`unit_to` (stratigraphic unit names), `series_from`/`series_to` (series features) | +| `marginal_faults` | `None` | dict of fault definitions bounding the intrusion; each needs `structure` (a `FaultSegment`/`FaultSegment`-like object, indexed as `structure[0]` for its coordinate-0 feature β€” same convention as `intrusion_steps`' `structure`), `block` (`"hanging wall"`/`"foot wall"`), `series` (a series feature). Working example: `test_intrusion_marginal_faults` in `test_intrusions.py`. | +| `delta_c`, `delta_f` | `[1]*n` | multiplies the std-dev band used to detect points near a contact/fault when synthesising `c0` constraints | + +### 2.3 Conceptual model functions + +`intrusion_lateral_extent_model` and `intrusion_vertical_extent_model` are +plain functions from `geom_conceptual_models.py` (or custom ones matching +the same **dual-arity calling convention** β€” see Β§3, finding 8): +`ellipse_function` (lateral) and `constant_function` or `obliquecone_function` +(vertical) are the built-ins. + +### 2.4 Worked example (from the passing test) + +```python +from LoopStructural import GeologicalModel +from LoopStructural.datasets import load_tabular_intrusion +from LoopStructural.modelling.intrusions import ellipse_function, constant_function + +data, bounding_box = load_tabular_intrusion() + +model = GeologicalModel(bounding_box[0, :], bounding_box[1, :]) +# NOT `model.data = data` -- this dataset has no nx/ny/nz/tx/ty/tz columns, +# and `prepare_data` is what normalises those in; skipping it builds a model +# that crashes with a bare KeyError the moment anything calls +# `evaluate_value()` on it. See Β§3, finding 1b. +model.data = model.prepare_data(data) + +stratigraphy = model.create_and_add_foliation("stratigraphy") + +intrusion = model.create_and_add_intrusion( + "tabular_intrusion", + "tabular_intrusion_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [stratigraphy], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, +) +``` + +`intrusion.evaluate_value(xyz)` then returns a signed pseudo-distance field +to the intrusion contact (negated internally so it can double as an +unconformity β€” `intrusion_feature.py:329-331`). Note `evaluate_gradient` is +`NotImplementedError` (`intrusion_feature.py:233-235`) β€” anything in the +model stack that needs gradients of a feature (fold axes, some fault +throw calculations, vector-field visualisation) cannot be pointed at an +`IntrusionFeature`. + +--- + +## 3. Review findings + +Ordered roughly most β†’ least impactful. **[FIXED]** markers were added +2026-08-05 after implementing Phases A-C (see Β§4); the rest of the text is +left as originally written for the record. + +1. **`intrusion_steps` is not just untested β€” it's provably broken against + the current `StratigraphicColumn`.** Discovered while writing the Phase C + regression test (below), this is worse than originally written here. + `IntrusionFrameBuilder.set_intrusion_steps_parameters` reads + `self.model.stratigraphic_column[series_from_name.name][unit_from_name].get("id"/"min"/"max")` + β€” i.e. it expects `model.stratigraphic_column` to still be the old + nested `{group_name: {unit_name: {...}}}` dict. It no longer is: + `GeologicalModel.stratigraphic_column` is now a `StratigraphicColumn` + object (`modelling/core/stratigraphic_column.py`) whose `__getitem__` + looks up a single element by `uuid`, not by group/series name, and + returns a `StratigraphicColumnElement` (no `.get()`). Worse, + `GeologicalModel.set_stratigraphic_column` β€” the old dict-based setter β€” + now unconditionally `raise DeprecationWarning(...)` after logging, so + there is no longer any way to put the model into the shape + `intrusion_steps` expects at all. This is a real regression from an + unrelated stratigraphic-column refactor that was never propagated to the + intrusions module. **Confirmed by** `test_intrusion_steps_broken_with_current_stratigraphic_column` + in `test_intrusions.py`, which pins the exact current failure + (`KeyError: 'No element found with uuid: ...'`). Fixing this for real + needs a design decision (what should `unit_from`/`series_from` resolve + against now?) β€” that's Stage 6 work, not something patched in Phase A-C. + +1b. **[FIXED, as a documentation/test fix]** The packaged + `datasets/data/tabular_intrusion.csv` β€” the *only* dataset this module + has β€” has no `nx`/`ny`/`nz`/`tx`/`ty`/`tz` columns, only `gx`/`gy`/`gz`. + `GeologicalModel.data = df` does not normalise columns (unlike + `GeologicalModel.prepare_data(df)`, which adds any of `all_heading()` + missing as `NaN`). `GeologicalFeatureBuilder.add_data_to_interpolator` + unconditionally indexes `normal_vec_names()`/`tangent_vec_names()` on a + builder's own data, so **any full end-to-end build+`evaluate_value()` + call through the real `create_and_add_intrusion` API** (as opposed to + the two pre-existing tests, which manually construct + `IntrusionFrameBuilder`/`IntrusionBuilder` and pass already-`prepare_data`-d + slices, or never call `evaluate_value` at all) crashes with a bare + pandas `KeyError` on the missing columns. This is a general + `GeologicalModel`/`GeologicalFeatureBuilder` sharp edge, not specific to + intrusions, but intrusions is where it surfaced, precisely because (per + finding 1) nothing had ever driven this dataset through the real, + public, end-to-end path before. The fix used throughout the new tests is + simply `model.data = model.prepare_data(df)` instead of `model.data = df` + β€” worth calling out prominently in any future user guide/docs for this + dataset, since the obvious `model.data = data` (as the original + `test_intrusion_frame_builder`/`test_intrusion_builder` imply, and as + this document's own Β§2.4 example originally showed) silently sets up a + model that will crash the moment anyone actually evaluates it. + +2. **[FIXED] `geometric_scaling_parameters` is fully non-functional.** + `IntrusionBuilder.create_geometry_using_geometric_scaling` + (`intrusion_builder.py:113-154`) always raised `NotImplementedError`, + even on the branch where `thickness` *is* provided β€” the + `raise NotImplementedError("Not implemented")` at line 146 was + unconditional, after the early-return-shaped `if estimated_thickness is + None` check. The only way to reach this function is if the *other* + contact has zero data points **and** `geometric_scaling_parameters` is + non-empty, so passing this parameter to `create_and_add_intrusion` for a + single-contact intrusion always crashed. `geometric_scaling_functions.py`'s + `contact_pts_using_geometric_scaling` (which this should call) is fully + implemented and unit-testable, but dead β€” its only caller was commented + out. **Fix applied:** the function now raises immediately, with a clear + message naming what's missing, instead of after several lines that look + like partial progress; the dead commented-out code and the now-pointless + wildcard import of `geometric_scaling_functions` were removed. Pinned by + `test_intrusion_geometric_scaling_not_implemented`. + +3. **[FIXED] A typo silently drops a user-supplied build weight.** + `GeologicalModel._build_intrusion` called + `intrusion_frame_builder.build(nelements=..., w2=weights[0], + w1=weights[1], gxygz=weights[2])`. `StructuralFrameBuilder.build` + only recognises the deprecated alias `gyxgz` for `w3` β€” `gxygz` (letters + transposed) fell into `**kwargs` and was silently ignored. Any caller + passing `gyxgz=...` to `create_and_add_intrusion` to weight the frame's + third-coordinate orthogonality constraint had no effect; `w3` was always + `1.0`. This was the only call site in the codebase using this kwarg name + for a frame build β€” faults/foliations don't have this bug, which is + consistent with the intrusion path being far less exercised. **Fix + applied:** `gxygz` β†’ `gyxgz`. Pinned by + `test_intrusion_gyxgz_weight_reaches_frame_build`. + +4. **[FIXED] No data-contract validation.** Missing `intrusion_contact_type`, + `intrusion_side`, or `intrusion_anisotropy` columns failed with bare + `KeyError`/`AttributeError` deep in helper methods, not at the + `create_and_add_intrusion` boundary where the user could get a useful + message. Likewise `contact_anisotropies` being `None`/empty crashed with + no hint of what's missing. **Fix applied:** + `GeologicalModel._validate_intrusion_inputs` now runs at the top of + `_build_intrusion` and raises a clear `ValueError` naming the missing + feature/column/parameter. Pinned by + `test_intrusion_missing_data_raises_clear_error`, + `test_intrusion_missing_contact_type_column_raises_clear_error`, + `test_intrusion_missing_contact_anisotropies_raises_clear_error`. + +5. **Dead code β€” mostly [FIXED]:** + - **[FIXED, deleted]** `intrusion_support_functions.py` (shortest-path + grid/graph helpers, ~390 lines) β€” not imported anywhere outside itself. + - **[FIXED, deleted]** `IntrusionFeature.evaluate_value_test` β€” an entire + parallel implementation of `evaluate_value`, unused. + - **[FIXED, deleted]** `IntrusionFrameBuilder.update()` was an exact + duplicate of the parent `StructuralFrameBuilder.update()` β€” redundant + override. + - **[FIXED, deleted]** the two discarded + `self.marginal_faults[fault_i].get("emplacement_mechanism")` calls. + - **[FIXED]** `IntrusionFeature.evaluate_value`'s dead `if/else` with + identical bodies (the `marginal_faults is not None` branch) collapsed + to one unconditional assignment. + - **Left as-is (not removed):** `IntrusionFeature.add_assisting_faults`/ + `self.assisting_faults` is still set but never populated by any caller + in the codebase, so the "asymmetry weight" branch in `evaluate_value` + stays unreachable in practice β€” removing a public method felt like a + bigger call than Phase A's "no behaviour change" scope; flagging again + for Phase D. `intrusion_builder.py`'s comment + `# intrusion_frame_builder.post_intrusion_faults = faults # LG unused?` + (your own prior TODO) is also still there, unaddressed. + +6. **Reproducibility, corrected.** Originally written up here as "KMeans + hardcodes `random_state=0` instead of going through the shared, + seedable `rng`" β€” that framing turned out to be backwards. + `loop_common.utils.rng` (`from ...utils import rng`, used e.g. for + `rng.shuffle`) is `np.random.default_rng()` created **unseeded**, once, + at import time β€” it's not actually reproducible across process runs + either, and there's no `set_seed`-style entry point anywhere in the + codebase. Routing `KMeans` through it would have made cluster labels + (and therefore the synthesised `c0` constraints for steps/marginal + faults) vary run-to-run instead of being the one deterministic piece. + **Fix applied instead:** kept the fixed seed (it's the right call), but + replaced the two duplicated `random_state=0` literals and the stale + `# TODO create global loopstructural random state variable` comment + (which described a solution β€” the shared `rng` β€” that doesn't actually + solve this) with one named module constant, `_KMEANS_RANDOM_STATE`. + +7. **Scikit-learn dependency, corrected.** Originally flagged here as "a + hard dependency on scikit-learn just for the steps/marginal-faults code + path." On checking `pyproject.toml`, `scikit-learn` is already a + top-level `dependencies` entry for the whole package (also used in + `LoopStructural/utils/helper.py` and `_transformation.py`), so this + isn't an extra install cost specific to intrusions β€” retracted as a + finding. The module-scope `try/except ImportError: ... raise` in + `intrusion_frame_builder.py` is still slightly unusual style (failing at + import time rather than at first use), but not a real problem worth + spending Phase A/B effort on. + +8. **Conceptual-model functions overload call arity to mean two different + things.** `ellipse_function`/`constant_function`/`obliquecone_function` + are called once with **no arguments** (during + `set_conceptual_models_parameters`, to fetch bounds: + `intrusion_builder.py:277-278`) and later called **with data** to + evaluate the model at points. This works only because every branch + checks `if .empty` and returns a different tuple shape. It's an + implicit, undocumented protocol β€” a custom conceptual model has to + reverse-engineer this from the three built-ins rather than from any + docstring or interface. A named two-method interface (e.g. `.bounds()` + / `.evaluate(data, ...)`, whether a `Protocol` or small ABC) would make + custom conceptual models actually writable by a user. + +9. **`IntrusionFrameBuilder` is a ~20-attribute god object** mixing frame + geometry, steps, marginal faults, deprecated shortest-path indicator + functions (`IFf`, `IFc`, single/double-letter names), and sill-splitting + in one class. `create_constraints_for_c0` alone is ~200 lines covering + four largely-independent concerns (steps / marginal faults / gradient + constraints / sill-splitting) in one method with deep nesting. + +10. **Copy-pasted min/max-side blocks.** `IntrusionBuilder.set_data_for_lateral_thresholds` + (`intrusion_builder.py:344-563`, ~220 lines) repeats the same + conceptual/residual computation twice β€” once for the `L<0` side, once + for `L>0` β€” with only sign/index flips between them. Same shape of + duplication in `interpolate_lateral_thresholds` + (`intrusion_feature.py:60-137`). Both are natural candidates for a + single side-parameterised helper. + +11. **Fragile cross-feature reach-through.** Sill-splitting + (`create_constraints_for_c0`, `intrusion_frame_builder.py:807-815`) does + `self.model.__getitem__(splits_from_sill_name).intrusion_frame.builder.intrusion_steps` + β€” reaching through a private-ish attribute chain on another feature + entirely, with no cycle detection if two sills reference each other. + +12. **[FIXED] Wildcard import.** `intrusion_builder.py:6` had + `from .geometric_scaling_functions import *`. Removed as part of the + finding-2 fix, once `create_geometry_using_geometric_scaling` no longer + called anything from that module. + +13. **Naming/typo debt** (low severity, but adds up for anyone trying to + read this code for the first time): `strigraphic` (`intrusion_frame_builder.py:306,474`), + `framce` (`:307,475`), `aftecting` (`:904`), `yo may increase` (`:822`), + `indentify` (multiple), single-letter/cryptic names (`If`, `Ic`, `IFf`, + `IFc`, `s`, `d`/`e`/`f` as boolean masks in `evaluate_value`). + +--- + +## 4. Simplification & hardening plan + +Proposed as the concrete content for **ROADMAP.md Stage 6**. Phased so each +step is independently shippable and testable, following the same +small-stages philosophy as the rest of the v2 roadmap. + +**Phase A β€” stop the bleeding (no behaviour change to the working path) β€” +DONE 2026-08-05:** +- Fixed the `gxygz`/`gyxgz` typo (finding 3); regression test + `test_intrusion_gyxgz_weight_reaches_frame_build`. +- Deleted confirmed-dead code: `intrusion_support_functions.py`, + `evaluate_value_test`, the unused `emplacement_mechanism` `.get()` calls, + the redundant `IntrusionFrameBuilder.update()` override, the now-pointless + wildcard import. +- `geometric_scaling_parameters` now fails immediately with a clear message + instead of after several lines that looked like partial progress + (finding 2); regression test `test_intrusion_geometric_scaling_not_implemented`. + `add_assisting_faults` was deliberately **not** touched β€” removing a + public method felt out of scope for "no behaviour change"; still flagged + for Phase D. +- Replaced the two hardcoded `KMeans(random_state=0)` with one named + constant and corrected the misleading comment about routing through the + shared `rng` (finding 6 β€” that would have made results *less* + reproducible, not more; see the corrected finding for why). + +**Phase B β€” make the failure modes legible β€” DONE 2026-08-05:** +- `GeologicalModel._validate_intrusion_inputs` now runs at the top of + `_build_intrusion`: checks both `feature_name`s have data, required + columns (`intrusion_contact_type`, `intrusion_side`) are present, and + `contact_anisotropies` is non-empty β€” clear `ValueError`s instead of a + `KeyError` several calls deep. Regression tests + `test_intrusion_missing_data_raises_clear_error`, + `test_intrusion_missing_contact_type_column_raises_clear_error`, + `test_intrusion_missing_contact_anisotropies_raises_clear_error`. +- The "make scikit-learn optional" item was **retracted**: scikit-learn is + already a top-level dependency of the whole package (finding 7, + corrected), so there was nothing to fix here. + +**Phase C β€” cover what's untested before touching it further β€” DONE +2026-08-05, with a significant finding:** +- Added `test_intrusion_marginal_faults` (`_build_marginal_fault_model`): a + from-scratch synthetic sill offset by one bounding fault, built and + evaluated end-to-end through the real `create_and_add_intrusion` public + API β€” the first time this code path has ever been exercised. +- Attempting the equivalent for `intrusion_steps` surfaced finding 1: + it doesn't work at all against the current `StratigraphicColumn`, not + just "untested." `test_intrusion_steps_broken_with_current_stratigraphic_column` + pins the current failure instead of demonstrating success. **This means + Phase D's scope for `intrusion_steps` is bigger than originally framed + here**: it's not "simplify working code," it's "decide what this feature + should even look like against the new stratigraphic column API, or drop + it." That decision belongs in the dedicated Stage 6 discussion. +- Also surfaced finding 1b (the packaged `tabular_intrusion.csv` dataset + needs `model.prepare_data()`, not a bare `model.data = df`, to survive an + end-to-end `evaluate_value()` call) β€” fixed in the tests and in this + document's own worked example (Β§2.4), which had the same bug. + +**Phase D β€” the actual simplification (larger, still open β€” needs the +Stage 6 discussion):** +- Split `IntrusionFrameBuilder` along its four concerns (frame geometry / + steps / marginal faults / deprecated shortest-path) into + composable pieces, so the common tabular case doesn't carry ~20 unused + attributes. +- Replace the conceptual-model dual-arity calling convention (finding 8) + with an explicit two-method interface; migrate the three built-ins. +- Collapse the min/max-side and lateral/vertical duplicated blocks + (findings 10) into single side-parameterised helpers. +- Decide whether the shortest-path network method is kept (and given the + same test/doc treatment as the rest) or removed outright β€” it's now fully + dead code (finding 5/1), not half-present: `intrusion_network_type` is + initialised to `None` and never set to `"shortest path"` anywhere reachable. +- Decide what `intrusion_steps` should even look like against the current + `StratigraphicColumn` object (finding 1) β€” the old nested-dict lookup it + was written against no longer exists, and there's no bridge back to it. + This is bigger than a refactor: it needs a real design decision before + any of the "simplify the god object" work below can safely touch it. + +Phases A-C landed 2026-08-05 (see the "DONE" notes above) β€” they didn't +need to wait for the Stage-5 graph backend. Phase D is what still needs the +"dedicated discussion" ROADMAP.md defers to post-Stage-5, since a graph +backend may change how frame/feature dependencies (sill-splitting, step +faults) are expressed anyway, and the `intrusion_steps`/`StratigraphicColumn` +question needs a decision either way. diff --git a/LoopStructural/modelling/core/geological_model.py b/LoopStructural/modelling/core/geological_model.py index 72e661201..74a9458f5 100644 --- a/LoopStructural/modelling/core/geological_model.py +++ b/LoopStructural/modelling/core/geological_model.py @@ -5,6 +5,7 @@ import json import pathlib +import warnings import numpy as np import pandas as pd @@ -830,13 +831,15 @@ def set_stratigraphic_column(self, stratigraphic_column, cmap="tab20"): } """ + warnings.warn( + "set_stratigraphic_column is deprecated, use model.stratigraphic_column.add_units instead", + DeprecationWarning, + stacklevel=2, + ) self.stratigraphic_column.clear(basement=False) # if the colour for a unit hasn't been specified we can just sample from # a colour map e.g. tab20 logger.info("Adding stratigraphic column to model") - raise DeprecationWarning( - "set_stratigraphic_column is deprecated, use model.stratigraphic_column.add_units instead" - ) for i, g in enumerate(stratigraphic_column.keys()): if g == 'faults': logger.info('Not adding faults to stratigraphic column') @@ -1402,6 +1405,50 @@ def create_and_add_intrusion( **kwargs, ) + def _validate_intrusion_inputs( + self, + intrusion_name, + intrusion_frame_name, + intrusion_data, + intrusion_frame_data, + intrusion_frame_parameters, + ): + """Fail fast, at the `create_and_add_intrusion` boundary, with a clear + message naming the missing piece -- instead of a bare `KeyError` + several calls deep inside `IntrusionFrameBuilder`/`IntrusionBuilder` + once building has already started. See ``INTRUSIONS.md`` finding 4. + """ + if intrusion_data.empty: + raise ValueError( + f"No data found for intrusion '{intrusion_name}': check that " + "model.data contains rows with feature_name == " + f"'{intrusion_name}'" + ) + if intrusion_frame_data.empty: + raise ValueError( + f"No data found for intrusion frame '{intrusion_frame_name}': " + "check that model.data contains rows with feature_name == " + f"'{intrusion_frame_name}'" + ) + required_columns = ["intrusion_contact_type", "intrusion_side"] + missing_columns = [c for c in required_columns if c not in intrusion_data.columns] + if missing_columns: + raise ValueError( + f"Intrusion data for '{intrusion_name}' is missing required " + f"column(s) {missing_columns}: 'intrusion_contact_type' marks " + "each point as 'roof'/'top' or 'floor'/'base', and " + "'intrusion_side' (boolean) marks points used to constrain " + "the lateral extent" + ) + contact_anisotropies = intrusion_frame_parameters.get("contact_anisotropies") + if not contact_anisotropies: + raise ValueError( + "intrusion_frame_parameters['contact_anisotropies'] is " + "required: provide a non-empty list of series-type features " + "to use as the inflation-gradient proxy for the intrusion " + "frame's coordinate 0" + ) + def _build_intrusion( self, intrusion_name, @@ -1458,6 +1505,14 @@ def _build_intrusion( intrusion_data = self.data[self.data["feature_name"] == intrusion_name].copy() intrusion_frame_data = self.data[self.data["feature_name"] == intrusion_frame_name].copy() + self._validate_intrusion_inputs( + intrusion_name, + intrusion_frame_name, + intrusion_data, + intrusion_frame_data, + intrusion_frame_parameters, + ) + # -- get variables for intrusion frame interpolation gxxgz = kwargs.get("gxxgz", 0) gxxgy = kwargs.get("gxxgy", 0) @@ -1496,7 +1551,7 @@ def _build_intrusion( nelements=nelements, w2=weights[0], w1=weights[1], - gxygz=weights[2], + gyxgz=weights[2], ) intrusion_frame = intrusion_frame_builder.frame diff --git a/LoopStructural/modelling/features/_geological_feature.py b/LoopStructural/modelling/features/_geological_feature.py index 7c47ac0c2..4660591b5 100644 --- a/LoopStructural/modelling/features/_geological_feature.py +++ b/LoopStructural/modelling/features/_geological_feature.py @@ -202,6 +202,7 @@ def evaluate_gradient( tetrahedron = regular_tetraherdron_for_points(pos, element_scale_parameter) while not resolved: + resolved = True for f in self.faults: v = ( f[0] @@ -215,8 +216,7 @@ def evaluate_gradient( ) element_scale_parameter *= 0.5 tetrahedron = regular_tetraherdron_for_points(pos, element_scale_parameter) - - resolved = True + resolved = False tetrahedron_faulted = self._apply_faults(np.array(tetrahedron.reshape(-1, 3))).reshape( tetrahedron.shape diff --git a/LoopStructural/modelling/intrusions/intrusion_builder.py b/LoopStructural/modelling/intrusions/intrusion_builder.py index 703cb929a..c4d806098 100644 --- a/LoopStructural/modelling/intrusions/intrusion_builder.py +++ b/LoopStructural/modelling/intrusions/intrusion_builder.py @@ -3,7 +3,6 @@ from ...utils import getLogger, rng from ..features.builders import BaseBuilder -from .geometric_scaling_functions import * from .intrusion_feature import IntrusionFeature logger = getLogger(__name__) @@ -113,45 +112,25 @@ def set_data_for_extent_calculation(self, intrusion_data: pd.DataFrame): def create_geometry_using_geometric_scaling( self, geometric_scaling_parameters, reference_contact_data ): - - geometric_scaling_parameters.get("intrusion_type", None) - intrusion_length = geometric_scaling_parameters.get("intrusion_length", None) - geometric_scaling_parameters.get("inflation_vector", np.array([[0, 0, 1]])) - thickness = geometric_scaling_parameters.get("thickness", None) - - if ( - self.intrusion_frame.builder.intrusion_network_contact == "floor" - or self.intrusion_frame.builder.intrusion_network_contact == "base" - ): - geometric_scaling_parameters.get("inflation_vector", np.array([[0, 0, 1]])) - else: - geometric_scaling_parameters.get("inflation_vector", np.array([[0, 0, -1]])) - - if intrusion_length is None and thickness is None: - raise ValueError( - f"No {self.intrusion_frame.builder.intrusion_other_contact} data. Add intrusion_type and intrusion_length (or thickness) to geometric_scaling_parameters dictionary" - ) - - else: # -- create synthetic data to constrain interpolation using geometric scaling - estimated_thickness = thickness - if estimated_thickness is None: - raise NotImplementedError("Not implemented") - # estimated_thickness = thickness_from_geometric_scaling( - # intrusion_length, intrusion_type - # ) - - logger.info( - f"Building tabular intrusion using geometric scaling parameters: estimated thicknes = {round(estimated_thickness)} meters" - ) - raise NotImplementedError("Not implemented") - # ( - # other_contact_data_temp, - # other_contact_data_xyz_temp, - # ) = contact_pts_using_geometric_scaling( - # estimated_thickness, reference_contact_data, inflation_vector - # ) - - # return other_contact_data_temp + """Not currently implemented. + + This is meant to synthesise the missing contact (roof or floor) from + an estimated thickness (either given directly or derived from + empirical length/thickness scaling laws, see + ``geometric_scaling_functions.thickness_from_geometric_scaling``) and + an inflation vector, via + ``geometric_scaling_functions.contact_pts_using_geometric_scaling``. + That wiring was never completed, so every call path here always + raised ``NotImplementedError`` regardless of what was passed in + (see ``INTRUSIONS.md`` finding 2). Raising immediately, rather than + after partially validating parameters, makes that unambiguous. + """ + raise NotImplementedError( + "geometric_scaling_parameters is not currently supported: " + f"'{self.intrusion_frame.builder.intrusion_other_contact}' contact " + "has no data, and synthesising it from geometric scaling is not " + "implemented. Provide explicit data for both contacts instead." + ) def prepare_data(self, geometric_scaling_parameters): """Prepare the data to compute distance thresholds along the frame coordinates. diff --git a/LoopStructural/modelling/intrusions/intrusion_feature.py b/LoopStructural/modelling/intrusions/intrusion_feature.py index bc76c74ce..d4f7ab0cc 100644 --- a/LoopStructural/modelling/intrusions/intrusion_feature.py +++ b/LoopStructural/modelling/intrusions/intrusion_feature.py @@ -265,13 +265,8 @@ def evaluate_value(self, pos): intrusion_coord1_pts ) - if self.intrusion_frame.builder.marginal_faults is not None: - c2_minside_threshold = thresholds[0] # np.zeros_like(intrusion_coord2_pts) - c2_maxside_threshold = thresholds[1] - - else: - c2_minside_threshold = thresholds[0] - c2_maxside_threshold = thresholds[1] + c2_minside_threshold = thresholds[0] + c2_maxside_threshold = thresholds[1] thresholds, _residuals, _conceptual = self.interpolate_vertical_thresholds( intrusion_coord1_pts, intrusion_coord2_pts @@ -332,81 +327,6 @@ def evaluate_value(self, pos): return intrusion_sf - def evaluate_value_test(self, points): - """ - Computes a distance scalar field to the intrusion contact (isovalue = 0). - - Parameters - ------------ - points : numpy array (x,y,z), points where the IntrusionFeature is evaluated. - - Returns - ------------ - intrusion_sf : numpy array, contains distance to intrusion contact - - """ - self.builder.up_to_date() - - # compute coordinates values for each evaluated point - intrusion_coord0_pts = self.intrusion_frame[0].evaluate_value(points) - intrusion_coord1_pts = self.intrusion_frame[1].evaluate_value(points) - intrusion_coord2_pts = self.intrusion_frame[2].evaluate_value(points) - - self.evaluated_points = [ - points, - intrusion_coord0_pts, - intrusion_coord1_pts, - intrusion_coord2_pts, - ] - - thresholds, _residuals, _conceptual = self.interpolate_lateral_thresholds( - intrusion_coord1_pts - ) - - if self.intrusion_frame.builder.marginal_faults is not None: - c2_minside_threshold = np.zeros_like(intrusion_coord2_pts) - c2_maxside_threshold = thresholds[1] - - else: - c2_minside_threshold = thresholds[0] - c2_maxside_threshold = thresholds[1] - - thresholds, _residuals, _conceptual = self.interpolate_vertical_thresholds( - intrusion_coord1_pts, intrusion_coord2_pts - ) - c0_minside_threshold = thresholds[1] - c0_maxside_threshold = thresholds[0] - - mid_point = c0_minside_threshold + ((c0_maxside_threshold - c0_minside_threshold) / 2) - - mod_intrusion_coord0_pts = intrusion_coord0_pts - mid_point - mod_c0_minside_threshold = c0_minside_threshold - mid_point - mod_c0_maxside_threshold = c0_maxside_threshold + mid_point - - a = ( - (mod_intrusion_coord0_pts >= mid_point) - * (c2_minside_threshold < intrusion_coord2_pts) - * (intrusion_coord2_pts < c2_maxside_threshold) - ) - b = ( - (mod_intrusion_coord0_pts <= mid_point) - * (c2_minside_threshold < intrusion_coord2_pts) - * (intrusion_coord2_pts < c2_maxside_threshold) - ) - c = ( - (mod_intrusion_coord0_pts <= mid_point) - * (mod_intrusion_coord0_pts >= mod_c0_minside_threshold) - * (c2_minside_threshold < intrusion_coord2_pts) - * (intrusion_coord2_pts < c2_maxside_threshold) - ) - - intrusion_sf = mod_intrusion_coord0_pts - intrusion_sf[a] = mod_intrusion_coord0_pts[a] - mod_c0_maxside_threshold[a] - intrusion_sf[b] = abs(mod_c0_minside_threshold[b] + mod_intrusion_coord0_pts[b]) - intrusion_sf[c] = mod_intrusion_coord0_pts[c] - mod_c0_minside_threshold[c] - - return intrusion_sf - def get_data(self, value_map: dict | None = None): pass diff --git a/LoopStructural/modelling/intrusions/intrusion_frame_builder.py b/LoopStructural/modelling/intrusions/intrusion_frame_builder.py index 1cd7f7e4d..9e100d6ae 100644 --- a/LoopStructural/modelling/intrusions/intrusion_frame_builder.py +++ b/LoopStructural/modelling/intrusions/intrusion_frame_builder.py @@ -17,6 +17,12 @@ logger.error('Scikitlearn cannot be imported') raise +# Fixed (not derived from the shared `rng`) so that repeated builds of the +# same intrusion produce the same contact/fault clustering: `loop_common`'s +# shared `rng` is a fresh, unseeded `np.random.default_rng()` per process, so +# routing this through it would make cluster labels vary run-to-run instead. +_KMEANS_RANDOM_STATE = 0 + class IntrusionFrameBuilder(StructuralFrameBuilder): def __init__( @@ -228,10 +234,9 @@ def add_contact_anisotropies(self, series_list: list | None = None, **kwargs): # -- use scalar field values to find different contacts series_i_vals_mod = series_i_vals.reshape(len(series_i_vals), 1) - # TODO create global loopstructural random state variable - contact_clustering = KMeans(n_clusters=n_contacts, random_state=0).fit( - series_i_vals_mod - ) + contact_clustering = KMeans( + n_clusters=n_contacts, random_state=_KMEANS_RANDOM_STATE + ).fit(series_i_vals_mod) for j in range(n_contacts): z = np.ma.masked_not_equal(contact_clustering.labels_, j) @@ -358,7 +363,9 @@ def set_intrusion_steps_parameters(self): ) series_values = series_from_name.evaluate_value(data_points_xyz) series_values_mod = series_values.reshape(len(series_values), 1) - contact_clustering = KMeans(n_clusters=2, random_state=0).fit(series_values_mod) + contact_clustering = KMeans( + n_clusters=2, random_state=_KMEANS_RANDOM_STATE + ).fit(series_values_mod) # contact 0 z = np.ma.masked_not_equal(contact_clustering.labels_, 0) @@ -491,7 +498,6 @@ def set_marginal_faults_parameters(self): for fault_i in self.marginal_faults: marginal_fault = self.marginal_faults[fault_i].get("structure") block = self.marginal_faults[fault_i].get("block") # hanging wall or foot wall - self.marginal_faults[fault_i].get("emplacement_mechanism") series_name = self.marginal_faults[fault_i].get("series") series_values_temp = series_name.evaluate_value(intrusion_frame_c0_data_xyz) @@ -828,7 +834,6 @@ def create_constraints_for_c0(self, **kwargs): delta_contact = self.marginal_faults[fault_i].get("delta_c", 1) marginal_fault = self.marginal_faults[fault_i].get("structure") block = self.marginal_faults[fault_i].get("block") # hanging wall or foot wall - self.marginal_faults[fault_i].get("emplacement_mechanism") series_name = self.marginal_faults[fault_i].get("series") fault_gridpoints_vals = marginal_fault[0].evaluate_value(grid_points) @@ -976,7 +981,3 @@ def set_intrusion_frame_data(self, intrusion_frame_data): # , intrusion_network self.add_data_from_data_frame(intrusion_frame_data_complete) self.update_geometry(intrusion_frame_data_complete[["X", "Y", "Z"]].to_numpy()) - - def update(self): - for i in range(3): - self.builders[i].update() diff --git a/LoopStructural/modelling/intrusions/intrusion_support_functions.py b/LoopStructural/modelling/intrusions/intrusion_support_functions.py deleted file mode 100644 index 086ef2478..000000000 --- a/LoopStructural/modelling/intrusions/intrusion_support_functions.py +++ /dev/null @@ -1,389 +0,0 @@ -## Support Functions for intrusion network simulated as the shortest path, and for simulations in general -import numpy as np - -from ...utils import getLogger - -logger = getLogger(__name__) - - -def sort_2_arrays(main_array, array): - """ - Sort two arrays, considering values of only the main array - - Parameters - ---------- - main array: numpy array, considered to sort secondary array - array: numpy aray, array to be sorted - - Returns - ------- - sorted arrays - """ - # function to sort 2 arrays, considering values of only the main array - - for i in range(len(main_array)): - swap = i + np.argmin(main_array[i:]) - (main_array[i], main_array[swap]) = (main_array[swap], main_array[i]) - (array[i], array[swap]) = (array[swap], array[i]) - - return main_array, array - - -def findMinDiff(arr, n): - """ - Find the min diff by comparing difference of all possible pairs in given array - - Parameters - ---------- - arr: numpy array with values to compare and fin the minimum difference - - Returns - ------- - minimum difference between values in arr - - """ - # Initialize difference as infinite - diff = 10**20 - - if n < 2: - return diff - - values = np.asarray(arr[:n], dtype=float) - pairwise_diff = np.abs(values[:, None] - values[None, :]) - np.fill_diagonal(pairwise_diff, np.inf) - min_diff = pairwise_diff.min() - diff = min(diff, min_diff) - - return diff - - -def array_from_coords(df, section_axis, df_axis): - """ - Create numpy array representing a section of the model - from a dataframe containing coordinates and values - - Parameters - ---------- - df: pandas dataframe, should have at least ['X', 'Y', 'Z', 'val_1'] columns - section_axis: string 'X' or 'Y', the cross section represented by the arrays is along the section_axis - df_axis: number of the column where the value on interest is - - Returns - ------- - array: numpy array, contains values (e.g. velocities at each point, scalar field value at each point, etc) - - """ - - if section_axis == "X": - other_axis = "Y" - elif section_axis == "Y": - other_axis = "X" - - col = len(df.columns) - if col < df_axis: - logger.error("Finding shortest path, dataframe axis out of range") - - else: - df.sort_values([other_axis, "Z"], ascending=[True, False], inplace=True) - xys = df[other_axis].unique() - zs = df["Z"].unique() - rows = len(zs) - columns = len(xys) - # values are laid out column-major (column j occupies rows - # n:n+rows of the sorted dataframe, n increasing by rows each column) - values = df.iloc[:, df_axis].to_numpy() - array = values.reshape(columns, rows).T - return array - - -def find_inout_points(velocity_field_array, velocity_parameters): - """ - Looks for the indexes of the inlet and outle in an array. - Velocity parameters of anisotropies are used to find the indexes of inlet and outlet. - It is assumed that velocity_parameter[0] correspond to the inlet anisotropy and - velocity_parameter[len(velocity_parameter)-1] corresponds to the outlet anisotropy - - Parameters - ---------- - velocity_field_array: numpy array, containing values of the velocity field used to find the shortest path - velocity_parameters: list of numbers, each value correspond to a velocity assign to an anisotropy involved in intrusion emplacement - - Returns - ------- - inlet: list of indexes, [row index in array, column index in array] - outlet: list of indexes, [row index in array, column index in array] - - """ - inlet_point = [0, 0] - outlet_point = [0, 0] - - inlet_velocity = velocity_parameters[0] + 0.1 - outlet_velocity = velocity_parameters[len(velocity_parameters) - 1] + 0.1 - - # inlet: leftmost column containing inlet_velocity, take its last (deepest) row match - inlet_mask = velocity_field_array == inlet_velocity - col_has_inlet = inlet_mask.any(axis=0) - if col_has_inlet.any(): - col = int(np.argmax(col_has_inlet)) - rows_matching = np.nonzero(inlet_mask[:, col])[0] - inlet_point[0] = rows_matching[-1] - inlet_point[1] = col - - # outlet: rightmost column containing outlet_velocity, take its first row match - outlet_mask = velocity_field_array == outlet_velocity - col_has_outlet = outlet_mask.any(axis=0) - if col_has_outlet.any(): - col = len(col_has_outlet) - 1 - int(np.argmax(col_has_outlet[::-1])) - rows_matching = np.nonzero(outlet_mask[:, col])[0] - outlet_point[0] = rows_matching[0] - outlet_point[1] = col - - return inlet_point, outlet_point - - -def shortest_path(inlet, outlet, time_map): - """ - Look for the shortest path between inlet and outlet, using a time map. - In practice, for a given point looks for the neighbour elements which is closer in time. - The search starts in the inlet, until it reaches the outlet. - - Parameters - ---------- - inlet: list of indexes (row and column) of inlet point. - outlet: list of indexes (row and column) of outlet point. - time_map: numpy array, contains values of time, computed using the fast-marching method. - - Returns - ------- - inet: (intrusion network) numpy array of same shape of time_map array. - 0 where the intrusion network is found, 1 above it, and -1 below it - - """ - inet = np.ones_like(time_map) # array to save shortest path with zeros - temp_inlet = inlet # temporary inlet - inet[temp_inlet[0], temp_inlet[1]] = 0 - i = 0 - - while True: - i = i + 1 - - neighbors = element_neighbour( - temp_inlet, time_map, inet - ) # identify neighbours elements of temporary outlet - direction = index_min(neighbors) # obtain the location (index min) of minimun difference - - if direction == 10: - break - - temp_inlet = new_inlet(temp_inlet, direction) - row = temp_inlet[0] - col = temp_inlet[1] - - # if row >= n_rows or col >= n_cols: - # break - # else: - inet[row, col] = 0 - - if temp_inlet[0] == outlet[0] and temp_inlet[1] == outlet[1]: - break - else: - continue - - # Assign -1 to points below intrusion network. - # For each column, find the first row where inet == 0 and set everything - # below it to -1. Columns with no zero are left untouched (matches the - # original loop, where h would reach the last row without breaking and - # inet[(h + 1):, j] = -1 is then a no-op empty slice). - mask_zero = inet == 0 - has_zero = mask_zero.any(axis=0) - first_zero_row = np.argmax(mask_zero, axis=0) - row_idx = np.arange(inet.shape[0])[:, None] - below_mask = (row_idx > first_zero_row[None, :]) & has_zero[None, :] - inet[below_mask] = -1 - - return inet - - -def element_neighbour(index, array, inet): - """ - Identify the value of neighbours elements for a given element. - - Parameters - ---------- - index: list of indexes (row and column) of elements. - array: numpy array, containing values - inet: numpy array, temporal intrusion network. If one of the elements is already inet=0, the assign -1. - - Returns - ------- - values: numpy array, 1x5 with the values of the neighbours of a particular element - - """ - - rows = len(array) - 1 # max index of rows of time_map array - cols = len(array[0]) - 1 # max index of columns of time_map arrays - - # fixed offsets of the 8 neighbours, in the same order as the original - # k/h indices (0: above-left, 1: above, 2: above-right, 3: left, 4: right, - # 5: below-left, 6: below, 7: below-right) - offsets = np.array( - [ - [-1, -1], - [-1, 0], - [-1, 1], - [0, -1], - [0, 1], - [1, -1], - [1, 0], - [1, 1], - ] - ) - neighbour_idx = np.asarray(index) + offsets - valid = ( - (neighbour_idx[:, 0] >= 0) - & (neighbour_idx[:, 0] <= rows) - & (neighbour_idx[:, 1] >= 0) - & (neighbour_idx[:, 1] <= cols) - ) - - values = np.full(8, -1.0) - if valid.any(): - valid_rows = neighbour_idx[valid, 0] - valid_cols = neighbour_idx[valid, 1] - values[valid] = array[valid_rows, valid_cols] - - # check if some of the neighbours is already part of the intrusion network - already_in_network = inet[valid_rows, valid_cols] == 0 - valid_positions = np.nonzero(valid)[0] - values[valid_positions[already_in_network]] = -2 - - return values - - -def index_min(array): - """ - Given an array of 1x8, dentify the index of the minimum value within the array. - - Parameters - ---------- - array: numpy array, 1x8 - - Returns - ------- - index_min: integer, index of minimum value in array - - """ - - # return the index value of the minimum value in an array of 1x8 - array = np.asarray(array) - mask = array >= 0 - - if mask.any(): - masked = np.where(mask, array, np.inf) - minimum_val = masked.min() - # original loop keeps overwriting index_min for every matching key - # in increasing order, so ties resolve to the LAST (highest) index - matches = np.nonzero(masked == minimum_val)[0] - index_min = int(matches[-1]) - else: - index_min = 10 - - return index_min - - -def new_inlet(inlet, direction): - """ - Determine new inlet indexes, given current inlet and direction of minimum difference in time map. - - Parameters - ---------- - inlet: list of indexes [row, column] - direction: integers e[0,7] (0: above-left, 1: above, 2: above right, 3: left, 4: right, 5: below left, 6: below, 7:below right) - - Returns - ------- - new_inlet: list of indexes [row, column] - - """ - pot_new_inlets = {} - - pot_new_inlets.update({"0": np.array([inlet[0] - 1, inlet[1] - 1])}) - pot_new_inlets.update({"1": np.array([inlet[0] - 1, inlet[1]])}) - pot_new_inlets.update({"2": np.array([inlet[0] - 1, inlet[1] + 1])}) - pot_new_inlets.update({"3": np.array([inlet[0], inlet[1] - 1])}) - pot_new_inlets.update({"4": np.array([inlet[0], inlet[1] + 1])}) - pot_new_inlets.update({"5": np.array([inlet[0] + 1, inlet[1] - 1])}) - pot_new_inlets.update({"6": np.array([inlet[0] + 1, inlet[1]])}) - pot_new_inlets.update({"7": np.array([inlet[0] + 1, inlet[1] + 1])}) - new_inlet = np.zeros(2) - - for key, value in pot_new_inlets.items(): - if key == str(direction): - new_inlet = value - return new_inlet - - -def grid_from_array(array, fixed_coord, lower_extent, upper_extent): - """ - Create an numpy matrix of [i,j,x,y,z,values in array], given an array of 2 dimensions (any combination between x, y an z) - - Parameters - ---------- - array: numpy array, two dimension. Represents a cross section of the model, and its values could be any property - fixed_coord: list, containing coordinate and value, - ie, [0,2] means section is in x=2, or [1, .45] means sections is in y= 0.45 - the cross section is along this coordinate - lower_extent: numpy array 1x3, lower extent of the model - upper_extent: numpy array 1x3, upper extent of the model - - Returns - ------- - values: numpy matrix of [i,j,x,y,z,values in array] - (i,j) indexed in array - (x,y,z) coordinates considering lower and upper extent of model - values, from array - - """ - - array = np.asarray(array) - spacing_i = len(array) # number of rows - spacing_j = len(array[0]) # number of columns - values = np.zeros([spacing_i * spacing_j, 6]) - - # original loops iterate outer j, inner i, with l incrementing each - # inner step, so i is the fast-varying axis and j the slow-varying axis - i_flat = np.tile(np.arange(spacing_i), spacing_j) - j_flat = np.repeat(np.arange(spacing_j), spacing_i) - array_vals = array[spacing_i - 1 - i_flat, j_flat] - - if fixed_coord[0] == "X": - y = np.linspace(lower_extent[1], upper_extent[1], spacing_j) - z = np.linspace(lower_extent[2], upper_extent[2], spacing_i) - values[:, 0] = i_flat - values[:, 1] = j_flat - values[:, 2] = fixed_coord[1] - values[:, 3] = y[j_flat] - values[:, 4] = z[i_flat] - values[:, 5] = array_vals - - if fixed_coord[0] == "Y": - x = np.linspace(lower_extent[0], upper_extent[0], spacing_j) - z = np.linspace(lower_extent[2], upper_extent[2], spacing_i) - values[:, 0] = i_flat - values[:, 1] = j_flat - values[:, 2] = x[j_flat] - values[:, 3] = fixed_coord[1] - values[:, 4] = z[i_flat] - values[:, 5] = array_vals - - if fixed_coord[0] == "Z": - x = np.linspace(lower_extent[0], upper_extent[0], spacing_j) - y = np.linspace(lower_extent[1], upper_extent[1], spacing_i) - values[:, 0] = spacing_i - 1 - i_flat - values[:, 1] = spacing_j - 1 - j_flat - values[:, 2] = x[j_flat] - values[:, 3] = y[i_flat] - values[:, 4] = fixed_coord[1] - values[:, 5] = array_vals - - return values diff --git a/ROADMAP.md b/ROADMAP.md index 3ee00c1d5..b8f7df710 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -451,13 +451,103 @@ just at release time. - [x] **3c β€” Serialization API + fixtures.** Add read/write helpers and golden tests that prove both 3a and 3b stay aligned with the current `GeologicalModel` API. -- [ ] **Stage 4 β€” Bring in `loopresources` + `map2loop` (outcomes 5, 7).** - Workspace packages, now that the pattern is proven internally in Stage 2. +- [x] **Stage 4 β€” Bring in `map2loop` + `loopstructural-visualisation` + (outcomes 5, 7).** Workspace packages, now that the pattern is proven + internally in Stage 2. `loopresources` was already attempted on branch + `lachlan/add-loop-resources` (commit `db67e6c0`) but that branch was never + merged to `master` β€” a prior status-log note here incorrectly claimed it + was done; corrected 2026-08-05. `packages/loopresources` on disk currently + contains only stray `__pycache__`/`.egg-info` left over from checking that + branch out and back, with zero tracked source β€” landing it for real is + follow-up work, not done in this pass. + - `packages/map2loop`: ported from `Loop3D/map2loop` (`master`, + commit `078f8a6d`), src-layout, own test suite brought over (78 passed + locally where GDAL bindings aren't needed). Hard-depends on `osgeo`/GDAL + at import time, which has no pip-installable wheel on Windows/macOS + (confirmed: PyPI `gdal` sdist fails to build without system headers) β€” + upstream itself only tests via conda for this reason. Given + `.github/workflows/packages.yml` is uv/pip-based, `map2loop` gets its + own CI job (`map2loop-test`) scoped to `ubuntu-latest` with an + apt-installed `libgdal-dev`, rather than joining the cross-platform + `packages-test` matrix. Does not depend on `LoopStructural`/`loop_common` + (confirmed standalone) β€” no `[tool.uv.sources]` entry needed. `loop_common` + type-reuse audit: no swap made. Its `bounding_box` is a plain geographic + extent `dict`, architecturally unrelated to `loop_common.geometry + .BoundingBox` (an interpolation-mesh local/global-frame transform + object); its structural-measurement data stays in GeoDataFrame columns, + no custom point/orientation class to swap; its ad-hoc `print()` calls + sit alongside its own already-used `map2loop.logging` module, so routing + through `loop_common.logging` instead would mean adding `loop-common` as + a new hard dependency for a cosmetic swap β€” not made. + - `packages/loopstructural_visualisation`: ported from + `Loop3D/loopstructural-visualisation` (`main`, commit `df79dc5`), + moved to this repo's `src`-layout convention (import name + `loopstructuralvisualisation` unchanged). Added to `[tool.uv.sources]` + as `loopstructuralvisualisation = { workspace = true }` (it already backs + root `pyproject.toml`'s `visualisation`/`docs` extras) β€” this in turn + required adding `LoopStructural = { workspace = true }` too, since the + package depends on `LoopStructural` itself and uv treats the workspace + root as an implicit member once any member depends on it by name (same + fix already recorded, unmerged, on the `lachlan/add-loop-resources` + branch). Had **zero existing tests upstream**; added a minimal + import-smoke test (`tests/test_import.py`) rather than leaving the CI + matrix step with nothing to run β€” real behavioral coverage is still a + gap. `loop_common` audit: one real swap (a bare `print()` in the + trame-UI import guard now goes through `LoopStructural.utils.getLogger`); + two flagged-not-forced items β€” `_3d_viewer.py` keeps importing + `BoundingBox`/`ValuePoints`/`VectorPoints` via the deprecated + `LoopStructural.datatypes` shim rather than `.geometry` directly, since + `.geometry` doesn't exist in any published `LoopStructural` release yet + and the package's declared floor is `>=1.6.17` (cosmetic cost: an extra + deprecation-warning hop within this workspace, confirmed harmless); + `_2d_viewer.py`'s `np.zeros((2, 2))` 2D map-extent representation was + left alone rather than forced into `loop_common.geometry.BoundingBox`, + which is documented elsewhere in this file as 3D-only. + - Wired both into `.github/workflows/pypi.yml` (sdist build + PyPI + upload β€” `loopstructural_visualisation` for the same "must land before + the root sdist" reason `loop_common`/`loop_interpolation` are there; + `map2loop` rides along for its own independent publishing, no gating + relationship), `release-please-config.json` + + `.release-please-manifest.json` (new components `map2loop` and + `loopstructuralvisualisation`, the latter using release-please's + `extra-files` mechanism to bump `version.py`'s `__version__` since that + package uses `dynamic = ["version"]` rather than a static pyproject + version field), and `pyproject.toml`'s ruff `per-file-ignores` (D/ANN + grandfathered for both, matching the loop_common/loop_interpolation + precedent β€” `ruff check` on both surfaced ~272 default-ruleset findings, + mostly import-sort/pyupgrade noise typical of freshly-ported external + code; `linter.yml` runs with `--fix --exit-zero` and opens an auto-PR + rather than blocking, so this isn't a merge blocker, just a known + pile left for that auto-PR / a future dedicated pass, same as Stage 2's + equivalent note). + - Full `tests/unit` re-run after all of the above: 695 passed, 4 skipped, + zero regressions. - [ ] **Stage 5 β€” Graph backend (outcome 4).** The `2.0` breaking change, using the Stage 3 YAML schema as the serialization contract and the `GeologicalModel` API as a compat facade. - [ ] **Stage 6 β€” Intrusion workflow (outcome 8).** Dedicated design - discussion once the graph backend lands. + discussion once the graph backend lands. `INTRUSIONS.md` (added + 2026-08-05) is the input for that discussion: a full review of the + current module (bugs, dead code, design smells), a user guide for the + data/parameters it actually requires, and a phased hardening plan + (A: fix/delete dead code, B: validate the data contract, C: cover + `intrusion_steps`/`marginal_faults` with tests before touching them, + D: the larger simplification β€” split the god-object builder, fix the + conceptual-model calling convention, decide the fate of the shortest-path + method). **Phases A-C done 2026-08-05** (didn't need to wait for Stage 5): + fixed a silently-dropped build weight (`gxygz`/`gyxgz` typo), deleted + confirmed dead code, made `geometric_scaling_parameters` fail fast with a + clear message, added data-contract validation at the + `create_and_add_intrusion` boundary, and added the first-ever test/example + for `marginal_faults`. Attempting the same for `intrusion_steps` surfaced + a real regression: it no longer works at all against the current + `StratigraphicColumn` object (an unrelated earlier refactor moved that API + from a nested dict to an object with different lookup semantics, and + nothing updated the intrusions module to match) β€” pinned by a test rather + than fixed, since fixing it for real is a Phase D design decision, not a + mechanical patch. Full detail in `INTRUSIONS.md`'s finding 1 and its + Phase A-C status notes. Phase D remains the open item for the dedicated + discussion. ## Status log @@ -729,3 +819,14 @@ just at release time. baseline via `git stash`. This is a large improvement on the 192-failed/458-passed baseline noted above, since most of those failures were exactly this `BoundingBox.global_origin` attribute gap. +- **2026-08-05:** Stage 4 done for `map2loop`/`loopstructural-visualisation` + (branch `stage4-map2loop-visualisation`); `loopresources` remains + unmerged (see Stage 4 bullet above for the correction to a prior, + inaccurate "done" claim about it). Full detail in the Stage 4 bullet + above: package ports, the GDAL/CI special-casing `map2loop` needed, the + `[tool.uv.sources]` wiring `loopstructural_visualisation` needed (and why + it also required adding a `LoopStructural = { workspace = true }` entry), + the `loop_common` type-reuse audit outcome for each (one real swap in + `loopstructuralvisualisation`, none warranted in `map2loop`), and the + release-please/PyPI/ruff wiring. `tests/unit`: 695 passed/4 skipped, zero + regressions. diff --git a/packages/loopstructural_visualisation/CHANGELOG.md b/packages/loopstructural_visualisation/CHANGELOG.md new file mode 100644 index 000000000..132ac2c19 --- /dev/null +++ b/packages/loopstructural_visualisation/CHANGELOG.md @@ -0,0 +1,141 @@ +# Changelog + +## [0.1.17](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.16...v0.1.17) (2025-08-14) + + +### Bug Fixes + +* linting ([87257f4](https://github.com/Loop3D/loopstructural-visualisation/commit/87257f43b8915061c7f8e3334ded449feaad35d4)) +* update for new stratigraphic colum in LoopStructural ([56def61](https://github.com/Loop3D/loopstructural-visualisation/commit/56def61d639492d5d60ccc9bfb74c54e9bafadd6)) + +## [0.1.16](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.15...v0.1.16) (2025-05-27) + + +### Bug Fixes + +* Change scalar_bar arg to show_scalar_bar ([949b3eb](https://github.com/Loop3D/loopstructural-visualisation/commit/949b3eb23c3bf38b67a9cf1f9a332aa3defdac7b)) + +## [0.1.15](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.14...v0.1.15) (2025-04-17) + + +### Bug Fixes + +* release 0.1.15 ([2e4f5c9](https://github.com/Loop3D/loopstructural-visualisation/commit/2e4f5c9628177916b7174dd48e8a321534a116b1)) + +## [0.1.14](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.13...v0.1.14) (2025-02-20) + + +### Bug Fixes + +* scaling of vector fields is now consistent for different scale models. ([49450bb](https://github.com/Loop3D/loopstructural-visualisation/commit/49450bb0514e58f3da5ee3af98bd307a3fc8c4d8)) + +## [0.1.13](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.12...v0.1.13) (2025-01-15) + + +### Bug Fixes + +* Stratigraphic column visualiser display in correct order ([7dcd5b8](https://github.com/Loop3D/loopstructural-visualisation/commit/7dcd5b8c06b637d33ac2e7c5e02bb52a1991cfdd)) +* Stratigraphic column visualiser display in correct order ([7dcd5b8](https://github.com/Loop3D/loopstructural-visualisation/commit/7dcd5b8c06b637d33ac2e7c5e02bb52a1991cfdd)) + +## [0.1.12](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.11...v0.1.12) (2024-12-18) + + +### Bug Fixes + +* add import check so trame is not required ([d6aa391](https://github.com/Loop3D/loopstructural-visualisation/commit/d6aa391257604026261c45d22e6cc64792fc669c)) + +## [0.1.11](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.10...v0.1.11) (2024-12-18) + + +### Bug Fixes + +* adding disk option to fault visualisation ([1fd1a9d](https://github.com/Loop3D/loopstructural-visualisation/commit/1fd1a9d3843e1266f4af03d6572558fa65f53527)) +* require ls >1.6.4 and add fault ellipsoid ([e71b0ab](https://github.com/Loop3D/loopstructural-visualisation/commit/e71b0abd1b4e242582214c57d485cf2939b90899)) +* update bug with trame folder ([edd3188](https://github.com/Loop3D/loopstructural-visualisation/commit/edd318850fc7e97ef4c5e37d43511f9476046324)) + +## [0.1.10](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.9...v0.1.10) (2024-10-23) + + +### Bug Fixes + +* catch case where name is passed but is None ([52ebf0f](https://github.com/Loop3D/loopstructural-visualisation/commit/52ebf0f0fe6ff253e782f8bc2832717df573e0fe)) + +## [0.1.9](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.8...v0.1.9) (2024-10-23) + + +### Bug Fixes + +* add subdir to package ([2663673](https://github.com/Loop3D/loopstructural-visualisation/commit/2663673e8bb55d28b754ab9eeb9d6ed277b2e2d8)) +* ignore subplots and fix invalid actor names ([0d0bc20](https://github.com/Loop3D/loopstructural-visualisation/commit/0d0bc2064b85bb83fa2c3a830d48598f9ab12ef1)) +* random colour was calling invalid rng function ([0182b46](https://github.com/Loop3D/loopstructural-visualisation/commit/0182b46a956a31b533934bc857d64eb5a1dc946c)) +* return cmap not array of colours ([6d0a408](https://github.com/Loop3D/loopstructural-visualisation/commit/6d0a408a8486c05c0f39ab5411f46253c3d92694)) + +## [0.1.8](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.7...v0.1.8) (2024-10-22) + + +### Bug Fixes + +* avoiding cycle ([30c8142](https://github.com/Loop3D/loopstructural-visualisation/commit/30c8142d36629db9675bf93900d5ac8477745e19)) + +## [0.1.7](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.6...v0.1.7) (2024-08-06) + + +### Bug Fixes + +* adding v ([696f407](https://github.com/Loop3D/loopstructural-visualisation/commit/696f407447d140e1e9e6b70150537fd013edf4e3)) +* removing print ([95b007d](https://github.com/Loop3D/loopstructural-visualisation/commit/95b007d5d1eda8bbbd3fb9df4c0171e8128dd3ec)) +* restrict to LS>=1.6.0 and adding conda build ([fcc9ca3](https://github.com/Loop3D/loopstructural-visualisation/commit/fcc9ca3cd458195e157a0bbefc1f5b985e300b84)) + +## [0.1.6](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.5...v0.1.6) (2024-06-06) + + +### Bug Fixes + +* update for ls scalar field changes ([553cd89](https://github.com/Loop3D/loopstructural-visualisation/commit/553cd89f978f2a025ae446cc3e4a6f40cb24e167)) + +## [0.1.5](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.4...v0.1.5) (2024-06-04) + + +### Bug Fixes + +* addin old loopstructural plots ([e716096](https://github.com/Loop3D/loopstructural-visualisation/commit/e7160967272fabb172c43a5c7a476540bdbd2715)) + +## [0.1.4](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.3...v0.1.4) (2024-06-04) + + +### Bug Fixes + +* adding ls logger ([0914d43](https://github.com/Loop3D/loopstructural-visualisation/commit/0914d439ef1606dfb57a3f1e283b991a5149d9f8)) +* adding random colour generator and rbga to hex ([ccc3994](https://github.com/Loop3D/loopstructural-visualisation/commit/ccc3994f44d34d069dcb958b4f45e6a50a652cce)) +* adding threshold to block model ([8c3c0c6](https://github.com/Loop3D/loopstructural-visualisation/commit/8c3c0c62ab1a6565892098cf9fc591e4a817f408)) +* updating to .vtk as a method ([b5ab78c](https://github.com/Loop3D/loopstructural-visualisation/commit/b5ab78c2503a59578133ad75bd329a87c10846f8)) + +## [0.1.3](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.2...v0.1.3) (2024-05-31) + + +### Bug Fixes + +* add wrapper to use pyvista plane slicer ([7bbce47](https://github.com/Loop3D/loopstructural-visualisation/commit/7bbce472083308e76828beaa867170ba6ebdafb9)) +* make sure pyvista has from_regular_faces ([6a1d402](https://github.com/Loop3D/loopstructural-visualisation/commit/6a1d402f3637d986b7e56e316f030e0ff3629e1f)) +* rename scale bar to scalar_bar ([7025441](https://github.com/Loop3D/loopstructural-visualisation/commit/7025441c74ed6518debe63fa279924d3873183bf)) + +## [0.1.2](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.1...v0.1.2) (2024-05-28) + + +### Bug Fixes + +* update pypi to remove username and pw ([c8d1b43](https://github.com/Loop3D/loopstructural-visualisation/commit/c8d1b430443a2c454b5aeeff3f2099f8d5a3a978)) + +## [0.1.1](https://github.com/Loop3D/loopstructural-visualisation/compare/v0.1.0...v0.1.1) (2024-05-28) + + +### Bug Fixes + +* trigger release ([fc6a70f](https://github.com/Loop3D/loopstructural-visualisation/commit/fc6a70fc18ecd43fedd7a3f3d8d717ae790800e7)) + +## 0.1.0 (2024-05-28) + + +### Bug Fixes + +* adding _2d_viewer file ([099c43c](https://github.com/Loop3D/loopstructural-visualisation/commit/099c43c693fb7f5e3c3f1cee587e80c12694411b)) diff --git a/packages/loopstructural_visualisation/LICENSE b/packages/loopstructural_visualisation/LICENSE new file mode 100644 index 000000000..0b251d90d --- /dev/null +++ b/packages/loopstructural_visualisation/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Loop3D + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/loopstructural_visualisation/README.md b/packages/loopstructural_visualisation/README.md new file mode 100644 index 000000000..91ab10f9b --- /dev/null +++ b/packages/loopstructural_visualisation/README.md @@ -0,0 +1,7 @@ +# loopstructural-visualisation + +A LoopStructural interface for pyvista's Plotter class. + + +To install `pip install loopstructuralvisualisation` or for a jupyter notebook environment (including the pyvista[jupyuter] dependencies) `pip install loopstructuralvisualisation[jupyter]` + diff --git a/packages/loopstructural_visualisation/pyproject.toml b/packages/loopstructural_visualisation/pyproject.toml new file mode 100644 index 000000000..933c7ad5f --- /dev/null +++ b/packages/loopstructural_visualisation/pyproject.toml @@ -0,0 +1,50 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "loopstructuralvisualisation" +description = "3D geological modelling visualisation for LoopStructural" +dynamic = ["version"] +requires-python = ">=3.9" +authors = [{ name = "Lachlan Grose", email = "lachlan.grose@monash.edu" }] +readme = "README.md" +license = { text = "MIT" } +keywords = [ + "earth sciences", + "geology", + "3-D modelling", + "structural geology", + "uncertainty", +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: Information Analysis", + "License :: OSI Approved :: MIT License", + "Operating System :: Microsoft :: Windows", + "Operating System :: POSIX", + "Operating System :: MacOS", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", +] +dependencies = ["numpy>=1.18", "pyvista>=0.42", "LoopStructural>=1.6.17"] + +[project.optional-dependencies] +jupyter = ["pyvista[jupyter]"] +all = ["pyvista[all]"] +tests = ["pytest"] + +[project.urls] +Documentation = "https://Loop3d.org/LoopStructural/" +"Bug Tracker" = "https://github.com/loop3d/loopstructural-visualisation/issues" +"Source Code" = "https://github.com/loop3d/loopstructural-visualisation" + +[tool.setuptools.dynamic] +version = { attr = "loopstructuralvisualisation.version.__version__" } + +[tool.setuptools.packages.find] +where = ["src"] +include = ["loopstructuralvisualisation", "loopstructuralvisualisation.*"] diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_2d_viewer.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_2d_viewer.py new file mode 100644 index 000000000..23cb01101 --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_2d_viewer.py @@ -0,0 +1,369 @@ +import matplotlib.pyplot as plt +import numpy as np + +from LoopStructural.utils import getLogger + +logger = getLogger(__name__) +from LoopStructural.modelling.features import FeatureType + + +class Loop2DView: + """ """ + + def __init__(self, model=None, bounding_box=np.zeros((2, 2)), nsteps=None, ax=None, **kwargs): + """ + + Parameters + ---------- + origin - lower left + maximum - upper right + nsteps - number of cells + kwargs + """ + + self.xx = None + self.yy = None + + self._bounding_box = bounding_box + self._nsteps = nsteps + if self._nsteps is not None and self._bounding_box is not None: + self._update_grid() + if model is not None: + # make sure self._nsteps is 2d + self.model = model + self.ax = ax + if self.ax is None: + fig, self.ax = plt.subplots(1, figsize=(10, 10)) + self.ax.set_aspect("equal", adjustable="box") + + # set plot limits to model bounding box + self._xmin = self.bounding_box[0, 0] + self._xmax = self.bounding_box[1, 0] + self._ymin = self.bounding_box[0, 1] + self._ymax = self.bounding_box[1, 1] + self._update_plot_limits() + + @property + def model(self): + return self._model + + @model.setter + def model(self, model): + if model is not None: + bb = np.array([model.origin[:2], model.maximum[:2]]) + self.bounding_box = bb # model.bounding_box + self.nsteps = model.nsteps[:2] + self._model = model + self._update_grid() + + @property + def nsteps(self): + return self._nsteps + + @nsteps.setter + def nsteps(self, nsteps): + if len(nsteps) != 2: + logger.error("Can't update nsteps, needs to be 2D") + return + self._nsteps = nsteps + self._update_grid() + + @property + def bounding_box(self): + return self._bounding_box + + @bounding_box.setter + def bounding_box(self, bounding_box): + self._bounding_box = bounding_box + self._update_grid() + + @property + def xmin(self): + return self._xmin + + @xmin.setter + def xmin(self, xmin): + self._xmin = xmin + self._update_plot_limits() + + @property + def xmax(self): + return self._xmax + + @xmax.setter + def xmax(self, xmax): + self._xmax = xmax + self._update_plot_limits() + + @property + def ymin(self): + return self._ymin + + @ymin.setter + def ymin(self, ymin): + self._ymin = ymin + self._update_plot_limits() + + @property + def ymax(self): + return self._ymax + + @ymax.setter + def ymax(self, ymax): + self._ymax = ymax + self._update_plot_limits() + + def _update_plot_limits(self): + self.ax.set_xlim([self._xmin, self._xmax]) + self.ax.set_ylim([self._ymin, self._ymax]) + + def _update_grid(self): + """Internal function to update the current grid when the bounding box + or number of steps changes + """ + if self.nsteps is None or self.bounding_box is None: + return + x = np.linspace(self.bounding_box[0, 0], self.bounding_box[1, 0], self.nsteps[0]) + y = np.linspace(self.bounding_box[0, 1], self.bounding_box[1, 1], self.nsteps[1]) + self.xx, self.yy = np.meshgrid(x, y, indexing="ij") + self.xx = self.xx.flatten() + self.yy = self.yy.flatten() + + def add_data(self, feature, val=True, grad=True, unfault=False, dip=True, **kwargs): + """ + Adds the data associated to the feature to the plot + Parameters + ---------- + feature : GeologicalFeature + the feature whose data you want to add + val : bool + whether to add value data + grad : bool + whether to add gradient data + unfault : bool + plot points in their restored location + dip : bool + whether to annotate the dip, default False + + kwargs are passed to matplotlib functions and draw strike + Returns + ------- + + """ + # logger.warning("Plotting restored data locations") + ori_data = [] + gradient_data = feature.builder.get_gradient_constraints() + if unfault: + gradient_data = feature.interpolator.get_gradient_constraints() + + if gradient_data.shape[0] > 0: + ori_data.append(gradient_data) + norm_data = feature.builder.get_norm_constraints() + if unfault: + norm_data = feature.interpolator.get_norm_constraints() + + if norm_data.shape[0] > 0: + ori_data.append(norm_data) + cmap = kwargs.pop("cmap", "rainbow") + # if single colour then specify kwarg, otherwise use point value + if val: + value_data = np.copy(feature.builder.get_value_constraints()) + if unfault: + value_data = np.copy(feature.interpolator.get_value_constraints()) + + value_data[:, :3] = self.model.rescale(value_data[:, :3], inplace=False) + point_colour = kwargs.pop("point_colour", None) + if point_colour is None: + self.ax.scatter( + value_data[:, 0], + value_data[:, 1], + c=value_data[:, 3], + vmin=feature.min(), + vmax=feature.max(), + cmap=cmap, + ) + if point_colour is not None: + self.ax.scatter(value_data[:, 0], value_data[:, 1], c=point_colour) + if grad: + symb_colour = kwargs.pop("symb_colour", "black") + symb_scale = kwargs.pop("symb_scale", 1.0) + gradient_data = np.hstack(ori_data) + gradient_data[:, :3] = self.model.rescale(gradient_data[:, :3], inplace=False) + gradient_data[:, 3:5] /= np.linalg.norm(gradient_data[:, 3:5], axis=1)[:, None] + t = gradient_data[:, [4, 3]] * np.array([1, -1]).T + n = gradient_data[:, 3:5] + t *= symb_scale + n *= 0.5 * symb_scale + p1 = gradient_data[:, [0, 1]] - t + p2 = gradient_data[:, [0, 1]] + t + # plt.scatter(val[:,0],val[:,1],c='black') + self.ax.plot([p1[:, 0], p2[:, 0]], [p1[:, 1], p2[:, 1]], symb_colour) + p1 = gradient_data[:, [0, 1]] + p2 = gradient_data[:, [0, 1]] + n + self.ax.plot([p1[:, 0], p2[:, 0]], [p1[:, 1], p2[:, 1]], symb_colour) + if dip: + dip_v = np.rad2deg(np.arccos(gradient_data[:, 5])).astype(int) + for d, xy, v in zip(dip_v, gradient_data[:, :2], gradient_data[:, 3:6]): + self.ax.annotate(d, xy, xytext=xy + v[:2] * symb_scale * 0.1, fontsize="small") + + def add_fault_ellipse(self, faults=None, **kwargs): + from matplotlib.patches import Ellipse + + for f in self.model.stratigraphic_column["faults"].values(): + center = self.model.rescale(f["FaultCenter"]) + e = Ellipse( + (center[0], center[1]), + f["HorizontalRadius"] * 2, + f["InfluenceDistance"] * 2, + 360 - f["FaultDipDirection"], + facecolor="None", + edgecolor="k", + ) + + self.ax.add_patch(e) + + def add_scalar_field(self, feature, z=0, **kwargs): + """ + Plot the scalar field value on a map + + Parameters + ---------- + feature : GeologicalFeature + which feature to plot on the map + z : double/np.array + height + kwargs + + Returns + ------- + + """ + zz = np.zeros(self.xx.shape) + zz[:] = z + v = feature.evaluate_value( + self.model.scale(np.array([self.xx, self.yy, zz]).T, inplace=False) + ) + return self.ax.imshow( + v.reshape(self.nsteps).T, + extent=[ + self.bounding_box[0, 0], + self.bounding_box[1, 0], + self.bounding_box[0, 1], + self.bounding_box[1, 1], + ], + vmin=feature.min(), + vmax=feature.max(), + origin="lower", + **kwargs, + ) + + def add_contour(self, feature, values, z=0, mask=None, **kwargs): + """Add an isoline of a scalar field to the map + + Parameters + ---------- + feature : GeologicalFeature + the feature to isosurface + values : list + list of values to contour + z : double/np.array, optional + elevation of map, by default 0 + """ + zz = np.zeros(self.xx.shape) + zz[:] = z + v = feature.evaluate_value( + self.model.scale(np.array([self.xx, self.yy, zz]).T, inplace=False) + ) + if mask: + maskv = mask(self.model.scale(np.array([self.xx, self.yy, zz]).T, inplace=False)) + v[~maskv] = np.nan + return self.ax.contour( + v.reshape(self.nsteps).T, + extent=[ + self.bounding_box[0, 0], + self.bounding_box[1, 0], + self.bounding_box[0, 1], + self.bounding_box[1, 1], + ], + origin="lower", + levels=values, + **kwargs, + ) + + def add_model(self, z=0, cmap=None): + """Plot the model onto a map + + Parameters + ---------- + z : int/numpy array, optional + height of the map surface (could also be a dem), by default 0 + cmap : str/matplotlib colourmap, optional + specify a colour map, by default 'tab20' + """ + if cmap is None: + import matplotlib.colors as colors + + colours = [] + boundaries = [] + data = [] + for g in self.model.stratigraphic_column.keys(): + if g == "faults": + continue + for v in self.model.stratigraphic_column[g].values(): + data.append((v["id"], v["colour"])) + colours.append(v["colour"]) + boundaries.append(v["id"]) # print(u,v) + cmap = colors.ListedColormap(colours) + + zz = np.zeros_like(self.xx) + zz[:] = z # self.bounding_box[1,2] + pts = np.vstack([self.xx.flatten(), self.yy.flatten(), zz.flatten()]) + if self.model is None: + logger.error("Mapview needs a model assigned to plot model on map") + return + vals = self.model.evaluate_model(pts.T, scale=True) + return self.ax.imshow( + vals.reshape(self.nsteps).T, + extent=[ + self.bounding_box[0, 0], + self.bounding_box[1, 0], + self.bounding_box[0, 1], + self.bounding_box[1, 1], + ], + origin="lower", + cmap=cmap, + ) + + def add_fault_displacements(self, z=0, cmap="rainbow"): + + zz = np.zeros_like(self.xx) + zz[:] = z # self.bounding_box[1,2] + pts = np.vstack([self.xx.flatten(), self.yy.flatten(), zz.flatten()]) + if self.model is None: + logger.error("Mapview needs a model assigned to plot model on map") + return + vals = self.model.evaluate_fault_displacements(pts.T, scale=True) + return self.ax.imshow( + vals.reshape(self.nsteps).T, + extent=[ + self.bounding_box[0, 0], + self.bounding_box[1, 0], + self.bounding_box[0, 1], + self.bounding_box[1, 1], + ], + origin="lower", + cmap=cmap, + ) + + def add_faults(self, **kwargs): + for f in self.model.features: + if f.type == FeatureType.FAULT: + # create a function to return true if displacement > 0 + def mask(x): + val = f.displacementfeature.evaluate_value(x) + val[np.isnan(val)] = 0 + maskv = np.zeros(val.shape).astype(bool) + maskv[np.abs(val) > 0.001] = 1 + return maskv + + self.add_contour(f, 0, mask=mask, **kwargs) diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_3d_viewer.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_3d_viewer.py new file mode 100644 index 000000000..093abcf7d --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_3d_viewer.py @@ -0,0 +1,708 @@ +import pyvista as pv +import numpy as np +import re + +from LoopStructural.datatypes import VectorPoints, ValuePoints +from LoopStructural.modelling.features import BaseFeature, StructuralFrame + +from LoopStructural.modelling.features.fault import FaultSegment +from LoopStructural.datatypes import BoundingBox +from LoopStructural import GeologicalModel +from LoopStructural.utils import getLogger +from typing import Callable, Union, Optional, List + +logger = getLogger(__name__) + + +class Loop3DView(pv.Plotter): + def __init__(self, model=None, background='white', *args, **kwargs): + """Loop3DView is a subclass of pyvista. Plotter that is designed to + interface with the LoopStructural geological modelling package. + + Parameters + ---------- + model : GeologicalModel, optional + A loopstructural model used as reference for some methods, by default None + background : str, optional + colour for the background, by default 'white' + """ + if 'shape' in kwargs: + logger.warning('shape argument is not used in Loop3DView') + kwargs.pop('shape') + super().__init__(*args, **kwargs) + self.set_background(background) + self.model = model + self.objects = {} + + def subplot(self, *args, **kwargs): + logger.warning('subplot is not supported in Loop3DView') + return self + + def add_mesh(self, *args, **kwargs): + if 'name' not in kwargs or kwargs['name'] is None: + name = 'unnamed_object' + kwargs['name'] = name + logger.warning( + f'No name provided, using {name}. Pass name argument to add_mesh to remove this error' + ) + kwargs['name'] = kwargs['name'].replace(' ', '_') + kwargs['name'] = re.sub(r'[^a-zA-Z0-9_$]', '_', kwargs['name']) + if kwargs['name'][0].isdigit(): + kwargs['name'] = 'ls_' + kwargs['name'] + if kwargs['name'][0] == '_': + kwargs['name'] = 'ls' + kwargs['name'] + kwargs['name'] = self.increment_name(kwargs['name']) + if '__opacity' in kwargs['name']: + raise ValueError('Cannot use __opacity in name') + if '__visibility' in kwargs['name']: + raise ValueError('Cannot use __visibility in name') + if '__control_visibility' in kwargs['name']: + raise ValueError('Cannot use __control_visibility in name') + return super().add_mesh(*args, **kwargs) + + def increment_name(self, name): + parts = name.split('_') + if len(parts) == 1: + name = name + '_1' + while name in self.actors: + parts = name.split('_') + try: + parts[-1] = str(int(parts[-1]) + 1) + except ValueError: + parts.append('1') + name = '_'.join(parts) + return name + + def _check_model(self, model: GeologicalModel) -> GeologicalModel: + """helper method to assign a geological model""" + if model is None: + model = self.model + if model is None: + raise ValueError("No model provided") + return model + + def _get_vector_scale(self, scale: Optional[Union[float, int]]) -> float: + autoscale = 1.0 + if self.model is not None: + # automatically scale vector data to be 5% of the bounding box length + autoscale = self.model.bounding_box.length.max() * 0.05 + if scale is None: + scale = autoscale + else: + scale = scale * autoscale + if scale > 10 * autoscale: + logger.warning( + "Vector scale magnitude greater than half of the model bounding box length, is this correct?" + ) + + return scale + + def plot_surface( + self, + geological_feature: BaseFeature, + value: Optional[Union[float, int]] = None, + paint_with: Optional[BaseFeature] = None, + colour: Optional[str] = "red", + cmap: Optional[str] = None, + opacity: Optional[float] = None, + vmin: Optional[float] = None, + vmax: Optional[float] = None, + pyvista_kwargs: dict = {}, + show_scalar_bar: bool = False, + slicer: bool = False, + name: Optional[str] = None, + bounding_box: Optional[BoundingBox] = None, + ): + """Add an isosurface of a geological feature to the model + + Parameters + ---------- + geological_feature : BaseFeature + The geological feature to plot + value : Optional[Union[float, int, List[float]]], optional + isosurface value, or list of values, by default average value of feature + paint_with : Optional[BaseFeature], optional + Paint the surface with the value of another geological feature, by default None + colour : Optional[str], optional + colour of the surface, by default "red" + cmap : Optional[str], optional + matplotlib colourmap, by default None + opacity : Optional[float], optional + opacity of the surface, by default None + vmin : Optional[float], optional + minimum value of the colourmap, by default None + vmax : Optional[float], optional + maximum value of the colourmap, by default None + pyvista_kwargs : dict, optional + other parameters passed to Plotter.add_mesh, by default {} + name : Optional[str], optional + name of the object, by default None + slicer : bool, optional + If an interactive plane slicing tool should be added, by default False + show_scalar_bar : bool, optional + Whether to show the scalar bar, by default False + """ + + if name is None: + name = geological_feature.name + '_surfaces' + name = self.increment_name(name) # , 'surface') + + surfaces = geological_feature.surfaces(value, bounding_box=bounding_box) + meshes = [] + for surface in surfaces: + s = surface.vtk() + if paint_with is not None: + clim = [paint_with.min(), paint_with.max()] + if vmin is not None: + clim[0] = vmin + if vmax is not None: + clim[1] = vmax + pyvista_kwargs["clim"] = clim + pts = np.copy(surface.vertices) + if self.model is not None: + pts = self.model.scale(pts) + scalars = paint_with(pts) + s["values"] = scalars + s.set_active_scalars("values") + colour = None + meshes.append(s) + mesh = pv.MultiBlock(meshes).combine() + actor = None + try: + + if slicer: + actor = self.add_mesh_clip_plane( + mesh, + color=colour, + cmap=cmap, + opacity=opacity, + name=name, + **pyvista_kwargs, + ) + else: + actor = self.add_mesh( + mesh, + color=colour, + cmap=cmap, + opacity=opacity, + name=name, + **pyvista_kwargs, + ) + + except ValueError: + logger.warning("No surfaces to plot") + if paint_with is not None and not show_scalar_bar: + self.remove_scalar_bar('values') + return actor + + def plot_scalar_field( + self, + geological_feature: BaseFeature, + cmap: str = "viridis", + vmin: Optional[float] = None, + vmax: Optional[float] = None, + opacity: Optional[float] = None, + pyvista_kwargs: dict = {}, + show_scalar_bar: bool = False, + slicer: bool = False, + name: Optional[str] = None, + bounding_box: Optional[BoundingBox] = None, + ): + """Plot a volume with the scalar field as the property + calls feature.scalar_field() to get the scalar field and + then pyvista add_mesh(feature.scalar_field().vtk()) + + Parameters + ---------- + geological_feature : BaseFeature + The geological feature to plot the scalar field of + cmap : str, optional + matplotlib colourmap to use, by default "viridis" + vmin : Optional[float], optional + minimum value for cmap, by default None + vmax : Optional[float], optional + max value for cmap, by default None + opacity : Optional[float], optional + opacity of the object, by default None + pyvista_kwargs : dict, optional + additional kwargs sent to add_mesh, by default {} + show_scalar_bar : bool, optional + whether to show or hide the scalar bar, by default False + slicer : bool, optional + whether to plot using a plane slicer widget, by default False + name : Optional[str], optional + name for the object to appear in the object list, by default None + + Returns + ------- + pv.Actor + a reference to the actor that is added to the mesh + """ + + if name is None: + name = geological_feature.name + '_scalar_field' + name = self.increment_name(name) # , 'scalar_field') + + volume = geological_feature.scalar_field(bounding_box=bounding_box).vtk() + if vmin is not None: + pyvista_kwargs["clim"][0] = vmin + if vmax is not None: + pyvista_kwargs["clim"][1] = vmax + if slicer: + actor = self.add_mesh_clip_plane( + volume, cmap=cmap, opacity=opacity, name=name, **pyvista_kwargs + ) + else: + actor = self.add_mesh(volume, cmap=cmap, opacity=opacity, name=name, **pyvista_kwargs) + if not show_scalar_bar: + self.remove_scalar_bar(geological_feature.name) + return actor + + def plot_block_model( + self, + cmap=None, + model=None, + pyvista_kwargs={}, + show_scalar_bar: bool = False, + slicer: bool = False, + threshold: Optional[Union[float, List[float]]] = None, + name: Optional[str] = None, + ): + """Plot a voxel model where the stratigraphic id is the active scalar. + It will use the colours defined in the stratigraphic column of the model + unless a cmap is provided. + Min/max range of cmap are defined by the min/max values of the stratigraphic ids or if + clim is provided in pyvista_kwargs + + Parameters + ---------- + cmap : str, optional + matplotlib cmap string, by default None + model : GeologicalModel, optional + the model to pass if it is not the active geologicalmodel, by default None + pyvista_kwargs : dict, optional + additional arguments to be passed to pyvista add_mesh, by default {} + show_scalar_bar : bool, optional + whether show/hide the scalar bar, by default False + slicer : bool, optional + If an interactive plane slicing tool should be added, by default False + threshold : Optional[Union[float, List[float]]], optional + Whether to threshold values of the stratigraphy. Uses same syntax as pyvista threshold., by default None + """ + model = self._check_model(model) + if name is None: + name = 'block_model' + name = self.increment_name(name) # , 'block_model') + block, codes = model.get_block_model() + block = block.vtk() + block.set_active_scalars('stratigraphy') + actor = None + if cmap is None: + cmap = self._build_stratigraphic_cmap(model) + if "clim" not in pyvista_kwargs: + pyvista_kwargs["clim"] = (np.min(block['stratigraphy']), np.max(block['stratigraphy'])) + if threshold is not None: + if isinstance(threshold, float): + block = block.threshold(threshold) + elif isinstance(threshold, (list, tuple, np.ndarray)) and len(threshold) == 2: + block = block.threshold((threshold[0], threshold[1])) + if slicer: + actor = self.add_mesh_clip_plane(block, cmap=cmap, name=name, **pyvista_kwargs) + else: + actor = self.add_mesh(block, cmap=cmap, name=name, **pyvista_kwargs) + + if not show_scalar_bar: + self.remove_scalar_bar('stratigraphy') + return actor + + def plot_fault_displacements( + self, + fault_list: Optional[List[FaultSegment]] = None, + bounding_box: Optional[BoundingBox] = None, + model=None, + cmap="rainbow", + pyvista_kwargs={}, + show_scalar_bar: bool = False, + name: Optional[str] = None, + ): + """Plot the dispalcement magnitude for faults in the model + on a voxel block + + Parameters + ---------- + fault_list : _type_, optional + list of faults to plot the model, by default None + bounding_box : _type_, optional + _description_, by default None + model : _type_, optional + _description_, by default None + cmap : str, optional + _description_, by default "rainbow" + pyvista_kwargs : dict, optional + _description_, by default {} + show_scalar_bar : bool, optional + _description_, by default False + """ + if name is None: + name = 'fault_displacement' + name = self.increment_name(name) # , 'fault_displacement_map') + if fault_list is None: + model = self._check_model(model) + fault_list = model.faults + if bounding_box is None: + model = self._check_model(model) + bounding_box = model.bounding_box + pts = bounding_box.regular_grid() + displacement_value = np.zeros(pts.shape[0]) + for f in fault_list: + disp = f.displacementfeature.evaluate_value(bounding_box.vtk().points) + displacement_value[~np.isnan(disp)] += disp[~np.isnan(disp)] + volume = bounding_box.vtk() + volume['displacement'] = displacement_value + actor = self.add_mesh(volume, cmap=cmap, **pyvista_kwargs) + if not show_scalar_bar: + self.remove_scalar_bar('displacement') + return actor + + def plot_model_surfaces( + self, + strati: bool = True, + faults: bool = True, + cmap: Optional[str] = None, + model: Optional[GeologicalModel] = None, + fault_colour: str = "black", + pyvista_kwargs: dict = {}, + show_scalar_bar: bool = False, + name: Optional[str] = None, + ): + """Plot the surfaces of the model + + Parameters + ---------- + strati : bool, optional + should stratigraphy surfaces be plotted, by default True + faults : bool, optional + should faults be plotted, by default True + cmap : Optional[str], optional + What cmap to use for the stratigraphy ids, by default None + model : Optional[GeologicalModel], optional + a GeologicalModel, if not provided will use self.model, by default None + fault_colour : str, optional + colour for the fault surfaces, by default "black" + pyvista_kwargs : dict, optional + Additional kwargs to send to add_mesh, by default {} + show_scalar_bar : bool, optional + whether to add the scalar bar, by default False + name : Optional[str], optional + name to add objects to object list with, by default None + + Returns + ------- + pv.Actor + The actor that is added to the scene + """ + model = self._check_model(model) + + actors = [] + if strati: + strati_surfaces = [] + surfaces = model.get_stratigraphic_surfaces() + if cmap is None: + cmap = model.stratigraphic_column.cmap().colors + for s in surfaces: + strati_surfaces.append(s.vtk()) + if name is None: + object_name = 'model_surfaces' + else: + object_name = f'{name}_model_surfaces' + object_name = self.increment_name(object_name) # , 'model_surfaces') + actors.append( + self.add_mesh( + pv.MultiBlock(strati_surfaces).combine(), + cmap=cmap, + name=object_name, + **pyvista_kwargs, + ) + ) + if not show_scalar_bar: + self.remove_scalar_bar() + if faults: + fault_list = model.get_fault_surfaces() + for f in fault_list: + if name is None: + object_name = f'{f.name}_surface' + if name is not None: + object_name = f'{name}_{f.name}_surface' + object_name = self.increment_name(object_name) # , 'fault_surfaces') + actors.append( + self.add_mesh(f.vtk(), color=fault_colour, name=object_name, **pyvista_kwargs) + ) + return actors + + def plot_vector_field( + self, + geological_feature: BaseFeature, + scale: Optional[float] = None, + name: Optional[str] = None, + geom='arrow', + scalars: Optional[np.ndarray] = None, + normalise: bool = False, + scale_function: Optional[Callable[[np.ndarray], np.ndarray]] = None, + pyvista_kwargs: dict = {}, + bounding_box: Optional[BoundingBox] = None, + ) -> pv.Actor: + """Plot a vector field + + Parameters + ---------- + geological_feature : BaseFeature + Geological feature to plot the vector field of + scale : float, optional + magnitude scale for the glyphs, by default 1.0 + name : Optional[str], optional + name for the viewer object list, by default None + pyvista_kwargs : dict, optional + additional kwargs to pass to add_mesh, by default {} + + Returns + ------- + pv.Actor + actor that is added to the scene + """ + if name is None: + name = geological_feature.name + '_vector_field' + name = self.increment_name(name) # , 'vector_field') + vectorfield = geological_feature.vector_field(bounding_box=bounding_box) + scale = self._get_vector_scale(scale) + return self.add_mesh( + vectorfield.vtk( + scale=scale, + geom=geom, + normalise=normalise, + scalars=scalars, + scale_function=scale_function, + ), + name=name, + **pyvista_kwargs, + ) + + def plot_data( + self, + feature: Union[BaseFeature, StructuralFrame], + value: bool = True, + vector: bool = True, + scale: Optional[Union[float, int]] = None, + geom: str = "arrow", + name: Optional[str] = None, + scalars: Optional[np.ndarray] = None, + normalise: bool = True, + pyvista_kwargs: dict = {}, + ) -> List[pv.Actor]: + """Add the data associated with a feature to the plotter + + Parameters + ---------- + feature : Union[BaseFeature, StructuralFrame] + feature to add data from + value : bool, optional + whether to add value data, by default True + vector : bool, optional + whether to plot vector data, by default True + scale : Union[float, int], optional + vector scale, by default 1 + geom : str, optional + vector glyph, by default "arrow" + name : Optional[str], optional + name to use in object list, by default None + normalise: bool, optional + normalise the vectors to be unit norm, by default True + pyvista_kwargs : dict, optional + additional kwargs to pass to pyvista add_mesh, by default {} + + Returns + ------- + List[pv.Actor] + list of actors added to the pv plotter + + Notes + ------ + When plotting a vector the bounding box is used to scale the vectors. By default + the length of the arrows will be 5% of the bounding box. The scale parameter is a + multiplier for this value. If you sent normalise to False the vectors will not be normalised + + """ + if issubclass(type(feature), BaseFeature): + feature = [feature] + logger.info(f"Scale vectors by {scale}") + scale = self._get_vector_scale(scale) + logger.info(f"Vector scale is {scale}") + actors = [] + bb = self.model.bounding_box if self.model is not None else None + for f in feature: + for d in f.get_data(): + if isinstance(d, ValuePoints): + if value: + if name is None: + object_name = d.name + '_values' + else: + object_name = f'{d.name}_values_{name}' + object_name = self.increment_name(object_name) # , 'values') + actors.append( + self.add_mesh( + d.vtk(scalars=scalars), name=object_name, **pyvista_kwargs + ) + ) + if isinstance(d, VectorPoints): + if vector: + if name is None: + object_name = d.name + '_vectors' + else: + object_name = f'{d.name}_vectors_{name}' + object_name = self.increment_name(object_name) # , 'vectors') + actors.append( + self.add_mesh( + d.vtk( + geom=geom, + scale=scale, + scalars=scalars, + bb=bb, + tolerance=None, + normalise=normalise, + ), + name=name, + **pyvista_kwargs, + ) + ) + return actors + + def plot_fold(self, folded_feature: BaseFeature, pyvista_kwargs={}): + + # folded_feature. + pass + + def plot_fault( + self, + fault: FaultSegment, + surface: bool = True, + slip_vector: bool = True, + displacement_scale_vector: bool = True, + fault_volume: bool = True, + vector_scale: Optional[Union[float, int]] = None, + name: Optional[str] = None, + geom: str = "arrow", + pyvista_kwargs: dict = {}, + bounding_box: Optional[BoundingBox] = None, + ) -> List[pv.Actor]: + """Plot a fault including the surface, slip vector and displacement volume + + Parameters + ---------- + fault : FaultSegment + the fault to plot + surface : bool, optional + flag for the 0.0 surface, by default True + slip_vector : bool, optional + flag for scaled vector field, by default True + displacement_scale_vector : bool, optional + _description_, by default True + fault_volume : bool, optional + fault displacement scalar field, by default True + vector_scale : Union[float, int], optional + scale factor for vectors, by default 200 + name : Optional[str], optional + name of the object for pyvista, by default None + pyvista_kwargs : dict, optional + additional kwargs for the pyvista plotter, by default {} + + Returns + ------- + List[pv.Actor] + list of actors added to the plot + """ + actors = [] + if surface: + if name is None: + surface_name = fault.name + '_surface' + else: + surface_name = f'{fault.name}_surface_{name}' + surface_name = self.increment_name(surface_name) + surf = fault.surfaces([0], bounding_box=bounding_box)[0] + actors.append(self.add_mesh(surf.vtk(), name=surface_name, **pyvista_kwargs)) + if slip_vector: + if name is None: + vector_name = fault.name + '_vector' + else: + vector_name = f'{fault.name}_vector_{name}' + vector_name = self.increment_name(vector_name) + + vectorfield = fault.vector_field(bounding_box=bounding_box) + vector_scale = self._get_vector_scale(vector_scale) + actors.append( + self.add_mesh( + vectorfield.vtk(scale=vector_scale, normalise=False), + name=vector_name, + **pyvista_kwargs, + ) + ) + if fault_volume: + if name is None: + volume_name = fault.name + '_volume' + else: + volume_name = f'{fault.name}_volume_{name}' + + volume = fault.displacementfeature.scalar_field(bounding_box=bounding_box) + + volume = volume.vtk().threshold([-1.0, 1.0]) + if geom == "arrow": + geom = pv.Arrow() + elif geom == "disc": + geom = pv.Disc() + geom = geom.rotate_y(90) + else: + raise ValueError(f"Unknown glyph type {geom}") + actors.append(self.add_mesh(volume, name=volume_name, **pyvista_kwargs)) + if len(actors) == 0: + logger.warning(f"Nothing added to plot for {fault.name}") + return actors + + def plot_fault_ellipsoid( + self, fault: FaultSegment, name: Optional[str] = None, pyvista_kwargs: dict = {} + ) -> pv.Actor: + """Plot the fault ellipsoid + + Parameters + ---------- + fault : FaultSegment + the fault to plot + name : Optional[str], optional + name of the object for pyvista, by default None + pyvista_kwargs : dict, optional + additional kwargs for the pyvista plotter, by default {} + + Returns + ------- + pv.Actor + actor added to the plot + """ + if name is None: + name = fault.name + '_ellipsoid' + name = self.increment_name(name) + ellipsoid = fault.fault_ellipsoid() + return self.add_mesh(ellipsoid, name=name, **pyvista_kwargs) + + def rotate(self, angles: np.ndarray): + """Rotate the camera by the given angles + order is roll, azimuth, elevation as defined by + pyvista + + Parameters + ---------- + angles : np.ndarray + roll, azimuth, elevation + """ + self.camera.roll += angles[0] + self.camera.azimuth += angles[1] + self.camera.elevation += angles[2] + + def display(self): + self.show(interactive=False) diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/__init__.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/__init__.py new file mode 100644 index 000000000..cb83b3b04 --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/__init__.py @@ -0,0 +1,13 @@ +from LoopStructural.utils import getLogger + +from ._3d_viewer import Loop3DView +from ._rotation_angle import RotationAnglePlotter +from ._2d_viewer import Loop2DView +from ._stratigraphic_column import StratigraphicColumnView + +logger = getLogger(__name__) + +try: + from ._register_loop_ui import * # this replaces default pyvista trame ui +except ImportError: + logger.warning("Could not import trame ui") diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_register_loop_ui.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_register_loop_ui.py new file mode 100644 index 000000000..8ec129b4a --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_register_loop_ui.py @@ -0,0 +1,5 @@ +import pyvista +from .trame import initialize + + +pyvista.trame.jupyter.initialize = initialize diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_rotation_angle.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_rotation_angle.py new file mode 100644 index 000000000..a02cd5dda --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_rotation_angle.py @@ -0,0 +1,88 @@ +import matplotlib.pyplot as plt +import numpy as np + +from LoopStructural.utils import getLogger + +logger = getLogger(__name__) + + +class RotationAnglePlotter: + def __init__(self, feature, axis=True): + """ """ + self.fig, self.ax = plt.subplots(2, 2, figsize=(30, 15)) + self.ax[0][0].set_ylim(-90, 90) + self.ax[1][0].set_ylim(-90, 90) + self.feature = feature + self.feature.builder.up_to_date() + + def plot(self, x, y, ix, iy, symb, **kwargs): + """ + + Parameters + ---------- + x : np.array + vector of x + y + ix + iy + symb + + Returns + ------- + + """ + return self.ax[iy][ix].plot(x, y, symb, **kwargs) + + def default_titles(self): + self.ax[0][0].set_title("Fold Axis S-Plot") + self.ax[0][1].set_title("Fold Axis S-Variogram") + self.ax[1][0].set_title("Fold Limb S-Plot") + self.ax[1][1].set_title("Fold Limb S-Variogram") + + self.ax[1][1].set_xlabel("Variogram Steps") + self.ax[1][1].set_ylabel("Fold Limb S-Variogram") + self.ax[1][0].set_ylabel("Fold Limb Rotation Angle") + self.ax[1][0].set_xlabel("Fold Frame Axial Surface Field") + + self.ax[0][1].set_xlabel("Variogram Steps") + self.ax[0][1].set_ylabel("Fold Axis S-Variogram") + self.ax[0][0].set_ylabel("Fold Axis Rotation Angle") + self.ax[0][0].set_xlabel("Fold Frame Axis Direction Field") + + def add_fold_limb_data(self, symb="bo", **kwargs): + fold_frame = self.feature.builder.fold.fold_limb_rotation.fold_frame_coordinate + rotation = self.feature.fold.fold_limb_rotation.rotation_angle + return self.plot(fold_frame, rotation, 0, 1, symb, **kwargs) + + def add_fold_limb_curve(self, symb="r-", **kwargs): + x = np.linspace( + self.feature.fold.foldframe[0].min(), + self.feature.fold.foldframe[0].max(), + 100, + ) + return self.plot(x, self.feature.builder.fold.fold_limb_rotation(x), 0, 1, symb, **kwargs) + + def add_axis_svariogram(self, symb="bo", **kwargs): + svariogram = self.feature.builder.fold.fold_axis_rotation.svario + if svariogram: + svariogram.calc_semivariogram() + return self.plot(svariogram.lags, svariogram.variogram, 1, 0, symb, **kwargs) + + def add_limb_svariogram(self, symb="bo", **kwargs): + svariogram = self.feature.builder.fold.fold_limb_rotation.svario + if svariogram: + svariogram.calc_semivariogram() + return self.plot(svariogram.lags, svariogram.variogram, 1, 1, symb, **kwargs) + + def add_fold_axis_data(self, symb="bo", **kwargs): + fold_frame = self.feature.builder.fold.fold_axis_rotation.fold_frame_coordinate + rotation = self.feature.builder.fold.fold_axis_rotation.rotation_angle + return self.plot(fold_frame, rotation, 0, 0, symb, **kwargs) + + def add_fold_axis_curve(self, symb="r-", **kwargs): + x = np.linspace( + self.feature.builder.fold.foldframe[1].min(), + self.feature.builder.fold.foldframe[1].max(), + 100, + ) + return self.plot(x, self.feature.builder.fold.fold_axis_rotation(x), 0, 0, symb, **kwargs) diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_stratigraphic_column.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_stratigraphic_column.py new file mode 100644 index 000000000..9dca3483c --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/_stratigraphic_column.py @@ -0,0 +1,81 @@ +import numpy as np +import matplotlib.pyplot as plt +from matplotlib import cm +from matplotlib.patches import Polygon +from matplotlib.collections import PatchCollection +from LoopStructural.utils import rng + + +class StratigraphicColumnView: + def __init__(self, model, ax=None, cmap=None, labels=None): + self.model = model + self.ax = ax + self.cmap = cmap + self.labels = labels + + def plot(self): + n_units = 0 # count how many discrete colours (number of stratigraphic units) + xmin = 0 + ymin = 0 + ymax = 1 + xmax = 1 + fig = None + if self.ax is None: + fig, self.ax = plt.subplots(figsize=(2, 10)) + patches = [] # stores the individual stratigraphic unit polygons + + total_height = 0 + prev_coords = [0, 0] + + # iterate through groups, skipping faults + + for g in reversed(self.model.stratigraphic_column.get_groups()): + for u in g.units: + n_units += 1 + + ymax = total_height + ymin = ymax - (u.thickness) + + if not np.isfinite(ymin): + ymin = prev_coords[1] - (prev_coords[1] - prev_coords[0]) * (1 + rng.random()) + + total_height = ymin + + prev_coords = (ymin, ymax) + + polygon_points = np.array([[xmin, ymin], [xmax, ymin], [xmax, ymax], [xmin, ymax]]) + patches.append(Polygon(polygon_points)) + xy = (0, ymin + (ymax - ymin) / 2) + if self.labels: + self.ax.annotate(self.labels[u], xy) + else: + self.ax.annotate(u.name, xy) + + if self.cmap is None: + import matplotlib.colors as colors + + colours = [] + boundaries = [] + data = [] + for g in self.model.stratigraphic_column.get_groups(): + if g == "faults": + continue + for u in g.units: + data.append((u.id, u.colour)) + colours.append(u.colour) + boundaries.append(u.id) # print(u,v) + cmap = colors.ListedColormap(colours) + else: + cmap = cm.get_cmap(self.cmap, n_units - 1) + p = PatchCollection(patches, cmap=cmap) + + colors = np.arange(len(patches)) + p.set_array(np.array(colors)) + + self.ax.add_collection(p) + + self.ax.set_ylim(total_height - (total_height - prev_coords[0]) * 0.1, 0) + + self.ax.axis("off") + + return fig diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/api.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/api.py new file mode 100644 index 000000000..035859c72 --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/api.py @@ -0,0 +1,39 @@ +from ._3d_viewer import Loop3DView + + +def plot_block_model(model, filename=None, **kwargs): + """ + Plot the model using pyvista + + Parameters + ---------- + model : LoopStructuralModel + The model to plot + kwargs : dict + Keyword arguments to pass to the plot + """ + + p = Loop3DView(model) + p.plot_block_model(**kwargs) + if filename is not None: + p.screenshot(filename) + p.show() + + +def plot_surface(model, geological_feature, **kwargs): + """ + Plot a surface using pyvista + + Parameters + ---------- + model : LoopStructuralModel + The model to plot + geological_feature : BaseFeature + The feature to plot + kwargs : dict + Keyword arguments to pass to the plot + """ + + p = Loop3DView(model) + p.plot_surface(geological_feature, **kwargs) + return p diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/__init__.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/__init__.py new file mode 100644 index 000000000..8cf564742 --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/__init__.py @@ -0,0 +1,40 @@ +from pyvista.trame.ui import UI_TITLE +from pyvista.trame.ui import get_viewer +from .ui.vuetify3 import LoopViewer as Viewer +from .. import Loop3DView + + +def initialize( + server, + plotter, + mode=None, + default_server_rendering=True, + collapse_menu=False, + **kwargs, +): # numpydoc ignore=PR01,RT01 + """Generate the UI for a given plotter.""" + state = server.state + state.trame__title = UI_TITLE + if issubclass(type(plotter), Loop3DView): + # only use the loopviewer if the plotter is a Loop3DView + viewer = Viewer(plotter, server=server) + + else: + # if pyvista use trame.ui.Viewer + viewer = get_viewer( + plotter, + server=server, + suppress_rendering=mode == "client", + ) + with viewer.make_layout(server, template_name=plotter._id_name) as layout: + viewer.layout = layout + viewer.ui( + mode=mode, + default_server_rendering=default_server_rendering, + collapse_menu=collapse_menu, + **kwargs, + ) + if issubclass(type(plotter), Loop3DView): + viewer.object_menu() + + return viewer diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/ui/vuetify3.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/ui/vuetify3.py new file mode 100644 index 000000000..c9511ad35 --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/trame/ui/vuetify3.py @@ -0,0 +1,109 @@ +# ruff: noqa: D102 +"""PyVista Trame Viewer class for a Vue 3 client. + +This class, derived from `pyvista.trame.ui.base_viewer`, +is intended for use with a trame application where the client type is "vue3". +Therefore, the `ui` method implemented by this class utilizes the API of Vuetify 3. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from trame.ui.vuetify3 import SinglePageWithDrawerLayout +from trame.widgets import vuetify3 as vuetify + +import pyvista +from pyvista.trame.ui.vuetify3 import Viewer + + +if TYPE_CHECKING: # pragma: no cover + from trame_client.ui.core import AbstractLayout + + +class LoopViewer(Viewer): + def __init__(self, *args, **kwargs): + """Overwrite the pyvista trame layout to use a singlepage layout + and add an object visibility menu to the drawer + """ + super().__init__(*args, **kwargs) + + def make_layout(self, *args, **kwargs) -> AbstractLayout: + + return SinglePageWithDrawerLayout(*args, **kwargs) + + def ui(self, *args, **kwargs): + with self.layout as layout: + layout.title.set_text("LoopStructural Viewer") + with self.layout.content: + + return super().ui(*args, **kwargs) + + def toggle_visibility(self, **kwargs): + """Toggle the visibility of an object in the plotter. + this is a slot called by the state change, the kwargs are the current state + so we need to check the keys and update accordingly + """ + for k in kwargs.keys(): + object_name = k.split("__visibility")[0] + if object_name in self.plotter.actors: + self.plotter.actors[object_name].visibility = kwargs[k] + self.update() + # self.actors[k].visibility = not self.actors[k].visibility + + def set_opacity(self, **kwargs): + """Set the opacity of an object in the plotter. + this is a slot called by the state change, the kwargs are the current state + so we need to check the keys and update accordingly + """ + for k in kwargs.keys(): + object_name = k.split("__opacity")[0] + if object_name in self.plotter.actors: + self.plotter.actors[object_name].prop.opacity = kwargs[k] + self.update() + # self.actors[k].visibility = not self.actors[k].visibility + + def object_menu(self): + with self.layout.drawer as drawer: + with vuetify.VCard(): + + for k, a in self.plotter.actors.items(): + if type(a) is not pyvista.plotting.actor.Actor: + continue + drawer.server.state[f"{k}__visibility"] = True + drawer.server.state[f"{k}__control_visibility"] = False + drawer.server.state[f"{k}__opacity"] = a.prop.opacity + drawer.server.state.change(f"{k}__visibility")(self.toggle_visibility) + drawer.server.state.change(f"{k}__opacity")(self.set_opacity) + with vuetify.VRow( + classes='pa-0 ma-0 align-center fill-height', + style='flex-wrap: nowrap', + ): + with vuetify.VCol(): + + vuetify.VCheckbox( + label=k, + classes="ma-0 pa-0", + v_model=(f"{k}__visibility"), + # click=(self.toggle_visibility("test")), + ) + with vuetify.VCol(): + vuetify.VBtn( + icon='mdi-dots-horizontal', + click=(f'{k}__control_visibility=!{k}__control_visibility'), + # click=(self.toggle_visibility("test")), + ) + with vuetify.VCard(classes="ma-0 pa-0", v_show=f'{k}__control_visibility'): + + with vuetify.VRow( + classes="ma-0 pa-0 d-flex align-center", + ): + + vuetify.VSlider( + v_model=(f"{k}__opacity"), + label="Opacity", + min=0, + max=1, + step=0.1, + thumb_label=True, + ) diff --git a/packages/loopstructural_visualisation/src/loopstructuralvisualisation/version.py b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/version.py new file mode 100644 index 000000000..86205cbac --- /dev/null +++ b/packages/loopstructural_visualisation/src/loopstructuralvisualisation/version.py @@ -0,0 +1 @@ +__version__ = "0.1.17" diff --git a/packages/loopstructural_visualisation/tests/test_import.py b/packages/loopstructural_visualisation/tests/test_import.py new file mode 100644 index 000000000..2477cbf93 --- /dev/null +++ b/packages/loopstructural_visualisation/tests/test_import.py @@ -0,0 +1,35 @@ +"""Import smoke test. + +Upstream loopstructural-visualisation ships with no test suite at all; this +is a minimal placeholder so the package has real CI coverage (packages.yml +runs `pytest packages//tests`, which needs a tests dir to exist) +rather than skipping it entirely. Extend with real behavioral tests as a +follow-up. +""" + +import loopstructuralvisualisation + + +def test_import(): + assert loopstructuralvisualisation is not None + + +def test_public_api_importable(): + from loopstructuralvisualisation import ( + Loop2DView, + Loop3DView, + RotationAnglePlotter, + StratigraphicColumnView, + ) + + assert Loop2DView is not None + assert Loop3DView is not None + assert RotationAnglePlotter is not None + assert StratigraphicColumnView is not None + + +def test_api_module_importable(): + from loopstructuralvisualisation.api import plot_block_model, plot_surface + + assert callable(plot_block_model) + assert callable(plot_surface) diff --git a/packages/map2loop/CHANGELOG.md b/packages/map2loop/CHANGELOG.md new file mode 100644 index 000000000..a462aedf0 --- /dev/null +++ b/packages/map2loop/CHANGELOG.md @@ -0,0 +1,546 @@ +# Changelog + +## [3.3.1](https://github.com/Loop3D/map2loop/compare/v3.3.0...v3.3.1) (2026-01-31) + + +### Bug Fixes + +* use first line from shapely and add all dip/thickness estimates ([#246](https://github.com/Loop3D/map2loop/issues/246)) ([381d13f](https://github.com/Loop3D/map2loop/commit/381d13fb2b281568f81fd959139f6b3ac292df18)) + +## [3.3.0](https://github.com/Loop3D/map2loop/compare/v3.2.10...v3.3.0) (2026-01-22) + + +### Features + +* AlongSection Thickness Calculator ([#240](https://github.com/Loop3D/map2loop/issues/240)) ([ba8f82a](https://github.com/Loop3D/map2loop/commit/ba8f82af0b1663c032bfb80babf8f7785a1bf794)) + +## [3.2.10](https://github.com/Loop3D/map2loop/compare/v3.2.9...v3.2.10) (2026-01-20) + + +### Bug Fixes + +* add ability to specify fault field to topoloy ([92f754b](https://github.com/Loop3D/map2loop/commit/92f754b2511a18f41c0f990ca6f6391774858ad1)) +* add call methods to allow for generic debug exporting ([3c0e0e0](https://github.com/Loop3D/map2loop/commit/3c0e0e075b9d91bc32341cc8e2f249a828b00ee4)) +* add option to set logger level and handler. ([5fb0720](https://github.com/Loop3D/map2loop/commit/5fb0720d795a7123094c39f171c3f497f53eda07)) +* adding safeguarding and fixing merge ([a675be2](https://github.com/Loop3D/map2loop/commit/a675be2d6cef5646a682dbcd5c706681830d1ad9)) +* applying copilot suggestions ([4021640](https://github.com/Loop3D/map2loop/commit/40216402634b5b9349719b681fb48525080b48a8)) +* beartype issues ([6e2ee69](https://github.com/Loop3D/map2loop/commit/6e2ee69f08d913ce3a55df3f08144ded01922829)) +* change to no default arguments and add unit_name_column as a required ([65a7b86](https://github.com/Loop3D/map2loop/commit/65a7b86ae94c44c098aceb17b13bf3fa624716b9)) +* only store geodataframe if layer is not empty ([46fade8](https://github.com/Loop3D/map2loop/commit/46fade8bc8a673c0b8c067115970da70fed209bc)) +* project import for test ([6eb1518](https://github.com/Loop3D/map2loop/commit/6eb151882369e3e7a062f60722aac9b7e3436736)) +* replace args for kwargs ([e1cb1e6](https://github.com/Loop3D/map2loop/commit/e1cb1e642ffc9a3c206d51a8ccf78a064d645b5f)) +* save location tracking as a line geodataframe for qgis compatibility ([17e14ca](https://github.com/Loop3D/map2loop/commit/17e14cae5cd466e8e3185e2569c311a611e0bed4)) +* set age based sorter args ([5226b49](https://github.com/Loop3D/map2loop/commit/5226b49cfeda5592d878fc07e5ff960ba125f51e)) +* update maximise contacts to compute length and check for empty contacts ([f2cf211](https://github.com/Loop3D/map2loop/commit/f2cf211ce61e9547ac9a00e4d70f00cba24f3d4d)) +* updating incorrect type hints ([71f473c](https://github.com/Loop3D/map2loop/commit/71f473cd7e18d984b474de3a1b4bfd91bac98d81)) +* updating logic ([86b658c](https://github.com/Loop3D/map2loop/commit/86b658c582c8ca6102729e8f8fd7370f28a113f3)) +* updating requirements for alpha sorter plus add check for empty contacts ([b0f12b6](https://github.com/Loop3D/map2loop/commit/b0f12b68cfea2e0d16935720f01240230d912595)) + +## [3.2.9](https://github.com/Loop3D/map2loop/compare/v3.2.8...v3.2.9) (2025-12-01) + + +### Bug Fixes + +* move extra sort arguments to sorter init ([#241](https://github.com/Loop3D/map2loop/issues/241)) ([3414fec](https://github.com/Loop3D/map2loop/commit/3414fec29969407f7b1b07ee59bfbedfe90a63b1)) + +## [3.2.8](https://github.com/Loop3D/map2loop/compare/v3.2.7...v3.2.8) (2025-10-29) + + +### Bug Fixes + +* add is_strike parameter in thickness calculator ([#237](https://github.com/Loop3D/map2loop/issues/237)) ([1423a62](https://github.com/Loop3D/map2loop/commit/1423a62d4ccf54f7c860422b47223247af9b418c)) + +## [3.2.7](https://github.com/Loop3D/map2loop/compare/v3.2.6...v3.2.7) (2025-09-19) + + +### Bug Fixes + +* DTM is optional ([#234](https://github.com/Loop3D/map2loop/issues/234)) ([92e0d24](https://github.com/Loop3D/map2loop/commit/92e0d24e7c1fa39c75a5fa6baf31704f91096bf0)) + +## [3.2.6](https://github.com/Loop3D/map2loop/compare/v3.2.5...v3.2.6) (2025-09-17) + + +### Bug Fixes + +* refactor sorter ([#233](https://github.com/Loop3D/map2loop/issues/233)) ([3666bcb](https://github.com/Loop3D/map2loop/commit/3666bcb99e9a38c30ba87e94b3753f51a85b5c7a)) + +## [3.2.5](https://github.com/Loop3D/map2loop/compare/v3.2.4...v3.2.5) (2025-08-15) + + +### Bug Fixes + +* handle optional columns 'INTRUSIVE' and 'SILL' in geology data extraction ([#230](https://github.com/Loop3D/map2loop/issues/230)) ([3cbc9e3](https://github.com/Loop3D/map2loop/commit/3cbc9e384068b9afb1530dae686398d4575dd064)) + +## [3.2.4](https://github.com/Loop3D/map2loop/compare/v3.2.3...v3.2.4) (2025-08-13) + + +### Bug Fixes + +* trigger release for v3.3.0 ([54eab7c](https://github.com/Loop3D/map2loop/commit/54eab7ca462eb27cc1a6320ece8d1ecf2ebba2f5)) +* trigger release for v3.3.0 ([54eab7c](https://github.com/Loop3D/map2loop/commit/54eab7ca462eb27cc1a6320ece8d1ecf2ebba2f5)) +* trigger release for v3.3.0 ([8a4e093](https://github.com/Loop3D/map2loop/commit/8a4e093fedaefa4755db393e008bfc6484be0ba2)) + +## [3.2.3](https://github.com/Loop3D/map2loop/compare/v3.2.2...v3.2.3) (2025-06-20) + + +### Bug Fixes + +* accept pathlib.Path for save_path ([4e2e799](https://github.com/Loop3D/map2loop/commit/4e2e7990eebaf0b47146632ac1311d1f96d9e9c3)) +* allow str and pathlib.Path ([ff23f45](https://github.com/Loop3D/map2loop/commit/ff23f451b244d8bce05dafbd27a91c64fd9dcbe0)) +* fold filtering to support multiple search terms ([c6d0b7a](https://github.com/Loop3D/map2loop/commit/c6d0b7aa2773bbe551fd71ec02d47f31417696f4)) +* remove duplicate functions ([f629b2d](https://github.com/Loop3D/map2loop/commit/f629b2df62bc9da7ea1409e619107e580a8d052d)) +* support multiple search terms for faults ([ad0289f](https://github.com/Loop3D/map2loop/commit/ad0289fa6de5af9e311a9e21efa13e949ff8867a)) +* use pathlib.Path for save_path ([628040d](https://github.com/Loop3D/map2loop/commit/628040d42780086f4ee1ff39e258545ef53171b9)) + + +### Documentation + +* comment typo ([1c42d2e](https://github.com/Loop3D/map2loop/commit/1c42d2e450793c40abd7ad3b0c60843089f9a7e8)) + +## [3.2.2](https://github.com/Loop3D/map2loop/compare/v3.2.1...v3.2.2) (2025-01-13) + + +### Bug Fixes + +* add featureId when parsing fault_orientations ([#177](https://github.com/Loop3D/map2loop/issues/177)) ([924c2cf](https://github.com/Loop3D/map2loop/commit/924c2cf696688abe3dc1c8579753daeb2f1b45e4)) + +## [3.2.1](https://github.com/Loop3D/map2loop/compare/v3.2.0...v3.2.1) (2025-01-12) + + +### Bug Fixes + +* include dependencies in site-packages - issue [#169](https://github.com/Loop3D/map2loop/issues/169) ([#170](https://github.com/Loop3D/map2loop/issues/170)) ([b33532b](https://github.com/Loop3D/map2loop/commit/b33532b56473148433fd192e182aadee028dc875)) + +## [3.2.0](https://github.com/Loop3D/map2loop/compare/v3.1.13...v3.2.0) (2024-12-16) + + +### Features + +* v3.2 ([#153](https://github.com/Loop3D/map2loop/issues/153)) ([7978841](https://github.com/Loop3D/map2loop/commit/7978841b7106faf478492fe20770f17d9e244fbb)) +* Thickness calculators can now be used simultaneously with `project.set_thickness_calculator([StructuralPoint(), InterpolatedStructure()])` +* Minimum fault length is a key in the config dictionary, and if not provided, it is calculated from the bbox area +* `ignore_lithology_codes()` and `ignore_fault_codes()` are new parameters in the config_dictionary +* legacy config files with legacy keys are not allowed +* `map2loop.utils.update_from_legacy_file` function may convert the hjson files into an updated config dictionary + +### Bug Fixes +* all bug fixes can be checked in ([PR#153](https://github.com/Loop3D/map2loop/pull/153)) + +## [3.1.13](https://github.com/Loop3D/map2loop/compare/v3.1.12...v3.1.13) (2024-11-19) + + +### Bug Fixes + +* bump with vtag ([5ebc07b](https://github.com/Loop3D/map2loop/commit/5ebc07b0014dcbd6c2e053113e0f39c99d2ee0a6)) +* change docs build to combine all dependencies in one file ([fb51025](https://github.com/Loop3D/map2loop/commit/fb510250526fc35ab265e8273949a2c51ba52359)) +* lowercase m2l and add vtag to rp manifest ([7311e40](https://github.com/Loop3D/map2loop/commit/7311e402b0cb7d4c5efcb3272b8caebca00a901b)) +* remove vtag setting temporarily to see if this is what's stopping version bump PR ([c73e6fd](https://github.com/Loop3D/map2loop/commit/c73e6fda01f42d76b21267f2feae76c1e5e799ce)) +* revert and double check typo on release-please ([d455350](https://github.com/Loop3D/map2loop/commit/d4553504909a25935d2c7115b1830ab56a93a071)) +* rp manifest update ([e0bb75b](https://github.com/Loop3D/map2loop/commit/e0bb75b9e70acb98d0706b7320ea87f6cfd72c80)) +* test trigger release ([2d87633](https://github.com/Loop3D/map2loop/commit/2d876337b826730cd7246f86b79d85b73acfe33c)) +* typo in rp config ([9b1ba12](https://github.com/Loop3D/map2loop/commit/9b1ba122da3ff720e8ecc2354d6031d2df8cb7c0)) + +## [3.1.12](https://github.com/Loop3D/map2loop/compare/v3.1.11...v3.1.12) (2024-09-11) + + +### Bug Fixes + +* removing additional indents ([cdd3eab](https://github.com/Loop3D/map2loop/commit/cdd3eabecf6c22fb88cdf64a9f2bad72b324eba1)) + +## [3.1.11](https://github.com/Loop3D/map2loop/compare/v3.1.10...v3.1.11) (2024-08-09) + + +### Bug Fixes + +* added check for collocated points ([#125](https://github.com/Loop3D/map2loop/issues/125)) ([2bef09f](https://github.com/Loop3D/map2loop/commit/2bef09fa3dbfecbbb012a1e393c6851e6c3bbced)) +* issue 122 ([c643721](https://github.com/Loop3D/map2loop/commit/c6437215125aea4d3a33b4150611ecc55eeb97c8)) +* linting issues ([94af4d9](https://github.com/Loop3D/map2loop/commit/94af4d9fe1bf689ddf269dfafa07a40bc5df545f)) +* remove pip pin for LPF because LPF has incorrect version tags ([dd99e15](https://github.com/Loop3D/map2loop/commit/dd99e15d167154bd902c005e012360b5005f20cf)) +* update str format ([c3339a6](https://github.com/Loop3D/map2loop/commit/c3339a63161e7945140f55e5adf394e585fa590a)) + +## [3.1.10](https://github.com/Loop3D/map2loop/compare/v3.1.9...v3.1.10) (2024-08-02) + + +### Documentation + +* corrected title ([86148a5](https://github.com/Loop3D/map2loop/commit/86148a59de1b96cddcae22c4d470c096c5fdbd5b)) + +## [3.1.9](https://github.com/Loop3D/map2loop/compare/v3.1.8...v3.1.9) (2024-08-02) + + +### Bug Fixes + +* adapt floats to new np & unpin ([7bdd346](https://github.com/Loop3D/map2loop/commit/7bdd346fc8a565f107ce6bcfe8ec687701baa028)) +* adapt floats to new np & unpin ([eac8ab2](https://github.com/Loop3D/map2loop/commit/eac8ab2e49142dd85e3bb4e9a09fb98d03482bab)) +* adding poppler dependency for gdal.... why? ([a716933](https://github.com/Loop3D/map2loop/commit/a71693380a72bc71445295ac392171a0727ebe08)) +* linting issues ([b743de4](https://github.com/Loop3D/map2loop/commit/b743de4ab1a8765cea703d041a65b1248abad1fc)) +* linting issues ([1bf6600](https://github.com/Loop3D/map2loop/commit/1bf6600a5fe12a65eb8b866376f01b5f87c8d710)) +* pin numpy version ([8a55469](https://github.com/Loop3D/map2loop/commit/8a554693b0a968e578560735f5bbb02db13d8b36)) +* pin numpy version ([7dfd91c](https://github.com/Loop3D/map2loop/commit/7dfd91cbf20d1022b00bf007e87a8b99cb3836b3)) +* update np version ([4acb184](https://github.com/Loop3D/map2loop/commit/4acb1849e7d51b3e878e59661e98d14e58187291)) +* update np version ([5614446](https://github.com/Loop3D/map2loop/commit/5614446c616479ab753b72ca1132fcd99344c94f)) +* update numpy version ([0fa6537](https://github.com/Loop3D/map2loop/commit/0fa6537841f1fa464adddae663351795e3158db1)) +* update numpy version ([b312176](https://github.com/Loop3D/map2loop/commit/b31217681d4f21ca557c9aabd5f1756b9e8e57ed)) +* use numpy type checker to catch new numpy typing ([48ac7cb](https://github.com/Loop3D/map2loop/commit/48ac7cb06d69f8549c484af6222ca6a96ab849d3)) +* use numpy type checker to catch new numpy typing ([678f25e](https://github.com/Loop3D/map2loop/commit/678f25ec77e6d8ab207b98e7cd32be706a191c35)) + +## [3.1.8](https://github.com/Loop3D/map2loop/compare/v3.1.7...v3.1.8) (2024-06-20) + + +### Bug Fixes + +* pin LPF to 0.1.3 ([f3766a8](https://github.com/Loop3D/map2loop/commit/f3766a83d0f09f293429cc975933cbf79b01c5a2)) + +## [3.1.7](https://github.com/Loop3D/map2loop/compare/v3.1.6...v3.1.7) (2024-06-18) + + +### Bug Fixes + +* adapt floats to new np & unpin ([1a08401](https://github.com/Loop3D/map2loop/commit/1a08401ad65d3897452b223de8717db8b4e5b4ab)) +* pin numpy version ([16130c6](https://github.com/Loop3D/map2loop/commit/16130c68b5c5a25c78f44ba8d11242c97b0cd8c4)) +* update np version ([615985c](https://github.com/Loop3D/map2loop/commit/615985ce2fab530354585a1715e0edea55f2ba27)) +* update numpy version ([0479ea1](https://github.com/Loop3D/map2loop/commit/0479ea1789380895789fca6d25334fe6a1638f12)) + +## [3.1.6](https://github.com/Loop3D/map2loop/compare/v3.1.5...v3.1.6) (2024-06-13) + + +### Bug Fixes + +* add invalid hex input handling ([40028a8](https://github.com/Loop3D/map2loop/commit/40028a87b06c7610095edb0b78ec451838ff85a6)) +* add the suggestions ([dc85b2e](https://github.com/Loop3D/map2loop/commit/dc85b2e5d89475511904275fc482d3bfd3f33fd8)) +* comment the code ([6e064b1](https://github.com/Loop3D/map2loop/commit/6e064b1a3cb53af1fa92ea51faa4917d2c50663c)) +* fix for duplicate units ([4052eca](https://github.com/Loop3D/map2loop/commit/4052eca85825a8ddd9d3c2f6c57c3f838ae2dd3e)) +* make sure all colours are unique ([f90159a](https://github.com/Loop3D/map2loop/commit/f90159a83691278ee7cfca07c3aba64a144816c8)) +* small fixes - double check for integer & add test information at the beginning of the test scripts ([a916343](https://github.com/Loop3D/map2loop/commit/a916343fba5ec59602fab9892b7d67f86702723b)) +* update the tests for new function names (hex_to_rgb) ([e1778b7](https://github.com/Loop3D/map2loop/commit/e1778b734ca13d4c422daacd29de41c505f92fea)) + +## [3.1.5](https://github.com/Loop3D/map2loop/compare/v3.1.4...v3.1.5) (2024-06-06) + + +### Bug Fixes + +* add 2 more links to try from GA WCS if timing out & prints out where the DEM was downloaded from ([92f73a5](https://github.com/Loop3D/map2loop/commit/92f73a55ad998af76fe02fd09702d98492c6e431)) +* add catchall exception to mapdata_parse_structure & comment code ([59c677c](https://github.com/Loop3D/map2loop/commit/59c677c5988c1e411723c61f3482dbd792ed19a7)) +* add test for all structures less than 360 ([f08c42a](https://github.com/Loop3D/map2loop/commit/f08c42a7e455657c0d042e1346fa5ce5fdb98775)) +* allow 2 minutes for server connection & add add available ga server link ([900a50d](https://github.com/Loop3D/map2loop/commit/900a50d34f44e50c508466d617e4ce8d85c0c316)) +* avoid double imports ([3347751](https://github.com/Loop3D/map2loop/commit/334775120d8db88a82e70980f68940d024524687)) +* create the tmp file function missing ([55688fe](https://github.com/Loop3D/map2loop/commit/55688fe85f7aca2678a15160a73a972427a3bf34)) +* ensure all dipdir vals < 360 ([cf21a6b](https://github.com/Loop3D/map2loop/commit/cf21a6ba8cc0c48dfb7cc442d59a6cd63678ab83)) +* fix for altitude not being saved properly in LPF ([b2c6638](https://github.com/Loop3D/map2loop/commit/b2c663866f478752670aca41a188aa195df9c90f)) +* make the templates a bit easier to fill out ([81f54fe](https://github.com/Loop3D/map2loop/commit/81f54fe9f7163dc997219b4fe092c81b6c7b3ca3)) +* move location of the PR template ([9209c25](https://github.com/Loop3D/map2loop/commit/9209c251520bfd993a51b04124ad62a831a58922)) +* return just column with new vals instead of inplace modification ([722b98c](https://github.com/Loop3D/map2loop/commit/722b98cdbcf1f820b9d1a480f09ac59d287f1a04)) +* revert back to original ([6ed00c9](https://github.com/Loop3D/map2loop/commit/6ed00c999901c3236e53fc039930510be9d38570)) +* revert back to original timeout ([301242f](https://github.com/Loop3D/map2loop/commit/301242f931b92ac01c4251ecf9039119d9da49d5)) +* revert back to original url ([26e4971](https://github.com/Loop3D/map2loop/commit/26e497198744c591879fea96c10935d6b79b7d9d)) +* update question template ([8182e50](https://github.com/Loop3D/map2loop/commit/8182e50361852de817e1440adcb278b5f46f4796)) +* update tests that depend on server to skip in case server is unavailable ([646be9e](https://github.com/Loop3D/map2loop/commit/646be9ea06dade92f16208da7e681d6d2b0e6c65)) +* use gpd.points_from_xy ([2f931c5](https://github.com/Loop3D/map2loop/commit/2f931c59025997133aeea9c10f725858613b7f6b)) +* verbose dipdir 360 test name ([6ffe6bf](https://github.com/Loop3D/map2loop/commit/6ffe6bf31ab860ee054bb175a63c00fee7b8a7ff)) + + +### Documentation + +* update libtiff version ([0a99ac8](https://github.com/Loop3D/map2loop/commit/0a99ac8aaf6980196216137f15060c44b2f77cd9)) + +## [3.1.4](https://github.com/Loop3D/map2loop/compare/v3.1.3...v3.1.4) (2024-05-29) + + +### Bug Fixes + +* actions updated to prevent linting issues ([9a3e86a](https://github.com/Loop3D/map2loop/commit/9a3e86a4e5c7e89f93e627081cc51df21c75ba5b)) +* add pull request template ([f8ccac7](https://github.com/Loop3D/map2loop/commit/f8ccac74d5d778be0f675c683bf4e29d59027001)) +* added issue_templates ([06413ad](https://github.com/Loop3D/map2loop/commit/06413ade7660f33da5245b00493119d77649a681)) +* few typos grammar ([97bfe16](https://github.com/Loop3D/map2loop/commit/97bfe16cdf2653e957946e8366a1dc801bbc4b2f)) +* fix for issue [#73](https://github.com/Loop3D/map2loop/issues/73) ([39c65a7](https://github.com/Loop3D/map2loop/commit/39c65a721af57038e73a26c0522b303c5a40c16b)) +* keep things light ([50751a9](https://github.com/Loop3D/map2loop/commit/50751a940c78a981ec4c423e3c914615cede962f)) +* merge PR templates into one single PR template ([dcbad85](https://github.com/Loop3D/map2loop/commit/dcbad8503174c9700651bb5c491323336d10c8b8)) +* remove tini from docker ([fc86b89](https://github.com/Loop3D/map2loop/commit/fc86b89994b578b6d603a514ec1c889623092df7)) +* remove value from issue templates ([11a005d](https://github.com/Loop3D/map2loop/commit/11a005db964bcf4d82749b5c334dea9a8e394cad)) +* revert back to having strike allowance as discussed ([48a19e0](https://github.com/Loop3D/map2loop/commit/48a19e091e22bb0772c22bfa4ebc2b9ff2f0bffe)) +* StructuralPoint actually prints warnings ([ab6f276](https://github.com/Loop3D/map2loop/commit/ab6f276a991f538dd25bca467e3869b283a2df10)) +* tests should be with pytest ([a04fb2a](https://github.com/Loop3D/map2loop/commit/a04fb2a569ba756e5ab2317782fd96bc8d15fd0c)) +* update wording in templates for clarity ([ecb1092](https://github.com/Loop3D/map2loop/commit/ecb10926b25472672d7929d94aec0fec222ad09f)) + + +### Documentation + +* remove lavavu; no need for 3D vis for the examples ([6b42cdc](https://github.com/Loop3D/map2loop/commit/6b42cdcbc9ca7fd9e10ceee31444196f8088ee4f)) + +## [3.1.3](https://github.com/Loop3D/map2loop/compare/v3.1.2...v3.1.3) (2024-05-14) + + +### Bug Fixes + +* remove tini from docker ([89fd60f](https://github.com/Loop3D/map2loop/commit/89fd60f35445f96894c153d3f8c5f6451bcbf0ed)) + + +### Documentation + +* remove lavavu; no need for 3D vis for the examples ([e8b1ada](https://github.com/Loop3D/map2loop/commit/e8b1ada0345cfebef114be555e770fd594155b16)) + +## [3.1.2](https://github.com/Loop3D/map2loop/compare/v3.1.1...v3.1.2) (2024-05-09) + + +### Bug Fixes + +* update doc deploy ([cf0de5b](https://github.com/Loop3D/map2loop/commit/cf0de5b937c251ac71522488392f7ba7d65d78c6)) + +## [3.1.1](https://github.com/Loop3D/map2loop/compare/v3.1.0...v3.1.1) (2024-05-09) + + +### Bug Fixes + +* trigger build ([f1879ce](https://github.com/Loop3D/map2loop/commit/f1879ced58154610ccadd46488cdf7f109ca1810)) + +## 3.1.0 (2024-05-09) + + +### Features + +* Add new stratigraphic column sorters based on contact length and unit relationships fix: transpose dtm for height calculations, export geotiff using gdal ([36ddcca](https://github.com/Loop3D/map2loop/commit/36ddcca650d7f12c102b77e5df23d7a2b7710ee3)) +* added utils function ([3c01767](https://github.com/Loop3D/map2loop/commit/3c01767c0f3adde4ccae59d84e01e65849b30993)) +* Allow for empty dataframes if no filename specified. Mainly for fault and fold files ([f81d9b4](https://github.com/Loop3D/map2loop/commit/f81d9b4496a9d863864f72d2c1d2813871bccb24)) +* new ThicknessCalculatorBeta ([f703832](https://github.com/Loop3D/map2loop/commit/f7038326fb2ff291ab23e3c3e52e7ad653b68e1a)) +* thickness calculator gamma ([6926a45](https://github.com/Loop3D/map2loop/commit/6926a4540198f8fb25dd2c8905be5c2072ea511a)) +* two interpolators for thickness calculations ([e118f6a](https://github.com/Loop3D/map2loop/commit/e118f6afb7202595e09c6ef3798c28c4ea7035f6)) +* two interpolators for thickness calculators ([11f3a04](https://github.com/Loop3D/map2loop/commit/11f3a0455103b464285b47878dc226916b7bc233)) + + +### Bug Fixes + +* 3.12 ([264b4c0](https://github.com/Loop3D/map2loop/commit/264b4c069fc069cd84d30c43d4931f5815391fc4)) +* actually remove the rank & type lines ([16801d2](https://github.com/Loop3D/map2loop/commit/16801d23c52d74c291161a52ac2fbb541a133529)) +* add back the project import ([01dc0bb](https://github.com/Loop3D/map2loop/commit/01dc0bbacfa605aa5aac12dca94aed4d158420fa)) +* add comments to the gamma calculator ([936b495](https://github.com/Loop3D/map2loop/commit/936b495d10ea28c52349f66cb35638d79ed329ff)) +* Add data files as package_data so that it installs with .py files ([09b0cb8](https://github.com/Loop3D/map2loop/commit/09b0cb8a72d9eed06c6a3de7c62a0931ceb6b846)) +* add descriptive variable names ([672bece](https://github.com/Loop3D/map2loop/commit/672bece19ddd3e0dac775a47a4577a7d5c163d45)) +* Add exception handling around hjson access ([#24](https://github.com/Loop3D/map2loop/issues/24)) ([f627f83](https://github.com/Loop3D/map2loop/commit/f627f83079ba0c1315fc59d98fc2bb2fe27a0191)) +* Add exception handling around hjson access, throw with better message ([d8804de](https://github.com/Loop3D/map2loop/commit/d8804de89a9ecc8705914f959b3c4a4858f968d9)) +* add feature to count segnum of polygons with holes ([03bcbcc](https://github.com/Loop3D/map2loop/commit/03bcbcc00b6df28a0dc0879d6fa41ae0bc355cf8)) +* Add layer id to structural data using a spatial join ([#38](https://github.com/Loop3D/map2loop/issues/38)) ([09c53d6](https://github.com/Loop3D/map2loop/commit/09c53d6fbb6b44c46b9e88cf9044f7ccd1ebd555)) +* add lazy function to load files from state name ([0e0bfa7](https://github.com/Loop3D/map2loop/commit/0e0bfa7f72f80e89aba5a548a7282743dc0bd04a)) +* add LPF 0.1.0 ([a4165b3](https://github.com/Loop3D/map2loop/commit/a4165b3f81c1f9d2625f1268561583e8b967bd7f)) +* Add multiple tries to online config file access ([8a137ce](https://github.com/Loop3D/map2loop/commit/8a137cedc298596ea4ce858a5ff4e256eb169b7c)) +* add option for user defined line length ([23aeb06](https://github.com/Loop3D/map2loop/commit/23aeb06c0f422598e054727ab0d8357da76a7705)) +* add options/warnings to overwrite existing lpf files ([165bc17](https://github.com/Loop3D/map2loop/commit/165bc17f7a8181f9d1bab717120a4f3e86dab81a)) +* Add owslib as dependency for testing ([0439da8](https://github.com/Loop3D/map2loop/commit/0439da869856b187defbed631c592a848b3684a1)) +* add Pathlib to aus state ([e9d7add](https://github.com/Loop3D/map2loop/commit/e9d7addcbf545d67a0547c0cd0bf5dc73b9748d8)) +* add remaining thickness fields ([130af98](https://github.com/Loop3D/map2loop/commit/130af988df47ca27ad5aa3ecba67655517697430)) +* add some comments throughout the script and remove unnecessary comments ([390b864](https://github.com/Loop3D/map2loop/commit/390b864545223e01bb7a475429d4d6a7298732d2)) +* Add special case for SA config file to lowercase the column names. Also check for empty map2model relationship files and deal appropriately with them ([82054df](https://github.com/Loop3D/map2loop/commit/82054dfec9f82b353a63b42e5f3d815fdeff5fee)) +* add str and Pathlib to beartypes ([16a0247](https://github.com/Loop3D/map2loop/commit/16a02470b520b3a118c69e29a63e3bb7eeda25a2)) +* add strike attribute to the class ([80e4445](https://github.com/Loop3D/map2loop/commit/80e4445bcfbe73f3a430c77dce0a96de56c913c6)) +* add test datafiles to gitignore ([951e7fe](https://github.com/Loop3D/map2loop/commit/951e7fea8ea358a00426fd7cdcedf552e865acc2)) +* Add test for featureId ([37f5a96](https://github.com/Loop3D/map2loop/commit/37f5a96dce30ee3115105701f1c2c96f58d3d9fe)) +* add thickness fields to proj and thickness_calculators ([f6ec60f](https://github.com/Loop3D/map2loop/commit/f6ec60faf0d075fe8fa8fedcc60884840b9dc0f9)) +* added function to find the datasets folder after install. ([9623d48](https://github.com/Loop3D/map2loop/commit/9623d48643f664683e9403d14208a1e6a991f949)) +* Added new stratigraphic sorters, a placeholder for throw calculators and updated thickness calculator ([e08e010](https://github.com/Loop3D/map2loop/commit/e08e010f38070c175412f0b92946b5ce705c5409)) +* added option for grid resolution ([a0ef130](https://github.com/Loop3D/map2loop/commit/a0ef130bb12148bab8cb2bb7bddf7fb33db4f085)) +* added segNum to geology samples ([0ad6983](https://github.com/Loop3D/map2loop/commit/0ad69839dc25d7400e80a4ef2deed5e2ace7dcf3)) +* adding beartype to requreiments ([4d66b8f](https://github.com/Loop3D/map2loop/commit/4d66b8fd76d8ba5a64abdc0838b9797dfcc75dca)) +* adding empty samples to project class ([bf100b2](https://github.com/Loop3D/map2loop/commit/bf100b2c23a284072d11d54e080d882da0460942)) +* adding fault orientation calculation ([e35f0b6](https://github.com/Loop3D/map2loop/commit/e35f0b6a78ae85482a66f6636b54bc079432dd51)) +* adding fault orientation calculator ([08c9f5e](https://github.com/Loop3D/map2loop/commit/08c9f5e943ee31b52ca613c4da44b3521018eb22)) +* adding fault orientation data type ([f0e82e2](https://github.com/Loop3D/map2loop/commit/f0e82e20553f7f930ea4237c7516a18c61907090)) +* adding orientation type to fault config. ([6359937](https://github.com/Loop3D/map2loop/commit/635993739bac4acf5c6e6ad83a884c391602285c)) +* adding random colour generator ([e6315c4](https://github.com/Loop3D/map2loop/commit/e6315c47b9f3c18140da62f3d124021e79ae403b)) +* adding to_dict for config ([968504e](https://github.com/Loop3D/map2loop/commit/968504e27e56b343feee58a8a1ed297f493c5d87)) +* adding to_dict for config ([968504e](https://github.com/Loop3D/map2loop/commit/968504e27e56b343feee58a8a1ed297f493c5d87)) +* adding to_dict for config ([258254e](https://github.com/Loop3D/map2loop/commit/258254e7fc4e2628c035a400083c04dc4f81866b)) +* adding version and ignoring init file for f401 ([db6ac5b](https://github.com/Loop3D/map2loop/commit/db6ac5b48f7ade6d57b2a6a094811c083c996bd0)) +* adding version attribute ([1a2ed67](https://github.com/Loop3D/map2loop/commit/1a2ed677443ae2497aee9bc6b0a929e7566632b7)) +* avoid future warnings from geopandas ([e877d93](https://github.com/Loop3D/map2loop/commit/e877d936426fca7b58f9825e8f82687660edf5c2)) +* can access sampled data for thickness calculations ([1ae2d2d](https://github.com/Loop3D/map2loop/commit/1ae2d2d199806c2d15e828543f890a73b56909ee)) +* change config file name convention for clarity ([15123ac](https://github.com/Loop3D/map2loop/commit/15123ac68a590b85010cd766f588a4fa859b4d05)) +* change docker to see if documentation builds ([10f4fde](https://github.com/Loop3D/map2loop/commit/10f4fdea4a9a856ce30941cb5f1878e63d226870)) +* change make html statement in docs build ([26aeba6](https://github.com/Loop3D/map2loop/commit/26aeba65d10bc4251f97d584a15ded9c04ad5b74)) +* change segNum to featureId ([aab8c8c](https://github.com/Loop3D/map2loop/commit/aab8c8c90c42dbe3a85431ed669f386a187a4349)) +* change segNum to featureId ([2689a3a](https://github.com/Loop3D/map2loop/commit/2689a3a7307ae49a7f9198be7365471c43ccdad2)) +* changing boolean comparison ([d90df18](https://github.com/Loop3D/map2loop/commit/d90df183cb9042a994525cfd698297aa588ea04f)) +* changing isinstance to issubclass ([0e9ecc8](https://github.com/Loop3D/map2loop/commit/0e9ecc82b37a0a979aefc8fb3ae83b406f30a37a)) +* Check for empty dataframe before concat ([c475513](https://github.com/Loop3D/map2loop/commit/c475513c84c356d1a2b09bcd331c861f124b3317)) +* correct typo on actions & reverse test path ([a5fbdbc](https://github.com/Loop3D/map2loop/commit/a5fbdbcc394629a4d77bc04b2e7f65c4e0aa05e8)) +* data works without init files on subfolders ([cc833bb](https://github.com/Loop3D/map2loop/commit/cc833bbee451f1b540237cc9fa6abc3c3747979d)) +* default fault dip/dipdir to nan ([917cee6](https://github.com/Loop3D/map2loop/commit/917cee6bc7c27ed18a067403e7780d54656f92f5)) +* default fault values to nan not 0 to prevent unexpected behaviours ([87863c7](https://github.com/Loop3D/map2loop/commit/87863c76654da4fee87fed45ac5015e30c49defa)) +* Default temp path changed to work in linux ([5bd773b](https://github.com/Loop3D/map2loop/commit/5bd773bdd27268aa8b516b799a16dca141056c0f)) +* Default to not showing file access debug info ([fbcf10d](https://github.com/Loop3D/map2loop/commit/fbcf10df02eb98fdeb5c2dfafffe5624835eac60)) +* delete runtime from repo ([36d59bc](https://github.com/Loop3D/map2loop/commit/36d59bce5bd7a8dfedd279c877a1d9b7ee6bf18b)) +* Dependencies issue with new version of geopandas breaking read_file on remote zip files. Also, fixed errant line that installed the old version of map2model ([4eb720a](https://github.com/Loop3D/map2loop/commit/4eb720a2d766b821d0cf31e46bc8b3f571ea6fc7)) +* edit path of config filename ([6864d7d](https://github.com/Loop3D/map2loop/commit/6864d7d1efa204ff286b9ff4533103d984d5ec9b)) +* endpoints have correct length ([c36995d](https://github.com/Loop3D/map2loop/commit/c36995dc2a31ce16d64e3ef46a721c53ee8c602c)) +* fix typo ([f69b42f](https://github.com/Loop3D/map2loop/commit/f69b42f8640827df2b7ca7e35629aac729d34684)) +* fixed NaN values and NaN warnings ([f7cbd78](https://github.com/Loop3D/map2loop/commit/f7cbd78cae78043916b79ada02d2c6677408db1b)) +* Forgot that env varibles can't have hyphons ([c31bb1c](https://github.com/Loop3D/map2loop/commit/c31bb1cfe33b992ad9f6bebb3d406bd1f5563d45)) +* formatted using ruff ([06ce94d](https://github.com/Loop3D/map2loop/commit/06ce94d6d4926eea7743341bbb17e766e3156bfa)) +* init file recovered ([f9f56cc](https://github.com/Loop3D/map2loop/commit/f9f56cccab3eb310d6a80058305b4ca19746264c)) +* install pytest with gh actions ([7b25639](https://github.com/Loop3D/map2loop/commit/7b25639310e03186c4db3df7312070825b034a2b)) +* Issue with conda build test env not working, skipping ([2fffb69](https://github.com/Loop3D/map2loop/commit/2fffb696556f48f0620dfbac356971301fb15e89)) +* letting docs build run on docker ([8b4ade0](https://github.com/Loop3D/map2loop/commit/8b4ade0675aa5d497cbd469a85f59b1d19b09239)) +* linting ([c1bf893](https://github.com/Loop3D/map2loop/commit/c1bf893ee6d2316d153f4e0fb66f57f90a7dc9af)) +* linting ([4cf51b7](https://github.com/Loop3D/map2loop/commit/4cf51b73192972c826e74373181e11883455b2a0)) +* make sure Pathlib builds the right path ([f10270d](https://github.com/Loop3D/map2loop/commit/f10270d2666c75b38f936a94800532edc630ff53)) +* minor adds/delete ([e479875](https://github.com/Loop3D/map2loop/commit/e4798750c6b13ac74214d639add556dce6111e9f)) +* minor changes to the test for gamma thickness calc ([9211826](https://github.com/Loop3D/map2loop/commit/921182667babe99bca6e1bed3df1ef7dac073504)) +* more updates to agree with Pathlib ([7a19f34](https://github.com/Loop3D/map2loop/commit/7a19f345db25a2079b9768722619b72a08b42f99)) +* Move clut and config files to _datasets directory and use local files for doc-test case ([23e6b8b](https://github.com/Loop3D/map2loop/commit/23e6b8b2d85c6bc5e29d0d766d23d981279e8a0e)) +* neat output details ([085d4eb](https://github.com/Loop3D/map2loop/commit/085d4ebbb213a800bb9850e1f496aa4c3993c7e8)) +* new flake8 compliance ([6776e25](https://github.com/Loop3D/map2loop/commit/6776e25a4c22faf483ffd70010202211b0b874b2)) +* Pass featureId of multi lines to project file, also unpin geopandas ([1a4299e](https://github.com/Loop3D/map2loop/commit/1a4299e16f616a8286f241262dbccfea0f069586)) +* Path typo ([883b497](https://github.com/Loop3D/map2loop/commit/883b4978be6f0479c17ee50038fa3f2577628ca9)) +* Remove deprecation ignore warnings and then deprecations ([79cd333](https://github.com/Loop3D/map2loop/commit/79cd33317625c96091690c9b97309be74cba2fdd)) +* Remove j in loop as it was not referenced ([3314828](https://github.com/Loop3D/map2loop/commit/33148287a8c978c775d016eeb293923907c9f3c6)) +* remove print statement ([ecd1e44](https://github.com/Loop3D/map2loop/commit/ecd1e4449fe3736f555e9cffe6dbae64e61017ba)) +* remove segNum_test ([cbd05f2](https://github.com/Loop3D/map2loop/commit/cbd05f22256ce1b2d115112b3921a8bbf25443a3)) +* remove this test for now and see if everything else is ok. ([16a3b88](https://github.com/Loop3D/map2loop/commit/16a3b882d82ebef47fc814dd5e9bfaf5729d0082)) +* remove unnecessary else stat ([bea7e7a](https://github.com/Loop3D/map2loop/commit/bea7e7aa26f28691b325617b8439704dae093d30)) +* remove unnecessary print statements ([58535bf](https://github.com/Loop3D/map2loop/commit/58535bf07ec3d172dbf0881a9c0cc3be95b042f8)) +* remove unnecessary variable declarations ([fb44fef](https://github.com/Loop3D/map2loop/commit/fb44fef387ef521d0b5e0f48f205144a35190ba4)) +* remove unsused variable ([fa3e4bb](https://github.com/Loop3D/map2loop/commit/fa3e4bbc71e939ff0836a55166268d32ebc5b866)) +* removed float type hint ([87713d6](https://github.com/Loop3D/map2loop/commit/87713d62dbcd086b7662cb1d6145b048729bae3d)) +* removed rank & type from LPF obs tables ([750acbd](https://github.com/Loop3D/map2loop/commit/750acbd505f901c74b892b1df261893fb414d681)) +* removing commented code ([22db166](https://github.com/Loop3D/map2loop/commit/22db1668448e088fa02caa4f5bd2e17980774dc2)) +* rename in thicknessCalc names in test ([fda68e6](https://github.com/Loop3D/map2loop/commit/fda68e686bc36195e95e24cb733d3a2475b90b54)) +* Rename segNum to featureId ([274beca](https://github.com/Loop3D/map2loop/commit/274becaad09bb8500f29edc097c1d877bd7487e4)) +* renaming compute to calculate ([f5a0ffb](https://github.com/Loop3D/map2loop/commit/f5a0ffb3beeb6c59dc2c3758bcc7251a74cea9a1)) +* replace beta and gamma nomenclature ([a9040b0](https://github.com/Loop3D/map2loop/commit/a9040b0f365b7035d67af7846ad5e3ca4a54574a)) +* revert hjson back to loop3d version as hjson-py does not work ([84b846a](https://github.com/Loop3D/map2loop/commit/84b846ae8efd293428acb2bb1c4515f0f48e6a31)) +* revert naming conversion to original ([5e7e5ec](https://github.com/Loop3D/map2loop/commit/5e7e5ec43d5cb557590205893db1953be8b74545)) +* Reworked dataframe to avoid chained assignment ([77b322f](https://github.com/Loop3D/map2loop/commit/77b322f5daccbf74d316bd6adfd3e1dd70e47d5e)) +* ruff linter and docs fix ([c7e42a6](https://github.com/Loop3D/map2loop/commit/c7e42a68e4824ee1eff7a0c8c8797e1c2b7365db)) +* run ci on all branches but only release from master ([9e0f977](https://github.com/Loop3D/map2loop/commit/9e0f977a4d4dbee51ef357db638b339810863b25)) +* sampled_contacts are in map_data now ([9d57d95](https://github.com/Loop3D/map2loop/commit/9d57d95f6bca4a2f5e6ce4f0ab9fbcd5fed647a7)) +* setup_grid docstring updated ([67b453b](https://github.com/Loop3D/map2loop/commit/67b453b5a32239004936ff1d31dc6a094f068975)) +* simplify output generation; assignment of -1 to uncalculated thickness ([6acd2d5](https://github.com/Loop3D/map2loop/commit/6acd2d5eea382fa9fcf72aaefb0c628014681bce)) +* simplify the procedure to get the relative path of the library ([416d101](https://github.com/Loop3D/map2loop/commit/416d101d73cf850381dc2169d5f6569f0f175b69)) +* Still forcing versioning for release-please ([08e647b](https://github.com/Loop3D/map2loop/commit/08e647bac1dded0c807bbb9a3571a741505bd488)) +* store xyz end points correctly ([af29ab6](https://github.com/Loop3D/map2loop/commit/af29ab6b6bb6937baa836cfe73e7003ebecd11a4)) +* test changing dirs to see if docs build ([98098fc](https://github.com/Loop3D/map2loop/commit/98098fcd3c829a075de884bb613e331c6e9b0e1e)) +* testing change tests directory to map2loop folder, because of json file location ([371a2a2](https://github.com/Loop3D/map2loop/commit/371a2a2e54aeb4b5619c7daf16b85123e71ee74e)) +* testing test location again ([c775ed9](https://github.com/Loop3D/map2loop/commit/c775ed9ce45e6653e9b752b59a8592246df848fb)) +* This environment variable has to go somewhere ([2495a89](https://github.com/Loop3D/map2loop/commit/2495a89093f5808cd75c184b442576bfdc1083ee)) +* Try again setting environment variable for documentation test case ([4e6348b](https://github.com/Loop3D/map2loop/commit/4e6348bfebd6131db471cd9273c34330165f0e99)) +* try getting colour data, if file doesn't load print warning ([dd4f365](https://github.com/Loop3D/map2loop/commit/dd4f36517d6fdeb5f04d7aee571260129e69d019)) +* typo ([025de10](https://github.com/Loop3D/map2loop/commit/025de10e07fac9e045e516a2f6311a51b2fed1b1)) +* typo ([ea6d0cd](https://github.com/Loop3D/map2loop/commit/ea6d0cd692fb47adec6403d4e16edb9ce6a1eb00)) +* Typo fix for config dictionary converter ([15b543b](https://github.com/Loop3D/map2loop/commit/15b543bc077550c683c94d7bb97a74389b1de29e)) +* typo in calculate ([c0ec36b](https://github.com/Loop3D/map2loop/commit/c0ec36b2444fb136b80e0356debf5f13ad454258)) +* Typo in intrusion flag, ignoring intrusions for contact calculations, remove errant sorter from take_best option ([527de6c](https://github.com/Loop3D/map2loop/commit/527de6c339e56ead036ab5ed5d94d06d77673ae6)) +* upd v3.1 ([182079b](https://github.com/Loop3D/map2loop/commit/182079ba13693d4bd3b6a8373c5954076f36ec8a)) +* update (thanks RT & LG) ([f6f59cf](https://github.com/Loop3D/map2loop/commit/f6f59cf2dc2cbcf40351745cba1359db9c8db552)) +* update all to overwrite LPF ([d0e38db](https://github.com/Loop3D/map2loop/commit/d0e38db735984103a4e95d43ffd5dc974ae6755f)) +* update aus clut files with documentation links ([55bc845](https://github.com/Loop3D/map2loop/commit/55bc84516224001e29fcc79b7663cffdb90d5655)) +* update clut file names ([c2c020f](https://github.com/Loop3D/map2loop/commit/c2c020fa0db8a625cc3b9095c231a9ebd22975d2)) +* update code as per Roy's review ([450b372](https://github.com/Loop3D/map2loop/commit/450b372cfc43063a2de2eebf2b6e05458114c425)) +* update docs dockerfile build ([deefe49](https://github.com/Loop3D/map2loop/commit/deefe4933db82b8a6633deb154eab6ed26582a5c)) +* update for python 3.12 ([23c3d76](https://github.com/Loop3D/map2loop/commit/23c3d76f06a7d195b083f1eafb793fa147554ed9)) +* update gh actions to revert to roiginal test location ([9b341ad](https://github.com/Loop3D/map2loop/commit/9b341ad0c4658cfe909a981e70c80b05358ce5c7)) +* update gitignore ([d2df267](https://github.com/Loop3D/map2loop/commit/d2df2670cd4e3153def613c0c56e294326495a8e)) +* update LPF dependencies ([cbb5489](https://github.com/Loop3D/map2loop/commit/cbb54899368ae5950b29a101bfca648b900d6527)) +* update test to check segnum & geology ID and spatial match ([7cbf143](https://github.com/Loop3D/map2loop/commit/7cbf143b84a4c7cb3f34b563d2f9ef3202b0433e)) +* update tests to run from upper folder ([1a8210d](https://github.com/Loop3D/map2loop/commit/1a8210dc41942164b202b0cfbea044091c67e5b0)) +* update the rest of the variable names to thicknessMedian except in LPF ([2f8816b](https://github.com/Loop3D/map2loop/commit/2f8816becbb090219717cd8dde0ad6a390753c0f)) +* update the StructuralPoint test ([dc7c6da](https://github.com/Loop3D/map2loop/commit/dc7c6dafab01cef2dd215a5df52f6e7af9391463)) +* update to new thickness variable name ([5f79706](https://github.com/Loop3D/map2loop/commit/5f797064cf557f0cc47c32bdd6e73dd60b20853e)) +* update to pathlib in documentation test environment ([fd263c2](https://github.com/Loop3D/map2loop/commit/fd263c20e86b9b58a0f44a2ed84cca912e8660e9)) +* update to solve the Pathlib ([5b0ace7](https://github.com/Loop3D/map2loop/commit/5b0ace70e96f6ec3c5f70873579d474c1232761b)) +* update variable names for thicknesscalculator StructPoint ([f6a2207](https://github.com/Loop3D/map2loop/commit/f6a22076c174e4eed0c17db0a38a62d386b91e23)) +* updated docstring ([93d47bf](https://github.com/Loop3D/map2loop/commit/93d47bfac84397cf842a9398d1b0bd0dae873c5b)) +* updated type hint for basal_constacts ([c125c63](https://github.com/Loop3D/map2loop/commit/c125c6340f822fbe13f5839f8fda3e8463da44b9)) +* use correct variable rbf ([79791f1](https://github.com/Loop3D/map2loop/commit/79791f125dfe0748b80e243ef79f86ad10197752)) +* Use geology sampler for contact sampling ([615d19a](https://github.com/Loop3D/map2loop/commit/615d19adefddeb736871ed4b4ad5329e8b1ac9e8)) +* Use MANIFEST.in to include clut and config files in installation ([d49a53f](https://github.com/Loop3D/map2loop/commit/d49a53f526ba7b4d14b7f88f5091986054717841)) +* use Nx3 array instead of vector components ([ae6739e](https://github.com/Loop3D/map2loop/commit/ae6739eaceb0d0b4aabb2650a593e799f11c4a24)) +* use shapely.object to avoid clashes ([73dd77f](https://github.com/Loop3D/map2loop/commit/73dd77f4f911eb10237819c862382bb36481fc34)) + + +### Documentation + +* add 3.11 back on so docs build (LPF needs 3.12 as well) ([9f817be](https://github.com/Loop3D/map2loop/commit/9f817beba63e581a85145fea2521bb95c6942c29)) +* add back the .sh to build docs locally ([a5ccb0f](https://github.com/Loop3D/map2loop/commit/a5ccb0fdf6557dba3b38245c49833128b3093f0c)) +* add docstrings for ThicknessCalculatorGamma ([39187f7](https://github.com/Loop3D/map2loop/commit/39187f773f2e5d4647992630d4bf25c7eee2897d)) +* Add import modules and example parameters to sorter and thickness calculator docs. ([3ed1ea7](https://github.com/Loop3D/map2loop/commit/3ed1ea73128bcce142fbd84a38947fd99b24332e)) +* Add import modules and example parameters to sorter and thickness calculator docs. ([#33](https://github.com/Loop3D/map2loop/issues/33)) ([b4e6247](https://github.com/Loop3D/map2loop/commit/b4e6247117baf012009c7a81c4b923beb38bef5c)) +* add m2l verson ([c5cf102](https://github.com/Loop3D/map2loop/commit/c5cf10243f0824731649623c423078cb159e61c7)) +* add space to avoid warning ([d615498](https://github.com/Loop3D/map2loop/commit/d615498c6356fdeb239f0bd631ceb8767998c9c5)) +* added thickness to the base class. ([e263389](https://github.com/Loop3D/map2loop/commit/e2633892dec2489609bc79ec7992ee99f597fd99)) +* adding aylas code template ([48c1093](https://github.com/Loop3D/map2loop/commit/48c10935654b35aef191c160aa7c2cb69dc38332)) +* adding clut presets to docs ([65b23fd](https://github.com/Loop3D/map2loop/commit/65b23fdaf935711c7ed6f775176840eaaa474a7c)) +* adding doc specific requirments ([b26d4dd](https://github.com/Loop3D/map2loop/commit/b26d4dd9558792db939e4212b7b6bd2ada36a35b)) +* adding docker file ([0acf2e4](https://github.com/Loop3D/map2loop/commit/0acf2e44bfc68b313d7be7c249583d74c8067b66)) +* adding documentaion to map2loop ([2a30da4](https://github.com/Loop3D/map2loop/commit/2a30da44329d0adc0eb8026e861c7cc8fa23ffac)) +* adding example for hamersley ([3e7688d](https://github.com/Loop3D/map2loop/commit/3e7688d1053225b12ab2ed3b897900f3bc4b4648)) +* adding hjson file ([1d03505](https://github.com/Loop3D/map2loop/commit/1d03505debdf67ce2e7bc313e935173ed6868f38)) +* adding m2l template ([b2f8ea0](https://github.com/Loop3D/map2loop/commit/b2f8ea0dd92455d5106a5d8260e56053ac5e2199)) +* adding readme to docs ([e43968c](https://github.com/Loop3D/map2loop/commit/e43968ce25535fe6fb943b4d3fef8ce6e4b165dd)) +* adding sphinx ([6e9b068](https://github.com/Loop3D/map2loop/commit/6e9b068dd46aed3dff40a19d4059f126cf265338)) +* adding the remaining classes to docs ([c652d84](https://github.com/Loop3D/map2loop/commit/c652d842616091f00a4d38f291be1776b798e763)) +* adding user guide ([47c8d9b](https://github.com/Loop3D/map2loop/commit/47c8d9b939d303ae7f68832c1550bd8da1735bca)) +* adding user guide for map2loop ([57c2263](https://github.com/Loop3D/map2loop/commit/57c22633d46d598f9a013e09984287a2a9953535)) +* change docker run folder location ([54d5969](https://github.com/Loop3D/map2loop/commit/54d596949dae8815487037e802e7af4e39d362e6)) +* changing map2loop-3 to map2loop ([1fe8c40](https://github.com/Loop3D/map2loop/commit/1fe8c4051d8e7c3489fa60f96d5245c3b0163467)) +* finding the right json path may be the problem ([85ddcb3](https://github.com/Loop3D/map2loop/commit/85ddcb396cae2864f2f5b329ea0ce9513c03a71f)) +* fix channel typo on readme ([feee724](https://github.com/Loop3D/map2loop/commit/feee724c9e7afdbdb388521229fe2b4641162fbe)) +* fix link formatting for Brockman Syncline ([0dba31f](https://github.com/Loop3D/map2loop/commit/0dba31f50ee7f953e947f051c0b6d61be1945009)) +* fix short underline ([9ecd5b4](https://github.com/Loop3D/map2loop/commit/9ecd5b40f646d4604ea78901e36080320530b804)) +* fix the path for clut with PathLib too ([5c525af](https://github.com/Loop3D/map2loop/commit/5c525af1ecae4490ff8bd4615274329852f52922)) +* Fixed indentation of code block ([5be5208](https://github.com/Loop3D/map2loop/commit/5be5208d0e3121ce3328dcc788309d7e81d7c199)) +* fixing path to images ([6b311d6](https://github.com/Loop3D/map2loop/commit/6b311d6a6f3ce53e896c39e620823285b0ff79db)) +* geographical --> geological ([b368c19](https://github.com/Loop3D/map2loop/commit/b368c196e31484c023a21b2b61b6c6b2c8c9f2e0)) +* ignore files ([9de740f](https://github.com/Loop3D/map2loop/commit/9de740f274a155b87e80a50776383a70b12e572a)) +* keep consistent levels ([052de43](https://github.com/Loop3D/map2loop/commit/052de43496decf1c1b99f3b32990e06701f678af)) +* make sure m2l is updated with local docker build ([dc4d8cc](https://github.com/Loop3D/map2loop/commit/dc4d8ccb3ee70fac9d9f3e489cd1510b9f945047)) +* making code block work ([d0ed967](https://github.com/Loop3D/map2loop/commit/d0ed967eede6cab6373da3d92dfcdf7d004b678c)) +* Move examples dir for doc generation ([241444f](https://github.com/Loop3D/map2loop/commit/241444fabf3bba69c8fdfbee279cef6d97b01f04)) +* moving images ([a800455](https://github.com/Loop3D/map2loop/commit/a800455496e92c34853e82bef618ee541072358f)) +* no need for lavavu ([efe4b9d](https://github.com/Loop3D/map2loop/commit/efe4b9d9263bb04437c33f882af6443052aa7f71)) +* overwrite LPF ([62e75b0](https://github.com/Loop3D/map2loop/commit/62e75b0e2974e5af47646be64736c3dd384875d1)) +* paths fixed to work with pathlib within docker ([5b5b503](https://github.com/Loop3D/map2loop/commit/5b5b503e1c69018ed02a44d34d97ef4d91f02380)) +* remove conda channel from dependencies installation ([59fe775](https://github.com/Loop3D/map2loop/commit/59fe775f9c4307352e7e5320c9648c984927ffc2)) +* remove python3.11 bind. m2model updated to 3.12 ([5e84484](https://github.com/Loop3D/map2loop/commit/5e84484420db6845159d2bb56a0ec5fdf99a5db0)) +* removing LS import for config ([bcee039](https://github.com/Loop3D/map2loop/commit/bcee03998035ae92cb48dd2d02f921ce39bed91b)) +* revert back to original ([f8d6d2c](https://github.com/Loop3D/map2loop/commit/f8d6d2caa79d54c64827d4ce3172c1173a95d096)) +* revert docs to update m2l build locally ([e46c45e](https://github.com/Loop3D/map2loop/commit/e46c45e983f3481268a1fe294770cb5adb0a2651)) +* test to see if python3.11 allows docs to build (map2model requirement) ([9d15efd](https://github.com/Loop3D/map2loop/commit/9d15efde25407512da1240cffcba7acb42528728)) +* typo ([bdbe907](https://github.com/Loop3D/map2loop/commit/bdbe907bb16695865f42f74ad95f786a9976d0af)) +* update docstring for thickness calc gamma class ([bfebedc](https://github.com/Loop3D/map2loop/commit/bfebedccb0802b56a54c60c9889ddc3f6802f7e4)) +* update hamersley example to not use the legacy ([d85ffb9](https://github.com/Loop3D/map2loop/commit/d85ffb93d86159b21aa2e74948e64d8684cf485e)) +* update installation steps for small clarifications ([c975f6f](https://github.com/Loop3D/map2loop/commit/c975f6f6a9b484d709c007bdaea214751e9fd649)) +* update installation steps with channels ([76d7897](https://github.com/Loop3D/map2loop/commit/76d7897160f869ccb74945ae3487cce07d5c7bec)) +* update link ([184e522](https://github.com/Loop3D/map2loop/commit/184e522f45d6acc0a4e9fd14fbd16503adbc8f7f)) + +## [3.0.6](https://github.com/Loop3D/map2loop/compare/3.0.5...3.0.6) (2024-01-25) + + +### Bug Fixes + +* Remove deprecation ignore warnings and then deprecations ([79cd333](https://github.com/Loop3D/map2loop/commit/79cd33317625c96091690c9b97309be74cba2fdd)) + +## [3.0.5](https://github.com/Loop3D/map2loop/compare/3.0.4...3.0.5) (2024-01-25) + + +### Bug Fixes + +* Typo in intrusion flag, ignoring intrusions for contact calculations, remove errant sorter from take_best option ([527de6c](https://github.com/Loop3D/map2loop/commit/527de6c339e56ead036ab5ed5d94d06d77673ae6)) + +## [3.0.4](https://github.com/Loop3D/map2loop-3/compare/3.0.3...3.0.4) (2024-01-11) + + +### Bug Fixes + +* Issue with conda build test env not working, skipping ([2fffb69](https://github.com/Loop3D/map2loop-3/commit/2fffb696556f48f0620dfbac356971301fb15e89)) + +## [3.0.3](https://github.com/Loop3D/map2loop-3/compare/3.0.2...3.0.3) (2024-01-11) + + +### Bug Fixes + +* Add owslib as dependency for testing ([0439da8](https://github.com/Loop3D/map2loop-3/commit/0439da869856b187defbed631c592a848b3684a1)) + +## [3.0.2](https://github.com/Loop3D/map2loop-3/compare/3.0.1...3.0.2) (2024-01-11) + + +### Bug Fixes + +* Still forcing versioning for release-please ([08e647b](https://github.com/Loop3D/map2loop-3/commit/08e647bac1dded0c807bbb9a3571a741505bd488)) diff --git a/packages/map2loop/LICENSE b/packages/map2loop/LICENSE new file mode 100644 index 000000000..af3749407 --- /dev/null +++ b/packages/map2loop/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020-2021 The Loop Project + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/map2loop/README.md b/packages/map2loop/README.md new file mode 100644 index 000000000..35a6909e0 --- /dev/null +++ b/packages/map2loop/README.md @@ -0,0 +1,124 @@ +![GitHub Release](https://img.shields.io/github/v/release/loop3d/map2loop) +[![DOI](https://img.shields.io/static/v1?label=DOI&message=10.5194/gmd-14-5063-2021&color=blue)](https://doi.org/10.5194/gmd-14-5063-2021) +![License](https://img.shields.io/github/license/loop3d/map2loop) +![PyPI - Downloads](https://img.shields.io/pypi/dm/map2loop?label=pip%20downloads) +![Conda Downloads](https://img.shields.io/conda/dn/loop3d/map2loop?label=Conda%20downloads) +[![Testing](https://github.com/Loop3D/map2loop/actions/workflows/linting_and_testing.yml/badge.svg)](https://github.com/Loop3D/map2loop/actions/workflows/linting_and_testing.yml) +[![Build and Deploy Documentation](https://github.com/Loop3D/map2loop/actions/workflows/documentation.yml/badge.svg)](https://github.com/Loop3D/map2loop/actions/workflows/documentation.yml) + + +# Map2Loop 3.2 + +Generate 3D geological model inputs from geological maps β€” a high-level implementation and extension of the original map2loop code developed by Prof. Mark Jessell at UWA. To see an example interactive model built with map2loop and LoopStructural, follow this link: + +3D Model from the Hamersley region, Western Australia + +## Install + +#### Option 1: Install with Anaconda + +This is the simplest and recommended installation process, with: + +```bash +conda install -c loop3d -c conda-forge map2loop +``` + +#### Option 2: Install with pip +Installation with pip will require that GDAL is installed on your system prior to map2loop installation. +This is because GDAL cannot be installed via pip (at least not with one line of code), and the GDAL installation process will vary depending on your OS. + +For more information on installing gdal, see GDAL's Pypi page. + +Once GDAL is available on your system, map2loop can be installed with: +```bash +pip install map2loop +``` + +#### Option 3: From source + +```bash +git clone https://github.com/Loop3D/map2loop.git + +cd map2loop + +conda install gdal + +conda install -c loop3d -c conda-forge --file dependencies.txt + +pip install . +``` + +#### Option 4: From source & developer mode: +```bash +git clone https://github.com/Loop3D/map2loop.git + +cd map2loop + +conda install gdal + +conda install -c loop3d -c conda-forge --file dependencies.txt + +pip install -e . +``` + +### Documentation + +Map2loop's documentation is available here + + +## Usage + +Our notebooks cover use cases in more detail, but here is an example of processing Loop's South Australia remote geospatial data in just 20 lines of Python. + +First, let's import map2loop and define a bounding box. You can use GIS software to find one or use [Loop's Graphical User Interface](https://loop3d.github.io/downloads.html) for the best experience and complete toolset. Remember what projection your coordinates are in! + +```python +from map2loop.project import Project +from map2loop.m2l_enums import VerboseLevel + +# Note that this region is defined in the EPSG 28354 projection and +# x and y represent easting and northing respectively +bbox_3d = { + 'minx': 250805.1529856466, + 'miny': 6405084.328058686, + 'maxx': 336682.921539395, + 'maxy': 6458336.085975628, + 'base': -3200, + 'top': 1200 +} +``` + +Then, specify: the state, directory for the output, the bounding box and projection from above - and hit go! That's it. + +```python +proj = Project(use_australian_state_data = "SA", + working_projection = 'EPSG:28354', + bounding_box = bbox_3d, + loop_project_filename = "output.loop3d" + ) + +proj.run_all() +``` + +This is a minimal example and a small part of Loop. + +Our _documentation and other resources outline how to extend map2loop and port to the LoopStructural modelling engine. We are working to incorporate geophysical tools and best provide visualisation and workflow consolidation in the GUI._ + +_Loop is led by Laurent Ailleres (Monash University) with a team of Work Package leaders from:_ + +- _Monash University: Roy Thomson, Lachlan Grose and Robin Armit_ +- _University of Western Australia: Mark Jessell, Jeremie Giraud, Mark Lindsay and Guillaume Pirot_ +- _Geological Survey of Canada: Boyan Brodaric and Eric de Kemp_ + +--- + +### Known Issues and FAQs + +- Developing with docker on Windows means you won't have GPU passthrough and can’t use a discrete graphics card in the container even if you have one. +- If Jupyter links require a token or password, it may mean port 8888 is already in use. To fix, either make docker map to another port on the host ie -p 8889:8888 or stop any other instances on 8888. + +### Links + +[https://loop3d.github.io/](https://loop3d.github.io/) + +[https://github.com/Loop3D/LoopStructural](https://github.com/Loop3D/LoopStructural) diff --git a/packages/map2loop/pyproject.toml b/packages/map2loop/pyproject.toml new file mode 100644 index 000000000..9736905be --- /dev/null +++ b/packages/map2loop/pyproject.toml @@ -0,0 +1,58 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "map2loop" +description = "Generate 3D model data from 2D maps." +version = "3.3.1" +requires-python = ">=3.8" +authors = [{ name = "Loop team" }] +readme = "README.md" +license = { text = "MIT" } +keywords = [ + "earth sciences", + "geology", + "3-D modelling", + "structural geology", + "uncertainty", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Science/Research", + "Natural Language :: English", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: GIS", +] +dependencies = [ + "numpy", + "scipy", + "pandas", + "geopandas", + "shapely>=2", + "networkx", + "owslib", + "loopprojectfile==0.2.2", + "beartype", + "scikit-learn", + "packaging", +] + +[project.urls] +Documentation = "https://Loop3d.org/map2loop/" +"Bug Tracker" = "https://github.com/Loop3D/map2loop/issues" +"Source Code" = "https://github.com/Loop3D/map2loop" + +[project.optional-dependencies] +tests = ["pytest"] + +[tool.setuptools.packages.find] +where = ["src"] +include = ["map2loop", "map2loop.*"] + +[tool.setuptools.package-data] +map2loop = ["_datasets/geodata_files/hamersley/*"] diff --git a/packages/map2loop/src/dependencies.txt b/packages/map2loop/src/dependencies.txt new file mode 100644 index 000000000..d38969d0f --- /dev/null +++ b/packages/map2loop/src/dependencies.txt @@ -0,0 +1,11 @@ +numpy +scipy +pandas +geopandas +shapely>=2 +networkx +owslib +loopprojectfile==0.2.2 +beartype +scikit-learn +packaging \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/__init__.py b/packages/map2loop/src/map2loop/__init__.py new file mode 100644 index 000000000..66a14c9a0 --- /dev/null +++ b/packages/map2loop/src/map2loop/__init__.py @@ -0,0 +1,118 @@ +import logging +from map2loop.logging import loggers, ch + +from .project import Project +from .version import __version__ + +import warnings # TODO: convert warnings to logging +from packaging import ( + version as pkg_version, +) # used instead of importlib.version because adheres to PEP 440 using pkg_version.parse +import pathlib +import re +from importlib.metadata import version as get_installed_version, PackageNotFoundError + + +class DependencyChecker: + ''' + A class to check installation and version compatibility of each package in dependencies.txt + + Attributes: + package_name (str): Name of the package + dependency_file (str): path to dependencies.txt + required_version (str or None): required version of the package as in dependencies.txt + installed_version (str or None): installed version of the package in the current environment + ''' + + def __init__(self, package_name, dependency_file="dependencies.txt"): + self.package_name = package_name + self.dependency_file = pathlib.Path(__file__).parent.parent / dependency_file + self.required_version = self.get_required_version() + self.installed_version = self.get_installed_version() + + def get_required_version(self): + ''' + Get the required package version for each package from dependencies.txt; + + Returns: + str or None: The required version of the package (if specified), otherwise None. + ''' + try: + with self.dependency_file.open("r") as file: + for line in file: + if line.startswith(f"{self.package_name}=="): + match = re.match(rf"^{self.package_name}==([\d\.]+)", line.strip()) + if match: + return match.group(1) + elif line.strip() == self.package_name: + return None + print(f"{self.package_name} version not found in {self.dependency_file}.") + except FileNotFoundError: + warnings.warn( + f"{self.dependency_file} not found. Unable to check {self.package_name} version compatibility.", + UserWarning, + ) + return None + + def get_installed_version(self): + ''' + Get the installed version of the package. + + Returns: + str: The installed version of the package. + ''' + try: + # Use importlib.metadata to get the installed version of the package + return get_installed_version(self.package_name) + except PackageNotFoundError: + raise ImportError( + f"{self.package_name} is not installed. Please install {self.package_name}." + ) + + def check_version(self): + ''' + Checks if the installed version of the package matches the required version in the dependencies.txt file. + ''' + if self.required_version is None: + if self.installed_version is None: + raise ImportError( + f"{self.package_name} is not installed. Please install {self.package_name} before using map2loop." + ) + else: + if self.installed_version is None or pkg_version.parse( + self.installed_version + ) != pkg_version.parse(self.required_version): + raise ImportError( + f"Installed version of {self.package_name}=={self.installed_version} does not match required version=={self.required_version}. " + f"Please install the correct version of {self.package_name}." + ) + + +def check_all_dependencies(dependency_file="dependencies.txt"): + dependencies_path = pathlib.Path(__file__).parent.parent / dependency_file + try: + with dependencies_path.open("r") as file: + for line in file: + line = line.strip() + if line.startswith("gdal"): + continue + if line: + if "==" in line: + package_name, _ = line.split("==") + elif ">=" in line: + package_name, _ = line.split(">=") + else: + package_name = line + + checker = DependencyChecker(package_name, dependency_file=dependency_file) + checker.check_version() + + except FileNotFoundError: + warnings.warn( + f"{dependency_file} not found. No dependencies checked for map2loop.", + UserWarning + ) + + +# Run check for all dependencies listed in dependencies.txt +check_all_dependencies() diff --git a/packages/map2loop/src/map2loop/_datasets/clut_files/QLD_clut.csv b/packages/map2loop/src/map2loop/_datasets/clut_files/QLD_clut.csv new file mode 100644 index 000000000..d2c34022d --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/clut_files/QLD_clut.csv @@ -0,0 +1,3555 @@ +UNITNAME,code,colour +'P' Granite,Cgop,#ff5959 +Adder Dacite,Cba,#6b8080 +Adder Dacite/1,Cba/1,#3b4f4f +Adder Dacite/2,Cba/2,#526666 +Adder Dacite?,Cba?,#6b8080 +Adler Hill Basalt,TQva,#dbb54b +Agate Downs Siltstone,PLad,#85523e +Ah Fat Granodiorite Complex,Cgaf,#f0a394 +Ah Fat Granodiorite Complex?,Cgaf?,#f0a394 +Airport Quartz Diorite,Cgad,#d69dbc +Alberts Creek Monzogranite,Dgab,#c2006b +Alice Creek beds,DCc,#ccbff2 +Allensleigh Basalt,Qbnl,#ffff80 +Allsorts Rhyolite,Cka,#ccccb8 +Allsorts Rhyolite/a,Cka/a,#999985 +Allsorts Rhyolite/i,Cka/i,#e0e0d1 +Allsorts Rhyolite/t,Cka/t,#b3b39e +Almac Granodiorite,Cgl,#cc4c80 +Almaden Granodiorite-Cgaa,Cgaa,#ffa6e6 +Almaden Granodiorite-Cgal,Cgal,#ff4dff +Alpha Centauri Metamorphics,PLac,#991400 +Alpha Centauri Metamorphics/p,PLac/p,#bf540d +Alpha Centauri Metamorphics/q,PLac/q,#800000 +Alpha Centauri Metamorphics/s,PLac/s,#bf6e26 +Alpha Centauri Metamorphics/s?,PLac/s?,#bf6e26 +Alpha Centauri Metamorphics?,PLac?,#991400 +Alsace Quartzite,PLha,#e3cfab +Alsace Quartzite/1,PLha/1,#d6c29e +Alsace Quartzite/2,PLha/2,#bda885 +Alsace Quartzite/2-3,PLha/2-3,#a89470 +Alsace Quartzite/3,PLha/3,#94805c +Alsace Quartzite/4,PLha/4,#6b5733 +Alsace Quartzite/5,PLha/5,#d6c29e +Alsace Quartzite/cg,PLha/cg,#d6c29e +Alsace Quartzite/e,PLha/e,#f0dbb8 +Alsace Quartzite/e?,PLha/e?,#f0dbb8 +Alsace Quartzite?,PLha?,#e3cfab +Alum Rock Conglomerate,Par,#2f84bd +Amarra Granite,SDgaa,#ffbee8 +Amarra Granite?,SDgaa?,#ffbee8 +Amber Granite,Cgoa,#f599cc +Anabranch Basalt Flow,Qba,#fced9f +Anabranch Basalt Flow?,Qba?,#fced9f +Ancaster Granite,Pgac,#e65966 +Anglesey Rhyolite/1,Pvsa/1,#a6b8ff +Anglesey Rhyolite/2,Pvsa/2,#8c9eff +Anglesey Rhyolite?,Pvsa?,#bed2ff +Angore Granite,Cgzg,#ff14c7 +Angore Granite/1,Cgzg/1,#ff59b3 +Angore Granite/1-alteration,Cgzg/1/a,#ff73cc +Angore Granite/2,Cgzg/2,#ff4099 +Angore Granite/2-alteration,Cgzg/2/a,#ff66b3 +Angore Granite/3,Cgzg/3,#ff2680 +Angore Granite/4,Cgzg/4,#ff4263 +Angore Granite/f,Cgzg/f,#ff99f2 +Angore Granite/p,Cgzg/p,#ffa6ff +Annable Granite,PLgsa,#ff78d1 +Annie Creek Schist,PLya,#d7c29e +Annie Creek Schist?,PLya?,#d7c29e +Anning Granite,Sga,#ff4d5c +Anning Granite?,Sga?,#ff4d5c +Answer Slate,PLa,#594a3d +Answer Slate/s,PLa/s,#857569 +Answer Slate/t,PLa/t,#b08582 +Ant Hill Andesite Member,Cmia,#b2b2b2 +Aralba Granite,Dgal,#ff6694 +Arden Granite,Cgod,#f559a6 +Argentine Metamorphics/a,PLEa/a,#e64040 +Argentine Metamorphics/a?,PLEa/a?,#e64040 +Argentine Metamorphics/m,PLEa/m,#f2cccc +Argentine Metamorphics/p,PLEa/p,#e69999 +Argentine Metamorphics/s?,PLEab?,#f2d9d9 +Argentine Metamorphics/sa,PLEa/sa,#e67373 +Argentine Metamorphics/sa?,PLEa/sa?,#e67373 +Argentine Metamorphics/sp,sp,#009e25 +Argylla Formation,PLva,#a64c33 +Argylla Formation/4,PLva/4,#994026 +Argylla Formation/a,PLva/a,#f7ab91 +Argylla Formation/b,PLva/b,#8c3319 +Argylla Formation/m,PLva/m,#bd664c +Argylla Formation/mg,PLva/mg,#d9664c +Argylla Formation/mg?,PLva/mg?,#d9664c +Argylla Formation/mv,PLva/mv,#bf5f88 +Argylla Formation/mv?,PLva/mv?,#bf5f88 +Argylla Formation/q,PLva/q,#f2a68c +Argylla Formation/q?,PLva/q?,#f2a68c +Argylla Formation/r,PLva/r,#d9664c +Argylla Formation/s,PLva/s,#8c3319 +Argylla Formation/sq,PLva/sq,#8c3319 +Argylla Formation/sx,PLva/sx,#8c2619 +Argylla Formation/t,PLva/t,#e67359 +Argylla Formation/v,PLva/v,#d98c73 +Argylla Formation/y,PLva/y,#d98c73 +Argylla Formation?,PLva?,#a64c33 +Arkara Gneiss,PLyk,#ff59ff +Arkara Gneiss?,PLyk?,#ff59ff +Aroonbeta Rhyolite,Pdb,#bee8ff +Arra Granite,Cgza,#ff7a82 +Arringunna Rhyolite,Pfa,#73b2ff +Arringunna Rhyolite/1,Pfa/1,#8cccff +Arringunna Rhyolite/1?,Pfa/1?,#8cccff +Arringunna Rhyolite/2,Pfa/2,#4c8cff +Arringunna Rhyolite?,Pfa?,#73b2ff +Arrongulla Formation,PLzia,#734c00 +Artella Granite,Dgar,#ffd1eb +Artemis Granodiorite,Dga,#faa1ff +Artemis Granodiorite?,Dga?,#faa1ff +Arunta Block granitoids,PLx/g,#ff0f59 +Askins Microgranite,Cgcs,#ff4d5c +Askins Microgranite?,Cgcs?,#ff4d5c +Astrea Formation,PLa,#bd8063 +Astrea Formation/e,PLa/e,#854540 +Astrea Formation/o,PLa/o,#964117 +Atherton Basalt,TQn,#edd37e +Atlanta Granite,Cga,#d94073 +Augustus Complex,PLgau,#eb1933 +Aurora Granite,PLga,#ff7a85 +Aurora Granite?,PLga?,#ff7a85 +Awring Granodiorite,Pgw,#f57a7a +Aylesbury Microgranite,Pgra,#ffccff +Aylesbury Microgranite?,Pgra?,#ffccff +B Creek Rhyolite,PLrb,#b3704c +B Creek Rhyolite/a,PLrb/a,#995733 +B Creek Rhyolite/ad,PLrb/ad,#803d19 +B Creek Rhyolite?,PLrb?,#b3704c +Babalangee Amphibolite,PLOa,#1926c9 +Baby Granodiorite,Dgby,#ffbee8 +Bagstowe Granite,Cgbb,#f04f6a +Bagstowe Granite?,Cgbb?,#f04f6a +Bakers Blue Granite,Pgyb,#ff4c4c +Bakerville Granodiorite,Cgabk,#ff0f59 +Balcooma Metavolcanics/g,EOb/g,#994582 +Balcooma Metavolcanics/o,EOb/o,#805e9c +Balcooma Metavolcanics/v,EOb/v,#b3599c +Bald Hill Formation/b,Dlb/b,#e6ccfa +Bald Hill Formation/c,Dlb/c,#ccb3e0 +Bald Hill Formation/f,Dlb/f,#9980ad +Bald Hill Formation/g,Dlb/g,#ede0ff +Bald Hill Formation/l,Dlb/l,#664c7a +Bald Hill Formation/s,Dlb/s,#b399c7 +Bald Hill Formation/v,Dlb/v,#806694 +Baldick Granite,Cgodi,#ffd9e6 +Balfes Creek Granodiorite/d,SDgbc/d,#ff66c2 +Balfes Creek beds,CPb,#b4b8bf +Ballabay Complex,OPgb,#cc3333 +Ballara Quartzite,PLkb,#a87033 +Ballara Quartzite/1,PLkb/1,#c28a4c +Ballara Quartzite/2,PLkb/2,#755733 +Ballara Quartzite/2l,PLkb/2l,#dba366 +Ballara Quartzite/2t,PLkb/2t,#f5bd80 +Ballara Quartzite/l,PLkb/l,#dba366 +Ballara Quartzite/m,PLkb/m,#dba366 +Ballara Quartzite/q,PLkb/q,#755733 +Ballara Quartzite?,PLkb?,#a87033 +Ballast Creek Dacite,Cgcb,#ffbd94 +Bally Knob Volcanics/d1,CPb/d1,#9cabab +Bally Knob Volcanics/d2,CPb/d2,#9cabab +Bally Knob Volcanics/r1,CPb/r1,#758a8a +Bally Knob Volcanics/r1?,CPb/r1?,#758a8a +Bally Knob Volcanics/r2,CPb/r2,#c4cccc +Bally Knob Volcanics/r2?,CPb/r2?,#c4cccc +Ballynure Rhyolite/1,Cbb/1,#bfbfbf +Ballynure Rhyolite/2,Cbb/2,#e5e5e5 +Bamford Granite,Cgobm,#ff80ff +Bamford Granite/g,Cgobm/g,#ffccff +Banana Microgranite,CPgba,#ff00c5 +Barkers Basalt,Qcb,#ffc7b8 +Barkers Basalt>Balcooma Metavolcanics/g,Qcb>EOb/g,#ffc7b8 +Barkers Basalt>Balcooma Metavolcanics/v,Qcb>EOb/v,#ffc7b8 +Barkers Basalt>Bulgeri Formation,Qcb>Duu,#ffc7b8 +Barkers Basalt>Bulgeri Formation?,Qcb>Duu?,#ffc7b8 +Barkers Basalt>Dido Tonalite/d,Qcb>Sgi/d,#ffc7b8 +Barkers Basalt>Dido Tonalite/t,Qcb>Sgi/t,#ffc7b8 +Barkers Basalt>Einasleigh Metamorphics/1a,Qcb>PLe/1a,#ffc7b8 +Barkers Basalt>Einasleigh Metamorphics/1e,Qcb>PLe/1e,#ffc7b8 +Barkers Basalt>McKinnons Creek Granite,Qcb>Sgm,#ffc7b8 +Barkers Basalt>Oasis Metamorphics-PLEo/1,Qcb>PLo/1,#ffc7b8 +Barkers Basalt>Oasis Metamorphics-PLEo/3,Qcb>PLo/4,#ffc7b8 +Barkers Creek Igneous Complex/ak,Cgak,#ff4c66 +Barkers Creek Igneous Complex/ox,Cgox,#e6334c +Barnard Metamorphics,PLOb,#ba855d +Barnard Metamorphics/m,PLOb/m,#fcb069 +Barnard Metamorphics/s,PLOb/s,#fcaf68 +Barney Knob Granite,Cgzy,#ff1919 +Barney Knob Granite?,Cgzy?,#ff1919 +Barrabas Granite/2,SDgba/2,#f25975 +Barrabas Granite/3,SDgba/3,#b81936 +Barrabas Granite/lg,SDgba/lg,#ffd4d6 +Barratta Granite,CPgb,#ffb8e0 +Bartle Frere Granite,Pga,#ff3859 +Barwidgi Granite,Cgoba,#ff4cd9 +Barwon Granite,Dgbw,#ffada3 +Barwon Granite?,Dgbw?,#ffada3 +Batcha Granite,Cgbba,#ffcccc +Batcha Granite/1,Cgbba/1,#ffe6e6 +Baumans Camp Granite,Cgb,#ff99ff +Beapeo Rhyolite/d,Cab/d,#e8ebd9 +Beapeo Rhyolite/r1,Cab/r1,#cfd1bf +Beapeo Rhyolite/r2,Cab/r2,#b3b5a3 +Beasley Creek Tonalite,SDgbe,#ffbee8 +Beasley Creek Tonalite/a,SDgbe/a,#ffd9e8 +Beasley Creek Tonalite/d,SDgbe/d,#ccbfff +Beasley Creek Tonalite/gd,SDgbe/gd,#ff879e +Bedarra Granite Complex,Cgbd,#db31e0 +Bedlog Rhyolite,Cbl,#b8bfcc +Bedlog Rhyolite?,Cbl?,#b8bfcc +Belgravia Granodiorite/1,Cgab/1,#ff80a6 +Belgravia Granodiorite/2,Cgab/2,#ff3847 +Bellenden Ker Granite,Pgbk,#ff6694 +Bellview Granite,Ogwm,#ff2952 +Bend Granodiorite,Ogbe,#ff4d5c +Beril Peak Rhyolite,Cnr,#999999 +Bernecker Creek Formation,PLeb,#75614c +Bernecker Creek Formation/cs,PLeb/cs,#99806b +Bessie Point Granite,Pgcmb,#ff00c5 +Betts Creek beds,Pe,#3fb2eb +Betts Creek beds?,Pe?,#3fb2eb +Beverly Hills Granite,Sgb,#ff7a85 +Bewilder Granodiorite,CPgbw,#ff6694 +Big Bend Formation,Dfa,#9d7cde +Big Bend Formation?,Dfa?,#9d7cde +Big Bore Granodiorite,Dgbg,#ff5978 +Big Surprise Tuff,Pvas,#7a8ef5 +Big Tableland Granite,Pgcbt,#ffbfdb +Big Watson Granodiorite,CPgab,#f57a7a +Bigie Formation,PLf,#966133 +Bigie Formation-y,PLfy,#c99466 +Bigie Formation-y/1,PLfy/1,#966133 +Bigie Formation-y/2,PLfy/2,#7d4719 +Bigie Formation-y/3,PLfy/3,#d9a673 +Bigie Formation-y/4,PLfy/4,#632e00 +Bigie Formation-y?,PLfy?,#c99466 +Bigie Formation-z,PLfz,#a36e40 +Bigie Formation-z/q,PLfz/q,#d6a180 +Bigie Formation-z?,PLfz?,#a36e59 +Bigie Formation/cg,PLf/cg,#d6a173 +Bigie Formation?,PLf?,#966133 +Bilch Creek Granodiorite,Cgdn,#ff66ff +Billicumidji Rhyolite Member,PLcc/5,#e68a33 +Billings Granite,Cgbb,#ffa699 +Billycan Granite,Cgoy,#ff7a85 +Bimba Granite,PLgeb,#cd6699 +Bird Spring Granite,Cgoi,#ff00c5 +Birdbush Basalt Flow,Qbnb,#f5de6e +Birds Well Granite,PLgwz,#e431eb +Birds Well Granite,w,#e431eb +Birds Well Granite?,PLgwz?,#e431eb +Birkhead Formation,Jib,#0d825d +Bismark Granite,Cgod,#e64073 +Black Cap Microdiorite,Cgba,#cf5e73 +Black Diamond Granite,Cgtl,#ff334d +Black Jack Granodiorite,SDgbj,#cc4073 +Black Knight Tonalite,CPgbk,#ff6370 +Black Knob Gabbro,Ogbk,#c7c9f2 +Black Pinnacle Igneous Complex/1,CPgbp/1,#ffbee8 +Black Pinnacle Igneous Complex/2,CPgbp/2,#ffa6cf +Black Pinnacle Igneous Complex/3,CPgbp/3,#ff8cb5 +Black Pinnacle Igneous Complex/d,CPgbp/d,#7857ff +Black Pinnacle Igneous Complex/v1,CPvbp/v1,#ffd9f2 +Black Prince Granite,Cgtb,#a83333 +Black Soil Andesite,Pvab,#9eabd6 +Black Soil Andesite/1,Pvab/1,#8073b8 +Blackeye Granite,PLge,#bf3b93 +Blackman Gap Complex,Sgbm,#e63638 +Blackman Gap Complex-alteration,Sgbm/a,#ff4f52 +Blanders Granodiorite,Dgbd,#ff99f2 +Blaze Creek Gneiss,PLgbc,#a80059 +Blencoe Granite,CPgbl,#ff4ccc +Blisters Swamp Granite,Ogbs,#ff5959 +Blisters Swamp Granite?,Ogbs?,#ff5959 +Bloodwood Granite,Cgto,#ff8c80 +Blue Duck Tonalite/d,SDgbd/d,#bdabff +Blue Duck Tonalite/gd,SDgbd/gd,#ffccdb +Blue Duck Tonalite/t,SDgbd/t,#fc6694 +Blue Rock Creek beds,Db,#9c80cf +Bluewater Rhyolite,Cbb,#d1d1d1 +Bluewater Rhyolite?,Cbb?,#d1d1d1 +Boatswain Granodiorite,SDgbw,#ffd9e9 +Bock Granodiorite,Cgak,#cd6666 +Bogie Creek Granite,Cgo,#cd6699 +Bogie Granite/a,CPgbo/a,#ff80ff +Bombarri Granodiorite,Ogbb,#db4c4c +Bombarri Granodiorite?,Ogbb?,#db4c4c +Bonnor Creek Granite,Cgb,#eb00b5 +Bonnor Creek Granite/a,Cgb/a,#fa40e6 +Bonnor Creek Granite?,Cgb?,#eb00b5 +Boolbun Granite,Pgcb,#e64c00 +Boolbun Granite?,Pgcb?,#e64c00 +Boomarra Metamorphics/f,PLb/f,#9c361c +Boomarra Metamorphics/g,PLb/g,#ff3333 +Boomarra Metamorphics/m,PLb/m,#b54f36 +Boomarra Metamorphics/q,PLb/q,#ff9c82 +Boomarra Metamorphics/s,PLb/s,#e68269 +Boomarra Metamorphics?,PLb?,#e68269 +Boomerang Basalt,Qmo,#faf766 +Boondooma Igneous Complex,PRgbo,#ffbee8 +Boondooma Igneous Complex-PRgbo/d,PRgbo/d,#ff8ce8 +Boondooma Igneous Complex-PRgbo/g,PRgbo/g,#e68ccf +Boondooma Igneous Complex-PRgbo/ga,PRgbo/ga,#ffd9ff +Boondooma Igneous Complex-Rgbo,Rgbo,#db91db +Boorama Tank gneiss,PLgbt,#ff5cc7 +Boori Igneous Complex/1,Pgb/1,#ff404c +Boori Igneous Complex/2,Pgb/2,#ff6673 +Boori Igneous Complex/3,Pgb/3,#ff8c99 +Boori Igneous Complex/a,Pgb/a,#ff2633 +Boot Granite,Cgtb,#f54747 +Borneo Granodiorite/1,Cgobo/1,#ff78ab +Borneo Granodiorite/2,Cgobo/2,#ff99cc +Borneo Granodiorite/l1,Cgobo\l1,#ff5285 +Borneo Granodiorite/l2,Cgobo/l2,#ffabc4 +Boroston Formation,Cuo,#818599 +Bortala Formation,PLhb,#b34026 +Bortala Formation/0,PLhb/0,#ffd9b3 +Bortala Formation/1,PLhb/1,#ffb38c +Bortala Formation/2,PLhb/2,#ff8c73 +Bortala Formation/3,PLhb/3,#e67359 +Bortala Formation/q,PLhb/q,#cc5940 +Bortala Formation?,PLhb?,#b34026 +Bosworth Gabbro,Pgbw,#ab94ff +Bottletree Formation,PLt,#754033 +Bottletree Formation/b,PLt/b,#dba699 +Bottletree Formation/cg,PLt/cg,#a87366 +Bottletree Formation?,PLt?,#754033 +Boulder Peak Granite,Cgto,#d69dbc +Bourgamba Microgranite,Pgco,#a80084 +Bousey Rhyolite/1,Cnu/1,#594c59 +Bousey Rhyolite/1a,Cnu/1a,#736673 +Bousey Rhyolite/1b,Cnu/1b,#f2e6f2 +Bousey Rhyolite/2,Cnu/2,#a699a6 +Bousey Rhyolite/2a,Cnu/2a,#8c808c +Bousey Rhyolite/2b,Cnu/2b,#d9ccd9 +Bousey Rhyolite/2c,Cnu/2c,#bfb3bf +Bousey Rhyolite/2f,Cnu/2f,#a699a6 +Bousey Rhyolite/s,Cnu/s,#9e85a6 +Bowler Creek Granite,PLgbc,#cc3366 +Bowlers Hole Granite,PLgww,#bf285d +Bowthorn Member,PLscb,#e6b373 +Bowthorn Member?,PLscb?,#e6b373 +Box Forest Quartz Diorite,Ogbf,#f5479c +Boxvale Sandstone Member,Jev/b,#8cf2f7 +Boxwood Volcanics,Cvd,#999999 +Bracteata Mudstone,Dwr,#784fbd +Branch Creek Rhyolite,Cgi,#ffb359 +Brandy Hot Granodiorite,PLgby,#f233f2 +Brandy Hot Granodiorite?,PLgby?,#f233f2 +Breakaway Shale,PLib,#66573d +Breakaway Shale/h,PLib/h,#998a70 +Breccia Creek Rhyolite,CPvb,#99adad +Breccia Creek Rhyolite/1,CPvb/1,#b3c7c7 +Breccia Creek Rhyolite/1v,CPv/1v,#809494 +Breccia Creek Rhyolite/a,CPvb/1a,#e0e0e0 +Breccia-Amethyst Castle,PLbx,#9e340a +Briar Granite,PLgsb,#eb006b +Brinagee Schist,EOab,#c461c9 +Brittania Granodiorite,SDgr,#f57ab6 +Brittania Granodiorite/mg,SDgr/mg,#ff4263 +Brittany Granite,Ogbr,#f58cc7 +Brodies Camp Supersuite/g,Pgr/g,#ff2952 +Brodies Camp Supersuite/gd,Pgr/gd,#ff6370 +Brodies Camp Supersuite/gd?,Pgr/gd?,#ff6370 +Brodies Camp Supersuite/p,Pgr/p,#fc3370 +Brodies Gap Rhyolite,Pnb,#4cb3e6 +Brodies Gap Rhyolite/1,Pnb/1,#3399cc +Brodies Gap Rhyolite/2,Pnb/2,#66ccff +Brodies Gap Rhyolite/3,Pnb/3,#1980b3 +Brodies Gap Rhyolite/3r,Pnb/3r,#a6e6ff +Brodies Gap Rhyolite/4,Pnb/4,#006699 +Brodies Gap Rhyolite?,Pnb?,#4cb3e6 +Bromley Hills Formation/s,Dlr/s,#ccb3ff +Bromley Hills Formation/t,Dlr/t,#a68cff +Brook Complex,ODcb,#f2bff2 +Brookdale Granite,OSgb,#ffa699 +Brookers Waterhole Granite,Cgok,#c21969 +Broughton River Granodiorite,SDgb,#ed3338 +Broughton River Granodiorite/m,SDgb/m,#ed595e +Broughton River Granodiorite/t,SDgb/t,#ffb3c9 +Brown Mountain Granite,CPgw,#e06699 +Brownville Granite,Cgtr,#ff5978 +Brumby Granite,Cgtm,#ff5500 +Brumby Sandstone Member,Rrsb,#2eb8ff +Buaraba Mudstone,Pccb,#739eff +Buaraba Mudstone/aa,Psb/aa,#5985ff +Buaraba Mudstone/sa,Psb/sa,#406bf7 +Bubbling Granodiorite,Dgbl,#cc5966 +Bucket Hole Metavolcanics/a,PLbh/a,#a67366 +Bucket Hole Metavolcanics/a?,PLbh/a?,#a67366 +Bucket Hole Metavolcanics/b,PLbh/b,#bf8c80 +Bucket Hole Metavolcanics/b?,PLbh/b?,#bf8c80 +Bucklands Hill Diorite,Egb,#6940ff +Buddawadda Basalt Member,PLvpb,#8c8a5e +Bularnu Formation,PLbu,#f0dbb8 +Bulgeri Formation,Duu,#8261b3 +Bulgeri Formation/a,Duu/a,#b5ade6 +Bulgeri Formation/c,Duu/c,#9c94cc +Bulgeri Formation?,Duu?,#8261b3 +Bulgin Creek Granite,SDghb,#f57ab6 +Bulgin Creek Granite/h,SDghb/h,#f594cf +Bulgin Creek Granite/m,SDghb/m,#f5619c +Bull Creek Granite/a,Pgkb/a,#f57ab6 +Bull Creek Granite/gd,Pgkb/gd,#ff94cf +Bull Creek Granite/md,Pgkb/md,#c24782 +Bull Creek Granite/mg,Pgkb/mg,#f57ab6 +Bull Creek Granite/mt,Pgkb/mt,#ffade8 +Bull Creek Granite/pg,Pgkb/pg,#db619c +Bullhead Granite,Pgwb,#a80084 +Bullock Creek Granite,Sgbu,#ff8c73 +Bullseye Rhyolite/c,Pb/c,#ccd9ff +Bullseye Rhyolite/r,Pb/r,#99b5ff +Bullseye Rhyolite/r?,Pb/r?,#99b5ff +Bullseye Rhyolite/s,Pb/s,#4069ff +Bullseye Rhyolite/t,Pb/t,#668fff +Bullseye Rhyolite/t?,Pb/t?,#668fff +Bulluburrah Granodiorite,Cgobu,#cd6666 +Bulmung Sandstone Member,PLmh/3,#f0dbb8 +Bulmung Sandstone Member?,PLmh/3?,#f0dbb8 +Bulonga Volcanics,PLvb,#d19661 +Bulonga Volcanics/f,PLvb/f,#bd824c +Bulonga Volcanics/q,PLvb/q,#854a14 +Bulonga Volcanics/s,PLvb/s,#9e632e +Bulonga Volcanics?,PLvb?,#d19661 +Bundock Creek Group,DCb,#c29ed7 +Bundock Creek Group?,DCb?,#c29ed7 +Bungabilly Granite,Cgou,#c23385 +Bungabilly Granite?,Cgou?,#c23385 +Bungil Formation,Kyb,#20d600 +Bunira Granite,Dgbu,#ffebe8 +Bunk Creek Granite,Pgyb,#f57a7a +Bunkers Hill Granite,Ogbu,#ff4c80 +Burangoo Sandstone,PLsu,#e6a68c +Burdekin Formation,Dfb,#867a99 +Burdekin Formation?,Dfb?,#867a99 +Burges Formation,Dwb,#d9d1e6 +Burke Granite,Cgobr,#f299ff +Burlington Granite,Cgzb,#ffb3bf +Burlington Granite-alteration,Cgzb/a,#ffccd9 +Burns Granite,Dgu,#ffd1de +Burstall Granite,PLgwb,#ba2b30 +Burstall Granite/l,PLgwb/l,#ed5e63 +Burstall Granite/m,PLgwb/m,#ff787d +Burstall Granite/mg,PLgwb/mg,#d96666 +Burstall Granite/tp,PLgwb/tp,#ff9eab +Burton Lagoon Granite,Dgbl,#ffa6f2 +Bushy Park Gneiss,PLgwy,#ff2952 +Bustlem Microgranite,Pglu,#f573b5 +Butterfly Granite,Cgtu,#a80084 +Butters Creek Granite,Cgzu,#e6bfbf +Butters Creek Granite-alteration,Cgzu/a,#e6a6a6 +CP/br-7962,CP/br,#ffb300 +CP/bx-7864,CP/bx,#ed5192 +CPbx-7862,CPbx,#ed5192 +CPbx-HODG,CPbx,#ed5192 +CPbx-SF55-02,CPbx,#d6dee0 +CPd-7865,CPd,#1926c9 +CPg-7558,CPg,#de3156 +CPg-7862,CPg,#de3156 +CPg-SD55-13,CPg,#de3156 +CPg-SE5509,CPg,#de3156 +CPg-SE5514,CPg,#de3156 +CPg-SF5501,CPg,#de3156 +CPg/3-SE5509,CPg/3,#ffa6ff +CPg/4-SE5509,CPg/4,#c40d3d +CPg/6-8357,CPg/6,#ff3847 +CPg/a-7765,CPg/a,#ff4033 +CPg/a-8159,CPg/a,#ff4033 +CPg/a-8258,CPg/a,#ff4033 +"CPg/a-8258,CPg/d-8258","CPg/a,CPg/d",#ff4033 +CPg/b-NCON,CPg/b,#d13380 +CPg/c-7864,CPg/c,#cd6666 +CPg/d-8159,CPg/d,#eb3cf0 +CPg/d-SE5510,CPg/d,#6940ff +CPg/g-SF55-02,CPg/g,#fc6694 +CPg/gd-7559,CPg/gd,#b8466e +CPg/gd-SF55-02,CPg/gd,#ffccff +CPg/h-NCON,CPg/h,#eb3696 +CPg/i-8258,CPg/i,#bf4d9f +"CPg/i-8258,CPg/a-8258,CPg/d-8258","CPg/i,CPg/a,CPg/d",#bf4d9f +CPg/m-7961,CPg/m,#ffbfb3 +CPg?-QLD,CPg?,#de3156 +CPg\a/a-7864,CPg\a/a,#ba4444 +CPg\d-7964,CPg\d,#9173ff +CPg\g-7964,CPg\g,#3842d1 +CPg\h-SE55,CPg\h,#d94a62 +CPg\l-SE55,CPg\l,#b54190 +CPg\m-SE55,CPg\m,#d12e72 +CPg\q-7964,CPg\q,#ed4ac7 +CPgaa-NCON,CPgaa,#bf3242 +CPgr/1-Kennedy Province,geophysics,#ff7370 +CPgr/2-Kennedy Province,geophysics,#ff3847 +CPi-Kennedy Province,geophysics,#ffc417 +CPi-SD54,CPi,#c9f7fc +CPi/1-Kennedy Province,geophysics,#6b8c94 +CPia-7963,CPo,#6940ff +CPia-Kennedy Province,CPia,#8a6bff +CPia-SD54-12,CPia,#572bff +CPia?-Kennedy Province,CPia?,#ff45ab +CPid-Kennedy Province,CPda,#eb008a +CPir-Kennedy Province,CPir,#ffb819 +CPir/x-Kennedy Province,CPir/x,#ffdb73 +CPir?-Kennedy Province,CPir?,#ffb819 +CPmg-7864,CPmg,#a80084 +CPmg-Kennedy Province,CPmg,#ff8c99 +CPmg?-Kennedy Province,CPmg?,#ff8c99 +CPr/2-7763,CPr/2,#ffc92e +CPrx-SD55-02,CPrx,#ed5192 +CPs?-7862,CPs?,#a80000 +CPsv-SD54,CPsv,#cce0fc +CPv-Kennedy Province,geophysics,#547080 +CPv-SF5501,CPv,#848ca1 +CPv/1-SD54,CPv/1,#ffeb69 +CPv/2-SD54,CPv/2,#ffeb69 +CPy-7962,CPy,#ffb3b3 +Calcifer Granite/1,Cgoca/1,#a80000 +Calcifer Granite/2,Cgoca/2,#ff7f7f +California Granite,Cgol,#ffbee8 +Calvert Superbasin undivided,PLc,#d94c00 +Camel Creek Granite,PLgcm,#ffb3bf +Camp Oven Dacite/1,Pvyo/1,#bfebeb +Camp Oven Dacite/1?,Pvyo/1?,#bfebeb +Camp Oven Dacite/a,Pvyo/a,#b3dede +Camp Oven Dacite/r,Pvyo/r,#80abab +Camp Oven Dacite/ri,Pvyo/ri,#99c4c4 +Camp Oven Mountain Complex/a,CPtc/a,#ffe0cc +Camp Oven Mountain Complex/d,CPtc/d,#ffb380 +Camp Oven Mountain Complex/dp,CPtc/dp,#ffd1b3 +Camp Oven Mountain Complex/rp,CPtc/rp,#ffc92e +Camp Oven Mountain Complex/si,CPtc/si,#ff8533 +Campbell Mountain Granite/g,Pgkc/g,#ffbfff +Campbell Mountain Granite/gd,Pgkc/gd,#ff73df +Campbell Mountain Granite/hb,Pgkc/hb,#ffa6ff +Campbell Mountain Granite/mg,Pgkc/mg,#ff8cf7 +Campbell Mountain Granite/mz,Pgkc/mz,#ff59c4 +Campbell Mountain Granite/p,Pgkc/p,#ff40ab +Campfellow Granite,Ogcf,#ffb3c9 +Campsbourne Granodiorite,Cgac,#f57ab6 +Candlow Formation/1,PLcf/1,#ada68c +Candlow Formation/1?,PLcf/1?,#ada68c +Candlow Formation/2,PLcf/2,#e0d9bf +Candlow Formation/2?,PLcf/2?,#e0d9bf +Candlow Formation/3,PLcf/3,#c7bfa6 +Candlow Formation/3?,PLcf/3?,#c7bfa6 +Candover beds/b,PLcd/b,#a84c40 +Candover beds/b?,PLcd/b?,#a84c40 +Candover beds/s,PLcd/s,#ffa396 +Candover beds/sa,PLcd/sa,#db8073 +Candover beds/v,PLcd/v,#c26659 +Cannibal Creek Granite/3,Pgc/3,#f57a7a +Cannibal Creek Granite/a,Pgc/a,#e68080 +Cannibal Creek Granite/c,Pgc/c,#d96666 +Canyon Dacite,Cna,#e0e0e0 +Canyon Dacite/1,Cna/1,#c2c2c2 +Cape River Metamorphics,PLEc,#a6704c +Cape River Metamorphics/a,PLEc/a,#996640 +Cape River Metamorphics/c,PLEc/c,#966340 +Cape River Metamorphics/m,PLEc/m,#d9b38c +"Cape River Metamorphics/m,Bombarri Granodiorite","PLEc/m,Ogbb",#d9b38c +Cape River Metamorphics/m?,PLEc/m?,#d9b38c +Cape River Metamorphics/s,PLEc/s,#c99673 +Cape River Metamorphics/sa,PLEc/sa,#734019 +Cape River Metamorphics/sa?,PLEc/sa?,#734019 +Cape River Metamorphics/sm,PLEc/sm,#f2cca6 +Cape River Metamorphics/x,PLEc/x,#8c5933 +Cape River Metamorphics/y,PLEc/y,#ba8761 +Cape River Metamorphics/z,PLEc/z,#592600 +Cape River Metamorphics/z?,PLEc/z?,#592600 +Cape River Metamorphics?,PLEc?,#a6704c +Capel Granodiorite,Dgce,#a80019 +Cardross Orthogneiss,PLdd/g5,#ff4d5c +Carew Greenstone,PLr,#4cff57 +Carew Greenstone/a,PLr/a,#4cff57 +Cargoon Granodiorite,Dgca,#f5997a +Carleton Monzogranite,Dgc,#ff33ff +Carnes Granodiorite,Pgc,#ff6640 +Carriers Well Formation,Oc,#b5478c +Carriers Well Formation/l,Oc/l,#d666ba +Carriers Well Formation?,Oc?,#b5478c +Carron Rhyolite,PLrc,#d6a361 +Carron Rhyolite/a,PLrc/a,#bd8a47 +Carron Rhyolite?,PLrc?,#d6a361 +Carrs Granite/1,Cgoc/1,#f561b5 +Carrs Granite/2,Cgoc/2,#e6479c +Carrs Granite/3,Cgoc/3,#cc297d +Carruchan Monzogranite,Cgca,#bd2f53 +Carse Creek Complex,ODcc,#a80000 +Carse-O-Gowrie Granodiorite,SDgco,#ff7a7a +Carse-O-Gowrie Granodiorite/f,SDgco/f,#ff3847 +Carse-O-Gowrie Granodiorite/g,SDgco/g,#ffbdc2 +Carters Bore Rhyolite,PLhr,#91664a +Carysfort Quartzite,PLt,#ffff80 +Carysfort Quartzite/e,PLt/e,#ffff00 +Casey Spring Creek Granodiorite,SDgcs,#e66161 +Cassidy Creek Metamorphics,PLcm,#ccc299 +Castle Hill Granite,Pgc,#cd6699 +Caterpillar Microgranite,Cgc,#f22e47 +Catherine Creek Granodiorite,CPgac,#f5adad +Cattle Camp Granite,Pgza,#ffd9e6 +Cattle Camp Granite/m,Pgza/m,#f2bfcc +Cbx-SF55-02,Cbx,#ffd65c +Cd-7962,Cd,#ffd9f2 +Centauri Granodiorite,SDgct,#db80b3 +Cg-7962,Cg,#c24e67 +Cg-8259,Cg,#c24e67 +Cg/1-7763,Cg/1,#ffd9d9 +Cg/1-7863,Cg/1,#ffd9d9 +Cg/2-7763,Cg/2,#ff8ca6 +Cg/3-7863,Cg/3,#e60000 +Cg/a-BVSP,Cg/a,#f05993 +Cg/d-7863,Cg/d,#ff00c5 +Cg/d-8059,Cg/d,#572bff +Cg/f-8059,Cg/f,#ba499e +Cg/gd-BVSP,Cg/gd,#b32b4c +Cg/l-7863,Cg/l,#c2194c +Cg/n-8059,Cg/n,#ffbebe +Cg/p-8059,Cg/p,#ffa6a6 +Cg/p-8159,Cg/p,#ffa6a6 +Cg/p?-8159,Cg/p?,#ffa6a6 +Cg/t-7959,Cg/t,#ff7f7f +Cg/y-8059,Cg/y,#ed3261 +Cg?-7660,Cg?,#c24e67 +Cgc/g-7963,Cgc/g,#ffa77f +Cgc/p-7963,Cgc/p,#ffbebe +Cgdt-7863,Cgdt,#cc4040 +Cgev-SE54-8,Cgev,#e64c99 +Cgg-7862,Cgg,#ff73df +Cgj-7863,Cgj,#a80084 +Cgk-7862,Cgk,#ff6e19 +Cgm-7862,Cgm,#e600a9 +Cgm?-7862,Cgm?,#e600a9 +Cgp-7762,Cgp,#e63746 +Cgt-7962,Cgt,#ff73df +Cgt/a-Kennedy Province,Cgt/a,#ffbee8 +Cgt/g-7963,Cgt/g,#ff00c5 +Cgt/g?-7963,Cgt/g?,#ff00c5 +Cgt/m-SE55,Cgt/m,#ff73df +Cgt/p-Kennedy Province,Cgt/p,#d9009c +Cgx-7863,Cgx,#db80d1 +Chadshunt Granite,PLgec,#db4040 +Chahpingah Meta-igneous Complex,Cgc,#f5804c +Charelle Granite,SDgcl,#ffccff +Charlies Knob Granite,Cgzc,#f57ab6 +Charlies Knob Granite?,Cgzc?,#f57ab6 +Charters Towers Metamorphics,PLEct,#f7a765 +Charters Towers Metamorphics/ca,PLEct/ca,#f7cc8c +Charters Towers Metamorphics/m,PLEct/m,#de8c4c +Charters Towers Metamorphics/ms,PLEct/ms,#d6bfbf +Charters Towers Metamorphics/s,PLEct/s,#b08582 +Charters Towers Metamorphics?,PLEct?,#f7a765 +Chelmsford Gneiss,PLyc,#804c40 +Chelmsford Gneiss?,PLyc?,#804c40 +Cherry Tree Granite,Pgzc,#db33b8 +Cherry Tree Granite/m,Pgzc/m,#c2199e +Chevy Creek Granite,Dgch,#ff424d +Chillagoe Formation,SDc,#c969d6 +Chillagoe Formation/a1,SDc/a1,#b04fbd +Chillagoe Formation/a1?,SDc/a1?,#b04fbd +Chillagoe Formation/a2,SDc/a2,#db9ef0 +Chillagoe Formation/am,SDc/am,#fca6ff +Chillagoe Formation/b,SDc/b,#e382f0 +Chillagoe Formation/c,SDc/c,#9636a3 +Chillagoe Formation/cg,SDc/cg,#d94cd9 +Chillagoe Formation/l,SDc/l,#ffccff +Chillagoe Formation/m,SDc/m,#c982f0 +Chillagoe Formation/q,SDc/q,#e39cff +Chillagoe Formation/s,SDc/s,#b069d6 +Chillagoe Formation?,SDc?,#c969d6 +China Camp Microgranite,Pgcm,#ffbf99 +Chinaman Creek Limestone,Dwc,#dbbff0 +Chinamans Creek Granite,SDgac,#ff4c4c +Chipley Granite,Ogc,#db3385 +Chippendale Granodiorite,SDgch,#ff66b3 +Christmas Hill Trondhjemite,Sgx,#ffb3a6 +Chudleigh Basalt-Qb,Qbc,#faeba0 +Chudleigh Basalt-Qb/2,Qbc/2,#f5f264 +Chudleigh Basalt-Qb>Dumbano Granite/2,Qbc>Sgd/2,#faeba0 +Chudleigh Basalt-Qb>Einasleigh Metamorphics/1a,Qbc>PLe/1a,#faeba0 +Chudleigh Basalt-Qb>Einasleigh Metamorphics/1d,Qbc>PLe/1d,#faeba0 +Chudleigh Basalt-Qb>Einasleigh Metamorphics/1e,Qbc>PLe/1e,#faeba0 +Chudleigh Basalt-Qb>Einasleigh Metamorphics/3a,Qbc>PLe/3a,#faeba0 +Chudleigh Basalt-Qb>Oasis Metamorphics-PLEo/3?,Qbc>PLo/4?,#faeba0 +Chudleigh Basalt-TQb,TQbc,#edca85 +Chudleigh Basalt-TQb/v,TQbc/v,#d4b06b +Chudleigh Basalt-TQb?,TQbc?,#edca85 +Chudleigh Basalt/v,TQbc/v,#d1b66b +Chudleigh basalt-Qb/v,Qbc/v,#fcf6ca +Chuko Quartzite,PLyq,#ffc433 +Chulcee Formation,PLzic,#e6c480 +Chulcee Formation?,PLzic?,#e6c480 +Chumvale Breccia,PLcx,#e6994c +Cia-Kennedy Province,Cia,#7857ff +Cid-Kennedy Province,Cid,#ffe04d +Cigarette Granite,Cgti,#ffb3e8 +Cir-Kennedy Province,Cir,#ffc417 +"Cir-Kennedy Province,Cape River Metamorphics","Cir,PLc",#ffc417 +"Cir-Kennedy Province,Sues Creek Microgranite,Eastdale Granite","Cir,Cgs,Cge",#ffc417 +Cir?-Kennedy Province,Cir?,#ffc417 +Clamshell Granite,Pgccl,#ffbee8 +Clare Hills Granite,Pgch,#ff8a63 +Claret Creek Volcanics,Cvc,#35a6de +Clarke River Group,Cc,#c9c9c9 +Clayhole Schist,EObc,#e08cf5 +Clemant Microgranite,Cgn,#ff4263 +Clematis Group,Re,#3bc4ad +Clgn-BVSP,Clgn,#f57a7a +Cliffdale Volcanics,PLvf,#b59654 +Cliffdale Volcanics?,PLvf?,#b59654 +Clotten Granodiorite,Pgac,#a80084 +Coane Range Granite Complex,Cgcr,#d1324a +Coane Range Granite Complex?,Cgcr?,#d1324a +Cobbold Metadolerite,PLx,#2936cf +Cockie Spring Tonalite,Ogcs,#e657d3 +Coleman River Gneiss,PLl,#9c8c26 +Colless Volcanics,PLEvc,#eba66e +Colless Volcanics?,PLEvc?,#eba66e +Collingwood Granite,Pgcw,#f54c4c +Collingwood Granite/ap,Pgcw/ap,#ffc7c7 +Collingwood Granite/mg,Pgcw/mg,#ff2626 +Collins Weir Rhyolite,Pcrw,#ffc92e +Collopy Formation,Dy,#bdb1de +Collopy Formation/c,Dy/c,#a6a6ff +Collopy Formation?,Dy?,#bdb1de +Columbia Creek Complex,Ogc,#ffd9d9 +Columbia Creek Complex/g,Ogc/g,#ffb3ff +Columbia Creek Complex/mz,Ogc/mz,#ffcfd9 +Combella Rhyolite,Pfc,#99b3cc +Combella Rhyolite/1,Pfc/1,#668099 +Combella Rhyolite/2,Pfc/2,#8099b3 +Combella Rhyolite?,Pfc?,#99b3cc +Condamine beds,Puc,#2896b5 +Cone Creek Metabasalt Member,PLnc,#dba333 +Cone Creek Metabasalt Member/a,PLnc/a,#b57d0d +Confluence Granite,Cgtc,#ffccb0 +Conical Knob Microgranite,Cgbc,#ba2b2d +Conjuboy Formation,Dc,#624dbd +Connie May Dolerite,Pgcm,#70338a +Connolly Volcanics,SDc,#7c4287 +Constance Sandstone,PLsc,#edc296 +Constance Sandstone?,PLsc?,#edc296 +Controversy Hill Rhyolite,CPtc,#b2b2b2 +Controversy Hill Rhyolite-altered,CPr/a,#7f7f7f +Controversy Hill Rhyolite/i,CPtc/i,#85abd6 +Convict Granite,Cgoc,#ffd1d1 +Coocerina Formation,PLpc,#663e30 +Coocerina Formation?,PLpc?,#663e30 +Cook Microgranite,Cgbk,#ff6388 +Coonbeta Granite,Cgoco,#ffb3e8 +Cope Granite,Sgc,#ffa6a6 +Cope Granite/2,Sgc/2,#ffd9d9 +Cope Granite/3,Sgc/3,#ff8c8c +Cope Granite/a,Sgc/a,#ffbfbf +Cope Granite?,Sgc?,#ffa6a6 +Copper Bush Granite,Pgko,#e68040 +Copper Bush Granite/mg,Pgko/mg,#e62640 +Copper Bush Granite/p,Pgko/p,#e65940 +Copper Bush Granite/y,Pgko/y,#e65940 +Copper Bush Granite?,Pgko?,#e68040 +Copper Valley Granite,PLgcv,#ff5714 +Corbett Formation,PLco,#998052 +Corbett Formation/q,PLco/q,#bda378 +Corbett Formation/s,PLco/s,#70572b +Corbett Formation/s?,PLco/s?,#70572b +Corduroy Swamp Granite,Pgzcs,#ffbfb3 +Corduroy Swamp Granite/f,Pgzcs/f,#ff9980 +Corduroy Swamp Granite/fa,Pgzcs/fa,#ff8073 +Corella Formation,PLkc,#ad8066 +Corella Formation-a,PLkc-a,#d1c2a6 +Corella Formation-b,PLkc-b,#b39987 +Corella Formation-c,PLkc-c,#c49e80 +Corella Formation-d,PLkc-d,#9e6e59 +Corella Formation/1,PLkc/1,#6e4026 +Corella Formation/1?,PLkc/1?,#6e4026 +Corella Formation/1c,PLkc/1c,#c79980 +Corella Formation/1q,PLkc/1q,#e0b399 +Corella Formation/2,PLkc/2,#4c2e1c +Corella Formation/2l,PLkc/2l,#664736 +Corella Formation/2q,PLkc/2q,#997a69 +Corella Formation/2q?,PLkc/2q?,#997a69 +Corella Formation/2t,PLkc/2t,#6e614f +Corella Formation/2ts-MK,PLkc/2ts,#6e614f +Corella Formation/3,PLkc/3,#ccab66 +Corella Formation/3a,PLkc/3a,#e6c480 +Corella Formation/3l,PLkc/3l,#ffde99 +Corella Formation/3q,PLkc/3q,#b3914c +Corella Formation/3r,PLkc/3r,#a68540 +Corella Formation/3s,PLkc/3s,#a68540 +Corella Formation/a,PLkc/a,#664c47 +Corella Formation/a?,PLkc/a?,#664c47 +Corella Formation/ab,PLkc/ab,#8c736e +Corella Formation/b,PLkc/b,#805954 +Corella Formation/b?,PLkc/b?,#805954 +Corella Formation/c,PLkc/c,#b39994 +Corella Formation/cs,PLkc/cs,#ccb3ad +Corella Formation/fs,PLkc/fs,#e6c480 +Corella Formation/gf-MK,PLkc/gf,#ccad9c +Corella Formation/h,PLkc/h,#8a6352 +Corella Formation/i,PLkc/i,#c9a391 +Corella Formation/l,PLkc/l,#c2947d +Corella Formation/m,PLkc/m,#cc9e8c +Corella Formation/m-MK,PLkc/m,#cc9e8c +Corella Formation/mm-MK,PLkc/mm,#ffe6d4 +Corella Formation/mq-MK,PLkc/mq,#b3664d +Corella Formation/ms-MK,PLkc/ms,#664736 +Corella Formation/q,PLkc/q,#ebbda6 +Corella Formation/q?,PLkc/q?,#ebbda6 +Corella Formation/r,PLkc/r,#f0e0c2 +Corella Formation/r?,PLkc/r?,#f0e0c2 +Corella Formation/s,PLkc/s,#d9a68f +Corella Formation/s-MK,PLkc/s,#d9a68f +Corella Formation/sc,PLkc/sc,#f2c7ad +Corella Formation/ss-MK,PLkc/ss,#997a69 +Corella Formation/t,PLkc/t,#6e4742 +Corella Formation?,PLkc?,#ad8066 +Corkscrew Rhyolite,Cnw,#e0e0e0 +Corkscrew Rhyolite/1,Cnw/1,#c2c2c2 +Corkscrew Rhyolite/2,Cnw/2,#949494 +Corkscrew Rhyolite/3,Cnw/3,#a3a3a3 +Cornelia Orthogneiss,EOgc,#b34483 +Cornelia Orthogneiss?,EOgc?,#b34483 +Cornishman Volcanic Complex/aa,Cvc/aa,#ffe0cc +Cornishman Volcanic Complex/di,Cvc/di,#9980ff +Cornishman Volcanic Complex/gb,Cvc/gb,#edebff +Cornishman Volcanic Complex/gx,Cvc/gx,#ffb8c4 +Cornishman Volcanic Complex/r,Cvc/r,#ffdb73 +Cornishman Volcanic Complex/ri,Cvc/ri,#ffb380 +Cornishman Volcanic Complex/rx,Cvc/rx,#ffe8a3 +Cornishman Volcanic Complex/vc,Cvc/vc,#d6dee0 +Cornishman Volcanic Complex/vgx,Cvc/vgx,#ffd1b3 +Cornishman Volcanic Complex/vx,Cvc/vx,#ff7a57 +Cottell Rhyolite,Ctr,#cccccc +Cottell Rhyolite/1,Ctr/1,#a6a6a6 +Cottell Rhyolite?,Ctr?,#cccccc +Cowie Suite,PLgc,#ff4ccf +Cowley Ophiolite Complex,EOc,#545ed9 +Cracknell Granodiorite,Dgcn,#ff73df +Craigie Tonalite,SDgc,#ed34ed +Craigie Tonalite?,SDgc?,#ed34ed +Craigilee beds,SDc,#e8beff +Crane Creek Granite,Cgtoc,#e600a9 +Cranky Creek Microgranodiorite,Cgby,#f04fc8 +Crescent Granodiorite,SDgcr,#ff8cde +Crimea Granite,Ogcr,#ff8cb5 +Croissant Granite,Cgct,#e6008f +Cromwell Metabasalt Member,PLhc,#e0e0bd +Cromwell Metabasalt Member/cs,PLhc/cs,#61613d +Cromwell Metabasalt Member/cs?,PLhc/cs?,#61613d +Cromwell Metabasalt Member/g,PLhc/g,#c7c7a3 +Cromwell Metabasalt Member/p,PLhc/p,#949470 +Cromwell Metabasalt Member/q,PLhc/q,#c7c7a3 +Cromwell Metabasalt Member/q?,PLhc/q?,#c7c7a3 +Cromwell Metabasalt Member/s,PLhc/s,#96a380 +Cromwell Metabasalt Member/s1,PLhc/s1,#f0f5d1 +Cromwell Metabasalt Member/s13,PLhc/s13,#fafad6 +Cromwell Metabasalt Member/s14,PLhc/s14,#7a7a57 +Cromwell Metabasalt Member/s1?,PLhc/s1?,#f0f5d1 +Cromwell Metabasalt Member/s2,PLhc/s2,#c7ba96 +Cromwell Metabasalt Member/s2?,PLhc/s2?,#c7ba96 +Cromwell Metabasalt Member/s5,PLhc/s5,#e0d4b0 +Cromwell Metabasalt Member/s5?,PLhc/s5?,#e0d4b0 +Cromwell Metabasalt Member/s8,PLhc/s8,#ada17d +Cromwell Metabasalt Member/s8?,PLhc/s8?,#ada17d +Cromwell Metabasalt Member/sb,PLhc/sb,#e0c2b0 +Cromwell Metabasalt Member/sq,PLhc/sq,#c7a6a6 +Cromwell Metabasalt Member/t,PLhc/t,#b8ccb3 +Cromwell Metabasalt Member?,PLhc?,#e0e0bd +Crooked Creek Conglomerate,Sc,#de73ff +Crooked Creek Conglomerate/l,Sc/l,#f799ff +Crooked Creek Conglomerate?,Sc?,#de73ff +Crosbie Formation,PLec,#b5d100 +Crowns Diorite,Sgcd,#ccbfff +Crows Nest Granite,Rgr,#f04c4f +Croydon Volcanic Group,PLvc,#ff7817 +Crusader Sandstone Member,PLvac,#e69800 +Crystal Brook Volcanic Neck-Cgb,Cgb,#ff4c00 +Crystal Brook Volcanic Neck-Cgg,Cgg,#cc4c00 +Crystal Brook Volcanic Neck-Cgm,Cgm,#e64c00 +Cs-7863,Cs,#a3acc4 +Cta-7863,Cta,#595966 +Culba Granodiorite,Cgu,#fcb0bf +Culba Granodiorite/g,Cgu/g,#e396a6 +Cullens Creek Granite,Rxug,#ffa77f +Culpin Granite,Dgcu,#ff4d59 +Cultivation Gully Formation,Dfc,#5c46a6 +Cumbana Rhyolite/1,Cnc/1,#4ad9fa +Cumbana Rhyolite/1a,Cnc/1a,#63f2ff +Cumbana Rhyolite/1b,Cnc/1b,#bfccbf +Cumbana Rhyolite/2,Cnc/2,#30bfe0 +Cumbana Rhyolite/bx,Cnc/bx,#17a6c7 +Cumbana Rhyolite?,Cnc?,#4bdafa +Cummings Rhyolite,Cbc,#828282 +Curraghmore Granite,Pgwu,#cc3333 +Cv-7959,Cv,#abacb0 +Cv-8259,Cv,#abacb0 +D/um-Diamantina,D/um,#bf734c +DCg-Camel Creek,DCg,#bd3cb0 +DCs-SE55,DCs,#d1b3e6 +DCs?-8057,DCs?,#d1b3e6 +DCs?-SE55,DCs?,#d1b3e6 +Dagworth Andesite,CPnd,#bed2ff +Dagworth Andesite/r,CPnd/r,#a6b8ff +Dagworth Andesite/s,CPnd/s,#d9ebff +Dagworth Andesite?,CPnd,#bed2ff +Daintree Gneiss,PLyd,#bf8c66 +Daintree Gneiss?,PLyd?,#bf8c66 +Dalkum Microgranite,CPgd,#a8006b +Dalmore Granodiorite,SDgda,#ffb3bf +Dalnotter Dacite,Ckd,#b5bdad +Daniel Creek Formation,PLa,#872e14 +Daniel Creek Formation/s,PLa/s,#731900 +"Daniel Creek Formation/s,Digger Creek Granite","PLa/s,PLgd",#731900 +Daniel Creek Formation/s?,PLa/s?,#731900 +Dargalong Metamorphics,PLdd,#6e462e +Dargalong Metamorphics/g1,PLdd/g1,#d4ab94 +Dargalong Metamorphics/g2,PLdd/g2,#ba917a +Dargalong Metamorphics/g3,PLdd/g3,#875e47 +Dargalong Metamorphics/g4,PLdd/g4,#a17861 +Dargalong Metamorphics/m,PLdd/m,#542b14 +Dargalong Metamorphics/q,PLdd/q,#edc4ad +Davey Creek Granite,SDgav,#ff8cf7 +David Granite,Cgoda,#e68c73 +Dead Horse Metabasalt,PLd,#b5450d +Dead Horse Metabasalt/a,PLd/a,#d6662e +Deadman Granite,Cgod,#cd6699 +Deadman Granite?,Cgod?,#cd6699 +Deane Granodiorite,SDgn,#eb38b2 +Deane Granodiorite/l,SDgn/l,#fa59d4 +Deep Water Creek Granophyre,Pgd,#ff3847 +Deighton Quartzite,PLpd,#853d36 +Deighton Quartzite/1,PLpd/1,#6b241c +Deighton Quartzite/2,PLpd/2,#853d36 +Deighton Quartzite/3,PLpd/3,#d1a68f +Deighton Quartzite/4,PLpd/4,#9e574f +Deighton Quartzite/5,PLpd/5,#f7b08f +Deighton Quartzite/cg,PLpd/cg,#eba39c +Deighton Quartzite/i,PLpd/i,#b87069 +Delaney Granite,PLgy,#ffa699 +Delaney Granite/a,PLgy/a,#ffbfb3 +Delaney Granite?,PLgy?,#ffa699 +Democrat Rhyolite Member,PLrid,#b38c33 +Democrat Rhyolite Member/a?,PLrid/a?,#bf9940 +Democrat Rhyolite Member?,PLrid?,#b38c33 +Denford Granite,Cgtd,#cd6699 +Depression Basalt,Qmp,#f7e77c +Desailly Granite,Pgwd,#f57ab6 +Desert Creek Granite,Cgzd,#f233c2 +Desert Creek Granite/a,Cgzd/a,#cc0d9c +Devon Microgranite,Cgcd,#e64c00 +Devon Microgranite?,Cgcd?,#e64c00 +Dg-SD54,Dg,#b32586 +Dg/1-Gt,Dg/1,#cc6699 +Dg/1-Gt?,Dg/1?,#cc6699 +Dg/2-Gt,Dg/2,#e680b3 +Dg/3-Gt,Dg/3,#b34c80 +Dg/4-Gt,Dg/4,#ff3847 +Dg/5-Gt,Dg/5,#ff66ff +Dg/6-Gt,Dg/6,#ff6370 +Dg/a-Reedy Springs Batholith,Dg/a,#df73ff +Dg/r-Gt,Dg/3,#704489 +Dg?-SE54-4,Dg?,#b32586 +Dgak-SE54-4,Dgak,#f266c4 +Dgax-SE54-4,Dgax,#ffa6eb +Dgg/l-SD54-16,Dgg/l,#faccff +Dgla-SE54-4,Dgla,#cc40a1 +Dglb-SE54-4,Dglb,#ff4d82 +Dgle-SE54-4,Dgle,#ff8ced +Dgm-SD54-16,Dgm,#ff8f99 +Dgr-Pama Province,geophysics,#ff80ff +Dgr-SD54,Dgr,#ffdbff +Dickie Hill Granite,CPdgh,#ffbee8 +Dickson Creek Rhyolite,Pvsx,#3390b8 +Dido Tonalite,Sgi,#ffa6d9 +Dido Tonalite/b,Sgi/b,#1926c9 +Dido Tonalite/d,Sgi/d,#8a47ff +Dido Tonalite/d?,Sgi/d?,#8a47ff +Dido Tonalite/g,Sgi/g,#ffcccc +Dido Tonalite/t,Sgi/t,#ff5987 +Dido Tonalite/t?,Sgi/t?,#ff5987 +Dido Tonalite/x,Sgi/x,#ff249e +Dido Tonalite?,Sgi?,#ffa6d9 +Digger Creek Granite,PLgd,#f57a99 +Digger Creek Granite?,PLgd?,#f57a99 +Dillons Knob Granite,SDgai,#ff8080 +Dillons Knob Granite?,SDgai?,#ff8080 +Dinah Formation,PLd,#bf8c99 +Dinah Formation/d,PLd/d,#996673 +Dinah Formation/h1,PLd/h1,#e6b3bf +Dingo Mountain Granodiorite,CPgdi,#e85dae +Dingo Prospect Skarn,PLgds,#ff6d59 +Dip Creek Limestone,Dwd,#c2b3e6 +Dipvale Granodiorite,PLgdv,#cc4059 +Dirie Sandstone,PLzid,#8f5700 +Disaster Granite,Cgtd,#cc4c00 +Dismal Creek Dacite,Cd,#d9d9d9 +Dixie Granite,Dgdx,#ff3333 +Djungan Volcanic Subgroup/c,Pd/c,#7899bd +Djungan Volcanic Subgroup/cx,Pd/cx,#446589 +Djungan Volcanic Subgroup/d,Pd/d,#3a9cde +Djungan Volcanic Subgroup/r,Pd/r,#5e80a3 +Donaldsons Well Volcanic Member,Oj/d,#d140c7 +Donaldsons Well Volcanic Member?,Oj/d?,#d140c7 +Doncaster Member,Kud,#38a800 +Donnybrook Diorite,Sgjd,#9980ff +Doolan Creek Rhyolite,Cd,#b5adbd +Doolan Creek Rhyolite/a,Cd/a,#9c94a3 +Doolan Creek Rhyolite/b,Cd/b,#cfc7d6 +Doom Supersequence,PLmh/6,#e8c4d4 +Doomadgee Formation/1,PLfd/1,#e6734c +Doomadgee Formation/2,PLfd/2,#cc5933 +Doomadgee Formation/3,PLfd/3,#ff8c66 +Dora Granite,Cgdo,#f05b8f +Dora Granite?,Cgdo?,#f05b8f +Dosey Limestone,Dwo,#d9bfff +Dotswood Group,Dd,#795dde +Dotswood Group?,Dd?,#795dde +Double Barrel Andesite,Cvd,#83889e +Double Crossing Metamorphics,PLdc,#804d36 +Double Crossing Metamorphics/b,PLdc/b,#a6735c +Drake Volcanics,Pvd,#8adaff +Drake Volcanics - alteration?,Pvd/a,#70bfff +Drake Volcanics?,Pvd?,#8adaff +Dregger Granite,PLged,#ffbee8 +Dregger Granite?,PLged?,#ffbee8 +Dreghorn Complex,CPidh,#ffe08a +Dreghorn Complex/p,CPidh/p,#ffc417 +Drinkwater Diorite,ODgd,#6940ff +Drovers Lagoon Formation,PLed,#c7d659 +Dry Bore Granite,Sgdb,#ff6e33 +Dry River Metavolcanics,EObr,#9612b0 +Dry River Metavolcanics/2,EObr/2,#c945e3 +Drynoch Granite,CPgd,#eb00b8 +Duck Granodiorite,SDgd,#bf4966 +Duck Granodiorite?,SDgd?,#bf4966 +Duffers Creek Dacite,Csd,#b8c4f0 +Duffers Creek Dacite/1,Csd/1,#8591bd +Duffers Creek Dacite/2,Csd/2,#9eaad7 +Duffers Creek Dacite/2?,Csd/2?,#9eaad7 +Duffers Creek Dacite/a,Csd/a,#6b78a3 +Duffs Range Granite,EOgd,#ffa1b3 +Duffs Range Granite/l,EOgd/l,#ff2133 +Dugald River Shale Member,PLpod,#d6cc9e +Dugald River Shale Member/l,PLpod/l,#b3a87a +Dumbano Granite/1,Sgd/1,#ffb3e6 +Dumbano Granite/1?,Sgd/1?,#ffb3e6 +Dumbano Granite/2,Sgd/2,#ff8cbf +Dumbano Granite/2?,Sgd/2?,#ff8cbf +Dunk Island Granite,Cgd,#ff73df +Dyke or Vein Containing Iron,fe,#e69900 +Dyke or Vein Containing Quartz,q,#e6e600 +Dynamite Creek Member,PLhd,#a68c87 +Dynan Dacite/d,Pvyd/d,#7a8ef5 +Dynan Dacite/d?,Pvyd/d?,#7a8ef5 +Dynan Dacite/di,Pvyd/di,#6173db +Dynan Dacite/r,Pvyd/r,#94a8ff +Dynan Dacite/r?,Pvyd/r?,#94a8ff +Dyraaba Member,DCue/d,#66408c +EOg-7957,EOg,#ff3847 +EOg/b-8157,EOg/b,#3340ff +Eastdale Granite,Cge,#b52859 +Easter Egg Granite,PLgse,#f55994 +Eastern Creek Volcanics,PLhe,#4f3228 +Eastern Creek Volcanics/cg,PLhe/cg,#b5998f +Eastern Creek Volcanics/eq,PLhe/eq,#cfb3a8 +Eastern Creek Volcanics/p,PLhe/p,#e6c9bf +Eastern Creek Volcanics/q,PLhe/q,#82665c +Eastern Creek Volcanics/q?,PLhe/q?,#82665c +Eastern Creek Volcanics/s,PLhe/s,#b89e94 +Eastern Creek Volcanics/s?,PLhe/s?,#b89e94 +Eastern Creek Volcanics?,PLhe?,#4f3228 +Ebagoola Granite,Dge,#ff4f36 +Ebagoola Granite?,Dge?,#ff4f36 +Eden Vale Rhyolite,Cvev,#6b806b +Eden Vale Rhyolite?,Cvev?,#6b806b +Edmonds Creek Rhyolite,Cbe,#686868 +Edward River Metamorphic Group,PLce,#c25219 +Edward River Metamorphic Group/1,PLce/1,#c26b33 +Edward River Metamorphic Group/1a,PLce/1a,#73450d +Edward River Metamorphic Group/2,PLce/2,#e6b880 +Edward River Metamorphic Group/3,PLce/3,#ffd9a6 +Edward River Metamorphic Group/3a,PLce/3a,#9e7038 +Eight Mile Creek beds/a,Ple/a,#6677cd +Eight Mile Creek beds/e,Ple/e,#8091e6 +Eight Mile Creek beds/s,Ple/s,#99abe6 +Eight Mile Creek beds/v,Ple/v,#b3c4ff +Einasleigh Metamorphics/1,PLe/1,#80705e +Einasleigh Metamorphics/1a,PLe/1a,#b3a391 +Einasleigh Metamorphics/1b,PLe/1b,#998a78 +Einasleigh Metamorphics/1c,PLe/1c,#ccbdab +Einasleigh Metamorphics/1d,PLe/1d,#e6d6c4 +Einasleigh Metamorphics/1e,PLe/1e,#665745 +Einasleigh Metamorphics/1e?,PLe/1e?,#665745 +Einasleigh Metamorphics/1f,PLe/1f,#f2e3d0 +Einasleigh Metamorphics/3,PLe/3,#99705e +Einasleigh Metamorphics/3a,PLe/3a,#b38a78 +Einasleigh Metamorphics/3b,PLe/3b,#99705e +Einasleigh Metamorphics/3c,PLe/3c,#cca391 +Einasleigh Metamorphics/3e,PLe/3e,#805745 +Einasleigh Metamorphics/3g,PLe/3g,#e0bda3 +Einasleigh Metamorphics/3h,PLe/3h,#8c6352 +Einasleigh Metamorphics/3i,PLe/3i,#663d2b +Einasleigh Metamorphics/3j,PLe/3j,#f5dbbd +Einasleigh Metamorphics/4,PLe/4,#a6594c +Einasleigh Metamorphics/a,PLe/a,#803d2b +Einasleigh Metamorphics/as,PLe/as,#995745 +Einasleigh Metamorphics/m,PLe/m,#cc8a78 +Einasleigh Metamorphics/q,PLe/q,#732619 +Einasleigh Metamorphics/wm,PLe/wm,#b3705e +Eland Metavolcanics,EOa,#bd52a1 +Eland Metavolcanics/c,EOa/c,#f085d4 +Eland Metavolcanics?,EOa?,#bd52a1 +Elbow Creek Granodiorite,Ogel,#ff6936 +Elbow Creek Granodiorite?,Ogel?,#ff6936 +Election Granite/1,Cgoe/1,#ffa77f +Election Granite/2,Cgoe/2,#ff5500 +Election Granite/3,Cgoe/3,#d94c00 +Eleven-B Granite,Sgeb,#e332dd +Eleven-B Granite?,Sgeb?,#e332dd +Elimeek Volcanics,Pe,#a5aec9 +Elizabeth Creek Granite,Cgze,#ffbff2 +Elizabeth Creek Granite-alteration,Cgze/a,#ffa6d9 +Elizabeth Creek Granite/p,Cgze/p,#ffbfcc +Elizabeth Creek Granite/p-alteration,Cgze/p/a,#ffa6b3 +Elizabeth Sandstone,PLse,#d4e366 +Elizabeth Sandstone?,PLse?,#d4e366 +Ellenvale beds,CPe,#9799a1 +Ellenvale beds?,CPe?,#9799a1 +Elphinstone Granite,CPgep,#ff7f7f +Emerald Creek Microgranite,Cgem,#e83177 +Emu Creek Formation - Eastern Unit,CPex/c,#cccccc +Emu Creek Formation - Western Unit,CPex/f,#b2b2b2 +Emu Creek Formation?,CPex?,#e1e1e1 +Emu Mill Granodiorite,SDgem,#ffb3cd +Emuford Granite,Cgte,#e66666 +Emysland Granodiorite,CPge,#d79e9e +Englishman Tonalite,Ogem,#ffcfd9 +Engow Member,CPsm/e,#85a1bd +Eresby Volcanics,Pve,#6677cd +Eresby Volcanics/a,Pve/a,#8091e6 +Eresby Volcanics/a?,Pve/a,#8091e6 +Eresby Volcanics/b,Pve/b,#4c5eb3 +Eresby Volcanics/c,Pve/c,#334599 +Eresby Volcanics/r,Pve/r,#99abff +Eresby Volcanics/r?,Pve/r?,#99abff +Eresby Volcanics?,Pve?,#6677cd +Eridge Volcanic Member/e1,Ct/e1,#b7bbc9 +Eridge Volcanic Member/e2,Ct/e2,#9ea1b0 +Eridge Volcanic Member/e3,Ct/e3,#858796 +Eridge Volcanic Member/e4,Ct/e4,#6b6e7d +Esmeralda Granite,PLgee,#bf334c +"Esmeralda Granite,TQr-QLD,Tf-Gt","PLgee,TQr,Tf",#bf334c +Esmeralda Granite?,PLgee?,#bf334c +Esmeralda Supersuite,PLge,#bf3449 +Esmeralda Supersuite?,PLge?,#bf3449 +Esperanza Formation,PLmz,#bfa673 +Esperanza Formation?,PLmz?,#bfa673 +Eureka Rhyolite,Cbu,#5e7d8f +Eureka Rhyolite?,Cbu?,#5e7d8f +Eurombah Formation,Jie,#4ce600 +Eurombah Formation?,Jie?,#4ce600 +Eurydesma beds,Ply,#3dbbd4 +Eurydesma beds/l,Ply/l,#57d4ed +Eva Creek Microgranite,Cgnv,#ffbebe +Eva Creek Microgranite?,Cgnv?,#ffbebe +Everetts Creek Volcanics,Oe,#e346c9 +Everetts Creek Volcanics?,Oe?,#e346c9 +Evergreen Formation,Je,#40856b +Evergreen Formation/1,Je/1,#85c7ad +Evergreen Formation/2,Je/2,#5ea68c +Evergreen Formation/o,Je/o,#5ea659 +Ewan Formation/c,Ce/c,#bfbfbf +Ewan Formation/t,Ce/t,#999999 +Ewan Formation/v,Ce/v,#e1e1e1 +Ewen Granite,PLge,#e356da +Ewen Granite/1,PLge/1,#ff80ff +Ewen Granite/1?,PLge/1?,#ff80ff +Ewen Granite?,PLge?,#e356da +Excelsior Granite,Cgtx,#d92121 +Exley Microgranite,Ogex,#cc334c +Expedition Creek Granodiorite,CPgex,#f56147 +Fairleigh Granite,Pgfa,#d673bd +Falls Creek Tonalite,Ogfc,#cc199e +Falls Creek Tonalite?,Ogfc?,#cc199e +Fanning River Group,Df,#c2b5e3 +Fanning River Group/s,Df/s,#dbcffc +Fanning River Group?,Df?,#c2b5e3 +Fat Hen Creek Complex,EOgf,#f0368c +Fat Hen Creek Complex/m,EOgf/m,#ff66bf +Fat Hen Creek Complex?,EOgf?,#f0368c +Fe-MI,Fe,#e68c00 +Featherbed Volcanic Group-CPr,CPr,#ff0000 +Featherbed Volcanic Group-Pla,Pla,#444f89 +Featherbed Volcanic Group-Plb,Plb,#b8deff +Featherbed Volcanic Group-Plc,Plc,#9ec4f0 +Featherbed Volcanic Group-Pld,Pld,#5278a3 +Featherbed Volcanic Group-Ple,Ple,#6b91bd +Featherbed Volcanic Group-Plf,Plf,#85abd6 +Featherbed Volcanic Group-Plg,Plg,#6699cd +Featherbed Volcanic Group-Plh,Plh,#5e69a3 +Featherbed Volcanic Group-Pli,Pli,#a6d1ff +Featherbed Volcanic Group-Plj,Plj,#9eaad7 +Featherbed Volcanic Group-Plm,Plm,#919cd6 +Featherbed Volcanic Group-Pln,Pln,#7882bd +Featherbed Volcanic Group-Plo,Plo,#6677cd +Featherbed Volcanic Group-Plq,Plq,#7ab6f5 +Featherbed Volcanic Group-Plr,Plr,#002673 +Featherbed Volcanic Group-Plt,Plt,#0070ff +Featherbed Volcanic Group-Plv,Plv,#005ce6 +Featherbed Volcanic Group-Plw,Plw,#004da8 +Featherbed Volcanic Group-Plx,Plx,#002673 +Fence Creek Granodiorite,Pgfc,#ff66a6 +Fenian Granite,Ogf,#e680b3 +Fenian Granite/a,Ogf/a,#f096c9 +Fernhill Granite,Dgfh,#ffbee8 +Fiery Creek Volcanics,PLfc,#7a664a +Fiery Creek Volcanics/a,PLfc/a,#c7b396 +Fiery Creek Volcanics/r,PLfc/r,#ad997d +Fiery Creek Volcanics/s,PLfc/s,#614c30 +Fiery Creek Volcanics/v,PLfc/v,#e6d9bd +Fiery Creek Volcanics?,PLfc?,#7a664a +Fig Tree Hill Granite Complex,PLgft/1,#d14c80 +Fig Tree Hill Granite Complex-alteration,PLgft/a,#f773a6 +Fig Tree Hill Granite Complex/2,PLgft/2,#ff3370 +Fig Tree Hill Granite Complex/3,PLgft/3,#ff8cb3 +Fig Tree Hill Granite Complex/4,PLgft/4,#eb6699 +Fig Tree Hill Granite Complex?,PLgft?,#d14c80 +Finlayson Granite,Pgcf,#f57ab6 +Finlayson Granite/mg,Pgcf/mg,#f594cf +First Bull Run Granite,Cgfc,#d14747 +First Bull Run Granite/a,Cgfc/a,#f77a7a +First Bull Run Granite/f,Cgfc/f,#eb6161 +First Pocket Igneous Complex/1,Pgfp/1,#ff7863 +First Pocket Igneous Complex/2,Pgfp/2,#ff5e4a +Fish Creek Granite,Dgfc,#f29999 +Fish River Formation,PLff,#f2f0b8 +Fisherman Rhyolite,Pff,#99abe6 +Fisherman Rhyolite/i,Pff/i,#6678cc +Fisherman Rhyolite/l,Pff/l,#4052a6 +Fisherman Rhyolite/v,Pff/v,#26388c +Fitz Creek beds,Pf,#9ebbd7 +Fitz Creek beds/d,Pf/d,#b8d4f0 +Fitz Creek beds/r,Pf/r,#85a1bd +Five Mile Mill Granodiorite,SDgfm,#ff9973 +Flagstone Granite,CPgf,#cc4c66 +Flat Rock Granite,Cgof,#ebade8 +Flora Creek Trondhjemite,SDgf,#ff9980 +Florence Creek Granite,PLgfc,#ff4dff +Flynns Creek Granite,Cgzl,#e600a9 +Flyspeck Granodiorite,Dgf,#f038cc +Forest Home Trondhjemite,PLgj,#cc59a6 +Forest Home Trondhjemite?,PLgr?,#cc59a6 +Fork Yard Granite,Pgzfy,#d14c66 +Forsayth Granite,PLgf,#ffccff +Forsayth Granite/1,PLgf/1,#ffa6ff +Forsayth Granite/1?,PLgf/1?,#ffa6ff +Forsayth Granite/2,PLgf/2,#ff80ff +Forsayth Granite/2?,PLgf/2?,#ff80ff +Forsayth Granite/a,PLgf/a,#ff4cff +Forsayth Granite/bx,PLgf/bx,#ffd9ff +Forsayth Granite?,PLgf?,#ffccff +Four Mile Creek Granodiorite,Ogfm,#ffccff +Foxes Creek Diorite,PLgfc,#ab94ff +Foxes Creek Diorite/g,PLgfc/g,#e05c96 +Frenchy Creek Granite,Cgof,#e600a9 +Frog Hollow Granite,Cgofh,#cc4c99 +Fulford Creek Granite,Cgzf,#e8beff +Furry Hoop Member,Ccl/f,#9094a3 +Galloway Volcanic Group,Pvy,#adc2c2 +Galloway Volcanic Group?,Pvy?,#adc2c2 +Garden Creek Porphyry,PLgsp,#f05d93 +Garden Creek Porphyry?,PLgsp?,#f05d93 +Gatton Sandstone,Jbmg,#5ea38a +Gatton Sandstone?,Jbmg?,#5ea38a +Gavin Rhyolite/1,Pwe/1,#2b66a3 +Gavin Rhyolite/2,Pwe/2,#5e99d6 +Gavin Rhyolite/2v,Pwe/2v,#c4e6ff +Gavin Rhyolite/3,Pwe/3,#4580bd +Gavin Rhyolite/3v,Pwe/3v,#78b3ff +Geebung Granite,Cgtg,#ffa77f +Gelaro Granite,Cgog,#f58fb5 +Gelaro Granite/1,Cgog/1,#f5668c +Gibbs Granite,Cgog,#d69dbc +Giblets Granite,Cgtg,#bf6666 +Gidya Granite,PLgsy,#a80066 +Gilberton Formation,DCt,#8400a8 +Gilberton Formation?,DCt?,#8400a8 +Gilded Rose Breccia,PLbr,#b35733 +Gilgurry Mudstone,Pul,#7a8ef5 +Gin Creek Granite,PLgg,#e65e5e +Gin Creek Granite/m,PLgg/m,#f28c91 +Gin Creek Granite/p,PLgg/p,#ffc4b8 +Gingerella Volcanics,Cvi,#787a69 +Gingerella Volcanics/1,Cvi/1,#b3b5a3 +Gingerella Volcanics/1?,Cvi/1?,#b3b5a3 +Gingerella Volcanics/2,Cvi/2,#919482 +Glen Dillon Granodiorite,SDggd,#f259c4 +Glen Garland Granodiorite,Dgg,#fc3370 +Glen Gordon Volcanics,CPl,#929bb3 +Glen Gordon Volcanics/br,CPl/br,#abb5cc +Glen Gordon Volcanics/cg,CPl/cg,#788299 +Glen Gordon Volcanics?,CPl?,#929bb3 +Glen Granite,Cgtl,#ff73df +Gleneagle Granite,CPgoge,#ff66d1 +Glenell Granodiorite,Oggl,#d685a3 +Glenell Granodiorite/t,Oggl/t,#ff99b8 +Glenlinedale Granite,Cgti,#ff5500 +Glenrock Group,Cn,#a2a7bd +Glenroy Mill Granodiorite,Ogg,#ff7f7f +Go Sam Granite,Cgcg,#cc008f +Goat Creek Andesite,PLag,#ff8533 +Goat Creek Andesite?,PLag?,#ff8533 +Goddard Creek Granodiorite,CPggo,#f03589 +Golden Creek Meta-andesite,EOba,#a80084 +Goldsborough Granodiorite,SDghg,#e666b3 +Goldsmiths Granite,PLgg,#e600a9 +Goldsmiths Granite?,PLgg?,#e600a9 +Gongora Granodiorite,Pgg,#f58ac2 +Goold Island Granite,Cggi,#c4475a +Goolha-Goolha Schist,PLcg,#f7d4ab +Gorge Quartzite,PLg,#d9e880 +Gorge Quartzite/l,PLg/l,#bdd619 +Gorge Quartzite/p,PLg/p,#e8f2b3 +Gorge Quartzite/u,PLg/u,#ccde4d +Gorge Range Microgranite,CPggr,#de547b +Gowrie Creek Granodiorite,CPggw,#ba3451 +Gowrie Creek Granodiorite?,CPggw?,#ba3451 +Grass Hut Granite,Oggr,#ff66db +Grasstree Leucogranite,SDgg,#ae25b3 +Grasstree Leucogranite?,SDgg?,#ae25b3 +Graveyard Creek Group,SDr,#be56cc +Gray Creek Complex,PLEy,#5257d1 +Gray Creek Complex/a,PLEy/a,#7078de +Gray Creek Complex/c,PLEy/c,#a8adeb +Gray Creek Complex/s,PLEy/s,#009e1c +Greens Creek Quartz Monzonite,PLggc,#ff9ed9 +Greenvale Formation,Sn,#994782 +Greenvale Formation/j,Sn/j,#e694cf +Greenvale Formation/v,Sn/v,#bf6ea8 +Greenvale Formation/v?,Sn/v?,#bf6ea8 +Greenvale Formation?,Sn?,#994883 +Greymare Granodiorite,Pggm,#de52ab +Gromac Monzogranite,Oggm,#ff66ff +Gubberamunda Sandstone,JKig,#08a86e +Guela Sandstone,PLzig,#b3914c +Gumhole Monzogranite,Dggh,#f280a6 +Gun Supersequence,PLm,#c28a0d +Gunnawarra Bump Granite,CPggb,#d933a8 +Gunpowder Creek Formation,PLmw,#99730d +Gunpowder Creek Formation/1,PLmw/1,#805900 +Gunpowder Creek Formation/2,PLmw/2,#664000 +Gunpowder Creek Formation/3,PLmw/3,#4c2600 +Gunpowder Creek Formation/3f,PLmw/3f,#b3914c +Gunpowder Creek Formation/4,PLmw/4,#a38c19 +Gunpowder Creek Formation/a,PLmw/a,#debaa6 +Gunpowder Creek Formation/b,PLmw/b,#b35e2e +Gunpowder Creek Formation/c,PLmw/c,#bd754d +Gunpowder Creek Formation/c?,PLmw/c?,#bd754d +Gunpowder Creek Formation/q,PLmw/q,#ccab66 +Gunpowder Creek Formation/v,PLmw/v,#ebcfc4 +Guns Knob Granite,PLgsg,#f57ab6 +Gurrumba Ring Complex,Cggu,#d7b09e +Gurrumba Ring Complex/d,Cggu/d,#f25999 +Gurrumba Ring Complex/o,Cggu/o,#1926c9 +Gurrumba Volcanics,Cvg,#bfd1d1 +Gypsy Pocket Granodiorite,CPggp,#d95562 +Hales Siding Granite,Cgs,#ff7f7f +Hales Siding Granite?,Cgs?,#ff7f7f +Halls Reward Metamorphics,PLEh,#fcb572 +Halls Reward Metamorphics?,PLEh?,#fcb572 +Halpin Granite,Cgoh,#ffbee8 +Halpin Granite/m,Cgoh/m,#ff99c2 +Halpin Granite?,Cgoh?,#ffbee8 +Hamilton River Granite,PLght,#ffa77f +Hammock Creek Rhyolite/1,Csh/1,#99bfd9 +Hammock Creek Rhyolite/1a,Csh/1a,#bfe6fa +Hammock Creek Rhyolite/2,Csh/2,#80a6bf +Hammonds Creek Granodiorite,Cgam,#e64c00 +Hampden Slate,PLrh,#664c4c +Hampden Slate?,PLrh?,#664c4c +Hampton Road Rhyolite,Pcch,#80ccff +Hampton Road Rhyolite/g,Psh/g,#ffa77f +Hampton Road Rhyolite/sa,Psh/sa,#66b3e6 +Hann Creek Basalt Flow,Qbnh,#faf2c8 +Hann Creek Basalt Flow?,Qbnh?,#faf2c8 +Hardway Granite,PLgwh,#b52aa5 +Hardwick Formation,DCkh,#7c5de3 +Hardwick Formation?,DCkh?,#7c5de3 +Harpers Tonalite,Cgah,#ff3847 +Harry Creek Formation,Cuh,#bdbfc7 +Harry Creek Formation?,Cuh?,#bdbfc7 +Haslingden Group,PLh,#e6a680 +Hay Mill Granite,PLgsh,#d42661 +Hayes Granite,Cgty,#e600a9 +He-MI,He,#b2b2b2 +Heathfield West Tonalite,SDgh,#eb1987 +Heathfield West Tonalite/g,SDgh/g,#ffccdb +Hedleys Sandstone,PLsh,#ccffde +Heliman Formation,PLh,#8a5945 +Heliman Formation/1,PLh/1,#b0806b +Heliman Formation/x,PLh/x,#70402b +Heliman Formation?,PLh?,#8a5945 +Hells Gate Rhyolite,Csh,#b0b8c7 +Hells Gate Rhyolite/r,Csh/r,#d6deed +Heneage Granite,Dgh,#ffa6c4 +Heneage Granite?,Dgh?,#ffa6c4 +Herbert River Granite,CPgh,#e64f63 +Herberton Hill Granite,Pgzh,#cd6666 +Hero Formation/1,PLih/1,#ffbd99 +Hero Formation/2,PLih/2,#e6a380 +Hero Formation/3,PLih/3,#995733 +Hero Formation/4,PLih/4,#b3704c +Hero Formation/5,PLih/5,#803d19 +Hero Formation/6,PLih/6,#cd8966 +Hero Formation/7,PLih/7,#662400 +Herries Granite,Pgh,#ff639a +Highway Metavolcanics,EObh,#850075 +Hiker Granodiorite,Cgai,#cd6666 +Hinchinbrook Granite - hypersolvus subunit,Pghi/h,#e63640 +Hinchinbrook Granite - subsolvus subunit,Pghi/s,#f25963 +Hodgkinson Formation,Dh,#8c5ee3 +Hodgkinson Formation/a,Dh/a,#7345c9 +"Hodgkinson Formation/a,Hodgkinson Formation/cg","Dh/a,Dh/cg",#7345c9 +Hodgkinson Formation/a?,Dh/a?,#7345c9 +Hodgkinson Formation/am,Dh/am,#a678fc +Hodgkinson Formation/am?,Dh/am?,#a678fc +Hodgkinson Formation/b,Dh/b,#a68ccc +Hodgkinson Formation/b?,Dh/b?,#a68ccc +Hodgkinson Formation/br,Dh/br,#d9b3ff +Hodgkinson Formation/c,Dh/c,#bfa6e6 +Hodgkinson Formation/c?,Dh/c?,#bfa6e6 +Hodgkinson Formation/cb,Dh/cb,#bfbfe6 +Hodgkinson Formation/cg,Dh/cg,#735999 +Hodgkinson Formation/h,Dh/h,#d9bfff +Hodgkinson Formation/h?,Dh/h?,#d9bfff +Hodgkinson Formation/hv,Dh/hv,#d9b3e6 +Hodgkinson Formation/l,Dh/l,#ebe0ff +Hodgkinson Formation/m,Dh/m,#8c73b3 +Hodgkinson Formation/m?,Dh/m?,#8c73b3 +Hodgkinson Formation/mc,Dh/mc,#592bb0 +Hodgkinson Formation/ms,Dh/ms,#735999 +Hodgkinson Formation/q,Dh/q,#594080 +Hodgkinson Formation/q?,Dh/q?,#594080 +Hodgkinson Formation/r1,Dh/r1,#8c80ff +Hodgkinson Formation/r2,Dh/r2,#bfccff +Hodgkinson Formation/r3,Dh/r3,#b3b3ff +Hodgkinson Formation/r4,Dh/r4,#d9d9ff +Hodgkinson Formation/r5,Dh/r5,#2633ff +Hodgkinson Formation/r6,Dh/r6,#7380ff +Hodgkinson Formation/r7,Dh/r7,#99a6ff +Hodgkinson Formation/r8,Dh/r8,#4d59ff +Hodgkinson Formation/r9,Dh/r9,#cc99ff +Hodgkinson Formation/ra,Dh/ra,#804dff +Hodgkinson Formation/rp,Dh/rp,#402666 +Hodgkinson Formation/s,Dh/s,#bfa6e6 +Hodgkinson Formation/v,Dh/v,#401296 +Hodgkinson Formation?,Dh?,#8c5ee3 +Hodgon Granodiorite,SDghh,#ff73df +Hodgon Granodiorite?,SDghh?,#ff73df +Hogg Granodiorite,Dgho,#d9009c +Hogsflesh Creek Granodiorite,Ogh,#bf4073 +Holborn Granodiorite,Oghb,#ffc4f7 +Holborn Granodiorite?,Oghb?,#ffc4f7 +Hopscotch Rhyolite,Cbh,#7f7f7f +Hopscotch Rhyolite/1,Cbh/1,#666666 +Hopscotch Rhyolite/2,Cbh/2,#999999 +Hopscotch Rhyolite/3,Cbh/3,#b2b2b2 +Hopscotch Rhyolite?,Cbh?,#7f7f7f +Horse Pocket Volcanics,Ck,#a1aec7 +Houdini Granite,PLghd,#ff3657 +Huonfels Rhyolite Member,Cdh,#b5b5b5 +Huonfels Rhyolite Member/x,Cdh/x,#8c8c8c +Hutton Sandstone,Jh,#0ec991 +Hutton Sandstone - lower,Jh/l,#80f0ab +Hutton Sandstone?,Jh?,#0ec991 +Idalia Rhyolite,PLri,#cc8000 +Idalia Rhyolite/a,PLri/a,#e69900 +Idalia Rhyolite?,PLri?,#cc8000 +Illewanna Granite,PLgei,#db4033 +Imooya Granite,Dgiy,#ffb8c4 +Indicator Granite,Cgol,#ffb8af +Ingham Granite Complex,CPgi,#ff424d +Ingham Granite Complex - mafic subunit,CPgi/m,#e67ac7 +Ingham Granite Complex - microgranite subunit,CPgi/g,#ffa6ad +Ingleby Granite,Dgig,#ff9980 +Insolvency Gully Formation,CPi,#9a9a9c +Ironhurst Formation/1,Cmi/1,#d6dbdb +Ironhurst Formation/2a,Cmi/2a,#8a9c9c +Ironhurst Formation/2b,Cmi/2b,#758a8a +Ironhurst Formation/3,Cmi/3,#637a7a +Ironhurst Formation/r,Cmi/r,#4f6969 +Ixe Microgranodiorite,Cgoz,#e699bf +Jack Formation,SDj,#cc6bd9 +Jack Formation/c,SDj/c,#a645b3 +Jack Formation/l,SDj/l,#e685f2 +Jack Formation?,SDj?,#cc6bd9 +Jacks Granite,Cgoj/1,#bd85a3 +Jacks Granite/a,Cgoj/a,#d69ebd +Jacks Granite/ap,Cgoj/ap,#f0b8d6 +Jacks Granite/p,Cgoj/p,#a3528a +Jacks Granite/pg,Cgoj/pg,#f0d1f0 +Jacobsens Track Granodiorite,Pgj,#ff4dff +James Creek Granite,Cgoja,#ff8cf2 +James Creek Granite/2,Cgoja/2,#ff33f2 +James Creek Granite/ap,Cgoja/ap,#ffb3f2 +James Creek Granite/g,Cgoja/g,#ff33f2 +James Creek Granite/m,Cgoja/m,#ff66f2 +James Creek Granite?,Cgoja?,#ff8cf2 +Jamieson Member,Duu/j,#a699e6 +Jamtin Rhyolite/d,Cj/d,#7d8085 +Jamtin Rhyolite/d3,Cj/d3,#63666b +Jamtin Rhyolite/r1,Cj/r1,#e3e6eb +Jamtin Rhyolite/r2,Cj/r2,#b0b3b8 +Jamtin Rhyolite/r3,Cj/r3,#96999e +Jamtin Rhyolite/r3a,Cj/r3a,#bdbfd1 +Jamtin Rhyolite/r4,Cj/r4,#c9ccd1 +Jape Creek Granodiorite,Sgj,#f58787 +Jape Creek Granodiorite?,Sgj?,#f58787 +Jayah Creek Metabasalt,PLjv,#c98f73 +Jayah Creek Metabasalt/q,PLjv/q,#b07559 +Jayah Creek Metabasalt?,PLjv?,#c98f73 +Jedda Schist/1,Pyj/1,#80d1f5 +Jedda Schist/2,Pyj/2,#b3e3fa +Jessey Springs Limestone,Dwj,#c98cf5 +Jessop Creek Tonalite/a,Sgj/a,#ff2952 +Jessop Creek Tonalite/b,Sgj/b,#9980ff +Jessop Creek Tonalite/d,Sgj/d,#bdabff +Jessop Creek Tonalite/t,Sgj/t,#ff879e +Jinker Creek Rhyolite/a,Cnj/a,#b3bfbf +Jinker Creek Rhyolite/b,Cnj/b,#667373 +Judea Formation,Oj,#ad4491 +Judea Formation?,Oj?,#ad4491 +Jug Microgranite,Pgl,#e63333 +Julago Volcanics,Pj,#2e8bb3 +Julago Volcanics?,Pj?,#2e8bb3 +Julia Formation,Ddj,#8574a1 +Julia Formation/q,Ddj/q,#ab99c7 +Julia Formation?,Ddj?,#8574a1 +Jumna Granite,Cgzj,#d69dbc +Jumna Granite/k,Cgzj/k,#bd6ba3 +Junction Microgranite,Cgcj,#e6b3e6 +Junevale Granite,Cgoj,#cc3d85 +Juntala Metamorphics/1,PLj/1,#8a4545 +Juntala Metamorphics/2,PLj/2,#b06b6b +Juntala Metamorphics/a,PLj/a,#fcb8b8 +Juntala Metamorphics/c,PLj/c,#d69191 +Kahko Granodiorite,PLgso,#d92b65 +Kalkadoon Granodiorite,PLgk,#f032a7 +Kalkadoon Granodiorite,w,#f032a7 +"Kalkadoon Granodiorite, Kurbayia Metamorphic Complex","PLgk, PLlo",#f032a7 +Kalkadoon Granodiorite/1,PLgk/1,#ffb3e3 +Kalkadoon Granodiorite/1b,PLgk/1b,#ff8cd3 +Kalkadoon Granodiorite/2,PLgk/2,#ff66c7 +Kalkadoon Granodiorite/a,PLgk/a,#ff59c2 +Kalkadoon Granodiorite/d,PLgk/d,#ff99da +Kalkadoon Granodiorite/h,PLgk/h,#d6198c +Kalkadoon Granodiorite/h?,PLgk/h?,#d6198c +Kalkadoon Granodiorite/m,PLgk/m,#cc006e +Kalkadoon Granodiorite/m?,PLgk/m?,#cc006e +Kalkadoon Granodiorite; Kurbayia Metamorphic Complex; Leichhardt Volcanics,PLel/x,#f032a7 +Kalkadoon Granodiorite?,PLgk?,#f032a7 +Kallala Quartzite - gneissic,PLq/g,#82694f +Kallala Quartzite?,PLq?,#a68c73 +Kallanda Granite,Cgk,#ff879e +Kallanda Granite?,Cgk?,#ff879e +Kallon Volcanics,Cvk,#999999 +Kalunga Granodiorite,Cgau,#f566a6 +Kamarga Volcanics,PLvk,#784a36 +Kamarga Volcanics/s,PLvk/s,#9e705c +Kangaroo Hills Formation-hornfelsed,SDk/i,#8c1999 +Kangaroo Hills Formation/1,SDk/1,#bf4ccc +Kangaroo Hills Formation/2,SDk/2,#a633b3 +Kangaroo Hills Formation/f,SDk/f,#f2b3ff +Kangaroo Hills Formation/q,SDk/q,#d966e6 +Kangaroo Hills Formation/v,SDk/v,#f280ff +Kangaroo Hills Formation?,SDk?,#a95abf +Kangaroo Rat Granite,Cgzk,#ff73df +Kangerong Basalt,Qbnk,#faec70 +Kauri Granite,Pgzk,#ff9999 +Kauri Granite/m,Pgzk/m,#e09999 +Kays Peak Granite,PLgik,#eb465a +Keating Granodiorite,Pgyk,#d6859e +Kedumba Granodiorite,SDgke,#f591a3 +Keelbottom Group,DCk,#c4b3e3 +Keelbottom Group?,DCk?,#c4b3e3 +Keithys Granite,PLgst,#e64c4c +Kelly Saint George Granite,Pgwg,#e64ca6 +Kelly Saint George Granite/x,Pgwg/x,#f280d9 +Kelly Saint George Granite?,Pgwg?,#e64ca6 +Kendle River Granite,Dgn,#ff001c +Kennedy Siltstone,PLik,#cdaa66 +Kermas Granodiorite,CPgtk,#ff7a85 +Kg-8259,Kg,#cf3237 +Kimba Gneiss,PLwb,#cccc33 +King Junction Granite,Dgkj,#e694bf +Kingull Member,Kybk,#81c454 +Kingvale Granite,Dgkv,#e64d99 +Kinrara Basalt,Qmk,#ffa187 +Kinrara Basalt/v,Qmk/v,#ff4236 +Kintore Granite,Dgk,#ff8f99 +"Kintore Granite, Ebagoola Granite","Dgk,Dge",#ff8f99 +Kirk River beds,EOk,#b37d87 +Kirklea Granite,Ogki,#d9338c +Kirklea Granite?,Ogki?,#d9338c +Kirkton Tonalite,SDgki,#ffbfcc +Kirkton Tonalite/d,SDgki/d,#ab94ff +Kirkwood Monzogranite,Dgo,#ff66ff +Kitchen Creek Rhyolite,Cnk,#e0dbd1 +Kitchen Creek Rhyolite/k,Cnk/k,#c2b8a3 +Kitchener Granite,Cgok,#d69dbc +Kitja Gneiss,PLnk,#d4d6bd +Kitoba Member/a1,Dhk/a1,#d496e6 +Kitoba Member/a2,Dhk/a2,#ad70bf +Kitoba Member/b,Dhk/b,#6e3080 +Kitoba Member/c1,Dhk/c1,#a163b3 +Kitoba Member/c2,Dhk/c2,#f2d9e6 +Kitoba Member/cg,Dhk/cg,#874a99 +Kitoba Member/l,Dhk/l,#6b008f +Kitoba Member/q,Dhk/q,#cd59ff +Kitty O'Shea Suite,CPik,#3842d1 +Kitty Plain Microgranite,PLgsk,#ffbee8 +Knapdale Quartzite,PLpk,#523022 +Knapdale Quartzite/c,PLpk/c,#d1b0a1 +Knapdale Quartzite/q,PLpk/q,#b89687 +Knapdale Quartzite/t,PLpk/t,#856354 +Knob Camp Granodiorite,Pgrk,#ff19c4 +Knob Camp Granodiorite/d,Pgrk/d,#ff40eb +Knuth Gabbro,CPgkn,#9980ff +Kokojelandji Schist,PLye,#d9b38c +Kokomini Granite,Dgkk,#ff6370 +Kondaparinga Formation,Rk,#32c2ac +Kondaparinga Formation?,Rk?,#32c2ac +Koobaba Granite,Pgwk,#c20085 +Koogangoona Granite,Cgoka,#e8966e +Koorboora Granite,Cgoko,#e63333 +Kopo Granite,Dgko,#ff3366 +Koreelah Conglomerate Member,Jbmgk,#73b3b3 +Koreelah Conglomerate Member?,Jbmgk?,#73b3b3 +Koreelan Creek Granodiorite,Rgaod,#db619c +Koukandowie Formation,Jbmk,#0d8066 +Kukiandra Formation,Ddk,#58419e +Kukiandra Formation?,Ddk?,#58419e +Kumbarilla beds,JKk,#08c791 +Kurbayia Metamorphic Complex,PLlk,#4c4719 +Kurbayia Metamorphic Complex/d,PLlk/d,#d9d4b3 +Kurbayia Metamorphic Complex/gr,PLlk/gr,#b3ad80 +Kurbayia Metamorphic Complex/gr?,PLlk/gr?,#b3ad80 +Kurbayia Metamorphic Complex/grt,PLlk/grt,#999466 +Kurbayia Metamorphic Complex/grt?,PLlk/grt?,#999466 +Kurbayia Metamorphic Complex/m,PLlk/m,#4c4719 +Kurbayia Metamorphic Complex/s,PLlk/s,#f2edcc +Kurbayia Metamorphic Complex?,PLlk?,#4c4719 +La Villa Igneous Complex/b,Ogv/b,#7857ff +La Villa Igneous Complex/d,Ogv/d,#bdabff +Lady Clayre Formation,PLpy,#634031 +Lady Clayre Formation/d,PLpy/d,#7d594a +Lady Clayre Formation/s,PLpy/s,#967363 +Lady Loretta Formation,PLml,#e6ccb3 +Lady Loretta Formation/1,PLml/1,#b39980 +Lady Loretta Formation/1?,PLml/1?,#b39980 +Lady Loretta Formation/1b,PLml/1b,#998066 +Lady Loretta Formation/2,PLml/2,#80664c +Lady Loretta Formation/g,PLml/g,#664c33 +Lady Loretta Formation/s,PLml/s,#cca680 +Lady Loretta Formation/t,PLml/t,#ccb399 +Lady Loretta Formation?,PLml?,#e6ccb3 +Lags Microgranite,Pgll,#cc5959 +Laia Granite,Dggl,#e60000 +Lakeview Dolerite,PLbk,#52008c +Lakeview Dolerite?,PLbk?,#52008c +Lane Creek Formation,PLn,#9e8766 +Lane Creek Formation/c,PLn/c,#d1ba99 +Lane Creek Formation/c?,PLn/c?,#d1ba99 +Lane Creek Formation/cs,PLn/cs,#f0d9b8 +Lane Creek Formation/s,PLn/s,#b8a180 +Lane Creek Formation/s1,PLn/s1,#99635e +Lane Creek Formation/s1?,PLn/s1?,#99635e +Lane Creek Formation/s?,PLn/s?,#b8a180 +Lane Creek Formation/x,PLn/x,#856e4c +Lang Creek Granite,Pgwl,#d79e9e +Langdon River Mudstone,PLl,#70572b +Langdon River Mudstone?,PLl?,#70572b +Lankelly Granite,Dgl,#ffa6ad +"Lankelly Granite, Kintore Granite","Dgl, Dgk",#ffa6ad +Lappa Rhyolite,Ckl,#78808a +Laragon Volcanics/0,Cvl/0,#e1e1e1 +Laragon Volcanics/0?,Cvl/0?,#e1e1e1 +Laragon Volcanics/1,Cvl/1,#bfbfbf +Laragon Volcanics/2,Cvl/2,#999999 +Laragon Volcanics/2?,Cvl/2?,#999999 +Laroona Formation,Dwl,#938ab8 +Larramore Metabasalt Member,Dhl,#59459c +Larramore Metabasalt Member/c,Dhl/c,#8c5eb5 +Larramore Metabasalt Member?,Dhl?,#59449c +Larry Creek Complex,Pzgl,#ffd1ff +Lass O'Gowrie Granite,Cgzl,#d973bf +Lass O'Gowrie Granite?,Cgzl?,#d973bf +Latan Granite,Ogln,#cc334c +Lava tubes-McBride Volcanic Province,lt,#faf7bb +Lavery Creek Granite,Ogl,#ffb3db +Lavery Creek Granite?,Ogl?,#ffb3db +Lavery Creek Supersuite,Ogl,#eb597e +Lawn Hill Formation,PLmh,#ba4f7d +Lawn Hill Formation/1,PLmh/1,#a38c78 +Lawn Hill Formation/1?,PLmh/1?,#a38c78 +Lawn Hill Formation/2,PLmh/2,#705945 +Lawn Hill Formation/2?,PLmh/2?,#705945 +Lawn Hill Formation/2s,PLmh/2s,#b03369 +Lawn Hill Formation/4,PLmh/4,#d48cab +Lawn Hill Formation/4?,PLmh/4?,#d48cab +Lawn Hill Formation/4d,PLmh/4d,#c76e94 +Lawn Hill Formation/6,PLmh/6,#e8c4d4 +Lawn Hill Formation?,PLmh?,#ba4f7d +Lawn Supersequence,PLmh/3-4,#f7ebbf +Laytons Range Conglomerate,Rbwlc,#beffe8 +Leander Quartzite,PLhq,#8c7359 +Leander Quartzite/1,PLhq/1,#8c7359 +Leander Quartzite/1b,PLhq/1b,#bfa68c +Leander Quartzite/2,PLhq/2,#735940 +Leander Quartzite?,PLhq?,#8c7359 +Leconsfield Granite,Dgd,#ff8873 +Leichhardt Pocket Granite,Pgyl,#db3333 +Leichhardt Volcanics,PLvl,#94856b +"Leichhardt Volcanics,Kalkadoon Granodiorite","PLvl, PLgk",#94856b +Leichhardt Volcanics/b,PLvl/b,#7a6b52 +Leichhardt Volcanics/d,PLvl/d,#b3a685 +Leichhardt Volcanics/o,PLvl/o,#ab94ff +Leichhardt Volcanics/s,PLvl/s,#bfb394 +Leichhardt Volcanics?,PLvl?,#94856b +Lena Quartzite Member,PLhl,#e68a5c +Lena Quartzite Member/s,PLhl/s,#d17547 +Lena Quartzite Member?,PLhl?,#e68a5c +Levian Granite,PLglv,#e60f29 +Leyshon View Granodiorite,CPglv,#ff879e +Lighthouse Granite,PLgl,#c23385 +Lightning Creek Rhyolite,Pde,#a6a3ff +Lightning Creek Rhyolite/bx,Pde/bx,#8c8aff +Lightning Creek Rhyolite/v,Pde/v,#7370ff +Lightning Creek Rhyolite?,Pde?,#a6a3ff +Lilyponds Granite,Dglp,#ff80cc +Lime Creek Metabasalt Member,PLkl,#d7c29e +Lime Creek Metabasalt Member?,PLkl?,#d7c29e +Lime Granite,Cgcl,#cd6699 +Lindalong Granite,Dgi,#ff998a +Lindsay Flat Microgranite,CPg,#a80a12 +Linley Rhyolite,Pvrl,#8cb3ff +Lithgow Granite,PLgsl,#ff8c80 +Little Bird Granite,PLgel,#f23340 +Little Forks Volcanics,Plf,#2f98de +Little Pocket Dacite,Pdl,#7882bd +Little River Coal Measures,Plr,#2b81b3 +Little Toby Granite,PLgto,#f585c2 +Little Watson Granite,CPgow,#f59e9e +Littleton Dacite Member,PLril,#e69166 +Littleton Dacite Member/da,PLril/a,#ffab8c +Llewellyn Creek Formation,PLol,#5e402e +Loafers Granodiorite,Sgl,#a61966 +Lochaber Complex cone sheets,Cgll/r,#ff99d9 +Lochaber Granite/1,Cgll/1,#ff858f +Lochaber Granite/2,Cgll/2,#ffa6b8 +Lochlea Metarhyolite,EObl,#fad9f5 +Lochness Formation,PLhn,#d99e8c +Lochness Formation/1,PLhn/1,#8c5240 +Lochness Formation/1?,PLhn/1?,#8c5240 +Lochness Formation/2,PLhn/2,#bf8573 +Lochness Formation/2?,PLhn/2?,#bf8573 +Lochness Formation/3,PLhn/3,#a66b59 +Lochness Formation/3?,PLhn/3?,#a66b59 +Lochness Formation?,PLhn?,#d99e8c +Lochs Gneiss,PLcl,#f09c3d +Lockup Well Limestone,Dwl,#bfb3d9 +Lollypop Formation,Dkl,#ae8ae3 +Lollypop Formation?,Dkl?,#ae8ae3 +Lolworth Batholith-undivided,SDgl,#ffdbeb +Lomandra Limestone,Dwa,#451c8a +Long Gully Granite,Cgag,#ffbee8 +Long Mountain Breccia Member,Dlr/b,#998ccc +Loretta Supersequence,PLm,#e6ccb3 +Louey Granite,PLgly,#e66699 +Lowman Tank Granite,PLglt,#a8228b +Ls-MI,Ls,#ffbdb3 +Lubrina Granite,Cgnl,#e64040 +Lucy Granite,Cgol,#e60000 +Lugano Metamorphics,EOl,#d97380 +Lugano Metamorphics/a,EOl/a,#ff99a6 +Lugano Metamorphics/m,EOl/m,#bf5966 +Lugano Metamorphics/q,EOl/q,#a6404c +Lukinville Granodiorite,Dglk,#ff85cc +Lulu Pocket Igneous Complex/2,CPglp/2,#ffc99e +Lulu Pocket Igneous Complex/3,CPglp/3,#ffa378 +Lumma Rhyolite,Pdl,#99bfe6 +Lumma Rhyolite/t,Pdl/t,#80a6cc +Lunch Creek Gabbro,PLbl,#545ed9 +Lunch Creek Gabbro?,PLbl?,#545ed9 +Lyall Formation,Ccl,#b5b8c4 +Lyall Formation/v,Ccl/v,#d9dbe8 +Lyall Formation/v?,Ccl/v?,#d9dbe8 +Lyall Formation?,Ccl?,#b5b8c4 +Lyndbrook Complex,PLglb,#ffa1b0 +Lyndbrook Complex-alteration,PLglb/a,#ff3866 +Lynwater Complex/1,Oglw/1,#ff80ff +Lynwater Complex/2,Oglw/2,#ff66d9 +Lynwater Complex/2?,Oglw/2?,#ff66d9 +Lynwater Complex/3,Oglw/3,#ff73a6 +Lynwater Complex/4,Oglw/4,#ff6673 +Lynwater Complex/5,Oglw/5,#ffccff +MacCallor Microgranodiorite,Cgnm,#bf194c +Macartneys Granite,PLgem,#ff69a6 +Macartneys Granite?,PLgem?,#ff69a6 +Macauley Creek Granite,Cga,#ff4d82 +Macauley Creek Granite?,Cga?,#ff4d82 +Macrossan Gabbro,OSbm,#9ca1e8 +Madjack Granite,Cgomj,#c20085 +Magazine Shale,PLig,#d7b09e +Magna Lynn Metabasalt,PLem,#855436 +Magna Lynn Metabasalt/a,PLem/a,#d1a182 +Magna Lynn Metabasalt/m,PLem/m,#b88769 +Magna Lynn Metabasalt/mq,PLem/mq,#522103 +Magna Lynn Metabasalt/q,PLem/q,#d1a182 +Magna Lynn Metabasalt/s,PLem/s,#9e6e4f +Magna Lynn Metabasalt?,PLem?,#855436 +Magnetic Island Granite,Pgmi,#f57a7a +Magpie Creek Limestone Member,SDrq/m,#a8199e +Mairindi Creek Granite,PLgwa,#bd4b68 +Makbat Sandstone,PLxm,#4c2b1f +Malacura Sandstone,PLma,#d7c29e +Malacura Sandstone?,PLm?,#d7c29e +Malairo Rhyolite Member,Csh/m,#637a7a +Malakoff Granite,PLgwm,#e6738c +Mallee Gap Tonalite,PLgmg,#ff6666 +Malmesbury Microgranite,Cgm,#ff737d +Mamberra Andesite Member,DCn/m,#b399ff +Maneater Granodiorite,Pglm,#eb387a +Maneater Granodiorite/1,Pglm/1,#ff5999 +Manor Creek Microgranite,CPgmc,#ffbee8 +Maramungee Tonalite,PLgq,#c44ba0 +Marburg Subgroup,Jbm,#149987 +Marburg Subgroup?,Jbm?,#149987 +Mareeba Granite,Pgwm,#ff80e6 +Mareeba Granite/a,Pgwm/a,#ff80e6 +Marimo-Staveley Domain - silicified fault zones,PLqf,#ccbdb0 +Marlborough Pocket Granodiorite,Pgmp,#ff2970 +Maronghi Creek beds,DCm,#8f5ce0 +Marquis Rhyolite/1,Cq/1,#69695c +Marquis Rhyolite/2,Cq/2,#828275 +Marraba Volcanics,PLna,#543328 +Marraba Volcanics?,PLna?,#543328 +Marshs Creek Formation/c,CPsm/c,#b8c4db +Marshs Creek Formation/c?,CPsm/c?,#b8c4db +Marshs Creek Formation/s,CPsm/s,#9eabc9 +Marshs Creek Formation/s?,CPsm/s?,#9eabc9 +Martin Creek Microgranite,Cgor,#e600a9 +Martins Well Limestone Member,Ds/m,#7359a6 +Maryland Granite,PRgma,#ff4f78 +Maureen Volcanic Group,Cm,#b8cccc +Maureen Volcanic Group/x,Cm/x,#91a6a6 +Maureen Volcanic Group?,Cm?,#b8cccc +Mavis Granodiorite,PLgmv,#ffa6f7 +Mavis Granodiorite?,PLgmv?,#ffa6f7 +May Downs Gneiss,PLhs,#5e3a29 +Mayfield Gneiss,PLgmf,#a8196b +McBride Basalt Group,TQm,#ffd9cf +McBride Basalt Group/v,TQm/v,#ffa187 +McBride Basalt Group>CPia?-Kennedy Province,TQm>CPia?,#ffd9cf +McBride Basalt Group>Dido Tonalite/t,TQm>Sgi/t,#ffd9cf +McBride Basalt Group?,TQm?,#ffd9cf +McBride Basalt/1,TQm/1,#ff6940 +McBride Basalt/2,TQm/2,#ff7a57 +McCord Granite,Cgzm,#f58ccc +McDevitt Metamorphics,PLms,#a38f6b +McDevitt Metamorphics/d,PLm/d,#96825e +McDevitt Metamorphics/s1,PLm/s1,#d6c29e +McDevitt Metamorphics/s2,PLm/3,#bda885 +McFarlanes Andesite,Pvam,#bed2ff +McFarlanes Andesite?,Pvam?,#bed2ff +McKinnons Creek Granite,Sgm,#de358c +McKinnons Creek Granite/1,Sgm/1,#c41c73 +McKinnons Creek Granite/2,Sgm/2,#ff57ad +McKinnons Creek Granite?,Sgm?,#de358c +McLean Basalt,Tm,#e0ba6c +McLean Basalt/v,Tm/v,#e0ca99 +McLennons Creek Rhyolite/1,Cbm/1,#d4e0e0 +McLennons Creek Rhyolite/2,Cbm/2,#96a3a3 +McLennons Creek Rhyolite?,Cbm?,#b5c2c2 +McLeod Granite,Pgwe,#ff73df +McNamara Group/c,PLm/c,#d6bfbf +Meadowvale Granodiorite,SDgea,#e08c9e +Meadowvale Granodiorite?,SDgea?,#e08c9e +Meath Rhyolite Member,Cl/m,#8e9199 +Medicine Creek Complex/a,Ogmc/a,#e666cc +Medicine Creek Complex/b,Ogmc/b,#e64cb3 +Medicine Creek Complex/d,Ogmc/d,#7857ff +Melon Creek Tonalite,Ogmc,#ff80e0 +Mena Granite/1,Dgme/1,#ffd1de +Mena Granite/2,Dgme/2,#ff8591 +Merriland Tonalite,SDgml,#ff5978 +Merriland Tonalite/d,SDgml/d,#ded4ff +Middle Creek Sandstone Member,PLsmm,#edc296 +Middle Creek Sandstone Member?,PLsmm?,#edc296 +Middle Mountain Basalt,Qmd,#f2e7b1 +Middle Mountain Basalt/v,Qmd/v,#d9cf96 +Midway Creek Granodiorite,CPgmw,#d954de +Midway Creek Granodiorite?,CPgmw?,#d954de +Milky Granodiorite,Dgmk,#ff63c2 +Millaroo Granite,Ogmi,#e699e8 +Millaroo Granite/ag,Ogmi/ag,#fc004d +Millaroo Granite/ap,Ogmi/ap,#ffccdb +Millaroo Granite/mg,Ogmi/mg,#fc80a6 +Millaroo Granite/pq,Ogmi/pq,#ff99b8 +Millchester Creek Tonalite,Sgmc,#ff8a95 +Millungera Basin succession,PLmb,#a66633 +Millungera Basin succession/m,PLmb/m,#733300 +Milo beds,PLm,#cc8a66 +Milo beds/hq,PLm/hq,#993d19 +Milo beds/mc,PLm/mc,#e6a380 +Milo beds/mm,PLm/mm,#803d19 +Milo beds/mq,PLm/mq,#662400 +Milo beds/r,PLm/r,#ffbd99 +Milo beds/sg,PLm/sg,#b87552 +Milo beds/sm,PLm/sm,#995733 +Milo beds/t,PLm/t,#b35733 +Milo beds/v,PLm/v,#ffd6b3 +Miners Gap Granite,CPgmi,#ff99f2 +Mingela Granodiorite,OSgm,#c2308f +"Mingela Granodiorite,Kitty O'Shea Suite","OSgm,CPik",#c2308f +Mingela Granodiorite/1,OSgm/1,#e857b5 +Mingela Granodiorite?,OSgm?,#c2308f +Mingoom Granite,Pgmg,#f57ab6 +Mingoom Granite?,Pgmg?,#f57ab6 +Minmi Member,Kybi,#d9f5bf +Minnamoolka Granite,CPgm,#b32980 +Minnemore Granodiorite,Cgomi,#db006b +Minya Leucogranite,PLgmy,#ff297a +Mission Beach Granite Complex,Ogm,#ff6666 +Mistake Granodiorite,Dgmt,#e61966 +Mistake Granodiorite?,Dgmt?,#e61966 +Mistletoe Granite,PLgm,#f24c66 +Mistletoe Granite?,PLgm?,#f24c66 +Mitakoodi Quartzite,PLnm,#a8572e +Mitakoodi Quartzite/1a,PLnm/1a,#cc8a61 +Mitakoodi Quartzite/1b,PLnm/1b,#823008 +Mitakoodi Quartzite/1c,PLnm/1c,#db8057 +Mitakoodi Quartzite/1c?,PLnm/1c?,#db8057 +Mitakoodi Quartzite/1q,PLnm/1q,#e6bd94 +Mitakoodi Quartzite/2,PLnm/2,#8f3d14 +Mitakoodi Quartzite/3,PLnm/3,#691700 +Mitakoodi Quartzite?,PLnm?,#a8572e +Mitchell River Volcanics,Pm,#bee8ff +Mitchell River Volcanics/b1,Pm/b1,#5982ff +Mitchell River Volcanics/b1?,Pm/b1?,#5982ff +Mitchell River Volcanics/b2,Pm/b2,#73cce6 +Mitchell River Volcanics/b3,Pm/b3,#99bfd9 +Mitchell River Volcanics/b3?,Pm/b3?,#99bfd9 +Mitchell River Volcanics/b4,Pm/b4,#85a1bd +Mitchell River Volcanics/d1,Pm/d1,#4069ff +Mitchell River Volcanics/d2,Pm/d2,#59cce6 +Mitchell River Volcanics/d3,Pm/d3,#7399b3 +Mitchell River Volcanics/d3?,Pm/d3?,#7399b3 +Mitchell River Volcanics/d4,Pm/d4,#6ba1bd +Mitchell River Volcanics/d5,Pm/d5,#b3b3ff +Mitchell River Volcanics/i1,Pm/i1,#bfe6e6 +Mitchell River Volcanics/i2,Pm/i2,#40cce6 +Mitchell River Volcanics/i2?,Pm/i2?,#40cce6 +Mitchell River Volcanics/i3,Pm/i3,#b8d4f0 +Mitchell River Volcanics/r1,Pm/r1,#a6cce6 +Mitchell River Volcanics/r2,Pm/r2,#a6cce6 +Mitchell River Volcanics/s1,Pm/s1,#a6cfff +Mitchell River Volcanics/s2,Pm/s2,#82b5ff +Mitchell River Volcanics/s3,Pm/s3,#739cff +Mitchell River Volcanics/t1,Pm/t1,#8ccce6 +Mitchell River Volcanics/t3,Pm/t3,#9ebad6 +Mitchell River Volcanics/t4,Pm/t4,#d9d9ff +Mitchell River Volcanics/t5,Pm/t5,#9999ff +Molloy beds,DCm,#82dfed +Molly Darling Granodiorite,SDgmd,#d966b3 +Molly Darling Granodiorite/a,SDgmd/a,#fc80a6 +Molly Darling Granodiorite/d,SDgmd/d,#ded4ff +Molly Darling Granodiorite/gd,SDgmd/gd,#ffccdb +Molybdenite Creek Granite,CPgmo,#ff596e +Monaghans Granite,PLgxm,#ff6640 +Montgomery Range Igneous Complex/1,Cgm/1,#e63359 +Montgomery Range Igneous Complex/2,Cgm/2,#ff80a6 +Montgomery Range Igneous Complex/3,Cgm/3,#cc0019 +Montgomery Range Igneous Complex/4,Cgm/4,#f25980 +Mooga Sandstone,Kym,#abff57 +Moolayember Formation,Rm,#2bab9c +Moondarra Siltstone,PLim,#e6d9c2 +Moondarra Siltstone/c,PLim/c,#ccbfa8 +Moondarra Siltstone/c?,PLim/c?,#ccbfa8 +Moondarra Siltstone?,PLim?,#e6d9c2 +Moonlight Creek Granodiorite,Ogmc,#ff99b8 +Mooremount Granite,PLget,#f2808c +Mopata Microgranite,Cgnp,#cc0000 +Morehead Granite,Dgmh,#ffa180 +Morepork Member,PLEc/o,#b36352 +Morepork Member/q,PLEc/oq,#e69685 +Morepork Member?,PLEc/o?,#b36352 +Morgans Creek Monzogranite,Rlog,#f5807a +Mosaic Gully Rhyolite,Cno,#858585 +Mosaic Gully Rhyolite/u,Cno/u,#a6a6a6 +Mosgardies Monzogranite,Ogmo,#d94c47 +Mount Albert Group,PLp,#825137 +Mount Albert Group?,PLp?,#825137 +Mount Alto Granite,Pgn,#c23380 +Mount Angelay Granite,PLgia,#f74c52 +Mount Angelay Granite/d,PLgia/d,#6940ff +Mount Boddington Granite,Ogb,#d66ba3 +Mount Bullaganang Granite,Pgbg,#c20088 +Mount Canton Igneous Complex/d,CPmc/d,#ffe0cc +Mount Canton Igneous Complex/g,CPmc/g,#f499ff +Mount Canton Igneous Complex/gx,CPmc/gx,#ff879e +Mount Canton Igneous Complex/r,CPmc/r,#ffe8a3 +Mount Canton Igneous Complex/rc,CPmc/rc,#ffdb73 +Mount Canton Igneous Complex/rx,CPmc/rx,#ffc417 +Mount Carbine Granite,Pgwc,#ffbfd9 +Mount Carbine Granite/m,Pgwc/m,#ffd9f2 +Mount Cardwell Granite,Cgoc,#ff6370 +Mount Cardwell Granite/m,Cgoc/m,#cc6680 +Mount Carmel Tonalite,SDgmc,#ffccff +Mount Carmel Tonalite/d,SDgmc/d,#9980ff +Mount Cobalt Granite,PLgic,#f03284 +Mount Cuthbert Granodiorite,SDgcu,#e647a6 +Mount Darcy Microgranodiorite,Cgy,#d14c4c +Mount Darcy Microgranodiorite/x,Cgy/x,#ad2626 +Mount Departure Microgranite,CPgmd,#f5e0d1 +Mount Dore Granite,PLgid,#ed37b6 +Mount Douglas Formation,Cd,#c9cfd9 +Mount Douglas Formation?,Cd?,#c9cfd9 +Mount Elliott Slate,PLre,#99635e +Mount Elliott Slate/b,PLre/b,#228e61 +Mount Elliott Slate/c,PLre/c,#7c767c +Mount Elliott Slate/j,PLre/j,#efce10 +Mount Elliott Slate/p,PLre/p,#e79f72 +Mount Elliott Slate/s,PLre/s,#9e471f +Mount Elliott Slate/t,PLre/t,#deaaa1 +Mount Elvan Granite,SDge,#ed5ce4 +Mount Emu Rhyolite,Cve,#8c8c8c +Mount Erle Igneous Complex,PLgwe,#ff99ff +Mount Erle Igneous Complex/g?,PLgwe/g?,#ff99ff +Mount Erle Igneous Complex/m,PLgwe/m,#ff99a6 +Mount Erle Igneous Complex/o,PLgwe/o,#7078de +Mount Erle Igneous Complex/p,PLgwe/p,#cc3340 +Mount Erle Igneous Complex/p?,PLgwe/p?,#cc3340 +Mount Finnigan Granite,Pgci,#cd6699 +Mount Formartine Granite,Dgf,#c236b8 +Mount Formartine Granite?,Dgf?,#c236b8 +Mount Formartine Granite\b,Dgf\b,#e85cde +Mount Fort Constantine Volcanics,PLvfc,#e67800 +Mount Fort Constantine Volcanics?,PLvfc?,#e67800 +"Mount Fort Constantine Volcanics?,Corella Formation?","PLvfc?,PLkc?",#e67800 +Mount Garling Granite,Cgmg,#ff00c5 +Mount Gibson Microgranite,Cgcm,#ff19b3 +Mount Glengalder Granite,Ogmg,#e64c7c +Mount Godkin Granite,PLgg,#ffbee8 +Mount Godkin Granite/d,PLgg/d,#ff8cb5 +Mount Godkin Granite/g,PLgg/g,#ffa6cf +Mount Godkin Granite/m,PLgg/m,#ff739c +Mount Godkin Granite/p,PLgg/p,#ff4069 +Mount Grey Granite,CPggy,#b53e4a +Mount Guide Quartzite,PLhg,#804026 +Mount Guide Quartzite/1,PLhg/1,#a6664c +Mount Guide Quartzite/1n,PLhg/1n,#66260d +Mount Guide Quartzite/2,PLhg/2,#cc8c73 +Mount Guide Quartzite?,PLhg?,#804026 +Mount Hartley Granite,Pgch,#a80000 +Mount Helpman Member,PLah,#cf9626 +"Mount Helpman Member,Digger Creek Granite","PLah,PLgd",#cf9626 +Mount Hogan Granite,PLgh,#f07ab5 +Mount Hogan Granite/a,PLgh/a,#f04782 +Mount Hogan Granite/x,PLgh/x,#f0619c +Mount Isa Group,PLi,#875940 +Mount Isa Group/1,PLi/1,#94664c +Mount Isa Group?,PLi?,#875940 +Mount Joy Basalt,Qmj,#ffa187 +Mount Joy Basalt/v,Qmj/v,#ff420f +Mount Juliet Granite,Sgj,#b34647 +Mount Les Siltstone,PLfl,#d9bd4c +Mount Leswell Microgranite,Pgcs,#f2a6e6 +Mount Leyshon Complex/bdx,Pl/bdx,#ab94ff +Mount Leyshon Complex/bgx,Pl/bgx,#ff3847 +Mount Leyshon Complex/bpx,Pl/bpx,#ffa366 +Mount Leyshon Complex/bx,Pl/bx,#e62666 +Mount Leyshon Complex/gx,Pl/gx,#ff879e +Mount Leyshon Complex/mlx,Pl/mlx,#80b0f5 +Mount Leyshon Complex/mpx,Pl/mpx,#ffbdc2 +Mount Leyshon Complex/msx,Pl/msx,#b3cffa +Mount Leyshon Complex/r,Pl/r,#ffe08a +Mount Leyshon Complex/rbx,Pl/rbx,#ffedba +Mount Little Volcanic Group/s,Ps,#9eaad7 +Mount Maggie Granite,PLgma,#ff80ff +Mount Margaret Granite,PLgmm,#c23340 +Mount Masterson Granodiorite,CPgam,#de73cc +Mount Misery Granite,Sgmm,#ff33c4 +Mount Mulligan Coal Measures/1,Pum/1,#a6b8ff +Mount Mulligan Coal Measures/2,Pum/2,#578ffc +Mount Mulligan Coal Measures/3,Pum/3,#7d8ffc +Mount Mulligan Coal Measures/4,Pum/4,#bed2ff +Mount Noble Granite,Cgmn,#c23333 +Mount Norna Quartzite,PLon,#d1802b +Mount Norna Quartzite/j,PLon/j,#e6a652 +Mount Norna Quartzite/q,PLon/q,#a02842 +Mount Norna Quartzite?,PLon?,#d1802b +Mount Oxide Chert Member,PLmo,#f5c499 +Mount Peter Granite,Pgmp,#ff00c5 +Mount Philp Breccia,PLmp,#bf407d +Mount Philp-type breccia,PLmpx,#bf407d +Mount Pike Granite,Pgwp,#ff8ce8 +Mount Podge Limestone,Dwp,#837ca3 +Mount Poverty Granite,Pgcp,#cc4c99 +Mount Prince Charlie Granophyre,CPgp,#ffa77f +Mount Pudding Basin Granodiorite,Cgou,#f54f82 +Mount Razorback Basalt,Qmr,#f7f6c6 +Mount Roseby Schist,PLpo,#c24f00 +Mount Roseby Schist/l,PLpo/l,#ff994c +Mount Roseby Schist/q,PLpo/q,#eb6e1f +Mount Roseby Schist?,PLpo?,#c24f00 +Mount Rous Microgranodiorite,Cgbr,#cc194c +Mount Ryan Quartzite,PLcr,#ffff00 +Mount Sharples Granite,CPgoms,#ffccf2 +Mount Sircom Microgranodiorite,Cgcs,#f24b61 +Mount Start Member,PLns,#d7c29e +Mount Storth Granite,Pgs,#ff99b3 +Mount Stuart Igneous Complex,Pgmu,#ff80ff +Mount Stuart Igneous Complex?,Pgmu?,#ff80ff +Mount Success Rhyolite,CPs,#f5c7e8 +Mount Success Rhyolite/b,CPs/b,#f5adcf +Mount Success Rhyolite/d,CPs/d,#f594b5 +Mount Success Rhyolite/f,CPs/f,#f57a9c +Mount Success Rhyolite/t>Mount Success Rhyolite/p,CPs/t>CPs/p,#cccccc +Mount Sugarloaf Igneous complex,Ogms,#e600a9 +Mount Turner Granite,PLgu,#cd6699 +Mount Walker Member,Dh/cg,#aa66cd +Mount Wandoo Granodiorite,Cgaw,#ffbee8 +Mount Webster Granodiorite,Sgmw,#eb5766 +Mount Windsor Volcanics,EOsw,#b34954 +Mount Windsor Volcanics?,EOsw?,#b34954 +Mount Wright Breccia/gx,CPxw/gx,#ffa366 +Mount Wright Breccia/r,CPxw/r,#ffd65c +Mount Wright Breccia/rx,CPxw/rx,#ffedba +Mount Yates Granodiorite,Pgyy,#ffa77f +Mount You You Granite,Pgmy,#cd6699 +Mountain Camp Granite,Cgon,#e673bf +Mountain Camp Granite-altered,Cgom/a,#ff9ec9 +Mountain Creek Conglomerate,Ot,#e36fcc +Mountain Creek Conglomerate/l,Ot/l,#c957b3 +Muirson Rhyolite,Cbm,#b5a6ba +Muirson Rhyolite-a,Cbm/a,#827387 +Muirson Rhyolite/1,Cbm/1,#c7b8cc +Muirson Rhyolite/2,Cbm/2,#9c8ca1 +Muldiva Quartz Monzodiorite,Cgaul,#c23800 +Mulgrave Formation/a,Om/a,#ff99f7 +Mulgrave Formation/b,Om/b,#ff80de +Mulgrave Formation/c,Om/c,#e059b8 +Mulgrave Formation/m,Om/m,#d1409e +Mulindie Granite,Cgomu,#d94c80 +Mullera Formation,PLsm,#e3964a +Mullera Formation/1,PLsm/1,#e8a663 +Mullera Formation/1?,PLsm/1?,#e8a663 +Mullera Formation/1s,PLsm/1s,#ebb37d +Mullera Formation/2,PLsm/2,#f2d1b0 +Mullera Formation/2?,PLsm/2?,#f2d1b0 +Mullera Formation/3,PLsm/3,#d66900 +Mullera Formation/3?,PLsm/3?,#d66900 +Munderra Granodiorite,Cgcu,#a80000 +Mundic Igneous Complex,Pgm,#ff6666 +Mundic Igneous Complex?,Pgm?,#ff6666 +Muntalunga Range Granite,Pgu,#ff4c66 +Murronga Basalt,Qmm,#f2e76d +Murronga Basalt/v,Qmm/v,#d9cf54 +Myally Subgroup,PLhm,#7d4f37 +Myally Subgroup undivided,PLhm,#e6b399 +Myally Subgroup undivided?,PLhm?,#e6b399 +Myally Subgroup/o,PLhm/o,#bf8c73 +Myally Subgroup/o?,PLhm/o?,#bf8c73 +Myally Subgroup/p,PLhm/p,#7d4f38 +Myally Subgroup/q,PLhm/q,#b0826b +Myally Subgroup?,PLhm?,#7d4f37 +Myla Granite,PLgim,#ffbee8 +Myla Granite/gd,PLgim/gd,#e094ba +Myola Granite,SDgamy,#f233c2 +Myrrlumbing Basalt?,Tbnm?,#cca454 +Myrtlevale Formation,Dkm,#6e5f9e +Mytton Formation,Dbm,#60529c +Mytton Formation?,Dbm?,#60529c +Myubee Igneous Complex/g,PLgwm/g,#ff7f7f +Myubee Igneous Complex/o,PLgwm/o,#545ed9 +Myubee Igneous Complex/s,PLgwm/s,#fc4d82 +Mywyn Granite,PLgmy,#eb5e60 +Mywyn Granite?,PLgmy?,#eb5e60 +Namul Dacite,Ccn,#8a8a8a +Namul Dacite/1,Ccn/1,#636969 +Namul Dacite/x,Ccn/x,#3d4747 +Nancy Lee Sandstone Member,PLrpn,#a83800 +Nangee Granite,Pgwn,#ff00c5 +Nanyeta Volcanics,CPyt,#c3c4c7 +Natalie Granite,PLgn,#ff19ff +Native Bee Siltstone,PLin,#bd9966 +Native Bee Siltstone/1,PLin/1,#a3804c +Native Bee Siltstone/2,PLin/2,#d6b380 +Native Bee Siltstone/3,PLin/3,#f0cc99 +Native Bee Siltstone/a?,PLin/a?,#d6b380 +Native Bee Siltstone/c,PLin/c,#a3804c +Native Bee Siltstone?,PLin?,#bd9966 +Neds Gully Granite,Cgcn,#f57080 +Nested Rhyolite Porphyry,Cgoe,#ff8700 +Netherwood Tonalite,Ogn,#c72a7b +Nettle Granite/1,Cgcn/1,#f5bd94 +Nettle Granite/2,Cgcn/2,#f58a61 +Nettle Granite/3,Cgcn/3,#f5d6ad +Nettle Granite/4,Cgcn/4,#f5a27a +New Dam Granodiorite,SDgnd,#ff7a85 +New Hope Sandstone Member,PLrn,#b39e99 +New Hope Sandstone Member/q,PLrn/q,#c68c0f +New Hope Sandstone Member?,PLrn?,#b39e99 +Newberry Metamorphic Group?,PLcn?,#e68761 +Newburgh Granodiorite,Dgnb,#ff2680 +Newirie Formation,PLn,#db9e75 +Newirie Formation/a,PLn/a,#cc7033 +Newirie Formation/b,PLn/b,#cc7033 +Nicholson Granite Complex,PLgn,#faade0 +Nightflower Dacite/a,Cn/a,#b8d1d9 +Nightflower Dacite/b,Cn/b,#59738c +Nightflower Dacite/c,Cn/c,#99b3bf +Nightflower Dacite/x,Cn/x,#405973 +Nightjar Granodiorite,SDgnj,#ffe6ed +No Hays Minas Granite,Cgcn,#ff99f7 +Nobbs Tank Granite,PLgnt,#ff7063 +Noel Micromonzonite,Cgn,#ff59bf +Nonda Granite,PLgen,#ff3847 +Nonda Granite?,PLgen?,#ff3847 +Normanby Formation,Pno,#4794cc +Normanby Formation/a,Pno/a,#61ade6 +Normanby Formation/b,Pno/b,#7ac7ff +Normanby Formation/b?,Pno/b?,#7ac7ff +Normanby Formation/cg,Pno/cg,#4794cc +Normanby Formation/s,Pno/s,#2e7ab3 +Northedge Granite,Pgwn,#ff7f7f +Nulbullulul Granite,Pgu,#e600a9 +Nulla Basalt Group-Qb,Qbn,#806e3b +Nulla Basalt Group-Qb/v,Qbn/v,#d9dea6 +Nulla Basalt Group-Qb?,Qbn?,#806e3b +Nulla Basalt Group-TQb,TQbn,#ccb86e +Nulla Basalt Group-TQb/v,TQbn/v,#b39e2d +Nulla Basalt Group-TQb/v?,TQbn/v?,#b39e2d +Nulla Basalt Group-TQb?,TQbn?,#ccb86e +Nulla Basalt Group-Tb,Tbn,#e6d187 +Nulla Basalt Group-Tb/v,Tbn/v,#a69147 +Nulla Basalt Group-Tb/v?,Tbn/v?,#a69147 +Nulla Basalt Group-Tb?,Tbn?,#e6d187 +Nullawurt Sandstone Member,Kybn,#ccf57a +Nundah Granodiorite,Sgn,#ff6699 +Nundah Granodiorite/2,Sgn/2,#ff19ff +Nundah Granodiorite/3,Sgn/3,#ff2133 +Nundah Granodiorite/4,Sgn/4,#ff80ff +Nundah Granodiorite/6,Sgn/6,#ff14c7 +Nundah Granodiorite/7,Sgn/7,#ffb3c9 +Nundata Granite,PLgnd,#ffb3d1 +Nundata Granite/d,PLgnd/d,#8040ff +Nursery Creek Granite,Cgbnc,#e64c00 +Nursery Creek Granite/1,Cgbnc/1,#e66619 +Nychum Volcanics,Pn,#41c1e0 +Nychum Volcanics-Pni/1,Pni/1,#3ab4d6 +Nychum Volcanics-Pni/2,Pni/2,#267cb5 +Nychum Volcanics-Pni/3,Pni/3,#35b0fc +Nychum Volcanics-Pni/4,Pni/4,#368fb3 +Nychum Volcanics-Pni/5,Pni/5,#38dcfc +Nychum Volcanics-Pni/6,Pni/6,#b3d9e6 +Nychum Volcanics-Pni/7,Pni/7,#31a5cc +Nychum Volcanics-Pni/7+8,Pni/7+8,#2d7fb5 +Nychum Volcanics-Pni/8,Pni/8,#34d6fa +Nychum Volcanics-Pni/9,Pni/9,#39abf7 +Nychum Volcanics-Pnl/1,Pnl/1,#43c1f7 +Nychum Volcanics-Pnl/10,Pnl/10,#40bfdb +Nychum Volcanics-Pnl/11,Pnl/11,#35a1db +Nychum Volcanics-Pnl/12,Pnl/12,#2989b3 +Nychum Volcanics-Pnl/13,Pnl/13,#3491cf +Nychum Volcanics-Pnl/14,Pnl/14,#35a4bd +Nychum Volcanics-Pnl/15,Pnl/15,#ccf2f2 +Nychum Volcanics-Pnl/16,Pnl/16,#2fb7e0 +Nychum Volcanics-Pnl/17,Pnl/17,#2c9ac9 +Nychum Volcanics-Pnl/18,Pnl/18,#3fb4f2 +Nychum Volcanics-Pnl/19,Pnl/19,#b3f5ff +Nychum Volcanics-Pnl/2,Pnl/2,#35c7f0 +Nychum Volcanics-Pnl/20,Pnl/20,#99d1e6 +Nychum Volcanics-Pnl/21,Pnl/21,#34aac2 +Nychum Volcanics-Pnl/22,Pnl/22,#336b80 +Nychum Volcanics-Pnl/3,Pnl/3,#2583b3 +Nychum Volcanics-Pnl/4,Pnl/4,#42d4fc +Nychum Volcanics-Pnl/5,Pnl/5,#2da6d6 +Nychum Volcanics-Pnl/6,Pnl/6,#45c2f7 +Nychum Volcanics-Pnl/7,Pnl/7,#3590cc +Nychum Volcanics-Pnl/8,Pnl/8,#2e91b3 +Nychum Volcanics-Pnl/9,Pnl/9,#41bee0 +Nychum Volcanics-Pnm/1,Pnm/1,#43a5de +Nychum Volcanics-Pnm/10,Pnm/10,#33b4f5 +Nychum Volcanics-Pnm/11,Pnm/11,#369eba +Nychum Volcanics-Pnm/12,Pnm/12,#31aed4 +Nychum Volcanics-Pnm/13,Pnm/13,#3298c7 +Nychum Volcanics-Pnm/15,Pnm/15,#66cce6 +Nychum Volcanics-Pnm/16,Pnm/16,#32b3e6 +Nychum Volcanics-Pnm/17,Pnm/17,#2b7cb3 +Nychum Volcanics-Pnm/18,Pnm/18,#49caf5 +Nychum Volcanics-Pnm/19,Pnm/19,#288db8 +Nychum Volcanics-Pnm/2,Pnm/2,#398cbd +Nychum Volcanics-Pnm/20,Pnm/20,#3aa1c9 +Nychum Volcanics-Pnm/21,Pnm/21,#33cae8 +Nychum Volcanics-Pnm/22,Pnm/22,#99ccff +Nychum Volcanics-Pnm/23,Pnm/23,#3aa2cf +Nychum Volcanics-Pnm/3,Pnm/3,#38dcfc +Nychum Volcanics-Pnm/4,Pnm/4,#39b4cc +Nychum Volcanics-Pnm/5,Pnm/5,#2b81ba +Nychum Volcanics-Pnm/6,Pnm/6,#37c6fa +Nychum Volcanics-Pnm/6+8,Pnm/6+8,#319fe8 +Nychum Volcanics-Pnm/7,Pnm/7,#3db9fc +Nychum Volcanics-Pnm/8,Pnm/8,#328ab3 +Nychum Volcanics-Pnm/9,Pnm/9,#2899b8 +Nychum Volcanics-Pnr/1,Pnr/1,#3c96cf +Nychum Volcanics-Pnr/2,Pnr/2,#36c9eb +Nychum Volcanics-Pnr/3,Pnr/3,#3cb0d6 +Nychum Volcanics-Pnr/4,Pnr/4,#36a7e3 +Nychum Volcanics-Pns/1,Pns/1,#46b7e8 +Nychum Volcanics-Pns/2,Pns/2,#2fabe0 +Nychum Volcanics-Pns/3,Pns/3,#2994c2 +Nychum Volcanics-Pnt/1,Pnt/1,#3491b3 +Nychum Volcanics-Pnt/10,Pnt/10,#32a1b8 +Nychum Volcanics-Pnt/2,Pnt/2,#34abfa +Nychum Volcanics-Pnt/3,Pnt/3,#3cbbde +Nychum Volcanics-Pnt/4,Pnt/4,#4cd6fc +Nychum Volcanics-Pnt/4?,Pnt/4?,#4cd6fc +Nychum Volcanics-Pnt/5,Pnt/5,#3dc0fc +Nychum Volcanics-Pnt/6,Pnt/6,#2ca5c7 +Nychum Volcanics-Pnt/7,Pnt/7,#39bded +Nychum Volcanics-Pnt/8,Pnt/8,#41aef2 +Nychum Volcanics-Pnt/9,Pnt/9,#3489ba +Nychum Volcanics-Pnx,Pnx,#b3d9d9 +Nymbool Granite,Cgon,#f57ab6 +O'Briens Creek Supersuite-Cgtb,Cgtb,#f28073 +O'Briens Creek Supersuite-Cgz,Cgz,#f26659 +O'Briens Creek Supersuite-Cgz/g,Cgz/g,#f2998c +O'Briens Creek Supersuite-Cgz/p,Cgz/p,#f2ccbf +O'Briens Creek Supersuite-Cgz/pa,Cgz/pa,#ffb3a6 +O'Briens Creek Supersuite/a,Cgb/a,#f26659 +O'Lane Formation,PLel,#e6e6a6 +ODg-8059,ODg,#b32586 +ODg-Ravenswood Batholith,ODg,#f5adf2 +ODg/d-Ravenswood Batholith,ODg/d,#8a47ff +ODg/g-Ravenswood Batholith,ODg/g,#db61cc +ODg?-Ravenswood Batholith,ODg?,#f5adf2 +OK Member,Dho,#a633b5 +OK Member/a,Dho/a,#ffb3ff +OK Member/am,Dho/am,#d966e8 +OK Member/am?,Dho/am?,#d966e8 +OK Member/b,Dho/b,#8c199c +OK Member/b?,Dho/b?,#8c199c +OK Member/c,Dho/c,#f280ff +OK Member/c?,Dho/c?,#f280ff +OK Member/m,Dho/m,#bf59bf +OK Member/m?,Dho/m?,#bf59bf +OPg/d-Ravenswood Batholith,OPg/d,#b319ff +OPg/gd-Ravenswood Batholith,OPg/gd,#ff7a7a +OSg-7859,OSg,#ff7f7f +OSg/g-western Ravenswood Batholith,OSg/g,#d69dbc +OSg/gd-western Ravenswood Batholith,OSg/gd,#ffa77f +Oak Meadows Breccia,CPxw,#ff879e +Oak River Granodiorite/e,Sgo/e,#ff80ff +Oak River Granodiorite/m,Sgo/m,#ff0d99 +Oak River Granodiorite/p,Sgo/p,#ffbfff +Oak River Granodiorite/x,Sgo/x,#ffa6d9 +Oaky Granite,Cgco,#ff73df +Oasis Metamorphics-PLEo/1,PLEo/1,#b3404c +Oasis Metamorphics-PLEo/2,PLEo/2,#e67380 +Oasis Metamorphics-PLEo/3,PLEo/3,#cc5966 +Oasis Metamorphics-PLEo/3?,PLEo/3?,#cc5966 +Oasis Metamorphics-PLEo/3a,PLEo/3a,#992633 +Oasis Metamorphics-PLEo/m,PLEo/m,#ff8c99 +Oasis Metamorphics/a,PLEo/a,#7078de +Oasis Metamorphics/f,PLEo/f,#ffa6b3 +Oasis Metamorphics/sp,PLEo/sp,#267300 +Oasis Metamorphics/sp?,PLEo/sp?,#267300 +Obree Point Volcanics,CPvr,#2fadcc +Og-Ravenswood Batholith,Og,#d459bf +Og/a-Ravenswood Batholith,Og/a,#ba40a6 +Og/d-Ravenswood Batholith,Og/d,#f080e6 +Og/gb-Ravenswood Batholith,Og/gb,#f099f2 +Og/gd-Ravenswood Batholith,Og/gd,#fc6694 +Og/i-Ravenswood Batholith,Og/i,#a1268c +Og/p-Ravenswood Batholith,Og/p,#ff6370 +Og/t-Ravenswood Batholith,Og/t,#ff99ff +Og?-8057,Og?,#d459bf +Oir-8157,Oir,#a80084 +Old Man Rhyolite,Cgbo,#ffa680 +Old Man Rhyolite?,Cgbo?,#ffa680 +Olkolo Formation,PLeo,#00ab33 +Olsens Granite,PLgeo,#d94c4c +Olsens Granite/a,PLgeo/a,#bf3333 +Olsens Granite/f,PLgeo/f,#fa7a7a +Olsens Granite?,PLgeo?,#d94c4c +One Tree Granite,PLgv,#bf2c45 +One Tree Granite/d,PLgv/d,#990821 +One Tree Granite/t,PLgv/t,#e6526b +One Tree Granite?,PLgv?,#bf2c45 +Oorindimindi Gneiss,PLgio,#e600a9 +Ootann Granite,CPgoo,#ff73df +Ootann Supersuite-Cg/4,Cg/4,#ffa6ff +Ootann Supersuite-Cg/l,Cg/l,#c2194c +Ootann Supersuite-Cg/l?,Cg/l?,#c2194c +Ootann Supersuite-Cgo/g,Cgo/g,#ffbfff +Ootann Supersuite-Cgo/t,Cgo/t,#ff8cf7 +Opah Granite,Cgbo,#eb6161 +Orallo Formation,Kyo,#c2ff87 +Orient Rhyolite/1,Cbo/1,#5c7a7a +Orient Rhyolite/1?,Cbo/1?,#5c7a7a +Orient Rhyolite/2,Cbo/2,#8fadad +Orient Rhyolite/2?,Cbo/2?,#8fadad +Orient Rhyolite/3,Cbo/3,#a8c7c7 +Orient Rhyolite/4,Cbo/4,#426161 +Orient Rhyolite/4?,Cbo/4?,#426161 +Orient beds,PLlg,#a83800 +Orient beds/c,PLlg/c,#c25419 +Ormoral Volcanics/s,Dlo/s,#a885bd +Ormoral Volcanics/t,Dlo/t,#dbb8f0 +Ormoral Volcanics/v,Dlo/v,#c29ed6 +Oroopo Metabasalt,PLvo,#662e33 +Oroopo Metabasalt/f,PLor/f,#b37a80 +Oroopo Metabasalt/q,PLvo/q,#996166 +Oroopo Metabasalt/q?,PLvo/q?,#996166 +Oroopo Metabasalt/s,PLvo/s,#99474a +Oroopo Metabasalt/s?,PLvo/s?,#99474a +Oroopo Metabasalt?,PLvo?,#662e33 +Oswald Schist,PLyo,#cc8aff +Overhang Jaspilite,PLj,#d6b085 +Overhang Jaspilite/c,PLj/c,#a37d52 +Overhang Jaspilite?,PLj?,#d6b085 +Overlander Granite,PLgwo,#d4464b +Overlander Granite/p,PLgwo/p,#fa6b70 +Oweenee Rhyolite,Cvo,#8c8c8c +Oweenee Rhyolite?,Cvo?,#8c8c8c +PKg-BUR,PKg,#e536eb +PL-Gt,PL,#ff806b +PLEa-SE55,PLEa,#a80084 +PLEsp-SE55,PLEsp,#26ff19 +PLEsp?-SE55,PLEsp?,#26ff19 +PLS-Gt,PLS,#8a5933 +PLa/1-Gt,PLa/1,#ccab66 +PLa/2-Gt,PLa/2,#b3914c +PLa/3-Gt,PLa/3,#805e19 +PLa/4-Gt,PLa/4,#997833 +PLa/5-Gt,PLa/5,#e6c480 +PLad-Gt,PLad,#ccbf73 +PLadl-Gt,PLadl,#e6d98c +PLb-Gt,PLb,#d68093 +PLb/1-Gt,PLb/1,#cd8966 +PLb/2-Gt,PLb/2,#e6b380 +PLb/3-Gt,PLb/3,#d48cc4 +PLdl-Gt,PLdl,#3742d1 +PLg-6854,PLg,#f05d9d +PLg-6956,PLg,#f05d9d +PLg-Croydon,PLg,#f05d9d +PLg-SWMI,PLg,#f05d9d +PLg/1-Gt,PLg/1,#ff8c66 +PLg/1-MKD,PLg/1,#fc4d82 +PLg/1?-Gt,PLg/1?,#ff8c66 +PLg/1?-MKD,PLg/1?,#fc4d82 +PLg/2-Gt,PLg/2,#ff734c +PLg/2-MKD,PLg/2,#ff3847 +PLg/2-SE5509,PLg/2,#ff734c +PLg/2?-Gt,PLg/2?,#ff734c +PLg/3-Gt,PLg/3,#ffd1d1 +PLg/4-Gt,PLg/4,#ff9999 +PLg/5-Gt,PLg/5,#f57ab6 +PLg/6-Gt,PLg/6,#f57a7a +PLg/a-Gt,PLg/a,#e66680 +PLg/k-6959,PLg/k,#ffcccc +PLg/k?-6959,PLg/k?,#ffcccc +PLg/l-MI,PLg/l,#ff75b8 +PLg/l?-MI,PLg/l?,#ff75b8 +PLg/m-Gt,PLg/m,#f59999 +PLg/m?-Gt,PLg/m?,#f59999 +PLg/md-6956,PLg/md,#ffbebe +PLg/p-MKD,PLg/p,#ff6370 +PLg?-SELW,PLg?,#f05d9d +PRg-Auburn Subprovince,PRg/g,#e34a87 +PRg-SEQ,PRg,#ff0f70 +PRg/d-Auburn Subprovince,PRg/d,#7857ff +PRg/m - Drake,PRg/m,#e33638 +PRg/o-Stanthorpe,PRg/o,#d6565a +PRg\f-8064,PRg\f,#cc42a8 +PRgb-TEX,PRgb,#eb5bb9 +PRs-7964,PRs,#e831eb +PRs-SEQ,PRs,#e831eb +Packsaddle Microgranite,PLgr,#f57ab6 +Pad-7863,Pad,#85abd6 +Paddock Creek Formation/1,Cp/1,#d9dbde +Paddock Creek Formation/2,Cp/2,#bfc2c4 +Paddock Creek Formation/3,Cp/3,#8c8f91 +Paddock Creek Formation?,Cp?,#a6a8ab +Paddys Creek Phyllite,EOp,#e046c4 +Paddys Creek Phyllite?,EOp?,#e046c4 +Palgrave Granite,Pgpa,#ffa77f +Pall Mall Granite,Pgm,#e8b3e6 +Pallamana Sandstone,DCp,#bfb3d9 +Palmer Point Granite,Pgcmp,#ff8cde +Paluma Rhyolite,Ca,#888ea8 +Paluma Rhyolite?,Ca?,#888ea8 +Pandanus Formation,PLsp,#b38066 +Pandanus Formation?,PLsp?,#b38066 +Pandora Granite,CPgopa,#ffbee8 +Panorama Granite,Cgtp,#a80000 +Paper Tank Microgranite,PLgpt,#d161b5 +Papilio Mudstone,Dwp,#c29ed7 +Parada Granite,Cgor,#c23366 +Paradise Creek Formation,PLmx,#ccb38c +Paradise Creek Formation,w,#ccb38c +Paradise Creek Formation/c,PLmx/c,#806638 +Paradise Creek Formation/q,PLmx/q,#998059 +Paradise Creek Formation/u,PLmx/u,#b39973 +Paradise Creek Formation/x,PLmx/x,#b39973 +Paradise Creek Formation?,PLmx?,#ccb38c +Parallel Creek Rhyolite,Pvyl,#94cfff +Parallel Creek Rhyolite/2,Pvyl/2,#7ab5f5 +Parallel Creek Rhyolite/2?,Pvyl/2?,#7ab5f5 +Parallel Creek Rhyolite/l,Pvyl/l,#619cdb +Parallel Creek Rhyolite?,Pvyl?,#94cfff +Parker Microgranite,Cgca,#a80000 +Parrot Camp Rhyolite,PLrp,#d6b89e +Parrot Camp Rhyolite/a,PLrp/a,#bd9e85 +Pat and Peter Creek Granite,Cgzp,#cd6699 +Pat and Peter Creek Granite-alteration,Cgzp/a,#b34c80 +Patrick Rhyolite,Crp,#999999 +Patrick Rhyolite/1,Crp/1,#bfbfbf +Patrick Rhyolite/2,Crp/2,#e1e1e1 +Paulet Dacite/bx,Pvyp/bx,#0d59ff +Paulet Dacite/d1,Pvyp/d1,#73bfff +Paulet Dacite/d1?,Pvyp/d1?,#73bfff +Paulet Dacite/d2,Pvyp/d2,#59a6ff +Paulet Dacite/d2?,Pvyp/d2?,#59a6ff +Paulet Dacite/d3,Pvyp/d3,#408cff +Paulet Dacite/d3?,Pvyp/d3?,#408cff +Paulet Dacite/da,Pvyp/da,#2673ff +Paulet Dacite/l,Pvyp/l,#bff2ff +Paulet Dacite/r1,Pvyp/r1,#a6d9ff +Paulet Dacite/r2,Pvyp/r2,#8cbfff +Paulet Dacite/r2?,Pvyp/r2?,#8cbfff +Paulet Dacite/r2l,Pvyp/r2l,#73a6ff +Paulet Dacite/rd,Pvyp/rd,#598cff +Paulet Dacite/rd?,Pvyp/rd?,#598cff +Paulet Dacite/rdl,Pvyp/rdl,#4073ff +Paulet Dacite/rh,Pvyp/rh,#2659ff +Paulet Dacite/rh?,Pvyp/rh?,#2659ff +Paynes Lagoon Amphibolite,EOap,#de49b9 +Pbx-SF55-02,Pbx,#ffdb73 +Pelican Creek Granite,Dgpc,#ff705e +Pelican Range Formation,Op,#de6ebf +Pelican Range Formation/j,Op/j,#c454a6 +Pelican Range Formation/v,Op/v,#ff8fe0 +Pelican Range Formation?,Op?,#de6ebf +Penny Gneiss,PLwp,#b8bf7d +Pepper Diorite,Cgau,#6619ff +Pepper Pot Sandstone/1,Rp/1,#59a68c +Pepper Pot Sandstone/2,Rp/2,#8cd9bf +Pepper Pot Sandstone/2?,Rp/2?,#8cd9bf +Percy Creek Volcanics,Cp,#abb2c2 +Percy Creek Volcanics?,Cp?,#abb2c2 +Percy Granophyre,Cgcp,#d98cb3 +Percy Granophyre?,Cgcp?,#d98cb3 +Peringa Tonalite,Dgp,#d61fb3 +Permana Granodiorite,Dgpe,#fc66b3 +Perry Creek Formation,Sp,#e347ad +Perry Creek Formation/c,Sp/c,#d12e94 +Perry Creek Formation/j,Sp/j,#ff94f2 +Perry Creek Formation/l,Sp/l,#fc61c7 +Perry Creek Formation/ls,Sp/ls,#b8147a +Perry Creek Formation/v,Sp/v,#fc6ed4 +Perry Creek Formation?,Sp?,#e347ad +Peters Creek Volcanics,PLvp,#b37033 +Peters Creek Volcanics/2,PLvp/2,#ebd9c4 +Peters Creek Volcanics/3,PLvp/3,#b8a691 +Peters Creek Volcanics/4,PLvp/4,#9e8c78 +Peters Creek Volcanics/5,PLvp/5,#d1bfab +Peters Creek Volcanics/6,PLvp/6,#b8a691 +Peters Creek Volcanics/7,PLvp/7,#9e8c78 +Peters Creek Volcanics/d,PLvp/d,#85735e +Petford Granite,Cgope,#ff4cd9 +Petford Granite/1,Cgope/1,#ff33bf +Pg-7762,Pg,#ed5cf0 +Pg-8064,Pg,#ed5cf0 +Pg-8259,Pg,#ed5cf0 +Pg/d-7765,Pg/d,#9900ff +Pg/d-7967,Pg/d,#6640ff +Pg/p-8259,Pg/p,#c44393 +Pgr-Kennedy Province,geophysics,#ff6380 +Pgu-SEQ,Pgu,#ed33a8 +Pgy-7963,Pgy,#e600a9 +Phoenician Granite,Pgce,#f57ab6 +Pi/j-SD54,Pi/j,#ffe0db +Piano Gully Granodiorite,Ogp,#ff3333 +Piano Gully Granodiorite?,Ogp?,#ff3333 +Piccadilly Formation,Ckp,#bdbdbd +Piccadilly Formation?,Ckp?,#bdbdbd +Pickwick Metabasalt Member,PLhp,#a39973 +Pickwick Metabasalt Member/cg,PLhp/cg,#bdb38c +Pickwick Metabasalt Member/q,PLhp/q,#8a8059 +Pickwick Metabasalt Member/r,PLhp/r,#bdb38c +Pickwick Metabasalt Member/t,PLhp/t,#706640 +Pickwick Metabasalt Member?,PLhp?,#a39973 +Pig Gully Granodiorite/gd,Ogpg/gd,#ff99b8 +Pig Gully Granodiorite/zg,Ogpg/zg,#ff4d5c +Pikedale beds,Pk,#9eabd6 +Pikedale beds?,Pk?,#9eabd6 +Pilpah Formation,PLui,#c2662e +Pinchgut Granite,Cgop,#ff00c5 +Pine Tree Creek Granite,Dgpt,#d96973 +Pinnacles Granite,Cgcl,#cd6666 +Pint Pot Andesite Member,Cny/p,#737373 +Plain Creek Formation,PLmn,#d6cc9e +Playboy Granite,PLgp,#ff0080 +Plum Mountain Gneiss,PLgpm,#94604a +Plum Mountain Gneiss/b,PLgpm/b,#000ac2 +Plum Mountain Gneiss?,PLgpm?,#94604a +Plumtree Creek Tonalite,Ogpt,#ffb8c4 +Pmg-BVSP,Pmg,#a80000 +Pmg?-BVSP,Pmg?,#a80000 +Po-7765,Pdo,#894465 +Pocket Dam Granite,Ogpo,#e63366 +Pocket Dam Granite?,Ogpo?,#e63366 +Poddskles Microgranite,Ogpd,#f28ca6 +Poison Creek Granite,Cgpc,#b8333a +Poley Cow Formation,Sro,#db4cde +Poley Cow Formation/c,Sro/c,#c233b8 +Police Creek Siltstone Member,PLho,#8c734c +Policeman Creek Granodiorite,SDgo,#f25999 +Policeman Creek Granodiorite?,SDgo?,#f25999 +Pombete Gneiss,PLyp,#894444 +Ponto Basalt Member,Ct/p,#a69999 +Ponto Basalt Member?,Ct/p?,#a69999 +Poona Creek Granodiorite,Cgap,#e600a9 +Porcupine Creek Rhyolite,Cvpc,#e1e1e1 +Porcupine Creek Rhyolite?,Cvpc?,#e1e1e1 +Potallah Formation,PLep,#edfc80 +Potallah Formation/1,PLep/1,#829e00 +Powlathanga Tonalite,SDgp,#ff3380 +Pr-SD54-12,Pr,#ffd145 +Pr-SE5509,Pr,#a80084 +Pr-SF55-02,Pbx,#ffd145 +Pr-TEX,Pr,#37a6de +Pr/d-SE5509,Pr/d,#e833de +Pratt Volcanics,Cp,#878c99 +Pratt Volcanics/a,Cp/a,#ccccd9 +Pratt Volcanics/b,Cp/b,#baccd9 +Pratt Volcanics/d,Cp/d,#547080 +Pratt Volcanics/l,Cp/l,#878c99 +Pratt Volcanics/r,Cp/r,#878c99 +Pratt Volcanics/s,Cp/s,#7a919c +Pratt Volcanics/w,Cp/w,#babfcc +Pratt Volcanics/x,Cp/x,#a1a6b3 +Pratt Volcanics/y,Cp/y,#6e7380 +Pratt Volcanics/z,Cp/z,#d9d9e6 +Pre-Barramundi Basement/m,PLx/m,#bda885 +Pre-Barramundi Basement/s,PLx/s,#e3cfab +Precipice Sandstone,Jp,#06c77a +Prestwood Microgranite,Cgcp,#a80084 +Pretty Swamp Rhyolite,Pvsp,#1966c2 +Pretty Swamp Rhyolite/1,Pvsp/1,#004da8 +Pretty Swamp Rhyolite/2,Pvsp/2,#3380db +Prh-SE54-8,Prh,#c20033 +Prices Dam Igneous Complex/d,CPgpd,#ff5500 +Prices Dam Igneous Complex/g,CPgpg,#ffa77f +Prices Dam Igneous Complex/p,CPgp,#d94000 +Princess Hills Granite,CPgph,#ff73ff +Prize Supersequence,PLr,#d7b09e +Promise Creek Granite/g,Pgpc/g,#ff6666 +Promise Creek Granite/mg,Pgpc/mg,#ff8080 +Ps-SEQ,Ps,#2987b3 +Ps?-SEQ,Ps?,#2987b3 +Psk-Kennedy Province,geophysics,#3380ff +Puddler Creek Formation,Esp,#c27680 +Puddler Creek Formation?,Esp?,#c27680 +Pugh Creek Granite,Pgcpu,#f57ab6 +Puppy Camp Granodiorite,Sgp,#ba2b40 +Puranga Rhyolite/1,Cmp/1,#c9cfcf +Puranga Rhyolite/2,Cmp/2,#adb8b8 +Puranga Rhyolite/3,Cmp/3,#919e9e +Puranga Rhyolite/d,Cmp/d,#e6e8e8 +Puranga Rhyolite/d?,Cmp/d?,#e6e8e8 +Purkin Granite,Cgp,#ed349a +Puzzler Granodiorite,Ogpu,#cc4c99 +Pv-7965,Pv,#6678cc +Pv-Kennedy Province,geophysics,#2100bf +Pv/1a-Kennedy Province,geophysics,#66a1f5 +Pv/1b-Kennedy Province,geophysics,#99bff7 +Px-TEX,Px,#e032e3 +Python Granite,Cgty,#ffbfd9 +Pz/a-Diamantina,Pz/a,#d98c66 +Pz/b-Diamantina,Pz/b,#a65933 +Pzu-7765,Pzu,#73dfff +Qpb-SE55-10,Qpb,#f7ed99 +Quadroy Conglomerate,DCq,#6c6099 +Quadroy Conglomerate?,DCq?,#6c6099 +Quaker Granite,Cgoq,#e64c00 +Quaker Granite/2,Cgoq/2,#f28033 +Quaker Granite/3,Cgoq/3,#ff994c +Quamby Conglomerate,PLq,#b58457 +Quamby Conglomerate/s,PLq/s,#cf9e70 +Quamby Conglomerate?,PLq?,#b58457 +Quartz vein-Ravenswood Batholith,q,#e1e1e1 +Quartz-SE5509,q,#e1e1e1 +Queen Elizabeth Granite,PLgsq,#eb004f +Quilalar Formation,PLq,#bd9978 +Quilalar Formation-PLqx,PLqx,#573d12 +Quilalar Formation-w,PLqw,#70572b +Quilalar Formation-w/1,PLqw/1,#94855c +Quilalar Formation-w/1?,PLqw/1?,#94855c +Quilalar Formation-w/v,PLqw/v,#a37a4c +Quilalar Formation-w?,PLqw?,#70572b +Quilalar Formation-x,PLqx,#a3805e +Quilalar Formation-x/q,PLqx/q,#c29e7d +Quilalar Formation-x/q1,PLqx/q1,#d6b387 +Quilalar Formation-x/q2,PLqx/q2,#ebc79c +Quilalar Formation-x/q?,PLqx/q?,#c29e7d +Quilalar Formation-x/t,PLqx/t,#bda378 +Quilalar Formation-x/u,PLqx/u,#897044 +Quilalar Formation-x/v,PLqx/v,#bd8066 +Quilalar Formation-x?,PLqx?,#a3805e +Quilalar Formation-y,PLqy,#573d12 +Quilalar Formation-y/q,PLqy/q,#f5cca8 +Quilalar Formation-z,PLqz,#452b00 +Quilalar Formation-z?,PLqz?,#452b00 +Quilalar Formation/c,PLq/c,#70572b +Quilalar Formation/s,PLq/s,#c7ad85 +Quilalar Formation/s1,PLq/s1,#897044 +Quilalar Formation/u,PLq/u,#61471f +Quilalar Formation/u?,PLq/u?,#61471f +Quilalar Formation?,PLq?,#bd9978 +Quinine Spring Granite,Sgq,#ff6699 +Quinine Spring Granite?,Sgq?,#ff6699 +Quinton Formation,SDrq,#ba4ac9 +Quinton Formation?,SDrq?,#ba4ac9 +Racecourse Knob Basalt,Qmc,#faf6a7 +Racecourse Knob Basalt/v,Qmc/v,#e0db8c +Rackarock Rhyolite/j,Pwr/j,#4c5ce6 +Rackarock Rhyolite/k,Pwr/k,#6675ff +Rackarock Rhyolite/m,Pwr/m,#a6ccff +Rattler Granite,Cgot,#ff7533 +Ravenshoe Granite,Cgcr,#ff73e6 +Razorback Creek Mudstone,Pla,#6677cd +Razorback Creek Mudstone?,Pla?,#6677cd +Reamba Volcanics,Prv,#b2b2b2 +Red River Rhyolite/1,Pvsr/1,#0070ff +Red River Rhyolite/2,Pvsr/2,#2696ff +Red River Rhyolite/3,Pvsr/3,#4cbdff +Redcap Dacite/1,Crv/1,#cccccc +Redcap Dacite/2,Crv/2,#a6a6a6 +Redcap Dacite/3,Crv/3,#7f7f7f +Redcap Dacite/4,Crv/4,#595959 +Reddicliffe Granite,Cgord/2,#cd6699 +Reddicliffe Granite/1,Cgord/1,#e680b3 +Reddicliffe Granite/m,Cgord/m,#b34c80 +Reddicliffe Granite/m2,Cgord/m2,#993366 +Reddicliffe Granite/mx,Cgord/mx,#ff99cc +Redlands Granite,SDgad,#d66982 +Reedybed Granite,SDgar,#ff4c99 +Reedybed Granite?,SDgar?,#ff4c99 +Reids Granite,Cgtr,#f5619c +Repeater Station Granite,PLgrs,#ff0000 +Retchford Granite,Cgot,#ff1966 +Retire Monzodiorite,Cgare,#e6617a +Retire Monzodiorite/1,Cgare/1,#ff7a94 +Revenue Granite,PLgwr,#f230c7 +Revenue Granite/p,PLgwr/p,#ffb3ff +Revenue Granite?,PLgwr?,#f230c7 +Rewan Group,Rr,#00e6a9 +Rg-Texas-SEQ,Rg,#ff99d9 +Rgx-QLD,Rgx,#e600a9 +Rhyolite Range beds/c,Plr/c,#0070ff +Rhyolite Range beds/e,Plr/e,#008aff +Rhyolite Range beds/f,Plr/f,#00ccff +Rhyolite Range beds/s,PLr/s,#00b3ff +Rhyolite Range beds/v,Plr/v,#0057ff +Ri/a-SEQ,Ri/a,#ff9100 +Ri/r-SEQ,Ri/r,#ff8c59 +Rices Creek Granite,Cgom,#ff7359 +Ringwood Park Microgranite/1,EOgr/1,#f54061 +Ringwood Park Microgranite/2,EOgr/2,#db2647 +Ringwood Park Microgranite/3,EOgr/3,#f5597a +Risdon Stud Formation,Sr,#a62bff +Rishton Granodiorite,SDgrt,#ffadd9 +Rishton Granodiorite/f,SDgrt/f,#ffccff +River Supersequence,PLm,#ccbfb3 +River Supersequence-1,PLm,#99594c +River Supersequence-2,PLm,#b38c80 +River View Granodiorite,SDgv,#cc1929 +Riversleigh Siltstone,PLmr,#cc9980 +Riversleigh Siltstone/l,PLmr/l,#99664c +Riversleigh Siltstone/s1,PLmr/s1,#804c33 +Riversleigh Siltstone/s2,PLmr/s2,#99664c +Riversleigh Siltstone/s3,PLmr/s3,#b38066 +Riversleigh Siltstone?,PLmr?,#cc9980 +Rivertree Granite,Rlig,#ff6259 +Roaring Meg Granite,Pgcr,#cd6666 +Robey Range Granite/1,CPgr/1,#fc2133 +Robey Range Granite/3,CPgr/3,#ffbfff +Robin Hood Granodiorite,Sgr,#f2abc9 +Rock Hole Rhyolite,Cbr,#b3b8cc +Rock Hole Rhyolite?,Cbr?,#b3b8cc +Rock of Ages Granite,Cgta,#e600a9 +Rockfields Member,Du/r,#e6d1e6 +Rockingham Bay Granite,Cgrb,#e73eed +Rockingham Bay Granite?,Cgrb?,#e73eed +Rocky King Granite,Dgrk,#e62933 +Rollingstone Granite,Cgrs,#e340de +Rollingstone Granite?,Cgrs?,#e340de +Rollston Range Formation,Osr,#9c4e83 +Rollston Range Formation/m,Osr,#d678ff +Rollston Range Formation?,Osr?,#9c4e83 +Ropewalk Granite,PLgr,#f24c40 +Ropewalk Granite?,PLgr?,#f24c40 +Rose Creek Granite,Cgzr,#ffb3b3 +Rosebud Granite,PLgr,#ff33a3 +Rosser Schist,PLyr,#b39980 +Rosser Schist?,PLyr?,#b39980 +Routh Dacite,Cnh,#b3bdb3 +Routh Dacite/1,Cnh/1,#ccd6cc +Roxmere Quartzite,PLpr,#cd8966 +Roxmere Quartzite?,PLpr?,#cd8966 +Ruby Creek Granite,Rgru,#bd4a4f +Ruby Creek Granite?,Rgru?,#bd4a4f +Rudd Granite,Cgod,#ffbebe +Ruddygore Granodiorite,Cgar,#ff7373 +Ruddygore Granodiorite/1,Cgar/1,#e68c8c +Ruddygore Granodiorite/2,Cgar/2,#e67373 +Ruddygore Granodiorite/3,Cgar/3,#ff8c8c +Ruddygore Granodiorite/4,Cgar/4,#e65959 +Ruddygore Granodiorite/5,Cgar/5,#ffa6a6 +Ruddygore Granodiorite/6,Cgar/6,#ffbebe +Ruddygore Granodiorite/s,Cgar/s,#e64040 +Running River Metamorphics,PLr,#d9a16b +Running River Metamorphics/a,PLr/a,#b8804a +Ruxton Formation,Ccr,#94adb8 +Ruxton Formation?,Ccr?,#aab0bf +Rxg? - Clive,Rxg?,#f59494 +Rxo - Clive,Rxo,#ff338f +Ryeburn Quartz Diorite,CPgrb,#db4296 +Ryeburn Quartz Diorite?,CPgrb?,#db4296 +SDg-Ravenswood Batholith,SDg,#b32586 +SDg/a-8257,SDg/a,#ff879e +SDg/d-Ravenswood Batholith,SDg/d,#ff00c5 +SDg/g-Reedy Springs Batholith,SDg/g,#d459e3 +SDg/gd-Reedy Springs Batholith,SDg/gd,#d459e3 +SDg/i-Ravenswood Batholith,SDg/i,#ffa77f +SDg?-Ravenswood Batholith,SDg?,#b32586 +Saddington Tonalite,Ogs,#b83558 +Saint Giles Volcanics,Csg,#bababf +Saint Giles Volcanics?,Csg?,#bababf +Saint Helena Monzogranite,Pglh,#cd6699 +Saint James Volcanics/1,Cs/1,#73735e +Saint James Volcanics/2,Cs/2,#8c8c78 +Saint James Volcanics/3,Cs/3,#a6a691 +Saint James Volcanics/4,Cs/4,#bfbfab +Saint James Volcanics/5,Cs/5,#d9d9c4 +Saint Mungo Granite,PLgwn,#c947b6 +Saint Pauls Creek Granite,Ogsp,#ff99b8 +Saint Pauls Creek Granite/g,Ogsp/g,#ff7a85 +Saint Ronans Metamorphics,PLs,#78503c +Saint Ronans Metamorphics?,PLs?,#78503c +Saint-Smith Formation,PLss,#bda680 +Sandalwood Serpentinite,PLEbs,#52bf69 +Sandy Tate Granite,Cgoy,#ff8c4c +Saraga Schist/1,PLys/1,#b38c99 +Saraga Schist/2,PLys/2,#8c5959 +Saraga Schist/3,PLys/3,#8c6680 +Saraga Schist/4,PLys/4,#d9b3bf +Saraga Schist/5,PLys/5,#e6ccd9 +Saraga Schist/6,PLys/6,#a67373 +Saraga Schist/6?,PLys/6?,#a67373 +Saucebottle Granite,Cgob,#f5a27a +Saucebottle Granite/1,Cgob/1,#ffbf99 +Saucebottle Granite/2,Cgob/2,#c25947 +Saucebottle Granite/3,Cgob/3,#db8061 +Sawpit Granodiorite,PLgs,#ff33f7 +Saxby Granite,PLgix,#f54ccc +Scardons Volcanic Group-Csa,Csa,#7385ff +Scardons Volcanic Group-Csb,Csb,#0d1fff +Scardons Volcanic Group-Csc,Csc,#0000d9 +Scardons Volcanic Group-Csd/1,Csd/1,#707ecc +Scardons Volcanic Group-Csf,Csf,#5c6bcc +Scardons Volcanic Group-Csf?,Csf?,#5c6bcc +Scardons Volcanic Group-Csid,Csid,#596bff +Scardons Volcanic Group-Csid?,Csid?,#596bff +Scardons Volcanic Group-Csk,Csk,#4052ff +Scardons Volcanic Group-Csm,Csm,#4252b3 +Scardons Volcanic Group-Csn,Csn,#ccd1ff +Scardons Volcanic Group-Cso,Cso,#d9ebff +Scardons Volcanic Group-Csp,Csp,#a6b8ff +Scardons Volcanic Group-Csp?,Csp?,#a6b8ff +Scardons Volcanic Group-Csr,Csr,#b3c4d9 +Scardons Volcanic Group-Csr?,Csr?,#b3c4d9 +Scardons Volcanic Group-Css,Css,#99abbf +Scardons Volcanic Group-Css?,Css?,#99abbf +Scardons Volcanic Group-Csv,Csv,#8091a6 +Scardons Volcanic Group-Csva,Csva,#66788c +Scardons Volcanic Group-Csvr,Csvr,#d9ebff +Scardons Volcanic Group-Csw,Csw,#8c9eff +Scardons Volcanic Group-Csw?,Csw?,#8c9eff +Scardons Volcanic Group-Csy,Csy,#4c5e73 +Scardons Volcanic Group-Psg,Psg,#8cb3b3 +Scardons Volcanic Group-Psi/1,Psi/1,#a6cccc +Scardons Volcanic Group-Psi/2,Psi/2,#bfe6e6 +Scardons Volcanic Group-Psi/3,Psi/3,#739999 +Scardons Volcanic Group-Psiy,Psiy,#4c5e73 +Scardons Volcanic Group-Pvs,Pvs,#b3d9d9 +Scartwater Formation/c,Cw/c,#8096a1 +Scartwater Formation/m,Cw/m,#bac4c9 +Scartwater Formation/s,Cw/s,#abb8bf +Scheelite Granite,PLgsl,#ff9ca6 +Schreibers Granodiorite,Ogs,#ffc7bd +Schultz Sandstone Member,PLscs,#a8a80f +Schultz Sandstone Member/1,PLscs/1,#bdbd45 +Scoop Holes Granodiorite,SDgsh,#d678cc +Scoop Holes Granodiorite/d,SDgsh/d,#ded4ff +Scoop Holes Granodiorite/g,SDgsh/g,#ffe6eb +Scrubby Creek Rhyolite/a1,Ccs/a1,#e6e8e8 +Scrubby Creek Rhyolite/a2,Ccs/a2,#d6dbdb +Scrubby Creek Rhyolite/r1,Ccs/r1,#2e4747 +Scrubby Creek Rhyolite/r2,Ccs/r2,#476161 +Scrubby Creek Rhyolite/r3,Ccs/r3,#adc7c7 +Scrubby Creek Rhyolite/r4,Ccs/r4,#91abab +Scrubby Creek Rhyolite/r5,Ccs/r5,#7a9494 +Scrubby Creek Rhyolite/r6,Ccs/r6,#617a7a +Scrubby Creek Rhyolite/s1,Ccs/s1,#a6cccc +Scrubby Creek Rhyolite/s2,Ccs/s2,#bfd9d9 +Scrubby Creek Rhyolite/s3,Ccs/s3,#d9e6e6 +Scrufflem Rhyolite,Pds,#573dff +Scrufflem Rhyolite?,Pds?,#573dff +Seigal Volcanics,PLts,#d98a2e +Sentinel Range Granite,Cgon,#ff19ff +Settlement Creek Volcanics,PLte,#f2b38c +Seventy Mile Mount Granodiorite,CPgsm,#ffccff +Seventy Mile Range Group,EOs,#d699bd +Seventy Mile Range Group/c,EOs/c,#bd80a3 +Seventy Mile Range Group/q,EOs/q,#d699bd +Seventy Mile Range Group?,EOs?,#d699bd +Sg-Gt,Sg,#ff6370 +Sg/1-Gt,Sg/1,#d459e3 +Sg/a-Ravenswood Batholith,Sg/a,#df73ff +Sg/h-7658,Sg/h,#d459e3 +Sg/l-Gt,Sg/l,#e64c80 +Sg/m-Gt,Sg/m,#d459e3 +Sg/t-SE5509,Sg/t,#ff00c5 +Sg/x-Ravenswood Batholith,Sg/x,#ffb3c9 +Sg?-Gt,Sg?,#cc3366 +Sgz-Pama Province,geophysics,#ff3333 +Shady Bore Quartzite,PLms,#8a4444 +Shady Bore Quartzite?,PLms?,#8a4545 +Shady Microgranite,Cgch,#cd6699 +Shamrock Rhyolite,Cnm,#737d73 +Shamrock Rhyolite/1,Cnm/1,#99a399 +Shear Zone-MI,shz,#e1e1e1 +Sheba Granite,Cgosh,#f57a7a +Shield Creek Formation,Ds,#8f5ee3 +Shield Creek Formation?,Ds?,#8f5ee3 +Shovel Creek Complex,EOgs,#c73336 +Shovel Creek Complex/h,EOgs/h,#ffbebe +Shovel Creek Complex/l,EOgs/l,#e04c4f +Shrimp Creek Rhyolite,Cns,#7a9494 +Silent Hill Basalt,Qms,#fcf7ae +Silent Hill Basalt/v,Qms/v,#e3de94 +Silver Pot Granodiorite,Pgas,#ffcccc +Silver Spur beds,Pss,#4bc3fa +Silver Valley Conglomerate,Cus,#9ea0a8 +Silverwood Group,SDs,#59c3cf +Silverwood Group/m,SDs/m,#bf8fcf +Skeleton Creek Granite,Sgsk,#ff4c40 +Slaughter Yard Creek Volcanics,Pw,#a8abb3 +Slaughter Yard Creek Volcanics/a,Pw/a,#c2c4cc +Sly Creek Sandstone,PLtl,#e6c480 +Soda Spring Granite,Cgoss,#ffa77f +Solanum Granodiorite,Cgal,#bf1980 +Solanum Granodiorite?,Cgal?,#bf1980 +Soldiers Cap Group,PLo,#a6856e +Soldiers Cap Group?,PLo?,#a6856e +"Soldiers Cap Group?,Millungera Basin succession","PLo?,Pzm?",#a6856e +South Island Gabbro,CPds,#545ed9 +South Nicholson Group,PLsn,#8f583b +Southern Cross Formation,Tss,#edd98d +Spanner Limestone Member,Dwps,#aa66cd +Spear Siltstone,PLis,#894444 +Specimen Hill Granite,Pgzs,#e63319 +Speed Creek Granite,Pgs,#ff33cf +Speed Creek Granite/2,Pgs/2,#ff73f5 +Spider Gully Granodiorite,SDgsg,#d15980 +Spider Gully Granodiorite/g,SDgsg/g,#ff99b8 +Spider Gully Granodiorite/t,SDgsg/t,#ffccff +Spinifex Creek Granite,Cgs,#c92a62 +Spinifex Creek Granite/m,Cgs/m,#eb4785 +Spinifex Creek Granite?,Cgs?,#c92a62 +Spondulix Granodiorite,SDgsp,#ff4a73 +Springbok Sandstone,Jis,#00ff59 +Spurgeon Granite,Pgws,#ffa6a6 +Spyglass Andesite Member,DCn/s,#d9b3ff +Square Post Granite,Ogsq,#e69ebd +Square Rock Granite,Cgzs,#cd6666 +Squirrel Hills Granite,PLgis,#ff6370 +Squirrel Hills Granite/e,PLgis/e,#ff3399 +Squirrel Hills Granite/p,PLgis/p,#ffb8ff +Staaten Metamorphic Group/1a,PLt/1a,#e05219 +Staaten Metamorphic Group/1b,PLt/1b,#e37347 +Staaten Metamorphic Group/1c,PLt/1c,#e88c4d +Staaten Metamorphic Group/2,PLt/2,#f0b373 +Staaten Metamorphic Group/2a,PLt/2a,#eb6640 +Staaten Metamorphic Group/2b,PLt/2b,#ed9178 +Staaten Metamorphic Group/2c,PLt/2c,#eda38a +Staaten Metamorphic Group/3,PLt/3,#f58c47 +Staaten Metamorphic Group/3a,PLt/3a,#f0bd8a +Staaten Metamorphic Group/3b,PLt/3b,#e67a42 +Staaten Metamorphic Group/3c,PLt/3c,#eda17a +Staaten Metamorphic Group/3d,PLt/3d,#d45826 +Staaten Metamorphic Group/3e,PLt/3e,#edb070 +Staaten Metamorphic Group/3f,PLtu/3f,#d74000 +Staaten Metamorphic Group/u,PLtu,#f2a870 +Staaten Metamorphic Group/ua,PLtua,#de6b17 +Staaten Metamorphic Group/ub,PLtub,#f0b07d +Stanbroke Sandstone,PLxs,#66402f +Stanbroke Sandstone?,PLxs?,#66402f +Stanley Limestone Member,Dbm/s,#e6bfff +Stannett Creek Gabbro/c,OSgst/c,#ab94ff +Stannett Creek Gabbro/m,OSgst/m,#ccbfff +Stannett Creek Gabbro/o,OSgst/o,#8a6bff +Stanthorpe Granite,Rgst,#ffb3e6 +Stanthorpe Granite/1,Rgst/1,#ffbff2 +Stanthorpe Granite/2,Rgst/2,#ffa6d9 +Stanthorpe Granite/5,Rgst/5,#fcd6f7 +Stanthorpe Granite/6,Rgst/6,#ff8cbf +Stanthorpe Granite/7,Rgst/7,#ff4073 +Stanthorpe Granite/8,Rgst/8,#e68ce6 +Stanthorpe Granite/a,Rgst/a,#ff73a6 +Stanthorpe Granite/a?,Rgst/a?,#ff73a6 +Stanthorpe Granite/b,Rgst/b,#f2ccff +Stanthorpe Granite/b?,Rgst/b?,#f2ccff +Stanthorpe Granite/c,Rgst/c,#f2bff2 +Stanthorpe Granite/c?,Rgst/c?,#f2bff2 +Stanthorpe Granite/d,Rgst/d,#ffbee8 +Stanthorpe Granite/e,Rgst/e,#e673e6 +Stanthorpe Granite/f,Rgst/f,#e6a6e6 +Stanthorpe Granite/f?,Rgst/f?,#e6a6e6 +Stanthorpe Granite?,Rgst?,#ffb3e6 +Starcross Formation,PLrs,#993333 +Starcross Formation/q,PLrs/q,#ccde4d +Starcross Formation/r,PLrs/r,#ce7678 +Starcross Formation/r,w,#ce7678 +Starcross Formation/rq,PLrs/rq,#aaaa32 +Starlight Granite,Cgts,#e8beff +Staveley Formation/1,PLs/1,#967359 +Staveley Formation/1br,PLs/1br,#b08c73 +Staveley Formation/2,PLs/2,#fad6bd +Staveley Formation/2br,PLs/2br,#e3bfa6 +Staveley Formation/2c,PLs/2c,#5dede9 +Staveley Formation/2m,PLs/2m,#0fb0ef +Staveley Formation/2s,PLs/2s,#66a3d8 +Staveley Formation/3,PLs/3,#634026 +Staveley Formation/3m,PLs/3m,#c9a68c +Staveley Formation/f,PLs/f,#0808e2 +Steeles Granite,PLgss,#f5804c +Stenhouse Creek Amphibolite,PLEbn,#cc334c +Stingo Granite,Cgts,#cd6699 +Stinking Cornishman Microgranite,Cgck,#ff29ff +Stirlington Granite,Cgoi,#a80000 +Stockyard Creek Mudstone Member,PLcs,#d7c29e +Stockyard Creek Mudstone Member?,PLcs?,#d7c29e +Stopem Blockem Conglomerate Member,Duu/s,#c29ed7 +Storm Hill Sandstone,Dwh,#a673cc +Strathburn Formation,PLb,#f5b38f +Strathburn Formation/a,PLb/a,#f28f59 +Strathburn Formation/g,PLb/g,#f28f59 +Strathburn Formation/i,PLb/i,#f28f59 +Strathburn Formation/j,PLb/j,#f28f59 +Strathburn Formation/t,PLb/t,#f28f59 +Strathleven Granite,Dgsl,#f2b3e6 +Strathmay Formation,PLm,#f29e74 +Strathtay Granodiorite,Dgst,#ff80eb +Strathtay Granodiorite?,Dgst?,#ff80eb +Stuarts Rhyolite,Pwc,#1980ff +Stuarts Rhyolite-b/1,Pwb/1,#6b78a3 +Stuarts Rhyolite-b/2,Pwb/2,#8591bd +Stuarts Rhyolite/v,Pwc/v,#40a6ff +Stud Formation,Dds,#a69be0 +Stud Formation/a,Dds/a,#bfb5fa +Stud Formation?,Dds?,#a69be0 +Sturgeon Basalt-TQbs,TQbs,#a6994c +Sturgeon Basalt-TQbs/v,TQbs/v,#d4b85e +Sturgeon Basalt-Tbs,Tbs,#e8c276 +Sturgeon Basalt-Tbs/v,Tbs/v,#cfa85c +Subkin Granodiorite,Cgs,#ff6666 +Sues Creek Microgranite,Cgls,#ff4033 +Sugar Bag Granite,Cgta,#ffd9d9 +Sugarbag Creek Quartzite,PLs,#debf4c +Sugarbag Creek Quartzite/e,PLs/e,#858500 +Sugarbag Creek Quartzite/h2,PLh/2,#5e5e00 +Sugarbag Creek Quartzite/k,PLs/k,#bd8000 +Sugarloaf Metamorphics/v,DCo/v,#c2a1f5 +Sulieman Gneiss,PLsg,#63392a +Sulieman Gneiss/q,PLsg/q,#807340 +Sulieman Gneiss?,PLsg?,#63392a +Sunburst Granodiorite,Ogu,#e899d9 +Sundown Granite,Cgbs,#ff66b3 +Sunnymount Granodiorite,Cgoy,#f29999 +Sunnymount Granodiorite/d,Cgoy/d,#d98080 +Sunnymount Granodiorite/g,Cgoy/g,#bf6666 +Surgeons Lookout Rhyolite,CPis,#d90059 +Surgeons Lookout Rhyolite?,CPis?,#d90059 +Surprise Creek Formation,PLr,#8c6640 +Surprise Creek Formation-a,PLra,#d9b38c +Surprise Creek Formation-a/1,PLra/1,#bf9973 +Surprise Creek Formation-a/2,PLra/2,#a68059 +Surprise Creek Formation-a/3,PLra/3,#8c6640 +Surprise Creek Formation-a/c,PLra/c,#734c26 +Surprise Creek Formation-a/c?,PLra/c?,#734c26 +Surprise Creek Formation-a?,PLra?,#d9b38c +Surprise Creek Formation-b,PLrb,#d9b366 +Surprise Creek Formation-b?,PLrb?,#d9b366 +Surprise Creek Formation-c,PLrc,#bf994c +Surprise Creek Formation-c?,PLrc?,#bf994c +Surprise Creek Formation-d,PLrd,#bfb373 +Surprise Creek Formation-d?,PLrd?,#bfb373 +Surprise Creek Formation/1-PAROO,PLr/1,#734c0d +Surprise Creek Formation/2-PAROO,PLr/2,#a68040 +Surprise Creek Formation/3-PAROO,PLr/3,#734c0d +Surprise Creek Formation/4-PAROO,PLr/4,#664000 +Surprise Creek Formation/do,PLr/do,#a68059 +Surprise Creek Formation/g,PLr/g,#734c26 +Surprise Creek Formation/q,PLr/q,#59330d +Surprise Creek Formation/t,PLr/t,#a68059 +Surprise Creek Formation?,PLr?,#8c6640 +Swamp Creek Granite,Cgoa,#db3366 +Swan Diorite,PLds,#7f00b0 +Sword Creek Microgranite,CPgsw,#eb5273 +Sybella Granite,PLgs,#ff33cc +Sybella Granite/1,PLgs/1,#fc5978 +Sybella Granite/1g,PLgs/1g,#f280ff +Sybella Granite/1m,PLgs/1m,#ff99ff +Sybella Granite/2,PLgs/2,#fc99b8 +Sybella Granite/3,PLgs/3,#f24cfa +Sybella Granite/4,PLgs/4,#d933b3 +Sybella Granite/f,PLgs/f,#ff124d +Sybella Granite/g,PLgs/g,#ffb3ff +Sybella Granite/mg,PLgs/mg,#ffccff +Sybella Granite/p,PLgs/p,#ff59d9 +Tadpole Granite,Dgt,#ff5438 +Talaroo Microgranite,Cgna,#ff5433 +Talaveras Rhyolite,Pvat,#adcff5 +Talbot Creek Granodiorite,PLgt,#d966a6 +Talbot Creek Granodiorite?,PLgt?,#d966a6 +Talgijah Granodiorite/d,Pgyt/d,#db619c +Talgijah Granodiorite/g,Pgyt/g,#f57ab6 +Tam O'Shanter Granite,Ogt,#f03cf0 +Tank Creek Sandstone,Dwk,#cca6ff +Tareela Volcanics/a,Ct/a,#9eb3b3 +Tareela Volcanics/a?,Ct/a?,#9eb3b3 +Tareela Volcanics/b,Ct/b,#c4d9d9 +Tareela Volcanics/l,Ct/1,#788c8c +Tareela Volcanics/l?,Ct/l?,#788c8c +Tarong beds,Ro,#34ada1 +Tate Batholith granitoids-high magnetic,CPgn,#ff7a85 +Tate Batholith granitoids-variably magnetic,CPgtf,#ffa6ad +Tb-QLD,Tb,#ff6940 +Tb/v-Mingela Province,Tb/v,#ff420f +Tb/v-QLD,Tb/v,#ff420f +Tb/v?-QLD,Tb/v?,#ff420f +Tb?-QLD,Tb?,#ff6940 +Td-QLD,Td,#f0ad19 +Td\q-QLD,Td\q,#f0da81 +Tea Tree Granodiorite,Dgtt,#fa4aff +Tectonic breccia,bx,#ffaa00 +Teddy Mount Formation,DCue,#7761c7 +"Teddy Mount Formation,Cir-Kennedy Province","DCue,Cir",#7761c7 +Teddy Mount Formation?,DCue?,#7761c7 +Teddys Creek Granite,Cgotc,#f099a3 +Templeton Granite,PLgsm,#ffbebe +Tenavute Microgranite,Cgnt,#f29980 +Term Supersequence-1-2,PLm,#b35e2e +Term Supersequence-3,PLmh/1-2,#e8c4d4 +Termite Range Formation,PLmt,#cc6666 +Termite Range Formation/1,PLmt/1,#e6a699 +Termite Range Formation/2,PLmt/2,#d98073 +Termite Range Formation/2?,PLmt/2?,#d98073 +Termite Range Formation/3g,PLmt/3g,#e69980 +Termite Range Formation?,PLmt?,#cc6666 +Terrible Creek Granite,Dggt,#ff3333 +Terrica beds,Pt,#33a6f2 +Terrica beds?,Pt?,#33a6f2 +Texas beds,Ctx,#9499b0 +Texas beds/al,Ctx/al,#61667d +Texas beds/c,Ctx/c,#7a8096 +Texas beds/j,Ctx/j,#474c63 +Texas beds/l,Ctx/l,#c7cce3 +Texas beds/m,Ctx/m,#adb3c9 +Texas beds/v,Ctx/v,#c7bfe3 +Texas beds/vg,Ctx/vg,#e0d9fc +Texas beds/w,Ctx/w,#bfcce3 +Tg/v-Mingela Province,Tg/v,#bd28bf +The Fisheries Basalt,TQvf,#deb462 +The Gorge Rhyolite,Cgcg,#ffaa00 +The Maze Granite,Ogt,#d66bbd +The Monument Syenite,PLgtm,#ff1966 +Theodolite Rhyolite/1,Cbt/1,#b3b39e +Theodolite Rhyolite/2,Cbt/2,#ccccb8 +Theodolite Rhyolite/2?,Cbt/2?,#ccccb8 +Thornborough Andesite Member,Cnw/t,#8a8a9e +Thornton Granite,Pgt,#ff7f7f +Three Horse Lagoon Granite,Pgth,#ff73df +Three Mile Microgranite,Cgcm,#c24275 +Three Peaks Complex/d,CPitp/d,#ff944d +Three Peaks Complex/gx,CPitp/gx,#ffb8c4 +Three Peaks Complex/r,CPitp/r,#ffc417 +Three Peaks Complex/rx,CPitp/rx,#ffe08a +Three Sisters Complex/b,CPgts/b,#ab94ff +Three Sisters Complex/g,CPgts/g,#ff80ff +Three Sisters Complex/gx,CPgts/gx,#fc80a6 +Three Sisters Complex/mg,CPgts/mg,#ff7a85 +Three Sisters Complex/r,CPgts/r,#ffc92e +Three Sisters Complex/rx,CPgts/rx,#ffe08a +Three Sisters Complex/sx,CPgts/sx,#99bff7 +Three Sisters Complex/tx,CPgts/tx,#cce0fc +Thunder Egg Rhyolite,Pvae,#444f89 +Thursday Monzogranite,Dgtd,#f2bfbf +Tib-YARROL/SCAG,Tib,#ff6926 +Tib\h-Gt,Tib\h,#ff7a57 +Tib\l-Gt,Tib\l,#ff420f +Tick Hill Complex,PLgti,#ff7099 +Ticklehim Rhyolite,Pwi,#8ca6d9 +Ticklehim Rhyolite?,Pwi?,#8ca6d9 +Tidna Sandstone,PLst,#b08582 +Tiger Hill Microgranite,CPgt,#ffa6e6 +Timber Top Volcanic Subgroup-Cft/a,Cft/a,#637373 +Timber Top Volcanic Subgroup-Pft/b,Pft/b,#73b2ff +Timber Top Volcanic Subgroup/b,CPft/b,#bac2c2 +Timber Top Volcanic Subgroup/r,CPft/r,#919e9e +Timber Top Volcanic Subgroup/t,CPft/t,#d6dbdb +Timber Top Volcanic Subgroup/u,CPft/u,#788787 +Timberoo Member,PLnt,#a83800 +Timberoo Member/v,PLnt/v,#db6b33 +Timothy Creek Sandstone Member,PLjt,#cca680 +Tin Hill Quartzite Member,PLot,#ffe6b3 +Tinaroo Granite,Pgtt,#d62dd6 +Tirrabella Tonalite,Sd,#e8beff +Titania Granite,Cgtt,#ff0000 +Tomato Granite,Ogto,#f580d1 +Tommy Creek Microgranite,PLgt,#ff0f59 +Toms Hole Granodiorite,SDgth,#ff4ccc +Toms Hole Granodiorite?,SDgth?,#ff4ccc +Toole Creek Volcanics/b,PLot/b,#754221 +Toole Creek Volcanics/s,PLot/s,#a87554 +Toole Creek Volcanics?,PLot?,#8cd9a6 +Toomba Basalt,Qbt,#f2f1a5 +Toomba Basalt/v,Qbt/v,#d9d98c +Top Nettle Microgranite,Cgct,#ffa6bf +Top Pinnacle Granite,Dgtp,#ff7a85 +Torpedo Creek Quartzite,PLmp,#cc8a66 +Torpedo Creek Quartzite?,PLmp?,#cc8a66 +Torpys Granite,Cgot,#ff7f7f +Torsdale Volcanics,CPvt,#9ca1b5 +Torsdale Volcanics?,CPvt?,#9ca1b5 +Towers Hill Granite,Ogo,#ff2699 +Townley Formation,PLt,#8a8078 +Townley Formation/s,PLt/s,#70665e +Townley Formation/s?,PLt/s?,#70665e +Townley Formation/x,PLt/x,#574c45 +Townley Formation?,PLt?,#8a8078 +Train Range Ironstone Member,PLsmt,#f58a61 +Train Range Ironstone Member?,PLsmt?,#f58a61 +Trevethan Granodiorite,Pgyv,#ff33ff +Tribute Hills Arenite,Ot,#c456b2 +Trooper Creek Formation,Ost,#b352a1 +Trooper Creek Formation?,Ost?,#b352a1 +Tuckers Igneous Complex/b,Pgt/b,#ccbfff +Tuckers Igneous Complex/gd,Pgt/gd,#ff99b8 +Tuckers Igneous Complex/lgd,Pgt/lgd,#ffbdc2 +Tuckers Igneous Complex/qd,Pgt/qd,#fc80a6 +Tuckers Igneous Complex/qzd,Pgt/qzd,#ffccdb +Tuckers Igneous Complex/zd,Pgt/zd,#ff19ff +Tulliegorim Granodiorite/g,SDgtu/g,#ffbdc2 +Tulliegorim Granodiorite/gd,SDgtu/gd,#ffe6ff +Tulliegorim Granodiorite/t,SDgtu/t,#ffccff +Tully Granite Complex,Pgu,#e03652 +Tully Granite Complex/b,Pgu/b,#fa5975 +Turrets Formation,Dt,#9a73de +Turrets Formation?,Dt?,#9a73de +Turtle Swamp Granite,Dgts,#f266cc +Twelve Mile Schist,PLyt,#996640 +Twiddler Hill Basalt,TQvt,#ebcd4b +Twin Dams Andesite,Cnt,#80abff +Two Creek Granodiorite,Ogtc,#ffd9e6 +Two Mile Granite,SDgtw,#eb5e9d +Two Rail Monzogranite,Dgr,#fa8cff +Unassigned granitoids-SEMI,PLg/m,#cd6666 +Undara Basalt,Qmu,#fae987 +Undara Basalt/v,Qmu/v,#e0cf6e +Undaunted Metamorphics,PLkle,#8c9353 +Undercliffe Falls Monzogranite,PRguf,#d9404a +Undercliffe Falls Monzogranite/3,PRguf/3,#f25963 +Undivided Argylla Igneous Province,PLg/a,#ff3847 +Undivided Lukin Structural Domain,PLlu,#d49e80 +Unnamed metamorphic rocks/d-SD54,PLu/d,#ab94ff +Unnamed metamorphics/1-SD54,PLu/1,#d6d69e +Unnamed metamorphics/1a-SD54,PLu/1a,#b0b078 +Unnamed metamorphics/2-SD54,PLu/2,#858500 +Unnamed metamorphics/3-SD54,PLu/3,#858500 +Unnamed metamorphics/4-SD54,PLu/4,#a6470f +Unnamed metamorphics/5-SD54,PLu/5,#bd754d +Unnamed metamorphics/5a-SD54,PLu/5a,#911900 +Upland Granodiorite,Dgul,#f266b3 +"Upland Granodiorite,Cape River Metamorphics/m","Dgul,PLc/m",#f266b3 +Upland Granodiorite?,Dgul?,#f266b3 +Urdera Granodiorite,SDgu,#ffcce6 +Urdera Granodiorite/d,SDgu/d,#ffb3cc +Urquhart Shale,PLiu,#cc8a59 +Van Dyke Litharenite,Od,#a35289 +Van Dyke Litharenite?,Od?,#a35289 +Van Lee Granite,Sgv,#cc3333 +Vanneck Formation,Ddv,#8f78bf +Vanneck Formation/c,Ddv/c,#755ea6 +Vanneck Formation?,Ddv?,#8f78bf +Venetia Formation,Cct,#adafb3 +Venetia Formation/c,Cct/c,#949699 +Venetia Formation?,Cct?,#adafb3 +Verdure Andesite,Cbe,#e1e1e1 +Verdure Andesite?,Cbe?,#e1e1e1 +Wabaredory Granite,Cgwb,#ffa77f +Wade beds,CPw,#81899c +Wairuna Formation,Ow,#cc6699 +Wairuna Formation/j,Ow/j,#f299cc +Wairuna Formation/j?,Ow/j?,#f299cc +Wairuna Formation/q,Ow/q,#e680b3 +Wairuna Formation/v,Ow/v,#a64073 +Wairuna Formation/v?,Ow/v?,#a64073 +Wairuna Formation?,Ow?,#cc6699 +Wakara Volcanic Subgroup-Pwd,Pwd,#b8c4f0 +Wakara Volcanic Subgroup-Pwd?,Pwd?,#b8c4f0 +Wakara Volcanic Subgroup-Pwf,Pwf,#9eaad7 +Wakara Volcanic Subgroup-Pwf/v,Pwf/v,#004da8 +Wakara Volcanic Subgroup-Pwf?,Pwf?,#9eaad7 +Wakara Volcanic Subgroup-Pwg,Pwg,#8591bd +Wakara Volcanic Subgroup-Pwg?,Pwg?,#8591bd +Wakara Volcanic Subgroup-Pwh,Pwh,#d1def0 +Wakara Volcanic Subgroup-Pwh?,Pwh?,#d1def0 +Wakara Volcanic Subgroup-Pwr,Pwr,#85abd6 +Wakara Volcanic Subgroup-Pwt,Pwt,#3845a3 +Wakara Volcanic Subgroup-Pwx,Pwx,#deebfc +Wakeful Metabasalt Member,PLnmw,#b34c33 +Walford Dolomite,PLfw,#b5948a +Walford Dolomite/b,PLfw/b,#69473d +Walford Dolomite/c,PLfw/c,#9c7a70 +Walkunder Granite,Cgowa,#f5617a +Wallabadah Siltstone,PLsw,#db8a7a +Wallaby beds,Plw,#444f89 +Wallaman Falls Volcanics,CPvw,#b3c2c2 +Wallaman Falls Volcanics?,CPvw?,#b3c2c2 +Wallaroo Basalt,Twb,#e6b855 +Wallis Formation,PLsw,#730000 +Wallis Formation/s,PLsw/s,#a63333 +Walloon Coal Measures,Jw,#08bfa6 +Walloon Coal Measures,w,#08bfa6 +Wallys Dolerite,Pw,#545ed9 +Wallys Dolerite?,Pw?,#545ed9 +Walsh Bluff Volcanics,Pwb,#959fb8 +Walsh Bluff Volcanics/br,Pwb/br,#adb8d1 +Walshs Pyramid Granite,Pgwp,#ff6370 +Wando Vale Subgroup,Dbw,#aa9fe0 +Wangetti Granite,Pgwg,#ff2133 +Wangetti Granite/2,Pgwg/2,#ff6370 +Warang Sandstone,Rw,#43dece +Warang Sandstone/g,Rw/g,#5cf7e8 +Warang Sandstone/m,Rw/m,#0fab9c +Warang Sandstone/s,Rw/s,#29c4b5 +Warang Sandstone?,Rw?,#43dece +Warby Volcanic Subgroup-Cwi/1,Cwi/1,#73d9ff +Warby Volcanic Subgroup-Cwi/2,Cwi/2,#3399ff +Warby Volcanic Subgroup-Pwi/1,Pwi/1,#73b3ff +Warby Volcanic Subgroup-Pwi/2,Pwi/2,#8cccff +Warby Volcanic Subgroup-Pwr,Pwr,#5999ff +Warner Granite,Dgw,#ff694f +Warrina Park Quartzite,PLiw,#e69966 +Warrina Park Quartzite/0-PAROO,PLiw/0,#ffb380 +Warrina Park Quartzite/1-PAROO,PLiw/1,#b36633 +Warrina Park Quartzite/2,PLiw/2,#d9916b +Warrina Park Quartzite/2-PAROO,PLiw/2p,#d9916b +Warrina Park Quartzite/3,PLiw/3,#bf7847 +Warrina Park Quartzite/3-PAROO,PLiw/3,#bf7847 +Warrina Park Quartzite?,PLiw?,#e69966 +Warrior Diorite,Ogwa,#8a6bff +Watch Branch Monzogranite,Dgwb,#c23333 +Watch Hill Granodiorite,Sgwh,#ff80a6 +Waterfall Granite,Pgca,#cc2626 +Watershed North Rhyolite/1,Cw/1,#e1e1e1 +Watershed North Rhyolite/2,Cw/2,#cccccc +Watsonville Granite,Pgow,#ff5433 +Watsonville Granite/m,Pgow/m,#ff6e4c +Weaner Vale Granite,SDgaw,#ff664c +Weberra Granite,PLgb,#e05a79 +Weberra Granite/r,PLgb/r,#c7405e +Welfern Granite,PLgw,#cc4c4c +Wellington Springs Tonalite,SDgws,#ffa673 +West Creek Diorite,Pgwc,#eb50e3 +Westbourne Formation,Jiw,#0fa37c +Westgrove Ironstone Member,Jew,#36ba62 +Westmoreland Conglomerate,PLtw,#ffc59e +Wharleys Tonalite,SDgw,#ff99c2 +Whelan Creek Granite,Cgcw,#ff5500 +Whiphole Spring Granite,Cgwh,#d93333 +Whistler Granite,Cgow,#c20085 +White Blow Formation,PLpw,#bfab91 +White Blow Formation/g,PLpw/g,#d9c4ab +White Blow Formation/l,PLpw/l,#a69178 +White Blow Formation/m,PLpw/m,#a69178 +White Blow Formation/q,PLpw/q,#8c785e +White Blow Formation/s,PLpw/s,#735e45 +White Blow Formation/x,PLpw/x,#8c785e +White Bull Member,PLcw,#a38a5e +White Bull Member?,PLcw?,#a38a5e +White Crystal Granite,Cgwc,#b52ba0 +White Springs Granodiorite/1,Sgw/1,#ff59c4 +White Springs Granodiorite/2,Sgw/2,#ff2691 +White Springs Granodiorite/3,Sgw/3,#ff73de +White Springs Granodiorite/4,Sgw/4,#ff40ab +White Springs Granodiorite/5,Sgw/5,#ff99ff +White Springs Supersuite-Sg,Sg,#ff73df +Whitewater Creek Granite,Cgw,#cc598c +Whitworth Quartzite,PLhw,#f2a659 +Whitworth Quartzite/1,PLhw/1,#bf7326 +Whitworth Quartzite/1-PAROO,PLhw/1,#bf7326 +Whitworth Quartzite/2,PLhw/2,#d98c40 +Whitworth Quartzite/2-PAROO,PLhw/2,#d98c40 +Whitworth Quartzite/3,PLhw/3,#a6590d +Whitworth Quartzite/3-PAROO,PLhw/3,#a6590d +Whitworth Quartzite/4-PAROO,PLhw/4,#ffbf73 +Whitworth Quartzite/s,PLhw/s,#cc7326 +Whitworth Quartzite/v,PLhw/v,#ffcc80 +Whitworth Quartzite?,PLhw?,#f2a659 +Whypalla Granite,Pgww,#b84770 +Whypalla Granite/l,Pgww/l,#d1618a +Widdallion Sandstone Member,PLmh/5,#a68040 +Wide Supersequence,PLmh/4-5,#f0dbb8 +Widgewarra Granite,PLgsw,#ff7580 +Wiggle Waterhole Metagabbro,PLdw,#3842d1 +Wild Granite,Cgci,#e63333 +Wild Granite?,Cgci?,#e63333 +Wilderness Granite,Cgtw,#de59b3 +Wilkie Gray Group,Dw,#665999 +Williams Supersuite,PLgi,#ff9e9e +Williams Supersuite/a,PLgi/a,#ffb8b8 +Williams Supersuite/d,PLgi/d,#8033ff +Williams Supersuite/g,PLgi/g,#e65252 +Williams Supersuite/hm?,PLgi/hm?,#ffd1d1 +Williams Supersuite/lm?,PLgi/l?,#cc3838 +"Williams Supersuite/lm?,Millungera Basin succession","PLgi/l?,Pzm",#cc3838 +Wills Creek Granite,PLgl,#d64575 +Wills Creek Granite?,PLgl?,#d64575 +Wimberu Granite,PLgim,#ff8a94 +Wimberu Granite/a,PLgim/a,#ff4d5c +Wimberu Granite/b,PLgim/b,#ff2133 +Wimberu Granite/x,PLgim/x,#ff4263 +Wimberu Granite?,PLgim?,#ff8a94 +Winston Churchill Granite,PLgwc,#ffb3ff +Wipella Granodiorite,Dgwi,#ffbebe +Wire Creek Sandstone,PLti,#4f3628 +Wireyard Granite,Cgzw,#c22652 +Wollenden Rhyolite/1,Pwa/1,#6680b3 +Wollenden Rhyolite/2,Pwa/2,#334c99 +Wollenden Rhyolite/2r,Pwa/2r,#c4d4ff +Wollenden Rhyolite/3,Pwa/3,#99b3cc +Wollenden Rhyolite/3x,Pwa/3x,#d9e6e6 +Wollenden Rhyolite/l,Pwa/l,#001980 +Wollogorang Formation,PLto,#cd8966 +Wombinoo Granite,CPgwb,#ffb8db +Womblealla Rhyolite Member,Cmiw,#828282 +Womblealla Rhyolite Member/r,Cmiw/r,#69695c +Wonga Granite,PLgw,#ff6380 +Wonnemarra Rhyolite,PLrw,#997866 +Wonomo Granite,PLgsn,#ff7f7f +Woodleigh Granodiorite,Cgaw,#ff4c66 +Woogaroo Subgroup,RJbw,#088261 +Woongalee Granodiorite,Dgwg,#e6809e +Woonigan Granite,PLgka,#e6376e +Woonigan Granite?,PLgka?,#e6376e +Worcester Granodiorite,Cgw,#ffbee8 +Worcester Granodiorite/l,Cgw/i,#ff99cf +Wotan Granodiorite,Cgw,#f57ab6 +Wotan Granodiorite?,Cgw?,#f57ab6 +Wulpan Monzogranite,Dgwu,#d9408c +Wurruma Granite,Cgow,#cc3399 +Yambo Metamorphic Group and undivided granitoids,Geophysics,#ff4a71 +Yambo Metamorphic Group-PLyh,PLyh,#cd8966 +Yambo Metamorphic Group-SE54-16,PLy,#c3730d +Yambo Metamorphic Group/g,PLyy/g,#cc4c66 +Yambo Metamorphic Group/h,PLyy/h,#8c660d +Yambo Metamorphic Group/m,PLyy/m,#e6a380 +Yambo Metamorphic Group/u,PLyy/u,#1926c9 +Yambo Metamorphic Group/u-SE54-16,PLyu,#d98c26 +Yappo Member,PLhgy,#cc9c6b +Yappo Member/cg,PLhgy/c,#e6bf8c +Yappo Member?,PLhgy?,#cc9c6b +Yaringa Metamorphics,PLly,#785238 +Yaringa Metamorphics/p,PLly/p,#ab856b +Yarman Formation,PLy,#8a4c2b +Yarrabah Granite,Pgcya,#ff7f7f +Yarraden Schist,PLcy,#f2b573 +Yarraman Sandstone Member,Ddsy,#d9d1f2 +Yarrie Rock Waterhole Granite,PLgyr,#f2575e +Yarrol Formation?,Pr?,#31bde0 +Yataga Granodiorite/1,Pgy/1,#fcadcc +Yataga Granodiorite/2,Pgy/2,#e08fad +Yates Creek Basalt,Qby,#ffe28a +Yeldham Granite,PLgy,#cf3c5c +Yeldham Granite?,PLgy?,#cf3c5c +Yellow Jacket Rhyolite,Cny,#d9e6e6 +Yellow Jacket Rhyolite/1,Cny/1,#8cb3b3 +Yellow Jacket Rhyolite/b,Cny/b,#669999 +Yellow Jacket Rhyolite/s,Cny/s,#b3cccc +Yellow Waterhole Granite,PLgiy,#f05de4 +Yellowood Granodiorite,Dgyw,#cf6680 +Yering Granodiorite,Dgyi,#ff8c80 +Yintjingga Fault Zone,YFZ,#ffffff +Yokas Microgranite,Pgy,#d94c40 +Yuccabine Granodiorite,Pgyu,#eb33cc +Yulga Tonalite,SDgyu,#d669b3 +a-MI,a,#e64c00 +bx-Gt,bx,#e69800 +bx-SF5501,bx,#e69800 +bx?-SF5501,bx?,#e69800 +dl-7763,dl,#704489 +dl-BVSP,dl,#704489 +dl-Croydon,dl,#704489 +dl-Gt,dl,#704489 +dl-HAS,dl,#704489 +dl-SELW,dl,#bd20f5 +dl-YAMBO,dl,#704489 +dl/2-7763,dl/2,#704489 +dl?-Croydon,dl?,#704489 +do-MI,do,#9100cc +do-MI,Selwyn,#9e0979 +do/1-MI,do/1,#b800f2 +do/1?-MI,do/1?,#b800f2 +do/2-MI,do/2,#ab94ff +do/3-MI,do/3,#c44cff +do/3?-MI,do/3?,#c44cff +do/4-MI,do/4,#d126e6 +do/4?-MI,do/4?,#d126e6 +do/6-MI,do/6,#d166ff +do?-MI,do?,#9100cc +dolerite in Kuridala Group,PLr/d,#8033f2 +dolerite in Soldiers Cap Group,PLo/d,#a659f2 +po-6759,po,#894465 +q-Gt,q,#ffbebe +q-MI,q,#ffbebe +rh-6759,rh,#ffaa00 +rh-Gt,rh,#ffaa00 +sp-7859,sp,#00781c +tr-6759,tr,#ff6619 +trachyandesite-Mount Elliott,PLd/t,#e7660f +trondhjemite in Soldiers Cap Group,PLo/t,#ff70ba +NA,NA,#c8f7ef diff --git a/packages/map2loop/src/map2loop/_datasets/clut_files/SA_clut.csv b/packages/map2loop/src/map2loop/_datasets/clut_files/SA_clut.csv new file mode 100644 index 000000000..287ce05c1 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/clut_files/SA_clut.csv @@ -0,0 +1,132 @@ +UNITNAME,code,colour +test_all,PolyStyle00,#e6ffcc +Unnamed_GIS_Unit___see_description,PolyStyle00,#e6ffcc +Birksgate_Complex,PolyStyle01,#66b3b3 +Pitjantjatjara_Supersuite,PolyStyle07,#ff4d4d +Manuka_Subgroup,PolyStyle022,#b3ffe6 +Eyre_Formation,PolyStyle043,#ffe600 +Bulldog_Shale,PolyStyle051,#ccff99 +Alcurra_Dolerite,PolyStyle054,#00ff00 +Amata_Dolerite,PolyStyle054,#00ff00 +Oodnadatta_Formation,PolyStyle059,#b3ff4d +Coorikiana_Sandstone,PolyStyle059,#b3ff4d +Algebuckina_Sandstone,PolyStyle076,#b3ffb3 +Polda_Formation,PolyStyle076,#b3ffb3 +Giles_Complex,PolyStyle095,#9900ff +Waitoona_beds,PolyStyle0764,#b3ffff +Radium_Ridge_Breccias,PolyStyle0764,#b3ffff +Wataru_Gneiss,PolyStyle0767,#cc0000 +Dutton_Suite,PolyStyle0767,#cc0000 +Doonbara_Formation,PolyStyle060,#ffe6e6 +Yerelina_Subgroup,PolyStyle060,#ffe6e6 +Koolunga_Gravel,PolyStyle060,#ffe6e6 +Punkerri_Sandstone,PolyStyle0774,#ffe6cc +Garford_Formation,PolyStyle0774,#ffe6cc +Pound_Subgroup,PolyStyle0774,#ffe6cc +Trainor_Hill_Sandstone,PolyStyle0875,#ff4dff +Pindyin_Sandstone,PolyStyle0878,#b34d66 +Callanna_Group,PolyStyle0878,#b34d66 +Mimili_Formation,PolyStyle0916,#4d9999 +Munda_Group,PolyStyle0919,#990080 +Chambers_Bluff_Tillite,PolyStyle0952,#cc9980 +Murnaroo_Formation,PolyStyle0963,#ffe699 +Simmens_Quartzite_Member,PolyStyle0963,#ffe699 +ABC_Range_Quartzite,PolyStyle0963,#ffe699 +Table_Hill_Volcanics,PolyStyle01005,#ff99e6 +Bollaparudda_Subgroup,PolyStyle01005,#ff99e6 +Wright_Hill_beds,PolyStyle01007,#cc9999 +Wallaroo_Group,PolyStyle01007,#cc9999 +Wantapella_Volcanics,PolyStyle01328,#66ff00 +Varavaranha_Formation,PolyStyle01328,#66ff00 +Wirrildar_beds,PolyStyle0874,#ff6699 +Wilpena_Group,PolyStyle01690,#ffe6b3 +Rodda_beds,PolyStyle01690,#ffe6b3 +Peake_Metamorphics,PolyStyle01866,#ccccb3 +Wirriecurrie_Granite,PolyStyle02046,#ff6600 +Burra_Group,PolyStyle02352,#b39966 +Emeroo_Subgroup,PolyStyle02361,#994d4d +Yudnamutana_Subgroup,PolyStyle03325,#b39999 +Nullarbor_Limestone,PolyStyle03642,#ff994d +Rowland_Flat_Sand,PolyStyle03642,#ff994d +Umberatana_Group,PolyStyle03661,#e6ccb3 +Mount_Woods_Complex,PolyStyle03685,#999900 +Warrow_Quartzite,PolyStyle03685,#999900 +Hutchison_Group,PolyStyle03685,#999900 +Barossa_Complex,PolyStyle03685,#999900 +Mulgathing_Complex,PolyStyle03807,#804d99 +Glenloth_Granite,PolyStyle03807,#804d99 +Hiltaba_Suite,PolyStyle02394,#ff0000 +Bimbowrie_Suite,PolyStyle02394,#ff0000 +Crocker_Well_Suite,PolyStyle02394,#ff0000 +Cultana_Subsuite,PolyStyle02394,#ff0000 +Billeroo_Intrusive_Complex,PolyStyle02394,#ff0000 +Eba_Formation,PolyStyle03869,#e6994d +Ooldea_Sand,PolyStyle0556,#ffe680 +Barton_Sand,PolyStyle0556,#ffe680 +Loxton_Sand,PolyStyle0556,#ffe680 +Norwest_Bend_Formation,PolyStyle0556,#ffe680 +Hallett_Cove_Sandstone,PolyStyle0556,#ffe680 +Wilgena_Hill_Jaspilite,PolyStyle03876,#00ffff +Coulthard_Suite,PolyStyle04592,#ff8000 +Peter_Pan_Supersuite,PolyStyle04592,#ff8000 +Willawortina_Formation,PolyStyle0188,#ffff00 +Tarcoola_Formation,PolyStyle04771,#cccccc +Mobella_Tonalite,PolyStyle04924,#ff4d80 +Labyrinth_Formation,PolyStyle04991,#4d0000 +Mentor_Formation,PolyStyle05149,#e6b380 +Corunna_Conglomerate,PolyStyle05149,#e6b380 +Blue_Range_beds,PolyStyle05149,#e6b380 +Leigh_Creek_Coal_Measures,PolyStyle05293,#4dffcc +Pepegoona_Porphyry,PolyStyle05355,#9966ff +Wisanger_Basalt,PolyStyle05355,#9966ff +Moolawatana_Suite,PolyStyle05414,#e64dff +Petermorra_Volcanics,PolyStyle05440,#ccffff +Saint_Kilda_Formation,PolyStyle05531,#cccc99 +Pandurra_Formation,PolyStyle05583,#ccb300 +Gairdner_Dolerite,PolyStyle06020,#00cc66 +Engenina_Monzogranite,PolyStyle06079,#ff9999 +St_Peter_Suite,PolyStyle06079,#ff9999 +Tunkillia_Suite,PolyStyle06198,#ff8099 +Basso_Suite,PolyStyle06225,#ff4d00 +Donington_Suite,PolyStyle06225,#ff4d00 +Nancatee_Granite,PolyStyle06225,#ff4d00 +Munjeela_Suite,PolyStyle06226,#800000 +Sleaford_Complex,PolyStyle06463,#664d99 +Muckanippie_Suite,PolyStyle06478,#00ffb3 +Bumbumbie_Suite,PolyStyle06538,#0099b3 +Bridgewater_Formation,PolyStyle038,#ffff4d +Glanville_Formation,PolyStyle038,#ffff4d +Lady_Louise_Suite,PolyStyle06703,#00804d +Coolanie_Gneiss,PolyStyle06871,#0000b3 +St_Francis_Suite,PolyStyle06924,#ff6666 +Cooyerdoo_Granite,PolyStyle07130,#4d0066 +Price_Metasediments,PolyStyle07363,#80ff00 +Normanville_Group,PolyStyle07365,#b3ccff +Willyama_Supergroup,PolyStyle07417,#cccc00 +Silver_City_Suite,PolyStyle07430,#ff8066 +Moola_Suite,PolyStyle07430,#ff8066 +Eucarro_Rhyolite,PolyStyle07643,#4de6e6 +Pinbong_Suite,PolyStyle07914,#ffb300 +_,PolyStyle07983,#e6ffff +Spilsby_Suite,PolyStyle08147,#ff00cc +Wertigo_Granite,PolyStyle08197,#e66666 +Boucaut_Volcanics,PolyStyle08245,#66b3ff +Miltalie_Gneiss,PolyStyle08248,#ff4db3 +Corny_Point_Paragneiss,PolyStyle08248,#ff4db3 +Gawler_Range_Volcanics,PolyStyle08251,#6666e6 +Tip_Top_Granite,PolyStyle08379,#cc4d80 +Coomandook_Formation,PolyStyle05936,#ffffe6 +Kangaroo_Island_Group,PolyStyle08947,#b399cc +Moody_Suite,PolyStyle05511,#e69999 +Nuyts_Volcanics,PolyStyle09386,#b34db3 +Keynes_Subgroup,PolyStyle09419,#ffcce6 +Kanmantoo_Group,PolyStyle09419,#ffcce6 +Padthaway_Formation,PolyStyle09439,#e6ffb3 +Bosanquet_Formation,PolyStyle09625,#ff99ff +Truro_Volcanics,PolyStyle09905,#b399ff +Broken_Hill_Group,PolyStyle010060,#00ff80 +Fulham_Sand,PolyStyle05,#ffffb3 +Mount_Gee_Sinter,PolyStyle010830,#e6ff00 +Poodla_Granodiorite,PolyStyle011275,#4d00ff +Coonta_Gabbro,PolyStyle011336,#00e666 +Mount_Crawford_Granite_Gneiss,PolyStyle04272,#e69900 \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/clut_files/WA_clut.csv b/packages/map2loop/src/map2loop/_datasets/clut_files/WA_clut.csv new file mode 100644 index 000000000..8fdd4e276 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/clut_files/WA_clut.csv @@ -0,0 +1,1127 @@ +UNITNAME,code,colour +Hart_Dolerite,P___ha_od,#8EE4B4 +Broome__Mowla_and_Melligo_Sandstones,K__bm_st,#DFFEB8 +King_Leopold_Sandstone,P__KMl_st,#ECCBA7 +Yampi_Formation,P__KMy_sta,#ECCBA7 +Wallal_Sandstone,J__wa_st,#ADFED5 +Pentecost_Sandstone,P__KMp_st,#ECCBA7 +Carson_Volcanics,P__KMc_bb,#D2F4E1 +Warton_Sandstone,P__KMw_st,#F5E5D3 +Gidley_Granophyre,A_FFgi_gv,#FEBFBA +Erskine_Sandstone,R__er_st,#BAFCEC +Wotjulum_Porphyry,P___wj_gmap,#FECFCB +Maitland_River_Supersuite,A_MR_g,#FE9E98 +Jarlemai_Siltstone,J__ja_sl,#DFFEB8 +Miaree_Granite,A_MRmi_gm,#FE9E98 +Winning_Group,K_WN_sf,#DFFEB8 +Fortescue_Group,A_FO_od,#8EE4B4 +Elgee_Siltstone,P__KMe_xsl_kd,#E6A89A +Hearson_Cove_Monzogranite,A_MRhe_gmp,#FE9E98 +Mount_Roe_Basalt,A_FOr_b,#C4C798 +Noonkanbah_Formation,P__no_sf,#B5E1FC +Bastion_Group,P__BA_s,#D5B9AA +Gidley_Granophyre,A_FFgi_og,#A5E9C3 +Kylena_Formation,A_FOk_b,#C4C798 +Antrim_Plateau_Volcanics,E__ap_xbb_s,#EFBEE7 +Speewah_Group,P__SP_s,#E99ECE +Louden_Volcanic_Member,A_CDbl_xb_s,#63FD67 +Regal_Formation,A__re_b,#D4EFB9 +Cleaverville_Formation,A_GCe_ca,#6BC3F9 +Grant_Group,CP_GR_sepg,#9DD7FB +Weaber_Group,C_WE_sk,#C8D2D5 +Cockatoo_Group,D_CO_sp,#E0E4FD +Carlton_Group,EO_CA_sk,#EFBEE7 +Paperbark_Supersuite,P__PB_xg_o,#FE9E98 +Marboo_Formation,P___mr_mh,#93911E +Hardey_Formation,A_FOh_xs_f,#F1D8BD +Roebourne_Group,A_RO_xb_u,#E9E6FE +Black_Hill_Well_Monzogranite,A_OPbl_gm,#FD5E53 +Andover_Intrusion,A_OPan_xo_a,#78DEA4 +Eramurra_Monzogranite,A_MRer_gm,#FE9E98 +Tumbiana_Formation,A_FOt_xb_k,#D5D7B6 +Frezier_Sandstone,K__fz_st,#BEFE72 +Sisters_Supersuite,A_ST_xg_o,#F492CA +Warnbro_Group,K_WR_ss,#D4FEA1 +Caines_Monzogranite,A_MRca_gm,#FE9E98 +Red_Hill_Volcanics,A_WCr_f,#FEE79F +Coolyena_Group,K_CY_xk_s,#E9FFD0 +Ruins_Dolerite,P___ru_mod,#3DE1B6 +Mount_Barren_Group,P__MB_mh,#F6C292 +Keep_Inlet_Formation,P_KUk_sepg,#D1DBDE +Jeerinah_Formation,A_FOj_xs_b,#DDDFC4 +Weeli_Wolli_Formation,P__HAj_xci_od,#E0CABF +Brockman_Iron_Formation,P__HAb_cib,#84CDFA +Blina_Shale,R__bl_sl,#8CFADF +Poole_Sandstone,P__po_st,#9DD7FB +Liveringa_Group,P_LI_s,#B5E1FC +Eneabba_Formation,J__en_ss,#ADFED5 +Fairfield_Group,DC_FA_xk_sf,#DDE4E6 +Parda_Formation,K__pr_sf,#BEFE72 +Emeriau_Sandstone,IP__em_st,#DFFEB8 +Leeuwin_Inlier_metagranitic_unit,P_E_mgn_PJLE,#FB9FFC +Cadda_Formation,J__cd_sf,#98FECA +Upper_Cretaceous_carbonate_rocks__greater_Carnarvon_Basin,K_kl_WC,#D4FEA1 +Maddina_Formation,A_FOm_b,#EEEFE2 +Lillybooroora_Conglomerate,DC__li_scp,#D5DBFD +Cattamarra_Coal_Measures,J__cm_slh,#ADFED5 +Yarragadee_Formation,J__ya_st,#6FFDB6 +Wagina_Sandstone,P__wg_st,#6BC3F9 +Leeuwin_Inlier_metamorphosed_mafic_intrusive_unit,P__mof_PJLE,#62D895 +Forestier_Bay_Granodiorite,A_OPfo_gg,#FD5E53 +Millyit_Sandstone,R__mi_sr,#A3FBE5 +Sherlock_Intrusion,A_STse_xo_a,#A5E9C3 +Nickol_River_Formation,A__nk_s,#D6C8CD +Rea_Dacite,A_OPre_fdp,#FD5E53 +Ningbing_Group,D_NI_kl,#D5DBFD +South_West_Terrane_greenstones,A_xmno_mni_YSW,#B7C7C2 +Leederville_Formation,K_WRl_ss,#D4FEA1 +Callawa_Formation,K__ca_sp,#BEFE72 +Malu_Formation,P__LAm_stq,#D09587 +Lancelin_Formation,K_CYl_chl,#E9FFD0 +Lesueur_Sandstone,R__le_st,#D1FDF2 +Kockatea_Shale,R__kk_sl,#A3FBE5 +Mingenew_Formation,P__mi_ss,#CEEBFD +Tumblagooda_Sandstone,OS__tu_st,#E6C1FF +Woodada_Formation,R__wo_ss,#A3FBE5 +Otorowiri_Formation,JK_PAo_sfl,#DFFEB8 +Cardup_Group,P__CD_s,#DDA365 +Mount_Crofton_Granite,P___cr_g,#FE8E87 +Yilgarn_Craton_granites,A_mgn_Y,#FE6FB8 +South_West_Terrane_greenstones,A_mw_YSW,#78DEA4 +Biranup_Zone_metagranitic_unit,AP__mgn_KKBB,#FEBBDD +South_West_Terrane_greenstones,A_mlsm_YSW,#FEE286 +Yilgarn_Craton_granites,A_g_Y,#FECFCB +South_West_Terrane_greenstones,A_mdnf_YSW,#BDA35F +Billeranga_Subgroup,P__OAB_xss_b,#F5D06E +Osborne_Formation,K_CYo_sll,#BEFE72 +Youanmi_Terrane_greenstones,A_o_YYO,#BCEED2 +Goose_Hole_Group,E_GH_xss_kl,#EFBEE7 +Wittenoom_Formation,A_HAd_kd,#E0CABF +South_West_Terrane_cataclasite,AP__myyf_YSW,#B6C01B +Brassey_Range_Formation,P__MVb_st,#FAD1C1 +Taliwanya_Formation,P__THt_sta,#DFB9AF +Alexander_Formation,J__ax_ss,#C1FEE0 +Munkayarra_Shale,R__my_sl,#76F9D9 +Yilgarn_Craton_metamorphic_unit,A_mn_Y,#B7B8B8 +Opaline_Well_Intrusion,A_STop_xo_a,#A5E9C3 +Millindinna_Intrusion,A_STmi_xo_a,#A5E9C3 +Mallina_Formation,A_CDm_s,#F7B588 +West_Pilbara_Superterrane_mylonitic_unit,A_myy_PWP,#FE98CC +Pinnacle_Hill_Gneiss,A_RApi_mgtn,#FFDFDD +Portree_Suite,A_STP_g,#FEBFBA +Pilbara_Supergroup,A_PI_mu,#B1A6FC +North_Star_Basalt,A_WAn_b,#63FD67 +Emu_Pool_Supersuite,A_EM_g,#F492CA +Myanna_Leucogranite,A_SRmy_gml,#FD7E75 +Chillerina_Granodiorite,A_STci_ggh,#FEBFBA +Northampton_Inlier_gneissic_unit,P__mnqf_PJNO,#FCA4F4 +Paterson_Formation,CP__pa_sepg,#9DD7FB +Parmelia_Group,JK_PA_st,#A9FD43 +Northampton_Inlier_granitic_unit,P__g_PJNO,#FE6FB8 +Sally_Downs_Supersuite,P__SD_xg_o,#FD5E53 +Famennian_reef_complexes__platform_facies,D__ap_klsp,#CAD2FC +Youanmi_Terrane_greenstones,A_mu_YYO,#B1A6FC +Proterozoic_mafic_intrusive_unit,P__od,#4BD386 +Lamboo_Province_mafic__ultramafic_intrusive_unit,P__xo_a_LM,#BCB3FD +Youanmi_Terrane_greenstones,A_b_YYO,#C4FEC6 +Mahony_Group,D_MA_sp,#C0C8FB +Devonian_conglomerates_associated_with_reef_complexes,D__rc_sbp,#E0E4FD +Northampton_Inlier_metamorphosed_mafic_intrusive_unit,P__mog_PJNO,#A5E9C3 +Kialrah_Rhyolite,A_CDk_frb,#FED656 +Youanmi_Terrane_greenstones,A_s_YYO,#BBC8CE +Pilbara_Craton_greenstones,A_a_P,#C8C0FD +Duffer_Formation,A_WAd_f,#FED656 +Apex_Basalt,A_WAa_b,#D8FFD9 +Black_Range_Dolerite_Suite,A_BL_od,#8EE4B4 +Pilbara_Craton_greenstones,A_musr_P,#D3CCFD +Warakurna_Supersuite,P__WK_od,#6EE9C8 +Pilbara_Craton_greenstones,A_mog_P,#8EE4B4 +Tambina_Supersuite,A_TA_mg,#F066B6 +Pinjian_Chert_Breccia,AP___pj_ccx,#F7D7A0 +Davis_Dolerite,E__dv_od,#8EE4B4 +Eastern_Goldfields_Superterrane_greenstones,A_u_YEG,#B1A6FC +Eastern_Goldfields_Superterrane_greenstones,A_o_YEG,#BCEED2 +Eastern_Goldfields_Superterrane_greenstones,A_b_YEG,#C4FEC6 +Prenti_Dolerite,P__WKgp_od,#78DEA4 +Eastern_Goldfields_Superterrane_greenstones,A_og_YEG,#8EE4B4 +Eastern_Goldfields_Superterrane_greenstones,A_s_YEG,#E3DDDB +Carawine_Dolomite,A_HAc_kds,#CAA894 +Samuel_Formation_and_Bejah_Claystone,K__sb_sf,#BEFE72 +Orpheus_Supersuite,A_OP_xo_a,#78DEA4 +Toorare_Tonalite,A_MRto_mgta,#FE9E98 +Northampton_Inlier_metasedimentary_unit,P__mtq_PJNO,#D2C4C9 +Cistern_Formation,A_CDi_xs_fnv,#FDC544 +Eastern_Goldfields_Superterrane_greenstones,A_uk_YEG,#BCB3FD +Yilgarn_Craton_granites,A_mgss_Y,#FECFCB +Biranup_Zone_metagranitic_unit,AP__xmggn_mgmn_KKBB,#FCC5FC +South_West_Terrane_greenstones,A_mwa_YSW,#3CFD41 +Yilgarn_Craton_granites,A_xgm_gr_Y,#FEAEA9 +Munglinup_Gneiss,AP___mu_xmgn_mo,#FEC1E1 +Salisbury_Gneiss,P___sb_xmln_mwo,#099BF5 +Bunbury_Basalt,K__bu_bb,#B3FE5A +South_West_Terrane_greenstones,A_mtq_YSW,#EC8526 +Northern_Foreland_metagranitic_unit,A_xmgm_mgr_AFON,#FEAEA9 +South_West_Terrane_greenstones,A_mf_YSW,#FEE286 +Collie_Group,P_CL_snh,#9DD7FB +South_West_Terrane_greenstones,A_xmo_ma_YSW,#9080FB +Nornalup_Zone_metagranitic_unit,P__jmgnn_mog_KKBN,#FBA7FA +Esperance_Supersuite,P__EP_g,#FC91F2 +Recherche_Supersuite,P__RE_xmgn_mg,#FBA7FA +Nornalup_Zone_gneissic_unit,P__mnqf_KKBN,#FCA4F4 +Yilgarn_Craton_granites,A_gg_Y,#FEAEA9 +Northern_Foreland_metagranitic_unit,A_xmgss_mgg_AFON,#FEAEA9 +Northern_Foreland_metagranitic_unit,A_mgn_AFON,#FEC1E1 +Northern_Foreland_metagranitic_unit,AP__xmg_mo_AFON,#F494C7 +Yilgarn_Craton_granites,A_gy_Y,#FECFCB +Northern_Foreland_unit,AP__mtq_AFON,#E3DDDB +Moodini_Supersuite,P__MD_xg_og,#FEE2BD +Binneringie_Dyke,P__WIbi_o,#4BD386 +Eastern_Goldfields_Superterrane_greenstones,A_up_YEG,#9080FB +Eastern_Goldfields_Superterrane_greenstones,A_f_YEG,#FEE79F +Whitewater_Volcanics,P__PBww_f,#FEDC6E +Northampton_Inlier_metasedimentary_unit,P__mdn_PJNO,#E3DDDB +Ilma_Formation,P__BUi_kdov,#FEE5CC +Youanmi_Terrane_greenstones,A_f_YYO,#FEE8A6 +Bandalup_Ultramafics,A__bp_muk,#C4FEC6 +Youanmi_Terrane_greenstones,A_mtq_YYO,#DAD2CF +Maydon_Basalt,A__mo_mbb,#63FD67 +Yilgarn_Craton_granites,A_mgs_Y,#FEBFBA +Manyutup_Tonalite,A__ma_gt,#FEAEA9 +Annabelle_Volcanics,A__ab_fd,#FEE79F +Stirling_Range_Formation,P___sr_mh,#F9DABE +Yilgarn_Craton_granites,A_gch_Y,#FD5E53 +Nangetty_Formation,CP__na_sepg,#84CDFA +Nanutarra_Formation,K__na_sz,#D4FEA1 +High_Cliff_Sandstone,P__hi_st,#B5E1FC +Nilling_Formation,P___ni_st,#F5D06E +Bililly_Formation,P__BDb_ss,#F9DF9E +Lyons_Group,CP_LY_sepg,#CEEBFD +Byro_Group__upper,P_BYU_sf,#A9DCFC +Kennedy_Group,P_KE_ss,#B5E1FC +Moorarie_Supersuite,P__MO_g,#FDADE6 +Leake_Spring_Metamorphics,P__LS_xmd_mk,#F7CEA8 +Mount_Minnie_Group,P__MK_s,#D2C7A6 +Boolgeeda_Iron_Formation,P__HAo_ci,#B5E1FC +Mount_McRae_Shale_and_Mount_Sylvia_Formation,A_HAu_xsl_ci,#B6846A +Widgiemooltha_Supersuite,P__WI_o,#1EC868 +Eastern_Goldfields_Superterrane_greenstones,A_fa_YEG,#FFF3CF +Mount_House_Group,P__HU_se,#FBCB8C +Youanmi_Terrane_greenstones,A_mw_YYO,#78DEA4 +Yelma_Formation,P__ETy_sz,#C0967F +Narryer_Terrane_greenstones,A_f_YNA,#FEE79F +Killara_Formation,P__YMk_bb,#FEE5D2 +Eastern_Goldfields_Superterrane_greenstones,A_mnqf_YEG,#CFDAD7 +Fortescue_Group,A_FO_xo_a,#BCEED2 +Kulkatharra_Dolerite,P__WKku_od,#8EE4B4 +South_West_Terrane_greenstones,A_mi_YSW,#6BC3F9 +Narryer_Terrane_granitic_unit,A_g_YNA,#FECFCB +Carranya_Formation,O__ca_sp,#EEB1FE +Kimberley_Group__lower,P__KML_xs_bb,#E7BE91 +Louisa_Downs_Group,P__LD_sk,#F5D4E9 +Fitzroy_Volcanics,NM__fi_i,#F7D886 +Oscar_Range_Group,P__OS_xs_b,#C0967F +Eastern_Goldfields_Superterrane_greenstones,A_bs_YEG,#8AFE8D +Woongarra_Rhyolite,P__HAw_fr,#CAA894 +Pilbara_Supergroup,A_PI_xmb_mu,#C4FEC6 +Whundo_Group,A_WH_xb_f,#FED473 +Constantine_Sandstone,A_CDc_s,#FBDAC3 +Jean_Well_Granodiorite,A_MRje_gg,#FE9E98 +Maitland_Intrusion,A_STma_xo_a,#A5E9C3 +Yilgarn_Craton_granites,A_gp_Y,#FD319A +Yilgarn_Craton_granites,A_gmp_Y,#FECFCB +Yilgarn_Craton_granites,A_gc_Y,#FE9E98 +Holmwood_Shale,P__ho_sh,#84CDFA +Narryer_Terrane_greenstones,A_mwa_YNA,#63FD67 +Yilgarn_Craton_granites,A_xmgs_mb_Y,#FECFCB +Carnegie_Formation,P_E__cn_swq,#FFEDDD +Buldya_Group,P__BU_xs_k,#EFCFA3 +Halls_Creek_Group,P__HC_xmd_mb,#ECE5D1 +Antrim_Plateau_Volcanics_and_Lally_Conglomerate,E__an_xbb_s,#F4C1E6 +Crowhurst_Group,P__CR_xs_k,#AB7355 +Koongie_Park_Formation,P___ke_xmf_md,#F1EDD1 +Eastman_Granite,P___ea_grl,#F4946D +Kuniandi_Group,P__KN_se,#F7CEA8 +Colombo_Sandstone,P___co_st,#FECFCB +Talbot_Zone_metasedimentary_unit,P__md_PTRB,#FECE90 +Eastern_Goldfields_Superterrane_greenstones,A_fnv_YEG,#FFF3CF +Eastern_Goldfields_Superterrane_greenstones,A_msqz_YEG,#CFDAD7 +Youanmi_Terrane_greenstones,A_mhsg_YYO,#F4B67D +Talbot_and_Connaughton_Zones_metagranitic_unit,P__mgnu_PTRO,#FCB6FB +Connaughton_Zone_metamorphosed_mafic_volcanic_unit,P__xmb_md_PTRC,#D6DA84 +Coolbro_Sandstone,P__THc_stq,#EFDCD7 +Durba_Sandstone,P_E_DId_st,#EFB00D +Broadhurst_Formation,P__THb_shh,#D8A79B +Yandagooge_Formation,P___ya_mls,#FEDC6E +Turee_Creek_Group,P__TK_s,#E0CABF +Famennian_reef_complexes__marginal_slope_and_basin_facies,D__as_ktsi,#CAD2FC +Givetian__Frasnian_reef_complexes__platform_facies,D__rp_kltp,#F8E6FE +Barbwire_Sandstone,J__bw_sp,#ADFED5 +Beasley_River_Quartzite,P__SKq_stq,#F1BC89 +Nanutarra_Formation_and_Yarraloola_Conglomerate,K__ny_sp,#D4FEA1 +Cliff_Pool_Tonalite,A_EHcl_mgt,#FD7E75 +Proterozoic_siliciclastic_rocks,P__sz_WAC,#BFADB3 +South_West_Terrane_greenstones,A_xmb_mu_YSW,#B1FEB3 +South_West_Terrane_greenstones,A_xmwo_mro_YSW,#62D895 +South_West_Terrane_greenstones,A_mwo_YSW,#62D895 +South_West_Terrane_greenstones,A_mb_YSW,#9EFEA0 +Wilki_Formation,P__LAw_stq,#EFDCD7 +Puntapunta_Formation,P__LAp_kd,#D09587 +Manganese_Group,P__MN_s,#F7B297 +Big_Bell_Suite,A_SDB_mg,#F4BAB7 +Youanmi_Terrane_greenstones,A_cx_YYO,#C5E2FE +Youanmi_Terrane_greenstones,A_xmb_mg_YYO,#A5E9C3 +Rushall_Slate,A_CDr_mlv,#A4B6BD +South_West_Terrane_greenstones,A_mkqx_YSW,#FE83C2 +Johnson_Cairn_Formation,P__YWc_sl,#FCEBCE +Juderina_Formation,P__YWj_s,#F7D7A0 +Coomberdale_Subgroup,P__OAC_xss_kd,#F9DF9E +Marra_Mamba_Iron_Formation,A_HAm_cib,#B5E1FC +Tuckanarra_Suite,A_TU_mg,#F76EA4 +Bitter_Springs_Group,P__BS_kds,#FEDCBB +Maurice_Formation,P_E__ma_stq,#FEDCBB +Sir_Frederick_Conglomerate,P_E__fd_sg,#FEDCBB +Carrington_Suite,P__CN_mg,#FEDEF8 +Anketell_Formation,K__an_st,#93FD14 +Lucas_Formation,PZ__lc_ss,#EAEDFE +Tabletop_Zone_granitic_unit,P__xg_mn_PTRT,#FDD3FD +Rooney_and_Springo_Inliers_granitic_unit,A_g_PRS,#FECFCB +Mount_Negri_Volcanic_Member,A_CDbn_b,#8AFE8D +Sisters_Supersuite,A_ST_gmb,#FEBFBA +Yilgarn_Craton_granites,A_gmi_Y,#FD5E53 +Rooney_and_Springo_Inliers_greenstones,A_s_PRS,#E3DDDB +Karratha_Granodiorite,A_CEkr_gg,#F8BEE0 +Tozer_Formation,A_WHt_xb_f,#FED473 +Cooya_Pooya_Dolerite,A_FOkc_od,#8EE4B4 +Orpheus_Supersuite,A_OP_xg_o,#78DEA4 +Jallagnoonina_Granodiorite,A_STja_ggh,#FEBFBA +Honeyeater_Basalt,A_SOh_b,#DFF3CA +Satirist_Monzogranite,A_STsa_gm,#FE9E98 +Sylvania_Inlier_greenstones,A_og_PYV,#8EE4B4 +Givetian__Frasnian_reef_complexes__marginal_slope_and_basinal_facies,D__gs_ktxi,#F2D6FE +Cadjebut_Formation,D__cj_skcv,#ABB6FA +Yilgarn_Craton_granites,A_gm_Y,#FECFCB +Eastern_Goldfields_Superterrane_greenstones,A_od_YEG,#8EE4B4 +Eastern_Goldfields_Superterrane_greenstones,A_mwa_YEG,#3CFD41 +Eastern_Goldfields_Superterrane_greenstones,A_mu_YEG,#B1A6FC +Eastern_Goldfields_Superterrane_greenstones,A_xb_s_YEG,#C4FEC6 +Youanmi_Terrane_greenstones,A_xmb_mu_YYO,#B1FEB3 +Youanmi_Terrane_greenstones,A_md_YYO,#E3DDDB +Peawah_Granodiorite,A_STpe_ggh,#FECFCB +Illaara_Formation,A__il_mtq,#DAD2CF +Pyradie_Formation,A_FOp_bs,#D5D7B6 +South_West_Terrane_greenstones,A_md_YSW,#E3DDDB +Ninety_Seven_Mile_Formation_and_Elimberrie_Formation,P___ne_xsp_bb,#FBE7D4 +Revolver_Creek_Formation,P___rc_xss_bb,#EEE7EA +Carr_Boyd_Group,P__CB_s,#F3C89D +Youanmi_Terrane_greenstones,A_xbb_og_YYO,#B1FEB3 +Wonyulgunna_Sandstone,P__MSw_st,#EEB041 +Marymia_Inlier_granitic_unit,A_g_YMA,#FECFCB +Whyjabby_Granodiorite,A_MRwh_ggp,#FE9E98 +Twin_Table_Monzogranite,A_RAtw_gf,#FFDFDD +Callytharra_Formation,P__ca_kt,#6BC3F9 +Youanmi_Terrane_greenstones,A_xmuk_mi_YYO,#D3CCFD +South_West_Terrane_greenstones,A_xmi_mwo_YSW,#3AAFF7 +Narracoota_Formation,P__BYn_bb,#F1C5D7 +Karalundi_Formation,P__BYk_st,#DA6595 +Eastern_Goldfields_Superterrane_greenstones,A_sc_YEG,#E3DDDB +Cullculli_Suite,A_ANC_mg,#FFDFDD +Mesozoic_siliciclastic_units__eastern_Canning_Basin,MZ_s_CA,#BAFCEC +Frere_Formation,P__ETf_xci_sf,#D5B9AA +Yilgarn_Craton_granites,A_mgnl_Y,#FE98CC +Chester_Formation,A__cc_ml,#BFB1AC +Kurrawang_Formation,A__kw_s,#CBD3D7 +Butcher_Bird_Monzogranite,A_MDbb_gm,#FECFCB +Youanmi_Terrane_greenstones,A_meax_YYO,#CFDAD7 +Deception_Hill_Microgranite,A__dh_gnap,#FEC1E1 +Youanmi_Terrane_greenstones,A_uk_YYO,#D3CCFD +Yilgarn_Craton_granites,A_xg_mb_Y,#FEAEA9 +Ashburton_Formation,P__WYa_s,#FEE2BD +Yarraloola_Conglomerate,K__ya_sc,#C9FE8A +Maraloou_Formation,P__YMm_sl,#F1D8BD +Mystery_Monzogranite,A__my_gm,#FE9E98 +Errabiddy_Formation,P__BDe_st,#F9DF9E +Jungar_Suite,A_JU_mgms,#FA98BE +Doolgunna_Formation,P__YMd_sta,#FAE2B6 +Marda_Complex,A_MD_s,#FEE79F +Yannery_Granite,A_STya_gfh,#FEBFBA +Bradley_Basalt,A_WHb_b,#FEE2A1 +Walganna_Suite,A_BRG_gm,#FCC1D8 +Yilgarn_Craton_granites,A_xmgn_mgss_Y,#FECFCB +Byro_Group__lower,P_BYL_sf,#A9DCFC +Cheela_Springs_Basalt,P__SKb_bb,#B1FEB3 +Marda_Complex,A_MD_f,#FEE79F +Yilgarn_Craton_granites,A_gi_Y,#FEAEA9 +Bunjinah_Formation,A_FOu_bbo,#E6E7D3 +Yilgarn_Craton_granites,A_mgm_Y,#FEBFBA +Millury_Formation,P__MSm_st,#EEB041 +Coonabildie_Formation,P__MVc_ss,#F7B297 +Narryer_Terrane_metagranitic_unit,A_xmgn_g_YNA,#FE8E87 +Irwin_River_Coal_Measures,P__ir_ssh,#6BC3F9 +Yilgarn_Craton_granites,A_gnap_Y,#FEADD7 +Eastern_Goldfields_Superterrane_greenstones,A_xf_s_YEG,#FEDC6E +South_West_Terrane_greenstones,A_cc_YSW,#9DD7FB +Langfield_Group,C_LA_sk,#E3E8EA +Warrawoona_Group,A_WA_xb_f,#CAEAA7 +Day_Rock_Granodiorite,A__dr_gg,#FCA4F4 +Teague_Granite,A__te_gfl,#FFDFDD +Kulele_Limestone,P__EMk_kls,#D5B9AA +Yilgarn_Craton_granites,A_gfl_Y,#FD5E53 +Sylvania_Inlier_greenstones,A_b_PYV,#C4FEC6 +Sylvania_Inlier_greenstones,A_u_PYV,#B1A6FC +South_West_Terrane_greenstones,A_b_YSW,#C4FEC6 +South_West_Terrane_greenstones,A_xmdsr_mwo_YSW,#CFDAD7 +Youanmi_Terrane_greenstones,A_xmd_mu_YYO,#BFB1AC +Yilgarn_Craton_granites,A_mgtn_Y,#DAD2CF +Munni_Munni_Intrusion,A_STmu_xo_a,#A5E9C3 +Nallana_Formation,A_WHn_b,#FEE2A1 +Brill_Monzogranite,A_MRbr_gmp,#FE9E98 +Nerrely_Leucogranite,A__ne_gftb,#FE8E87 +Mundine_Well_Dolerite_Suite,P__MW_od,#1EC868 +Carynginia_Formation,P__cg_sf,#9DD7FB +Sylvania_Inlier_greenstones,A_s_PYV,#E3DDDB +Mount_Gregory_Monzodiorite,A_OPmg_gh,#FD5E53 +Allanson_Sandstone,P_CLa_szh,#9DD7FB +Sylvania_Inlier_greenstones,A_cc_PYV,#6BC3F9 +Mount_McGrath_Formation,P__WYm_sp,#FECE90 +Yilgarn_Craton_granites,A_xg_b_Y,#FECFCB +Wooramel_Group,P_WO_ss,#84CDFA +Yarrawolya_Formation,P__BDy_sf,#F9DF9E +Powdar_Monzogranite,A_STpo_gm,#FEAEA9 +Grass_Flat_Gabbro,A__gf_og,#9EFEA0 +Imbin_Inlier_felsic_volcanic_unit,P__fcp_GAI,#FEEDB7 +Eastern_Goldfields_Superterrane_greenstones,A_cib_YEG,#099BF5 +Ularring_Monzogranite,A__ul_gm,#FEADD7 +Millars_Monzogranite,A__mi_gmq,#FECFCB +Youanmi_Terrane_greenstones,A_xmwo_mwa_YYO,#76FE7A +Watch_Point_Formation,P__SUw_ss,#F9DF9E +Coondra_Formation,P__SUc_sg,#F9DF9E +Milli_Milli_Inlier_metagranitc_unit,A_mgn_PMI,#FE6FB8 +Billinooka_Inlier_granitic_unit,A_g_PBK,#FFDFDD +Snell_Well_Granodiorite,A_OPsn_gg,#FD5E53 +Big_Bell_Suite,A_SDB_gmp,#FC9A94 +Tjauwata_Group,P__TJ_xmh_mb,#DAD2CF +Yaloginda_Formation,A_NOy_cx,#CDFCB9 +Yilgarn_Craton_granites,A_mgno_Y,#FFDFDD +Murrouli_Basalt,A_NOm_mb,#B1FEB3 +Jungar_Suite,A_JU_mg,#FA98BE +Bottle_Creek_Microgranite,A__bc_gnap,#FEC1E1 +McFadden_Formation,P__DIm_st,#F9DF9E +Karara_Formation,P__TAk_sp,#F7D886 +Cheearra_Monzogranite,A_STch_mgm,#FEBFBA +Mafic_intrusive_unit,od,#1EC868 +Amhurst_Metamorphics,P___am_xmg_md,#D4D3A5 +Glidden_Group,P__GL_s,#F1BC89 +Bullock_Hide_Intrusion,A_RAbu_xo_a,#7CF085 +Railway_Supersuite,A_RA_mg,#FFDFDD +Boongal_Formation,A_FOo_bbo,#EEEFE2 +Chiall_Formation,P__EMc_ss,#CAA894 +Mulgarra_Sandstone,P__EMu_st,#AB7355 +Badgeradda_Basin_metamorphosed_unit,P__xmd_mb_BD,#F4B67D +Coomberarie_Formation,P__BDc_ss,#F9DF9E +Woodrarrung_Sandstone,P__BDw_st,#F9DF9E +Pigeon_Rocks_Monzogranite,A__pr_gm,#FEBFBA +Diemals_Formation,A__di_s,#EDE9E7 +Moora_Group,P__OA_xs_b,#F5D06E +Mullingarra_Gneiss,P___mg_xmdn_mwa,#D2C4C9 +Duerdin_Group,P__DE_s,#F7CEA8 +Narryer_Terrane_greenstones,A_mu_YNA,#B1A6FC +Cooninia_Inlier_granitic_unit,A_g_PCN,#FFDFDD +San_Sou_Monzogranite,P___ss_gmb,#ED54A5 +Tarlwa_Pool_Tonalite,A_CEta_mgt,#F8BEE0 +Sylvania_Inlier_greenstones,A_cib_PYV,#099BF5 +Sylvania_Inlier_greenstones,A_f_PYV,#FEE79F +Isdell_Formation,P___is_kx,#D5BE98 +Golden_Eagle_Orthogneiss,A_MBge_mgtn,#FE9E98 +Yandeearra_Granodiorite,A_STyn_gg,#FEAEA9 +Pilbara_Creek_Monzogranite,A_STic_gm,#FEAEA9 +Corboy_Formation,A_SOc_s,#C8BCB8 +Mungaroona_Granodiorite,A_STmr_gg,#FEBFBA +Ruby_Plains_Group,P__RP_xs_k,#F5E5D3 +Yalgowra_Suite,A_SDY_xod_og,#D3E6D8 +Greensleeves_Formation,A_POg_f,#FDD03E +Tarcunyah_Group,P__TA_sk,#F5D06E +Table_Hill_Volcanics,E__th_xbb_s,#FFECD3 +Bungle_Bungle_Dolomite,P___uu_kds,#E8DFE3 +Edmund_Group__Depositional_package_1,P__MEP1_kt,#F0BA59 +Youanmi_Terrane_greenstones,A_bs_YYO,#3CFD41 +Narryer_Terrane_greenstones,A_xmh_mi_YNA,#BFB1AC +Ewington_Coal_Measures,P_CLe_szh,#9DD7FB +Premier_Coal_Measures,P_CLp_snh,#9DD7FB +Stockton_Group,P_ST_sepg,#9DD7FB +Sylvania_Inlier_greenstones,A_bk_PYV,#8AFE8D +Big_Bell_Suite,A_SDB_mgmu,#F4BAB7 +Metamorphic_unit,myyq,#000000 +Connaughtone_Zone_metamorphosed_ultramafic_unit,P__mu_PTRC,#D4CCFE +Prices_Creek_Group,O_PC_kt,#F8E0FE +Chatarie_Well_Granite,A__ch_gm,#FEBFBA +Hickey_Ricken_Granite,A__hr_g,#FEBFBA +Yilgarn_Craton_granites,A_xmgs_mi_Y,#FECFCB +Yandanooka_Group,P__YA_s,#F5D06E +Youanmi_Terrane_greenstones,A_mrqm_YYO,#FEBCB0 +Youanmi_Igneous_Complex__lower_zone,A_ANyl_xogx_mat,#74E07F +Wogala_Suite,A_BRO_gfv,#FCC1D8 +Mount_Kenneth_Suite,A_ANK_mg,#FEEAF2 +Cundimurra_Monzogranite,A_TUcu_mgmu,#F76EA4 +Yaloginda_Formation,A_NOy_xf_cib,#FEDC6E +Warambie_Basalt,A_WCw_b,#C4FEC6 +Woora_Woora_Formation,P__DIw_ss,#FAE7B6 +Mundadjini_Formation,P__SUm_ss,#F9DF9E +Nooloo_Formation,P__TAn_kt,#F7D886 +Boondawari_Formation,P___bo_sepg,#EFB00D +Ahern_Formation,P___ah_stq,#FECBA8 +Bresnahan_Group,P__BR_s,#DDD5BC +Pilbara_Craton_granitic_unit,A_g_P,#FEAEA9 +Murchison_Supergroup,A_MU_mu,#D8FFD9 +Windimurra_Igneous_Complex__border_zone,A_ANwb_mog,#0F9B99 +Annean_Supersuite,A_AN_od,#86ECD2 +Annean_Supersuite,A_AN_mg,#EDB2CA +Racecourse_Tonalite,A_ANrc_mg,#F698C6 +Barlangi_Granophyre,AP___bg_gv,#FEBAEA +Norie_Group,A_NO_msmz,#BEB477 +Greenbushes_Pegmatite,A__ge_gp,#F65997 +Skates_Hills_Formation,P__SUs_xkds_s,#F9DF9E +Mungarinya_Monzogranite,A_STug_gmp,#FEBFBA +Cundaline_Formation,A_GCu_s,#D4D3A5 +Buldya_Group__upper,P__BUU_sf,#FED3AA +Clutterbuck_Formation,P_E__cl_sz,#FFEDDD +Sally_Malay_Suite,P__SM_xo_a,#E9E6FE +Mount_Parker_Formation,P___mp_s,#F3EFF1 +Wade_Creek_Formation,P___wc_s,#FDC45D +Lamboo_Province_ultramafic_intrusive_unit,P__a_LM,#BCB3FD +Woodward_Dolerite,P___wd_mod,#78DEA4 +South_Whundo_Monzogranite,A_OPso_gm,#FD5E53 +Westralia_Sandstone,P_CLw_ss,#9DD7FB +North_Whundo_Intrusion,A_STnw_o,#A5E9C3 +Milli_Milli_Inlier_greenstones,A_s_PMI,#E3DDDB +Tchukardine_Formation,P__DIt_ss,#FAE7B6 +Elizabeth_Hill_Supersuite,A_EH_g,#FA46BE +Strelley_Pool_Formation,A_PIs_xs_c,#CEEBFD +Mount_Sholl_Intrusion,A_STms_xo_a,#A5E9C3 +Narryer_Terrane_greenstones,A_b_YNA,#C4FEC6 +Jilyili_Formation,P__MVj_ss,#FAD1C1 +Glass_Spring_Formation,P__MVg_st,#F9C2AC +Choorun_Formation,P__TAc_sg,#F7D886 +Yamarna_Terrane_greenstones,A_xmws_mfs_YYA,#63FD67 +Red_Rock_Formation,P___rk_xs_bb,#D1DBDE +Dougalls_Suite,P__DO_jmgt_mw,#FE9E98 +Milli_Milli_Inlier_greenstones,A_b_PMI,#C4FEC6 +Eastern_Goldfields_Superterrane_greenstones,A_xb_f_YEG,#C4FEC6 +Radio_Hill_Intrusion,A_STrh_xo_a,#A5E9C3 +Woodbrook_Formation,A_WHw_f,#FED473 +Dingo_Intrusion,A_STdi_xo_a,#A5E9C3 +Waloo_Waloo_Monzogranite,A_MRwa_gm,#FE9E98 +Archean__Proterozoic_metasiliciclastic_unit,AP__mtq_WAC,#E4E0C3 +Brownrigg_Sandstone,P__TAb_st,#FCEFCF +Wongarlong_Formation,P__TAo_ssqv,#F7D886 +Yandanunyah_Formation,P__TAy_sk,#F5D06E +Helicopter_Siltstone,P___he_sf,#FEE5D4 +Sally_Downs_Supersuite,P__SD_g,#FE9E98 +Throssell_Range_Group,P__TH_xs_kx,#D8A79B +Dalton_Suite,A_DA_xo_a,#78DEA4 +Edmund_Group__Depositional_package_4,P__MEP4_xs_k,#F9E1B8 +Burtville_Terrane_greenstones,A_u_YBU,#B1A6FC +Lennis_Sandstone,EO__le_st,#EFBEE7 +Willy_Willy_Formation,P__MSy_kds,#F2C471 +Wongawol_Formation,P__EMo_sf,#D5B9AA +Malmac_Granite,A__mc_gm,#FE9E98 +Hatfield_Formation,A__hf_md,#BFB1AC +South_West_Terrane_greenstones,A_xmi_mb_YSW,#53B9F8 +Youanmi_Terrane_greenstones,A_mwa_YYO,#63FD67 +Jimberlana_Norite,P__WIji_xo_a,#4BD386 +Youanmi_Terrane_greenstones,A_xc_o_YYO,#6BC3F9 +Yilgarn_Craton_granites,A_mgi_Y,#FEAEA9 +Youanmi_Terrane_greenstones,A_xmc_mwa_YYO,#3AAFF7 +Yilgarn_Craton_granites,A_gmys_Y,#FECFCB +Woblegun_Formation,P__MNw_sf,#F7B297 +Waroongunyah_Formation,P__TAw_ktsv,#F9DF9E +Barrambie_Igneous_Complex,A_ANbm_xony_am,#88E092 +Oldham_Sandstone,P___ol_stz,#F2C471 +Yilgarn_Craton_granites,A_xmgni_mwa_Y,#FEBFBA +Lake_Medcalf_Igneous_Complex,A__lm_og,#5DDB6A +Maggie_Hays_Formation,A__mh_xbb_s,#66EE70 +Muja_Coal_Measures,P_CLm_snh,#9DD7FB +Panton_Suite,P__PT_xmo_ma,#D3CCFD +Duck_Creek_Dolomite,P__WYd_kd,#EFCFA3 +Lander_Rock_Formation,P___lr_mh,#EEE4A4 +Angas_Hill_Formation,P_E__ag_sg,#FFEDDD +Yamarna_Terrane_greenstones,A_mwa_YYA,#63FD67 +Narryer_Terrane_greenstones,A_mba_YNA,#3CFD41 +Narryer_Terrane_metagranitic_unit,A_xmgn_mb_YNA,#FEAEA9 +Kiwirrkurra_Formation,P___kr_sp,#D1DBDE +Heavitree_Formation_and_Bitter_Springs_Group,P__HB_xs_k,#FEDCBB +Panorama_Formation,A_WAp_f,#FED656 +Pilbara_Craton_greenstones,A_mhs_P,#DAD2CF +Lamboo_Province_ultramafic_intrusive_unit,P__ap_LM,#A699FC +Paleozoic_siliciclastic_units__Canning_Basin,PZ_s_CA,#EAEDFE +Quadrio_Formation_and_Cornelia_Sandstone,P___qc_ss,#EEB041 +Googhenama_Formation,P__TAg_sg,#F5D06E +Fortescue_Group,A_FO_xb_s,#D5D7B6 +Honman_Formation,A__hm_c,#72BDFD +Albert_Edward_Group,P__AL_s,#DFB9AF +Texas_Downs_Formation,P___td_xs_bb,#C6D2D6 +Youanmi_Terrane_greenstones,A_u_YYO,#B1A6FC +Munyu_Sandstone,P___my_st,#AAAAA2 +Youanmi_Terrane_greenstones,A_xmwa_mc_YYO,#76FE7A +Pilbara_Supergroup,A_PI_xmwa_g,#76FE7A +Flat_Rocks_Tonalite,A_MBfr_mgt,#FD319A +Hidden_Basin_beds,P___hi_ss,#FEDCBB +Murchison_Supergroup,A_MU_bs,#D8FFD9 +Bonney_Downs_Monzogranite,A_SRbo_gm,#FD7E75 +Coondamar_Formation,A_NUc_xmd_mw,#FBDAC3 +Burtville_Terrane_greenstones,A_mu_YBU,#B1A6FC +Burtville_Terrane_greenstones,A_xb_s_YBU,#C4FEC6 +Burtville_Terrane_greenstones,A_s_YBU,#E3DDDB +Yilgarn_Craton_granites,A_gn_Y,#FD5E53 +Jungar_Suite,A_JU_xmg_mb,#FA98BE +Chunderloo_Monzogranite,A_JUcl_mgms,#FA98BE +Norie_Group,A_NO_b,#8AFE8D +Northern_Foreland_metagranitic_unit,A_mgm_AFON,#FEBFBA +Youanmi_Terrane_greenstones,A_xbb_cl_YYO,#9EFEA0 +Wanna_Formation,OS__wa_st,#F4D0FE +Wirrildar_beds,E__wr_xst_kd,#EAA8DF +Giles_Suite_1,P__WKg1_xo_a,#6EE9C8 +Big_Bell_Suite,A_SDB_gmfe,#EE9894 +Burtville_Terrane_greenstones,A_f_YBU,#FEE79F +Burtville_Terrane_greenstones,A_b_YBU,#C4FEC6 +Yamarna_Terrane_greenstones,A_mfsf_YYA,#FEE79F +Yamarna_Terrane_greenstones,A_mds_YYA,#DAD2CF +Burtville_Terrane_greenstones,A_xmwa_mdqj_YBU,#63FD67 +Turkey_Hill_Formation,P___tk_ss,#DDE4E6 +Burtville_Terrane_greenstones,A_cc_YBU,#6BC3F9 +Yilgarn_Craton_granites,A_xmgss_mwa_Y,#FECFCB +Burtville_Terrane_greenstones,A_xmos_mgss_YBU,#4BD386 +Burtville_Terrane_greenstones,A_xbb_md_YBU,#B1FEB3 +Burtville_Terrane_greenstones,A_xmws_mfs_YBU,#63FD67 +Burtville_Terrane_greenstones,A_mnfq_YBU,#FD5AAE +Burtville_Terrane_greenstones,A_mwa_YBU,#3CFD41 +Yamarna_Terrane_greenstones,A_og_YYA,#8EE4B4 +Burtville_Terrane_greenstones,A_xmws_mus_YBU,#63FD67 +Yamarna_Terrane_greenstones,A_mbs_YYA,#3CFD41 +Burtville_Terrane_greenstones,A_od_YBU,#8EE4B4 +Yilgarn_Craton_granites,A_xmgss_mba_Y,#FECFCB +Burtville_Terrane_greenstones,A_bb_YBU,#C4FEC6 +Mapa_Igneous_Complex,A__rn_xo_mo,#A5E9C3 +Tobin_Formation,A__tb_xs_c,#E3DDDB +Burtville_Terrane_greenstones,A_mbsr_YBU,#63FD67 +Burtville_Terrane_greenstones,A_must_YBU,#E9E6FE +Burtville_Terrane_greenstones,A_xsty_gm_YBU,#E3DDDB +Mount_Weld_Carbonatite,P___wl_r,#B6F7F4 +Yamarna_Terrane_greenstones,A_mfss_YYA,#FEE79F +Yamarna_Terrane_greenstones,A_s_YYA,#E3DDDB +Toppin_Hill_Formation,A__tp_xf_s,#FFF3CF +Yamarna_Terrane_greenstones,A_bbg_YYA,#C4FEC6 +Yamarna_Terrane_greenstones,A_xmws_mgss_YYA,#63FD67 +Burtville_Terrane_greenstones,A_mws_YBU,#63FD67 +Palkapiti_Formation,A__lk_xf_s,#FEE79F +Yamarna_Terrane_greenstones,A_xmws_mus_YYA,#63FD67 +Burtville_Terrane_greenstones,A_xmb_md_YBU,#B1FEB3 +Yamarna_Terrane_greenstones,A_muts_YYA,#E9E6FE +Yamarna_Terrane_greenstones,A_xmbs_mu_YYA,#B1FEB3 +Yamarna_Terrane_greenstones,A_xmb_g_YYA,#B1FEB3 +Burtville_Terrane_greenstones,A_fa_YBU,#FFF3CF +Burtville_Terrane_greenstones,A_og_YBU,#8EE4B4 +Burtville_Terrane_greenstones,A_bs_YBU,#8AFE8D +Burtville_Terrane_greenstones,A_xmwa_cci_YBU,#63FD67 +Wartu_Monzogranite,A__wt_gm,#FECFCB +Burtville_Terrane_greenstones,A_mbs_YBU,#3CFD41 +Yilgarn_Craton_granites,A_gmb_Y,#FECFCB +Point_Salvation_Monzogranite,A__ps_gmys,#FECFCB +Burtville_Terrane_greenstones,A_mrs_YBU,#FEE79F +Mount_Venn_Igneous_Complex,A__vn_o,#BCEED2 +Yilgarn_Craton_granites,A_gf_Y,#FECFCB +Yamarna_Terrane_greenstones,A_mnqf_YYA,#CFDAD7 +Swincer_Dolerite,A__si_o,#E8FAF0 +Yamarna_Terrane_greenstones,A_mws_YYA,#63FD67 +Yilgarn_Craton_granites,A_xmgss_mw_Y,#FECFCB +Burtville_Terrane_greenstones,A_xmu_mb_YBU,#DED9FE +Burtville_Terrane_greenstones,A_xax_og_YBU,#BCB3FD +Ziggy_Monzogranite,A__zi_gm,#FA99F9 +Yamarna_Terrane_greenstones,A_bb_YYA,#C4FEC6 +Yamarna_Terrane_greenstones,A_xmbs_mds_YYA,#63FD67 +Yilgarn_Craton_granites,A_ggi_Y,#FEAEA9 +Burtville_Terrane_greenstones,A_xbb_gna_YBU,#B1FEB3 +Yamarna_Terrane_greenstones,A_mfas_YYA,#FDD03E +Yamarna_Terrane_greenstones,A_ms_YYA,#E7ECEB +Yamarna_Terrane_greenstones,A_xmnqf_mgss_YYA,#CFDAD7 +Burtville_Terrane_greenstones,A_xu_ci_YBU,#B1A6FC +Yamarna_Terrane_greenstones,A_cc_YYA,#6BC3F9 +Ngarrutji_Monzogranite,A__ng_gm,#FECFCB +Burtville_Terrane_greenstones,A_xbb_mgss_YBU,#B1FEB3 +Burtville_Terrane_greenstones,A_o_YBU,#BCEED2 +Burtville_Terrane_greenstones,A_xmwa_mgss_YBU,#76FE7A +Mason_Knob_Monzogranite,A__as_gmp,#FECFCB +Burtville_Terrane_greenstones,A_xbb_mu_YBU,#B1FEB3 +Burtville_Terrane_greenstones,A_xcci_md_YBU,#9DD7FB +Burtville_Terrane_greenstones,A_xog_bb_YBU,#BCEED2 +Burtville_Terrane_greenstones,A_xbb_cci_YBU,#B1FEB3 +Burtville_Terrane_greenstones,A_xbb_og_YBU,#B1FEB3 +Burtville_Terrane_greenstones,A_xmw_mf_YBU,#B1FEB3 +Argus_Igneous_Complex,A__gs_mo,#9FD7D6 +Copperfield_Monzogranite,A__cf_mgm,#F26EB0 +Forest_Belle_Gabbro,A__fb_og,#A5E9C3 +Yilgarn_Craton_granites,A_gt_Y,#FECFCB +Neoproterozoic__Cambrian_sedimentary_rocks__Amadeus_Basin,P_E_s_NA,#FED3AA +Neoproterozoic_sedimentary_rocks__western_Amadeus_Basin,P__sk_NA,#FED3AA +Mu_Formation,E__mu_sm,#E492D8 +Aileron_Province_granitic_unit,P__g_AI,#FE6FB8 +Ininti_Granite,P___it_mgn,#FDADE6 +Kulail_Sandstone__Dean_Quartzite__Heavitree_Quartzite__and_Vaughan_Springs_Quartzite,P___hd_stq,#FFEDDD +Walungurru_Volcanics,P___wu_mfc,#F4BAB7 +Mereenie_Sandstone,SD__me_st,#F7E8FE +Stokes_Siltstone,O__st_sk,#EED1FE +Pollock_Hills_Formation,P___ph_mfd,#F4BAB7 +Waluwiya_Suite,P__WU_mgg,#F9ACE7 +Lake_Mackay_Quartzite,P___lm_mtq,#CFCFD0 +Mount_Webb_Granite,P___we_mgm,#FEE2FD +Rapide_Granite,P__CNra_mg,#FEDEF8 +Dwarf_Well_Granite,P__CNdw_mgm,#FEDEF8 +Mount_Harris_Basalt,P__TJh_mbb,#EDCCDC +Bloods_Range_Formation,P__TJb_xmh_mv,#DAD2CF +Pottoyu_Granite_Suite,P__PJO_mg,#FCB9FA +Cleland_Supersuite,A_CE_g,#F8BEE0 +Tickalara_Metamorphics,P__TI_xmw_m,#DDD28C +Ashburton_Formation,P__WYa_ca,#FED8A7 +Ashburton_Formation,P__WYa_bbo,#FEE2BD +Kaluweerie_Conglomerate,P___ka_sc,#FDE00B +Murchison_Supergroup,A_MU_mb,#D8FFD9 +Windimurra_Igneous_Complex,A_ANwi_xmog_mg,#9FD7D6 +Windimurra_Igneous_Complex__lower_zone,A_ANwl_xol_oml,#6FC3C2 +Warakurna_Supersuite,P__WK_g,#FEE4F7 +Buldya_Group__lower,P__BUL_sk,#FEDCBB +Skirmish_Hill_Formation,P__KRs_xf_b,#DAE59F +Ediacaran__Cambrian_sedimentary_rocks__Officer_Basin,P_E_sp_NO,#F9DF9E +Wirku_Metamorphics,P___wm_mh,#FDD7BB +Wahlgu_Formation,P___wg_sepg,#F1B13B +Lupton_Formation,P___lu_se,#D2C4C9 +Shingle_Creek_Group,P__SK_xb_s,#9EFEA0 +Sisters_Supersuite,A_ST_gmp,#FEBFBA +Kathleen_Valley_Gabbro,A_KV_o,#8EE4B4 +Murchison_Supergroup,A_MU_mo,#D8FFD9 +Barrambie_Igneous_Complex,A_ANbm_ap,#D6A8FC +Murchison_Supergroup,A_MU_xmws_mds,#D8FFD9 +Walganna_Suite,A_BRG_gmp,#FCC1D8 +Atley_Igneous_Complex,A_ANat_ogy,#A7F5AD +Coomb_Bore_Monzogranite,A__cm_mgm,#FE9E98 +Mount_Holmes_Gabbro,P__WKho_og,#8EE4B4 +Windimurra_Igneous_Complex__roof_zone,A_ANwr_xogp_od,#87CDCC +Tuckanarra_Suite,A_TU_mgmu,#FA98BE +Atley_Igneous_Complex__upper_zone,A_ANaz_xam_ogl,#D3CCFD +Mount_Kenneth_Suite,A_ANK_gt,#FEEAF2 +Lady_Alma_Igneous_Complex,A_ANla_og,#7CF085 +Walganna_Suite,A_BRG_gmfe,#FCC1D8 +Annean_Supersuite,A_AN_map,#ABB6FA +Norie_Group,A_NO_musr,#B1A6FC +Meekatharra_Formation,A_POm_xb_f,#9EFEA0 +Nannine_Tonalite,A_ANnn_mgta,#F698C6 +Wattagee_Formation,A_GLw_mbms,#E3DDDB +Garden_Rock_Monzogranite,A_BRga_gmp,#FCC1D8 +Munarra_Monzogranite,A_TUmu_gm,#FCBD8E +Garden_Rock_Monzogranite,A_BRga_gm,#FCC1D8 +Atley_Igneous_Complex__middle_zone,A_ANam_ogy,#6FC3C2 +Narndee_Igneous_Complex,A_ANna_xony_any,#D2F4E1 +Wilgie_Mia_Formation,A_POw_xcib_f,#84CDFA +Illgalara_Monzogranite,A_JUig_gm,#FA98BE +Murchison_Supergroup,A_MU_fn,#FEDC6E +Coodardy_Pool_Formation,A_POc_xmtq_mi,#C8BCB8 +Kantie_Murdana_Volcanics_Member,A_NOyk_xfr_cib,#F7D886 +Windimurra_Igneous_Complex__middle_zone,A_ANwm_xog_oml,#6FC3C2 +Windimurra_Igneous_Complex__upper_zone,A_ANwz_xoml_am,#CFEBEB +Mount_Kenneth_Suite,A_ANK_jmg_md,#FEEAF2 +Ryansville_Formation,A_GLr_s,#E3DDDB +Youanmi_Terrane_greenstones,A_a_YYO,#E2F0FE +Cundimurra_Monzogranite,A_TUcu_mg,#FA98BE +Cue_Tonalite,A_ANct_gtl,#FECFCB +Telegootherra_Monzogranite,A_BRtg_gm,#FCC1D8 +Wattagee_Formation,A_GLw_f,#FFF3CF +Crossroads_Granodiorite,A_SDcr_mgg,#F4BAB7 +Wattagee_Formation,A_GLw_b,#D8FFD9 +Gnanagooragoo_Igneous_Complex,A_ANgn_a,#EDB2CA +Narryer_Terrane_metagranitic_unit,A_mgsn_YNA,#FECFCB +Corner_Well_Gabbro,A_ANwc_xol_apl,#87CDCC +Marlomumbah_Granite,A_BRma_gfv,#FCC1D8 +Gnanagooragoo_Igneous_Complex,A_ANgn_ogy,#EDB2CA +Gnanagooragoo_Igneous_Complex,A_ANgn_od,#EDB2CA +Windimurra_Igneous_Complex__ultramafic_zone,A_ANwu_xmad_oa,#A699FC +Wattagee_Formation,A_GLw_mus,#E9E6FE +Atley_Igneous_Complex,A_ANat_masr,#A897FC +Youanmi_Igneous_Complex__border_zone,A_ANyb_od,#45D555 +Hydrothermal_unit,zq,#000000 +Atley_Igneous_Complex__middle_zone,A_ANam_mat,#BCB3FD +Annean_Supersuite,A_AN_gt,#EDB2CA +Narryer_Terrane_metagranitic_unit,A_mgms_YNA,#FECFCB +Narryer_Terrane_greenstones,A_mhs_YNA,#DAD2CF +Big_Bell_Suite,A_SDB_mgmm,#F4BAB7 +Polelle_Group,A_PO_xmb_mf,#B1FEB3 +Narndee_Igneous_Complex__middle_zone,A_ANnm_xom_mat,#A5E9C3 +Narndee_Igneous_Complex__ultramafic_zone,A_ANnu_xap_ao,#A699FC +Narryer_Terrane_greenstones,A_xmu_mw_YNA,#D8FFD9 +Narndee_Igneous_Complex__lower_zone,A_ANnl_xom_ax,#78DEA4 +Polelle_Group,A_PO_fa,#FEE79F +Atley_Igneous_Complex__upper_zone,A_ANaz_og,#9FD7D6 +Youanmi_Igneous_Complex__middle_zone,A_ANym_xom_og,#8BE594 +Bungarra_Igneous_Complex,A__bu_xony_any,#0CCAC5 +Youanmi_Igneous_Complex__upper_zone,A_ANyz_xam_ogl,#D5DBFD +Woolgra_Andesite_Member,A_POgw_fa,#E8FBFE +Dromedary_Bore_Granite,A_THdb_mggu,#86ECD2 +Eastern_Goldfields_Superterrane_greenstones,A_a_YEG,#B1A6FC +Eastern_Goldfields_Superterrane_greenstones,A_mf_YEG,#FEE286 +Merougil_Formation,A__me_st,#D9D8B0 +Burtville_Terrane_greenstones,A_mfas_YBU,#FDD03E +Sophie_Downs_Suite,P__SO_xmg_mv,#FC8AFA +Burtville_Terrane_greenstones,A_mb_YBU,#C4FEC6 +Speewah_Basin_felsic_extrusive_unit,P__fdp_SP,#FEEDB7 +Winnama_Formation,P___wi_xmd_mw,#F1EDD1 +Lamboo_Province_granitic_unit,P__gnl_LM,#FE9E98 +Moola_Bulla_Formation,P___mb_sz,#CE2AD0 +Browns_Range_Metamorphics,P___bw_mtnf,#E2CF60 +Cambrian__Ordovician_sedimentary_rocks__Ord_Basin,EO_sk_OR,#EAA8DF +Windimurra_Igneous_Complex,A_ANwi_am,#9FD7D6 +Argyle_Lamproite,P___ar_i,#63EDB2 +Punkerri_Sandstone,P___pu_ss,#FDB977 +Yilgarn_Craton_granites,A_xmgm_mwa_Y,#FEBFBA +Hope_Campbell_Orthogneiss,A_MNhc_mgni,#FEADD7 +Balpe_Lakes_Monzogranite,A__bk_gm,#FE83C2 +Burtville_Terrane_greenstones,A_madt_YBU,#D3CCFD +Baseline_Orthogneiss,A_MNpb_mgni,#FEADD7 +Burtville_Terrane_greenstones,A_mls_YBU,#DAD2CF +Burtville_Terrane_greenstones,A_xss_cci_YBU,#E3DDDB +Burtville_Terrane_greenstones,A_xmls_frn_YBU,#DAD2CF +Yilgarn_Craton_granites,A_mgsb_Y,#FECFCB +Burtville_Terrane_greenstones,A_xmus_mgm_YBU,#D3CCFD +Yilgarn_Craton_granites,A_xmgnb_mgmn_Y,#FECFCB +Surprise_Orthogneiss,A_MNso_mgni,#FEADD7 +Hanns_Jasper_Formation,A__hj_fdvd,#FEE286 +Pilbara_Craton_greenstones,A_moa_P,#8EE4B4 +Glasse_Formation,A__al_bb,#8FF76B +Roundtop_Komatiite,A__rt_uk,#BFD156 +Youanmi_Terrane_greenstones,A_mba_YYO,#8AFE8D +Yilgarn_Craton_granites,A_xgm_gg_Y,#FECFCB +Youanmi_Terrane_greenstones,A_bb_YYO,#8AFE8D +June_Hill_Volcanics,P__WYj_b,#EFCFA3 +Youanmi_Terrane_greenstones,A_xcx_uk_YYO,#3AAFF7 +Honman_Formation,A__hm_cx,#72BDFD +Youanmi_Terrane_greenstones,A_xmba_mus_YYO,#3CFD41 +Pilbara_Supergroup,A_PI_ma,#A699FC +Leilira_Formation,A_SSl_s,#DAD2CF +Tambourah_Monzogranite,A_SRta_gmd,#FE9E98 +Gregory_Range_Suite,A_GR_mg,#FEAEA9 +Fortescue_Group,A_FO_mos,#8EE4B4 +Minnamonica_Monzogranite,A_SRmi_gmp,#FD7E75 +Poocatche_Monzogranite,A_SRpo_gmv,#FD7E75 +Mallindra_Well_Granodiorite,A_STml_ggh,#FEBFBA +Kangaroo_Caves_Formation,A_SSc_xf_s,#FEE79F +Callina_Supersuite,A_CL_mg,#EB3BA0 +Table_Top_Formation,A_WAt_mwa,#62D895 +Sisters_Supersuite,A_ST_gm,#FEBFBA +Pilbara_Craton_greenstones,A_ma_P,#A699FC +Motherin_Monzogranite,A_CLmo_xmgm_mgg,#EB3BA0 +Paddy_Market_Formation,A_SOp_xca_f,#9DD7FB +Cookes_Creek_Monzogranite,A_SRco_gm,#FD7E75 +Carbana_Monzogranite,A_EMca_gmp,#F492CA +Gobbos_Granodiorite,A_EMgo_gg,#F492CA +Farrel_Quartzite,A_GCf_stq,#BEBD78 +Pincunah_Monzogranite,A_STpi_gmp,#FEBFBA +Beabea_Monzogranite,A_STbe_gm,#FEBFBA +Woodstock_Monzogranite,A_STwo_gm,#FEBFBA +Bridget_Suite,P__BG_gmh,#FE98CC +Charteris_Basalt,A_KEc_b,#B1FEB3 +Wyman_Formation,A_KEw_xf_s,#FED473 +Euro_Basalt,A_KEe_b,#B1FEB3 +Mosquito_Creek_Formation,A_NUq_mh,#FAD0B4 +Kunagunarrina_Formation,A_SSk_b,#D8FEBE +Lalla_Rookh_Sandstone,A_CDl_st,#FBDAC3 +Tambina_Supersuite,A_TA_jmgg_mwa,#F066B6 +Bellary_Formation,A_FOb_xs_b,#EEEFE2 +Pilbara_Supergroup,A_PI_mwa,#8AFE8D +Petroglyph_Gneiss,A_TApe_mgtn,#F066B6 +Split_Rock_Supersuite,A_SR_g,#FD7E75 +Homeward_Bound_Granite,A_CLho_gf,#EB3BA0 +Pear_Creek_Formation,A_FOe_xs_b,#EEEFE2 +Zulu_Granodiorite,A_EMzu_gg,#F492CA +Walgunya_Trondhjemite,A_EMwa_gt,#F492CA +Strutton_Intrusion,A_WAst_xo_a,#A5E9C3 +Bullgarina_Monzogranite,A_CEbu_gm,#F8BEE0 +Johansen_Monzogranite,A_EMjh_gm,#F492CA +Mount_Ada_Basalt,A_WAm_b,#B1FEB3 +Wolline_Monzogranite,A_CEwo_gmp,#F8BEE0 +Cattle_Well_Formation,A_CDa_s,#FEE79F +Warrawoona_Group,A_WA_mus,#DED9FE +Numbana_Monzogranite,A_SRnu_gmp,#FEBFBA +Cockeraga_Leucogranite,A_EHco_gtl,#FD7E75 +Wilson_Well_Gneiss,A_TAww_mgtn,#F066B6 +Warrawoona_Group,A_WA_mwa,#D4EFB9 +Kadgewarrina_Monzogranite,A_SRkd_gmv,#FD7E75 +Kimmys_Bore_Monzogranite,A_SRkb_gme,#FD7E75 +McPhee_Formation,A_WAh_xu_s,#63FD67 +Marble_Bar_Chert_Member,A_WAdm_ccb,#6BC3F9 +Mulgandinnah_Monzogranite,A_STmg_gme,#FE9E98 +Cooglegong_Monzogranite,A_SRcg_gm,#FD7E75 +Mondana_Monzogranite,A_SRmn_gm,#FD7E75 +Dalton_Suite,A_DA_ma,#A699FC +Coucal_Formation,A_WAc_f,#FEEDB7 +Elsie_Creek_Tonalite,A_EMel_mgtn,#F492CA +Cardinal_Formation,A_SOa_sh,#DFF3CA +Gillam_Monzogranite,A_SRgi_gmp,#FD7E75 +Fig_Tree_Gneiss,A_TAft_mgtn,#F066B6 +North_Pole_Monzogranite,A_TAno_gm,#F066B6 +Pilbara_Craton_greenstones,A_mwa_P,#63FD67 +North_Shaw_Tonalite,A_CLns_mgta,#EB3BA0 +Pyramid_Hill_Formation,A_SOy_ca,#9DD7FB +Warrawoona_Group,A_WA_muts,#DED9FE +Chimingadgi_Trondhjemite,A_EMch_gt,#F492CA +Kavir_Granodiorite,A_CEka_mggb,#F8BEE0 +Pilbara_Craton_greenstones,A_xmwa_g_P,#76FE7A +Wilina_Granodiorite,A_EMwi_gg,#F492CA +Spear_Hill_Monzogranite,A_SRsh_gmp,#FD7E75 +Davitt_Syenogranite,A_EMda_gr,#F492CA +Coolyia_Creek_Granodiorite,A_CLco_mgg,#EB3BA0 +Waltha_Woora_Formation,P__TAa_kt,#F5D06E +Pilbara_Craton_greenstones,A_mds_P,#DDE4E6 +Strelley_Monzogranite,A_CEst_gm,#FFDFDD +Keep_It_Dark_Monzogranite,A_STki_gmp,#FEBFBA +Cleland_Supersuite,A_CE_mgtn,#F492CA +Pilbara_Craton_greenstones,A_mtq_P,#DAD2CF +Pilbara_Craton_greenstones,A_map_P,#9080FB +Garden_Creek_Monzogranite,A_CEgc_mgm,#F8BEE0 +Coonieena_Basalt,A_DGc_b,#BFE695 +Coppin_Gap_Granodiorite,A_EMco_gg,#F492CA +Moolyella_Monzogranite,A_SRmo_gm,#FD7E75 +Gap_Intrusion,A_WAga_a,#B1A6FC +Pilbara_Craton_greenstones,A_mty_P,#AFBFC6 +Underwood_Gneiss,A_CLun_mgtn,#EB3BA0 +Kennell_Granodiorite,A_EMke_gg,#F492CA +Munganbrina_Monzogranite,A_EMmu_gm,#F492CA +Triberton_Granodiorite,A_EMtr_ggp,#F492CA +Chessman_Granodiorite,A_EMce_mgg,#F492CA +Elizabeth_Hill_Supersuite,A_EH_xgnl_gp,#FD7E75 +Abydos_Monzogranite,A_STab_mgm,#FEBFBA +Double_Bar_Formation,A_WAo_b,#BCEED2 +Boobina_Porphyry,A_EMbo_gmap,#F492CA +Fortescue_Group,A_FO_o,#8EE4B4 +Lamil_Group,P__LA_xs_k,#D09587 +Eley_Monzogranite,A_STel_gmp,#FD7E75 +Dresser_Formation,A_WAr_xcc_b,#9DD7FB +Siffleetes_Granodiorite,A_CEsf_mgg,#F8BEE0 +Bamboo_Springs_Monzogranite,A_STbs_gmp,#FE9E98 +Coondina_Monzogranite,A_STcn_gmm,#FEBFBA +Bishop_Creek_Monzogranite,A_CEbi_gm,#F8BEE0 +Mullugunya_Granodiorite,A_EMml_gg,#F492CA +Nob_Well_Intrusion,A_WAno_xap_ax,#BCB3FD +Pilbara_Craton_greenstones,A_mu_P,#B1A6FC +Gregory_Range_Suite,A_GR_gv,#FEAEA9 +Lady_Adelaide_Orthogneiss,A_TAla_mggn,#F066B6 +Joorina_Granodiorite,A_EMjo_gg,#F492CA +Jenkin_Granodiorite,A_EMje_gg,#F492CA +Cotton_Well_Granodiorite,A_EMcw_ggv,#F492CA +Owens_Gully_Diorite,A_CLow_mgi,#EB3BA0 +Campbell_Well_Granodiorite,A_EMcm_gg,#F492CA +Pilbara_craton_greenstones,A_mhsc_P,#DAD2CF +Petermarer_Monzogranite,A_STpr_gmp,#FEBFBA +Wallareenya_Granodiorite,A_STwa_ggh,#FEBFBA +Nandingarra_Granodiorite,A_EMna_gge,#F492CA +Bookargemoona_Tonalite,A_TAbo_mgt,#F066B6 +Warrawoona_Group,A_WA_bb,#D4EFB9 +South_Mallina_Basalt_Member,A_CDbm_bb,#B8DC3B +Warrawoona_Group,A_WA_xbb_bk,#D4EFB9 +Eel_Creek_Formation,AP___ec_sf,#F5D06E +Tambina_Supersuite,A_TA_mgti,#FE9E98 +Shay_Intrusion,A_STsh_xo_a,#A5E9C3 +Pilbara_Supergroup,A_PI_xmus_g,#D3CCFD +Gorge_Creek_Group,A_GC_xci_s,#D4D3A5 +Split_Rock_Supersuite,A_SR_gme,#FD7E75 +Thelman_Monzogranite,A_SRth_gmv,#FD7E75 +Tabba_Tabba_Leucogranite,A_SRtt_gme,#FD7E75 +Budjan_Creek_Formation,A_SOb_xs_f,#FEE79F +Pilbara_Craton_greenstones,A_xmws_mus_P,#C4FEC6 +Jeerinah_Formation,A_FOj_s,#CDCFA7 +Bindoo_Sandstone,SD__bi_st,#A3FBE5 +Eastern_Goldfields_Superterrane_greenstones,A_c_YEG,#6BC3F9 +Madura_Formation,K__ma_ssh,#C9FE8A +Byro_Group__middle,P_BYM_sf,#A9DCFC +Collier_Group__Depositional_package_5,P__MCP5_s,#F7D7A0 +Edmund_Group__Depositional_package_2,P__MEP2_sk,#F9E1B8 +Sylvania_Inlier_granitic_unit,A_g_PYV,#FECFCB +Thaduna_Formation,P__YMt_ss,#FAE2B6 +Goodin_Inlier_granitic_unit,A_g_YGD,#FECFCB +Collier_Group__Depositional_package_6,P__MCP6_s,#F0BA59 +Mount_Joseph_Migmatite,P___mj_mhi,#E9E9D2 +Redcliff_Pound_Group,P_E_RD_s,#DAD2CF +Tooloo_Group,P__ET_xsf_ci,#E0CABF +Knobby_Sandstone,D__kn_sp,#ABB6FA +Yamarna_Terrane_greenstones,A_xb_og_YYA,#8AFE8D +Cambrian__Ordovician_sedimentary_siliciclastic_units__Amadeus_Basin,EO_sf_NA,#EFBEE7 +Birrindudu_Group,P__BN_sa,#E1AAC5 +Giles_Suite_2,P__WKg2_o,#B7FAE3 +Kunmarnara_Group,P__KR_xs_b,#DAE59F +Tropicana_Gneiss,AP___tc_xmin_mog,#6BC3F9 +Malcolm_Metamorphics,P___mm_xmh_mws,#CFC995 +Northern_Foreland_mafic_unit,A_mu_AFON,#D3CCFD +Esperance_Supersuite,P__EP_gr,#FEC8F9 +Gwynne_Creek_Gneiss,P___gk_xmtn_mo,#D0C5C2 +Madura_Province_metagranitic_unit,P__xmg_mw_MAD,#FBA7FA +Mount_Ragged_Formation,P___rg_mh,#D1DBDE +Booanya_Suite,P__EPB_g,#FDB6F7 +Snowys_Dam_Formation,P___sd_xmhn_mkqn,#BFADB3 +Eastern_Goldfields_Superterrane_greenstones,A_mn_YEG,#CFDAD7 +Esperance_Supersuite,P__EP_jgn_mgn,#FEC8F9 +Fitzgerald_Peaks_Syenite,A__fy_gy,#FEE286 +Recherche_Supersuite,P__RE_jmgnn_mog,#FBA7FA +Biranup_Zone_metagranitic_unit,P__jmgnn_moga_KKBB,#FBA7FA +Biranup_Zone_metagranitic_unit,A_mgr_KKBB,#FEBFBA +Tropicana_Gneiss,AP___tc_xmog_mae,#4BD386 +Tropicana_Gneiss,AP___tc_xmgn_mon,#FEC1E1 +Lindsay_Hill_Formation,P___lh_xmt_mtq,#BFADB3 +Pitjantjatjara_Supersuite_2,P__PJp2_mg,#FCB9FA +Fraser_Zone_unit,P__mog_KKBF,#B6F4E4 +Fraser_Zone_unit,P__xmog_mgn_KKBF,#9EF0DB +Arid_Basin_unit,P__xmtn_mon_AFOA,#C3CCD0 +Fraser_Range_Metamorphics,P__FM_xmog_mgn,#90F2C8 +Biranup_Zone_metagranitic_unit,P__jmgnn_moan_KKBB,#FE99CD +Snowys_Dam_Formation,P___sd_xmhn_mon,#BFADB3 +Truslove_Suite,P__EPT_gm,#FEC8F9 +Moogie_Metamorphics,P__MG_xmh_mk,#FEBA70 +Narimbunna_Dolerite,P___nr_od,#4BD386 +Mount_Leake_Formation,P___mk_st,#E0CABF +Cassidy_Group,P__CA_xbb_fr,#E7BBD1 +Durlacher_Supersuite,P__DU_g,#FEE2FD +Pitjantjatjara_Supersuite,P__PJ_mg,#FDD1FB +Musgrave_Province_metamorphic_unit,P__myy_MU,#FDB14E +Pussy_Cat_Group,P__PU_xss_bb,#D7E9C2 +Wankanki_Supersuite,P__WN_xmf_mh,#FEAEED +Alcurra_Dolerite,P__WKA_o,#9EF0DB +Musgrave_Province_metamorphic_unit,P__myx_MU,#FED8A7 +Pitjantjatjara_Supersuite_1,P__PJp1_mg,#FBA2F8 +Stubbins_Formation,P__TNs_mod,#78DEA4 +Stubbins_Formation,P__TNs_xmh_mod,#E4DCDF +Larranganni_Formation,MZ__lr_st,#8CFADF +Granites_Tanami_Orogen_granitic_unit,P__gm_GT,#FE6FB8 +Black_Dragon_Gneiss,P___bd_xmgg_mgi,#FD7E75 +Proterozoic_mafic_intrusive_unit,P__o,#B0ECCA +Salt_Creek_Gabbro,P___sk_og,#6EE9C8 +Tropicana_Zone_metagranitic_unit,AP__mg_KKBT,#FECCE6 +Biranup_Zone_metagranitic_unit,P__xmgn_mdn_KKBB,#FBA7FA +Bobbie_Point_Metasyenogranite,P___bt_mgr,#FCACFC +Biranup_Zone_metagranitic_unit,P__xmg_mog_KKBB,#FBA7FA +Voodoo_Child_Formation,P___vc_xmog_mfd,#56E5BF +Burtville_Terrane_greenstones,A_mfnq_YBU,#CFDAD7 +McKay_Creek_Metasyenogranite,P___kc_xmgr_mgi,#E3C8B5 +Biranup_Zone_metagranitic_unit,AP__xmgni_mhn_KKBB,#FBA7FA +Eddy_Suite,P__EY_xmgg_mog,#FC8CD6 +Fly_Dam_Formation,P___fd_mhng,#FE95A5 +Biranup_Zone_metagranitic_unit,AP__mgni_KKBB,#FEBBDD +Woodline_Formation,P___wo_s,#FBE7D4 +Tank_44_Gneiss,P___tf_xmnaa_mnqf,#F7B588 +Munglinup_Gneiss,AP___mu_xmgn_moa,#FEC1E1 +Northern_Foreland_unit,A_xmu_md_AFON,#D3CCFD +Northern_Foreland_mafic_unit,A_xmb_mu_AFON,#B1FEB3 +Splinter_Gneiss,P__REsg_xmon_mn,#F7B588 +Northern_Foreland_mafic_unit,A_mb_AFON,#C4FEC6 +Northern_Foreland_unit,A_xmi_md_AFON,#84CDFA +Northern_Foreland_mafic_unit,A_mo_AFON,#BCEED2 +Nornalup_Zone_metagranitic_unit,P__xmg_gn_KKBN,#FBA7FA +Southern_Hills_Suite,P__RES_mgr,#FA99F9 +Yilgarn_Craton_granites,A_gmfp_Y,#FECFCB +Burtville_Terrane_greenstones,A_xmw_mc_YBU,#63FD67 +Burtville_Terrane_greenstones,A_xmnqf_mgss_YBU,#CFDAD7 +Yilgarn_Craton_granites,A_xmgss_mbs_Y,#FECFCB +Bertibubba_Supersuite,P__BB_g,#F883B1 +Pooranoo_Metamorphics,P__PO_md,#E8CABF +Edmund_Group__Depositional_package_3,P__MEP3_sk,#EEB041 +Mount_James_Subgroup,P__POJ_md,#EDD5CC +Halfway_Gneiss,AP___ha_mgn,#EDE9E7 +Peak_Hill_Schist,AP___ph_msqm,#FEDC6E +Robinson_Range_Formation,P__PAr_shi,#E7BE91 +Yarlarweelor_Gneiss_Complex_unit,AP__mgnl_YNAY,#FEC1E1 +Warrigal_Gneiss,A__wa_mgmn,#FE83C2 +Dalgaringa_Supersuite,P__DA_mg,#EFB8FA +Pindilya_Formation,NM__pi_sr,#D2F4E1 +Coor_de_wandy_Formation,P___cw_s,#EEE4A4 +Narryer_Terrane_metagranitic_unit,A_mgn_YNA,#FE6FB8 +Capricorn_Orogen_metamorphosed_mafic_intrusive_unit,P__mod_CPO,#8EE4B4 +Narryer_Terrane_greenstones,A_xmro_mwo_YNA,#FFDFDD +Rocky_Bore_Granite,A__rb_gmp,#FECFCB +Camel_Hills_Metamorphics,P__CH_xmd_mk,#D2C4C9 +Wilthorpe_Formation,P__PAw_scq,#F1D8BD +Nadarra_Formation,NP__na_klul,#A5E9C3 +Kungarra_Formation,P__TKk_sf,#D5B9AA +Ravelstone_Formation,P__BYr_ss,#E3C8B5 +Millidie_Creek_Formation,P__PAm_ss,#ECCBA7 +Devonian_sedimentary_rocks__Southern_Carnarvon_Basin,D_xs_k_CV,#CAD2FC +Merlinleigh_Sandstone,GE__me_stz,#EEF5B6 +Labouchere_Formation,P__PAl_ssq,#F1D8BD +Horseshoe_Formation,P__BYh_sf,#EAD6C8 +Gascoyne_Province_metamorphosed_mafic_intrusive_unit,P__mod_GA,#4BD386 +Yarlarweelor_Gneiss_Complex_unit,A_mg_YNAY,#FEAEA9 +Wyloo_Group,P__WY_s,#E2B07B +Glenburgh_Terrane_Proterozoic_unit,P__mus_GAG,#DED9FE +Metawandy_Granite,A__mt_gm,#FECFCB +Wyloo_Inlier_greenstones,A_b_PWY,#C4FEC6 +Thirty_Three_Supersuite,P__TT_g,#FFD6EB +Despair_Granite,A__de_gmb,#FFDFDD +Trillbar_formation,P__BYt_xmw_mu,#E89FBC +Carboniferous_sedimentary_rocks__Southern_Carnarvon_Basin,C_kt_CV,#C8D2D5 +Koolbye_Formation,P__TKo_stq,#E0CABF +Narryer_Terrane_greenstones,A_u_YNA,#B1A6FC +Waldburg_Dolerite,P___wa_od,#41CD50 +Yarlarweelor_Gneiss_Complex_unit,AP__mgn_YNAY,#FEC1E1 +Narryer_Terrane_metagranitic_unit,A_mgss_YNA,#FECFCB +Rocklea_Inlier_greenstones,A_b_PRK,#C4FEC6 +Rocklea_Inlier_greenstones,A_s_PRK,#E3DDDB +Rocklea_Inlier_metagranitic_unit,A_mgn_PRK,#FE6FB8 +Narryer_Terrane_greenstones,A_mat_YNA,#E9E6FE +Padbury_Group,P__PA_s,#DDA365 +Narryer_Terrane_greenstones,A_mtq_YNA,#DAD2CF +Kazput_Formation,P__TKa_xs_k,#E0CABF +Narryer_Terrane_greenstones,A_mi_YNA,#099BF5 +Mount_Augustus_Sandstone,P___au_sp,#ECCBA7 +Glenburgh_Terrane_Proterozoic_unit,P__mwa_GAG,#C9E2AE +Moorarie_Supersuite,P__MO_mog,#D2F4E1 +Eastern_Goldfields_Superterrane_greenstones,A_mb_YEG,#C4FEC6 +Durlacher_Supersuite,P__DU_mog,#1EC868 +Glenburgh_Terrane_Proterozoic_unit,P__mog_GAG,#A5E9C3 +Wooly_Dolomite,P___wy_kd,#BEE2F8 +Hydrothermal_unit,zqix,#000000 +Pitjantjatjara_Supersuite,P__PJ_mgmy,#FDD1FB +Tollu_Group,P__TL_f,#F5EAD8 +Wankanki_Supersuite,P__WN_mg,#FEAEED +Pitjantjatjara_Supersuite_2,P__PJp2_xmgg_mhi,#FCB9FA +Pitjantjatjara_Supersuite_2,P__PJp2_mgsy,#FCB9FA +Mount_Palgrave_Group,P__PG_xf_s,#FEE1A5 +Wankanki_Supersuite,P__WN_xmgn_mg,#FD86E3 +Pitjantjatjara_Supersuite_2,P__PJp2_xmgg_oo,#FCB9FA +Pitjantjatjara_Supersuite,P__PJ_mgsy,#FDD1FB +Eliza_Formation,P__PGe_xfr_sp,#FEEDC9 +Pussy_Cat_Group,P__PU_frp,#D7E9C2 +Musgrave_Province_metamorphic_unit,P__xmna_mg_MU,#CFDAD7 +Musgrave_Province_metagranitic_unit,P__mg_MU,#FEC8EE +Pussy_Cat_Group,P__PU_sdv,#D7E9C2 +Kathleen_Ignimbrite,P__PUk_fr,#FEEDC9 +Scamp_Formation,P__PGs_fr,#FEE1A5 +Mount_Waugh_Formation,P__PGw_xfr_sp,#FBCB8C +Kaarnka_Group,P__PK_xfr_frv,#FBCB8C +Glyde_Formation,P__PUg_xbb_s,#D7E9C2 +Pussy_Cat_Group,P__PU_sgb,#D7E9C2 +Umutju_Granite_Suite,P__PJU_mg,#FCB9FA +Warakurna_Supersuite,P__WK_xo_f,#6EE9C8 +Mission_Group,P__MI_xbb_s,#C3C4C4 +Giles_Suite_1,P__WKg1_og,#9EF0DB +Warakurna_Supersuite,P__WK_mg,#FED6F2 +Kunmarnara_Group,P__KR_xmd_mb,#DAE59F +Warlawurru_Supersuite,P__WR_mg,#FCA4F4 +Giles_Suite_1,P__WKg1_mog,#6EE9C8 +Giles_Suite_2,P__WKg2_moad,#94F7D4 +Slatey_Creek_Granite,P___sl_gm,#FEBFBA +Killi_Killi_Formation,P__TNk_xmh_mod,#E2DCC4 +Granites_Tanami_Orogen_metasedimentary_siliciclastic_unit,P__mh_GT,#E9E9D2 +Pargee_Sandstone,P___pg_st,#F5D3B1 +Granites_Tanami_Orogen_metamorphosed_igneous_felsic_unit,A_mrn_GT,#FE98CC +Granites_Tanami_Orogen_metamorphosed_intrusive_mafic_unit,P__mod_GT,#A5E9C3 +Lewis_Granite,P___ls_gmj,#FEBFBA +Lewis_Granite,P___ls_gm,#FEBFBA +Balwina_Granite,P___ba_gm,#FEBFBA +Hercules_Gneiss,AP__NEH_mgin,#FE9E98 +Capricorn_Group,P__CP_sk,#DDA365 +MacDougall_Formation,P__KRd_sg,#EDF2CF +Yilgarn_Craton_granites,A_jgm_mn_Y,#FECFCB +Scotty_Creek_Formation,A__sc_xsta_sc,#E3DDDB +Jones_Creek_Conglomerate,A__jc_s,#FEC57A diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/NSW.json b/packages/map2loop/src/map2loop/_datasets/config_files/NSW.json new file mode 100644 index 000000000..886753818 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/NSW.json @@ -0,0 +1,49 @@ +{ + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "azimuth", + "dip_column": "dip", + "description_column": "DESCRIPTION", + "bedding_text": "bedding", + "overturned_column": "deform", + "overturned_text": "BEOI", + "objectid_column": "unique_id", + "desciption_column": "codedescpt" + }, + "geology": { + "unitname_column": "unit_name", + "alt_unitname_column": "nsw_code", + "group_column": "sub_provin", + "supergroup_column": "province", + "description_column": "deposition", + "minage_column": "top_end_ag", + "maxage_column": "base_start", + "rocktype_column": "class", + "alt_rocktype_column": "igneous_ty", + "sill_text": "sill", + "intrusive_text": "intrusive", + "volcanic_text": "volcanic", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"]}, + "fault": { + "structtype_column": "boundaryty", + "fault_text": "Fault", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "faultdipdi", + "dip_column": "dip", + "orientation_type": "dip direction", + "dipestimate_column": "faultdipan", + "dipestimate_text": "Moderate,Listric,Steep,Vertical", + "name_column": "name", + "objectid_column": "unique_id", + }, + "fold": { + "structtype_column": "codedescpt", + "fold_text": "cline", + "description_column": "codedescpt", + "synform_text": "Syncline", + "foldname_column": "NAME", + "objectid_column": "unique_id" + } +} \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/QLD.json b/packages/map2loop/src/map2loop/_datasets/config_files/QLD.json new file mode 100644 index 000000000..d4a3b35e2 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/QLD.json @@ -0,0 +1,50 @@ +{ + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "azimuth", + "dip_column": "dip_plunge", + "description_column": "DESCRIPTION", + "bedding_text": "BEDDING", + "overturned_column": "facing", + "overturned_text": "DOWN", + "objectid_column": "Feature ID", + "desciption_column": "structure" + }, + "geology": { + "unitname_column": "stratigrap", + "alt_unitname_column": "ru_name", + "group_column": "parent_na", + "supergroup_column": "parent_na", + "description_column": "rock_type", + "minage_column": "top_minim", + "maxage_column": "base_maxi", + "rocktype_column": "intrusive", + "alt_rocktype_column": "lith_summ", + "sill_text": "sill", + "intrusive_text": "Y", + "volcanic_text": "VOLCANIC", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "type", + "fault_text": "Fault", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "dip_dir", + "dip_column": "dip", + "orientation_type": "dip direction", + "dipestimate_column": "dip_est", + "dipestimate_text": "gentle,moderate,steep", + "name_column": "name", + "objectid_column": "Feature ID" + }, + "fold": { + "structtype_column": "type", + "fold_text": "Fold", + "description_column": "id_desc", + "synform_text": "Syncline", + "foldname_column": "NAME", + "objectid_column": "Feature ID" + } +} \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/SA.json b/packages/map2loop/src/map2loop/_datasets/config_files/SA.json new file mode 100644 index 000000000..daf2806e8 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/SA.json @@ -0,0 +1,50 @@ +{ + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "azimuth_tr", + "dip_column": "inclinatio", + "description_column": "DESCRIPTION", + "bedding_text": "bedding", + "overturned_column": "younging", + "overturned_text": "-", + "objectid_column": "ID", + "desciption_column": "structure_" + }, + "geology": { + "unitname_column": "stratname", + "alt_unitname_column": "mainunit", + "group_column": "parentname", + "supergroup_column": "province", + "description_column": "stratdesc", + "minage_column": "min", + "maxage_column": "max", + "rocktype_column": "no_col", + "alt_rocktype_column": "no_col", + "sill_text": "sill", + "intrusive_text": "intrusive", + "volcanic_text": "volc", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "descriptio", + "fault_text": "fault", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "no_col", + "dip_column": "no_col", + "orientation_type": "dip direction", + "dipestimate_column": "no_col", + "dipestimate_text": "no_col", + "name_column": "no_col", + "objectid_column": "ID" + }, + "fold": { + "structtype_column": "descriptio", + "fold_text": "fold", + "description_column": "no_col", + "synform_text": "syn", + "foldname_column": "NAME", + "objectid_column": "ID" + } +} \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/TAS.json b/packages/map2loop/src/map2loop/_datasets/config_files/TAS.json new file mode 100644 index 000000000..d795f8d22 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/TAS.json @@ -0,0 +1,50 @@ +{ + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "AZIMUTH", + "dip_column": "DIP", + "description_column": "DESCRIPTION", + "bedding_text": "bedding", + "overturned_column": "DESCRIPT", + "overturned_text": "overturned", + "objectid_column": "No_col", + "desciption_column": "DESCRIPT" + }, + "geology": { + "unitname_column": "SYMBOL", + "alt_unitname_column": "SYMBOL", + "group_column": "SUPERGROUP", + "supergroup_column": "GRP", + "description_column": "DESCRIPT", + "minage_column": "MINAGE", + "maxage_column": "MAXAGE", + "rocktype_column": "No_col", + "alt_rocktype_column": "No_col", + "sill_text": "sill", + "intrusive_text": "granit", + "volcanic_text": "volc", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "TYPE", + "fault_text": "ault", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "No_col", + "dip_column": "No_col", + "orientation_type": "dip direction", + "dipestimate_column": "No_col", + "dipestimate_text": "No_col", + "name_column": "No_col", + "objectid_column": "No_col" + }, + "fold": { + "structtype_column": "TYPE", + "fold_text": "form", + "description_column": "TYPE", + "synform_text": "syn", + "foldname_column": "NAME", + "objectid_column": "No_col" + } +} \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/VIC.json b/packages/map2loop/src/map2loop/_datasets/config_files/VIC.json new file mode 100644 index 000000000..b27625305 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/VIC.json @@ -0,0 +1,50 @@ +{ + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "azimuth", + "dip_column": "inclinatn", + "description_column": "DESCRIPTION", + "bedding_text": "bed", + "overturned_column": "no_col", + "overturned_text": "blah", + "objectid_column": "geographic", + "desciption_column": "sub_type" + }, + "geology": { + "unitname_column": "formatted_", + "alt_unitname_column": "abbreviate", + "group_column": "no_col", + "supergroup_column": "interpreta", + "description_column": "text_descr", + "minage_column": "no_col", + "maxage_column": "no_col", + "rocktype_column": "rank", + "alt_rocktype_column": "type", + "sill_text": "sill", + "intrusive_text": "intrusion", + "volcanic_text": "volc", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "featuretyp", + "fault_text": "s", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "no_col", + "dip_column": "no_col", + "orientation_type": "dip direction", + "dipestimate_column": "no_col", + "dipestimate_text": "no_col", + "name_column": "no_col", + "objectid_column": "geographic" + }, + "fold": { + "structtype_column": "featuretyp", + "fold_text": "fold", + "description_column": "no_col", + "synform_text": "syn", + "foldname_column": "NAME", + "objectid_column": "geographic" + } +} \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/config_files/WA.json b/packages/map2loop/src/map2loop/_datasets/config_files/WA.json new file mode 100644 index 000000000..4c722dc85 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/config_files/WA.json @@ -0,0 +1,49 @@ +{ + "structure": { + "orientation_type": "strike", + "dipdir_column": "strike", + "dip_column": "dip", + "description_column": "feature", + "bedding_text": "Bed", + "overturned_column": "structypei", + "overturned_text": "BEOI", + "objectid_column": "objectid" + }, + "geology": { + "unitname_column": "unitname", + "alt_unitname_column": "code", + "group_column": "group_", + "supergroup_column": "supersuite", + "description_column": "descriptn", + "minage_column": "min_age_ma", + "maxage_column": "max_age_ma", + "rocktype_column": "rocktype1", + "alt_rocktype_column": "rocktype2", + "sill_text": "is a sill", + "intrusive_text": "intrusive", + "volcanic_text": "volcanic", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "feature", + "fault_text": "Fault", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "dip_dir", + "dip_column": "dip", + "orientation_type": "dip direction", + "dipestimate_column": "dip_est", + "dipestimate_text": "gentle,moderate,steep", + "name_column": "name", + "objectid_column": "objectid" + }, + "fold": { + "structtype_column": "feature", + "fold_text": "Fold axial trace", + "description_column": "type", + "synform_text": "syncline", + "foldname_column": "NAME", + "objectid_column": "objectid" + } +} diff --git a/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif new file mode 100644 index 000000000..a9ba843eb Binary files /dev/null and b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif differ diff --git a/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/faults.geojson b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/faults.geojson new file mode 100644 index 000000000..bfc9d5ddd --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/faults.geojson @@ -0,0 +1,42 @@ +{ +"type": "FeatureCollection", +"name": "faults", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::28350" } }, +"features": [ +{ "type": "Feature", "properties": { "gml_id": "linear_500k.7344", "objectid": "7344", "feature": "Fault or shear zone, major", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone, major; exposed", "extract_da": "2016-06-29", "shape_leng": 0.69607471020199996, "fdipest_va": "None", "f_length": 2013.8250120821676 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 517202.720465901540592, 7473446.765934069640934 ], [ 516155.3168108399841, 7474354.511743649840355 ], [ 515687.31005864002509, 7474773.047381143085659 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.7436", "objectid": "7436", "feature": "Fault or shear zone, major", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone, major; exposed", "extract_da": "2016-06-29", "shape_leng": 0.21547223204400001, "fdipest_va": "None", "f_length": 20398.167266226865 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 524662.731309870025143, 7480154.449138020165265 ], [ 525046.501200460013933, 7480304.959696319885552 ], [ 525590.138856749981642, 7480549.457734939642251 ], [ 526736.961849370039999, 7480922.959662619978189 ], [ 529856.887474340037443, 7481720.479547889903188 ], [ 529827.910515989991836, 7480963.489905229769647 ], [ 531488.108066829969175, 7481043.48909377027303 ], [ 533085.269960989942774, 7481251.001002869568765 ], [ 534592.610763909993693, 7481281.00779134966433 ], [ 536441.719193030032329, 7480978.031349039636552 ], [ 537775.93181324005127, 7480703.570456990040839 ], [ 538468.262211170047522, 7480515.588263570331037 ], [ 538902.020067770034075, 7480793.101080619730055 ], [ 539450.069282670039684, 7481044.61925155017525 ], [ 540092.788811390055344, 7481117.631719109602273 ], [ 540899.980495239957236, 7481030.660386419855058 ], [ 541528.288530569989234, 7480753.667894089594483 ], [ 542003.921304309973493, 7480483.660549759864807 ], [ 542810.168601599987596, 7480186.172313690185547 ], [ 543273.430744710029103, 7479986.681214369833469 ], [ 543539.54005779, 7479775.178710600361228 ], [ 543850.099438710021786, 7479563.177159620448947 ], [ 544323.518753150012344, 7479210.680796929635108 ], [ 545000.019705810002051, 7478579.670257880352437 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.7439", "objectid": "7439", "feature": "Fault or shear zone, major", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone, major; exposed", "extract_da": "2016-06-29", "shape_leng": 0.34452964424, "fdipest_va": "None", "f_length": 35247.789928586593 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 560124.945183429983445, 7479717.814294899813831 ], [ 559565.259590790024959, 7480131.810321420431137 ], [ 558961.618415990029462, 7480662.810186750255525 ], [ 558506.944315879954956, 7480932.371391680091619 ], [ 558166.318415640038438, 7481134.301850480027497 ], [ 557462.729210410034284, 7481615.291048490442336 ], [ 555890.978131970041431, 7482756.780634740367532 ], [ 554199.290736960014328, 7484058.279978330247104 ], [ 553299.030578140052967, 7484648.280572880059481 ], [ 552461.869387940037996, 7485130.261249019764364 ], [ 551340.358837340027094, 7485626.337629109621048 ], [ 551180.02149674994871, 7485697.249936630018055 ], [ 549901.131908909999765, 7486170.605126890353858 ], [ 549154.91041516000405, 7486446.740225279703736 ], [ 547917.222122960025445, 7486949.728884849697351 ], [ 546577.260286420001648, 7487345.218131000176072 ], [ 544875.02778613998089, 7487774.691257519647479 ], [ 543840.309419329976663, 7488181.178546589799225 ], [ 542571.512399810017087, 7488831.16066893003881 ], [ 541894.312351180007681, 7489210.159689639694989 ], [ 541734.628457920043729, 7489299.554097919724882 ], [ 541239.63983072002884, 7489576.641609829850495 ], [ 539566.533569280058146, 7489954.743095840327442 ], [ 538311.225570010021329, 7490273.624975340440869 ], [ 537771.612724979990162, 7490461.123313999734819 ], [ 537397.371146259945817, 7490660.111204300075769 ], [ 537143.239344249945134, 7490712.609949969686568 ], [ 536190.440703699947335, 7490947.099784820340574 ], [ 534321.3049298300175, 7491059.071795090101659 ], [ 533413.077434350037947, 7491318.567578700371087 ], [ 532258.33258664002642, 7491872.062288270331919 ], [ 531616.531035959953442, 7491977.044998600147665 ], [ 530872.614102820050903, 7492013.049088159576058 ], [ 530002.694043949944898, 7492272.541349769569933 ], [ 529240.747981040040031, 7492531.029306390322745 ], [ 528389.753596790018491, 7492771.532828389666975 ], [ 527475.04337436996866, 7492999.0268415203318 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5471", "objectid": "5471", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.022972516496399999, "fdipest_va": "None", "f_length": 2363.1563702360281 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 521224.28995990002295, 7489118.450215740129352 ], [ 520608.107771619979758, 7489268.439483519643545 ], [ 518898.751195219985675, 7489538.423410310409963 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.962", "objectid": "962", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.027183596789400001, "fdipest_va": "None", "f_length": 2805.6557429507325 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 520020.694838049996179, 7495438.933689510449767 ], [ 519762.199077040015254, 7495904.939755939878523 ], [ 519433.317879359994549, 7496282.440096319653094 ], [ 519021.359903179982211, 7496577.43004279024899 ], [ 518014.126850700005889, 7497123.757406969554722 ], [ 517847.879607070004568, 7497213.920483820140362 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.2229", "objectid": "2229", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.0588886936927, "fdipest_va": "None", "f_length": 3602.3007443756956 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 517292.775247581710573, 7473446.765934069640934 ], [ 517093.294708309986163, 7473675.01434085983783 ], [ 516368.428606080007739, 7475034.48169700987637 ], [ 515687.31005864002509, 7476671.522076792083681 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.2235", "objectid": "2235", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.19162297509099999, "fdipest_va": "None", "f_length": 16771.902008888235 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 525375.306361280032434, 7483424.968661130405962 ], [ 524988.585061719990335, 7483694.465257430449128 ], [ 524381.214666309999302, 7484340.470171829685569 ], [ 523577.778480749984737, 7485223.462142010219395 ], [ 523268.120747109991498, 7485625.951278139837086 ], [ 522902.449866149981972, 7486302.463320540264249 ], [ 522587.881250180013012, 7487010.960306259803474 ], [ 522285.260041049972642, 7487566.451212669722736 ], [ 521735.345336540020071, 7488269.453394209966063 ], [ 521415.015917160024401, 7488743.451923729851842 ], [ 521224.28995990002295, 7489118.450215740129352 ], [ 520689.08119361998979, 7490139.435721959918737 ], [ 520260.744578189973254, 7491109.445960289798677 ], [ 519972.781546910002362, 7492053.439017180353403 ], [ 519550.390407519997098, 7492831.928755390457809 ], [ 518943.53730775002623, 7493598.928786990232766 ], [ 518184.840464940003585, 7494525.920076359994709 ], [ 517804.770179970015306, 7494846.419316650368273 ], [ 517393.629248439974617, 7495306.919828530400991 ], [ 517026.319249610009138, 7495626.907642680220306 ], [ 516855.688426990003791, 7495863.411676510237157 ], [ 516444.34235097002238, 7496285.908533269539475 ], [ 515754.799057190015446, 7497040.40949865989387 ], [ 515687.31005864002509, 7497115.820520521141589 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.2248", "objectid": "2248", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.0689885561324, "fdipest_va": "None", "f_length": 7375.7325443051841 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 522843.713800630008336, 7511577.421128500252962 ], [ 522667.643244259990752, 7511811.672819529660046 ], [ 522459.529177899996284, 7512088.520967369899154 ], [ 522004.111833690025378, 7512606.520235720090568 ], [ 521206.44805255002575, 7513361.990735249593854 ], [ 520542.462652940012049, 7514160.968576639890671 ], [ 519928.680768750025891, 7514807.459462120197713 ], [ 519637.843780160008464, 7515158.941412970423698 ], [ 519480.055891769996379, 7515414.440671419724822 ], [ 519418.43464920000406, 7515485.763669120147824 ], [ 519041.141933469974902, 7515922.438162039965391 ], [ 517993.830778139992617, 7517134.404593770392239 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.2843", "objectid": "2843", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.20940977636200001, "fdipest_va": "None", "f_length": 8401.2324057531223 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 515687.31005864002509, 7499279.464208023622632 ], [ 515891.759344700025395, 7499082.908461970277131 ], [ 515937.860309560026508, 7499043.418337680399418 ], [ 516084.351389759976882, 7498918.921142539940774 ], [ 516132.401962460018694, 7498877.912625979632139 ], [ 516399.80081337998854, 7498690.920674299821258 ], [ 516446.690742139995564, 7498643.431208970025182 ], [ 516885.902088599978015, 7498199.429791740141809 ], [ 516997.112233689986169, 7498099.42919669020921 ], [ 517453.487259540008381, 7497683.898538310080767 ], [ 517473.779419790022075, 7497665.421633450314403 ], [ 517847.879607070004568, 7497213.920483820140362 ], [ 517992.779921379988082, 7496926.429134880192578 ], [ 518383.931465780013241, 7496275.420112829655409 ], [ 518769.290147739986423, 7495725.928489049896598 ], [ 519033.604051309986971, 7495151.432649079710245 ], [ 519611.795035559975076, 7493709.943739750422537 ], [ 519761.542984510015231, 7493104.438978809863329 ], [ 519879.251786859997083, 7492448.441115270368755 ], [ 519972.781546910002362, 7492053.439017180353403 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.2997", "objectid": "2997", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.144270450346, "fdipest_va": "None", "f_length": 14710.040273743693 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 545893.982440590043552, 7489525.865237230435014 ], [ 545755.501423749956302, 7489723.681356839835644 ], [ 545376.714752299943939, 7490292.184617109596729 ], [ 544972.205994840012863, 7490816.668644879944623 ], [ 544698.529046399984509, 7491229.161237480118871 ], [ 544585.511445099953562, 7491365.671757680363953 ], [ 544315.018133740057237, 7491692.172029820270836 ], [ 544278.199806150048971, 7491731.162152949720621 ], [ 544116.748927850043401, 7491902.661235259845853 ], [ 543948.009315419942141, 7492082.159292030148208 ], [ 543815.639348490047269, 7492181.652319029904902 ], [ 543212.941721210023388, 7492633.649540970101953 ], [ 542578.619356640032493, 7492980.651306429877877 ], [ 542286.889140769955702, 7493141.651626129634678 ], [ 541963.191630379995331, 7493283.139785939827561 ], [ 541373.259800240048207, 7493585.62896960042417 ], [ 540638.124322429997846, 7494130.628004129976034 ], [ 540139.053409980027936, 7494814.134235120378435 ], [ 539420.743872739956714, 7496089.788245170377195 ], [ 539394.932092539966106, 7496135.622971139848232 ], [ 539028.582859760033898, 7496659.634657469578087 ], [ 538598.44607518997509, 7497133.11172220017761 ], [ 538110.633066489943303, 7497524.112075549550354 ], [ 537533.494343, 7497858.113273129798472 ], [ 536981.509444260038435, 7498128.616054690442979 ], [ 536416.394748160033487, 7498309.60412959009409 ], [ 535889.294433110044338, 7498465.104733089916408 ], [ 535476.490004069986753, 7498575.614150510169566 ], [ 534479.09627294994425, 7498804.100987359881401 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.3496", "objectid": "3496", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.21290216458700001, "fdipest_va": "None", "f_length": 22078.032014181666 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 534630.344419640023261, 7483865.054920770227909 ], [ 534090.605516889947467, 7484046.061162989586592 ], [ 533742.16394764999859, 7484321.563762390054762 ], [ 533388.352786069968715, 7484794.567881429567933 ], [ 533015.993451450020075, 7485395.057500000111759 ], [ 532580.79170147003606, 7486055.071734 ], [ 531873.554617180023342, 7487027.045153779909015 ], [ 531550.802420830004849, 7487522.534031979739666 ], [ 530508.60395946004428, 7489023.526020259596407 ], [ 530193.100235059973784, 7489541.038226149976254 ], [ 529932.98886083997786, 7489804.025997609831393 ], [ 528977.92851385998074, 7490769.530310049653053 ], [ 528182.869514529942535, 7492066.029675690457225 ], [ 527790.80764607002493, 7492539.02315779030323 ], [ 527475.04337436996866, 7492999.0268415203318 ], [ 527088.25041355995927, 7493236.510807050392032 ], [ 526531.36511283996515, 7493812.513877440243959 ], [ 526241.489689219975844, 7494361.51259948965162 ], [ 526035.078369640046731, 7495088.003753029741347 ], [ 525796.658087110030465, 7495764.013787739910185 ], [ 525855.197643790044822, 7496044.014673720113933 ], [ 525794.777131009963341, 7496712.512838150374591 ], [ 525856.835597730008885, 7497705.016057100147009 ], [ 525757.751035670051351, 7498272.01408907957375 ], [ 525089.157086809980683, 7499446.523187180049717 ], [ 524596.275880079949275, 7500098.515409070067108 ], [ 524512.801641589961946, 7500182.007559839636087 ], [ 524248.587900620012078, 7500447.019791600294411 ], [ 523887.395825060026255, 7500808.999436230398715 ], [ 523814.809190919972025, 7500861.501062089577317 ], [ 523576.890120199997909, 7501033.501141640357673 ], [ 523090.591946310014464, 7501408.48978086002171 ], [ 522521.981803109985776, 7501847.499487180262804 ], [ 522422.251586830010638, 7501924.491564869880676 ], [ 522189.265679979987908, 7502103.998349949717522 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.3498", "objectid": "3498", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.14614318885499999, "fdipest_va": "None", "f_length": 15681.763068419115 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 539513.18738029000815, 7491597.135662140324712 ], [ 539039.420328530017287, 7492274.12993127014488 ], [ 538799.870407829992473, 7492714.619908530265093 ], [ 537896.952363259973936, 7494062.605013419874012 ], [ 536855.690676470054314, 7495537.219498230144382 ], [ 536570.445695930044167, 7495941.11459244042635 ], [ 534479.09627294994425, 7498804.100987359881401 ], [ 534340.198053610045463, 7498999.598917209543288 ], [ 534210.08037375996355, 7499182.601076159626245 ], [ 533285.191948459949344, 7500484.100489480420947 ], [ 533038.928390149958432, 7500854.600384600460529 ], [ 532980.302307370002382, 7500984.598948230035603 ], [ 532914.749698439962231, 7501129.601234369911253 ], [ 532869.005174660007469, 7501231.109522 ], [ 532622.259100739960559, 7501487.100418950431049 ], [ 532540.009993170038797, 7501632.111001119948924 ], [ 532401.508138290024363, 7501876.600775930099189 ], [ 532130.460120560019277, 7502165.598587250337005 ], [ 531813.067038940032944, 7502503.612030349671841 ], [ 531205.580599669949152, 7503124.104875519871712 ], [ 531092.210039410041645, 7503242.110120669938624 ], [ 530852.970184960053302, 7503491.101557740010321 ], [ 530456.141345420037396, 7503904.609147939831018 ], [ 530330.938629699987359, 7504034.600131260231137 ], [ 530175.965637290035374, 7504196.103201430290937 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5252", "objectid": "5252", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.0338998859949, "fdipest_va": "None", "f_length": 3484.3276283695277 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 524688.384331559995189, 7488743.497944040223956 ], [ 521224.28995990002295, 7489118.450215740129352 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5298", "objectid": "5298", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.077828032180899995, "fdipest_va": "None", "f_length": 822.38287322953818 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 515687.31005864002509, 7492455.859640089794993 ], [ 515821.361775620025583, 7492330.396451840177178 ], [ 516087.543438140011858, 7492144.398231060244143 ], [ 516385.874893560016062, 7492021.900239230133593 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5475", "objectid": "5475", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.042939642574700003, "fdipest_va": "None", "f_length": 4407.2642932469307 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 537479.487627579947002, 7491875.605280649848282 ], [ 538108.980728280032054, 7491621.570607610046864 ], [ 538653.382748030009679, 7491340.63658242020756 ], [ 539288.184233359992504, 7491102.136069759726524 ], [ 540207.945575259975158, 7490606.635625110007823 ], [ 540639.121395469992422, 7490337.128159949555993 ], [ 540907.502632849966176, 7490065.840333109721541 ], [ 540987.830442319973372, 7489984.639754460193217 ], [ 541044.12911024002824, 7489927.639171360060573 ], [ 541239.63983072002884, 7489576.641609829850495 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5484", "objectid": "5484", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.028534586903600001, "fdipest_va": "None", "f_length": 2980.007179219725 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 546077.045000139973126, 7511377.572510709986091 ], [ 546760.383333910023794, 7510983.120992070063949 ], [ 547274.148572140024044, 7510712.640855640172958 ], [ 547768.500521330046467, 7510360.139111110009253 ], [ 548034.69859790999908, 7510174.130197290331125 ], [ 548653.861043310025707, 7509880.755264730192721 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5991", "objectid": "5991", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.030848590592199999, "fdipest_va": "None", "f_length": 3275.664408692398 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 547917.222122960025445, 7486949.728884849697351 ], [ 547606.734297530027106, 7487180.715293980203569 ], [ 547106.486713789985515, 7487628.706764680333436 ], [ 546828.400167859974317, 7488005.707395079545677 ], [ 546500.341896250029095, 7488548.709076629951596 ], [ 546373.349525970057584, 7488770.701892349869013 ], [ 546153.451628749957308, 7489155.203512029722333 ], [ 545893.982440590043552, 7489525.865237230435014 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.5993", "objectid": "5993", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.074018082113200004, "fdipest_va": "None", "f_length": 7519.8765377399695 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 546577.260286420001648, 7487345.218131000176072 ], [ 546330.89916800998617, 7487696.71611354034394 ], [ 545786.336481709964573, 7488183.695748169906437 ], [ 545121.015556809958071, 7488689.692021830007434 ], [ 544468.1458506899653, 7489139.179791740141809 ], [ 543986.25772977003362, 7489440.682568839751184 ], [ 543574.24616961996071, 7489729.169508170336485 ], [ 543213.112730919965543, 7490017.653503140434623 ], [ 543048.607601730036549, 7490190.670277699828148 ], [ 542727.29424757999368, 7490582.411660600453615 ], [ 542565.714181120041758, 7490765.152392890304327 ], [ 542391.501186319976114, 7491085.14929233957082 ], [ 542259.79017825005576, 7491461.148964759893715 ], [ 542203.428717299946584, 7491646.147394060157239 ], [ 542059.954675570013933, 7492226.136979030445218 ], [ 541941.924439070047811, 7492825.14518687967211 ], [ 541963.191630379995331, 7493283.139785939827561 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.6000", "objectid": "6000", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.037058362088500003, "fdipest_va": "None", "f_length": 3960.9753628215476 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 529446.156541979988106, 7499851.690590590238571 ], [ 529080.291546280030161, 7500220.560018580406904 ], [ 528861.282109110034071, 7500456.376656860113144 ], [ 528593.159048130037263, 7500745.061562200076878 ], [ 528419.508611020050012, 7500966.560950050130486 ], [ 528302.37962347001303, 7501116.061090369708836 ], [ 528055.80054874997586, 7501423.059336580336094 ], [ 527895.380413289996795, 7501600.550623680464923 ], [ 527190.810228800051846, 7502380.041910089552402 ], [ 527002.751236020005308, 7502588.051300710067153 ], [ 526806.656610709964298, 7502805.055779269896448 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.7099", "objectid": "7099", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.063096864686899998, "fdipest_va": "None", "f_length": 6746.4153979801667 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 517946.071831570006907, 7488467.898605770431459 ], [ 519045.77152519999072, 7487029.905968300066888 ], [ 519197.270578199997544, 7486806.422487869858742 ], [ 520303.716124719998334, 7485450.934683210216463 ], [ 521784.480578640010208, 7483902.939748739823699 ], [ 522018.439330630004406, 7483621.429230930283666 ], [ 522322.308881259988993, 7483333.439529390074313 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.7222", "objectid": "7222", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.023526870670400001, "fdipest_va": "None", "f_length": 2522.4513746830626 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 521141.664378010027576, 7486458.435028789564967 ], [ 520294.173693760007154, 7487449.934960329905152 ], [ 520117.361577910021879, 7487711.427278730086982 ], [ 519978.909117389994208, 7488011.42803343012929 ], [ 519682.388958929979708, 7488515.927723529748619 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.8400", "objectid": "8400", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.039097727116900002, "fdipest_va": "None", "f_length": 2572.0268582499962 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 527486.920955068082549, 7521273.574077860452235 ], [ 528170.259027419961058, 7521093.710383520461619 ], [ 528411.254987620050088, 7521033.752876689657569 ], [ 528606.400429080007598, 7520985.19937258027494 ], [ 529986.090363980038092, 7520665.729998249560595 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.8973", "objectid": "8973", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.062307332187100002, "fdipest_va": "None", "f_length": 2826.4761570614514 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 530992.855844534235075, 7521273.574077860452235 ], [ 531297.701123569975607, 7520983.249538940377533 ], [ 531480.963544709957205, 7520734.238452129997313 ], [ 531917.638871380011551, 7520292.741055980324745 ], [ 532155.879878710024059, 7520065.750446840189397 ], [ 532538.044361050007865, 7519770.235373769886792 ], [ 532956.143834310001694, 7519517.757278610020876 ], [ 533136.407607130007818, 7519431.251275659538805 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.10762", "objectid": "10762", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.089243495753500005, "fdipest_va": "None", "f_length": 7145.3346815613522 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 521416.135769639979117, 7482669.934426570311189 ], [ 521112.019750770006794, 7482919.920276300050318 ], [ 520941.17862751998473, 7483098.931340790353715 ], [ 519643.779406770016067, 7484410.921453329734504 ], [ 519428.37901418999536, 7484590.407976619899273 ], [ 518845.536499290028587, 7485045.406873329542577 ], [ 517828.893789199995808, 7485749.401605719700456 ], [ 517634.900084780005272, 7485898.400607920251787 ], [ 517463.637543010001536, 7486001.3904719799757 ], [ 516284.113578960008454, 7486694.874556819908321 ], [ 515687.31005864002509, 7486940.339990976266563 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.11445", "objectid": "11445", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.043725421813099997, "fdipest_va": "None", "f_length": 4494.7846661542471 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 523814.809190919972025, 7500861.501062089577317 ], [ 524403.068835210055113, 7500914.508251950144768 ], [ 525518.201257530017756, 7500983.103860430419445 ], [ 526591.381750919972546, 7501049.041682800278068 ], [ 528009.380023929988965, 7501104.558906380087137 ], [ 528302.37962347001303, 7501116.061090369708836 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.12642", "objectid": "12642", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.14224340908499999, "fdipest_va": "None", "f_length": 786.14353439165507 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 561902.167282090056688, 7495667.56119192019105 ], [ 562666.860106543055736, 7495485.170016432181001 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.12646", "objectid": "12646", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.044439716927600001, "fdipest_va": "None", "f_length": 4566.9075934677721 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 528055.80054874997586, 7501423.059336580336094 ], [ 529283.510124549968168, 7501486.060903140343726 ], [ 529735.54628834000323, 7501486.244186529889703 ], [ 530418.709116179961711, 7501486.495882200077176 ], [ 531172.410778839956038, 7501486.738344419747591 ], [ 532463.803578209946863, 7501487.067533879540861 ], [ 532622.259100739960559, 7501487.100418950431049 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.12647", "objectid": "12647", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.17865293854299999, "fdipest_va": "None", "f_length": 18985.563687080074 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 520343.178845660004299, 7501712.978961739689112 ], [ 521600.978795, 7500716.479862280189991 ], [ 522066.440767369989771, 7500347.990559520199895 ], [ 522262.589272340002935, 7500072.482112180441618 ], [ 523291.23883935000049, 7498627.490776379592717 ], [ 523430.941085200000089, 7498430.979713380336761 ], [ 524119.321671199984848, 7497642.515167159959674 ], [ 524494.087621630053036, 7496605.006665759719908 ], [ 524724.625480890041217, 7495307.987497569993138 ], [ 525272.357812479953282, 7494039.499616749584675 ], [ 525704.705044450005516, 7493463.004130420275033 ], [ 526223.552350059966557, 7492598.513504239730537 ], [ 526718.599498050054535, 7491736.499324159696698 ], [ 527174.819998839986511, 7490782.511625469662249 ], [ 527680.867203320027329, 7490012.509104180149734 ], [ 528289.459433970041573, 7489080.5208191704005 ], [ 528731.341024499968626, 7488476.021522340364754 ], [ 528891.789115860010497, 7488198.021047179587185 ], [ 529097.547816199949011, 7487841.02214759029448 ], [ 529422.971164569957182, 7487328.51025386992842 ], [ 529486.573557080002502, 7487228.240700149908662 ], [ 529610.718033500015736, 7487032.521789319813251 ], [ 529682.618564800010063, 7486919.515432059764862 ], [ 530172.6139977700077, 7486401.029060339555144 ], [ 530691.434301109984517, 7485795.528237929567695 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.12658", "objectid": "12658", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.15447701996, "fdipest_va": "None", "f_length": 15200.046509349622 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 546639.326832990045659, 7512670.782520250417292 ], [ 547057.775435899966396, 7512183.625658540055156 ], [ 547482.991678660036996, 7511755.15088418032974 ], [ 547514.270673359977081, 7511723.630796080455184 ], [ 547817.780032480019145, 7511359.139636830426753 ], [ 547988.058195890043862, 7511059.142060459591448 ], [ 548241.141583189950325, 7510796.629177399910986 ], [ 548272.140547640039586, 7510624.629289410077035 ], [ 548653.861043310025707, 7509880.755264730192721 ], [ 548691.03702358994633, 7509786.30969331972301 ], [ 548901.391993590048514, 7509041.566284390166402 ], [ 548978.500856050057337, 7508211.383331050164998 ], [ 548948.533902819966897, 7507152.606030480004847 ], [ 548779.685502600041218, 7504205.423594909720123 ], [ 548696.40364779997617, 7503089.566730390302837 ], [ 548667.183838249999098, 7502259.716654529795051 ], [ 548771.482885590055957, 7501629.778157870285213 ], [ 549125.659183360054158, 7501291.062091520056129 ], [ 549221.865539910038933, 7501199.051245300099254 ], [ 550309.222220050054602, 7500537.295864489860833 ], [ 551263.632066929945722, 7499875.891512420028448 ], [ 551387.972487649996765, 7499780.993722099810839 ], [ 551979.205525040044449, 7499329.728640070185065 ], [ 552615.423490180051886, 7498898.280161679722369 ], [ 552794.049566520028748, 7498772.552346600219607 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.12660", "objectid": "12660", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.12769222022500001, "fdipest_va": "None", "f_length": 5446.0141803419847 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 515687.31005864002509, 7509754.226525011472404 ], [ 515762.921122459985781, 7509734.929779949598014 ], [ 516050.241491410008166, 7509647.433505680412054 ], [ 517524.078368620015681, 7509517.960638030432165 ], [ 517746.860329139977694, 7509496.468574400059879 ], [ 518067.749226149986498, 7509452.469257179647684 ], [ 518912.777727360022254, 7509330.469264090061188 ], [ 519307.440221610013396, 7509273.489978619851172 ], [ 520543.734839770011604, 7509095.012791169807315 ], [ 521090.551235229999293, 7509073.010523959994316 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.14378", "objectid": "14378", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.23642521048199999, "fdipest_va": "None", "f_length": 10307.327864510869 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 515687.31005864002509, 7504448.313224441371858 ], [ 515694.686183339974377, 7504430.430270689539611 ], [ 515738.884765990020242, 7504353.44032260030508 ], [ 516394.712813880003523, 7503210.940093110315502 ], [ 516559.528845859982539, 7502992.442232459783554 ], [ 516863.057892550015822, 7502589.942326090298593 ], [ 516965.380961949995253, 7502458.640669760294259 ], [ 516985.409341790014878, 7502432.939720500260592 ], [ 517381.030367530009244, 7501996.450458600185812 ], [ 517439.452265209984034, 7501894.939140919595957 ], [ 517626.978287780017126, 7501568.438148490153253 ], [ 517873.439548989990726, 7501235.941138340160251 ], [ 517978.502588119998109, 7501117.440985389985144 ], [ 518524.94426239997847, 7500500.44191140960902 ], [ 518815.131402549974155, 7500008.949371010065079 ], [ 518839.308721749985125, 7499930.939910490065813 ], [ 518912.270378570014145, 7499695.460613209754229 ], [ 518959.7393457100261, 7499542.451161020435393 ], [ 519006.429596919973847, 7499391.451385069638491 ], [ 519103.091585670015775, 7499079.938515909947455 ], [ 519142.373424510005862, 7498952.950562380254269 ], [ 519198.908855680027045, 7498812.449021309614182 ], [ 519252.201017629995476, 7498679.95235482044518 ], [ 519335.661807239986956, 7498472.439554910175502 ], [ 519782.088446919980925, 7497413.448312009684741 ], [ 520002.388502940011676, 7496934.941946909762919 ], [ 520209.108364530024119, 7496271.949922599829733 ], [ 520631.035448519978672, 7495403.94553089980036 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.15546", "objectid": "15546", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.0197555949106, "fdipest_va": "None", "f_length": 2021.0069333961442 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 524248.587900620012078, 7500447.019791600294411 ], [ 523397.800140250008553, 7500183.491012180224061 ], [ 522854.101535509980749, 7500070.490630240179598 ], [ 522262.589272340002935, 7500072.482112180441618 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.16399", "objectid": "16399", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.10255475240299999, "fdipest_va": "None", "f_length": 2555.8730471701929 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 556931.350873869960196, 7494207.778886959888041 ], [ 556392.397013530018739, 7494547.771397120319307 ], [ 556063.474038669955917, 7494912.25786785967648 ], [ 555539.31373061996419, 7495666.264463040046394 ], [ 555257.961555329966359, 7496120.253690180368721 ], [ 555072.269406519946642, 7496419.742752940393984 ], [ 554527.538610500050709, 7496881.231944220140576 ], [ 554307.539024519966915, 7497121.239912189543247 ], [ 552794.049566520028748, 7498772.552346600219607 ], [ 553596.084641049965285, 7498208.018528309650719 ], [ 554152.403222299995832, 7497748.167106780223548 ], [ 554862.030735339969397, 7497234.060149200260639 ], [ 555089.240362670039758, 7497031.250550740398467 ], [ 555214.778581200051121, 7496966.737625430338085 ], [ 555303.849349590018392, 7496972.251311229541898 ], [ 555397.432319379993714, 7496948.761133509688079 ], [ 555500.588549330015667, 7496894.751310749910772 ], [ 556810.039340780000202, 7496760.771355650387704 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.16754", "objectid": "16754", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.076670351064200004, "fdipest_va": "None", "f_length": 2853.6595338894481 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 562666.860106543055736, 7480980.264266897924244 ], [ 560416.268656759988517, 7482734.747342200018466 ] ] ] } }, +{ "type": "Feature", "properties": { "gml_id": "linear_500k.16769", "objectid": "16769", "feature": "Fault or shear zone", "type": "exposed", "fname": "None", "code": null, "dip": "90", "dip_est": "-999", "dip_dir": "45", "plunge": "0", "plunge_est": null, "plunge_dir": null, "max_age_ev": null, "min_age_ev": null, "symbol": "Fault or shear zone; exposed", "extract_da": "2016-06-29", "shape_leng": 0.061466720252799999, "fdipest_va": "None", "f_length": 6307.3461221196421 }, "geometry": { "type": "MultiLineString", "coordinates": [ [ [ 522459.529177899996284, 7512088.520967369899154 ], [ 521710.489959909988102, 7512392.008338660001755 ], [ 521012.040045049972832, 7512605.499643789604306 ], [ 520338.628719249973074, 7512761.992342449724674 ], [ 519646.421773399983067, 7512962.969492119736969 ], [ 518845.849511170003098, 7513113.960254170000553 ], [ 518852.321420539985411, 7513132.95880111027509 ], [ 518681.600405959994532, 7513163.460244859568775 ], [ 517568.778656709997449, 7513362.440888900309801 ], [ 516323.225535330013372, 7513547.422167040407658 ] ] ] } } +] +} diff --git a/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/geology.geojson b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/geology.geojson new file mode 100644 index 000000000..bead96b9b --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/geology.geojson @@ -0,0 +1,69 @@ +{ + "type": "FeatureCollection", + "name": "geo_json3", + "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::28350" } }, + "features": [ + { "type": "Feature", "properties": { "gml_id": "geol_500k.15789", "objectid": "15791", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.039054682379700001, "shape_area": 6.8818024751e-05 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 516489.109890850028023, 7497660.420436239801347 ], [ 516265.418169579992536, 7497432.421495869755745 ], [ 515863.180090909998398, 7497103.421118300408125 ], [ 515793.128931319981348, 7497078.399584740400314 ], [ 515754.799057190015446, 7497040.40949865989387 ], [ 515687.31005864002509, 7497115.820520521141589 ], [ 515687.31005864002509, 7497389.639072336256504 ], [ 515870.970363410015125, 7497621.410565420053899 ], [ 516091.261018930003047, 7498037.406657399609685 ], [ 516446.690742139995564, 7498643.431208970025182 ], [ 516885.902088599978015, 7498199.429791740141809 ], [ 516642.618601860012859, 7497850.430777939967811 ], [ 516489.109890850028023, 7497660.420436239801347 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15268", "objectid": "15270", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.035312963642799997, "shape_area": 3.7384857464999998e-05 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7498836.682474304921925 ], [ 515699.650689409987535, 7498844.919029789976776 ], [ 515937.860309560026508, 7499043.41833767015487 ], [ 516084.351389759976882, 7498918.921142539940774 ], [ 515687.31005864002509, 7498557.942764979787171 ], [ 515687.31005864002509, 7498836.682474304921925 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15980", "objectid": "15982", "lithstrtno": "4104", "code": "P_-HAo-ci", "unitname": "Boolgeeda Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Fine-grained finely laminated iron-formation mudstone siltstone and chert; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Boolgeeda Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2445", "maxuncerty": "5", "min_age_ma": "2445", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.092179988539400001, "shape_area": 0.00021256973534600001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7502462.967454206198454 ], [ 515987.759246180008631, 7502401.430705550126731 ], [ 516678.098510309995618, 7502381.430084919556975 ], [ 516985.409341790014878, 7502432.939720500260592 ], [ 517381.030367530067451, 7501996.450458600185812 ], [ 517068.967790280003101, 7501902.438979189842939 ], [ 516636.078343549976125, 7501815.939950410276651 ], [ 516241.760339149972424, 7501804.929461900144815 ], [ 515739.549064819933847, 7501845.9300237596035 ], [ 515687.31005864002509, 7501854.524165705777705 ], [ 515687.31005864002509, 7502462.967454206198454 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15265", "objectid": "15267", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.15264706186599999, "shape_area": 0.00023218029691500001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 516932.129444469988812, 7508983.448731999844313 ], [ 516500.239082209998742, 7508810.949452149681747 ], [ 516068.361104719981086, 7508702.950624800287187 ], [ 515687.31005864002509, 7508702.941175408661366 ], [ 515687.31005864002509, 7509097.518641549162567 ], [ 515748.540348690003157, 7509100.438180999830365 ], [ 516262.539369589998387, 7509100.438068529590964 ], [ 516923.330806820013095, 7509295.960885399952531 ], [ 517412.839451649982948, 7509467.451953100040555 ], [ 517524.078368620015681, 7509517.960638030432165 ], [ 517746.860329139977694, 7509496.468574389815331 ], [ 518067.749226149986498, 7509452.469257179647684 ], [ 517364.010314400016796, 7509199.458663940429688 ], [ 516932.129444469988812, 7508983.448731999844313 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15792", "objectid": "15794", "lithstrtno": "2257", "code": "A-HAd-kd", "unitname": "Wittenoom Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Thinly bedded dolomite and dolomitic shale with minor black chert shale banded iron formation and sandstone", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary carbonate", "lithname1": "dolostone/dolomite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Wittenoom Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2597", "maxuncerty": "5", "min_age_ma": "2504", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.26142909190500002, "shape_area": 0.00079194695656000002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7498557.942764979787171 ], [ 516084.351389759976882, 7498918.921142539940774 ], [ 516132.401962460018694, 7498877.912625970318913 ], [ 516399.80081337998854, 7498690.920674299821258 ], [ 516446.690742139995564, 7498643.431208970025182 ], [ 516091.261018930003047, 7498037.406657399609685 ], [ 515870.970363410015125, 7497621.410565420053899 ], [ 515687.31005864002509, 7497389.639072336256504 ], [ 515687.31005864002509, 7498557.942764979787171 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.6146", "objectid": "6146", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.14670614110399999, "shape_area": 0.00030483652789599998 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7512669.795848976820707 ], [ 515874.111506199988071, 7512722.429059149697423 ], [ 516218.100934160000179, 7512841.928693260066211 ], [ 516581.109581539989449, 7512947.942037159577012 ], [ 516950.179108329990413, 7512996.938222900032997 ], [ 517211.341055419994518, 7513084.441398180089891 ], [ 517453.790812560007907, 7513254.941454670391977 ], [ 517536.821597650006879, 7513324.449564079754055 ], [ 517568.778656709997449, 7513362.440888900309801 ], [ 518681.600405959994532, 7513163.460244859568775 ], [ 518597.557984340004623, 7513057.962165310047567 ], [ 517979.090877019974869, 7512723.947809649631381 ], [ 517686.161481269984506, 7512642.961933420039713 ], [ 517399.700083919975441, 7512574.440202699974179 ], [ 516992.429335139982868, 7512525.438015379942954 ], [ 516623.332059949985705, 7512470.430852239951491 ], [ 515897.470287500007544, 7512289.931990399956703 ], [ 515687.31005864002509, 7512222.224365059286356 ], [ 515687.31005864002509, 7512669.795848976820707 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.7277", "objectid": "7278", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.041118133077500001, "shape_area": 9.9664177622999994e-05 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 521206.44805255002575, 7513361.990735240280628 ], [ 520938.88133815000765, 7513267.979400220327079 ], [ 520645.308756140002515, 7513059.488957329653203 ], [ 520453.800194829993416, 7512901.488577979616821 ], [ 520389.861160249973182, 7512831.980105480179191 ], [ 520370.700128689990379, 7512818.980279499664903 ], [ 520338.628719249973074, 7512761.992342449724674 ], [ 519646.421773399983067, 7512962.969492110423744 ], [ 519742.828652449999936, 7513178.980483889579773 ], [ 519820.111488119990099, 7513375.970130239613354 ], [ 519916.470420499972533, 7513578.972261999733746 ], [ 520057.24140861997148, 7513756.472654789686203 ], [ 520165.887963470013347, 7513870.459660449996591 ], [ 520280.829740790009964, 7513977.971144840121269 ], [ 520338.34111842000857, 7514028.471192579716444 ], [ 520542.462652940012049, 7514160.968576629646122 ], [ 521206.44805255002575, 7513361.990735240280628 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.6145", "objectid": "6145", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.17169877906600001, "shape_area": 0.00036586587207799998 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7511091.777985905297101 ], [ 516172.129114950017538, 7511206.442232700064778 ], [ 516484.161324460001197, 7511287.432342950254679 ], [ 517223.009906649996992, 7511531.451243470422924 ], [ 517649.621018150006421, 7511643.96055980026722 ], [ 518044.527874129998963, 7511781.458831120282412 ], [ 518131.416117589978967, 7511817.681890560314059 ], [ 518452.369648710009642, 7511951.479337790049613 ], [ 518840.980136949976441, 7512101.969939400441945 ], [ 519490.44943603000138, 7512263.979586419649422 ], [ 520177.610525219934061, 7512329.978099579922855 ], [ 520438.649691370024811, 7512399.000608219765127 ], [ 520693.509920759999659, 7512499.000128109939396 ], [ 521012.040045049972832, 7512605.49964378029108 ], [ 521710.489959909988102, 7512392.008338649757206 ], [ 521551.367963330005296, 7512361.009483519941568 ], [ 521156.288484309974592, 7512191.000949360430241 ], [ 520563.539981840061955, 7511920.501662779599428 ], [ 520258.068798760010395, 7511871.500498970039189 ], [ 519984.45962465001503, 7511840.989471119828522 ], [ 519894.13068081001984, 7511815.505585880018771 ], [ 519608.750958350021392, 7511734.989269830286503 ], [ 519041.831551529990975, 7511534.482516329735518 ], [ 518143.769826399977319, 7511252.968656219542027 ], [ 517851.030990800005384, 7511209.959799789823592 ], [ 517500.928361040016171, 7511135.449482630006969 ], [ 517163.401391200022772, 7511035.449545609764755 ], [ 516431.110172140004579, 7510841.937734680250287 ], [ 516099.911749830003828, 7510729.441395100206137 ], [ 515687.31005864002509, 7510535.495148473419249 ], [ 515687.31005864002509, 7511091.777985905297101 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.6144", "objectid": "6144", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.15880906124700001, "shape_area": 0.00032910197507299998 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 516947.638945150014479, 7511819.030170059762895 ], [ 516836.319113210018259, 7511794.450638740323484 ], [ 516460.880282170022838, 7511739.42922518029809 ], [ 516091.67063110001618, 7511671.432536300271749 ], [ 515741.351565840013791, 7511558.431179 ], [ 515687.31005864002509, 7511543.949450626038015 ], [ 515687.31005864002509, 7512222.224365059286356 ], [ 515897.470287500007544, 7512289.931990399956703 ], [ 516623.332059949985705, 7512470.430852239951491 ], [ 516992.429335139982868, 7512525.438015379942954 ], [ 517399.700083919975441, 7512574.440202699974179 ], [ 517686.161481269984506, 7512642.961933420039713 ], [ 517979.090877019974869, 7512723.947809649631381 ], [ 518597.557984340004623, 7513057.962165310047567 ], [ 518681.600405959994532, 7513163.460244859568775 ], [ 518852.321420539985411, 7513132.95880111027509 ], [ 518845.849511170003098, 7513113.960254170000553 ], [ 519646.421773399983067, 7512962.969492110423744 ], [ 519366.229568860027939, 7512888.468247819691896 ], [ 519003.070431359985378, 7512743.968761979602277 ], [ 518717.717256509989966, 7512586.076355170458555 ], [ 517989.227753239974845, 7512182.947854270227253 ], [ 517562.118612990016118, 7511968.948265319690108 ], [ 517173.73125335999066, 7511868.948861289769411 ], [ 516947.638945150014479, 7511819.030170059762895 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.8405", "objectid": "8406", "lithstrtno": "2257", "code": "A-HAd-kd", "unitname": "Wittenoom Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Thinly bedded dolomite and dolomitic shale with minor black chert shale banded iron formation and sandstone", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary carbonate", "lithname1": "dolostone/dolomite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Wittenoom Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2597", "maxuncerty": "5", "min_age_ma": "2504", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.54684734904099996, "shape_area": 0.0020905981532100002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 561550.468092117458582, 7473446.765934069640934 ], [ 561563.771348390029743, 7473504.338690780103207 ], [ 561907.560773620032705, 7474006.840184009633958 ], [ 561881.149548829998821, 7474430.329383400268853 ], [ 561616.650867559947073, 7474853.339500810019672 ], [ 561219.878350600018166, 7475276.850051529705524 ], [ 560928.940531059983186, 7475620.339508170261979 ], [ 560770.241452359943651, 7475990.848633529618382 ], [ 560638.070735429995693, 7476334.832341159693897 ], [ 560611.57851814001333, 7476731.339792679995298 ], [ 560690.949486859957688, 7477048.840362769551575 ], [ 560849.620869579957798, 7477524.841734640300274 ], [ 560770.249323150026612, 7478159.841215039603412 ], [ 560426.431284490041435, 7478582.820712439715862 ], [ 560135.491078190039843, 7478900.317874279804528 ], [ 559447.810751999961212, 7479693.820964760147035 ], [ 558945.300989239942282, 7480407.810311909765005 ], [ 558495.691402100026608, 7480910.312827819958329 ], [ 558166.318415640038438, 7481134.301850469782948 ], [ 558961.618415990029462, 7480662.810186740010977 ], [ 559565.259590790024959, 7480131.810321420431137 ], [ 560188.359123370028101, 7479905.321263619698584 ], [ 560664.510850730002858, 7479482.31912678014487 ], [ 560955.420378569979221, 7479111.827466390095651 ], [ 561166.979595110053197, 7478767.82974832970649 ], [ 561325.679088150034659, 7478291.849648060277104 ], [ 561695.998378359945491, 7477577.838732260279357 ], [ 561775.329069140017964, 7477180.839138709940016 ], [ 561907.561282849987037, 7476837.331754730083048 ], [ 561960.510675700032152, 7476493.341559140011668 ], [ 562066.239222049945965, 7476122.842129549942911 ], [ 562145.619462150032632, 7475408.850841050036252 ], [ 562330.751035189954564, 7474800.341639880090952 ], [ 562489.470800000010058, 7474509.841486860066652 ], [ 562648.130346660036594, 7474324.341077829711139 ], [ 562666.860106543055736, 7474303.736969869583845 ], [ 562666.860106543055736, 7473446.765934069640934 ], [ 561550.468092117458582, 7473446.765934069640934 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 547768.500521330046467, 7510360.139111110009253 ], [ 547833.519514949992299, 7510658.638555710203946 ], [ 547885.330302570015192, 7510849.639051630161703 ], [ 547988.058195890043862, 7511059.142060450278223 ], [ 547817.780032480019145, 7511359.139636830426753 ], [ 547901.03905262995977, 7511473.128256909549236 ], [ 547932.950905930018052, 7511504.638110539875925 ], [ 548009.819583300035447, 7511625.129985979758203 ], [ 548178.131280350033194, 7511752.991772890090942 ], [ 548201.349203830002807, 7511770.629450149834156 ], [ 548481.851744340034202, 7511915.631002140231431 ], [ 548736.970398409990594, 7512073.130470720119774 ], [ 549017.801531590055674, 7512281.621161259710789 ], [ 549266.988626049947925, 7512528.631090340204537 ], [ 549472.106614929973148, 7512864.628942149691284 ], [ 549772.058370289974846, 7513079.628066340461373 ], [ 550173.499784040031955, 7513255.62858837004751 ], [ 550950.400427169981413, 7513461.621362959966063 ], [ 551567.762133099953644, 7513579.118968450464308 ], [ 552064.388414149987511, 7513691.120811220258474 ], [ 552484.819579840055667, 7513847.627401660196483 ], [ 552937.390739509952255, 7514068.127719609998167 ], [ 553383.760596489999443, 7514320.130556900054216 ], [ 553824.052093980018981, 7514629.628393420018256 ], [ 554181.489136890042573, 7514895.140189480036497 ], [ 554539.221081939991564, 7515236.639436399564147 ], [ 554814.480289179948159, 7515610.641654879786074 ], [ 554930.360569710028358, 7515909.641129069961607 ], [ 554951.438217940041795, 7516316.639842939563096 ], [ 554933.830054279998876, 7516622.139660909771919 ], [ 554890.961307900026441, 7516972.630977650173008 ], [ 554860.818122409982607, 7517322.630331659689546 ], [ 554824.139225039980374, 7517622.140910509973764 ], [ 554897.088812969974242, 7518396.171608179807663 ], [ 554990.890518759959377, 7518802.678673019632697 ], [ 554959.590303609962575, 7519302.710580710321665 ], [ 554834.590492289979011, 7519521.198743339627981 ], [ 554584.581370970001444, 7519677.698691800236702 ], [ 553990.791554949944839, 7519927.697815929539502 ], [ 553271.979911400005221, 7520177.701487329788506 ], [ 553115.749627399956807, 7520427.709148810245097 ], [ 553146.990613440051675, 7520646.717184250243008 ], [ 553303.249616930028424, 7520834.22156201954931 ], [ 553678.270213259966113, 7520896.729390090331435 ], [ 553990.800218899967149, 7520927.738220330327749 ], [ 554490.839493039995432, 7521115.259799200110137 ], [ 554834.608359670033678, 7521271.771419700235128 ], [ 554839.565807851380669, 7521273.574077860452235 ], [ 558460.411528728553094, 7521273.574077860452235 ], [ 558238.450282489997335, 7521166.869241730310023 ], [ 557956.12811321998015, 7521064.850063189864159 ], [ 557667.16034474002663, 7520992.830326260067523 ], [ 557369.090800640056841, 7520948.830952799879014 ], [ 556557.541478430037387, 7520906.290372299961746 ], [ 556241.911961329984479, 7520868.278911869972944 ], [ 556016.910099909990095, 7520810.279890170320868 ], [ 555875.008043820038438, 7520751.280601110309362 ], [ 555741.528840159997344, 7520671.768353310413659 ], [ 555625.0989471799694, 7520574.75992317032069 ], [ 555524.010952410055324, 7520458.748933349736035 ], [ 555445.039403719943948, 7520328.249057630077004 ], [ 555395.219155670027249, 7520186.728332799859345 ], [ 555380.380525280022994, 7520048.739566369913518 ], [ 555395.219437, 7519909.729079619981349 ], [ 555435.229578880011104, 7519783.219700600020587 ], [ 555499.088824820006266, 7519667.229853720404208 ], [ 555656.229406600003131, 7519486.211165229789913 ], [ 555751.088573709945194, 7519358.719103270210326 ], [ 555819.40149920003023, 7519212.707879190333188 ], [ 555864.690977880032733, 7519055.707995560020208 ], [ 555895.20233105996158, 7518834.189246309921145 ], [ 555891.331017449963838, 7518695.690531640313566 ], [ 555859.967723189969547, 7518557.180103110149503 ], [ 555679.380945910001174, 7518139.159300490282476 ], [ 555568.341814159997739, 7517762.650496209971607 ], [ 555453.009693500003777, 7517472.130774790421128 ], [ 555401.158959190011956, 7517268.627473950386047 ], [ 555355.189109880011529, 7516970.139454229734838 ], [ 555224.830583850038238, 7516302.639430030249059 ], [ 555204.231297930004075, 7515990.63084764033556 ], [ 555309.620501619996503, 7515417.141945170238614 ], [ 555282.850133699947037, 7515150.140203859657049 ], [ 555039.742031399975531, 7514839.630795430392027 ], [ 554707.61186786997132, 7514542.129785289987922 ], [ 553884.700595819973387, 7514012.140901519916952 ], [ 553444.402655750047415, 7513702.63016252964735 ], [ 552851.751237579970621, 7513457.631798190064728 ], [ 551928.048944719950669, 7513125.131682810373604 ], [ 551514.231136110029183, 7513032.119074979797006 ], [ 551088.32145434000995, 7513053.619084529578686 ], [ 550643.040906760026701, 7513030.119286200031638 ], [ 550324.670768719981425, 7512949.121770850382745 ], [ 549973.879873230005614, 7512734.618608069606125 ], [ 549303.431781059945934, 7512159.130994699895382 ], [ 549054.210299010039307, 7511925.130071610212326 ], [ 548914.382106699980795, 7511750.67075092997402 ], [ 548689.44884283002466, 7511449.628524029627442 ], [ 548413.86996265000198, 7510999.63763992022723 ], [ 548292.197725779959001, 7510834.630641140043736 ], [ 548241.141583189950325, 7510796.629177389666438 ], [ 548272.140547640039586, 7510624.629289399832487 ], [ 548214.591759399976581, 7510548.640630640089512 ], [ 548034.69859790999908, 7510174.130197280086577 ], [ 547768.500521330046467, 7510360.139111110009253 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 547768.500521330046467, 7510360.139111110009253 ], [ 547742.74022460996639, 7510290.129271860234439 ], [ 547704.259539189981297, 7510226.642881070263684 ], [ 547468.009936959948391, 7510024.139007830061018 ], [ 547270.312866059946828, 7509910.650194940157235 ], [ 547123.421548460028134, 7509784.130571500398219 ], [ 546931.679415010032244, 7509581.640348309651017 ], [ 546815.548757059965283, 7509245.150106180459261 ], [ 546813.419814339955337, 7508786.638606240041554 ], [ 546793.049552879994735, 7508519.641761479899287 ], [ 546760.171894729952328, 7508297.151622120290995 ], [ 546630.139276860048994, 7507705.651409690268338 ], [ 546603.180793819949031, 7507387.650260009802878 ], [ 546506.497807570034638, 7507121.148085170425475 ], [ 546347.061501309974119, 7507032.637269330210984 ], [ 546098.209188740001991, 7506843.148602940142155 ], [ 545931.308838529977947, 7506525.652599480003119 ], [ 545783.23040363995824, 7506157.6511867698282 ], [ 545590.600436890032142, 7505770.149005670100451 ], [ 545302.220849859993905, 7505307.161514719948173 ], [ 544943.521832979982719, 7504761.659700149670243 ], [ 544725.589950209949166, 7504406.66118496004492 ], [ 544501.330129939946346, 7504057.659381669946015 ], [ 544123.749267379986122, 7503569.650559930130839 ], [ 543753.371735660010017, 7503247.158579030074179 ], [ 543357.140349189983681, 7502835.651261850260198 ], [ 543024.980478130048141, 7502538.151226189918816 ], [ 541869.510881360038184, 7501596.148375390097499 ], [ 541378.088292040047236, 7501255.148356759920716 ], [ 540868.300419189967215, 7501022.139786539599299 ], [ 540434.96862149995286, 7500840.140409230254591 ], [ 539886.788453469984233, 7500575.638558169826865 ], [ 539472.379663869971409, 7500361.638875110074878 ], [ 539128.007963520009071, 7500159.64022110030055 ], [ 538782.997857899987139, 7499830.628830580040812 ], [ 538476.510809400002472, 7499571.631227860227227 ], [ 538240.74927738995757, 7499470.6311592804268 ], [ 537903.119748480035923, 7499358.130287540145218 ], [ 537565.798215589951724, 7499296.129047449678183 ], [ 536808.489000750007108, 7499179.611402070149779 ], [ 536356.470196150010452, 7499080.119504460133612 ], [ 535866.539422170026228, 7499031.610276879742742 ], [ 535319.490297780022956, 7498996.622168369591236 ], [ 534772.740833109943196, 7499031.601619520224631 ], [ 534210.08037375996355, 7499182.60107615031302 ], [ 534340.198053610045463, 7498999.598917200230062 ], [ 533821.509492740035057, 7499055.600588059984148 ], [ 533411.811376899946481, 7499131.089975969865918 ], [ 532789.751342240022495, 7499313.0907301902771 ], [ 532046.250118199968711, 7499359.088792430236936 ], [ 531560.670086210011505, 7499404.592412210069597 ], [ 531257.250016, 7499404.57940736040473 ], [ 530968.912698370055296, 7499419.569814129732549 ], [ 530650.280006880057044, 7499495.580507 ], [ 530361.971643759985454, 7499601.580113629810512 ], [ 530210.299777820007876, 7499647.070799119770527 ], [ 530073.730894480017014, 7499647.070125780068338 ], [ 529891.582825729972683, 7499586.560860619880259 ], [ 529755.099128170055337, 7499495.580794850364327 ], [ 529648.829291590023786, 7499434.557870909571648 ], [ 528920.518834950053133, 7499359.061077320016921 ], [ 527979.749291989952326, 7499328.541776300407946 ], [ 527312.150629559997469, 7499283.029891399666667 ], [ 526705.180449269944802, 7499192.0412488700822 ], [ 525809.999477840028703, 7499116.019442549906671 ], [ 525476.200942059978843, 7499040.010854230262339 ], [ 525203.037625279976055, 7498994.508480500429869 ], [ 524869.238765610032715, 7498918.510846289806068 ], [ 524080.230386840063147, 7498843.010146860033274 ], [ 523609.870466449996457, 7498706.489138640463352 ], [ 523291.23883935000049, 7498627.490776370279491 ], [ 523430.941085200000089, 7498430.979713370092213 ], [ 523169.751951899961568, 7498336.99168633017689 ], [ 523067.899913350061979, 7498311.989780469797552 ], [ 522895.790943439991679, 7498236.478123749606311 ], [ 522615.201595210004598, 7498072.470330759882927 ], [ 521882.681205840024631, 7497821.95909606013447 ], [ 521526.329923179990146, 7497779.458482449874282 ], [ 521208.34053024998866, 7497768.461113699711859 ], [ 520979.320096470008139, 7497743.970866629853845 ], [ 520246.918788719980512, 7497531.941943439655006 ], [ 519782.088446919980925, 7497413.448312009684741 ], [ 520002.388502939953469, 7496934.941946909762919 ], [ 520209.108364530024119, 7496271.949922599829733 ], [ 520062.099349690019153, 7496119.939772210083902 ], [ 519908.908905629999936, 7495993.45121334027499 ], [ 519762.199077040073462, 7495904.939755939878523 ], [ 519433.317879359994549, 7496282.440096310339868 ], [ 519021.359903179982211, 7496577.43004279024899 ], [ 518014.126850700005889, 7497123.757406969554722 ], [ 517847.87960706994636, 7497213.920483809895813 ], [ 518052.658892910054419, 7497479.929860760457814 ], [ 518378.750043659994844, 7497847.439117729663849 ], [ 518634.320034599979408, 7498094.449079169891775 ], [ 518908.57940345996758, 7498264.440973529592156 ], [ 519335.661807239928748, 7498472.439554899930954 ], [ 519252.201017629995476, 7498679.95235482044518 ], [ 519560.629717999952845, 7498905.449083999730647 ], [ 519841.059423100028653, 7499099.460949829779565 ], [ 520204.509207860042807, 7499313.960170620121062 ], [ 520701.558828630018979, 7499521.471808220259845 ], [ 521058.238675899978261, 7499640.459560570307076 ], [ 521446.58837318001315, 7499727.479032450355589 ], [ 521783.75906401994871, 7499750.978217979893088 ], [ 522165.428285450034309, 7499767.980588540434837 ], [ 522349.829996639920864, 7499766.980938440188766 ], [ 522960.039467710070312, 7499706.491441669873893 ], [ 523297.169660909916274, 7499723.988046020269394 ], [ 523539.32880095008295, 7499824.488559490069747 ], [ 523807.080191819986794, 7499963.000741709955037 ], [ 524463.09924496000167, 7500175.499866460449994 ], [ 524512.801641589961946, 7500182.007559839636087 ], [ 524717.158815650036559, 7500210.008445120416582 ], [ 525080.378881589975208, 7500248.520118249580264 ], [ 525373.009474970051087, 7500266.021161619573832 ], [ 525849.759919609990902, 7500225.52054840978235 ], [ 526409.297543440014124, 7500216.030406280420721 ], [ 527668.650482030003332, 7500241.048918349668384 ], [ 527986.562664440018125, 7500239.548052719794214 ], [ 528679.648660099948756, 7500223.049524989910424 ], [ 528991.080585750052705, 7500183.048984399996698 ], [ 529080.291546280030161, 7500220.560018570162356 ], [ 528861.282109110034071, 7500456.376656860113144 ], [ 528593.159048130037263, 7500745.061562200076878 ], [ 529089.130638509988785, 7500749.058695370331407 ], [ 529769.568950040033087, 7500739.068745999597013 ], [ 530322.572177659953013, 7500685.071386770345271 ], [ 531009.339159070048481, 7500675.080785560421646 ], [ 531715.73976946005132, 7500766.589671320281923 ], [ 532059.217866000020877, 7500783.592576529830694 ], [ 532828.741958869970404, 7500779.589823200367391 ], [ 533000.699731510016136, 7500836.09126906003803 ], [ 533038.928390149958432, 7500854.600384590215981 ], [ 533285.191948459949344, 7500484.100489480420947 ], [ 533501.710612179944292, 7500546.609419420361519 ], [ 533864.937776679988019, 7500710.10962160024792 ], [ 534081.707948690047488, 7500817.109223029576242 ], [ 534266.389420230058022, 7500867.109677930362523 ], [ 534616.169753010035492, 7500865.118759210221469 ], [ 534972.087890470051207, 7500831.609265670180321 ], [ 535734.419606919982471, 7500662.120714230462909 ], [ 536218.050877150031738, 7500716.62982770986855 ], [ 536612.610229640034959, 7500784.619802930392325 ], [ 537039.810191430035047, 7501017.629488600417972 ], [ 537263.759554189979099, 7501296.640788069926202 ], [ 537322.000254699960351, 7501506.137971930205822 ], [ 537323.512343090027571, 7501824.63116788957268 ], [ 537330.598165779956616, 7501970.641640059649944 ], [ 537394.901242660009302, 7502116.638735800050199 ], [ 537573.567950980039313, 7502255.649229579605162 ], [ 537790.329145789961331, 7502369.149316649883986 ], [ 538115.051889610011131, 7502437.639098499901593 ], [ 539088.339263470028527, 7502508.650756360031664 ], [ 539534.279518340015784, 7502671.651546549983323 ], [ 539885.060554989962839, 7502867.149066110141575 ], [ 540331.750142619945109, 7503195.649200160056353 ], [ 540714.57853476004675, 7503454.658803319558501 ], [ 541052.439851489965804, 7503624.639814630150795 ], [ 541486.308983789989725, 7503927.648783730342984 ], [ 541996.49951150000561, 7504230.151673150248826 ], [ 542628.151267910026945, 7504653.147738579660654 ], [ 542851.599998170044273, 7504830.148377349600196 ], [ 543177.948728719959036, 7505267.651104040443897 ], [ 543486.618928679963574, 7505966.149615850299597 ], [ 543666.679994179983623, 7506391.651839040219784 ], [ 543852.741408649948426, 7506721.649244810454547 ], [ 544044.859332469990477, 7507007.147786979563534 ], [ 544320.020545160048641, 7507368.150118900462985 ], [ 544499.401140230009332, 7507634.652536380104721 ], [ 544659.952399050001986, 7507964.649859149940312 ], [ 544743.649668990052305, 7508180.64890768006444 ], [ 544986.967824600054882, 7508529.640704610385001 ], [ 545122.098981300019659, 7508859.651255340315402 ], [ 545238.039955170010217, 7509170.651160649955273 ], [ 545386.061797900008969, 7509520.139114540070295 ], [ 545584.70227057999, 7509837.140359420329332 ], [ 545834.078861130052246, 7510116.140090740285814 ], [ 546344.38002908998169, 7510444.151013869792223 ], [ 546523.250805940013379, 7510615.138416299596429 ], [ 546747.331027709995396, 7510919.130965920165181 ], [ 546773.339685610029846, 7511046.639840469695628 ], [ 546839.032225689967163, 7511472.640136569738388 ], [ 546910.207894589984789, 7511733.130136489868164 ], [ 546921.599986459943466, 7511756.871668560430408 ], [ 547025.85104430001229, 7511974.129926219582558 ], [ 547301.797638020012528, 7512494.641788500361145 ], [ 547423.940015339991078, 7512774.140642990358174 ], [ 547552.240127959987149, 7513009.140230040065944 ], [ 547744.120906300027855, 7513230.630903270095587 ], [ 548011.999417399987578, 7513394.639083719812334 ], [ 548311.548449330031872, 7513533.128911710344255 ], [ 548700.250355439959094, 7513696.629555179737508 ], [ 549381.82016482995823, 7513928.131438869982958 ], [ 549777.157928950036876, 7514142.630515470169485 ], [ 550096.13010181998834, 7514357.129423620179296 ], [ 550522.581304499995895, 7514431.12007798999548 ], [ 550872.358978120028041, 7514435.608253129757941 ], [ 551298.908410839969292, 7514528.621823900379241 ], [ 551731.074992449954152, 7514759.201526599936187 ], [ 552267.968993069953285, 7515045.631445099599659 ], [ 552472.469793559983373, 7515248.128782370127738 ], [ 552594.358582830056548, 7515463.632309479638934 ], [ 552735.878587619983591, 7515800.120999690145254 ], [ 552934.171248369966634, 7516053.632071820087731 ], [ 553119.358725509955548, 7516212.130172469653189 ], [ 553396.94924536999315, 7516396.131426160223782 ], [ 553490.751053510000929, 7516646.130151580087841 ], [ 553521.998791010002606, 7517146.120753969997168 ], [ 553365.709329799981788, 7517646.139826419763267 ], [ 552951.648096360033378, 7518364.148328660055995 ], [ 552736.711374880047515, 7518632.649459320120513 ], [ 552508.919727199943736, 7518875.661261970177293 ], [ 551977.181308640050702, 7519387.66122165042907 ], [ 551698.502042190055363, 7519618.671442500315607 ], [ 551445.290414919960313, 7519868.169856520369649 ], [ 551242.628899940056726, 7520034.669556410051882 ], [ 551014.678965050028637, 7520239.669949440285563 ], [ 550653.059888210031204, 7520426.181568100117147 ], [ 549808.758831460028887, 7520736.178342989645898 ], [ 549472.190413629985414, 7520840.188566190190613 ], [ 549180.109107009950094, 7520943.19092417974025 ], [ 548900.950248799985275, 7521065.68975913990289 ], [ 548761.428701419965364, 7521155.699331229552627 ], [ 548640.953464290942065, 7521273.574077860452235 ], [ 553502.942819576244801, 7521273.574077860452235 ], [ 553276.988916730042547, 7521233.240604850463569 ], [ 552958.848691480001435, 7521209.229686919599771 ], [ 552558.240206790040247, 7521211.220943139865994 ], [ 552265.698866680031642, 7521193.72009817045182 ], [ 551941.050715549965389, 7521138.201802129857242 ], [ 551660.441966620041057, 7520968.189111479558051 ], [ 551564.362152160028927, 7520822.190301760099828 ], [ 551543.308704870054498, 7520421.180343049578369 ], [ 551675.789430149947293, 7520185.169340649619699 ], [ 551986.31099800998345, 7519954.178711500018835 ], [ 552418.043980209971778, 7519812.178346159867942 ], [ 552780.148187250015326, 7519746.191867049783468 ], [ 553218.462379090022296, 7519635.689800689928234 ], [ 553472.680246960022487, 7519589.680336230434477 ], [ 553726.599248389946297, 7519512.192376250401139 ], [ 553859.851088849944063, 7519447.699348329566419 ], [ 553929.609886429971084, 7519402.689942100085318 ], [ 553954.89849138003774, 7519377.190948570147157 ], [ 553973.858579299994744, 7519345.189898329786956 ], [ 554115.767966849962249, 7519021.17945207003504 ], [ 554178.288729339954443, 7518615.172259110026062 ], [ 554147.039345999946818, 7518208.660051150247455 ], [ 554084.540130940033123, 7517646.14075743034482 ], [ 554146.8203180199489, 7516963.6315305698663 ], [ 554361.582325270050205, 7516644.639263659715652 ], [ 554424.389186830027029, 7516485.129010479897261 ], [ 554430.201462110038847, 7516376.629046970047057 ], [ 554416.439543080050498, 7516160.63928656000644 ], [ 554351.370617939974181, 7515849.13784018997103 ], [ 554216.440275560016744, 7515556.630309550091624 ], [ 553941.429692870005965, 7515227.128613879904151 ], [ 553666.789511539973319, 7514980.630683939903975 ], [ 553373.090318550006486, 7514746.630016029812396 ], [ 553086.078856399981305, 7514570.130195720121264 ], [ 552678.158572930027731, 7514375.1200912296772 ], [ 551850.951339580002241, 7514271.12161788996309 ], [ 550876.81927535997238, 7514047.619703330099583 ], [ 550405.600844520027749, 7513903.620661280117929 ], [ 549959.821321579976939, 7513778.61910889018327 ], [ 549189.058551419992, 7513509.130647470243275 ], [ 548749.55001840996556, 7513371.639964249916375 ], [ 548417.859357360051945, 7513163.629739440046251 ], [ 547753.10020510002505, 7512460.640449609607458 ], [ 547681.898447870044038, 7512200.139545659534633 ], [ 547731.88949681003578, 7512021.631898799911141 ], [ 547661.070914759999141, 7511837.131026280112565 ], [ 547554.751736809965223, 7511754.929449140094221 ], [ 547514.270673359977081, 7511723.630796080455184 ], [ 547367.169919079984538, 7511546.138635899871588 ], [ 547302.46016450994648, 7511311.131156819872558 ], [ 547275.26059381000232, 7510942.138586919754744 ], [ 547274.148572140024044, 7510712.640855640172958 ], [ 547768.500521330046467, 7510360.139111110009253 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 519646.421773399983067, 7512962.969492110423744 ], [ 520338.628719249914866, 7512761.992342449724674 ], [ 520370.700128689932171, 7512818.980279499664903 ], [ 520389.861160249914974, 7512831.980105480179191 ], [ 520453.800194829993416, 7512901.488577979616821 ], [ 520645.308756140002515, 7513059.488957329653203 ], [ 520938.88133815000765, 7513267.979400220327079 ], [ 521206.44805255002575, 7513361.990735240280628 ], [ 522004.111833690025378, 7512606.520235720090568 ], [ 522208.370498009957373, 7512764.519335090182722 ], [ 522380.780247449991293, 7512916.521716950461268 ], [ 522572.099404939974193, 7513030.021872960031033 ], [ 522738.429538290016353, 7513220.030236219987273 ], [ 522886.021028539922554, 7513505.530193040147424 ], [ 523066.150845020019915, 7513931.010712930001318 ], [ 523067.817986970010679, 7514281.009863840416074 ], [ 523056.320965659979265, 7514536.009334879927337 ], [ 523089.739643169974443, 7514873.007855829782784 ], [ 523180.560405679920223, 7515248.00934008974582 ], [ 523373.289957669971045, 7515654.508595500141382 ], [ 523476.730214309936855, 7515997.508203850127757 ], [ 523433.95207786001265, 7516360.500125460326672 ], [ 523271.098302030004561, 7516882.98878544010222 ], [ 523509.899753010016866, 7517613.990790239535272 ], [ 523733.722453519934788, 7517860.998836340382695 ], [ 523912.941209269978572, 7518108.009794030338526 ], [ 524028.608133539964911, 7518355.517049229703844 ], [ 524119.032020880025811, 7518641.521978080272675 ], [ 524157.999326489982195, 7518807.028272549621761 ], [ 524158.951758319977671, 7519010.529038690030575 ], [ 524237.668311430083122, 7519506.55080983042717 ], [ 524239.229006730020046, 7519837.549687219783664 ], [ 524202.369046679988969, 7520098.558881849981844 ], [ 524152.720744809950702, 7520353.571849780157208 ], [ 524134.350605180021375, 7520500.060532470233738 ], [ 524143.549343852791935, 7520656.412410277873278 ], [ 524243.453589889977593, 7520709.571230069734156 ], [ 524478.680098630022258, 7520689.07113432046026 ], [ 524637.49894109996967, 7520656.588923869654536 ], [ 524796.9697620900115, 7520757.600493759848177 ], [ 524906.299241830012761, 7521005.109648800455034 ], [ 524958.171890130033717, 7521215.120178709737957 ], [ 524942.084509948384948, 7521273.574077860452235 ], [ 526436.227119922172278, 7521273.574077860452235 ], [ 526401.691515060025267, 7521181.680516350083053 ], [ 526312.182531099999323, 7521074.180512679740787 ], [ 526178.051961730001494, 7520960.180783839896321 ], [ 525974.109962780028582, 7520865.669559930451214 ], [ 525489.819585519959219, 7520677.630986260250211 ], [ 525215.56044709996786, 7520507.118261069990695 ], [ 525099.700741240056232, 7520227.598221190273762 ], [ 525105.160121239954606, 7520030.097857830114663 ], [ 525129.969782790052705, 7519909.090361219830811 ], [ 525199.187788509996608, 7519762.588524759747088 ], [ 525351.481491480022669, 7519685.100868449546397 ], [ 525808.730688430019654, 7519542.599877079948783 ], [ 525935.481611039955169, 7519459.120913409627974 ], [ 526017.568704079953022, 7519325.110889060422778 ], [ 526022.688289919984527, 7519064.102008130401373 ], [ 525945.672333069960587, 7518931.100659869611263 ], [ 525722.161406980012543, 7518741.078860250301659 ], [ 525504.700332000036724, 7518468.57182256039232 ], [ 525227.687564849969931, 7517751.051117460243404 ], [ 525085.749328059959225, 7517319.029316320084035 ], [ 524994.87055044004228, 7516944.028645990416408 ], [ 524916.629481710027903, 7516549.539432030171156 ], [ 524794.56922211998608, 7516283.027406759560108 ], [ 524698.002097900025547, 7516048.040206580422819 ], [ 524696.669458879972808, 7515768.029474440030754 ], [ 524765.351799699943513, 7515500.540381940081716 ], [ 524713.438822360010818, 7515278.041626789607108 ], [ 524426.06841973005794, 7515044.040656699799001 ], [ 524208.542307230061851, 7514771.52988651022315 ], [ 524034.479650379973464, 7514276.041863550432026 ], [ 523930.951113260001875, 7513907.540365519933403 ], [ 523666.980231429974083, 7513234.038817330263555 ], [ 523397.980987849994563, 7512841.028172080405056 ], [ 523116.790019250009209, 7512556.040891540236771 ], [ 522695.671639500011224, 7512272.040571300312877 ], [ 522555.290484579978511, 7512171.029042379930615 ], [ 522459.529177899996284, 7512088.520967369899154 ], [ 522108.960515180020593, 7511925.032064230181277 ], [ 521962.327799500082619, 7511849.52925833966583 ], [ 521898.73540557816159, 7511830.16974357701838 ], [ 521299.68208722001873, 7511585.508881360292435 ], [ 520993.898059519939125, 7511473.001950009725988 ], [ 520700.899943009950221, 7511385.498376620002091 ], [ 519955.938934519945178, 7511198.499291979707778 ], [ 519612.440949510026257, 7511174.980778340250254 ], [ 519199.428999839932658, 7511037.968745009973645 ], [ 518458.888367109990213, 7510995.468531150370836 ], [ 518141.521315880003385, 7510910.961119780316949 ], [ 517866.450773890013807, 7510783.959730369970202 ], [ 517549.060095640015788, 7510678.458123919554055 ], [ 517020.139190430054441, 7510529.950958830304444 ], [ 516492.951762130018324, 7510465.937333139590919 ], [ 516174.411889459996019, 7510353.441098780371249 ], [ 515687.31005864002509, 7510208.102885807864368 ], [ 515687.31005864002509, 7510535.495148473419249 ], [ 516099.911749830003828, 7510729.441395100206137 ], [ 516431.110172140004579, 7510841.937734680250287 ], [ 517163.401391200022772, 7511035.449545609764755 ], [ 517500.928361040016171, 7511135.449482630006969 ], [ 517851.030990800005384, 7511209.959799789823592 ], [ 518143.769826399919111, 7511252.968656219542027 ], [ 519041.831551529990975, 7511534.482516329735518 ], [ 519608.750958350021392, 7511734.989269830286503 ], [ 519894.13068081001984, 7511815.505585880018771 ], [ 519984.45962465001503, 7511840.989471119828522 ], [ 520258.068798759952188, 7511871.500498970039189 ], [ 520563.539981840061955, 7511920.501662779599428 ], [ 521156.288484309916385, 7512191.000949360430241 ], [ 521551.367963330005296, 7512361.009483519941568 ], [ 521710.489959909988102, 7512392.008338649757206 ], [ 521012.040045049972832, 7512605.49964378029108 ], [ 520693.509920759999659, 7512499.000128109939396 ], [ 520438.649691370024811, 7512399.000608219765127 ], [ 520177.610525219934061, 7512329.978099579922855 ], [ 519490.44943603000138, 7512263.979586419649422 ], [ 518840.980136949976441, 7512101.969939400441945 ], [ 518452.36964871006785, 7511951.479337790049613 ], [ 518131.416117589978967, 7511817.681890560314059 ], [ 518044.527874130057171, 7511781.458831120282412 ], [ 517649.621018150006421, 7511643.96055980026722 ], [ 517223.009906649996992, 7511531.451243470422924 ], [ 516484.161324460001197, 7511287.432342950254679 ], [ 516172.129114950075746, 7511206.442232700064778 ], [ 515687.31005864002509, 7511091.777985905297101 ], [ 515687.31005864002509, 7511543.949450626038015 ], [ 515741.351565839955583, 7511558.431179 ], [ 516091.670631099957973, 7511671.432536300271749 ], [ 516460.880282170022838, 7511739.42922518029809 ], [ 516836.319113209960051, 7511794.450638740323484 ], [ 516947.638945150014479, 7511819.030170059762895 ], [ 517173.731253359932452, 7511868.948861289769411 ], [ 517562.11861298995791, 7511968.948265319690108 ], [ 517989.227753239974845, 7512182.947854270227253 ], [ 518717.717256509931758, 7512586.076355170458555 ], [ 519003.070431359985378, 7512743.968761979602277 ], [ 519366.229568860027939, 7512888.468247819691896 ], [ 519646.421773399983067, 7512962.969492110423744 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 519646.421773399983067, 7512962.969492110423744 ], [ 518845.849511170003098, 7513113.960254170000553 ], [ 518852.321420539985411, 7513132.95880111027509 ], [ 518871.588630190002732, 7513177.461551469750702 ], [ 518910.62009527994087, 7513355.46910130046308 ], [ 518968.77945902000647, 7513552.458231610246003 ], [ 519065.141182710009161, 7513761.960031550377607 ], [ 519123.1404266700265, 7513920.458620489574969 ], [ 519174.829437979962677, 7514092.451116800308228 ], [ 519198.755447089963127, 7514197.602240430191159 ], [ 519103.875308649963699, 7514306.953248229809105 ], [ 519018.356625669985078, 7514432.16913719009608 ], [ 519177.628758139966521, 7514563.666787220165133 ], [ 519238.956251360010356, 7514668.946241379715502 ], [ 519282.04083986999467, 7514866.434735249727964 ], [ 519392.477506569994148, 7515090.1774812201038 ], [ 519418.43464920000406, 7515485.763669109903276 ], [ 519041.141933470033109, 7515922.438162029720843 ], [ 519112.352786110073794, 7516209.932219609618187 ], [ 519100.495351070072502, 7516519.429266070015728 ], [ 519027.343064780056011, 7516756.569857959635556 ], [ 518954.139981639978942, 7516954.201637290418148 ], [ 518893.289090209989808, 7517244.004207690246403 ], [ 518936.513313480012584, 7517553.433111510239542 ], [ 518985.690145989996381, 7517724.575489370152354 ], [ 519041.232609779981431, 7518093.251300070434809 ], [ 519047.605427510046866, 7518297.369738539680839 ], [ 519182.53915581991896, 7518514.49831182975322 ], [ 519207.277663080021739, 7518718.593676960095763 ], [ 519366.991627419949509, 7519166.154731409624219 ], [ 519514.363417299988214, 7519528.12835447024554 ], [ 519545.337666210078169, 7519817.816332059912384 ], [ 519320.0120131499134, 7520759.712071959860623 ], [ 519259.250695589988027, 7521128.530878730118275 ], [ 519198.64405673003057, 7521273.574077860452235 ], [ 519981.788932837545872, 7521273.574077860452235 ], [ 520014.649357220041566, 7521156.874627060256898 ], [ 520081.754149810003582, 7520851.868108260445297 ], [ 520216.449312160024419, 7520619.372835559770465 ], [ 520229.626076239976101, 7520372.515831279568374 ], [ 520215.746720750001259, 7520082.134254289790988 ], [ 520471.88589352008421, 7519820.437087640166283 ], [ 520872.96024511998985, 7519429.411170129664242 ], [ 520896.319889380014502, 7519002.919434909708798 ], [ 520859.66047996992711, 7518796.493398250080645 ], [ 520510.397251019952819, 7518324.824829200282693 ], [ 520361.539808640023693, 7518034.621373900212348 ], [ 520185.237884390051477, 7517395.971388869918883 ], [ 520117.299361719982699, 7517047.57921488955617 ], [ 520008.762039760069456, 7516612.118976039811969 ], [ 519900.343085089989472, 7516263.777936239726841 ], [ 519953.787620300019626, 7515724.758886470459402 ], [ 519925.960200970002916, 7515564.941732300445437 ], [ 519917.670074609981384, 7515169.947305140085518 ], [ 519922.708887970016804, 7514883.940687100403011 ], [ 519928.680768750084098, 7514807.459462120197713 ], [ 520542.462652940012049, 7514160.968576629646122 ], [ 520338.34111842000857, 7514028.471192579716444 ], [ 520280.829740790068172, 7513977.971144840121269 ], [ 520165.887963470013347, 7513870.459660449996591 ], [ 520057.24140861997148, 7513756.472654789686203 ], [ 519916.470420499972533, 7513578.972261999733746 ], [ 519820.111488119990099, 7513375.970130239613354 ], [ 519742.828652449999936, 7513178.980483889579773 ], [ 519646.421773399983067, 7512962.969492110423744 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 521206.44805255002575, 7513361.990735240280628 ], [ 520542.462652940012049, 7514160.968576629646122 ], [ 520663.783022239978891, 7514268.97126024030149 ], [ 520906.899310519918799, 7514566.459113360382617 ], [ 521098.600245599984191, 7514756.481158919632435 ], [ 521233.060718770022504, 7514933.968699309974909 ], [ 521335.779068149975501, 7515136.958421420305967 ], [ 521477.821174010052346, 7515594.469858160242438 ], [ 521581.801603920001071, 7516058.468591059558094 ], [ 521666.768648989964277, 7516535.460828520357609 ], [ 521738.93966532999184, 7516999.958360100165009 ], [ 521779.15958930994384, 7517438.447461250238121 ], [ 521800.200406750023831, 7517832.950569169595838 ], [ 521884.939737839973532, 7518265.451066539622843 ], [ 522200.289610730018467, 7519040.458986540324986 ], [ 522226.659193270024844, 7519237.460663010366261 ], [ 522282.15959312999621, 7520191.960507390089333 ], [ 522348.220414990035351, 7520706.969655729830265 ], [ 522409.242599931487348, 7521273.574077860452235 ], [ 523007.305717104056384, 7521273.574077860452235 ], [ 523073.630857660027687, 7520791.999725989997387 ], [ 523160.551499070017599, 7520352.510412150062621 ], [ 523304.758738029981032, 7519919.010429590009153 ], [ 523429.659503509989008, 7519440.998553990386426 ], [ 523472.781448009947781, 7519148.019750829786062 ], [ 523496.349508450017311, 7518765.999401739798486 ], [ 523405.710937699943315, 7518429.000097339972854 ], [ 523232.190064209979028, 7518054.490173670463264 ], [ 522988.712196270003915, 7517680.467206840403378 ], [ 522796.289836740063038, 7517337.469327299855649 ], [ 522609.569676790037192, 7516861.48109246045351 ], [ 522466.82911132008303, 7516263.981953090056777 ], [ 522343.17095966998022, 7515685.47884355019778 ], [ 522117.140884040039964, 7514967.491810309700668 ], [ 521885.749655669962522, 7514452.988889950327575 ], [ 521635.528618260053918, 7513989.981383229605854 ], [ 521379.008907879993785, 7513545.499772519804537 ], [ 521206.44805255002575, 7513361.990735240280628 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 532504.71503138798289, 7521273.574077860452235 ], [ 532532.178689119988121, 7521142.239576890133321 ], [ 532499.439517520018853, 7520951.25150972045958 ], [ 532308.147656969958916, 7520831.239409450441599 ], [ 532015.559444969985634, 7520826.7419608598575 ], [ 531685.429601419949904, 7520949.248811120167375 ], [ 531475.820392590016127, 7520995.249874849803746 ], [ 531297.701123569975607, 7520983.249538940377533 ], [ 530992.855844534235075, 7521273.574077860452235 ], [ 532504.71503138798289, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14339", "objectid": "14340", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 14.7127427709, "shape_area": 0.0875551386441 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 530872.621390014886856, 7521273.574077860452235 ], [ 530605.669946389971301, 7521228.739805289544165 ], [ 530198.73958735994529, 7521243.73099188040942 ], [ 530080.028660500538535, 7521273.574077860452235 ], [ 530872.621390014886856, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14310", "objectid": "14311", "lithstrtno": "4143", "code": "A-FOu-bbo", "unitname": "Bunjinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Pillowed and massive basaltic flows; basaltic breccia and basaltic volcanic sandstone; minor chert; amygdaloidal basalt flows occur in upper parts of formation; metamorphosed", "parentcode": "A-FOS4-xbs-bbo", "parentname": "Fortescue Group sequence 4", "rocktype1": "igneous mafic volcanic", "lithname1": "basalt", "qualifier1": "pillowed", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 4", "formation": "Bunjinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2718", "maxuncerty": null, "min_age_ma": "2715", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 11.920567697099999, "shape_area": 0.257719224508 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 554484.204992703045718, 7473446.765934069640934 ], [ 554483.678844169946387, 7474369.331994599662721 ], [ 554511.229637669981457, 7474821.329697109758854 ], [ 554513.608554529957473, 7475317.821682860143483 ], [ 554502.4104463000549, 7475635.809987120330334 ], [ 554478.16147654002998, 7475877.810377850197256 ], [ 554466.91096401005052, 7476149.81045897025615 ], [ 554377.15869415004272, 7476463.80083199031651 ], [ 554362.040577049949206, 7476864.800003419630229 ], [ 554388.279434529948048, 7477030.290577559731901 ], [ 554389.221459290012717, 7477240.299697100184858 ], [ 554321.64940796000883, 7477737.279472540132701 ], [ 554215.787629480008036, 7478202.291607280261815 ], [ 554020.909282319946215, 7478674.268816069699824 ], [ 553888.35882392001804, 7478878.770382479764521 ], [ 553837.621612629969604, 7479125.2787343300879 ], [ 553563.738782610045746, 7479648.28148182015866 ], [ 552941.338768179994076, 7480544.768690920434892 ], [ 552418.542449099943042, 7481117.270238320343196 ], [ 552094.901182470028289, 7481490.781041470356286 ], [ 551497.371107719955035, 7482212.771112849935889 ], [ 551329.225711080012843, 7482327.528326629661024 ], [ 551081.9873308299575, 7482496.259008839726448 ], [ 550923.330109950038604, 7482560.749276779592037 ], [ 550726.509200779953972, 7482625.749823920428753 ], [ 550352.179148370050825, 7482812.248023429885507 ], [ 549482.798652769997716, 7483198.758917829953134 ], [ 549108.4292188299587, 7483372.749284399673343 ], [ 548918.140759330010042, 7483469.238691999576986 ], [ 547598.249432689975947, 7484074.738576619885862 ], [ 546830.221480080042966, 7484390.747971129603684 ], [ 546309.541899599949829, 7484552.729641349986196 ], [ 545801.239993970026262, 7484644.729194659739733 ], [ 545305.831054919981398, 7484774.719212420284748 ], [ 544753.541485049994662, 7484981.200015850365162 ], [ 544290.291403339942917, 7485193.699580590240657 ], [ 543852.650631809956394, 7485444.190270540304482 ], [ 543351.099201080040075, 7485599.690714879892766 ], [ 542048.211118230014108, 7485772.170437729917467 ], [ 541381.079201090033166, 7485903.160007249563932 ], [ 540764.831503740046173, 7486034.150001510046422 ], [ 539582.951551569974981, 7486237.639846519567072 ], [ 538973.360067910049111, 7486438.122480650432408 ], [ 538319.298372669960372, 7486632.607603570446372 ], [ 537969.910448370035738, 7486717.620605089701712 ], [ 537391.730507079977542, 7486822.609182910062373 ], [ 536845.479823069996201, 7486959.109396929852664 ], [ 536273.969601340009831, 7487140.099127089604735 ], [ 535226.339154119952582, 7487489.58226753026247 ], [ 534763.028078450006433, 7487683.079398900270462 ], [ 534166.782311249990016, 7487998.079997730441391 ], [ 533684.789544260012917, 7488281.061272409744561 ], [ 533202.932457349961624, 7488582.557957610115409 ], [ 532651.470854870043695, 7488974.049725639633834 ], [ 532062.401277250028215, 7489461.059403309598565 ], [ 531498.791368160047568, 7489954.050970080308616 ], [ 530511.511262089945376, 7490958.541540630161762 ], [ 530163.091089620022103, 7491234.030547330155969 ], [ 529719.632291379966773, 7491605.528420919552445 ], [ 529212.330741600017063, 7491907.539981139823794 ], [ 528666.197390179964714, 7492063.530787769705057 ], [ 528182.869514529942535, 7492066.029675690457225 ], [ 528977.92851385998074, 7490769.530310049653053 ], [ 529932.98886083997786, 7489804.025997609831393 ], [ 530193.100235059973784, 7489541.038226139731705 ], [ 529824.509794170036912, 7489587.520447020418942 ], [ 529475.157951329951175, 7489672.028327610343695 ], [ 529189.580337209976278, 7489794.531878739595413 ], [ 528980.210056909942068, 7489904.021742659620941 ], [ 528745.280351449968293, 7489988.010815599933267 ], [ 528554.639594899956137, 7490014.519405740313232 ], [ 528010.690560759976506, 7490033.00870062969625 ], [ 527680.867203320027329, 7490012.509104180149734 ], [ 527174.819998839986511, 7490782.511625460349023 ], [ 526718.599498050054535, 7491736.499324150383472 ], [ 526392.791392470011488, 7491426.508381759747863 ], [ 526080.409787329961546, 7491262.502284400165081 ], [ 525633.879788300022483, 7490965.99874919001013 ], [ 525263.63108038995415, 7490681.479916979558766 ], [ 524580.929671640042216, 7490207.990078659728169 ], [ 524274.671697549987584, 7490005.979487449862063 ], [ 523860.21075316000497, 7489772.479153100401163 ], [ 523458.788942609971855, 7489615.470358500257134 ], [ 523172.339214570005424, 7489559.970132290385664 ], [ 522898.739321379980538, 7489516.95748660992831 ], [ 522249.710844649991486, 7489450.459670879878104 ], [ 521931.460056159994565, 7489388.450269759632647 ], [ 521460.109446209971793, 7489225.45048428978771 ], [ 521224.28995990002295, 7489118.450215740129352 ], [ 520608.107771619979758, 7489268.439483510330319 ], [ 520331.968202390009537, 7488696.939133930020034 ], [ 520177.991389880015049, 7488423.928699710406363 ], [ 519978.909117389994208, 7488011.42803343012929 ], [ 519299.649919120012783, 7486933.410632349550724 ], [ 519197.270578199997544, 7486806.422487869858742 ], [ 519045.77152519999072, 7487029.90596828982234 ], [ 518705.950897419999819, 7486458.909381340257823 ], [ 518501.699876250000671, 7486294.90911213029176 ], [ 517979.299585099972319, 7486112.899997440166771 ], [ 517794.508853740000632, 7486024.900842210277915 ], [ 517660.507719189976342, 7485929.891643890179694 ], [ 517634.900084780005272, 7485898.400607910007238 ], [ 517463.637543010001536, 7486001.390471969731152 ], [ 516927.950278770003933, 7485679.378276979550719 ], [ 516666.421290200029034, 7485508.878112699836493 ], [ 516449.418488099996466, 7485350.880605299957097 ], [ 516353.519451149972156, 7485236.871889360249043 ], [ 516301.869407019985374, 7485084.369545670226216 ], [ 516320.510699520003982, 7484988.872019359841943 ], [ 516326.429848819971085, 7484893.381361030042171 ], [ 516217.310765629983507, 7484683.870723370462656 ], [ 516102.459870750026312, 7484601.869119809940457 ], [ 515834.798774280003272, 7484482.362057009711862 ], [ 515687.31005864002509, 7484424.49293443467468 ], [ 515687.31005864002509, 7494569.547191276215017 ], [ 515749.4295332399779, 7494583.898371280170977 ], [ 515921.677714249992277, 7494697.41118314024061 ], [ 516100.681956680025905, 7494893.908751860260963 ], [ 516401.340706480026711, 7495261.409630320034921 ], [ 516663.828672209987417, 7495628.911218900233507 ], [ 516855.688426990003791, 7495863.411676499992609 ], [ 517026.319249610009138, 7495626.907642669975758 ], [ 517393.629248439974617, 7495306.919828530400991 ], [ 517804.770179970015306, 7494846.419316640123725 ], [ 518184.840464940003585, 7494525.920076349750161 ], [ 518363.05026823002845, 7494563.417820639908314 ], [ 518471.900537130015437, 7494715.428815290331841 ], [ 518543.060454390011728, 7494963.42907639965415 ], [ 518588.76013419998344, 7495217.430626450106502 ], [ 518705.069473669980653, 7495598.940543320029974 ], [ 518769.290147739986423, 7495725.928489049896598 ], [ 518383.931465780013241, 7496275.420112820342183 ], [ 517992.779921379988082, 7496926.429134880192578 ], [ 517847.879607070004568, 7497213.920483809895813 ], [ 518014.126850700005889, 7497123.757406969554722 ], [ 519021.359903179982211, 7496577.43004279024899 ], [ 519433.317879359994549, 7496282.440096310339868 ], [ 519762.199077040073462, 7495904.939755939878523 ], [ 519908.908905629999936, 7495993.45121334027499 ], [ 520062.099349690019153, 7496119.939772210083902 ], [ 520209.108364530024119, 7496271.949922599829733 ], [ 520002.388502939953469, 7496934.941946909762919 ], [ 519782.088446919980925, 7497413.448312009684741 ], [ 520246.918788719980512, 7497531.941943439655006 ], [ 520979.320096470008139, 7497743.970866629853845 ], [ 521208.34053024998866, 7497768.461113699711859 ], [ 521526.329923179990146, 7497779.458482449874282 ], [ 521882.681205840024631, 7497821.95909606013447 ], [ 522615.201595210004598, 7498072.470330759882927 ], [ 522895.790943439991679, 7498236.478123749606311 ], [ 523067.899913350003771, 7498311.989780469797552 ], [ 523169.751951899961568, 7498336.99168633017689 ], [ 523430.941085200000089, 7498430.979713370092213 ], [ 523291.23883935000049, 7498627.490776370279491 ], [ 523609.870466449996457, 7498706.489138640463352 ], [ 524080.23038684000494, 7498843.010146860033274 ], [ 524869.238765610032715, 7498918.510846289806068 ], [ 525203.037625279976055, 7498994.508480500429869 ], [ 525476.200942059978843, 7499040.010854230262339 ], [ 525809.999477840028703, 7499116.019442549906671 ], [ 526705.180449269944802, 7499192.0412488700822 ], [ 527312.150629559997469, 7499283.029891399666667 ], [ 527979.749291989952326, 7499328.541776300407946 ], [ 528920.518834950053133, 7499359.061077320016921 ], [ 529648.829291590023786, 7499434.557870909571648 ], [ 529755.099128170055337, 7499495.580794850364327 ], [ 529891.582825729972683, 7499586.560860619880259 ], [ 530073.730894480017014, 7499647.070125780068338 ], [ 530210.299777820007876, 7499647.070799119770527 ], [ 530361.971643759985454, 7499601.580113629810512 ], [ 530650.280006880057044, 7499495.580507 ], [ 530968.912698370055296, 7499419.569814129732549 ], [ 531257.250016, 7499404.57940736040473 ], [ 531560.670086210011505, 7499404.592412210069597 ], [ 532046.250118199968711, 7499359.088792430236936 ], [ 532789.751342240022495, 7499313.0907301902771 ], [ 533411.811376899946481, 7499131.089975969865918 ], [ 533821.509492740035057, 7499055.600588059984148 ], [ 534340.198053610045463, 7498999.598917200230062 ], [ 534210.08037375996355, 7499182.60107615031302 ], [ 534772.740833109943196, 7499031.601619520224631 ], [ 535319.490297780022956, 7498996.622168369591236 ], [ 535866.539422170026228, 7499031.610276879742742 ], [ 536356.470196150010452, 7499080.119504460133612 ], [ 536808.489000750007108, 7499179.611402070149779 ], [ 537565.798215589951724, 7499296.129047449678183 ], [ 537903.119748480035923, 7499358.130287540145218 ], [ 538240.74927738995757, 7499470.6311592804268 ], [ 538476.510809400002472, 7499571.631227860227227 ], [ 538782.997857899987139, 7499830.628830580040812 ], [ 539128.007963520009071, 7500159.64022110030055 ], [ 539472.379663869971409, 7500361.638875110074878 ], [ 539886.788453469984233, 7500575.638558169826865 ], [ 540434.96862149995286, 7500840.140409230254591 ], [ 540868.300419189967215, 7501022.139786539599299 ], [ 541378.088292040047236, 7501255.148356759920716 ], [ 541869.510881360038184, 7501596.148375390097499 ], [ 543024.980478130048141, 7502538.151226189918816 ], [ 543357.140349189983681, 7502835.651261850260198 ], [ 543753.371735660010017, 7503247.158579030074179 ], [ 544123.749267379986122, 7503569.650559930130839 ], [ 544501.330129939946346, 7504057.659381669946015 ], [ 544725.589950209949166, 7504406.66118496004492 ], [ 544943.521832979982719, 7504761.659700149670243 ], [ 545302.220849859993905, 7505307.161514719948173 ], [ 545590.600436890032142, 7505770.149005670100451 ], [ 545783.23040363995824, 7506157.6511867698282 ], [ 545931.308838529977947, 7506525.652599480003119 ], [ 546098.209188740001991, 7506843.148602940142155 ], [ 546347.061501309974119, 7507032.637269330210984 ], [ 546506.497807570034638, 7507121.148085170425475 ], [ 546603.180793819949031, 7507387.650260009802878 ], [ 546630.139276860048994, 7507705.651409690268338 ], [ 546760.171894729952328, 7508297.151622120290995 ], [ 546793.049552879994735, 7508519.641761479899287 ], [ 546813.419814339955337, 7508786.638606240041554 ], [ 546815.548757059965283, 7509245.150106180459261 ], [ 546931.679415010032244, 7509581.640348309651017 ], [ 547123.421548460028134, 7509784.130571500398219 ], [ 547270.312866059946828, 7509910.650194940157235 ], [ 547468.009936959948391, 7510024.139007830061018 ], [ 547704.259539189981297, 7510226.642881070263684 ], [ 547742.74022460996639, 7510290.129271860234439 ], [ 547768.500521330046467, 7510360.139111110009253 ], [ 548034.69859790999908, 7510174.130197280086577 ], [ 548214.591759399976581, 7510548.640630640089512 ], [ 548272.140547640039586, 7510624.629289399832487 ], [ 548241.141583189950325, 7510796.629177389666438 ], [ 548292.197725779959001, 7510834.630641140043736 ], [ 548413.86996265000198, 7510999.63763992022723 ], [ 548689.44884283002466, 7511449.628524029627442 ], [ 548914.382106699980795, 7511750.67075092997402 ], [ 549054.210299010039307, 7511925.130071610212326 ], [ 549303.431781059945934, 7512159.130994699895382 ], [ 549973.879873230005614, 7512734.618608069606125 ], [ 550324.670768719981425, 7512949.121770850382745 ], [ 550643.040906760026701, 7513030.119286200031638 ], [ 551088.32145434000995, 7513053.619084529578686 ], [ 551514.231136110029183, 7513032.119074979797006 ], [ 551928.048944719950669, 7513125.131682810373604 ], [ 552851.751237579970621, 7513457.631798190064728 ], [ 553444.402655750047415, 7513702.63016252964735 ], [ 553884.700595819973387, 7514012.140901519916952 ], [ 554707.61186786997132, 7514542.129785289987922 ], [ 555039.742031399975531, 7514839.630795430392027 ], [ 555282.850133699947037, 7515150.140203859657049 ], [ 555309.620501619996503, 7515417.141945170238614 ], [ 555204.231297930004075, 7515990.63084764033556 ], [ 555224.830583850038238, 7516302.639430030249059 ], [ 555355.189109880011529, 7516970.139454229734838 ], [ 555401.158959190011956, 7517268.627473950386047 ], [ 555453.009693500003777, 7517472.130774790421128 ], [ 555568.341814159997739, 7517762.650496209971607 ], [ 555679.380945910001174, 7518139.159300490282476 ], [ 555859.967723189969547, 7518557.180103110149503 ], [ 555891.331017449963838, 7518695.690531640313566 ], [ 555895.20233105996158, 7518834.189246309921145 ], [ 555864.690977880032733, 7519055.707995560020208 ], [ 555819.40149920003023, 7519212.707879190333188 ], [ 555751.088573709945194, 7519358.719103270210326 ], [ 555656.229406600003131, 7519486.211165229789913 ], [ 555499.088824820006266, 7519667.229853720404208 ], [ 555435.229578880011104, 7519783.219700600020587 ], [ 555395.219437, 7519909.729079619981349 ], [ 555380.380525280022994, 7520048.739566369913518 ], [ 555395.219155670027249, 7520186.728332799859345 ], [ 555445.039403719943948, 7520328.249057630077004 ], [ 555524.010952410055324, 7520458.748933349736035 ], [ 555625.0989471799694, 7520574.75992317032069 ], [ 555741.528840159997344, 7520671.768353310413659 ], [ 555875.008043820038438, 7520751.280601110309362 ], [ 556016.910099909990095, 7520810.279890170320868 ], [ 556241.911961329984479, 7520868.278911869972944 ], [ 556557.541478430037387, 7520906.290372299961746 ], [ 557369.090800640056841, 7520948.830952799879014 ], [ 557667.16034474002663, 7520992.830326260067523 ], [ 557956.12811321998015, 7521064.850063189864159 ], [ 558238.450282489997335, 7521166.869241730310023 ], [ 558460.411528728553094, 7521273.574077860452235 ], [ 562666.860106543055736, 7521273.574077860452235 ], [ 562666.860106543055736, 7499551.859449970535934 ], [ 562216.039372049970552, 7499518.738557850010693 ], [ 561038.658889019978233, 7499334.229885820299387 ], [ 560573.88993088004645, 7499228.730333990417421 ], [ 560045.220694339950569, 7499053.240250290371478 ], [ 559000.808975919964723, 7498747.261756249703467 ], [ 558491.292051909957081, 7498590.749170909635723 ], [ 558058.292197149945423, 7498478.748251110315323 ], [ 557109.178366789943539, 7498140.251189099624753 ], [ 556452.029350040014833, 7497704.259780829772353 ], [ 556164.771667510038242, 7497476.759236839599907 ], [ 555934.658746590022929, 7497223.749905119650066 ], [ 555698.270653169951402, 7497002.250901469960809 ], [ 555500.588549330015667, 7496894.751310749910772 ], [ 555397.432319379993714, 7496948.761133500374854 ], [ 555303.849349590018392, 7496972.251311229541898 ], [ 555214.778581200051121, 7496966.737625430338085 ], [ 555089.240362670039758, 7497031.250550730153918 ], [ 554862.030735339969397, 7497234.060149200260639 ], [ 554527.538610500050709, 7496881.231944209896028 ], [ 554307.539024519966915, 7497121.239912189543247 ], [ 553873.407264049979858, 7497069.228741990402341 ], [ 553167.019435839960352, 7496964.73136886022985 ], [ 552785.109833849943243, 7496871.719957020133734 ], [ 552441.167965259985067, 7496771.719051790423691 ], [ 552052.477855409961194, 7496608.21943895984441 ], [ 551619.35050013998989, 7496470.708245259709656 ], [ 551376.73608185001649, 7496433.791175260208547 ], [ 551376.739154380047694, 7496434.70587014965713 ], [ 550607.471249419962987, 7496316.710699019953609 ], [ 550117.35100883000996, 7496224.190740790218115 ], [ 549506.212394159985706, 7496087.187914409674704 ], [ 548863.079289200017229, 7495925.179077940061688 ], [ 548481.159597750054672, 7495844.679829609580338 ], [ 548207.390742080053315, 7495776.170087760314345 ], [ 547965.698955520056188, 7495764.669661940075457 ], [ 547621.699969719978981, 7495652.168337520211935 ], [ 547188.059762930031866, 7495399.670047010295093 ], [ 546786.056715170037933, 7495109.162089169956744 ], [ 546307.75074092997238, 7494838.149286760017276 ], [ 545741.092215740005486, 7494688.149336840026081 ], [ 545175.319051780039445, 7494736.149638379923999 ], [ 544641.630074440035969, 7494840.648572890087962 ], [ 544139.251131649944, 7494849.639782629907131 ], [ 543789.260250719962642, 7494794.649844129569829 ], [ 543356.198679139954038, 7494663.138956059701741 ], [ 543082.007789839990437, 7494518.141714329831302 ], [ 542743.630761609994806, 7494233.640817360021174 ], [ 542500.679885059944354, 7493961.138607029803097 ], [ 541963.191630379995331, 7493283.139785929583013 ], [ 541373.259800240048207, 7493585.62896960042417 ], [ 541239.201890320051461, 7493478.130430269986391 ], [ 541041.429810469970107, 7493351.641833259724081 ], [ 540786.52025592001155, 7493232.141431320458651 ], [ 540455.231710409978405, 7493113.131476259790361 ], [ 540053.979118539951742, 7492994.638469030149281 ], [ 539703.578717379947193, 7492843.630788899958134 ], [ 539256.667791689978912, 7492496.13018405996263 ], [ 539039.420328530017287, 7492274.12993127014488 ], [ 538799.870407829992473, 7492714.619908520020545 ], [ 538652.561359170009382, 7492492.628104509785771 ], [ 538434.621193959959783, 7492137.620095389895141 ], [ 538299.87104315997567, 7491877.61903742980212 ], [ 538152.48018651001621, 7491649.118514469824731 ], [ 537992.999373289989308, 7491548.119324930012226 ], [ 537858.802059140056372, 7491415.117978409864008 ], [ 537654.058731580036692, 7491149.111612769775093 ], [ 537487.441841059946455, 7490882.609511179849505 ], [ 537397.371146259945817, 7490660.111204289831221 ], [ 537143.239344249945134, 7490712.609949960373342 ], [ 537123.991076610051095, 7490687.099819210357964 ], [ 537085.189913260051981, 7490547.619091790169477 ], [ 537064.939034159993753, 7490293.120942019857466 ], [ 537082.761445729993284, 7490032.107829850167036 ], [ 537240.129678840050474, 7489700.111702639609575 ], [ 537442.369292260031216, 7489425.109939070418477 ], [ 537708.299167479970492, 7489188.111205180175602 ], [ 538152.181785180000588, 7488925.111552310176194 ], [ 538761.317654639948159, 7488635.118393870070577 ], [ 539167.567884790012613, 7488474.128463700413704 ], [ 540094.551193960011005, 7488169.640105499885976 ], [ 540545.270078580011614, 7488001.651238979771733 ], [ 541351.829978380003013, 7487768.150228680111468 ], [ 541999.648718490032479, 7487599.163327969610691 ], [ 542456.839825210045092, 7487444.169361050240695 ], [ 542920.187694640015252, 7487263.180720839649439 ], [ 543485.092239659978077, 7487031.170335260219872 ], [ 544767.590917099965736, 7486591.201564590446651 ], [ 545345.340155360056087, 7486384.71030355989933 ], [ 545961.030371480039321, 7486152.220580110326409 ], [ 546468.978509249980561, 7485977.719601069577038 ], [ 546951.278525750036351, 7485771.230792 ], [ 547503.288716990035027, 7485507.228992990218103 ], [ 548131.742110710009001, 7485262.237969799898565 ], [ 548747.681917050038464, 7485074.240724699571729 ], [ 549293.689134740037844, 7484880.250223100185394 ], [ 550722.249479479971342, 7484395.249562780372798 ], [ 551335.369841750012711, 7484147.563608339987695 ], [ 552027.868966070003808, 7483867.770847659558058 ], [ 553537.949906770023517, 7482890.281093879602849 ], [ 554811.10155056999065, 7481794.781839599832892 ], [ 556113.878784709959291, 7480314.277741310186684 ], [ 556321.489123960025609, 7479956.77931575011462 ], [ 556398.060009449953213, 7479859.278600730001926 ], [ 556436.380619490053505, 7479768.781995279714465 ], [ 556638.371832969947718, 7479455.78113333042711 ], [ 556777.058073660009541, 7479200.29021008964628 ], [ 556984.500647510052659, 7478690.287744199857116 ], [ 557091.201049720053561, 7478390.301844799891114 ], [ 557203.828612910001539, 7478001.799697199836373 ], [ 557366.690636259969324, 7477491.319303460419178 ], [ 557435.490514970035292, 7477249.331434190273285 ], [ 557525.680882530054078, 7474844.890215270221233 ], [ 557432.510101134655997, 7473446.765934069640934 ], [ 554484.204992703045718, 7473446.765934069640934 ] ], [ [ 550240.370830929954536, 7509051.65035855025053 ], [ 550646.628642339957878, 7509707.641543529927731 ], [ 550990.458773490041494, 7510239.13016343023628 ], [ 551424.608781549963169, 7510724.136291139759123 ], [ 551521.729125880054198, 7510832.627482789568603 ], [ 552053.031475730007514, 7511270.629288829863071 ], [ 552490.528776980005205, 7511676.631063279695809 ], [ 553084.359125780058093, 7512083.121290050446987 ], [ 553771.92165458004456, 7512364.128684209659696 ], [ 554419.131219440023415, 7512736.141921159811318 ], [ 554705.497970039956272, 7512779.141034910455346 ], [ 555546.509203040041029, 7513112.150644919835031 ], [ 555884.449980839970522, 7513301.148592280223966 ], [ 556509.700201389961876, 7513717.650047839619219 ], [ 556714.540975130046718, 7513990.148112979717553 ], [ 556805.361583970021456, 7514365.149901020340621 ], [ 556800.971243790001608, 7514772.646481709554791 ], [ 556783.890439269947819, 7515205.648697529919446 ], [ 556786.110028609982692, 7515657.651135619729757 ], [ 557050.729050599969923, 7516470.669594380073249 ], [ 557147.897687020013109, 7516833.162529920227826 ], [ 557193.838800059980713, 7517125.668676010333002 ], [ 557252.092862259945832, 7517341.659371820278466 ], [ 557334.830827519996092, 7517865.197480149567127 ], [ 557334.819321669987403, 7518302.708508649840951 ], [ 557303.570084349950776, 7518646.232337079942226 ], [ 557209.760103469947353, 7519052.739931610412896 ], [ 557022.249313559965231, 7519271.240688440389931 ], [ 556772.278894940041937, 7519146.218413719907403 ], [ 556834.771384830004536, 7518802.719413139857352 ], [ 556897.251721439999528, 7518396.199569020420313 ], [ 556772.271008339943364, 7517865.161165599711239 ], [ 556545.5604096299503, 7517218.148839759640396 ], [ 556467.830703489948064, 7516919.140610580332577 ], [ 556409.019834719947539, 7516588.638416309840977 ], [ 556375.269657119992189, 7516181.652402970008552 ], [ 556354.478421580046415, 7515825.140343310311437 ], [ 556395.041666649980471, 7515004.150383680127561 ], [ 556329.411386069958098, 7514578.14968691021204 ], [ 556168.720058580045588, 7514216.149762759916484 ], [ 555861.708545739995316, 7513861.149782869964838 ], [ 555568.271343840053305, 7513672.151614439673722 ], [ 555211.510252650012262, 7513533.640483819879591 ], [ 554612.761223490000702, 7513339.63861539028585 ], [ 554370.692080090055242, 7513239.130039299838245 ], [ 554224.009517809958197, 7513157.14075134973973 ], [ 554070.888887600041926, 7513056.1293233204633 ], [ 553924.989553560037166, 7512931.139786940068007 ], [ 553209.36836562003009, 7512520.631152370013297 ], [ 552740.619233850040473, 7512270.632029250264168 ], [ 552396.779262859956361, 7512114.119234059937298 ], [ 551865.528648840030655, 7511801.630576659925282 ], [ 551459.209571829997003, 7511458.12822884041816 ], [ 551426.945709530031309, 7511423.715034839697182 ], [ 550990.47109497000929, 7510958.141390670090914 ], [ 550490.398612090037204, 7510332.630386269651353 ], [ 550209.048160879989155, 7509926.638127829879522 ], [ 549896.549101150012575, 7509364.150753700174391 ], [ 549896.550455349963158, 7508895.15027519967407 ], [ 550052.798911349964328, 7508832.651493079960346 ], [ 550240.370830929954536, 7509051.65035855025053 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.7579", "objectid": "7580", "lithstrtno": "4144", "code": "A-FOp-bs", "unitname": "Pyradie Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Pyroxene spinifex-textured basaltic flows and pillow lava with mafic volcaniclastic rock; minor chert and local komatiite; metamorphosed", "parentcode": "A-FOS4-xbs-bbo", "parentname": "Fortescue Group sequence 4", "rocktype1": "igneous mafic volcanic", "lithname1": "pyroxene spinifex-textured basalt", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 4", "formation": "Pyradie Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2730", "maxuncerty": null, "min_age_ma": "2718", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 2.0910225281799999, "shape_area": 0.017330207771799999 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 531498.791368160047568, 7489954.050970080308616 ], [ 532062.401277250028215, 7489461.059403309598565 ], [ 532651.470854870043695, 7488974.049725639633834 ], [ 533202.932457349961624, 7488582.557957610115409 ], [ 533684.789544260012917, 7488281.061272409744561 ], [ 534166.782311249990016, 7487998.079997730441391 ], [ 534763.028078450006433, 7487683.079398900270462 ], [ 535226.339154119952582, 7487489.58226753026247 ], [ 536273.969601340009831, 7487140.099127089604735 ], [ 536845.479823069996201, 7486959.109396929852664 ], [ 537391.730507079977542, 7486822.609182910062373 ], [ 537969.910448370035738, 7486717.620605089701712 ], [ 538319.298372669960372, 7486632.607603570446372 ], [ 538973.360067910049111, 7486438.122480650432408 ], [ 539582.951551569974981, 7486237.639846519567072 ], [ 540764.831503740046173, 7486034.150001510046422 ], [ 541381.079201090033166, 7485903.160007249563932 ], [ 542048.211118230014108, 7485772.170437729917467 ], [ 543351.099201080040075, 7485599.690714879892766 ], [ 543852.650631809956394, 7485444.190270540304482 ], [ 544290.291403339942917, 7485193.699580590240657 ], [ 544753.541485049994662, 7484981.200015850365162 ], [ 545305.831054919981398, 7484774.719212420284748 ], [ 545801.239993970026262, 7484644.729194659739733 ], [ 546309.541899599949829, 7484552.729641349986196 ], [ 546830.221480080042966, 7484390.747971129603684 ], [ 547598.249432689975947, 7484074.738576619885862 ], [ 548918.140759330010042, 7483469.238691999576986 ], [ 549108.4292188299587, 7483372.749284399673343 ], [ 549482.798652769997716, 7483198.758917829953134 ], [ 550352.179148370050825, 7482812.248023429885507 ], [ 550726.509200779953972, 7482625.749823920428753 ], [ 550923.330109950038604, 7482560.749276779592037 ], [ 551081.9873308299575, 7482496.259008839726448 ], [ 551329.225711080012843, 7482327.528326629661024 ], [ 551497.371107719955035, 7482212.771112849935889 ], [ 552094.901182470028289, 7481490.781041470356286 ], [ 552418.542449099943042, 7481117.270238320343196 ], [ 552941.338768179994076, 7480544.768690920434892 ], [ 553563.738782610045746, 7479648.28148182015866 ], [ 553837.621612629969604, 7479125.2787343300879 ], [ 553888.35882392001804, 7478878.770382479764521 ], [ 554020.909282319946215, 7478674.268816069699824 ], [ 554215.787629480008036, 7478202.291607280261815 ], [ 554321.64940796000883, 7477737.279472540132701 ], [ 554389.221459290012717, 7477240.299697100184858 ], [ 554388.279434529948048, 7477030.290577559731901 ], [ 554362.040577049949206, 7476864.800003419630229 ], [ 554377.15869415004272, 7476463.80083199031651 ], [ 554466.91096401005052, 7476149.81045897025615 ], [ 554478.16147654002998, 7475877.810377850197256 ], [ 554502.4104463000549, 7475635.809987120330334 ], [ 554513.608554529957473, 7475317.821682860143483 ], [ 554511.229637669981457, 7474821.329697109758854 ], [ 554483.678844169946387, 7474369.331994599662721 ], [ 554484.204992703045718, 7473446.765934069640934 ], [ 552540.00917787454091, 7473446.765934069640934 ], [ 552559.710327310021967, 7473666.77142991963774 ], [ 552600.969508989946917, 7474303.27927665039897 ], [ 552596.708678749972023, 7474748.769955390132964 ], [ 552543.789706410025246, 7475646.28036432992667 ], [ 552463.408809709944762, 7476130.771005439572036 ], [ 552306.658736399956979, 7476589.769445920363069 ], [ 552048.321414359961636, 7477100.272185890004039 ], [ 551663.911186350043863, 7477827.761224379763007 ], [ 551437.16058826004155, 7478293.770250840112567 ], [ 551316.653838620055467, 7478607.318379839882255 ], [ 551316.672266190056689, 7478612.767581770196557 ], [ 551135.641229460015893, 7479078.270150319673121 ], [ 551022.398725730017759, 7479333.76121969986707 ], [ 550852.399488970055245, 7479690.761212609708309 ], [ 550041.890736300032586, 7480414.749123720452189 ], [ 549617.369118410046212, 7480754.238236700184643 ], [ 549135.630250200047158, 7481074.728781550191343 ], [ 548564.881766229984351, 7481415.22913280967623 ], [ 548121.170094239991158, 7481723.228881180286407 ], [ 547772.801326930057257, 7482011.731332919560373 ], [ 547316.421153279952705, 7482332.221715359948575 ], [ 546859.528619720018469, 7482532.221713139675558 ], [ 546205.560800889972597, 7482752.22159837000072 ], [ 545602.928874460048974, 7483067.220516609959304 ], [ 545114.68132237996906, 7483362.710411510430276 ], [ 544537.441224989946932, 7483664.707958759739995 ], [ 543953.490297400043346, 7483909.697251250036061 ], [ 543286.960704350029118, 7484168.189011920243502 ], [ 542645.48251971998252, 7484337.181690869852901 ], [ 542099.17025394004304, 7484467.172093479894102 ], [ 541432.229545620037243, 7484636.660625079646707 ], [ 540815.957816689973697, 7484754.157589140348136 ], [ 540339.659089589957148, 7484884.140220150351524 ], [ 539672.748444929951802, 7485078.638870620168746 ], [ 539113.889944290043786, 7485221.62924456037581 ], [ 538523.348910360014997, 7485416.120470630005002 ], [ 537920.110197140020318, 7485603.618674510158598 ], [ 536770.107911959988996, 7485826.600812450051308 ], [ 535677.460755900014192, 7486074.081822020001709 ], [ 535251.89892777998466, 7486184.580331520177424 ], [ 534667.718955090036616, 7486366.068787530064583 ], [ 533772.098973440006375, 7486587.560492790304124 ], [ 533441.859908720012754, 7486684.561328150331974 ], [ 533003.620487009990029, 7486795.060457769781351 ], [ 532692.36994088999927, 7486873.059376089833677 ], [ 532520.611942250048742, 7486855.049858470447361 ], [ 532228.349850810016505, 7486914.039730809628963 ], [ 531517.190547690028325, 7487140.540177199989557 ], [ 531123.261794119956903, 7487219.02877002954483 ], [ 530722.381895730039105, 7487373.530029320158064 ], [ 530307.558641209965572, 7487508.030514949932694 ], [ 529856.167837069951929, 7487704.019504959695041 ], [ 529179.029712880030274, 7488126.019333999603987 ], [ 528891.789115860010497, 7488198.021047179587185 ], [ 528731.341024499968626, 7488476.021522340364754 ], [ 528289.459433970041573, 7489080.520819160155952 ], [ 527786.471506739966571, 7488955.51139098033309 ], [ 527041.470700709964149, 7488749.51114213000983 ], [ 526608.280971399974078, 7488592.999127079732716 ], [ 526194.061343439971097, 7488429.490526120178401 ], [ 525766.959432419971563, 7488209.489898060448468 ], [ 525403.660829109954648, 7488039.482254079543054 ], [ 525066.360426930012181, 7487990.491318049840629 ], [ 524761.080699170008302, 7487979.479213849641383 ], [ 524378.960761180031113, 7487872.979142759926617 ], [ 523760.189276150020305, 7487468.969647600315511 ], [ 523377.917523659998551, 7487318.458631769753993 ], [ 523103.990042019984685, 7487230.960358049720526 ], [ 522587.881250180013012, 7487010.960306249558926 ], [ 522285.260041049972642, 7487566.45121266040951 ], [ 521928.229373770009261, 7487377.449425860308111 ], [ 521589.288910479983315, 7486977.940568719990551 ], [ 521076.220722689991817, 7486076.939235580153763 ], [ 520870.908279109979048, 7485702.431779920123518 ], [ 520717.041263679973781, 7485442.442296460270882 ], [ 520601.829014529997949, 7485283.930478939786553 ], [ 520493.14832075999584, 7485169.919389979913831 ], [ 520231.268917570007034, 7484923.429360089823604 ], [ 520007.750378300028387, 7484720.918960610404611 ], [ 519765.139855329995044, 7484531.410296330228448 ], [ 519675.731914539996069, 7484448.911825910210609 ], [ 519643.779406770016067, 7484410.921453320421278 ], [ 519428.37901418999536, 7484590.407976619899273 ], [ 519147.262676659971476, 7484311.900555100291967 ], [ 518884.34867892001057, 7483861.398044480010867 ], [ 518678.659267939976417, 7483404.399623359553516 ], [ 518453.961532760004047, 7482959.889496839605272 ], [ 517882.729129530023783, 7481861.870758390054107 ], [ 517382.249857250018977, 7480928.858782240189612 ], [ 517131.750977970019449, 7480408.358815720304847 ], [ 516958.138920310011599, 7480008.349571480415761 ], [ 516816.519521509995684, 7479646.352016390301287 ], [ 516680.678685929975472, 7479169.839858730323613 ], [ 516595.679728140006773, 7478679.838978200219572 ], [ 516561.039179959974717, 7478088.360192120075226 ], [ 516552.039775579993147, 7477528.379306780174375 ], [ 516631.371785009978339, 7476827.91033367998898 ], [ 516743.381326630013064, 7476317.929811799898744 ], [ 516969.488256849988829, 7475718.452284649945796 ], [ 517221.15078182000434, 7475150.460371020250022 ], [ 517422.32183728000382, 7474665.981291459873319 ], [ 517862.690329869976267, 7473658.000393380410969 ], [ 517968.982304829813074, 7473446.765934069640934 ], [ 515687.31005864002509, 7473446.765934069640934 ], [ 515687.31005864002509, 7484424.49293443467468 ], [ 515834.798774280003272, 7484482.362057009711862 ], [ 516102.459870750026312, 7484601.869119809940457 ], [ 516217.310765629983507, 7484683.870723370462656 ], [ 516326.429848819971085, 7484893.381361030042171 ], [ 516320.510699520003982, 7484988.872019359841943 ], [ 516301.869407019985374, 7485084.369545670226216 ], [ 516353.519451149972156, 7485236.871889360249043 ], [ 516449.418488099996466, 7485350.880605299957097 ], [ 516666.421290200029034, 7485508.878112699836493 ], [ 516927.950278770003933, 7485679.378276979550719 ], [ 517463.637543010001536, 7486001.390471969731152 ], [ 517634.900084780005272, 7485898.400607910007238 ], [ 517660.507719189976342, 7485929.891643890179694 ], [ 517794.508853740000632, 7486024.900842210277915 ], [ 517979.299585099972319, 7486112.899997440166771 ], [ 518501.699876250000671, 7486294.90911213029176 ], [ 518705.950897419999819, 7486458.909381340257823 ], [ 519045.77152519999072, 7487029.90596828982234 ], [ 519197.270578199997544, 7486806.422487869858742 ], [ 519299.649919120012783, 7486933.410632349550724 ], [ 519978.909117389994208, 7488011.42803343012929 ], [ 520177.991389880015049, 7488423.928699710406363 ], [ 520331.968202390009537, 7488696.939133930020034 ], [ 520608.107771619979758, 7489268.439483510330319 ], [ 521224.28995990002295, 7489118.450215740129352 ], [ 521460.109446209971793, 7489225.45048428978771 ], [ 521931.460056159994565, 7489388.450269759632647 ], [ 522249.710844649991486, 7489450.459670879878104 ], [ 522898.739321379980538, 7489516.95748660992831 ], [ 523172.339214570005424, 7489559.970132290385664 ], [ 523458.788942609971855, 7489615.470358500257134 ], [ 523860.21075316000497, 7489772.479153100401163 ], [ 524274.671697549987584, 7490005.979487449862063 ], [ 524580.929671640042216, 7490207.990078659728169 ], [ 525263.63108038995415, 7490681.479916979558766 ], [ 525633.879788300022483, 7490965.99874919001013 ], [ 526080.409787329961546, 7491262.502284400165081 ], [ 526392.791392470011488, 7491426.508381759747863 ], [ 526718.599498050054535, 7491736.499324150383472 ], [ 527174.819998839986511, 7490782.511625460349023 ], [ 527680.867203320027329, 7490012.509104180149734 ], [ 528010.690560759976506, 7490033.00870062969625 ], [ 528554.639594899956137, 7490014.519405740313232 ], [ 528745.280351449968293, 7489988.010815599933267 ], [ 528980.210056909942068, 7489904.021742659620941 ], [ 529189.580337209976278, 7489794.531878739595413 ], [ 529475.157951329951175, 7489672.028327610343695 ], [ 529824.509794170036912, 7489587.520447020418942 ], [ 530193.100235059973784, 7489541.038226139731705 ], [ 529932.98886083997786, 7489804.025997609831393 ], [ 528977.92851385998074, 7490769.530310049653053 ], [ 528182.869514529942535, 7492066.029675690457225 ], [ 528666.197390179964714, 7492063.530787769705057 ], [ 529212.330741600017063, 7491907.539981139823794 ], [ 529719.632291379966773, 7491605.528420919552445 ], [ 530163.091089620022103, 7491234.030547330155969 ], [ 530511.511262089945376, 7490958.541540630161762 ], [ 531498.791368160047568, 7489954.050970080308616 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.9861", "objectid": "9862", "lithstrtno": "4146", "code": "A-FOo-bbo", "unitname": "Boongal Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Pillowed and massive basaltic flows with basaltic breccia siltstone and mudstone; minor chert; metamorphosed", "parentcode": "A-FOS3-bbo", "parentname": "Fortescue Group sequence 3", "rocktype1": "igneous mafic volcanic", "lithname1": "basalt", "qualifier1": "pillowed", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 3", "formation": "Boongal Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2745", "maxuncerty": null, "min_age_ma": "2730", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.7720637985900001, "shape_area": 0.0088294660016799992 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 530722.381895730039105, 7487373.530029320158064 ], [ 531123.261794119956903, 7487219.02877002954483 ], [ 531517.190547690028325, 7487140.540177199989557 ], [ 532228.349850810016505, 7486914.039730809628963 ], [ 532520.611942250048742, 7486855.049858470447361 ], [ 532692.36994088999927, 7486873.059376089833677 ], [ 533003.620487009990029, 7486795.060457769781351 ], [ 533441.859908720012754, 7486684.561328150331974 ], [ 533772.098973440006375, 7486587.560492790304124 ], [ 534667.718955090036616, 7486366.068787530064583 ], [ 535251.89892777998466, 7486184.580331520177424 ], [ 535677.460755900014192, 7486074.081822020001709 ], [ 536770.107911959988996, 7485826.600812450051308 ], [ 537920.110197140020318, 7485603.618674510158598 ], [ 538523.348910360014997, 7485416.120470630005002 ], [ 539113.889944290043786, 7485221.62924456037581 ], [ 539672.748444929951802, 7485078.638870620168746 ], [ 540339.659089589957148, 7484884.140220150351524 ], [ 540815.957816689973697, 7484754.157589140348136 ], [ 541432.229545620037243, 7484636.660625079646707 ], [ 542099.17025394004304, 7484467.172093479894102 ], [ 542645.48251971998252, 7484337.181690869852901 ], [ 543286.960704350029118, 7484168.189011920243502 ], [ 543953.490297400043346, 7483909.697251250036061 ], [ 544537.441224989946932, 7483664.707958759739995 ], [ 545114.68132237996906, 7483362.710411510430276 ], [ 545602.928874460048974, 7483067.220516609959304 ], [ 546205.560800889972597, 7482752.22159837000072 ], [ 546859.528619720018469, 7482532.221713139675558 ], [ 547316.421153279952705, 7482332.221715359948575 ], [ 547772.801326930057257, 7482011.731332919560373 ], [ 548121.170094239991158, 7481723.228881180286407 ], [ 548564.881766229984351, 7481415.22913280967623 ], [ 549135.630250200047158, 7481074.728781550191343 ], [ 549617.369118410046212, 7480754.238236700184643 ], [ 550041.890736300032586, 7480414.749123720452189 ], [ 550852.399488970055245, 7479690.761212609708309 ], [ 551022.398725730017759, 7479333.76121969986707 ], [ 551135.641229460015893, 7479078.270150319673121 ], [ 551316.672266190056689, 7478612.767581770196557 ], [ 551316.653838620055467, 7478607.318379839882255 ], [ 551437.16058826004155, 7478293.770250840112567 ], [ 551663.911186350043863, 7477827.761224379763007 ], [ 552048.321414359961636, 7477100.272185890004039 ], [ 552306.658736399956979, 7476589.769445920363069 ], [ 552463.408809709944762, 7476130.771005439572036 ], [ 552543.789706410025246, 7475646.28036432992667 ], [ 552596.708678749972023, 7474748.769955390132964 ], [ 552600.969508989946917, 7474303.27927665039897 ], [ 552559.710327310021967, 7473666.77142991963774 ], [ 552540.00917787454091, 7473446.765934069640934 ], [ 551080.212846429902129, 7473446.765934069640934 ], [ 551035.608584269997664, 7473948.730222159996629 ], [ 551013.400320730055682, 7474879.230345549993217 ], [ 551013.400707509950735, 7476009.738878300413489 ], [ 550880.391042839968577, 7476851.749500320293009 ], [ 550646.820849810028449, 7477780.750998630188406 ], [ 550472.311465810053051, 7478079.751260950230062 ], [ 550048.579763669986278, 7478777.751176180317998 ], [ 549400.371715590008534, 7479400.739066990092397 ], [ 548652.548129320028238, 7480148.730872269719839 ], [ 547456.001047570025548, 7481145.721713369712234 ], [ 546433.928628760040738, 7481843.719781110063195 ], [ 545262.300773459952325, 7482442.211092540062964 ], [ 544114.320860560052097, 7482954.200195039622486 ], [ 544031.747912460006773, 7482980.188702680170536 ], [ 543923.859284300007857, 7483031.691971049644053 ], [ 543307.878213220043108, 7483219.690653090365231 ], [ 541904.428336929995567, 7483628.172685800120234 ], [ 540773.859463830012828, 7483927.159011710435152 ], [ 539922.830867439974099, 7484167.147630030289292 ], [ 539071.751081289956346, 7484388.118471539579332 ], [ 538430.128910519997589, 7484538.110331879928708 ], [ 537274.421160569996573, 7484900.611389660276473 ], [ 536416.878469659946859, 7485109.088254359550774 ], [ 535127.470298039959744, 7485434.569571630097926 ], [ 534092.21032826998271, 7485720.068343419581652 ], [ 533603.168918970040977, 7485843.570628009736538 ], [ 533139.431913170032203, 7485941.560117250308394 ], [ 532656.549589470028877, 7486033.552292670123279 ], [ 532154.860149109968916, 7486176.051343370229006 ], [ 531685.150314419995993, 7486369.538402480073273 ], [ 531272.819183569983579, 7486582.030198579654098 ], [ 530644.619228519964963, 7486871.519565439783037 ], [ 529748.237938759964891, 7487243.030956010334194 ], [ 529542.089915359974839, 7487311.529445690102875 ], [ 529422.971164569957182, 7487328.510253859683871 ], [ 529486.573557080002502, 7487228.240700139664114 ], [ 529610.718033500015736, 7487032.521789309568703 ], [ 529385.112543620052747, 7487076.020391209982336 ], [ 529237.922070009983145, 7487046.530405789613724 ], [ 529120.149274140014313, 7487076.007991850376129 ], [ 528954.110069880029187, 7487103.521836710162461 ], [ 528795.161534680053592, 7487111.009507419541478 ], [ 528572.600081639946438, 7487105.512862170115113 ], [ 527974.408268759958446, 7487025.998880390077829 ], [ 527662.338701030006632, 7486932.500663819722831 ], [ 526961.480119650019333, 7486655.987977350130677 ], [ 526113.710027370019816, 7486246.990289689972997 ], [ 524915.208273750031367, 7485629.970491929911077 ], [ 524265.450897340022493, 7485403.967761510051787 ], [ 523577.778480749984737, 7485223.462142010219395 ], [ 523268.120747109991498, 7485625.951278129592538 ], [ 522999.849542689975351, 7485391.950317829847336 ], [ 522750.549823439971078, 7485113.459524570032954 ], [ 522206.711411260010209, 7484428.940459559671581 ], [ 522123.3302770400187, 7484282.942129979841411 ], [ 522059.031432130024768, 7484136.939696010202169 ], [ 522007.338594119995832, 7483971.429092960432172 ], [ 521999.950163599976804, 7483748.9293083101511 ], [ 522018.439330630004406, 7483621.429230930283666 ], [ 521784.480578640010208, 7483902.939748729579151 ], [ 521374.539772410003934, 7483293.929609539918602 ], [ 521163.329343390010763, 7483008.930106650106609 ], [ 521112.019750770006794, 7482919.920276300050318 ], [ 520941.17862751998473, 7483098.931340780109167 ], [ 520531.619565160013735, 7482560.410203600302339 ], [ 520237.10917721997248, 7482148.410561019554734 ], [ 519955.230062239977997, 7481716.908311439678073 ], [ 519622.430933850002475, 7481273.389771680347621 ], [ 519001.440619600005448, 7480404.37745278980583 ], [ 518713.410290280007757, 7480024.371472629718482 ], [ 518469.570884139975533, 7479567.368860090151429 ], [ 518244.409103669982869, 7479021.358764530159533 ], [ 518159.351960200001486, 7478525.359361410140991 ], [ 518125.649700690002646, 7478117.86872429959476 ], [ 518142.210221890010871, 7477602.391211249865592 ], [ 518215.772289789980277, 7477016.40078095998615 ], [ 518327.488122560025658, 7476442.93088511005044 ], [ 518508.929092329984996, 7475818.430933189578354 ], [ 518735.748522549984045, 7475371.431314400397241 ], [ 518995.009580629994161, 7475058.43823663983494 ], [ 519254.761205210001208, 7474853.430005059577525 ], [ 519514.34932562999893, 7474609.939006499946117 ], [ 519634.308755900012329, 7474430.939210419543087 ], [ 519729.221963040006813, 7474334.92953103967011 ], [ 520045.079995240026619, 7473894.428377710282803 ], [ 520263.966596475744154, 7473446.765934069640934 ], [ 517968.982304829813074, 7473446.765934069640934 ], [ 517862.690329869976267, 7473658.000393380410969 ], [ 517422.32183728000382, 7474665.981291459873319 ], [ 517221.15078182000434, 7475150.460371020250022 ], [ 516969.488256849988829, 7475718.452284649945796 ], [ 516743.381326630013064, 7476317.929811799898744 ], [ 516631.371785009978339, 7476827.91033367998898 ], [ 516552.039775579993147, 7477528.379306780174375 ], [ 516561.039179959974717, 7478088.360192120075226 ], [ 516595.679728140006773, 7478679.838978200219572 ], [ 516680.678685929975472, 7479169.839858730323613 ], [ 516816.519521509995684, 7479646.352016390301287 ], [ 516958.138920310011599, 7480008.349571480415761 ], [ 517131.750977970019449, 7480408.358815720304847 ], [ 517382.249857250018977, 7480928.858782240189612 ], [ 517882.729129530023783, 7481861.870758390054107 ], [ 518453.961532760004047, 7482959.889496839605272 ], [ 518678.659267939976417, 7483404.399623359553516 ], [ 518884.34867892001057, 7483861.398044480010867 ], [ 519147.262676659971476, 7484311.900555100291967 ], [ 519428.37901418999536, 7484590.407976619899273 ], [ 519643.779406770016067, 7484410.921453320421278 ], [ 519675.731914539996069, 7484448.911825910210609 ], [ 519765.139855329995044, 7484531.410296330228448 ], [ 520007.750378300028387, 7484720.918960610404611 ], [ 520231.268917570007034, 7484923.429360089823604 ], [ 520493.14832075999584, 7485169.919389979913831 ], [ 520601.829014529997949, 7485283.930478939786553 ], [ 520717.041263679973781, 7485442.442296460270882 ], [ 520870.908279109979048, 7485702.431779920123518 ], [ 521076.220722689991817, 7486076.939235580153763 ], [ 521589.288910479983315, 7486977.940568719990551 ], [ 521928.229373770009261, 7487377.449425860308111 ], [ 522285.260041049972642, 7487566.45121266040951 ], [ 522587.881250180013012, 7487010.960306249558926 ], [ 523103.990042019984685, 7487230.960358049720526 ], [ 523377.917523659998551, 7487318.458631769753993 ], [ 523760.189276150020305, 7487468.969647600315511 ], [ 524378.960761180031113, 7487872.979142759926617 ], [ 524761.080699170008302, 7487979.479213849641383 ], [ 525066.360426930012181, 7487990.491318049840629 ], [ 525403.660829109954648, 7488039.482254079543054 ], [ 525766.959432419971563, 7488209.489898060448468 ], [ 526194.061343439971097, 7488429.490526120178401 ], [ 526608.280971399974078, 7488592.999127079732716 ], [ 527041.470700709964149, 7488749.51114213000983 ], [ 527786.471506739966571, 7488955.51139098033309 ], [ 528289.459433970041573, 7489080.520819160155952 ], [ 528731.341024499968626, 7488476.021522340364754 ], [ 528891.789115860010497, 7488198.021047179587185 ], [ 529179.029712880030274, 7488126.019333999603987 ], [ 529856.167837069951929, 7487704.019504959695041 ], [ 530307.558641209965572, 7487508.030514949932694 ], [ 530722.381895730039105, 7487373.530029320158064 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14820", "objectid": "14822", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 1.1612785960300001, "shape_area": 0.0059257442593800003 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7497115.820520521141589 ], [ 515754.799057190015446, 7497040.40949865989387 ], [ 515793.128931319981348, 7497078.399584740400314 ], [ 515863.180090909998398, 7497103.421118300408125 ], [ 516265.418169579992536, 7497432.421495869755745 ], [ 516489.109890850028023, 7497660.420436239801347 ], [ 516642.618601860012859, 7497850.430777939967811 ], [ 516885.902088599978015, 7498199.429791740141809 ], [ 516997.112233689986169, 7498099.42919669020921 ], [ 517473.779419790022075, 7497665.421633450314403 ], [ 517847.879607070004568, 7497213.920483809895813 ], [ 517992.779921379988082, 7496926.429134880192578 ], [ 518383.931465780013241, 7496275.420112820342183 ], [ 518769.290147739986423, 7495725.928489049896598 ], [ 518705.069473669980653, 7495598.940543320029974 ], [ 518588.76013419998344, 7495217.430626450106502 ], [ 518543.060454390011728, 7494963.42907639965415 ], [ 518471.900537130015437, 7494715.428815290331841 ], [ 518363.05026823002845, 7494563.417820639908314 ], [ 518184.840464940003585, 7494525.920076349750161 ], [ 517804.770179970015306, 7494846.419316640123725 ], [ 517393.629248439974617, 7495306.919828530400991 ], [ 517026.319249610009138, 7495626.907642669975758 ], [ 516855.688426990003791, 7495863.411676499992609 ], [ 516663.828672209987417, 7495628.911218900233507 ], [ 516401.340706480026711, 7495261.409630320034921 ], [ 516100.681956680025905, 7494893.908751860260963 ], [ 515921.677714249992277, 7494697.41118314024061 ], [ 515749.4295332399779, 7494583.898371280170977 ], [ 515687.31005864002509, 7494569.547191276215017 ], [ 515687.31005864002509, 7497115.820520521141589 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.5293", "objectid": "5293", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 1.1552456954400001, "shape_area": 0.0052035302962999998 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7495992.320895091630518 ], [ 562491.400376350036822, 7495921.300782550126314 ], [ 562019.820314730051905, 7495720.302675129845738 ], [ 561529.069343350012787, 7495500.300697609782219 ], [ 561172.320291019976139, 7495368.299701560288668 ], [ 560402.570722269942053, 7495308.800442470237613 ], [ 560097.570766930002719, 7495361.79068183992058 ], [ 559741.432132430025376, 7495363.28972162026912 ], [ 559352.750818699947558, 7495212.791316449642181 ], [ 558785.421642940025777, 7494929.281944960355759 ], [ 558352.130415069987066, 7494747.279625999741256 ], [ 557957.259456550003961, 7494615.783141110092402 ], [ 557645.189484709990211, 7494528.279138370417058 ], [ 557243.719799650018103, 7494358.769946710206568 ], [ 556931.350873869960196, 7494207.778886949643493 ], [ 556452.998445700039156, 7493898.268556670285761 ], [ 556185.178019879967906, 7493759.771520050242543 ], [ 555822.108224330004305, 7493634.262409400194883 ], [ 555427.500493929954246, 7493560.259708169847727 ], [ 554988.728318589972332, 7493568.758602280169725 ], [ 554708.987234840053134, 7493583.250167059712112 ], [ 554250.857786769978702, 7493534.748806440271437 ], [ 553888.03141948999837, 7493460.250612050294876 ], [ 553582.358255979954265, 7493379.240251369774342 ], [ 553270.598975960048847, 7493355.742238880135119 ], [ 552895.541484309942462, 7493376.728750480338931 ], [ 552724.001571660046466, 7493409.24016897007823 ], [ 552634.977255600038916, 7493409.730852910317481 ], [ 552120.02944087004289, 7493450.728757919743657 ], [ 551420.399801210034639, 7493422.732412000186741 ], [ 551366.617026919964701, 7493423.055953639559448 ], [ 551089.650060679996386, 7493424.718791520223022 ], [ 550765.358819589950144, 7493413.720309609547257 ], [ 550383.109014970017597, 7493275.710593770258129 ], [ 549924.230084380018525, 7493068.211211860179901 ], [ 549427.352509089978412, 7492886.201835599727929 ], [ 548956.0910621000221, 7492755.198269600048661 ], [ 548555.108524280018173, 7492681.192445100285113 ], [ 548154.380444790003821, 7492676.690392710268497 ], [ 547824.27998191001825, 7492786.679622329771519 ], [ 547411.570846550050192, 7492935.181099180132151 ], [ 547017.769695810042322, 7493033.168757920153439 ], [ 546566.369162349961698, 7493067.16939007025212 ], [ 546146.630921929958276, 7493050.671805170364678 ], [ 545739.079724060022272, 7492931.657495119608939 ], [ 545414.140461780014448, 7492806.169576980173588 ], [ 544713.190917499945499, 7492510.65921042021364 ], [ 544311.508540580049157, 7492303.159224379807711 ], [ 544164.749375049956143, 7492195.661123299971223 ], [ 543948.009315419942141, 7492082.15929201990366 ], [ 543815.639348490047269, 7492181.652319019660354 ], [ 543420.559457879979163, 7492167.660537029616535 ], [ 543242.211323129944503, 7492092.649319870397449 ], [ 543146.001163249951787, 7491940.152454890310764 ], [ 543100.6207402900327, 7491755.660557329654694 ], [ 543093.419647180009633, 7491577.660029820166528 ], [ 543022.511018689954653, 7491374.657442820258439 ], [ 542881.80016316997353, 7491216.159379719756544 ], [ 542645.927855630056001, 7491090.149695370346308 ], [ 542391.501186319976114, 7491085.14929233957082 ], [ 542117.998944779974408, 7491067.649895650334656 ], [ 541850.509416379965842, 7490992.648644610308111 ], [ 541621.191303660045378, 7490904.649635610170662 ], [ 541378.810070079984143, 7490759.65119098033756 ], [ 541225.54120881005656, 7490626.651507309637964 ], [ 541071.860060309991241, 7490404.651328420266509 ], [ 541020.311512019950897, 7490265.149958720430732 ], [ 540994.19945211999584, 7490125.140481020323932 ], [ 540987.830442319973372, 7489984.639754460193217 ], [ 540639.121395469992422, 7490337.128159949555993 ], [ 540716.941367150051519, 7490648.638500919565558 ], [ 540890.120674449950457, 7490959.638414540328085 ], [ 541069.250745250028558, 7491181.137707220390439 ], [ 541209.801324920030311, 7491327.140143260359764 ], [ 541318.310920499963686, 7491402.650773590430617 ], [ 541522.379093389958143, 7491516.15023647993803 ], [ 541726.178873589960858, 7491597.648138180375099 ], [ 541866.320134090026841, 7491635.139597659930587 ], [ 542203.428717299946584, 7491646.147394060157239 ], [ 542259.79017825005576, 7491461.148964749649167 ], [ 542387.047878319979645, 7491479.650602609850466 ], [ 542508.298627099953592, 7491568.148776990361512 ], [ 542623.620764510007575, 7491745.649526019580662 ], [ 542707.388782929978333, 7491974.649402409791946 ], [ 542804.319843949982896, 7492292.157811080105603 ], [ 542874.870527419960126, 7492419.150357720442116 ], [ 543015.329437579959631, 7492539.138630960136652 ], [ 543212.941721210023388, 7492633.649540959857404 ], [ 543785.640033749979921, 7492706.660280509851873 ], [ 544142.179653740022331, 7492794.159593130461872 ], [ 544346.308373639942147, 7492926.661257339641452 ], [ 544550.748104, 7493129.159070179797709 ], [ 544793.198507150053047, 7493287.14833365008235 ], [ 545098.838259430020116, 7493361.660610700026155 ], [ 545620.520159429986961, 7493403.161414469592273 ], [ 546046.63210618996527, 7493420.159761250019073 ], [ 546440.831084080040455, 7493399.170757370069623 ], [ 546822.028585199965164, 7493326.668271440081298 ], [ 547241.468395530013368, 7493267.16958300024271 ], [ 548296.979325519991107, 7493223.178339689970016 ], [ 548710.802253489964642, 7493316.691018629819155 ], [ 548978.040931120049208, 7493359.698863900266588 ], [ 549474.648993029957637, 7493478.199903059750795 ], [ 549870.019297749968246, 7493704.701154019683599 ], [ 550106.160976730054244, 7493881.701261010020971 ], [ 550558.2990232600132, 7494000.210066519677639 ], [ 551118.180059619946405, 7494060.722641809843481 ], [ 551368.626809600042179, 7494020.756694730371237 ], [ 551569.358151110005565, 7493988.721048220060766 ], [ 551988.982681629946455, 7493979.718334820121527 ], [ 553210.151302670012228, 7493998.742212990298867 ], [ 553794.920808200025931, 7493950.738151979632676 ], [ 554329.087622700026259, 7493941.747372410260141 ], [ 554755.170556660043076, 7493939.249121819622815 ], [ 555105.050060370005667, 7493956.761668190360069 ], [ 555397.807753409957513, 7494012.260754720307887 ], [ 555639.849916859995574, 7494093.759371990337968 ], [ 555894.861274020047858, 7494219.759863370098174 ], [ 556156.530462650000118, 7494415.761871079914272 ], [ 556616.10030645004008, 7494775.759958229959011 ], [ 556852.218676939955913, 7494939.759161150082946 ], [ 557170.74912521999795, 7495052.771290170028806 ], [ 557444.6893065799959, 7495159.772542240098119 ], [ 557693.349951880052686, 7495291.781233799643815 ], [ 557961.790153719950467, 7495576.769842970184982 ], [ 558045.089185219956562, 7495703.781962679699063 ], [ 558052.23004520998802, 7495869.268662620335817 ], [ 558255.440116479992867, 7495804.280857229605317 ], [ 558351.929017900023609, 7496032.767925890162587 ], [ 558371.687999699963257, 7496179.270977480337024 ], [ 558359.978704030043446, 7496395.769036279991269 ], [ 558316.310751219978556, 7496567.771325110457838 ], [ 559327.171282649971545, 7496505.271246150135994 ], [ 560127.862981720012613, 7496386.282164240255952 ], [ 560744.071580859948881, 7496242.778021169826388 ], [ 560801.55911183997523, 7496299.777937590144575 ], [ 560884.83012397994753, 7496420.277748020365834 ], [ 561025.31877665000502, 7496546.779846900142729 ], [ 561191.072146879974753, 7496634.770176869817078 ], [ 561630.581030300003476, 7496778.780727270059288 ], [ 561840.68887213000562, 7496822.281185540370643 ], [ 562127.458183920010924, 7496948.281933180056512 ], [ 562666.860106543055736, 7497133.237551528960466 ], [ 562666.860106543055736, 7495992.320895091630518 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14368", "objectid": "14369", "lithstrtno": "3368", "code": "A-FOj-xs-b", "unitname": "Jeerinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Siliciclastic sedimentary rocks mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks chert and dolerite sills", "parentcode": "A-FOS5-xs-b", "parentname": "Fortescue Group sequence 5", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 5", "formation": "Jeerinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2713", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 4.0528523351399999, "shape_area": 0.020812359399700001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562421.449098899960518, 7498588.759355739690363 ], [ 561912.528315510018729, 7498559.2597412802279 ], [ 561098.710991080035456, 7498583.249814179725945 ], [ 560627.90070563997142, 7498553.749823899939656 ], [ 559889.530454299994744, 7498411.251732099801302 ], [ 559118.799577760044485, 7498154.758440059609711 ], [ 558679.441208709962666, 7498023.260132320225239 ], [ 558259.311313159996644, 7497949.258003230206668 ], [ 557909.380009340005927, 7497912.756985089741647 ], [ 557673.869504629983567, 7497876.259613890200853 ], [ 557450.919712999952026, 7497794.760403499938548 ], [ 557259.399272640002891, 7497649.25935020018369 ], [ 557035.40986553998664, 7497344.758373170159757 ], [ 556919.861955519998446, 7497122.759786680340767 ], [ 556810.039340780000202, 7496760.771355640143156 ], [ 557896.630763810011558, 7496576.258577490225434 ], [ 558070.121155599947087, 7496944.770771049894392 ], [ 558255.600268559996039, 7497185.26009499002248 ], [ 558631.969253320014104, 7497425.260880719870329 ], [ 559026.79020450997632, 7497531.261897060088813 ], [ 559561.129777790047228, 7497553.769323430024087 ], [ 560088.960638139978983, 7497557.271907770074904 ], [ 560636.190526859951206, 7497630.76089888997376 ], [ 561069.011243949993514, 7497704.759833839721978 ], [ 561539.879878400010057, 7497765.770021039992571 ], [ 562017.460723969968967, 7497884.259027689695358 ], [ 562666.860106543055736, 7497990.631876044906676 ], [ 562666.860106543055736, 7497133.237551528960466 ], [ 562127.458183920010924, 7496948.281933180056512 ], [ 561840.68887213000562, 7496822.281185540370643 ], [ 561630.581030300003476, 7496778.780727270059288 ], [ 561191.072146879974753, 7496634.770176869817078 ], [ 561025.31877665000502, 7496546.779846900142729 ], [ 560884.83012397994753, 7496420.277748020365834 ], [ 560801.55911183997523, 7496299.777937590144575 ], [ 560744.071580859948881, 7496242.778021169826388 ], [ 560127.862981720012613, 7496386.282164240255952 ], [ 559327.171282649971545, 7496505.271246150135994 ], [ 558316.310751219978556, 7496567.771325110457838 ], [ 558359.978704030043446, 7496395.769036279991269 ], [ 558371.687999699963257, 7496179.270977480337024 ], [ 558351.929017900023609, 7496032.767925890162587 ], [ 558255.440116479992867, 7495804.280857229605317 ], [ 558052.23004520998802, 7495869.268662620335817 ], [ 558045.089185219956562, 7495703.781962679699063 ], [ 557961.790153719950467, 7495576.769842970184982 ], [ 557693.349951880052686, 7495291.781233799643815 ], [ 557444.6893065799959, 7495159.772542240098119 ], [ 557170.74912521999795, 7495052.771290170028806 ], [ 556852.218676939955913, 7494939.759161150082946 ], [ 556616.10030645004008, 7494775.759958229959011 ], [ 556156.530462650000118, 7494415.761871079914272 ], [ 555894.861274020047858, 7494219.759863370098174 ], [ 555639.849916859995574, 7494093.759371990337968 ], [ 555397.807753409957513, 7494012.260754720307887 ], [ 555105.050060370005667, 7493956.761668190360069 ], [ 554755.170556660043076, 7493939.249121819622815 ], [ 554329.087622700026259, 7493941.747372410260141 ], [ 553794.920808200025931, 7493950.738151979632676 ], [ 553210.151302670012228, 7493998.742212990298867 ], [ 551988.982681629946455, 7493979.718334820121527 ], [ 551569.358151110005565, 7493988.721048220060766 ], [ 551368.626809600042179, 7494020.756694730371237 ], [ 551118.180059619946405, 7494060.722641809843481 ], [ 550558.2990232600132, 7494000.210066519677639 ], [ 550106.160976730054244, 7493881.701261010020971 ], [ 549870.019297749968246, 7493704.701154019683599 ], [ 549474.648993029957637, 7493478.199903059750795 ], [ 548978.040931120049208, 7493359.698863900266588 ], [ 548710.802253489964642, 7493316.691018629819155 ], [ 548296.979325519991107, 7493223.178339689970016 ], [ 547241.468395530013368, 7493267.16958300024271 ], [ 546822.028585199965164, 7493326.668271440081298 ], [ 546440.831084080040455, 7493399.170757370069623 ], [ 546046.63210618996527, 7493420.159761250019073 ], [ 545620.520159429986961, 7493403.161414469592273 ], [ 545098.838259430020116, 7493361.660610700026155 ], [ 544793.198507150053047, 7493287.14833365008235 ], [ 544550.748104, 7493129.159070179797709 ], [ 544346.308373639942147, 7492926.661257339641452 ], [ 544142.179653740022331, 7492794.159593130461872 ], [ 543785.640033749979921, 7492706.660280509851873 ], [ 543212.941721210023388, 7492633.649540959857404 ], [ 543015.329437579959631, 7492539.138630960136652 ], [ 542874.870527419960126, 7492419.150357720442116 ], [ 542804.319843949982896, 7492292.157811080105603 ], [ 542707.388782929978333, 7491974.649402409791946 ], [ 542623.620764510007575, 7491745.649526019580662 ], [ 542508.298627099953592, 7491568.148776990361512 ], [ 542387.047878319979645, 7491479.650602609850466 ], [ 542259.79017825005576, 7491461.148964749649167 ], [ 542203.428717299946584, 7491646.147394060157239 ], [ 541866.320134090026841, 7491635.139597659930587 ], [ 541726.178873589960858, 7491597.648138180375099 ], [ 541522.379093389958143, 7491516.15023647993803 ], [ 541318.310920499963686, 7491402.650773590430617 ], [ 541209.801324920030311, 7491327.140143260359764 ], [ 541069.250745250028558, 7491181.137707220390439 ], [ 540890.120674449950457, 7490959.638414540328085 ], [ 540716.941367150051519, 7490648.638500919565558 ], [ 540639.121395469992422, 7490337.128159949555993 ], [ 540987.830442319973372, 7489984.639754460193217 ], [ 541044.12911024002824, 7489927.639171360060573 ], [ 541239.63983072002884, 7489576.641609819605947 ], [ 541719.809467370039783, 7488918.160171950235963 ], [ 542340.530504659982398, 7488386.659122560173273 ], [ 543469.998219090048224, 7487871.180351009592414 ], [ 544574.599058820051141, 7487458.188967909663916 ], [ 546587.230142600019462, 7486772.721792650409043 ], [ 548225.680131730041467, 7486292.730476760305464 ], [ 549851.188989539979957, 7485761.741123080253601 ], [ 551338.5497821100289, 7485090.025646439753473 ], [ 551338.549904590006918, 7485090.061955739744008 ], [ 551577.239460229990073, 7484982.252649479545653 ], [ 552567.438844150048681, 7484595.270084340125322 ], [ 553994.731696769944392, 7483836.269434520043433 ], [ 555585.872745560016483, 7482764.780236049555242 ], [ 557005.000187280005775, 7481649.799908259883523 ], [ 558162.910846160026267, 7480427.790963140316308 ], [ 559073.070471100043505, 7479245.320975399576128 ], [ 559301.230240639997646, 7479091.310507340356708 ], [ 559408.93108398001641, 7479001.821175940334797 ], [ 559529.190361369983293, 7478886.309631819836795 ], [ 559882.373260110034607, 7478260.830046719871461 ], [ 559970.361824939958751, 7478050.32086979970336 ], [ 560000.63984713004902, 7477719.318579459562898 ], [ 559941.869839449995197, 7477413.839102909900248 ], [ 559870.578330309945159, 7477127.825745229609311 ], [ 559843.110859469976276, 7476701.840296889655292 ], [ 559898.918661569943652, 7476408.340487170033157 ], [ 560043.638665909995325, 7476083.33965312037617 ], [ 560232.808540910016745, 7475744.850065840408206 ], [ 560358.740260210004635, 7475483.342136479914188 ], [ 560603.88147336000111, 7474870.850602730177343 ], [ 560747.990340759977698, 7474430.849786610342562 ], [ 560835.080332349985838, 7474022.851079889573157 ], [ 560826.793062305427156, 7473446.765934069640934 ], [ 557432.510101134655997, 7473446.765934069640934 ], [ 557525.680882530054078, 7474844.890215270221233 ], [ 557435.490514970035292, 7477249.331434190273285 ], [ 557366.690636259969324, 7477491.319303460419178 ], [ 557203.828612910001539, 7478001.799697199836373 ], [ 557091.201049720053561, 7478390.301844799891114 ], [ 556984.500647510052659, 7478690.287744199857116 ], [ 556777.058073660009541, 7479200.29021008964628 ], [ 556638.371832969947718, 7479455.78113333042711 ], [ 556436.380619490053505, 7479768.781995279714465 ], [ 556398.060009449953213, 7479859.278600730001926 ], [ 556321.489123960025609, 7479956.77931575011462 ], [ 556113.878784709959291, 7480314.277741310186684 ], [ 554811.10155056999065, 7481794.781839599832892 ], [ 553537.949906770023517, 7482890.281093879602849 ], [ 552027.868966070003808, 7483867.770847659558058 ], [ 551335.369841750012711, 7484147.563608339987695 ], [ 550722.249479479971342, 7484395.249562780372798 ], [ 549293.689134740037844, 7484880.250223100185394 ], [ 548747.681917050038464, 7485074.240724699571729 ], [ 548131.742110710009001, 7485262.237969799898565 ], [ 547503.288716990035027, 7485507.228992990218103 ], [ 546951.278525750036351, 7485771.230792 ], [ 546468.978509249980561, 7485977.719601069577038 ], [ 545961.030371480039321, 7486152.220580110326409 ], [ 545345.340155360056087, 7486384.71030355989933 ], [ 544767.590917099965736, 7486591.201564590446651 ], [ 543485.092239659978077, 7487031.170335260219872 ], [ 542920.187694640015252, 7487263.180720839649439 ], [ 542456.839825210045092, 7487444.169361050240695 ], [ 541999.648718490032479, 7487599.163327969610691 ], [ 541351.829978380003013, 7487768.150228680111468 ], [ 540545.270078580011614, 7488001.651238979771733 ], [ 540094.551193960011005, 7488169.640105499885976 ], [ 539167.567884790012613, 7488474.128463700413704 ], [ 538761.317654639948159, 7488635.118393870070577 ], [ 538152.181785180000588, 7488925.111552310176194 ], [ 537708.299167479970492, 7489188.111205180175602 ], [ 537442.369292260031216, 7489425.109939070418477 ], [ 537240.129678840050474, 7489700.111702639609575 ], [ 537082.761445729993284, 7490032.107829850167036 ], [ 537064.939034159993753, 7490293.120942019857466 ], [ 537085.189913260051981, 7490547.619091790169477 ], [ 537123.991076610051095, 7490687.099819210357964 ], [ 537143.239344249945134, 7490712.609949960373342 ], [ 537397.371146259945817, 7490660.111204289831221 ], [ 537487.441841059946455, 7490882.609511179849505 ], [ 537654.058731580036692, 7491149.111612769775093 ], [ 537858.802059140056372, 7491415.117978409864008 ], [ 537992.999373289989308, 7491548.119324930012226 ], [ 538152.48018651001621, 7491649.118514469824731 ], [ 538299.87104315997567, 7491877.61903742980212 ], [ 538434.621193959959783, 7492137.620095389895141 ], [ 538652.561359170009382, 7492492.628104509785771 ], [ 538799.870407829992473, 7492714.619908520020545 ], [ 539039.420328530017287, 7492274.12993127014488 ], [ 539256.667791689978912, 7492496.13018405996263 ], [ 539703.578717379947193, 7492843.630788899958134 ], [ 540053.979118539951742, 7492994.638469030149281 ], [ 540455.231710409978405, 7493113.131476259790361 ], [ 540786.52025592001155, 7493232.141431320458651 ], [ 541041.429810469970107, 7493351.641833259724081 ], [ 541239.201890320051461, 7493478.130430269986391 ], [ 541373.259800240048207, 7493585.62896960042417 ], [ 541963.191630379995331, 7493283.139785929583013 ], [ 542500.679885059944354, 7493961.138607029803097 ], [ 542743.630761609994806, 7494233.640817360021174 ], [ 543082.007789839990437, 7494518.141714329831302 ], [ 543356.198679139954038, 7494663.138956059701741 ], [ 543789.260250719962642, 7494794.649844129569829 ], [ 544139.251131649944, 7494849.639782629907131 ], [ 544641.630074440035969, 7494840.648572890087962 ], [ 545175.319051780039445, 7494736.149638379923999 ], [ 545741.092215740005486, 7494688.149336840026081 ], [ 546307.75074092997238, 7494838.149286760017276 ], [ 546786.056715170037933, 7495109.162089169956744 ], [ 547188.059762930031866, 7495399.670047010295093 ], [ 547621.699969719978981, 7495652.168337520211935 ], [ 547965.698955520056188, 7495764.669661940075457 ], [ 548207.390742080053315, 7495776.170087760314345 ], [ 548481.159597750054672, 7495844.679829609580338 ], [ 548863.079289200017229, 7495925.179077940061688 ], [ 549506.212394159985706, 7496087.187914409674704 ], [ 550117.35100883000996, 7496224.190740790218115 ], [ 550607.471249419962987, 7496316.710699019953609 ], [ 551376.739154380047694, 7496434.70587014965713 ], [ 551376.73608185001649, 7496433.791175260208547 ], [ 551619.35050013998989, 7496470.708245259709656 ], [ 552052.477855409961194, 7496608.21943895984441 ], [ 552441.167965259985067, 7496771.719051790423691 ], [ 552785.109833849943243, 7496871.719957020133734 ], [ 553167.019435839960352, 7496964.73136886022985 ], [ 553873.407264049979858, 7497069.228741990402341 ], [ 554307.539024519966915, 7497121.239912189543247 ], [ 554527.538610500050709, 7496881.231944209896028 ], [ 554361.860675979987718, 7496812.242042959667742 ], [ 554189.528591600013897, 7496672.741518639959395 ], [ 554011.079331679968163, 7496591.241597959771752 ], [ 553736.679746850044467, 7496382.731079690158367 ], [ 553462.279581440030597, 7496205.730644360184669 ], [ 552666.488816019962542, 7496019.231565900146961 ], [ 552322.961759119993076, 7495989.220348490402102 ], [ 551954.149807250010781, 7495997.719214060343802 ], [ 551521.861877109971829, 7496025.721549900248647 ], [ 551375.36080701998435, 7496024.402736780233681 ], [ 551076.650700130034238, 7496021.709231699816883 ], [ 550733.099958559963852, 7495985.210589869879186 ], [ 550312.910615590051748, 7495892.210300539620221 ], [ 550019.969748529954813, 7495810.698891820386052 ], [ 549618.769633420044556, 7495685.690184440463781 ], [ 549217.759903430007398, 7495617.679179130122066 ], [ 548816.892022080020979, 7495569.179532590322196 ], [ 548396.782193950028159, 7495482.180683489888906 ], [ 547925.59855144994799, 7495364.171054489910603 ], [ 547498.701257099979557, 7495194.17018620017916 ], [ 547096.899161410052329, 7494948.160620270296931 ], [ 546821.579328609979711, 7494568.161856819875538 ], [ 546566.508490049978718, 7494423.159816980361938 ], [ 545695.309559370041825, 7494434.148953230120242 ], [ 545237.501353780040517, 7494449.160052079707384 ], [ 544277.139624880044721, 7494416.150826640427113 ], [ 543755.121623549959622, 7494304.64926781039685 ], [ 543398.137297129957005, 7494128.140172740444541 ], [ 543028.137615890009329, 7493882.139863289892673 ], [ 542747.390386529965326, 7493686.141672980040312 ], [ 542561.820394319947809, 7493458.150018610060215 ], [ 542286.889140769955702, 7493141.651626129634678 ], [ 542578.619356640032493, 7492980.651306429877877 ], [ 542636.310553809977137, 7493075.648924670182168 ], [ 542802.682014300022274, 7493278.639014470390975 ], [ 542866.689999529975466, 7493367.640603230334818 ], [ 543032.74942597001791, 7493525.639886749908328 ], [ 543249.821946040028706, 7493696.147726809605956 ], [ 543543.189538729959168, 7493866.648261900059879 ], [ 543779.078326359973289, 7493992.649916980415583 ], [ 544084.999543430050835, 7494137.151736919768155 ], [ 544428.949143290054053, 7494243.648458180017769 ], [ 544861.560681449947879, 7494285.647513809613883 ], [ 545262.211036029970273, 7494277.14960508979857 ], [ 545732.518375079962425, 7494223.65915559977293 ], [ 546208.961332999984734, 7494119.158106570132077 ], [ 546539.409910980029963, 7494060.158678470179439 ], [ 546939.900352380005643, 7494039.159448419697583 ], [ 547308.83934380998835, 7494049.681729639880359 ], [ 547812.008184600039385, 7494218.670278839766979 ], [ 548041.851294800057076, 7494395.67981312982738 ], [ 548794.838874500012025, 7494951.690788920037448 ], [ 549081.69803133001551, 7495096.689537179656327 ], [ 549476.347991509945132, 7495158.198621840216219 ], [ 549927.711291779996827, 7495130.199409529566765 ], [ 550366.470990129979327, 7495115.199292610399425 ], [ 550837.030713769956492, 7495112.720892540179193 ], [ 551372.390996049973182, 7495140.572720600292087 ], [ 552058.298123529995792, 7495176.229097790084779 ], [ 553121.107822670019232, 7495335.730401810258627 ], [ 553674.920575369964354, 7495440.742040479555726 ], [ 554222.481189709971659, 7495584.240095560438931 ], [ 554533.323906189994887, 7495685.344775210134685 ], [ 554951.794667689944617, 7495656.452342719770968 ], [ 555079.651138229994103, 7495856.180409490130842 ], [ 555169.568603049963713, 7496080.645912299863994 ], [ 555257.961555329966359, 7496120.253690180368721 ], [ 555072.269406519946642, 7496419.742752940393984 ], [ 555340.45946487004403, 7496653.75065691024065 ], [ 555500.588549330015667, 7496894.751310749910772 ], [ 555698.270653169951402, 7497002.250901469960809 ], [ 555934.658746590022929, 7497223.749905119650066 ], [ 556164.771667510038242, 7497476.759236839599907 ], [ 556452.029350040014833, 7497704.259780829772353 ], [ 557109.178366789943539, 7498140.251189099624753 ], [ 558058.292197149945423, 7498478.748251110315323 ], [ 558491.292051909957081, 7498590.749170909635723 ], [ 559000.808975919964723, 7498747.261756249703467 ], [ 560045.220694339950569, 7499053.240250290371478 ], [ 560573.88993088004645, 7499228.730333990417421 ], [ 561038.658889019978233, 7499334.229885820299387 ], [ 562216.039372049970552, 7499518.738557850010693 ], [ 562666.860106543055736, 7499551.859449970535934 ], [ 562666.860106543055736, 7498620.430423093959689 ], [ 562421.449098899960518, 7498588.759355739690363 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4678", "objectid": "4678", "lithstrtno": "2257", "code": "A-HAd-kd", "unitname": "Wittenoom Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Thinly bedded dolomite and dolomitic shale with minor black chert shale banded iron formation and sandstone", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary carbonate", "lithname1": "dolostone/dolomite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Wittenoom Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2597", "maxuncerty": "5", "min_age_ma": "2504", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.64498565796499996, "shape_area": 0.00161211133777 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7494692.319922047667205 ], [ 562430.00961092999205, 7494692.319664860144258 ], [ 562070.941096269991249, 7494625.308588610030711 ], [ 561128.430605069966987, 7494512.809020079672337 ], [ 560051.290330259944312, 7494400.798726679757237 ], [ 559647.420679530012421, 7494400.799023820087314 ], [ 559221.050658049993217, 7494378.290843970142305 ], [ 558772.240281710051931, 7494310.79051337018609 ], [ 557538.058653300045989, 7493817.278351039625704 ], [ 557246.288316729944199, 7493682.770033920183778 ], [ 556864.819337649969384, 7493525.279066280461848 ], [ 556371.181922900024801, 7493368.272165860049427 ], [ 555720.380931269959547, 7493233.758609309792519 ], [ 555136.930052940035239, 7493166.261243619956076 ], [ 554396.410372480051592, 7493121.748792300000787 ], [ 553925.148862999980338, 7493143.749152080155909 ], [ 553633.418506529997103, 7493143.748349349945784 ], [ 553296.870801819954067, 7493166.240730220451951 ], [ 552982.679487730027176, 7493143.749370129778981 ], [ 552780.738207599963062, 7493099.241545979864895 ], [ 552399.249670129967853, 7493143.741067410446703 ], [ 551636.307681920006871, 7493278.721003590151668 ], [ 551366.026483480003662, 7493247.456507329829037 ], [ 551052.80020133999642, 7493211.218328719958663 ], [ 550671.339240900008008, 7493121.721171219833195 ], [ 550534.541891410015523, 7493081.193029480054975 ], [ 550065.459032419952564, 7492942.20985712017864 ], [ 549683.977676769951358, 7492784.701064139604568 ], [ 549457.153067799983546, 7492715.703061419539154 ], [ 549167.862052430049516, 7492627.697604079730809 ], [ 549044.658509760047309, 7492599.751008120365441 ], [ 548674.150659580016509, 7492515.700941150076687 ], [ 548609.524892949964851, 7492518.292499619536102 ], [ 548113.150488939951174, 7492538.188606569543481 ], [ 547800.501640790025704, 7492572.869106560014188 ], [ 547379.936057189945132, 7492619.509876229800284 ], [ 547103.317789910011925, 7492650.180430520325899 ], [ 546676.941534420009702, 7492650.168377090245485 ], [ 546362.818985190009698, 7492582.670811150223017 ], [ 546048.651691599981859, 7492493.169389870017767 ], [ 545734.439228910021484, 7492380.660428210161626 ], [ 545353.032135299989022, 7492201.170327479951084 ], [ 544926.638237460050732, 7492066.669293380342424 ], [ 544724.722298449953087, 7491977.160089329816401 ], [ 544410.521071129944175, 7491797.668131220154464 ], [ 544278.199806150048971, 7491731.162152940407395 ], [ 544116.748927850043401, 7491902.661235259845853 ], [ 543916.811161260004155, 7491662.659460389986634 ], [ 543467.990977440029383, 7491303.657953480258584 ], [ 543288.521259670029394, 7491169.16250969003886 ], [ 543041.628388570039533, 7491034.648773539811373 ], [ 542929.420247980044223, 7490989.651189760304987 ], [ 542705.060030539985746, 7490877.161405250430107 ], [ 542547.951409470057115, 7490855.157926949672401 ], [ 542121.611326170037501, 7490675.150472099892795 ], [ 541942.050373179954477, 7490540.658418909646571 ], [ 541762.539372520055622, 7490428.650730979628861 ], [ 541605.511732809944078, 7490293.649401130154729 ], [ 541560.619127630023286, 7490159.161617719568312 ], [ 541538.098677800036967, 7490024.648979109711945 ], [ 541672.788809409947135, 7489598.16102849971503 ], [ 541740.130720659974031, 7489441.161330849863589 ], [ 541894.312351180007681, 7489210.159689630381763 ], [ 541734.628457920043729, 7489299.554097919724882 ], [ 541239.63983072002884, 7489576.641609819605947 ], [ 541044.12911024002824, 7489927.639171360060573 ], [ 540987.830442319973372, 7489984.639754460193217 ], [ 540994.19945211999584, 7490125.140481020323932 ], [ 541020.311512019950897, 7490265.149958720430732 ], [ 541071.860060309991241, 7490404.651328420266509 ], [ 541225.54120881005656, 7490626.651507309637964 ], [ 541378.810070079984143, 7490759.65119098033756 ], [ 541621.191303660045378, 7490904.649635610170662 ], [ 541850.509416379965842, 7490992.648644610308111 ], [ 542117.998944779974408, 7491067.649895650334656 ], [ 542391.501186319976114, 7491085.14929233957082 ], [ 542645.927855630056001, 7491090.149695370346308 ], [ 542881.80016316997353, 7491216.159379719756544 ], [ 543022.511018689954653, 7491374.657442820258439 ], [ 543093.419647180009633, 7491577.660029820166528 ], [ 543100.6207402900327, 7491755.660557329654694 ], [ 543146.001163249951787, 7491940.152454890310764 ], [ 543242.211323129944503, 7492092.649319870397449 ], [ 543420.559457879979163, 7492167.660537029616535 ], [ 543815.639348490047269, 7492181.652319019660354 ], [ 543948.009315419942141, 7492082.15929201990366 ], [ 544164.749375049956143, 7492195.661123299971223 ], [ 544311.508540580049157, 7492303.159224379807711 ], [ 544713.190917499945499, 7492510.65921042021364 ], [ 545414.140461780014448, 7492806.169576980173588 ], [ 545739.079724060022272, 7492931.657495119608939 ], [ 546146.630921929958276, 7493050.671805170364678 ], [ 546566.369162349961698, 7493067.16939007025212 ], [ 547017.769695810042322, 7493033.168757920153439 ], [ 547411.570846550050192, 7492935.181099180132151 ], [ 547824.27998191001825, 7492786.679622329771519 ], [ 548154.380444790003821, 7492676.690392710268497 ], [ 548555.108524280018173, 7492681.192445100285113 ], [ 548956.0910621000221, 7492755.198269600048661 ], [ 549427.352509089978412, 7492886.201835599727929 ], [ 549924.230084380018525, 7493068.211211860179901 ], [ 550383.109014970017597, 7493275.710593770258129 ], [ 550765.358819589950144, 7493413.720309609547257 ], [ 551089.650060679996386, 7493424.718791520223022 ], [ 551366.617026919964701, 7493423.055953639559448 ], [ 551420.399801210034639, 7493422.732412000186741 ], [ 552120.02944087004289, 7493450.728757919743657 ], [ 552634.977255600038916, 7493409.730852910317481 ], [ 552724.001571660046466, 7493409.24016897007823 ], [ 552895.541484309942462, 7493376.728750480338931 ], [ 553270.598975960048847, 7493355.742238880135119 ], [ 553582.358255979954265, 7493379.240251369774342 ], [ 553888.03141948999837, 7493460.250612050294876 ], [ 554250.857786769978702, 7493534.748806440271437 ], [ 554708.987234840053134, 7493583.250167059712112 ], [ 554988.728318589972332, 7493568.758602280169725 ], [ 555427.500493929954246, 7493560.259708169847727 ], [ 555822.108224330004305, 7493634.262409400194883 ], [ 556185.178019879967906, 7493759.771520050242543 ], [ 556452.998445700039156, 7493898.268556670285761 ], [ 556931.350873869960196, 7494207.778886949643493 ], [ 557243.719799650018103, 7494358.769946710206568 ], [ 557645.189484709990211, 7494528.279138370417058 ], [ 557957.259456550003961, 7494615.783141110092402 ], [ 558352.130415069987066, 7494747.279625999741256 ], [ 558785.421642940025777, 7494929.281944960355759 ], [ 559352.750818699947558, 7495212.791316449642181 ], [ 559741.432132430025376, 7495363.28972162026912 ], [ 560097.570766930002719, 7495361.79068183992058 ], [ 560402.570722269942053, 7495308.800442470237613 ], [ 561172.320291019976139, 7495368.299701560288668 ], [ 561529.069343350012787, 7495500.300697609782219 ], [ 562019.820314730051905, 7495720.302675129845738 ], [ 562491.400376350036822, 7495921.300782550126314 ], [ 562666.860106543055736, 7495992.320895091630518 ], [ 562666.860106543055736, 7494692.319922047667205 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16189", "objectid": "16191", "lithstrtno": "4468", "code": "A-b-PRK", "unitname": "Rocklea Inlier greenstones", "gswastatus": "Informal", "rank": "Group", "descriptn": "Basaltic and andesitic flows and associated volcaniclastic rocks; metamorphosed", "parentcode": "TOL", "parentname": "_Top Of Litho-Stratigraphic Order", "rocktype1": "igneous mafic volcanic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": null, "group_": "Rocklea Inlier greenstones", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": "Pilbara Craton", "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": null, "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": "Pilbara Craton Rocklea Inlier", "events": "Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoarchean", "ageto": "Paleoarchean", "max_age_ma": "3530", "maxuncerty": null, "min_age_ma": "3225", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.20168328405, "shape_area": 0.000883001818524 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 539598.278405910008587, 7477765.570249490439892 ], [ 540221.411660689976998, 7477554.089975790120661 ], [ 540373.950899419956841, 7477483.589004130102694 ], [ 540475.649919499992393, 7477406.589215509593487 ], [ 540742.250839410000481, 7477011.579309450462461 ], [ 540971.020666989963502, 7476877.079898719675839 ], [ 541098.258586799958721, 7476864.090209979563951 ], [ 541244.510280070011504, 7476832.08961298968643 ], [ 541320.760819380055182, 7476749.099189889617264 ], [ 541371.310222759959288, 7476539.089240180328488 ], [ 541358.460613009985536, 7476431.070752290077507 ], [ 541224.689490749966353, 7476335.559219219721854 ], [ 540855.758395900018513, 7476343.073021410033107 ], [ 540416.950512130046263, 7476414.050173169933259 ], [ 539971.739809270016849, 7476466.041327700018883 ], [ 539628.200490779941902, 7476422.509449950419366 ], [ 539354.439745009993203, 7476289.51938187982887 ], [ 539061.571961560053751, 7476092.990216890349984 ], [ 538902.360836809966713, 7475953.480250170454383 ], [ 538685.870556570007466, 7475788.449010640382767 ], [ 538418.540455979993567, 7475706.450883599929512 ], [ 538145.050474349991418, 7475719.950655439868569 ], [ 537960.668860669946298, 7475758.440805559977889 ], [ 537846.038772220024839, 7475701.440673939883709 ], [ 537756.860391980037093, 7475593.430352349765599 ], [ 537718.481844619964249, 7475459.920584879815578 ], [ 537590.931406370014884, 7475224.89968893956393 ], [ 537437.907544029993005, 7474983.378747959621251 ], [ 537265.918872429989278, 7474786.870019759982824 ], [ 537074.909987590042874, 7474666.369350180029869 ], [ 536896.727803039946593, 7474653.860180609859526 ], [ 536731.528520839987323, 7474756.358776929788291 ], [ 536610.959037579945289, 7474972.858817160129547 ], [ 536585.899888799991459, 7475227.370493769645691 ], [ 536630.968454889953136, 7475609.3925636196509 ], [ 536625.313863039948046, 7476092.907453309744596 ], [ 536530.161248450051062, 7476315.910808119922876 ], [ 536428.58983392000664, 7476462.408203760161996 ], [ 536346.148593020043336, 7476640.91941266041249 ], [ 536333.737370750051923, 7476869.918774610385299 ], [ 536442.228769190027378, 7477079.928681880235672 ], [ 536728.740673499996774, 7477282.939162010326982 ], [ 537110.540420160046779, 7477389.972849680110812 ], [ 537492.291658040019684, 7477446.489446770399809 ], [ 537842.241106539964676, 7477508.990524750202894 ], [ 538204.880423530004919, 7477514.510608370415866 ], [ 538503.750118679949082, 7477475.521246880292892 ], [ 538745.520277449977584, 7477462.028324750252068 ], [ 538866.519821880036034, 7477563.541013290174305 ], [ 538822.509455760009587, 7477964.55079491995275 ], [ 538511.117701629991643, 7478182.040280549786985 ], [ 538135.950043509947136, 7478240.038715160451829 ], [ 537576.419097010046244, 7478477.022458010353148 ], [ 537188.561031299992464, 7478548.010379119776189 ], [ 536914.96944060001988, 7478535.999609249643981 ], [ 536520.470750760054216, 7478441.481110479682684 ], [ 536208.67089120997116, 7478353.469969959929585 ], [ 535973.359353450010531, 7478417.470643930137157 ], [ 535865.45077879994642, 7478563.971989460289478 ], [ 535852.94961626001168, 7478761.467817880213261 ], [ 535967.838253290043212, 7479002.981765929609537 ], [ 536184.381576010026038, 7479244.500811309553683 ], [ 536413.601945389993489, 7479358.501508070155978 ], [ 536687.148999179946259, 7479376.511235799640417 ], [ 537354.912620489951223, 7479273.029996830038726 ], [ 537615.490931609994732, 7479126.029186660423875 ], [ 538028.760317889973521, 7478915.060221480205655 ], [ 538346.578703250037506, 7478761.558315370231867 ], [ 538613.512336850049905, 7478595.068732789717615 ], [ 539045.630967270000838, 7478282.568591229617596 ], [ 539166.268936129985377, 7478154.568510370329022 ], [ 539312.390287859947421, 7477982.568873159587383 ], [ 539598.278405910008587, 7477765.570249490439892 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14340", "objectid": "14341", "lithstrtno": "4113", "code": "P_-HAb-cib", "unitname": "Brockman Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Banded iron-formation chert mudstone and siltstone; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Brockman Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2494", "maxuncerty": null, "min_age_ma": "2451", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 5.3081562065399996, "shape_area": 0.057166266027 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 547817.521218489971943, 7517927.658131849952042 ], [ 547778.850409999955446, 7517819.650623749941587 ], [ 547740.041384069947526, 7517679.64995289966464 ], [ 547777.708135260036215, 7517584.151709419675171 ], [ 547904.221216939971782, 7517443.151080770418048 ], [ 548113.498294639983214, 7517321.138408009894192 ], [ 548233.58887604996562, 7517167.641332849860191 ], [ 548226.580347919953056, 7517034.140241320244968 ], [ 548149.559577399981208, 7516888.138962370343506 ], [ 548117.548875179956667, 7516850.140485050156713 ], [ 547875.430357409990393, 7516749.648120380006731 ], [ 547595.460421300027519, 7516706.64884824026376 ], [ 547346.939772429992445, 7516606.149222410283983 ], [ 547104.427803089958616, 7516423.159972 ], [ 546785.549659520038404, 7516240.150772740133107 ], [ 546479.040056189987808, 7515980.647956600412726 ], [ 546357.157507620053366, 7515752.148936149664223 ], [ 546311.360664939973503, 7515485.160285499878228 ], [ 546176.478632229962386, 7515206.160606130026281 ], [ 546023.718619870021939, 7515187.658571889624 ], [ 545769.668800889980048, 7515246.159009889699519 ], [ 545521.6189673099434, 7515241.149009400047362 ], [ 545260.532290859962814, 7515172.657789319753647 ], [ 544514.33162234001793, 7514718.658802700228989 ], [ 544226.390946530038491, 7514363.67160225007683 ], [ 544059.151025839964859, 7513963.659865760244429 ], [ 544019.521404400002211, 7513652.158787080086768 ], [ 544043.070209590019658, 7513263.661248640157282 ], [ 544110.92760646995157, 7512830.148890050128102 ], [ 544083.619118619943038, 7512436.151478759944439 ], [ 543999.971377330017276, 7512226.148398630321026 ], [ 543662.490462539950386, 7512139.149124950170517 ], [ 543333.622250700020231, 7512333.149206009693444 ], [ 542771.040110750007443, 7512583.159594760276377 ], [ 542052.241269630030729, 7512989.160135299898684 ], [ 541802.24961754004471, 7513020.67063379008323 ], [ 541708.510433039977215, 7512864.170864880084991 ], [ 541927.239561259979382, 7512614.179933479987085 ], [ 542270.978754749987274, 7512270.668791599571705 ], [ 542677.290337580023333, 7511770.661792299710214 ], [ 542677.702807420049794, 7511769.217952099628747 ], [ 542802.268583850003779, 7511333.159598980098963 ], [ 542927.261376110021956, 7510676.660736439749599 ], [ 542927.2699991799891, 7509989.150851080194116 ], [ 542864.719560010009445, 7509239.16115100029856 ], [ 542677.241687429952435, 7509082.66245721001178 ], [ 542458.470874110003933, 7508957.660044039599597 ], [ 542239.658127030008473, 7508645.160752990283072 ], [ 542145.908449199981987, 7508332.659268240444362 ], [ 542208.389240680029616, 7507707.658948659896851 ], [ 542083.358566339942627, 7507145.159036980010569 ], [ 541895.868716700002551, 7506645.16197604034096 ], [ 541614.601450589951128, 7506144.651670889928937 ], [ 541145.760131699964404, 7505676.148550059646368 ], [ 540770.792363699991256, 7505332.151711080223322 ], [ 540145.700841389945708, 7504988.647760559804738 ], [ 539676.888922760030255, 7504613.650578799657524 ], [ 539051.811228069942445, 7504394.649407530203462 ], [ 538364.259979589958675, 7504113.660114450380206 ], [ 537895.510879740002565, 7503957.148059849627316 ], [ 536989.179971029981971, 7504051.152139419689775 ], [ 536676.589791630045511, 7504113.647556249983609 ], [ 536270.368330019991845, 7504082.142233549617231 ], [ 535926.551618380006403, 7503894.651935909874737 ], [ 535676.530275200027972, 7503519.638427189551294 ], [ 535551.54326118004974, 7503144.641235849820077 ], [ 535239.000016969977878, 7502707.138429320417345 ], [ 534926.429906480014324, 7502457.130986009724438 ], [ 534488.93889664998278, 7502207.120117579586804 ], [ 533613.830401089973748, 7502019.621294899843633 ], [ 533020.02924736996647, 7501925.602211659774184 ], [ 532551.200599230010994, 7501832.098164609633386 ], [ 532401.508138290024363, 7501876.600775930099189 ], [ 532130.460120560019277, 7502165.598587240092456 ], [ 531832.36921708995942, 7502050.601514429785311 ], [ 530707.279987629968673, 7501832.090665870346129 ], [ 529800.969874809961766, 7501832.06981464009732 ], [ 529113.411460499977693, 7501800.570461129769683 ], [ 528644.579739370034076, 7501769.560601740144193 ], [ 528269.54911084997002, 7501675.549466320313513 ], [ 527895.380413289996795, 7501600.550623670220375 ], [ 528055.80054874997586, 7501423.059336570091546 ], [ 528302.37962347001303, 7501116.061090369708836 ], [ 528009.380023929988965, 7501104.558906380087137 ], [ 526591.381750919972546, 7501049.041682800278068 ], [ 525518.201257530017756, 7500983.103860430419445 ], [ 524403.068835210055113, 7500914.508251939900219 ], [ 523814.809190919972025, 7500861.501062080264091 ], [ 523576.890120199997909, 7501033.501141640357673 ], [ 523090.591946310014464, 7501408.48978086002171 ], [ 522373.881059199979063, 7501209.489694490097463 ], [ 521543.439776370010804, 7501077.536889360286295 ], [ 520473.579158, 7500907.472074420191348 ], [ 519976.910060780006461, 7500799.467891490086913 ], [ 519631.441732620005496, 7500691.461144080385566 ], [ 519372.288886139984243, 7500431.949672809801996 ], [ 519069.999476659984794, 7500108.460693730041385 ], [ 518839.308721749985125, 7499930.939910479821265 ], [ 518912.270378570014145, 7499695.460613200441003 ], [ 518636.630131700017955, 7499603.948979339562356 ], [ 518293.999550679989625, 7499579.442325529642403 ], [ 517682.119090339983813, 7499358.941561980172992 ], [ 516752.109791999973822, 7498820.421163430437446 ], [ 516399.80081337998854, 7498690.920674299821258 ], [ 516132.401962460018694, 7498877.912625970318913 ], [ 516084.351389759976882, 7498918.921142539940774 ], [ 515937.860309560026508, 7499043.41833767015487 ], [ 515699.650689409987535, 7498844.919029789976776 ], [ 515687.31005864002509, 7498836.682474304921925 ], [ 515687.31005864002509, 7500678.361180524341762 ], [ 516189.159643939987291, 7500778.418782180175185 ], [ 516703.129406480002217, 7500900.92979499977082 ], [ 517168.148241000017151, 7500949.939010259695351 ], [ 517608.669631719996687, 7501023.44241841044277 ], [ 517828.959920339984819, 7501072.440090700052679 ], [ 517978.502588119998109, 7501117.440985379740596 ], [ 517873.439548989990726, 7501235.941138340160251 ], [ 518389.210392989974935, 7501379.9494513804093 ], [ 519121.281781309982762, 7501534.949975430034101 ], [ 519636.90140195999993, 7501633.958211430348456 ], [ 520343.178845660004299, 7501712.978961739689112 ], [ 520737.772135290026199, 7501723.97868109960109 ], [ 521104.139196379983332, 7501751.480945750139654 ], [ 522422.251586830010638, 7501924.491564869880676 ], [ 522521.981803109985776, 7501847.499487180262804 ], [ 523447.779692990006879, 7502091.009804819710553 ], [ 524294.111731779994443, 7502249.520968340337276 ], [ 525246.218477030051872, 7502408.520923149771988 ], [ 526700.850970900035463, 7502355.539378190413117 ], [ 527190.810228800051846, 7502380.041910080239177 ], [ 527002.751236020005308, 7502588.051300699822605 ], [ 527233.139290379942395, 7502607.06084899045527 ], [ 527759.809933159966022, 7502688.05957665015012 ], [ 528266.309425930026919, 7502728.569669179618359 ], [ 529076.73118856002111, 7502911.078795489855111 ], [ 529603.48162614996545, 7503154.079038679599762 ], [ 530292.318035469972529, 7503316.099201279692352 ], [ 530852.970184960053302, 7503491.101557740010321 ], [ 531092.210039410041645, 7503242.110120669938624 ], [ 531329.338967559975572, 7503360.611643849872053 ], [ 531858.340914499945939, 7503651.619851970113814 ], [ 532466.618771139997989, 7503969.120871730148792 ], [ 533233.651434050058015, 7504312.631727330386639 ], [ 533603.881771669955924, 7504709.627261539921165 ], [ 534027.099943720037118, 7504974.140041249804199 ], [ 534635.430171989952214, 7505317.651213020086288 ], [ 535217.291988059994765, 7505503.150627369992435 ], [ 536169.390165189979598, 7505661.661419860087335 ], [ 537068.65092739998363, 7505741.16039321012795 ], [ 538205.909480990027077, 7505952.669931390322745 ], [ 539052.200798930018209, 7506296.660687520168722 ], [ 539607.670671500032768, 7506746.159959820099175 ], [ 539925.049874530057423, 7507090.157736930064857 ], [ 540348.211415769997984, 7507671.659639820456505 ], [ 540665.58149836002849, 7508571.170081409625709 ], [ 540612.738463919959031, 7509073.658652099780738 ], [ 540480.470579440006986, 7509232.170064670033753 ], [ 540295.36945720994845, 7509391.167218109592795 ], [ 540057.371062460006215, 7509681.668901289813221 ], [ 539898.727658509975299, 7510184.68239211011678 ], [ 539660.669795469962992, 7510607.68016923032701 ], [ 539422.657859849976376, 7510951.691127830184996 ], [ 539052.388189609977417, 7511268.680436610244215 ], [ 538523.479636730044149, 7511559.700316119939089 ], [ 537981.213230650057085, 7511781.517565599642694 ], [ 537941.651521719992161, 7511797.699529309757054 ], [ 537492.028700380004011, 7511930.201284980401397 ], [ 536513.520092790015042, 7512168.211254799738526 ], [ 535296.879862120025791, 7512379.720972119830549 ], [ 534344.770069499965757, 7512432.717863479629159 ], [ 533789.409573909942992, 7512353.23117852024734 ], [ 533551.350649280007929, 7512221.220540439710021 ], [ 533233.978675110032782, 7511983.23097356967628 ], [ 532705.021947950008325, 7511824.22030740045011 ], [ 532641.346885110018775, 7511793.761994309723377 ], [ 532096.70017128996551, 7511533.220152160152793 ], [ 531118.128920490038581, 7511295.218129090033472 ], [ 530324.61938511999324, 7511057.199628870002925 ], [ 529451.790100479964167, 7510766.1697186101228 ], [ 528658.280241169966757, 7510422.639340680092573 ], [ 527864.742193619953468, 7510184.620799530297518 ], [ 527124.119997350033373, 7509920.100146099925041 ], [ 526119.051335679949261, 7509602.579176349565387 ], [ 525140.43911667005159, 7509496.570468929596245 ], [ 524456.689746230025776, 7509487.559559389948845 ], [ 524151.169281380018219, 7509438.051605530083179 ], [ 522591.621478160028346, 7509122.02742169983685 ], [ 522451.571022430027369, 7509097.030138160102069 ], [ 522324.340485139982775, 7509085.020956199616194 ], [ 522005.951244029973168, 7508998.029494729824364 ], [ 521090.551235229999293, 7509073.010523959994316 ], [ 520052.928003809996881, 7508862.000883810222149 ], [ 519619.891624330019113, 7508736.979432850144804 ], [ 519206.109573089983314, 7508643.988675179891288 ], [ 518760.529426419991069, 7508556.979971840046346 ], [ 518142.959838100010529, 7508401.480365029536188 ], [ 517735.199112029979005, 7508250.968857959844172 ], [ 516913.610774539993145, 7507994.460242169909179 ], [ 516143.467740970023442, 7507858.440086290240288 ], [ 515687.31005864002509, 7507785.320344283245504 ], [ 515687.31005864002509, 7508702.941175408661366 ], [ 516068.361104719981086, 7508702.950624800287187 ], [ 516500.239082209998742, 7508810.949452149681747 ], [ 516932.129444469988812, 7508983.448731999844313 ], [ 517364.010314400016796, 7509199.458663940429688 ], [ 518067.749226149986498, 7509452.469257179647684 ], [ 518912.777727360022254, 7509330.469264090061188 ], [ 519307.440221610013396, 7509273.489978609606624 ], [ 519868.870076789986342, 7509350.490000429563224 ], [ 520005.170785209978931, 7509373.567330420017242 ], [ 520906.006727360014338, 7509526.057665060274303 ], [ 521402.089786909986287, 7509610.008999690413475 ], [ 521858.9592969599762, 7509706.585036410018802 ], [ 522935.251059490023181, 7509934.04007126018405 ], [ 523323.940627629985102, 7510193.041663180105388 ], [ 523647.860599100007676, 7510430.539885059930384 ], [ 523991.429057269997429, 7510603.559072679840028 ], [ 524162.859050359984394, 7510539.051478800363839 ], [ 524175.581662399985362, 7510552.060833330266178 ], [ 524296.708865039981902, 7510608.561523400247097 ], [ 524449.939836779958569, 7510735.050195139832795 ], [ 524628.93126082001254, 7510931.06005815975368 ], [ 524788.12910954002291, 7510968.56984443962574 ], [ 524991.771459970041178, 7510993.080950760282576 ], [ 525201.961775040021166, 7511074.579809789545834 ], [ 525355.470764999976382, 7511252.092282770201564 ], [ 525541.539301850018091, 7511594.592479820363224 ], [ 525715.241239189985208, 7511806.885280930437148 ], [ 525733.400640110019594, 7511829.078617500141263 ], [ 526007.827766750007868, 7512012.100629179738462 ], [ 526364.729590249946341, 7512169.600267699919641 ], [ 526765.851011640042998, 7512269.119919019751251 ], [ 527179.358417070005089, 7512292.118612400256097 ], [ 527573.720331709948368, 7512290.140388590283692 ], [ 528019.00225657003466, 7512313.15074963029474 ], [ 528381.821448970003985, 7512374.648699250072241 ], [ 528725.79111038998235, 7512474.67035620007664 ], [ 529082.381066789967008, 7512568.190159110352397 ], [ 529541.3494360599434, 7512788.690159239806235 ], [ 529892.520336349960417, 7513079.698101550340652 ], [ 530097.659862149972469, 7513415.708956269547343 ], [ 530130.411366789950989, 7513612.709768359549344 ], [ 530099.42050291004125, 7513784.71054114960134 ], [ 529979.421387149952352, 7513951.220812080428004 ], [ 529795.92030961997807, 7514143.20673255994916 ], [ 529701.409157510031946, 7514334.18831204995513 ], [ 529689.571899089962244, 7514437.698042769916356 ], [ 529694.629846600000747, 7514468.700406789779663 ], [ 529707.720653429976664, 7514496.70929556991905 ], [ 529740.341517299995758, 7514528.711873450316489 ], [ 529819.729662840021774, 7514562.701285749673843 ], [ 530148.117918489966542, 7514620.220253130421042 ], [ 530218.74973763001617, 7514643.220442649908364 ], [ 530423.070899500045925, 7514734.219831620343029 ], [ 530503.900893770041876, 7514762.228310209698975 ], [ 530647.470723689999431, 7514789.7284668199718 ], [ 530791.370318740024231, 7514798.746725520119071 ], [ 530826.129318200051785, 7514807.238458000123501 ], [ 530852.188056100043468, 7514823.740399150177836 ], [ 530865.880872169975191, 7514850.738035580143332 ], [ 530867.692459349986166, 7514885.237596809864044 ], [ 530860.79761279001832, 7514922.239439809694886 ], [ 530830.258743879967369, 7514986.238437609747052 ], [ 530748.808856319985352, 7515076.739342969842255 ], [ 530533.909162009949796, 7515253.239404910244048 ], [ 530493.648228749982081, 7515311.231420080177486 ], [ 530485.088802239974029, 7515344.741084960289299 ], [ 530488.418434530030936, 7515419.230454670265317 ], [ 530504.158913849969395, 7515475.23132895026356 ], [ 530527.559888079995289, 7515526.730163279920816 ], [ 530636.218579089967534, 7515653.23923297971487 ], [ 530720.108391609974205, 7515894.75172952003777 ], [ 530702.417887600022368, 7516200.239313459955156 ], [ 530564.126742949942127, 7516525.728350619785488 ], [ 530476.311610009986907, 7516787.22830564994365 ], [ 530490.178360010031611, 7517022.228644349612296 ], [ 530656.489814030006528, 7517225.23943976033479 ], [ 530968.829944240045734, 7517376.250337759964168 ], [ 531210.670135739957914, 7517406.761843520216644 ], [ 531515.108686399995349, 7517239.752154059708118 ], [ 531693.101855669985525, 7517225.759357900358737 ], [ 531769.671595370047726, 7517282.750366459600627 ], [ 531796.090702429995872, 7517486.249421309679747 ], [ 531758.64920034003444, 7517632.750212909653783 ], [ 532179.960140989976935, 7517967.761602830141783 ], [ 532549.079240350052714, 7518029.75042087957263 ], [ 533038.981324749998748, 7518065.251714630052447 ], [ 533713.010928750038147, 7518061.748432110063732 ], [ 534393.389142140047625, 7518045.250069919973612 ], [ 535379.197512720013037, 7518065.239417679607868 ], [ 536415.309916740050539, 7517970.239478410221636 ], [ 536885.82106514996849, 7517948.739742060191929 ], [ 537267.679878070019186, 7518016.729045360349119 ], [ 537485.079137690016069, 7518257.230500830337405 ], [ 537504.891110530006699, 7518403.739562990143895 ], [ 537588.630172290024348, 7518625.729829389601946 ], [ 537913.880765930050984, 7518821.720027790404856 ], [ 538251.419350809999742, 7518934.229637529700994 ], [ 538569.997983230045065, 7519059.732398999854922 ], [ 538907.860808350029401, 7519223.218876370228827 ], [ 539175.801647959975526, 7519406.719772949814796 ], [ 539322.797352000023238, 7519564.718835569918156 ], [ 539374.321725239977241, 7519691.720033509656787 ], [ 539413.251687229960226, 7519863.731583850458264 ], [ 539426.668668980011716, 7519997.231947139836848 ], [ 539427.008212720043957, 7520072.729762 ], [ 539614.67884160997346, 7520396.718216490000486 ], [ 539833.450501719955355, 7520552.719107920303941 ], [ 540302.252228950033896, 7520771.719968450255692 ], [ 540677.271513910032809, 7520865.219127329997718 ], [ 541052.321444040047936, 7520834.207481199875474 ], [ 541521.067888260004111, 7520552.710816349834204 ], [ 541896.109705229988322, 7520302.71127125993371 ], [ 542521.160122800036334, 7520084.202810940332711 ], [ 543021.179025089950301, 7520021.20073467027396 ], [ 543583.748000220046379, 7519990.189772630110383 ], [ 544083.791262720013037, 7519740.191862120293081 ], [ 544646.311593209975399, 7519490.192598029971123 ], [ 545052.591250750003383, 7519396.201453859917819 ], [ 545771.421882549999282, 7519333.67895373981446 ], [ 546333.978435499942861, 7519208.680190100334585 ], [ 546740.211962820030749, 7519052.669073389843106 ], [ 547115.298340609995648, 7518833.660968529991806 ], [ 547459.039317650021985, 7518552.670614539645612 ], [ 547805.601275980006903, 7518086.660438559949398 ], [ 547817.848904539947398, 7517997.657741430215538 ], [ 547817.521218489971943, 7517927.658131849952042 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.5822", "objectid": "5822", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.262641295838, "shape_area": 0.00058416833791699997 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 550240.370830929954536, 7509051.65035855025053 ], [ 550052.798911349964328, 7508832.651493079960346 ], [ 549896.550455349963158, 7508895.15027519967407 ], [ 549896.549101150012575, 7509364.150753700174391 ], [ 550209.048160879989155, 7509926.638127829879522 ], [ 550490.398612090037204, 7510332.630386269651353 ], [ 550990.47109497000929, 7510958.141390670090914 ], [ 551426.945709530031309, 7511423.715034839697182 ], [ 551459.209571829997003, 7511458.12822884041816 ], [ 551865.528648840030655, 7511801.630576659925282 ], [ 552396.779262859956361, 7512114.119234059937298 ], [ 552740.619233850040473, 7512270.632029250264168 ], [ 553209.36836562003009, 7512520.631152370013297 ], [ 553924.989553560037166, 7512931.139786940068007 ], [ 554070.888887600041926, 7513056.1293233204633 ], [ 554224.009517809958197, 7513157.14075134973973 ], [ 554370.692080090055242, 7513239.130039299838245 ], [ 554612.761223490000702, 7513339.63861539028585 ], [ 555211.510252650012262, 7513533.640483819879591 ], [ 555568.271343840053305, 7513672.151614439673722 ], [ 555861.708545739995316, 7513861.149782869964838 ], [ 556168.720058580045588, 7514216.149762759916484 ], [ 556329.411386069958098, 7514578.14968691021204 ], [ 556395.041666649980471, 7515004.150383680127561 ], [ 556354.478421580046415, 7515825.140343310311437 ], [ 556375.269657119992189, 7516181.652402970008552 ], [ 556409.019834719947539, 7516588.638416309840977 ], [ 556467.830703489948064, 7516919.140610580332577 ], [ 556545.5604096299503, 7517218.148839759640396 ], [ 556772.271008339943364, 7517865.161165599711239 ], [ 556897.251721439999528, 7518396.199569020420313 ], [ 556834.771384830004536, 7518802.719413139857352 ], [ 556772.278894940041937, 7519146.218413719907403 ], [ 557022.249313559965231, 7519271.240688440389931 ], [ 557209.760103469947353, 7519052.739931610412896 ], [ 557303.570084349950776, 7518646.232337079942226 ], [ 557334.819321669987403, 7518302.708508649840951 ], [ 557334.830827519996092, 7517865.197480149567127 ], [ 557252.092862259945832, 7517341.659371820278466 ], [ 557193.838800059980713, 7517125.668676010333002 ], [ 557147.897687020013109, 7516833.162529920227826 ], [ 557050.729050599969923, 7516470.669594380073249 ], [ 556786.110028609982692, 7515657.651135619729757 ], [ 556783.890439269947819, 7515205.648697529919446 ], [ 556800.971243790001608, 7514772.646481709554791 ], [ 556805.361583970021456, 7514365.149901020340621 ], [ 556714.540975130046718, 7513990.148112979717553 ], [ 556509.700201389961876, 7513717.650047839619219 ], [ 555884.449980839970522, 7513301.148592280223966 ], [ 555546.509203040041029, 7513112.150644919835031 ], [ 554705.497970039956272, 7512779.141034910455346 ], [ 554419.131219440023415, 7512736.141921159811318 ], [ 553771.92165458004456, 7512364.128684209659696 ], [ 553084.359125780058093, 7512083.121290050446987 ], [ 552490.528776980005205, 7511676.631063279695809 ], [ 552053.031475730007514, 7511270.629288829863071 ], [ 551521.729125880054198, 7510832.627482789568603 ], [ 551424.608781549963169, 7510724.136291139759123 ], [ 550990.458773490041494, 7510239.13016343023628 ], [ 550646.628642339957878, 7509707.641543529927731 ], [ 550240.370830929954536, 7509051.65035855025053 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4676", "objectid": "4676", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.36587919511799999, "shape_area": 0.0010264174193700001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 554834.608359670033678, 7521271.771419700235128 ], [ 554490.839493039995432, 7521115.259799200110137 ], [ 553990.800218899967149, 7520927.738220330327749 ], [ 553678.270213259966113, 7520896.729390090331435 ], [ 553303.249616930028424, 7520834.22156201954931 ], [ 553146.990613440051675, 7520646.717184250243008 ], [ 553115.749627399956807, 7520427.709148810245097 ], [ 553271.979911400005221, 7520177.701487329788506 ], [ 553990.791554949944839, 7519927.697815929539502 ], [ 554584.581370970001444, 7519677.698691800236702 ], [ 554834.590492289979011, 7519521.198743339627981 ], [ 554959.590303609962575, 7519302.710580710321665 ], [ 554990.890518759959377, 7518802.678673019632697 ], [ 554897.088812969974242, 7518396.171608179807663 ], [ 554824.139225039980374, 7517622.140910509973764 ], [ 554860.818122409982607, 7517322.630331659689546 ], [ 554890.961307900026441, 7516972.630977650173008 ], [ 554933.830054279998876, 7516622.139660909771919 ], [ 554951.438217940041795, 7516316.639842939563096 ], [ 554930.360569710028358, 7515909.641129069961607 ], [ 554814.480289179948159, 7515610.641654879786074 ], [ 554539.221081939991564, 7515236.639436399564147 ], [ 554181.489136890042573, 7514895.140189480036497 ], [ 553824.052093980018981, 7514629.628393420018256 ], [ 553383.760596489999443, 7514320.130556900054216 ], [ 552937.390739509952255, 7514068.127719609998167 ], [ 552484.819579840055667, 7513847.627401660196483 ], [ 552064.388414149987511, 7513691.120811220258474 ], [ 551567.762133099953644, 7513579.118968450464308 ], [ 550950.400427169981413, 7513461.621362959966063 ], [ 550173.499784040031955, 7513255.62858837004751 ], [ 549772.058370289974846, 7513079.628066340461373 ], [ 549472.106614929973148, 7512864.628942149691284 ], [ 549266.988626049947925, 7512528.631090340204537 ], [ 549017.801531590055674, 7512281.621161259710789 ], [ 548736.970398409990594, 7512073.130470720119774 ], [ 548481.851744340034202, 7511915.631002140231431 ], [ 548201.349203830002807, 7511770.629450149834156 ], [ 548178.131280350033194, 7511752.991772890090942 ], [ 548009.819583300035447, 7511625.129985979758203 ], [ 547932.950905930018052, 7511504.638110539875925 ], [ 547901.03905262995977, 7511473.128256909549236 ], [ 547817.780032480019145, 7511359.139636830426753 ], [ 547988.058195890043862, 7511059.142060450278223 ], [ 547885.330302570015192, 7510849.639051630161703 ], [ 547833.519514949992299, 7510658.638555710203946 ], [ 547768.500521330046467, 7510360.139111110009253 ], [ 547274.148572140024044, 7510712.640855640172958 ], [ 547275.26059381000232, 7510942.138586919754744 ], [ 547302.46016450994648, 7511311.131156819872558 ], [ 547367.169919079984538, 7511546.138635899871588 ], [ 547514.270673359977081, 7511723.630796080455184 ], [ 547554.751736809965223, 7511754.929449140094221 ], [ 547661.070914759999141, 7511837.131026280112565 ], [ 547731.88949681003578, 7512021.631898799911141 ], [ 547681.898447870044038, 7512200.139545659534633 ], [ 547753.10020510002505, 7512460.640449609607458 ], [ 548417.859357360051945, 7513163.629739440046251 ], [ 548749.55001840996556, 7513371.639964249916375 ], [ 549189.058551419992, 7513509.130647470243275 ], [ 549959.821321579976939, 7513778.61910889018327 ], [ 550405.600844520027749, 7513903.620661280117929 ], [ 550876.81927535997238, 7514047.619703330099583 ], [ 551850.951339580002241, 7514271.12161788996309 ], [ 552678.158572930027731, 7514375.1200912296772 ], [ 553086.078856399981305, 7514570.130195720121264 ], [ 553373.090318550006486, 7514746.630016029812396 ], [ 553666.789511539973319, 7514980.630683939903975 ], [ 553941.429692870005965, 7515227.128613879904151 ], [ 554216.440275560016744, 7515556.630309550091624 ], [ 554351.370617939974181, 7515849.13784018997103 ], [ 554416.439543080050498, 7516160.63928656000644 ], [ 554430.201462110038847, 7516376.629046970047057 ], [ 554424.389186830027029, 7516485.129010479897261 ], [ 554361.582325270050205, 7516644.639263659715652 ], [ 554146.8203180199489, 7516963.6315305698663 ], [ 554084.540130940033123, 7517646.14075743034482 ], [ 554147.039345999946818, 7518208.660051150247455 ], [ 554178.288729339954443, 7518615.172259110026062 ], [ 554115.767966849962249, 7519021.17945207003504 ], [ 553973.858579299994744, 7519345.189898329786956 ], [ 553954.89849138003774, 7519377.190948570147157 ], [ 553929.609886429971084, 7519402.689942100085318 ], [ 553859.851088849944063, 7519447.699348329566419 ], [ 553726.599248389946297, 7519512.192376250401139 ], [ 553472.680246960022487, 7519589.680336230434477 ], [ 553218.462379090022296, 7519635.689800689928234 ], [ 552780.148187250015326, 7519746.191867049783468 ], [ 552418.043980209971778, 7519812.178346159867942 ], [ 551986.31099800998345, 7519954.178711500018835 ], [ 551675.789430149947293, 7520185.169340649619699 ], [ 551543.308704870054498, 7520421.180343049578369 ], [ 551564.362152160028927, 7520822.190301760099828 ], [ 551660.441966620041057, 7520968.189111479558051 ], [ 551941.050715549965389, 7521138.201802129857242 ], [ 552265.698866680031642, 7521193.72009817045182 ], [ 552558.240206790040247, 7521211.220943139865994 ], [ 552958.848691480001435, 7521209.229686919599771 ], [ 553276.988916730042547, 7521233.240604850463569 ], [ 553502.942819576244801, 7521273.574077860452235 ], [ 554839.565807851380669, 7521273.574077860452235 ], [ 554834.608359670033678, 7521271.771419700235128 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16191", "objectid": "16193", "lithstrtno": "4463", "code": "A-mgn-PRK", "unitname": "Rocklea Inlier metagranitic unit", "gswastatus": "Informal", "rank": "Suite", "descriptn": "Foliated gneissic or migmatitic metagranitic rock", "parentcode": "A-mg-PRK", "parentname": "Rocklea Inlier metagranitic unit", "rocktype1": "meta-igneous felsic intrusive", "lithname1": "granitic gneiss", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": null, "group_": "Rocklea Inlier metagranitic unit", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": "Pilbara Craton", "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": null, "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": "Pilbara Craton Rocklea Inlier", "events": "Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoarchean", "ageto": "Paleoarchean", "max_age_ma": "3225", "maxuncerty": "2", "min_age_ma": "3221", "minuncerty": "6", "max_age_da": "Isotopic", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.96974965471600005, "shape_area": 0.017519315743900001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 524538.249417810002342, 7479935.452063700184226 ], [ 524662.731309870025143, 7480154.449138020165265 ], [ 525046.501200460013933, 7480304.959696309641004 ], [ 525590.138856749981642, 7480549.457734939642251 ], [ 526736.961849370039999, 7480922.959662619978189 ], [ 529856.887474340037443, 7481720.479547889903188 ], [ 529827.910515989991836, 7480963.489905229769647 ], [ 531488.108066829969175, 7481043.489093760028481 ], [ 533085.269960989942774, 7481251.001002860255539 ], [ 534592.610763909993693, 7481281.007791340351105 ], [ 536441.719193030032329, 7480978.031349030323327 ], [ 537775.93181324005127, 7480703.57045697979629 ], [ 538468.262211170047522, 7480515.588263570331037 ], [ 538902.020067770034075, 7480793.10108061041683 ], [ 539450.069282670039684, 7481044.61925155017525 ], [ 540092.788811390055344, 7481117.631719100289047 ], [ 540899.980495239957236, 7481030.660386419855058 ], [ 541528.288530569989234, 7480753.667894080281258 ], [ 542003.921304309973493, 7480483.660549759864807 ], [ 542810.168601599987596, 7480186.172313690185547 ], [ 543273.430744710029103, 7479986.681214369833469 ], [ 543539.54005779, 7479775.17871059011668 ], [ 543850.099438710021786, 7479563.177159620448947 ], [ 544323.518753150012344, 7479210.680796929635108 ], [ 545000.019705810002051, 7478579.670257880352437 ], [ 545128.84994149999693, 7478328.168212429620326 ], [ 545273.971010820008814, 7478091.670109380036592 ], [ 545330.20924285997171, 7477894.16892748977989 ], [ 545347.469562969985418, 7477512.160315119661391 ], [ 545321.02219096000772, 7477302.161381440237164 ], [ 545256.357257739990018, 7477067.150243889540434 ], [ 545115.849316100007854, 7476940.661324010230601 ], [ 544937.411430969950743, 7476877.640965590253472 ], [ 544772.079625239945017, 7476878.637933829799294 ], [ 544638.718173439963721, 7476917.641629779711366 ], [ 544543.608821350033395, 7476962.640816720202565 ], [ 544486.600448949960992, 7477014.139129949733615 ], [ 544410.870588200050406, 7477129.139150200411677 ], [ 544398.181233800016344, 7477135.639099080115557 ], [ 544245.439829859999008, 7477117.1421510996297 ], [ 544137.380202159984037, 7477130.630485829897225 ], [ 544003.990012840018608, 7477163.14045783970505 ], [ 543921.910125790047459, 7477284.139257409609854 ], [ 543776.55077919003088, 7477469.638466229662299 ], [ 543573.93015111994464, 7477661.651087479665875 ], [ 543307.510035800049081, 7477803.151486550457776 ], [ 542990.09090525994543, 7477900.648642280139029 ], [ 542729.74923455005046, 7477991.149885689839721 ], [ 542393.06988393003121, 7478075.650498890317976 ], [ 542081.720287809963338, 7478115.647714669816196 ], [ 541865.590316500049084, 7478135.640603840351105 ], [ 541687.399000389967114, 7478111.151426020078361 ], [ 541636.100918999989517, 7478022.14067148976028 ], [ 541616.161132990033366, 7477838.131628380157053 ], [ 541697.818109209998511, 7477640.132629239931703 ], [ 541976.461132270051166, 7477384.1186797702685 ], [ 542769.040812000050209, 7476908.609167319722474 ], [ 542978.120983900036663, 7476742.119599130004644 ], [ 543186.939394179964438, 7476524.609273049980402 ], [ 543275.311478639952838, 7476384.108866070397198 ], [ 543318.81773221003823, 7476173.599816120229661 ], [ 543336.910838649957441, 7475963.601623520255089 ], [ 543336.01063446002081, 7475766.087322100065649 ], [ 543322.669578160042875, 7475645.588219179771841 ], [ 543321.48089941998478, 7475397.092186010442674 ], [ 543345.000719630043022, 7474996.081464770250022 ], [ 543401.182136880001053, 7474773.069725950248539 ], [ 543476.690170909976587, 7474607.058913320302963 ], [ 543539.781323360046372, 7474505.061267970129848 ], [ 543742.570966850034893, 7474351.060028309933841 ], [ 543913.939341529970989, 7474280.059067719615996 ], [ 544047.288378549972549, 7474254.069900260306895 ], [ 544212.599255779990926, 7474234.069832229986787 ], [ 544358.990066859987564, 7474258.580309939570725 ], [ 544486.539540939964354, 7474334.580349479801953 ], [ 544569.630512499948964, 7474416.591412509791553 ], [ 544614.657629659981467, 7474531.080400019884109 ], [ 544640.56158791994676, 7474632.590177119709551 ], [ 544653.680978709948249, 7474709.098554720170796 ], [ 544653.91856421995908, 7474766.098375639878213 ], [ 544748.749146969988942, 7474644.610880590043962 ], [ 544868.471127780037932, 7474421.600939930416644 ], [ 544918.290347579983063, 7474204.591483780182898 ], [ 544929.95275928999763, 7473962.590209850110114 ], [ 544928.919781420030631, 7473752.588278099894524 ], [ 544895.860768839949742, 7473492.578885910101235 ], [ 544873.571916749468073, 7473446.765934069640934 ], [ 524814.091375153046101, 7473446.765934069640934 ], [ 524547.829927230020985, 7473933.389739160425961 ], [ 524314.660158729995601, 7474380.391378539614379 ], [ 524113.289297080016695, 7474826.900108000263572 ], [ 523987.717958259978332, 7475171.397866469807923 ], [ 523881.709820230025798, 7475617.39919385034591 ], [ 523884.297953500004951, 7476158.411572299897671 ], [ 523899.47760758997174, 7476673.909676229581237 ], [ 523856.891685770009644, 7477074.919690920040011 ], [ 523833.811786820006091, 7477577.930171160027385 ], [ 523880.459650699980557, 7478016.930567080155015 ], [ 523990.630124800023623, 7478455.432368899695575 ], [ 524119.887980200001039, 7478887.428070009686053 ], [ 524274.528004150022753, 7479306.940643169917166 ], [ 524538.249417810002342, 7479935.452063700184226 ] ], [ [ 541358.460613009985536, 7476431.070752290077507 ], [ 541371.310222759959288, 7476539.089240180328488 ], [ 541320.760819380055182, 7476749.099189889617264 ], [ 541244.510280070011504, 7476832.08961298968643 ], [ 541098.258586799958721, 7476864.090209979563951 ], [ 540971.020666989963502, 7476877.079898719675839 ], [ 540742.250839410000481, 7477011.579309450462461 ], [ 540475.649919499992393, 7477406.589215509593487 ], [ 540373.950899419956841, 7477483.589004130102694 ], [ 540221.411660689976998, 7477554.089975790120661 ], [ 539598.278405910008587, 7477765.570249490439892 ], [ 539312.390287859947421, 7477982.568873159587383 ], [ 539166.268936129985377, 7478154.568510370329022 ], [ 539045.630967270000838, 7478282.568591229617596 ], [ 538613.512336850049905, 7478595.068732789717615 ], [ 538346.578703250037506, 7478761.558315370231867 ], [ 538028.760317889973521, 7478915.060221480205655 ], [ 537615.490931609994732, 7479126.029186660423875 ], [ 537354.912620489951223, 7479273.029996830038726 ], [ 536687.148999179946259, 7479376.511235799640417 ], [ 536413.601945389993489, 7479358.501508070155978 ], [ 536184.381576010026038, 7479244.500811309553683 ], [ 535967.838253290043212, 7479002.981765929609537 ], [ 535852.94961626001168, 7478761.467817880213261 ], [ 535865.45077879994642, 7478563.971989460289478 ], [ 535973.359353450010531, 7478417.470643930137157 ], [ 536208.67089120997116, 7478353.469969959929585 ], [ 536520.470750760054216, 7478441.481110479682684 ], [ 536914.96944060001988, 7478535.999609249643981 ], [ 537188.561031299992464, 7478548.010379119776189 ], [ 537576.419097010046244, 7478477.022458010353148 ], [ 538135.950043509947136, 7478240.038715160451829 ], [ 538511.117701629991643, 7478182.040280549786985 ], [ 538822.509455760009587, 7477964.55079491995275 ], [ 538866.519821880036034, 7477563.541013290174305 ], [ 538745.520277449977584, 7477462.028324750252068 ], [ 538503.750118679949082, 7477475.521246880292892 ], [ 538204.880423530004919, 7477514.510608370415866 ], [ 537842.241106539964676, 7477508.990524750202894 ], [ 537492.291658040019684, 7477446.489446770399809 ], [ 537110.540420160046779, 7477389.972849680110812 ], [ 536728.740673499996774, 7477282.939162010326982 ], [ 536442.228769190027378, 7477079.928681880235672 ], [ 536333.737370750051923, 7476869.918774610385299 ], [ 536346.148593020043336, 7476640.91941266041249 ], [ 536428.58983392000664, 7476462.408203760161996 ], [ 536530.161248450051062, 7476315.910808119922876 ], [ 536625.313863039948046, 7476092.907453309744596 ], [ 536630.968454889953136, 7475609.3925636196509 ], [ 536585.899888799991459, 7475227.370493769645691 ], [ 536610.959037579945289, 7474972.858817160129547 ], [ 536731.528520839987323, 7474756.358776929788291 ], [ 536896.727803039946593, 7474653.860180609859526 ], [ 537074.909987590042874, 7474666.369350180029869 ], [ 537265.918872429989278, 7474786.870019759982824 ], [ 537437.907544029993005, 7474983.378747959621251 ], [ 537590.931406370014884, 7475224.89968893956393 ], [ 537718.481844619964249, 7475459.920584879815578 ], [ 537756.860391980037093, 7475593.430352349765599 ], [ 537846.038772220024839, 7475701.440673939883709 ], [ 537960.668860669946298, 7475758.440805559977889 ], [ 538145.050474349991418, 7475719.950655439868569 ], [ 538418.540455979993567, 7475706.450883599929512 ], [ 538685.870556570007466, 7475788.449010640382767 ], [ 538902.360836809966713, 7475953.480250170454383 ], [ 539061.571961560053751, 7476092.990216890349984 ], [ 539354.439745009993203, 7476289.51938187982887 ], [ 539628.200490779941902, 7476422.509449950419366 ], [ 539971.739809270016849, 7476466.041327700018883 ], [ 540416.950512130046263, 7476414.050173169933259 ], [ 540855.758395900018513, 7476343.073021410033107 ], [ 541224.689490749966353, 7476335.559219219721854 ], [ 541358.460613009985536, 7476431.070752290077507 ] ], [ [ 535805.28640327998437, 7475539.868359600193799 ], [ 535869.529938000021502, 7475666.870821200311184 ], [ 535921.589666099986061, 7475920.879242169670761 ], [ 535903.080141130019911, 7476041.880046259611845 ], [ 535763.840431499993429, 7476182.881343989633024 ], [ 535611.560275529976934, 7476240.900449469685555 ], [ 535490.719155590049922, 7476241.400933040305972 ], [ 535369.670986799988896, 7476197.888359400443733 ], [ 535280.599936189944856, 7476198.388064320199192 ], [ 535211.111269089975394, 7476293.898190249688923 ], [ 535205.728069989942014, 7476491.398832309991121 ], [ 535212.887750589987263, 7476663.410822159610689 ], [ 535194.419056689948775, 7476790.412126430310309 ], [ 535099.608665390056558, 7476911.921056929975748 ], [ 534953.58931184001267, 7476969.910778369754553 ], [ 534711.979972340050153, 7476971.410600939765573 ], [ 534457.180887729977258, 7476889.919906149618328 ], [ 534272.04126189998351, 7476738.401521010324359 ], [ 534137.609933770028874, 7476547.907458799891174 ], [ 534124.298060990055092, 7476427.40031720045954 ], [ 534231.747922249953263, 7476286.391005779616535 ], [ 534587.301779170054942, 7476163.879301480017602 ], [ 534637.920230860006995, 7476118.879857339896262 ], [ 534650.109833410009742, 7476004.382077129557729 ], [ 534515.532393840025179, 7475794.878760449588299 ], [ 534336.971588350017555, 7475687.870841540396214 ], [ 534069.050725679961033, 7475510.870088989846408 ], [ 533851.938362259999849, 7475327.350165169686079 ], [ 533698.498536749975756, 7475150.349448580294847 ], [ 533589.118865060037933, 7474883.337138920091093 ], [ 533569.060644509969279, 7474679.82876287959516 ], [ 533606.567680730018765, 7474539.840133409947157 ], [ 533839.941206270013936, 7474137.30896526016295 ], [ 533909.500624060048722, 7474060.820207010023296 ], [ 534042.55063718999736, 7473964.319312159903347 ], [ 534169.689554270007648, 7473944.81766203045845 ], [ 534239.739184070029296, 7473969.820194629952312 ], [ 534309.929303199984133, 7474007.319938800297678 ], [ 534405.599816540023312, 7474076.811073710210621 ], [ 534559.289050610037521, 7474298.81947829015553 ], [ 534924.689859559992328, 7474895.340122370049357 ], [ 535122.788080579950474, 7475116.851750509813428 ], [ 535358.739262609975412, 7475236.848466210067272 ], [ 535607.230046520009637, 7475343.3599007204175 ], [ 535805.28640327998437, 7475539.868359600193799 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15987", "objectid": "15989", "lithstrtno": "4458", "code": "A-FO-xo-a", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Layered mafic and ultramafic sills; coarse-grained pyroxenite overlain by leucocratic gabbro or dolerite; local basal serpentinite; metamorphosed", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous ultramafic intrusive", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.38742561681400001, "shape_area": 0.00104216928383 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 521401.194137196463998, 7473446.765934069640934 ], [ 521321.488619300012942, 7473505.419688289985061 ], [ 521099.931962530012242, 7473722.908787299878895 ], [ 520853.479242540022824, 7474036.409161989577115 ], [ 520525.652166970015969, 7474648.920887449756265 ], [ 520368.459916869993322, 7475025.40897111967206 ], [ 520049.610527139971964, 7476172.920207080431283 ], [ 519905.30918208998628, 7476587.410791880451143 ], [ 519684.341249910008628, 7476919.411290739662945 ], [ 519583.571789679990616, 7477129.900248009711504 ], [ 519541.120659600012004, 7477556.401514640077949 ], [ 519652.110633370000869, 7478166.889219500124454 ], [ 519749.288134019996505, 7478541.890029679983854 ], [ 519987.109825439983979, 7479068.889269069768488 ], [ 520109.478303309995681, 7479392.89994344022125 ], [ 520206.971165129973087, 7479825.399831029586494 ], [ 520259.752034789999016, 7480225.898915249854326 ], [ 520305.577774589997716, 7480505.909247079864144 ], [ 520491.708337530028075, 7480867.409856320358813 ], [ 520734.630191079981159, 7481126.901970620267093 ], [ 520882.081729509984143, 7481374.422062840312719 ], [ 521100.231080099998508, 7481774.420146870426834 ], [ 521279.660066750016995, 7482072.421400080434978 ], [ 522066.53047991002677, 7483041.939930959604681 ], [ 522322.308881259988993, 7483333.439529390074313 ], [ 522609.93873357999837, 7483643.949660209938884 ], [ 522884.698015169997234, 7483915.948813259601593 ], [ 523203.919918, 7484174.950047279708087 ], [ 523459.067756309988908, 7484345.458320800215006 ], [ 523688.70260729000438, 7484477.94885510019958 ], [ 523956.290176049980801, 7484584.948004179634154 ], [ 524153.672332780028228, 7484634.460372479632497 ], [ 524485.168754169950262, 7484804.961554169654846 ], [ 524778.729300149949268, 7485012.972745269536972 ], [ 525052.920080450014211, 7485164.471218720078468 ], [ 525396.889256870024838, 7485289.980692549608648 ], [ 525778.911536619998515, 7485376.980111620388925 ], [ 526103.491320949979126, 7485438.968910169787705 ], [ 526453.530471069971099, 7485493.990890430286527 ], [ 526816.288172830012627, 7485549.498404719866812 ], [ 527465.238378289970569, 7485609.502829919569194 ], [ 527796.4907079100376, 7485716.00092520006001 ], [ 527981.178892430034466, 7485784.998135359957814 ], [ 528064.028813729993999, 7485829.009080340154469 ], [ 528427.277579859946854, 7485979.999922719784081 ], [ 528644.058482439955696, 7486087.001203370280564 ], [ 529071.121055769966915, 7486252.020327379927039 ], [ 529247.71946322999429, 7486242.029754130169749 ], [ 529267.379067659960128, 7486104.520032140426338 ], [ 529090.728832960012369, 7485898.518822309561074 ], [ 528679.981317640049383, 7485628.498478479683399 ], [ 528411.881155980052426, 7485413.51169663015753 ], [ 527991.112252300023101, 7485193.011992510408163 ], [ 527589.97084448998794, 7485086.990878780372441 ], [ 527214.551729660015553, 7485057.499534820206463 ], [ 526680.100852660019882, 7484996.489663230255246 ], [ 526208.970491520012729, 7484890.989003130234778 ], [ 525432.180338650010526, 7484684.96916319988668 ], [ 525075.419583359966055, 7484553.470669459551573 ], [ 524661.411596380057745, 7484421.960348170250654 ], [ 524278.98091410001507, 7484245.97177139017731 ], [ 523877.29882699000882, 7484018.95034100022167 ], [ 523513.568505620001815, 7483759.947633580304682 ], [ 523149.39070842997171, 7483411.940081279724836 ], [ 522829.750640810001642, 7483056.952182490378618 ], [ 522497.118864229996689, 7482657.940781069919467 ], [ 522164.130013610003516, 7482175.929998010396957 ], [ 521888.898788070015144, 7481801.929337779991329 ], [ 521351.563030759978574, 7481142.931618990376592 ], [ 521069.968882090004627, 7480768.910275789909065 ], [ 520832.471159129985608, 7480305.410857650451362 ], [ 520517.28793674998451, 7479556.401816979981959 ], [ 520290.759011539979838, 7478736.387838570401073 ], [ 520206.319334450003225, 7478367.892363959923387 ], [ 520127.70909004000714, 7477877.900098400190473 ], [ 520119.479524740017951, 7477489.910617570392787 ], [ 520193.899986490025185, 7477088.399429489858449 ], [ 520319.369233570003416, 7476731.400998610071838 ], [ 520520.8195976500283, 7476297.409134459681809 ], [ 520760.181566330022179, 7475818.910517989657819 ], [ 521031.681305530015379, 7475403.412329119630158 ], [ 521290.719448990013916, 7475052.409434890374541 ], [ 521512.038795879983809, 7474777.407136229798198 ], [ 521821.929474769975059, 7474431.911327159963548 ], [ 522018.201737450028304, 7474239.909218950197101 ], [ 522189.008498630020767, 7474047.909708119928837 ], [ 522435.469491810014006, 7473734.88989934977144 ], [ 522615.703167135594413, 7473446.765934069640934 ], [ 521401.194137196463998, 7473446.765934069640934 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.9854", "objectid": "9855", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.28536118970699997, "shape_area": 0.00075583492192200005 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 555089.240362670039758, 7497031.250550730153918 ], [ 555214.778581200051121, 7496966.737625430338085 ], [ 555303.849349590018392, 7496972.251311229541898 ], [ 555397.432319379993714, 7496948.761133500374854 ], [ 555500.588549330015667, 7496894.751310749910772 ], [ 555340.45946487004403, 7496653.75065691024065 ], [ 555072.269406519946642, 7496419.742752940393984 ], [ 555257.961555329966359, 7496120.253690180368721 ], [ 555169.568603049963713, 7496080.645912299863994 ], [ 555079.651138229994103, 7495856.180409490130842 ], [ 554951.794667689944617, 7495656.452342719770968 ], [ 554533.323906189994887, 7495685.344775210134685 ], [ 554222.481189709971659, 7495584.240095560438931 ], [ 553674.920575369964354, 7495440.742040479555726 ], [ 553121.107822670019232, 7495335.730401810258627 ], [ 552058.298123529995792, 7495176.229097790084779 ], [ 551372.390996049973182, 7495140.572720600292087 ], [ 550837.030713769956492, 7495112.720892540179193 ], [ 550366.470990129979327, 7495115.199292610399425 ], [ 549927.711291779996827, 7495130.199409529566765 ], [ 549476.347991509945132, 7495158.198621840216219 ], [ 549081.69803133001551, 7495096.689537179656327 ], [ 548794.838874500012025, 7494951.690788920037448 ], [ 548041.851294800057076, 7494395.67981312982738 ], [ 547812.008184600039385, 7494218.670278839766979 ], [ 547308.83934380998835, 7494049.681729639880359 ], [ 546939.900352380005643, 7494039.159448419697583 ], [ 546539.409910980029963, 7494060.158678470179439 ], [ 546208.961332999984734, 7494119.158106570132077 ], [ 545732.518375079962425, 7494223.65915559977293 ], [ 545262.211036029970273, 7494277.14960508979857 ], [ 544861.560681449947879, 7494285.647513809613883 ], [ 544428.949143290054053, 7494243.648458180017769 ], [ 544084.999543430050835, 7494137.151736919768155 ], [ 543779.078326359973289, 7493992.649916980415583 ], [ 543543.189538729959168, 7493866.648261900059879 ], [ 543249.821946040028706, 7493696.147726809605956 ], [ 543032.74942597001791, 7493525.639886749908328 ], [ 542866.689999529975466, 7493367.640603230334818 ], [ 542802.682014300022274, 7493278.639014470390975 ], [ 542636.310553809977137, 7493075.648924670182168 ], [ 542578.619356640032493, 7492980.651306429877877 ], [ 542286.889140769955702, 7493141.651626129634678 ], [ 542561.820394319947809, 7493458.150018610060215 ], [ 542747.390386529965326, 7493686.141672980040312 ], [ 543028.137615890009329, 7493882.139863289892673 ], [ 543398.137297129957005, 7494128.140172740444541 ], [ 543755.121623549959622, 7494304.64926781039685 ], [ 544277.139624880044721, 7494416.150826640427113 ], [ 545237.501353780040517, 7494449.160052079707384 ], [ 545695.309559370041825, 7494434.148953230120242 ], [ 546566.508490049978718, 7494423.159816980361938 ], [ 546821.579328609979711, 7494568.161856819875538 ], [ 547096.899161410052329, 7494948.160620270296931 ], [ 547498.701257099979557, 7495194.17018620017916 ], [ 547925.59855144994799, 7495364.171054489910603 ], [ 548396.782193950028159, 7495482.180683489888906 ], [ 548816.892022080020979, 7495569.179532590322196 ], [ 549217.759903430007398, 7495617.679179130122066 ], [ 549618.769633420044556, 7495685.690184440463781 ], [ 550019.969748529954813, 7495810.698891820386052 ], [ 550312.910615590051748, 7495892.210300539620221 ], [ 550733.099958559963852, 7495985.210589869879186 ], [ 551076.650700130034238, 7496021.709231699816883 ], [ 551375.36080701998435, 7496024.402736780233681 ], [ 551521.861877109971829, 7496025.721549900248647 ], [ 551954.149807250010781, 7495997.719214060343802 ], [ 552322.961759119993076, 7495989.220348490402102 ], [ 552666.488816019962542, 7496019.231565900146961 ], [ 553462.279581440030597, 7496205.730644360184669 ], [ 553736.679746850044467, 7496382.731079690158367 ], [ 554011.079331679968163, 7496591.241597959771752 ], [ 554189.528591600013897, 7496672.741518639959395 ], [ 554361.860675979987718, 7496812.242042959667742 ], [ 554527.538610500050709, 7496881.231944209896028 ], [ 554862.030735339969397, 7497234.060149200260639 ], [ 555089.240362670039758, 7497031.250550730153918 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16188", "objectid": "16190", "lithstrtno": "2069", "code": "A-FOh-xs-f", "unitname": "Hardey Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Sedimentary and felsic volcanic rocks; local intrusive rocks", "parentcode": "A-FOS2-xs-f", "parentname": "Fortescue Group sequence 2", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous felsic volcanic", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 2", "formation": "Hardey Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Marble Bar Sub-basin; Northeast Pilbara Sub-basin; Northwest Pilbara Sub-basin; South Pilbara Sub-ba", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2766", "maxuncerty": "7", "min_age_ma": "2749", "minuncerty": "5", "max_age_da": "Isotopic", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 2.1357912995800001, "shape_area": 0.0208742109765 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 528954.110069880029187, 7487103.521836710162461 ], [ 529120.149274140014313, 7487076.007991850376129 ], [ 529237.922070009983145, 7487046.530405789613724 ], [ 529385.112543620052747, 7487076.020391209982336 ], [ 529610.718033500015736, 7487032.521789309568703 ], [ 529486.573557080002502, 7487228.240700139664114 ], [ 529422.971164569957182, 7487328.510253859683871 ], [ 529542.089915359974839, 7487311.529445690102875 ], [ 529748.237938759964891, 7487243.030956010334194 ], [ 530644.619228519964963, 7486871.519565439783037 ], [ 531272.819183569983579, 7486582.030198579654098 ], [ 531685.150314419995993, 7486369.538402480073273 ], [ 532154.860149109968916, 7486176.051343370229006 ], [ 532656.549589470028877, 7486033.552292670123279 ], [ 533139.431913170032203, 7485941.560117250308394 ], [ 533603.168918970040977, 7485843.570628009736538 ], [ 534092.21032826998271, 7485720.068343419581652 ], [ 535127.470298039959744, 7485434.569571630097926 ], [ 536416.878469659946859, 7485109.088254359550774 ], [ 537274.421160569996573, 7484900.611389660276473 ], [ 538430.128910519997589, 7484538.110331879928708 ], [ 539071.751081289956346, 7484388.118471539579332 ], [ 539922.830867439974099, 7484167.147630030289292 ], [ 540773.859463830012828, 7483927.159011710435152 ], [ 541904.428336929995567, 7483628.172685800120234 ], [ 543307.878213220043108, 7483219.690653090365231 ], [ 543923.859284300007857, 7483031.691971049644053 ], [ 544031.747912460006773, 7482980.188702680170536 ], [ 544114.320860560052097, 7482954.200195039622486 ], [ 545262.300773459952325, 7482442.211092540062964 ], [ 546433.928628760040738, 7481843.719781110063195 ], [ 547456.001047570025548, 7481145.721713369712234 ], [ 548652.548129320028238, 7480148.730872269719839 ], [ 549400.371715590008534, 7479400.739066990092397 ], [ 550048.579763669986278, 7478777.751176180317998 ], [ 550472.311465810053051, 7478079.751260950230062 ], [ 550646.820849810028449, 7477780.750998630188406 ], [ 550880.391042839968577, 7476851.749500320293009 ], [ 551013.400707509950735, 7476009.738878300413489 ], [ 551013.400320730055682, 7474879.230345549993217 ], [ 551035.608584269997664, 7473948.730222159996629 ], [ 551080.212846429902129, 7473446.765934069640934 ], [ 550353.422429812490009, 7473446.765934069640934 ], [ 550353.399890600005165, 7474116.218901770189404 ], [ 550485.680286339949816, 7474936.216461749747396 ], [ 550432.788980519981124, 7475570.72875999007374 ], [ 550300.528914020047523, 7476470.232370080426335 ], [ 550062.460199619992636, 7477184.230514120310545 ], [ 549983.15048365003895, 7477501.740314709953964 ], [ 549850.877924870001152, 7477501.740025259554386 ], [ 549771.518295009969734, 7477131.219166809692979 ], [ 549718.64053223002702, 7476655.231389840133488 ], [ 549441.609890660038218, 7475898.720854910090566 ], [ 549312.020508819958195, 7475403.210941050201654 ], [ 549279.419068390037864, 7475237.699863799847662 ], [ 549252.850128320045769, 7474996.208536789752543 ], [ 549238.410781800048426, 7474633.191752339713275 ], [ 549249.548923820024356, 7474308.690579039976001 ], [ 549247.909778489964083, 7473964.692137549631298 ], [ 549227.310927379992791, 7473627.689886249601841 ], [ 549209.66171369550284, 7473446.765934069640934 ], [ 544873.571916749468073, 7473446.765934069640934 ], [ 544895.860768839949742, 7473492.578885910101235 ], [ 544928.919781420030631, 7473752.588278099894524 ], [ 544929.95275928999763, 7473962.590209850110114 ], [ 544918.290347579983063, 7474204.591483780182898 ], [ 544868.471127780037932, 7474421.600939930416644 ], [ 544748.749146969988942, 7474644.610880590043962 ], [ 544653.91856421995908, 7474766.098375639878213 ], [ 544699.739898180007003, 7475046.109928339719772 ], [ 544706.15904447005596, 7475046.109696970321238 ], [ 544744.57259790005628, 7475103.109389079734683 ], [ 544795.861381420050748, 7475198.121260889805853 ], [ 544809.111402770038694, 7475293.618115450255573 ], [ 544803.540456530055963, 7475472.109343989752233 ], [ 544760.11179583997, 7475688.6086087198928 ], [ 544697.560710279969499, 7475911.618799359537661 ], [ 544635.309355729958043, 7476185.629217100329697 ], [ 544579.53048045001924, 7476504.130518309772015 ], [ 544517.341558640007861, 7476797.648935760371387 ], [ 544486.600448949960992, 7477014.139129949733615 ], [ 544543.608821350033395, 7476962.640816720202565 ], [ 544638.718173439963721, 7476917.641629779711366 ], [ 544772.079625239945017, 7476878.637933829799294 ], [ 544937.411430969950743, 7476877.640965590253472 ], [ 545115.849316100007854, 7476940.661324010230601 ], [ 545256.357257739990018, 7477067.150243889540434 ], [ 545321.02219096000772, 7477302.161381440237164 ], [ 545347.469562969985418, 7477512.160315119661391 ], [ 545330.20924285997171, 7477894.16892748977989 ], [ 545273.971010820008814, 7478091.670109380036592 ], [ 545128.84994149999693, 7478328.168212429620326 ], [ 545000.019705810002051, 7478579.670257880352437 ], [ 544368.639762139995582, 7479729.680836910381913 ], [ 544064.201096069999039, 7480214.180569579824805 ], [ 543714.721562610007823, 7480620.180760269984603 ], [ 543278.448427070048638, 7481036.680964759550989 ], [ 542961.651990619953722, 7481286.66906442027539 ], [ 542435.340712219942361, 7481607.680911930277944 ], [ 541902.139656650018878, 7481820.681552739813924 ], [ 541349.728197410004213, 7481989.161317829973996 ], [ 540816.150883599999361, 7482125.660042230039835 ], [ 540327.690057180006988, 7482376.638795359991491 ], [ 539857.761162020033225, 7482512.638187630102038 ], [ 539133.091830539982766, 7482586.607948769815266 ], [ 537816.838914479943924, 7482619.089825170114636 ], [ 537225.619498300016858, 7482679.579045910388231 ], [ 536609.530612439964898, 7482836.058942019939423 ], [ 535745.990270199952647, 7483114.058705699630082 ], [ 535307.411674660048448, 7483167.559465959668159 ], [ 534271.189145580050536, 7483237.040472649969161 ], [ 533705.727482449961826, 7483348.048920690082014 ], [ 533153.321361340000294, 7483529.539472719654441 ], [ 532620.120768659980968, 7483729.540241659618914 ], [ 532143.878973240032792, 7483885.039836630225182 ], [ 531609.821962340036407, 7483913.028245289810002 ], [ 530451.509875620016828, 7483716.010619269683957 ], [ 529712.271662750048563, 7483395.011301290243864 ], [ 529450.889285249984823, 7483263.000973359681666 ], [ 529208.522589650005102, 7483111.489456219598651 ], [ 528966.250386580009945, 7482979.001210840418935 ], [ 528762.380300409975462, 7482897.498404650017619 ], [ 528604.2699740199605, 7482816.493775309994817 ], [ 528058.949573489953764, 7482635.489615900442004 ], [ 527449.948290279950015, 7482483.479327520355582 ], [ 526647.460255819954909, 7482145.481460879556835 ], [ 526219.932036489946768, 7481860.981002789922059 ], [ 525837.131990249967203, 7481589.469329429790378 ], [ 525383.569695619982667, 7481165.460271639749408 ], [ 525063.879986720043235, 7480804.459229090251029 ], [ 524826.821140169980936, 7480442.957518120296299 ], [ 524662.731309870025143, 7480154.449138020165265 ], [ 524538.249417810002342, 7479935.452063700184226 ], [ 524274.528004150022753, 7479306.940643169917166 ], [ 524119.887980200001039, 7478887.428070009686053 ], [ 523990.630124800023623, 7478455.432368899695575 ], [ 523880.459650699980557, 7478016.930567080155015 ], [ 523833.811786820006091, 7477577.930171160027385 ], [ 523856.891685770009644, 7477074.919690920040011 ], [ 523899.47760758997174, 7476673.909676229581237 ], [ 523884.297953500004951, 7476158.411572299897671 ], [ 523881.709820230025798, 7475617.39919385034591 ], [ 523987.717958259978332, 7475171.397866469807923 ], [ 524113.289297080016695, 7474826.900108000263572 ], [ 524314.660158729995601, 7474380.391378539614379 ], [ 524547.829927230020985, 7473933.389739160425961 ], [ 524814.091375153046101, 7473446.765934069640934 ], [ 522615.703167135594413, 7473446.765934069640934 ], [ 522435.469491810014006, 7473734.88989934977144 ], [ 522189.008498630020767, 7474047.909708119928837 ], [ 522018.201737450028304, 7474239.909218950197101 ], [ 521821.929474769975059, 7474431.911327159963548 ], [ 521512.038795879983809, 7474777.407136229798198 ], [ 521290.719448990013916, 7475052.409434890374541 ], [ 521031.681305530015379, 7475403.412329119630158 ], [ 520760.181566330022179, 7475818.910517989657819 ], [ 520520.8195976500283, 7476297.409134459681809 ], [ 520319.369233570003416, 7476731.400998610071838 ], [ 520193.899986490025185, 7477088.399429489858449 ], [ 520119.479524740017951, 7477489.910617570392787 ], [ 520127.70909004000714, 7477877.900098400190473 ], [ 520206.319334450003225, 7478367.892363959923387 ], [ 520290.759011539979838, 7478736.387838570401073 ], [ 520517.28793674998451, 7479556.401816979981959 ], [ 520832.471159129985608, 7480305.410857650451362 ], [ 521069.968882090004627, 7480768.910275789909065 ], [ 521351.563030759978574, 7481142.931618990376592 ], [ 521888.898788070015144, 7481801.929337779991329 ], [ 522164.130013610003516, 7482175.929998010396957 ], [ 522497.118864229996689, 7482657.940781069919467 ], [ 522829.750640810001642, 7483056.952182490378618 ], [ 523149.39070842997171, 7483411.940081279724836 ], [ 523513.568505620001815, 7483759.947633580304682 ], [ 523877.29882699000882, 7484018.95034100022167 ], [ 524278.98091410001507, 7484245.97177139017731 ], [ 524661.411596380057745, 7484421.960348170250654 ], [ 525075.419583359966055, 7484553.470669459551573 ], [ 525432.180338650010526, 7484684.96916319988668 ], [ 526208.970491520012729, 7484890.989003130234778 ], [ 526680.100852660019882, 7484996.489663230255246 ], [ 527214.551729660015553, 7485057.499534820206463 ], [ 527589.97084448998794, 7485086.990878780372441 ], [ 527991.112252300023101, 7485193.011992510408163 ], [ 528411.881155980052426, 7485413.51169663015753 ], [ 528679.981317640049383, 7485628.498478479683399 ], [ 529090.728832960012369, 7485898.518822309561074 ], [ 529267.379067659960128, 7486104.520032140426338 ], [ 529247.71946322999429, 7486242.029754130169749 ], [ 529071.121055769966915, 7486252.020327379927039 ], [ 528644.058482439955696, 7486087.001203370280564 ], [ 528427.277579859946854, 7485979.999922719784081 ], [ 528064.028813729993999, 7485829.009080340154469 ], [ 527981.178892430034466, 7485784.998135359957814 ], [ 527796.4907079100376, 7485716.00092520006001 ], [ 527465.238378289970569, 7485609.502829919569194 ], [ 526816.288172830012627, 7485549.498404719866812 ], [ 526453.530471069971099, 7485493.990890430286527 ], [ 526103.491320949979126, 7485438.968910169787705 ], [ 525778.911536619998515, 7485376.980111620388925 ], [ 525396.889256870024838, 7485289.980692549608648 ], [ 525052.920080450014211, 7485164.471218720078468 ], [ 524778.729300149949268, 7485012.972745269536972 ], [ 524485.168754169950262, 7484804.961554169654846 ], [ 524153.672332780028228, 7484634.460372479632497 ], [ 523956.290176049980801, 7484584.948004179634154 ], [ 523688.70260729000438, 7484477.94885510019958 ], [ 523459.067756309988908, 7484345.458320800215006 ], [ 523203.919918, 7484174.950047279708087 ], [ 522884.698015169997234, 7483915.948813259601593 ], [ 522609.93873357999837, 7483643.949660209938884 ], [ 522322.308881259988993, 7483333.439529390074313 ], [ 522066.53047991002677, 7483041.939930959604681 ], [ 521279.660066750016995, 7482072.421400080434978 ], [ 521100.231080099998508, 7481774.420146870426834 ], [ 520882.081729509984143, 7481374.422062840312719 ], [ 520734.630191079981159, 7481126.901970620267093 ], [ 520491.708337530028075, 7480867.409856320358813 ], [ 520305.577774589997716, 7480505.909247079864144 ], [ 520259.752034789999016, 7480225.898915249854326 ], [ 520206.971165129973087, 7479825.399831029586494 ], [ 520109.478303309995681, 7479392.89994344022125 ], [ 519987.109825439983979, 7479068.889269069768488 ], [ 519749.288134019996505, 7478541.890029679983854 ], [ 519652.110633370000869, 7478166.889219500124454 ], [ 519541.120659600012004, 7477556.401514640077949 ], [ 519583.571789679990616, 7477129.900248009711504 ], [ 519684.341249910008628, 7476919.411290739662945 ], [ 519905.30918208998628, 7476587.410791880451143 ], [ 520049.610527139971964, 7476172.920207080431283 ], [ 520368.459916869993322, 7475025.40897111967206 ], [ 520525.652166970015969, 7474648.920887449756265 ], [ 520853.479242540022824, 7474036.409161989577115 ], [ 521099.931962530012242, 7473722.908787299878895 ], [ 521321.488619300012942, 7473505.419688289985061 ], [ 521401.194137196463998, 7473446.765934069640934 ], [ 520263.966596475744154, 7473446.765934069640934 ], [ 520045.079995240026619, 7473894.428377710282803 ], [ 519729.221963040006813, 7474334.92953103967011 ], [ 519634.308755900012329, 7474430.939210419543087 ], [ 519514.34932562999893, 7474609.939006499946117 ], [ 519254.761205210001208, 7474853.430005059577525 ], [ 518995.009580629994161, 7475058.43823663983494 ], [ 518735.748522549984045, 7475371.431314400397241 ], [ 518508.929092329984996, 7475818.430933189578354 ], [ 518327.488122560025658, 7476442.93088511005044 ], [ 518215.772289789980277, 7477016.40078095998615 ], [ 518142.210221890010871, 7477602.391211249865592 ], [ 518125.649700690002646, 7478117.86872429959476 ], [ 518159.351960200001486, 7478525.359361410140991 ], [ 518244.409103669982869, 7479021.358764530159533 ], [ 518469.570884139975533, 7479567.368860090151429 ], [ 518713.410290280007757, 7480024.371472629718482 ], [ 519001.440619600005448, 7480404.37745278980583 ], [ 519622.430933850002475, 7481273.389771680347621 ], [ 519955.230062239977997, 7481716.908311439678073 ], [ 520237.10917721997248, 7482148.410561019554734 ], [ 520531.619565160013735, 7482560.410203600302339 ], [ 520941.17862751998473, 7483098.931340780109167 ], [ 521112.019750770006794, 7482919.920276300050318 ], [ 521163.329343390010763, 7483008.930106650106609 ], [ 521374.539772410003934, 7483293.929609539918602 ], [ 521784.480578640010208, 7483902.939748729579151 ], [ 522018.439330630004406, 7483621.429230930283666 ], [ 521999.950163599976804, 7483748.9293083101511 ], [ 522007.338594119995832, 7483971.429092960432172 ], [ 522059.031432130024768, 7484136.939696010202169 ], [ 522123.3302770400187, 7484282.942129979841411 ], [ 522206.711411260010209, 7484428.940459559671581 ], [ 522750.549823439971078, 7485113.459524570032954 ], [ 522999.849542689975351, 7485391.950317829847336 ], [ 523268.120747109991498, 7485625.951278129592538 ], [ 523577.778480749984737, 7485223.462142010219395 ], [ 524265.450897340022493, 7485403.967761510051787 ], [ 524915.208273750031367, 7485629.970491929911077 ], [ 526113.710027370019816, 7486246.990289689972997 ], [ 526961.480119650019333, 7486655.987977350130677 ], [ 527662.338701030006632, 7486932.500663819722831 ], [ 527974.408268759958446, 7487025.998880390077829 ], [ 528572.600081639946438, 7487105.512862170115113 ], [ 528795.161534680053592, 7487111.009507419541478 ], [ 528954.110069880029187, 7487103.521836710162461 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.5501", "objectid": "5501", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.3227297790200001, "shape_area": 0.0026336634247400002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 540982.640750179998577, 7521020.221449459902942 ], [ 541521.121391479973681, 7520848.708374029956758 ], [ 541937.188143379986286, 7520653.210939779877663 ], [ 542671.450893379980698, 7520383.709697290323675 ], [ 543577.010112980031408, 7520212.209388909861445 ], [ 544262.249843609984964, 7520065.68780876044184 ], [ 545094.439139469992369, 7519771.689673730172217 ], [ 545755.238412400009111, 7519649.69032904971391 ], [ 546464.969501200015657, 7519478.178228080272675 ], [ 547076.849915059981868, 7519282.180675569921732 ], [ 547541.840230589965358, 7518939.660958710126579 ], [ 548055.852417140034959, 7518401.159735480323434 ], [ 548276.089059549965896, 7518083.15027062036097 ], [ 548422.971490449970588, 7517764.649379810318351 ], [ 548643.208647969993763, 7517520.139687079936266 ], [ 548814.528343240031973, 7517299.638577819801867 ], [ 548887.949365769978613, 7517006.139925830066204 ], [ 548790.080467739957385, 7516712.149872760288417 ], [ 548447.359045919962227, 7516541.141613990068436 ], [ 547933.449674039962701, 7516369.641400409862399 ], [ 547615.228354310034774, 7516271.648910780437291 ], [ 547248.119517949991859, 7516051.66193072963506 ], [ 546954.42878852004651, 7515806.658421809785068 ], [ 546880.978811490000226, 7515611.148687190376222 ], [ 546758.599542230018415, 7515243.660391540266573 ], [ 546513.859153309953399, 7515023.638733309693635 ], [ 546146.721682289964519, 7514876.650525569915771 ], [ 545632.76747008995153, 7514803.15205886028707 ], [ 545314.569968260009773, 7514632.161047049798071 ], [ 544825.082816450041719, 7514215.658196600154042 ], [ 544678.24831814004574, 7513799.659713629633188 ], [ 544482.418259960017167, 7513016.647983860224485 ], [ 544482.410793130053207, 7512551.6588896503672 ], [ 544335.540762530057691, 7512062.148802960291505 ], [ 544090.778932159999385, 7511817.15087560005486 ], [ 544029.577797919977456, 7511765.412042209878564 ], [ 543772.59828351996839, 7511548.157806159928441 ], [ 543601.278376020025462, 7511278.650549460202456 ], [ 543478.910323719959706, 7510911.660685740411282 ], [ 543381.021468420047313, 7510324.151035180315375 ], [ 543356.489253900013864, 7509687.648783350363374 ], [ 543283.109859740012325, 7509198.147471319884062 ], [ 543136.210824489942752, 7508978.151689469814301 ], [ 542866.960801149951294, 7508635.647619180381298 ], [ 542622.220380789949559, 7508170.659347269684076 ], [ 542597.751156199956313, 7507729.650091419927776 ], [ 542426.430921099963598, 7507142.661000530235469 ], [ 542157.18836409994401, 7506530.64897022023797 ], [ 541936.889746180037037, 7506065.650917610153556 ], [ 541716.579055089969188, 7505698.161702239885926 ], [ 540762.078696239972487, 7504939.64010277017951 ], [ 540125.770195159944706, 7504572.649722670204937 ], [ 539244.629889119998552, 7504132.149919520132244 ], [ 538755.142619839985855, 7503960.650235869921744 ], [ 538020.880797310033813, 7503667.152258199639618 ], [ 537555.862850739969872, 7503544.648875479586422 ], [ 536992.93201675999444, 7503520.142260869964957 ], [ 536527.908533600042574, 7503593.64957720041275 ], [ 536258.679497829987668, 7503520.142049100250006 ], [ 536013.901978750014678, 7503250.640689079649746 ], [ 535891.528701080009341, 7502908.137486189603806 ], [ 535646.811027529998682, 7502516.630293989554048 ], [ 534985.921421359991655, 7502076.121785869821906 ], [ 534325.121031209942885, 7501880.119671490043402 ], [ 533444.018584429984912, 7501684.610329260118306 ], [ 532856.65218931005802, 7501611.11120583023876 ], [ 532540.009993170038797, 7501632.111001109704375 ], [ 532622.259100739960559, 7501487.100418940186501 ], [ 532463.803578209946863, 7501487.067533879540861 ], [ 531172.410778839956038, 7501486.738344410434365 ], [ 530418.709116179961711, 7501486.495882200077176 ], [ 529735.54628834000323, 7501486.244186529889703 ], [ 529283.510124549968168, 7501486.060903140343726 ], [ 528055.80054874997586, 7501423.059336570091546 ], [ 527895.380413289996795, 7501600.550623670220375 ], [ 528269.54911084997002, 7501675.549466320313513 ], [ 528644.579739370034076, 7501769.560601740144193 ], [ 529113.411460499977693, 7501800.570461129769683 ], [ 529800.969874809961766, 7501832.06981464009732 ], [ 530707.279987629968673, 7501832.090665870346129 ], [ 531832.36921708995942, 7502050.601514429785311 ], [ 532130.460120560019277, 7502165.598587240092456 ], [ 532401.508138290024363, 7501876.600775930099189 ], [ 532551.200599230010994, 7501832.098164609633386 ], [ 533020.02924736996647, 7501925.602211659774184 ], [ 533613.830401089973748, 7502019.621294899843633 ], [ 534488.93889664998278, 7502207.120117579586804 ], [ 534926.429906480014324, 7502457.130986009724438 ], [ 535239.000016969977878, 7502707.138429320417345 ], [ 535551.54326118004974, 7503144.641235849820077 ], [ 535676.530275200027972, 7503519.638427189551294 ], [ 535926.551618380006403, 7503894.651935909874737 ], [ 536270.368330019991845, 7504082.142233549617231 ], [ 536676.589791630045511, 7504113.647556249983609 ], [ 536989.179971029981971, 7504051.152139419689775 ], [ 537895.510879740002565, 7503957.148059849627316 ], [ 538364.259979589958675, 7504113.660114450380206 ], [ 539051.811228069942445, 7504394.649407530203462 ], [ 539676.888922760030255, 7504613.650578799657524 ], [ 540145.700841389945708, 7504988.647760559804738 ], [ 540770.792363699991256, 7505332.151711080223322 ], [ 541145.760131699964404, 7505676.148550059646368 ], [ 541614.601450589951128, 7506144.651670889928937 ], [ 541895.868716700002551, 7506645.16197604034096 ], [ 542083.358566339942627, 7507145.159036980010569 ], [ 542208.389240680029616, 7507707.658948659896851 ], [ 542145.908449199981987, 7508332.659268240444362 ], [ 542239.658127030008473, 7508645.160752990283072 ], [ 542458.470874110003933, 7508957.660044039599597 ], [ 542677.241687429952435, 7509082.66245721001178 ], [ 542864.719560010009445, 7509239.16115100029856 ], [ 542927.2699991799891, 7509989.150851080194116 ], [ 542927.261376110021956, 7510676.660736439749599 ], [ 542802.268583850003779, 7511333.159598980098963 ], [ 542677.702807420049794, 7511769.217952099628747 ], [ 542677.290337580023333, 7511770.661792299710214 ], [ 542270.978754749987274, 7512270.668791599571705 ], [ 541927.239561259979382, 7512614.179933479987085 ], [ 541708.510433039977215, 7512864.170864880084991 ], [ 541802.24961754004471, 7513020.67063379008323 ], [ 542052.241269630030729, 7512989.160135299898684 ], [ 542771.040110750007443, 7512583.159594760276377 ], [ 543333.622250700020231, 7512333.149206009693444 ], [ 543662.490462539950386, 7512139.149124950170517 ], [ 543999.971377330017276, 7512226.148398630321026 ], [ 544083.619118619943038, 7512436.151478759944439 ], [ 544110.92760646995157, 7512830.148890050128102 ], [ 544043.070209590019658, 7513263.661248640157282 ], [ 544019.521404400002211, 7513652.158787080086768 ], [ 544059.151025839964859, 7513963.659865760244429 ], [ 544226.390946530038491, 7514363.67160225007683 ], [ 544514.33162234001793, 7514718.658802700228989 ], [ 545260.532290859962814, 7515172.657789319753647 ], [ 545521.6189673099434, 7515241.149009400047362 ], [ 545769.668800889980048, 7515246.159009889699519 ], [ 546023.718619870021939, 7515187.658571889624 ], [ 546176.478632229962386, 7515206.160606130026281 ], [ 546311.360664939973503, 7515485.160285499878228 ], [ 546357.157507620053366, 7515752.148936149664223 ], [ 546479.040056189987808, 7515980.647956600412726 ], [ 546785.549659520038404, 7516240.150772740133107 ], [ 547104.427803089958616, 7516423.159972 ], [ 547346.939772429992445, 7516606.149222410283983 ], [ 547595.460421300027519, 7516706.64884824026376 ], [ 547875.430357409990393, 7516749.648120380006731 ], [ 548117.548875179956667, 7516850.140485050156713 ], [ 548149.559577399981208, 7516888.138962370343506 ], [ 548226.580347919953056, 7517034.140241320244968 ], [ 548233.58887604996562, 7517167.641332849860191 ], [ 548113.498294639983214, 7517321.138408009894192 ], [ 547904.221216939971782, 7517443.151080770418048 ], [ 547777.708135260036215, 7517584.151709419675171 ], [ 547740.041384069947526, 7517679.64995289966464 ], [ 547778.850409999955446, 7517819.650623749941587 ], [ 547817.521218489971943, 7517927.658131849952042 ], [ 547817.848904539947398, 7517997.657741430215538 ], [ 547805.601275980006903, 7518086.660438559949398 ], [ 547459.039317650021985, 7518552.670614539645612 ], [ 547115.298340609995648, 7518833.660968529991806 ], [ 546740.211962820030749, 7519052.669073389843106 ], [ 546333.978435499942861, 7519208.680190100334585 ], [ 545771.421882549999282, 7519333.67895373981446 ], [ 545052.591250750003383, 7519396.201453859917819 ], [ 544646.311593209975399, 7519490.192598029971123 ], [ 544083.791262720013037, 7519740.191862120293081 ], [ 543583.748000220046379, 7519990.189772630110383 ], [ 543021.179025089950301, 7520021.20073467027396 ], [ 542521.160122800036334, 7520084.202810940332711 ], [ 541896.109705229988322, 7520302.71127125993371 ], [ 541521.067888260004111, 7520552.710816349834204 ], [ 541052.321444040047936, 7520834.207481199875474 ], [ 540677.271513910032809, 7520865.219127329997718 ], [ 540302.252228950033896, 7520771.719968450255692 ], [ 539833.450501719955355, 7520552.719107920303941 ], [ 539614.67884160997346, 7520396.718216490000486 ], [ 539427.008212720043957, 7520072.729762 ], [ 539426.668668980011716, 7519997.231947139836848 ], [ 539413.251687229960226, 7519863.731583850458264 ], [ 539374.321725239977241, 7519691.720033509656787 ], [ 539322.797352000023238, 7519564.718835569918156 ], [ 539175.801647959975526, 7519406.719772949814796 ], [ 538907.860808350029401, 7519223.218876370228827 ], [ 538569.997983230045065, 7519059.732398999854922 ], [ 538251.419350809999742, 7518934.229637529700994 ], [ 537913.880765930050984, 7518821.720027790404856 ], [ 537588.630172290024348, 7518625.729829389601946 ], [ 537504.891110530006699, 7518403.739562990143895 ], [ 537485.079137690016069, 7518257.230500830337405 ], [ 537267.679878070019186, 7518016.729045360349119 ], [ 536885.82106514996849, 7517948.739742060191929 ], [ 536415.309916740050539, 7517970.239478410221636 ], [ 535379.197512720013037, 7518065.239417679607868 ], [ 534393.389142140047625, 7518045.250069919973612 ], [ 533713.010928750038147, 7518061.748432110063732 ], [ 533038.981324749998748, 7518065.251714630052447 ], [ 532549.079240350052714, 7518029.75042087957263 ], [ 532179.960140989976935, 7517967.761602830141783 ], [ 531758.64920034003444, 7517632.750212909653783 ], [ 531796.090702429995872, 7517486.249421309679747 ], [ 531769.671595370047726, 7517282.750366459600627 ], [ 531693.101855669985525, 7517225.759357900358737 ], [ 531515.108686399995349, 7517239.752154059708118 ], [ 531210.670135739957914, 7517406.761843520216644 ], [ 530968.829944240045734, 7517376.250337759964168 ], [ 530656.489814030006528, 7517225.23943976033479 ], [ 530490.178360010031611, 7517022.228644349612296 ], [ 530476.311610009986907, 7516787.22830564994365 ], [ 530564.126742949942127, 7516525.728350619785488 ], [ 530702.417887600022368, 7516200.239313459955156 ], [ 530720.108391609974205, 7515894.75172952003777 ], [ 530636.218579089967534, 7515653.23923297971487 ], [ 530527.559888079995289, 7515526.730163279920816 ], [ 530504.158913849969395, 7515475.23132895026356 ], [ 530488.418434530030936, 7515419.230454670265317 ], [ 530485.088802239974029, 7515344.741084960289299 ], [ 530493.648228749982081, 7515311.231420080177486 ], [ 530533.909162009949796, 7515253.239404910244048 ], [ 530748.808856319985352, 7515076.739342969842255 ], [ 530830.258743879967369, 7514986.238437609747052 ], [ 530860.79761279001832, 7514922.239439809694886 ], [ 530867.692459349986166, 7514885.237596809864044 ], [ 530865.880872169975191, 7514850.738035580143332 ], [ 530852.188056100043468, 7514823.740399150177836 ], [ 530826.129318200051785, 7514807.238458000123501 ], [ 530791.370318740024231, 7514798.746725520119071 ], [ 530647.470723689999431, 7514789.7284668199718 ], [ 530503.900893770041876, 7514762.228310209698975 ], [ 530423.070899500045925, 7514734.219831620343029 ], [ 530218.74973763001617, 7514643.220442649908364 ], [ 530148.117918489966542, 7514620.220253130421042 ], [ 529819.729662840021774, 7514562.701285749673843 ], [ 529740.341517299995758, 7514528.711873450316489 ], [ 529707.720653429976664, 7514496.70929556991905 ], [ 529694.629846600000747, 7514468.700406789779663 ], [ 529689.571899089962244, 7514437.698042769916356 ], [ 529701.409157510031946, 7514334.18831204995513 ], [ 529795.92030961997807, 7514143.20673255994916 ], [ 529979.421387149952352, 7513951.220812080428004 ], [ 530099.42050291004125, 7513784.71054114960134 ], [ 530130.411366789950989, 7513612.709768359549344 ], [ 530097.659862149972469, 7513415.708956269547343 ], [ 529892.520336349960417, 7513079.698101550340652 ], [ 529541.3494360599434, 7512788.690159239806235 ], [ 529082.381066789967008, 7512568.190159110352397 ], [ 528725.79111038998235, 7512474.67035620007664 ], [ 528381.821448970003985, 7512374.648699250072241 ], [ 528019.00225657003466, 7512313.15074963029474 ], [ 527573.720331709948368, 7512290.140388590283692 ], [ 527179.358417070005089, 7512292.118612400256097 ], [ 526765.851011640042998, 7512269.119919019751251 ], [ 526364.729590249946341, 7512169.600267699919641 ], [ 526007.827766750007868, 7512012.100629179738462 ], [ 525733.400640110019594, 7511829.078617500141263 ], [ 525715.241239189985208, 7511806.885280930437148 ], [ 525541.539301850018091, 7511594.592479820363224 ], [ 525355.470764999976382, 7511252.092282770201564 ], [ 525201.961775040021166, 7511074.579809789545834 ], [ 524991.771459970041178, 7510993.080950760282576 ], [ 524788.12910954002291, 7510968.56984443962574 ], [ 524628.93126082001254, 7510931.06005815975368 ], [ 524449.939836779958569, 7510735.050195139832795 ], [ 524296.708865039981902, 7510608.561523400247097 ], [ 524175.581662399985362, 7510552.060833330266178 ], [ 524162.859050359984394, 7510539.051478800363839 ], [ 523991.429057269997429, 7510603.559072679840028 ], [ 523647.860599100007676, 7510430.539885059930384 ], [ 523323.940627629985102, 7510193.041663180105388 ], [ 522935.251059490023181, 7509934.04007126018405 ], [ 521858.9592969599762, 7509706.585036410018802 ], [ 521402.089786909986287, 7509610.008999690413475 ], [ 520906.006727360014338, 7509526.057665060274303 ], [ 520005.170785209978931, 7509373.567330420017242 ], [ 519868.870076789986342, 7509350.490000429563224 ], [ 519307.440221610013396, 7509273.489978609606624 ], [ 518912.777727360022254, 7509330.469264090061188 ], [ 519982.678381100005936, 7509614.489995859563351 ], [ 520790.33930395997595, 7509810.000191969797015 ], [ 521671.439029879984446, 7509957.018936470150948 ], [ 522846.268818399985321, 7510275.031419220380485 ], [ 523849.760689369984902, 7510813.54871303960681 ], [ 524461.650530240032822, 7511278.559725630097091 ], [ 525049.020320000010543, 7511768.067746119573712 ], [ 525112.657200939953327, 7511807.879730549640954 ], [ 525636.488515109987929, 7512135.577202550135553 ], [ 526174.970592719968408, 7512331.08860176987946 ], [ 526786.8993170800386, 7512576.111894340254366 ], [ 527766.012258989969268, 7512845.148149039596319 ], [ 528451.322689770022407, 7512992.157981620170176 ], [ 528965.390379579970613, 7513114.681486169807613 ], [ 529283.53027829003986, 7513310.179969239979982 ], [ 529552.809830010053702, 7513653.199009819887578 ], [ 529650.70078537997324, 7514044.698509619571269 ], [ 529552.831549320020713, 7514338.19016341958195 ], [ 529528.320054790005088, 7514632.188188039697707 ], [ 529748.660451899981126, 7514852.208768350072205 ], [ 530115.820970879984088, 7515146.220316509716213 ], [ 530091.311437780037522, 7515684.222140549682081 ], [ 529846.538256110041402, 7516247.207606200128794 ], [ 529675.219794600037858, 7516663.697559090331197 ], [ 529601.811084239976481, 7517030.700361669994891 ], [ 529773.12969517998863, 7517397.709674839861691 ], [ 530164.801248240051791, 7517789.222396439872682 ], [ 530752.209263560012914, 7518009.750843860208988 ], [ 531462.029136199969798, 7518205.26035728957504 ], [ 532392.009412940009497, 7518401.250288999639452 ], [ 533028.401630589971319, 7518401.250747869722545 ], [ 533909.450898190028965, 7518499.250098859891295 ], [ 535108.697880489984527, 7518450.237544589675963 ], [ 536112.210407849983312, 7518646.248493609949946 ], [ 536724.078674650052562, 7518988.738700640387833 ], [ 537384.898478670045733, 7519429.231762089766562 ], [ 537825.370399679988623, 7519576.228570929728448 ], [ 538265.961347240023315, 7519673.72992848046124 ], [ 538608.648913390003145, 7519894.229630409739912 ], [ 539000.201804729993455, 7520285.721641919575632 ], [ 539342.811559570021927, 7520555.229987599886954 ], [ 539807.878525439999066, 7520750.719968990422785 ], [ 540272.898704249993898, 7520922.218769470229745 ], [ 540982.640750179998577, 7521020.221449459902942 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.8680", "objectid": "8681", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.55572759406399996, "shape_area": 0.0022604386659900002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 520542.462652940012049, 7514160.968576629646122 ], [ 519928.680768750025891, 7514807.459462120197713 ], [ 519922.708887970016804, 7514883.940687100403011 ], [ 519917.670074609981384, 7515169.947305140085518 ], [ 519925.960200970002916, 7515564.941732300445437 ], [ 519953.787620300019626, 7515724.758886470459402 ], [ 519900.343085089989472, 7516263.777936239726841 ], [ 520008.762039760011248, 7516612.118976039811969 ], [ 520117.299361719982699, 7517047.57921488955617 ], [ 520185.237884389993269, 7517395.971388869918883 ], [ 520361.539808640023693, 7518034.621373900212348 ], [ 520510.397251019952819, 7518324.824829200282693 ], [ 520859.66047996992711, 7518796.493398250080645 ], [ 520896.319889380014502, 7519002.919434909708798 ], [ 520872.96024511998985, 7519429.411170129664242 ], [ 520471.885893520026002, 7519820.437087640166283 ], [ 520215.746720750001259, 7520082.134254289790988 ], [ 520229.626076239976101, 7520372.515831279568374 ], [ 520216.449312160024419, 7520619.372835559770465 ], [ 520081.754149810003582, 7520851.868108260445297 ], [ 520014.649357219983358, 7521156.874627060256898 ], [ 519981.788932837487664, 7521273.574077860452235 ], [ 522409.242599931545556, 7521273.574077860452235 ], [ 522348.220414990035351, 7520706.969655729830265 ], [ 522282.15959312999621, 7520191.960507390089333 ], [ 522226.659193270024844, 7519237.460663010366261 ], [ 522200.289610730018467, 7519040.458986540324986 ], [ 521884.939737839973532, 7518265.451066539622843 ], [ 521800.200406750023831, 7517832.950569169595838 ], [ 521779.159589310002048, 7517438.447461250238121 ], [ 521738.93966532999184, 7516999.958360100165009 ], [ 521666.768648990022484, 7516535.460828520357609 ], [ 521581.801603920001071, 7516058.468591059558094 ], [ 521477.821174010052346, 7515594.469858160242438 ], [ 521335.779068149975501, 7515136.958421420305967 ], [ 521233.060718770022504, 7514933.968699309974909 ], [ 521098.600245599984191, 7514756.481158919632435 ], [ 520906.899310519977007, 7514566.459113360382617 ], [ 520663.783022239978891, 7514268.97126024030149 ], [ 520542.462652940012049, 7514160.968576629646122 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.9853", "objectid": "9854", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.21476456169700001, "shape_area": 0.00086849203173099999 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 521206.44805255002575, 7513361.990735240280628 ], [ 521379.008907879993785, 7513545.499772519804537 ], [ 521635.52861825999571, 7513989.981383229605854 ], [ 521885.749655669962522, 7514452.988889950327575 ], [ 522117.140884039981756, 7514967.491810309700668 ], [ 522343.17095966998022, 7515685.47884355019778 ], [ 522466.829111320024822, 7516263.981953090056777 ], [ 522609.569676789978985, 7516861.48109246045351 ], [ 522796.28983674000483, 7517337.469327299855649 ], [ 522988.712196270003915, 7517680.467206840403378 ], [ 523232.190064209979028, 7518054.490173670463264 ], [ 523405.710937699943315, 7518429.000097339972854 ], [ 523496.349508450017311, 7518765.999401739798486 ], [ 523472.781448009947781, 7519148.019750829786062 ], [ 523429.659503509989008, 7519440.998553990386426 ], [ 523304.758738029981032, 7519919.010429590009153 ], [ 523160.551499070017599, 7520352.510412150062621 ], [ 523073.630857660027687, 7520791.999725989997387 ], [ 523007.305717104056384, 7521273.574077860452235 ], [ 524942.084509948384948, 7521273.574077860452235 ], [ 524958.171890130033717, 7521215.120178709737957 ], [ 524906.299241830012761, 7521005.109648800455034 ], [ 524796.9697620900115, 7520757.600493759848177 ], [ 524637.49894109996967, 7520656.588923869654536 ], [ 524478.680098630022258, 7520689.07113432046026 ], [ 524243.453589889977593, 7520709.571230069734156 ], [ 524143.549343852791935, 7520656.412410277873278 ], [ 524134.350605180021375, 7520500.060532470233738 ], [ 524152.72074481000891, 7520353.571849780157208 ], [ 524202.369046679988969, 7520098.558881849981844 ], [ 524239.229006730020046, 7519837.549687219783664 ], [ 524237.668311430083122, 7519506.55080983042717 ], [ 524158.951758319977671, 7519010.529038690030575 ], [ 524157.999326489982195, 7518807.028272549621761 ], [ 524119.032020880025811, 7518641.521978080272675 ], [ 524028.608133540023118, 7518355.517049229703844 ], [ 523912.941209269978572, 7518108.009794030338526 ], [ 523733.722453519992996, 7517860.998836340382695 ], [ 523509.899753010016866, 7517613.990790239535272 ], [ 523271.098302030004561, 7516882.98878544010222 ], [ 523433.95207786001265, 7516360.500125460326672 ], [ 523476.730214309995063, 7515997.508203850127757 ], [ 523373.289957669971045, 7515654.508595500141382 ], [ 523180.56040567997843, 7515248.00934008974582 ], [ 523089.739643169974443, 7514873.007855829782784 ], [ 523056.320965659979265, 7514536.009334879927337 ], [ 523067.817986970010679, 7514281.009863840416074 ], [ 523066.150845020019915, 7513931.010712930001318 ], [ 522886.021028539980762, 7513505.530193040147424 ], [ 522738.429538290016353, 7513220.030236219987273 ], [ 522572.099404939974193, 7513030.021872960031033 ], [ 522380.780247449991293, 7512916.521716950461268 ], [ 522208.370498010015581, 7512764.519335090182722 ], [ 522004.111833690025378, 7512606.520235720090568 ], [ 521206.44805255002575, 7513361.990735240280628 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16771", "objectid": "16773", "lithstrtno": "2191", "code": "A-FOr-b", "unitname": "Mount Roe Basalt", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Basaltic volcanic rock; local volcaniclastic and siliciclastic rocks", "parentcode": "A-FOS1-xbb-s", "parentname": "Fortescue Group sequence 1", "rocktype1": "igneous mafic volcanic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 1", "formation": "Mount Roe Basalt", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "Marble Bar Sub-basin; Northeast Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": "10", "min_age_ma": "2772", "minuncerty": "2", "max_age_da": "Isotopic", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.044852185260600003, "shape_area": 8.7229217986999993e-05 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 544579.53048045001924, 7476504.130518309772015 ], [ 544635.309355729958043, 7476185.629217100329697 ], [ 544697.560710279969499, 7475911.618799359537661 ], [ 544760.11179583997, 7475688.6086087198928 ], [ 544803.540456530055963, 7475472.109343989752233 ], [ 544809.111402770038694, 7475293.618115450255573 ], [ 544795.861381420050748, 7475198.121260889805853 ], [ 544744.57259790005628, 7475103.109389079734683 ], [ 544706.15904447005596, 7475046.109696970321238 ], [ 544699.739898180007003, 7475046.109928339719772 ], [ 544440.75061997002922, 7475397.621103939600289 ], [ 544257.600703369942494, 7475666.100282370112836 ], [ 544150.728781630052254, 7475933.609804259613156 ], [ 544019.370185459963977, 7476380.111608060076833 ], [ 543982.239278460037895, 7476596.631488529965281 ], [ 543971.598602070007473, 7477042.141102709807456 ], [ 543984.660283060045913, 7477112.140265529975295 ], [ 544003.990012840018608, 7477163.14045783970505 ], [ 544137.380202159984037, 7477130.630485829897225 ], [ 544245.439829859999008, 7477117.1421510996297 ], [ 544398.181233800016344, 7477135.639099080115557 ], [ 544410.870588200050406, 7477129.139150200411677 ], [ 544486.600448949960992, 7477014.139129949733615 ], [ 544517.341558640007861, 7476797.648935760371387 ], [ 544579.53048045001924, 7476504.130518309772015 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16936", "objectid": "16938", "lithstrtno": "4458", "code": "A-FO-xo-a", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Layered mafic and ultramafic sills; coarse-grained pyroxenite overlain by leucocratic gabbro or dolerite; local basal serpentinite; metamorphosed", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous ultramafic intrusive", "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.320359391406, "shape_area": 0.0012670522943900001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 549209.66171369550284, 7473446.765934069640934 ], [ 549227.310927379992791, 7473627.689886249601841 ], [ 549247.909778489964083, 7473964.692137549631298 ], [ 549249.548923820024356, 7474308.690579039976001 ], [ 549238.410781800048426, 7474633.191752339713275 ], [ 549252.850128320045769, 7474996.208536789752543 ], [ 549279.419068390037864, 7475237.699863799847662 ], [ 549312.020508819958195, 7475403.210941050201654 ], [ 549441.609890660038218, 7475898.720854910090566 ], [ 549718.64053223002702, 7476655.231389840133488 ], [ 549771.518295009969734, 7477131.219166809692979 ], [ 549850.877924870001152, 7477501.740025259554386 ], [ 549983.15048365003895, 7477501.740314709953964 ], [ 550062.460199619992636, 7477184.230514120310545 ], [ 550300.528914020047523, 7476470.232370080426335 ], [ 550432.788980519981124, 7475570.72875999007374 ], [ 550485.680286339949816, 7474936.216461749747396 ], [ 550353.399890600005165, 7474116.218901770189404 ], [ 550353.422429812490009, 7473446.765934069640934 ], [ 549209.66171369550284, 7473446.765934069640934 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.7877", "objectid": "7878", "lithstrtno": "4105", "code": "P_-HAw-fr", "unitname": "Woongarra Rhyolite", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Rhyolite rhyodacite rhyolitic breccia and banded iron-formation; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "igneous felsic volcanic", "lithname1": "rhyolite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Woongarra Rhyolite", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2449", "maxuncerty": "3", "min_age_ma": "2445", "minuncerty": "5", "max_age_da": "Isotopic", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.92142801741199998, "shape_area": 0.0021868512288300002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 561992.061383410007693, 7491548.828501519747078 ], [ 562521.079803650034592, 7491443.339907119981945 ], [ 562666.860106543055736, 7491443.341978270560503 ], [ 562666.860106543055736, 7490997.268630385398865 ], [ 562434.020006260019727, 7490960.339716799557209 ], [ 562255.138719380018301, 7490942.341470959596336 ], [ 562111.701183879980817, 7490942.341656750068069 ], [ 561967.689865470048971, 7490957.840596780180931 ], [ 561789.330315939965658, 7490993.841509629972279 ], [ 561447.579118140041828, 7491087.831228899769485 ], [ 561343.999657099950127, 7491106.820366109721363 ], [ 561202.150876770028844, 7491117.830765389837325 ], [ 561058.57812742004171, 7491114.820658599957824 ], [ 560878.559417800046504, 7491095.331193099729717 ], [ 560700.429184500011615, 7491060.818243809975684 ], [ 560526.88127023994457, 7491011.818067179992795 ], [ 559929.459091600030661, 7490792.82088456954807 ], [ 559330.811492510023527, 7490623.799296939745545 ], [ 558764.581863790052012, 7490563.31014512013644 ], [ 558179.327531220042147, 7490528.301644960418344 ], [ 557606.920336249982938, 7490512.298539609648287 ], [ 557149.109579319949262, 7490527.790441599674523 ], [ 556602.428969210013747, 7490568.778313140384853 ], [ 556093.739616920007393, 7490584.269089750014246 ], [ 555521.35792516998481, 7490587.271619060076773 ], [ 555006.431059389957227, 7490628.260786630213261 ], [ 554586.930939109995961, 7490675.261713890358806 ], [ 554212.041539250058122, 7490728.260465569794178 ], [ 553672.048846399993636, 7490845.750289809890091 ], [ 553459.540769950021058, 7490815.750678749755025 ], [ 553048.378829860012047, 7490744.251306530088186 ], [ 552690.860442089964636, 7490601.252312409691513 ], [ 552297.549740719958209, 7490511.749160650186241 ], [ 551356.233513029990718, 7490337.189423720352352 ], [ 551356.233714660047553, 7490337.249311570078135 ], [ 550976.810912359971553, 7490294.53687281999737 ], [ 550574.710670660017058, 7490249.26102614030242 ], [ 550205.918517110054381, 7490207.726119190454483 ], [ 549848.407810820033774, 7490011.218461450189352 ], [ 549687.558985300012864, 7489850.229938889853656 ], [ 549544.481534000020474, 7489653.720123520120978 ], [ 549437.210341510013677, 7489367.220461320132017 ], [ 549562.359360320027918, 7489135.219783149659634 ], [ 549866.299771460006014, 7488831.230419640429318 ], [ 550205.898894299985841, 7488652.238660969771445 ], [ 550581.371146389981732, 7488563.240808730013669 ], [ 550992.346481370041147, 7488343.015108509920537 ], [ 551348.8731804699637, 7488151.95201200991869 ], [ 551348.879236279986799, 7488153.749205430038273 ], [ 552190.307156149996445, 7487704.748273840174079 ], [ 552458.420305559993722, 7487508.259410570375621 ], [ 552762.38842922996264, 7487347.261956869624555 ], [ 554389.201146050007083, 7486632.268889189697802 ], [ 555086.388819269952364, 7486292.778706509619951 ], [ 556319.90044342004694, 7485935.28877651039511 ], [ 556607.551553230034187, 7485875.289830160327256 ], [ 556819.960292669944465, 7485816.791321939788759 ], [ 557410.971217770013027, 7485606.310205210000277 ], [ 557618.360711049987003, 7485548.799116269685328 ], [ 558502.350900650024414, 7485368.811100269667804 ], [ 558823.288362130057067, 7485292.819745820015669 ], [ 559416.111160399974324, 7485121.319079210050404 ], [ 559591.731237130006775, 7485082.821547220461071 ], [ 559770.850210809963755, 7485060.829919259995222 ], [ 559988.580673109972849, 7485053.330759939737618 ], [ 560281.059761279961094, 7485063.327579639852047 ], [ 560646.099169709952548, 7485094.838985750451684 ], [ 561378.661332880030386, 7485181.329030959866941 ], [ 561807.929275420028716, 7485214.352229559794068 ], [ 562666.860106543055736, 7485244.75902686920017 ], [ 562666.860106543055736, 7484752.543935566209257 ], [ 562045.031326589989476, 7484698.357952949590981 ], [ 560960.618532820022665, 7484619.337542350403965 ], [ 560220.029631930054165, 7484672.327784390188754 ], [ 559308.365425799973309, 7484784.212309150025249 ], [ 558712.487350440002047, 7484857.311369420029223 ], [ 557628.01885943999514, 7485201.302174190059304 ], [ 556464.279823770048097, 7485491.791407180018723 ], [ 556105.40838184999302, 7485541.790630529634655 ], [ 555872.959852430038154, 7485631.291738339699805 ], [ 555354.521061060018837, 7485756.290413860231638 ], [ 554853.959906719974242, 7486024.278550979681313 ], [ 554407.080602459958754, 7486131.769226860255003 ], [ 554049.511369140003808, 7486292.771328049711883 ], [ 553602.568778170039877, 7486524.766971509903669 ], [ 553280.832354560028762, 7486703.767619789578021 ], [ 552583.568355859955773, 7487114.748353379778564 ], [ 552297.569548410014249, 7487275.750405360013247 ], [ 552065.191636570030823, 7487418.750326620414853 ], [ 551493.128464640001766, 7487633.249030480161309 ], [ 551347.461202039965428, 7487732.949910280294716 ], [ 551153.438051630044356, 7487865.743341330438852 ], [ 550688.600265090004541, 7488098.239096100442111 ], [ 550313.250286179943942, 7488276.730200399644673 ], [ 549776.920173540012911, 7488455.730471529997885 ], [ 549365.731043579988182, 7488723.719588650390506 ], [ 549079.658860909985378, 7489009.730146840214729 ], [ 548918.779980969964527, 7489260.229725419543684 ], [ 548829.422016810043715, 7489528.210123609751463 ], [ 548883.05092617997434, 7489707.221509889699519 ], [ 548936.638724540011026, 7489850.221444319933653 ], [ 549043.907902959967032, 7490011.218519140034914 ], [ 549204.861118479981087, 7490100.220020210370421 ], [ 549687.550105770002119, 7490279.220335530117154 ], [ 550062.919663849985227, 7490440.229997159913182 ], [ 550545.609055069973692, 7490547.228825179859996 ], [ 550992.539270390057936, 7490583.220552190206945 ], [ 551357.266521550016478, 7490644.027377779595554 ], [ 551421.538080709986389, 7490654.741692890413105 ], [ 552011.551299010054208, 7490726.240335299633443 ], [ 552494.177772370050661, 7490904.748294780030847 ], [ 553012.629012149991468, 7491012.248947810381651 ], [ 553584.681596540031023, 7491101.749320579692721 ], [ 553889.61093282001093, 7491130.761719340458512 ], [ 554601.599390279967338, 7491076.260436410084367 ], [ 555179.999341189977713, 7491002.770095380023122 ], [ 555720.118228579987772, 7490923.777944720350206 ], [ 556656.288962260005064, 7490887.148668210022151 ], [ 557227.069282240001485, 7490864.787604030221701 ], [ 557703.978934710030444, 7490861.789144589565694 ], [ 558231.978382559958845, 7490903.811121249571443 ], [ 558811.25888198998291, 7491008.81138888001442 ], [ 559702.838738769991323, 7491271.312594629824162 ], [ 559976.550313269952312, 7491333.308798779733479 ], [ 560224.870665209949948, 7491408.31000730022788 ], [ 560537.252318589948118, 7491565.818223150447011 ], [ 560987.000516430009156, 7491628.319632159546018 ], [ 561330.888508139993064, 7491654.82883698027581 ], [ 561992.061383410007693, 7491548.828501519747078 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15284", "objectid": "15286", "lithstrtno": "4105", "code": "P_-HAw-fr", "unitname": "Woongarra Rhyolite", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Rhyolite rhyodacite rhyolitic breccia and banded iron-formation; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "igneous felsic volcanic", "lithname1": "rhyolite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Woongarra Rhyolite", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2449", "maxuncerty": "3", "min_age_ma": "2445", "minuncerty": "5", "max_age_da": "Isotopic", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 3.1699326943199999, "shape_area": 0.0245273556097 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7507284.364434811286628 ], [ 515727.401673869986553, 7507294.44228694960475 ], [ 516077.559980659978464, 7507374.940313899889588 ], [ 516567.649635889916681, 7507461.461209960281849 ], [ 516974.989065799978562, 7507529.450941889546812 ], [ 517617.678937539923936, 7507621.458239920437336 ], [ 517884.809234520071186, 7507626.45950067974627 ], [ 518845.808005279977806, 7507697.980592619627714 ], [ 519692.141436650010291, 7507777.478591890074313 ], [ 520459.120535549998749, 7507962.499755850061774 ], [ 521252.569250860018656, 7508095.008492359891534 ], [ 522046.009716300060973, 7508306.518230189569294 ], [ 522495.619599479949102, 7508412.019790690392256 ], [ 523447.751102910027839, 7508491.531642080284655 ], [ 524135.411504069983494, 7508571.05088615976274 ], [ 524796.650109110050835, 7508809.060238439589739 ], [ 525537.161682610050775, 7508888.560437959618866 ], [ 526304.178405749960802, 7509047.079424640163779 ], [ 527150.572323399945162, 7509258.600825910456479 ], [ 527891.170337439980358, 7509549.630575990304351 ], [ 528759.181210299953818, 7509752.148616939783096 ], [ 529408.909576560021378, 7509934.658954329788685 ], [ 530282.090520340017974, 7510219.191589759662747 ], [ 531297.329562349943444, 7510503.211238949559629 ], [ 532292.230620560003445, 7510767.219354189932346 ], [ 533510.480061769951135, 7511234.208642659708858 ], [ 534079.009040210046805, 7511478.210979480296373 ], [ 534870.880958189954981, 7511559.220930890180171 ], [ 535845.449424559948966, 7511457.710090230219066 ], [ 536515.48107646999415, 7511295.209174829535186 ], [ 537266.720861639943905, 7511153.20205038972199 ], [ 538322.440249609993771, 7510706.688930760137737 ], [ 538626.999142840038985, 7510523.679197969846427 ], [ 538972.159902979969047, 7509914.689756290055811 ], [ 539114.237828589975834, 7509528.669906909577549 ], [ 539134.550768380053341, 7509041.669524259865284 ], [ 539012.7302670100471, 7508493.181885650381446 ], [ 538586.329662399948575, 7507965.169740119948983 ], [ 538180.211560850031674, 7507599.671520809642971 ], [ 537631.980831310036592, 7507214.168417110107839 ], [ 537428.930559089989401, 7507011.171658460050821 ], [ 537002.52044387999922, 7506686.161332639865577 ], [ 536616.771521440008655, 7506544.169201100245118 ], [ 535743.688247720012441, 7506361.159436600282788 ], [ 534931.557807549950667, 7506158.158888090401888 ], [ 534038.1795864100568, 7505813.147930650040507 ], [ 533489.917933249962516, 7505488.139462489634752 ], [ 533022.90101448004134, 7505082.130395379848778 ], [ 532495.011441659997217, 7504737.120717509649694 ], [ 531906.171165960025974, 7504513.618821060284972 ], [ 530728.50931001000572, 7504046.609459710307419 ], [ 530456.141345420037396, 7503904.60914792958647 ], [ 530330.938629699987359, 7504034.600131249986589 ], [ 529716.559640730032697, 7503911.601014990359545 ], [ 529213.502345059998333, 7503780.581910129636526 ], [ 528797.900004970026202, 7503627.080213760025799 ], [ 527507.377630549948663, 7503343.059446619823575 ], [ 526960.550516100018285, 7503255.548426319845021 ], [ 526610.599389689974487, 7503255.540216240100563 ], [ 526129.429774809977971, 7503146.04971828032285 ], [ 525298.209493739996105, 7503146.041082710027695 ], [ 524313.980666519957595, 7502993.020090309903026 ], [ 522979.729673549998552, 7502796.00996265001595 ], [ 521973.58024351997301, 7502730.490436179563403 ], [ 520967.450855030037928, 7502533.48075976036489 ], [ 519573.797612160036806, 7502354.695541289635003 ], [ 518734.541179510008078, 7502246.968182840384543 ], [ 518147.140985219972208, 7502100.460410409606993 ], [ 517439.452265210042242, 7501894.939140919595957 ], [ 517626.978287780017126, 7501568.438148479908705 ], [ 517493.280382250086404, 7501530.939766810275614 ], [ 517041.529127980000339, 7501482.438852850347757 ], [ 516806.139175439951941, 7501470.929028630256653 ], [ 516513.439839239930734, 7501427.929280590265989 ], [ 516208.029622350004502, 7501404.430479659698904 ], [ 515687.31005864002509, 7501381.228581719100475 ], [ 515687.31005864002509, 7501854.524165705777705 ], [ 515739.549064819933847, 7501845.9300237596035 ], [ 516241.760339149972424, 7501804.929461900144815 ], [ 516636.078343549917918, 7501815.939950410276651 ], [ 517068.967790280003101, 7501902.438979189842939 ], [ 517381.030367530067451, 7501996.450458600185812 ], [ 516985.409341790014878, 7502432.939720500260592 ], [ 516863.05789255007403, 7502589.942326080054045 ], [ 517080.599171089997981, 7502644.356281739659607 ], [ 517652.700889169995207, 7502787.440623049624264 ], [ 518363.340637009998318, 7502949.95782564021647 ], [ 518992.720304229937028, 7503112.471846310421824 ], [ 519500.350147699995432, 7503193.482631060294807 ], [ 520271.900280739995651, 7503274.97976098023355 ], [ 520982.51921596005559, 7503437.480494789779186 ], [ 521754.828933689976111, 7503561.49910281971097 ], [ 522673.508125049993396, 7503780.507541339844465 ], [ 523439.03043066005921, 7503868.018290109932423 ], [ 525079.511674160021357, 7504086.528897769749165 ], [ 526041.911488050012849, 7504086.540897079743445 ], [ 527157.42773378000129, 7504239.557840440422297 ], [ 528710.430082709994167, 7504589.578082759864628 ], [ 529322.881041220040061, 7504699.101350129581988 ], [ 529519.738315970054828, 7504721.101395370438695 ], [ 529782.189706749981269, 7504852.111618340015411 ], [ 529846.579264719970524, 7505018.110530230216682 ], [ 530434.150448080035858, 7505322.119503930211067 ], [ 531001.421949689975008, 7505585.119388460181653 ], [ 531730.780776569969021, 7505767.629514589905739 ], [ 531892.838277079979889, 7505828.631136720068753 ], [ 532231.098419170011766, 7506036.13034437969327 ], [ 532535.66227497998625, 7506280.128463479690254 ], [ 533205.688455870025791, 7506665.63972613029182 ], [ 533571.211581630050205, 7506929.661227500066161 ], [ 534139.712190150050446, 7507214.159917029552162 ], [ 534444.310595639981329, 7507356.160217549651861 ], [ 534769.160987279959954, 7507478.167769909836352 ], [ 534911.291675420012325, 7507518.669675059616566 ], [ 535114.321285499958321, 7507640.660739 ], [ 535236.120806129998527, 7507823.178549899719656 ], [ 535358.021751470048912, 7508351.180761110037565 ], [ 535520.509332970017567, 7508594.687963870353997 ], [ 535743.819436899968423, 7508818.17833917029202 ], [ 536007.749962339992635, 7508980.679477440193295 ], [ 536576.257994789979421, 7509386.678368129767478 ], [ 536718.417728489963338, 7509630.19065823033452 ], [ 536637.239427529973909, 7509975.691391319967806 ], [ 536393.608924590051174, 7510158.201416499912739 ], [ 536028.131239549955353, 7510219.199188100174069 ], [ 535540.809031330049038, 7510219.199873119592667 ], [ 534627.20182425994426, 7510239.690441120415926 ], [ 534200.742349050007761, 7510219.191578520461917 ], [ 533875.92854063003324, 7510158.20165743958205 ], [ 533307.420549900038168, 7509955.199741209857166 ], [ 532718.621047309949063, 7509792.699682730250061 ], [ 531297.251988389994949, 7509264.678162580356002 ], [ 530525.700181809952483, 7509021.159533250145614 ], [ 529551.019780109985732, 7508858.651383410207927 ], [ 528251.497776060015894, 7508655.620795699767768 ], [ 527134.711085689952597, 7508351.099182499572635 ], [ 525794.590079659945332, 7508066.557996190153062 ], [ 524596.650707719963975, 7507782.540694549679756 ], [ 523662.659097680007108, 7507681.038180800154805 ], [ 522830.179916460008826, 7507498.029714879579842 ], [ 522038.308340209943708, 7507295.018886250443757 ], [ 520677.948256989999209, 7507010.999082010239363 ], [ 519662.739749950007536, 7506929.487592220306396 ], [ 518548.659981289994903, 7506807.981043729931116 ], [ 518147.55064301006496, 7506708.468301449902356 ], [ 517281.418690250022337, 7506445.959485289640725 ], [ 516873.740797090053093, 7506307.96147646009922 ], [ 516466.369054429931566, 7506220.949263669550419 ], [ 515906.289625330013223, 7506134.93883580993861 ], [ 515687.31005864002509, 7506092.979791475459933 ], [ 515687.31005864002509, 7507284.364434811286628 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15981", "objectid": "15983", "lithstrtno": "4104", "code": "P_-HAo-ci", "unitname": "Boolgeeda Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Fine-grained finely laminated iron-formation mudstone siltstone and chert; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Boolgeeda Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2445", "maxuncerty": "5", "min_age_ma": "2445", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.79044154896300001, "shape_area": 0.0026293850775400002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7506092.979791475459933 ], [ 515906.289625330013223, 7506134.93883580993861 ], [ 516466.369054429931566, 7506220.949263669550419 ], [ 516873.740797089994885, 7506307.96147646009922 ], [ 517281.418690250022337, 7506445.959485289640725 ], [ 518147.550643010006752, 7506708.468301449902356 ], [ 518548.659981289994903, 7506807.981043729931116 ], [ 519662.739749950007536, 7506929.487592220306396 ], [ 520677.948256989999209, 7507010.999082010239363 ], [ 522038.308340209943708, 7507295.018886250443757 ], [ 522830.179916460008826, 7507498.029714879579842 ], [ 523662.659097680007108, 7507681.038180800154805 ], [ 524596.650707719963975, 7507782.540694549679756 ], [ 525794.590079659945332, 7508066.557996190153062 ], [ 527134.711085689952597, 7508351.099182499572635 ], [ 528251.497776060015894, 7508655.620795699767768 ], [ 529551.019780109985732, 7508858.651383410207927 ], [ 530525.700181809952483, 7509021.159533250145614 ], [ 531297.251988389994949, 7509264.678162580356002 ], [ 532718.621047309949063, 7509792.699682730250061 ], [ 533307.420549900038168, 7509955.199741209857166 ], [ 533875.92854063003324, 7510158.20165743958205 ], [ 534200.742349050007761, 7510219.191578520461917 ], [ 534627.20182425994426, 7510239.690441120415926 ], [ 535540.809031330049038, 7510219.199873119592667 ], [ 536028.131239549955353, 7510219.199188100174069 ], [ 536393.608924590051174, 7510158.201416499912739 ], [ 536637.239427529973909, 7509975.691391319967806 ], [ 536718.417728489963338, 7509630.19065823033452 ], [ 536576.257994789979421, 7509386.678368129767478 ], [ 536007.749962339992635, 7508980.679477440193295 ], [ 535743.819436899968423, 7508818.17833917029202 ], [ 535520.509332970017567, 7508594.687963870353997 ], [ 535358.021751470048912, 7508351.180761110037565 ], [ 535236.120806129998527, 7507823.178549899719656 ], [ 535114.321285499958321, 7507640.660739 ], [ 534911.291675420012325, 7507518.669675059616566 ], [ 534769.160987279959954, 7507478.167769909836352 ], [ 534444.310595639981329, 7507356.160217549651861 ], [ 534139.712190150050446, 7507214.159917029552162 ], [ 533571.211581630050205, 7506929.661227500066161 ], [ 533205.688455870025791, 7506665.63972613029182 ], [ 532535.66227497998625, 7506280.128463479690254 ], [ 532231.098419170011766, 7506036.13034437969327 ], [ 531892.838277079979889, 7505828.631136720068753 ], [ 531730.780776569969021, 7505767.629514589905739 ], [ 531001.421949689975008, 7505585.119388460181653 ], [ 530434.150448080035858, 7505322.119503930211067 ], [ 529846.579264719970524, 7505018.110530230216682 ], [ 529782.189706749981269, 7504852.111618340015411 ], [ 529519.738315970054828, 7504721.101395370438695 ], [ 529322.881041220040061, 7504699.101350129581988 ], [ 528710.430082709994167, 7504589.578082759864628 ], [ 527157.42773378000129, 7504239.557840440422297 ], [ 526041.911488050012849, 7504086.540897079743445 ], [ 525079.511674160021357, 7504086.528897769749165 ], [ 523439.03043066005921, 7503868.018290109932423 ], [ 522673.508125049993396, 7503780.507541339844465 ], [ 521754.828933689976111, 7503561.49910281971097 ], [ 520982.51921596005559, 7503437.480494789779186 ], [ 520271.900280739995651, 7503274.97976098023355 ], [ 519500.350147699995432, 7503193.482631060294807 ], [ 518992.720304229995236, 7503112.471846310421824 ], [ 518363.340637009998318, 7502949.95782564021647 ], [ 517652.700889169995207, 7502787.440623049624264 ], [ 517080.599171089997981, 7502644.356281739659607 ], [ 516863.057892550015822, 7502589.942326080054045 ], [ 516559.528845859982539, 7502992.442232459783554 ], [ 517327.8402004900272, 7503193.448910360224545 ], [ 518160.282295580022037, 7503355.949978579767048 ], [ 519297.311057329992764, 7503599.468447639606893 ], [ 519947.010635969985742, 7503700.980550330132246 ], [ 520414.019579010026064, 7503782.489781250245869 ], [ 521098.648917799990159, 7503867.990412909537554 ], [ 523067.199196270026732, 7504217.511165929958224 ], [ 525210.731001010048203, 7504567.529698389582336 ], [ 526654.369699290022254, 7504655.06131970975548 ], [ 528426.11156214994844, 7505027.081078560091555 ], [ 529279.140169459977187, 7505442.599590890109539 ], [ 530175.980050690006465, 7506011.619548610411584 ], [ 530875.899837580043823, 7506317.632908140309155 ], [ 531685.219599460018799, 7506755.138321680016816 ], [ 532866.420069309999235, 7507455.161494229920208 ], [ 533041.409982310025953, 7507717.67045971006155 ], [ 533107.019451310043223, 7508045.669424450024962 ], [ 533085.151903329999186, 7508308.168893829919398 ], [ 532932.108606930007227, 7508483.171749169938266 ], [ 532538.352077750023454, 7508548.677518219687045 ], [ 532013.401035169954412, 7508548.669753519818187 ], [ 531357.270649209967814, 7508395.667834320105612 ], [ 530263.531104409950785, 7508220.649868439882994 ], [ 529344.831691039958969, 7507958.1297348998487 ], [ 528098.008845529984683, 7507783.099712680093944 ], [ 526916.841063459985889, 7507564.581700350157917 ], [ 525888.777275269967504, 7507345.559387769550085 ], [ 524292.058388389996253, 7507105.036800029687583 ], [ 521798.578427009982988, 7506667.508674659766257 ], [ 519283.228955679980572, 7506382.979115700349212 ], [ 518708.470003649999853, 7506299.990632159635425 ], [ 518079.051595150027424, 7506117.46876826044172 ], [ 517530.849081900028978, 7505975.462046549655497 ], [ 516820.229322989995126, 7505812.951413069851696 ], [ 515987.729986529971939, 7505650.451000420376658 ], [ 515687.31005864002509, 7505599.152506510727108 ], [ 515687.31005864002509, 7506092.979791475459933 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14798", "objectid": "14800", "lithstrtno": "4068", "code": "P_-TK-s", "unitname": "Turee Creek Group", "gswastatus": "Formal", "rank": "Group", "descriptn": "Mudstone siltstone sandstone conglomerate dolomite; minor diamictite limestone and iron formation; intruded by Balgara Dolerite sills", "parentcode": "AP_-MB-xb-c", "parentname": "Mount Bruce Supergroup", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Turee Creek Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Turee Creek Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2445", "maxuncerty": null, "min_age_ma": "2208", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.0280733528699999, "shape_area": 0.0120461465574 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 526916.841063459985889, 7507564.581700350157917 ], [ 528098.008845529984683, 7507783.099712680093944 ], [ 529344.831691039958969, 7507958.1297348998487 ], [ 530263.531104409950785, 7508220.649868439882994 ], [ 531357.270649209967814, 7508395.667834320105612 ], [ 532013.401035169954412, 7508548.669753519818187 ], [ 532538.352077750023454, 7508548.677518219687045 ], [ 532932.108606930007227, 7508483.171749169938266 ], [ 533085.151903329999186, 7508308.168893829919398 ], [ 533107.019451310043223, 7508045.669424450024962 ], [ 533041.409982310025953, 7507717.67045971006155 ], [ 532866.420069309999235, 7507455.161494229920208 ], [ 531685.219599460018799, 7506755.138321680016816 ], [ 530875.899837580043823, 7506317.632908140309155 ], [ 530175.980050690006465, 7506011.619548610411584 ], [ 529279.140169459977187, 7505442.599590890109539 ], [ 528426.11156214994844, 7505027.081078560091555 ], [ 526654.369699290022254, 7504655.06131970975548 ], [ 525210.731001010048203, 7504567.529698389582336 ], [ 523067.199196270026732, 7504217.511165929958224 ], [ 521098.648917799990159, 7503867.990412909537554 ], [ 520414.019579010026064, 7503782.489781250245869 ], [ 519947.010635969985742, 7503700.980550330132246 ], [ 519297.311057329992764, 7503599.468447639606893 ], [ 518160.282295580022037, 7503355.949978579767048 ], [ 517327.8402004900272, 7503193.448910360224545 ], [ 516559.528845859982539, 7502992.442232459783554 ], [ 516863.05789255007403, 7502589.942326080054045 ], [ 516985.409341790014878, 7502432.939720500260592 ], [ 516678.098510309995618, 7502381.430084919556975 ], [ 515987.759246180008631, 7502401.430705550126731 ], [ 515687.31005864002509, 7502462.967454206198454 ], [ 515687.31005864002509, 7505599.152506510727108 ], [ 515987.729986529971939, 7505650.451000420376658 ], [ 516820.229322989995126, 7505812.951413069851696 ], [ 517530.849081900028978, 7505975.462046549655497 ], [ 518079.051595150027424, 7506117.46876826044172 ], [ 518708.470003649999853, 7506299.990632159635425 ], [ 519283.228955679980572, 7506382.979115700349212 ], [ 521798.578427009982988, 7506667.508674659766257 ], [ 524292.058388389996253, 7507105.036800029687583 ], [ 525888.777275269967504, 7507345.559387769550085 ], [ 526916.841063459985889, 7507564.581700350157917 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15982", "objectid": "15984", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.158855733587, "shape_area": 0.00025443351231099997 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 518908.579403460025787, 7498264.440973529592156 ], [ 518634.320034599979408, 7498094.449079169891775 ], [ 518378.750043659994844, 7497847.439117729663849 ], [ 518052.658892910054419, 7497479.929860760457814 ], [ 517847.879607070004568, 7497213.920483809895813 ], [ 517473.779419790022075, 7497665.421633450314403 ], [ 517576.339326519984752, 7497748.931734690442681 ], [ 518083.560259499994572, 7498211.439638 ], [ 518466.130403210001532, 7498460.429988720454276 ], [ 518804.271018920000643, 7498665.439835360273719 ], [ 519198.908855680027045, 7498812.449021300300956 ], [ 519142.373424510005862, 7498952.95056237000972 ], [ 519103.091585670015775, 7499079.938515899702907 ], [ 519637.339709100022446, 7499435.950325359590352 ], [ 520226.328942429972813, 7499730.461817169561982 ], [ 520656.728255619993433, 7499911.97177623026073 ], [ 521177.758416139986366, 7500024.971386150456965 ], [ 521744.101620649977122, 7500092.981452509760857 ], [ 522262.589272340002935, 7500072.48211217019707 ], [ 522854.101535509980749, 7500070.49063022993505 ], [ 523397.800140250008553, 7500183.491012180224061 ], [ 524248.587900620012078, 7500447.019791600294411 ], [ 524512.801641589961946, 7500182.007559839636087 ], [ 524463.09924496000167, 7500175.499866460449994 ], [ 523807.080191819986794, 7499963.000741709955037 ], [ 523539.32880095008295, 7499824.488559490069747 ], [ 523297.169660909974482, 7499723.988046020269394 ], [ 522960.039467710012104, 7499706.491441669873893 ], [ 522349.829996639920864, 7499766.980938440188766 ], [ 522165.428285450034309, 7499767.980588540434837 ], [ 521783.759064020006917, 7499750.978217979893088 ], [ 521446.58837318001315, 7499727.479032450355589 ], [ 521058.238675899978261, 7499640.459560570307076 ], [ 520701.558828630018979, 7499521.471808220259845 ], [ 520204.509207860042807, 7499313.960170620121062 ], [ 519841.059423100028653, 7499099.460949829779565 ], [ 519560.629718000011053, 7498905.449083999730647 ], [ 519252.201017629995476, 7498679.95235482044518 ], [ 519335.661807239986956, 7498472.439554899930954 ], [ 518908.579403460025787, 7498264.440973529592156 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15983", "objectid": "15985", "lithstrtno": "2257", "code": "A-HAd-kd", "unitname": "Wittenoom Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Thinly bedded dolomite and dolomitic shale with minor black chert shale banded iron formation and sandstone", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary carbonate", "lithname1": "dolostone/dolomite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Wittenoom Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2597", "maxuncerty": "5", "min_age_ma": "2504", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.12278604736400001, "shape_area": 0.00028217936251099997 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 521328.899037259980105, 7500656.480679200030863 ], [ 521600.978795, 7500716.479862280189991 ], [ 522066.440767369989771, 7500347.990559520199895 ], [ 522262.589272340002935, 7500072.48211217019707 ], [ 521744.101620649977122, 7500092.981452509760857 ], [ 521177.758416139986366, 7500024.971386150456965 ], [ 520656.728255619993433, 7499911.97177623026073 ], [ 520226.328942429972813, 7499730.461817169561982 ], [ 519637.339709100022446, 7499435.950325359590352 ], [ 519103.091585670015775, 7499079.938515899702907 ], [ 519142.373424510005862, 7498952.95056237000972 ], [ 519198.908855680027045, 7498812.449021300300956 ], [ 518804.271018920000643, 7498665.439835360273719 ], [ 518466.130403210001532, 7498460.429988720454276 ], [ 518083.560259499994572, 7498211.439638 ], [ 517576.339326519984752, 7497748.931734690442681 ], [ 517473.779419790022075, 7497665.421633450314403 ], [ 516997.112233689986169, 7498099.42919669020921 ], [ 517461.881108669971582, 7498453.430531879886985 ], [ 517877.940137110010255, 7498746.941773089580238 ], [ 518342.972217280010227, 7499040.940498439595103 ], [ 518930.35734212998068, 7499358.950494660064578 ], [ 519006.429596919973847, 7499391.451385060325265 ], [ 518959.7393457100261, 7499542.451161010190845 ], [ 519321.979867429996375, 7499823.947971889749169 ], [ 519713.530612269998528, 7500191.470446850173175 ], [ 520251.981200859998353, 7500460.470861679874361 ], [ 520790.429984660004266, 7500582.969375729560852 ], [ 521328.899037259980105, 7500656.480679200030863 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.15988", "objectid": "15990", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.25099304321799998, "shape_area": 0.00057424801056 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 516446.690742139995564, 7498643.431208970025182 ], [ 516399.80081337998854, 7498690.920674299821258 ], [ 516752.109791999973822, 7498820.421163430437446 ], [ 517682.119090339983813, 7499358.941561980172992 ], [ 518293.999550679989625, 7499579.442325529642403 ], [ 518636.630131700017955, 7499603.948979339562356 ], [ 518912.270378570014145, 7499695.460613200441003 ], [ 518839.308721749985125, 7499930.939910479821265 ], [ 519069.999476659984794, 7500108.460693730041385 ], [ 519372.288886139984243, 7500431.949672809801996 ], [ 519631.441732620005496, 7500691.461144080385566 ], [ 519976.910060780006461, 7500799.467891490086913 ], [ 520473.579158, 7500907.472074420191348 ], [ 521543.439776370010804, 7501077.536889360286295 ], [ 522373.881059199979063, 7501209.489694490097463 ], [ 523090.591946310014464, 7501408.48978086002171 ], [ 523576.890120199997909, 7501033.501141640357673 ], [ 523814.809190919972025, 7500861.501062080264091 ], [ 524403.068835210055113, 7500914.508251939900219 ], [ 525518.201257530017756, 7500983.103860430419445 ], [ 526591.381750919972546, 7501049.041682800278068 ], [ 528009.380023929988965, 7501104.558906380087137 ], [ 527430.069593699998222, 7500795.549122979864478 ], [ 526591.889810179942288, 7500682.031155990436673 ], [ 525549.851323970011435, 7500614.030079290270805 ], [ 525164.741490110056475, 7500478.010388390161097 ], [ 524717.158815650036559, 7500210.008445120416582 ], [ 524512.801641589961946, 7500182.007559839636087 ], [ 524248.587900620012078, 7500447.019791600294411 ], [ 523397.800140250008553, 7500183.491012180224061 ], [ 522854.101535509980749, 7500070.49063022993505 ], [ 522262.589272340002935, 7500072.48211217019707 ], [ 522066.440767369989771, 7500347.990559520199895 ], [ 521600.978795, 7500716.479862280189991 ], [ 521328.899037259980105, 7500656.480679200030863 ], [ 520790.429984660004266, 7500582.969375729560852 ], [ 520251.981200859998353, 7500460.470861679874361 ], [ 519713.530612269998528, 7500191.470446850173175 ], [ 519321.979867429996375, 7499823.947971889749169 ], [ 518959.7393457100261, 7499542.451161010190845 ], [ 519006.429596919973847, 7499391.451385060325265 ], [ 518930.35734212998068, 7499358.950494660064578 ], [ 518342.972217280010227, 7499040.940498439595103 ], [ 517877.940137110010255, 7498746.941773089580238 ], [ 517461.881108669971582, 7498453.430531879886985 ], [ 516997.112233689986169, 7498099.42919669020921 ], [ 516885.902088599978015, 7498199.429791740141809 ], [ 516446.690742139995564, 7498643.431208970025182 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.7875", "objectid": "7876", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 0.94115175683300001, "shape_area": 0.0026079233351200002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 552461.869387940037996, 7485130.261249019764364 ], [ 553299.030578140052967, 7484648.280572880059481 ], [ 554199.290736960014328, 7484058.279978320002556 ], [ 555890.978131970041431, 7482756.780634730122983 ], [ 557462.729210410034284, 7481615.291048490442336 ], [ 558166.318415640038438, 7481134.301850469782948 ], [ 558495.691402100026608, 7480910.312827819958329 ], [ 558945.300989239942282, 7480407.810311909765005 ], [ 559447.810751999961212, 7479693.820964760147035 ], [ 560135.491078190039843, 7478900.317874279804528 ], [ 560426.431284490041435, 7478582.820712439715862 ], [ 560770.249323150026612, 7478159.841215039603412 ], [ 560849.620869579957798, 7477524.841734640300274 ], [ 560690.949486859957688, 7477048.840362769551575 ], [ 560611.57851814001333, 7476731.339792679995298 ], [ 560638.070735429995693, 7476334.832341159693897 ], [ 560770.241452359943651, 7475990.848633529618382 ], [ 560928.940531059983186, 7475620.339508170261979 ], [ 561219.878350600018166, 7475276.850051529705524 ], [ 561616.650867559947073, 7474853.339500810019672 ], [ 561881.149548829998821, 7474430.329383400268853 ], [ 561907.560773620032705, 7474006.840184009633958 ], [ 561563.771348390029743, 7473504.338690780103207 ], [ 561550.468092117458582, 7473446.765934069640934 ], [ 560826.793062305427156, 7473446.765934069640934 ], [ 560835.080332349985838, 7474022.851079889573157 ], [ 560747.990340759977698, 7474430.849786610342562 ], [ 560603.88147336000111, 7474870.850602730177343 ], [ 560358.740260210004635, 7475483.342136479914188 ], [ 560232.808540910016745, 7475744.850065840408206 ], [ 560043.638665909995325, 7476083.33965312037617 ], [ 559898.918661569943652, 7476408.340487170033157 ], [ 559843.110859469976276, 7476701.840296889655292 ], [ 559870.578330309945159, 7477127.825745229609311 ], [ 559941.869839449995197, 7477413.839102909900248 ], [ 560000.63984713004902, 7477719.318579459562898 ], [ 559970.361824939958751, 7478050.32086979970336 ], [ 559882.373260110034607, 7478260.830046719871461 ], [ 559529.190361369983293, 7478886.309631819836795 ], [ 559408.93108398001641, 7479001.821175940334797 ], [ 559301.230240639997646, 7479091.310507340356708 ], [ 559073.070471100043505, 7479245.320975399576128 ], [ 558162.910846160026267, 7480427.790963140316308 ], [ 557005.000187280005775, 7481649.799908259883523 ], [ 555585.872745560016483, 7482764.780236049555242 ], [ 553994.731696769944392, 7483836.269434520043433 ], [ 552567.438844150048681, 7484595.270084340125322 ], [ 551577.239460229990073, 7484982.252649479545653 ], [ 551338.549904590006918, 7485090.061955739744008 ], [ 551338.5497821100289, 7485090.025646439753473 ], [ 549851.188989539979957, 7485761.741123080253601 ], [ 548225.680131730041467, 7486292.730476760305464 ], [ 546587.230142600019462, 7486772.721792650409043 ], [ 544574.599058820051141, 7487458.188967909663916 ], [ 543469.998219090048224, 7487871.180351009592414 ], [ 542340.530504659982398, 7488386.659122560173273 ], [ 541719.809467370039783, 7488918.160171950235963 ], [ 541239.63983072002884, 7489576.641609819605947 ], [ 541734.628457920043729, 7489299.554097919724882 ], [ 541894.312351180007681, 7489210.159689630381763 ], [ 542571.512399810017087, 7488831.160668919794261 ], [ 543840.309419329976663, 7488181.178546589799225 ], [ 544875.02778613998089, 7487774.691257519647479 ], [ 546577.260286420001648, 7487345.218131000176072 ], [ 547917.222122960025445, 7486949.728884840384126 ], [ 549154.91041516000405, 7486446.740225279703736 ], [ 549901.131908909999765, 7486170.605126890353858 ], [ 551180.02149674994871, 7485697.249936619773507 ], [ 551340.358837340027094, 7485626.337629109621048 ], [ 552461.869387940037996, 7485130.261249019764364 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4684", "objectid": "4684", "lithstrtno": "4113", "code": "P_-HAb-cib", "unitname": "Brockman Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Banded iron-formation chert mudstone and siltstone; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Brockman Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2494", "maxuncerty": null, "min_age_ma": "2451", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.87832495115, "shape_area": 0.0176099604819 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7476861.29614201374352 ], [ 562548.12923551001586, 7477176.840552739799023 ], [ 562499.051775350002572, 7477559.349274420179427 ], [ 562405.520149050047621, 7477941.359709770418704 ], [ 562305.249252759967931, 7478260.338304109871387 ], [ 562217.750590660027228, 7478572.839649910107255 ], [ 562060.639919589972124, 7478961.839952230453491 ], [ 561897.041405549971387, 7479338.339646079577506 ], [ 561720.549841640051454, 7479663.841516169719398 ], [ 561555.988813429954462, 7479823.83794873021543 ], [ 561282.990936969988979, 7479926.841339250095189 ], [ 561073.599140699952841, 7480023.831344950012863 ], [ 560819.990342710050754, 7480190.341357300058007 ], [ 560579.309177830000408, 7480382.829210110008717 ], [ 560332.309257369954139, 7480606.831241140142083 ], [ 560034.599146069958806, 7480850.329705360345542 ], [ 559388.251004809979349, 7481331.31110505014658 ], [ 558855.848585069994442, 7481709.810595990158617 ], [ 558811.488468160037883, 7481735.312533549964428 ], [ 558653.169789870036766, 7481869.807492359541357 ], [ 558526.340702550020069, 7481959.810445980168879 ], [ 558247.428242309950292, 7482145.80981088988483 ], [ 557702.1606820699526, 7482479.788011509925127 ], [ 557144.29002588998992, 7482858.30011445004493 ], [ 556339.359097260050476, 7483422.790656579658389 ], [ 555008.228967749979347, 7484327.279931530356407 ], [ 554557.948378719971515, 7484597.28947607986629 ], [ 554221.658450940041803, 7484745.277343910187483 ], [ 553859.379547549993731, 7484798.279873340390623 ], [ 553579.438505909987725, 7484774.269393079914153 ], [ 553299.030578140052967, 7484648.280572880059481 ], [ 552461.869387940037996, 7485130.261249019764364 ], [ 551340.358837340027094, 7485626.337629109621048 ], [ 551180.02149674994871, 7485697.249936619773507 ], [ 549901.131908909999765, 7486170.605126890353858 ], [ 549154.91041516000405, 7486446.740225279703736 ], [ 547917.222122960025445, 7486949.728884840384126 ], [ 546577.260286420001648, 7487345.218131000176072 ], [ 544875.02778613998089, 7487774.691257519647479 ], [ 543840.309419329976663, 7488181.178546589799225 ], [ 542571.512399810017087, 7488831.160668919794261 ], [ 542400.79943162004929, 7489029.160934429615736 ], [ 542350.679909239988774, 7489195.167987239547074 ], [ 542344.31951180996839, 7489195.168274519965053 ], [ 542300.359836720046587, 7489303.658677879720926 ], [ 542256.640922829974443, 7489469.161055089905858 ], [ 542245.318502080044709, 7489762.16108509991318 ], [ 542278.430744110024534, 7490048.159758640453219 ], [ 542387.871132510015741, 7490321.159055279567838 ], [ 542592.310546300024725, 7490517.651349290274084 ], [ 542815.35845373000484, 7490624.660747840069234 ], [ 543038.320503570022993, 7490699.670249789953232 ], [ 543420.678319129976444, 7490869.658592940308154 ], [ 543918.322316259960644, 7491197.669856980443001 ], [ 544135.618549510021694, 7491432.161117110401392 ], [ 544238.378264619968832, 7491635.160393830388784 ], [ 544315.018133740057237, 7491692.172029820270836 ], [ 544585.511445099953562, 7491365.671757680363953 ], [ 544708.960547090042382, 7491509.670096930116415 ], [ 544828.010475110029802, 7491628.65930688008666 ], [ 545036.390950290020555, 7491777.160529489628971 ], [ 545304.281155009986833, 7491926.159265699796379 ], [ 546018.689793150057085, 7492283.65813267044723 ], [ 546524.778901990037411, 7492402.66767456009984 ], [ 546971.279514390043914, 7492432.179934759624302 ], [ 547358.208265290013514, 7492402.689256370067596 ], [ 547774.959186000050977, 7492343.190372839570045 ], [ 548668.010057860054076, 7492343.208312249742448 ], [ 549174.018445470021106, 7492372.700973270460963 ], [ 549501.460381799959578, 7492462.198465449735522 ], [ 549769.408589369966649, 7492521.710005650296807 ], [ 550126.58004432998132, 7492700.209701140411198 ], [ 550692.171366530004889, 7492878.708934020251036 ], [ 551227.969715739949606, 7492938.220353459939361 ], [ 551364.966591530013829, 7492932.324395109899342 ], [ 551912.660673990030773, 7492908.741091069765389 ], [ 552775.930030860006809, 7492670.73900244012475 ], [ 554383.360805099946447, 7492759.761629750020802 ], [ 554948.919062659959309, 7492730.262764049693942 ], [ 555514.499594919965602, 7492789.759422839619219 ], [ 556080.120245069963858, 7492968.260365390218794 ], [ 556556.361293209949508, 7493087.269083140417933 ], [ 557032.688999920035712, 7493146.780197789892554 ], [ 557508.909998000017367, 7493295.788291630335152 ], [ 558044.729297060053796, 7493444.7886360604316 ], [ 558461.5013462100178, 7493623.279629110358655 ], [ 558997.299511149991304, 7493801.793448559939861 ], [ 559314.809575189952739, 7493920.801283299922943 ], [ 559791.570562480017543, 7493873.80110920034349 ], [ 560930.54918336996343, 7494014.308365819975734 ], [ 561445.871286730049178, 7494055.810433239676058 ], [ 562017.86825298005715, 7493989.310636560432613 ], [ 562666.860106543055736, 7493948.500266523100436 ], [ 562666.860106543055736, 7492719.446714281104505 ], [ 562519.63842960994225, 7492724.33079618960619 ], [ 561126.260707290028222, 7492651.320399310439825 ], [ 559952.941987609956414, 7492467.79866745043546 ], [ 558926.241475829971023, 7492284.289813860319555 ], [ 557862.92075577005744, 7491917.791419030167162 ], [ 556799.610155759961344, 7491734.270272320136428 ], [ 555517.924562950036488, 7491690.303761900402606 ], [ 554672.931208909954876, 7491661.258393780328333 ], [ 553389.608255989965983, 7491734.250089040026069 ], [ 552509.628818519995548, 7491697.7503981301561 ], [ 551886.299605170032009, 7491661.230382160283625 ], [ 551360.246637489995919, 7491529.420138870365918 ], [ 550896.279859749949537, 7491404.231776890344918 ], [ 549612.929414979997091, 7491257.708402830176055 ], [ 548806.299725190037861, 7491074.208357560448349 ], [ 548366.278671049978584, 7491037.700336120091379 ], [ 547486.269420549971983, 7490854.199981180019677 ], [ 547082.899858859949745, 7490707.697768059559166 ], [ 546769.690927169984207, 7490574.189537869766355 ], [ 546425.291519170044921, 7490406.191465930081904 ], [ 546232.009528610040434, 7490128.679955460131168 ], [ 546231.999958069995046, 7489784.189334640279412 ], [ 546276.27850270003546, 7489277.689614480361342 ], [ 546373.349525970057584, 7488770.701892349869013 ], [ 546500.341896250029095, 7488548.709076629951596 ], [ 547008.470879010041244, 7488418.709465850144625 ], [ 547605.278605010011233, 7488218.210545349866152 ], [ 548494.020522819948383, 7487882.220946219749749 ], [ 548735.312448729993775, 7487804.719787940382957 ], [ 549389.111590950051323, 7487552.739949880167842 ], [ 549617.750346099957824, 7487488.229974529705942 ], [ 549814.509592509944923, 7487397.741918230429292 ], [ 550043.099172860034741, 7487332.729794139973819 ], [ 550417.940741110011004, 7487254.742107329890132 ], [ 550652.6283519200515, 7487132.239282780326903 ], [ 551089.328658859943971, 7486684.250709360465407 ], [ 551343.354683769983239, 7486514.723462239839137 ], [ 551406.247431789990515, 7486472.749969189986587 ], [ 551761.821539620053954, 7486356.259555390104651 ], [ 552168.448603449971415, 7486264.758787809871137 ], [ 552663.711761989980005, 7486115.757965289987624 ], [ 553012.697209479985759, 7485942.2681749695912 ], [ 553367.581373880035244, 7485685.759792169556022 ], [ 553691.022168859955855, 7485492.768842839635909 ], [ 553982.819799700053409, 7485344.768889689818025 ], [ 554369.942465250031091, 7485183.772040910087526 ], [ 554820.919659969978966, 7485060.280038660392165 ], [ 555335.139231530018151, 7484879.278656690381467 ], [ 556102.668451559962705, 7484467.789796110242605 ], [ 556566.089935260009952, 7484299.801005779765546 ], [ 556978.929645500029437, 7484170.302235740236938 ], [ 557752.598456379957497, 7483945.808593270368874 ], [ 558920.90135218994692, 7483571.819695089943707 ], [ 559546.367665310041048, 7483393.331099299713969 ], [ 560097.611719629960135, 7483252.829650710336864 ], [ 560652.730846249964088, 7483132.331242550164461 ], [ 561166.819444510038011, 7483040.850057239644229 ], [ 561563.550251089967787, 7482985.848885879851878 ], [ 562620.921824160031974, 7482870.370290259830654 ], [ 562666.860106543055736, 7482869.427093832753599 ], [ 562666.860106543055736, 7476861.29614201374352 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.3597", "objectid": "3597", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.06798108018, "shape_area": 0.0025233820028799999 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7493948.500266523100436 ], [ 562017.86825298005715, 7493989.310636560432613 ], [ 561445.871286730049178, 7494055.810433239676058 ], [ 560930.54918336996343, 7494014.308365819975734 ], [ 559791.570562480017543, 7493873.80110920034349 ], [ 559314.809575189952739, 7493920.801283299922943 ], [ 558997.299511149991304, 7493801.793448559939861 ], [ 558461.5013462100178, 7493623.279629110358655 ], [ 558044.729297060053796, 7493444.7886360604316 ], [ 557508.909998000017367, 7493295.788291630335152 ], [ 557032.688999920035712, 7493146.780197789892554 ], [ 556556.361293209949508, 7493087.269083140417933 ], [ 556080.120245069963858, 7492968.260365390218794 ], [ 555514.499594919965602, 7492789.759422839619219 ], [ 554948.919062659959309, 7492730.262764049693942 ], [ 554383.360805099946447, 7492759.761629750020802 ], [ 552775.930030860006809, 7492670.73900244012475 ], [ 551912.660673990030773, 7492908.741091069765389 ], [ 551364.966591530013829, 7492932.324395109899342 ], [ 551227.969715739949606, 7492938.220353459939361 ], [ 550692.171366530004889, 7492878.708934020251036 ], [ 550126.58004432998132, 7492700.209701140411198 ], [ 549769.408589369966649, 7492521.710005650296807 ], [ 549501.460381799959578, 7492462.198465449735522 ], [ 549174.018445470021106, 7492372.700973270460963 ], [ 548668.010057860054076, 7492343.208312249742448 ], [ 547774.959186000050977, 7492343.190372839570045 ], [ 547358.208265290013514, 7492402.689256370067596 ], [ 546971.279514390043914, 7492432.179934759624302 ], [ 546524.778901990037411, 7492402.66767456009984 ], [ 546018.689793150057085, 7492283.65813267044723 ], [ 545304.281155009986833, 7491926.159265699796379 ], [ 545036.390950290020555, 7491777.160529489628971 ], [ 544828.010475110029802, 7491628.65930688008666 ], [ 544708.960547090042382, 7491509.670096930116415 ], [ 544585.511445099953562, 7491365.671757680363953 ], [ 544315.018133740057237, 7491692.172029820270836 ], [ 544238.378264619968832, 7491635.160393830388784 ], [ 544135.618549510021694, 7491432.161117110401392 ], [ 543918.322316259960644, 7491197.669856980443001 ], [ 543420.678319129976444, 7490869.658592940308154 ], [ 543038.320503570022993, 7490699.670249789953232 ], [ 542815.35845373000484, 7490624.660747840069234 ], [ 542592.310546300024725, 7490517.651349290274084 ], [ 542387.871132510015741, 7490321.159055279567838 ], [ 542278.430744110024534, 7490048.159758640453219 ], [ 542245.318502080044709, 7489762.16108509991318 ], [ 542256.640922829974443, 7489469.161055089905858 ], [ 542300.359836720046587, 7489303.658677879720926 ], [ 542344.31951180996839, 7489195.168274519965053 ], [ 542350.679909239988774, 7489195.167987239547074 ], [ 542400.79943162004929, 7489029.160934429615736 ], [ 542571.512399810017087, 7488831.160668919794261 ], [ 541894.312351180007681, 7489210.159689630381763 ], [ 541740.130720659974031, 7489441.161330849863589 ], [ 541672.788809409947135, 7489598.16102849971503 ], [ 541538.098677800036967, 7490024.648979109711945 ], [ 541560.619127630023286, 7490159.161617719568312 ], [ 541605.511732809944078, 7490293.649401130154729 ], [ 541762.539372520055622, 7490428.650730979628861 ], [ 541942.050373179954477, 7490540.658418909646571 ], [ 542121.611326170037501, 7490675.150472099892795 ], [ 542547.951409470057115, 7490855.157926949672401 ], [ 542705.060030539985746, 7490877.161405250430107 ], [ 542929.420247980044223, 7490989.651189760304987 ], [ 543041.628388570039533, 7491034.648773539811373 ], [ 543288.521259670029394, 7491169.16250969003886 ], [ 543467.990977440029383, 7491303.657953480258584 ], [ 543916.811161260004155, 7491662.659460389986634 ], [ 544116.748927850043401, 7491902.661235259845853 ], [ 544278.199806150048971, 7491731.162152940407395 ], [ 544410.521071129944175, 7491797.668131220154464 ], [ 544724.722298449953087, 7491977.160089329816401 ], [ 544926.638237460050732, 7492066.669293380342424 ], [ 545353.032135299989022, 7492201.170327479951084 ], [ 545734.439228910021484, 7492380.660428210161626 ], [ 546048.651691599981859, 7492493.169389870017767 ], [ 546362.818985190009698, 7492582.670811150223017 ], [ 546676.941534420009702, 7492650.168377090245485 ], [ 547103.317789910011925, 7492650.180430520325899 ], [ 547379.936057189945132, 7492619.509876229800284 ], [ 547800.501640790025704, 7492572.869106560014188 ], [ 548113.150488939951174, 7492538.188606569543481 ], [ 548609.524892949964851, 7492518.292499619536102 ], [ 548674.150659580016509, 7492515.700941150076687 ], [ 549044.658509760047309, 7492599.751008120365441 ], [ 549167.862052430049516, 7492627.697604079730809 ], [ 549457.153067799983546, 7492715.703061419539154 ], [ 549683.977676769951358, 7492784.701064139604568 ], [ 550065.459032419952564, 7492942.20985712017864 ], [ 550534.541891410015523, 7493081.193029480054975 ], [ 550671.339240900008008, 7493121.721171219833195 ], [ 551052.80020133999642, 7493211.218328719958663 ], [ 551366.026483480003662, 7493247.456507329829037 ], [ 551636.307681920006871, 7493278.721003590151668 ], [ 552399.249670129967853, 7493143.741067410446703 ], [ 552780.738207599963062, 7493099.241545979864895 ], [ 552982.679487730027176, 7493143.749370129778981 ], [ 553296.870801819954067, 7493166.240730220451951 ], [ 553633.418506529997103, 7493143.748349349945784 ], [ 553925.148862999980338, 7493143.749152080155909 ], [ 554396.410372480051592, 7493121.748792300000787 ], [ 555136.930052940035239, 7493166.261243619956076 ], [ 555720.380931269959547, 7493233.758609309792519 ], [ 556371.181922900024801, 7493368.272165860049427 ], [ 556864.819337649969384, 7493525.279066280461848 ], [ 557246.288316729944199, 7493682.770033920183778 ], [ 557538.058653300045989, 7493817.278351039625704 ], [ 558772.240281710051931, 7494310.79051337018609 ], [ 559221.050658049993217, 7494378.290843970142305 ], [ 559647.420679530012421, 7494400.799023820087314 ], [ 560051.290330259944312, 7494400.798726679757237 ], [ 561128.430605069966987, 7494512.809020079672337 ], [ 562070.941096269991249, 7494625.308588610030711 ], [ 562430.00961092999205, 7494692.319664860144258 ], [ 562666.860106543055736, 7494692.319922047667205 ], [ 562666.860106543055736, 7493948.500266523100436 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4686", "objectid": "4686", "lithstrtno": "4111", "code": "P_-HAj-xci-od", "unitname": "Weeli Wolli Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Banded iron-formation (commonly jaspilitic) mudstone siltstone and numerous dolerite sills; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic intrusive", "lithname2": "dolerite", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Weeli Wolli Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2451", "maxuncerty": null, "min_age_ma": "2450", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.1292811170099999, "shape_area": 0.0079047980932400001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7482869.427093832753599 ], [ 562620.921824160031974, 7482870.370290259830654 ], [ 561563.550251089967787, 7482985.848885879851878 ], [ 561166.819444510038011, 7483040.850057239644229 ], [ 560652.730846249964088, 7483132.331242550164461 ], [ 560097.611719629960135, 7483252.829650710336864 ], [ 559546.367665310041048, 7483393.331099299713969 ], [ 558920.90135218994692, 7483571.819695089943707 ], [ 557752.598456379957497, 7483945.808593270368874 ], [ 556978.929645500029437, 7484170.302235740236938 ], [ 556566.089935260009952, 7484299.801005779765546 ], [ 556102.668451559962705, 7484467.789796110242605 ], [ 555335.139231530018151, 7484879.278656690381467 ], [ 554820.919659969978966, 7485060.280038660392165 ], [ 554369.942465250031091, 7485183.772040910087526 ], [ 553982.819799700053409, 7485344.768889689818025 ], [ 553691.022168859955855, 7485492.768842839635909 ], [ 553367.581373880035244, 7485685.759792169556022 ], [ 553012.697209479985759, 7485942.2681749695912 ], [ 552663.711761989980005, 7486115.757965289987624 ], [ 552168.448603449971415, 7486264.758787809871137 ], [ 551761.821539620053954, 7486356.259555390104651 ], [ 551406.247431789990515, 7486472.749969189986587 ], [ 551343.354683769983239, 7486514.723462239839137 ], [ 551089.328658859943971, 7486684.250709360465407 ], [ 550652.6283519200515, 7487132.239282780326903 ], [ 550417.940741110011004, 7487254.742107329890132 ], [ 550043.099172860034741, 7487332.729794139973819 ], [ 549814.509592509944923, 7487397.741918230429292 ], [ 549617.750346099957824, 7487488.229974529705942 ], [ 549389.111590950051323, 7487552.739949880167842 ], [ 548735.312448729993775, 7487804.719787940382957 ], [ 548494.020522819948383, 7487882.220946219749749 ], [ 547605.278605010011233, 7488218.210545349866152 ], [ 547008.470879010041244, 7488418.709465850144625 ], [ 546500.341896250029095, 7488548.709076629951596 ], [ 546373.349525970057584, 7488770.701892349869013 ], [ 546276.27850270003546, 7489277.689614480361342 ], [ 546231.999958069995046, 7489784.189334640279412 ], [ 546232.009528610040434, 7490128.679955460131168 ], [ 546425.291519170044921, 7490406.191465930081904 ], [ 546769.690927169984207, 7490574.189537869766355 ], [ 547082.899858859949745, 7490707.697768059559166 ], [ 547486.269420549971983, 7490854.199981180019677 ], [ 548366.278671049978584, 7491037.700336120091379 ], [ 548806.299725190037861, 7491074.208357560448349 ], [ 549612.929414979997091, 7491257.708402830176055 ], [ 550896.279859749949537, 7491404.231776890344918 ], [ 551360.246637489995919, 7491529.420138870365918 ], [ 551886.299605170032009, 7491661.230382160283625 ], [ 552509.628818519995548, 7491697.7503981301561 ], [ 553389.608255989965983, 7491734.250089040026069 ], [ 554672.931208909954876, 7491661.258393780328333 ], [ 555517.924562950036488, 7491690.303761900402606 ], [ 556799.610155759961344, 7491734.270272320136428 ], [ 557862.92075577005744, 7491917.791419030167162 ], [ 558926.241475829971023, 7492284.289813860319555 ], [ 559952.941987609956414, 7492467.79866745043546 ], [ 561126.260707290028222, 7492651.320399310439825 ], [ 562519.63842960994225, 7492724.33079618960619 ], [ 562666.860106543055736, 7492719.446714281104505 ], [ 562666.860106543055736, 7491443.341978270560503 ], [ 562521.079803650034592, 7491443.339907119981945 ], [ 561992.061383410007693, 7491548.828501519747078 ], [ 561330.888508139993064, 7491654.82883698027581 ], [ 560987.000516430009156, 7491628.319632159546018 ], [ 560537.252318589948118, 7491565.818223150447011 ], [ 560224.870665209949948, 7491408.31000730022788 ], [ 559976.550313269952312, 7491333.308798779733479 ], [ 559702.838738769991323, 7491271.312594629824162 ], [ 558811.25888198998291, 7491008.81138888001442 ], [ 558231.978382559958845, 7490903.811121249571443 ], [ 557703.978934710030444, 7490861.789144589565694 ], [ 557227.069282240001485, 7490864.787604030221701 ], [ 556656.288962260005064, 7490887.148668210022151 ], [ 555720.118228579987772, 7490923.777944720350206 ], [ 555179.999341189977713, 7491002.770095380023122 ], [ 554601.599390279967338, 7491076.260436410084367 ], [ 553889.61093282001093, 7491130.761719340458512 ], [ 553584.681596540031023, 7491101.749320579692721 ], [ 553012.629012149991468, 7491012.248947810381651 ], [ 552494.177772370050661, 7490904.748294780030847 ], [ 552011.551299010054208, 7490726.240335299633443 ], [ 551421.538080709986389, 7490654.741692890413105 ], [ 551357.266521550016478, 7490644.027377779595554 ], [ 550992.539270390057936, 7490583.220552190206945 ], [ 550545.609055069973692, 7490547.228825179859996 ], [ 550062.919663849985227, 7490440.229997159913182 ], [ 549687.550105770002119, 7490279.220335530117154 ], [ 549204.861118479981087, 7490100.220020210370421 ], [ 549043.907902959967032, 7490011.218519140034914 ], [ 548936.638724540011026, 7489850.221444319933653 ], [ 548883.05092617997434, 7489707.221509889699519 ], [ 548829.422016810043715, 7489528.210123609751463 ], [ 548918.779980969964527, 7489260.229725419543684 ], [ 549079.658860909985378, 7489009.730146840214729 ], [ 549365.731043579988182, 7488723.719588650390506 ], [ 549776.920173540012911, 7488455.730471529997885 ], [ 550313.250286179943942, 7488276.730200399644673 ], [ 550688.600265090004541, 7488098.239096100442111 ], [ 551153.438051630044356, 7487865.743341330438852 ], [ 551347.461202039965428, 7487732.949910280294716 ], [ 551493.128464640001766, 7487633.249030480161309 ], [ 552065.191636570030823, 7487418.750326620414853 ], [ 552297.569548410014249, 7487275.750405360013247 ], [ 552583.568355859955773, 7487114.748353379778564 ], [ 553280.832354560028762, 7486703.767619789578021 ], [ 553602.568778170039877, 7486524.766971509903669 ], [ 554049.511369140003808, 7486292.771328049711883 ], [ 554407.080602459958754, 7486131.769226860255003 ], [ 554853.959906719974242, 7486024.278550979681313 ], [ 555354.521061060018837, 7485756.290413860231638 ], [ 555872.959852430038154, 7485631.291738339699805 ], [ 556105.40838184999302, 7485541.790630529634655 ], [ 556464.279823770048097, 7485491.791407180018723 ], [ 557628.01885943999514, 7485201.302174190059304 ], [ 558712.487350440002047, 7484857.311369420029223 ], [ 559308.365425799973309, 7484784.212309150025249 ], [ 560220.029631930054165, 7484672.327784390188754 ], [ 560960.618532820022665, 7484619.337542350403965 ], [ 562045.031326589989476, 7484698.357952949590981 ], [ 562666.860106543055736, 7484752.543935566209257 ], [ 562666.860106543055736, 7482869.427093832753599 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.7708", "objectid": "7709", "lithstrtno": "4124", "code": "A-HAu-xsl-ci", "unitname": "Mount McRae Shale and Mount Sylvia Formation", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Mudstone siltstone chert banded iron-formation and dolomite; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary siliciclastic", "lithname1": "siltstone/mudstone", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "sedimentary other chemical or biochemical", "lithname2": "iron formation", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Mount McRae Shale and Mount Sylvia Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2541", "maxuncerty": null, "min_age_ma": "2501", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.64674087957199999, "shape_area": 0.0024271898412200001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7474303.736969869583845 ], [ 562648.130346660036594, 7474324.341077829711139 ], [ 562489.470800000010058, 7474509.841486860066652 ], [ 562330.751035189954564, 7474800.341639880090952 ], [ 562145.619462150032632, 7475408.850841050036252 ], [ 562066.239222049945965, 7476122.842129549942911 ], [ 561960.510675700032152, 7476493.341559140011668 ], [ 561907.561282849987037, 7476837.331754730083048 ], [ 561775.329069140017964, 7477180.839138709940016 ], [ 561695.998378359945491, 7477577.838732260279357 ], [ 561325.679088150034659, 7478291.849648060277104 ], [ 561166.979595110053197, 7478767.82974832970649 ], [ 560955.420378569979221, 7479111.827466390095651 ], [ 560664.510850730002858, 7479482.31912678014487 ], [ 560188.359123370028101, 7479905.321263619698584 ], [ 559565.259590790024959, 7480131.810321420431137 ], [ 558961.618415990029462, 7480662.810186740010977 ], [ 558166.318415640038438, 7481134.301850469782948 ], [ 557462.729210410034284, 7481615.291048490442336 ], [ 555890.978131970041431, 7482756.780634730122983 ], [ 554199.290736960014328, 7484058.279978320002556 ], [ 553299.030578140052967, 7484648.280572880059481 ], [ 553579.438505909987725, 7484774.269393079914153 ], [ 553859.379547549993731, 7484798.279873340390623 ], [ 554221.658450940041803, 7484745.277343910187483 ], [ 554557.948378719971515, 7484597.28947607986629 ], [ 555008.228967749979347, 7484327.279931530356407 ], [ 556339.359097260050476, 7483422.790656579658389 ], [ 557144.29002588998992, 7482858.30011445004493 ], [ 557702.1606820699526, 7482479.788011509925127 ], [ 558247.428242309950292, 7482145.80981088988483 ], [ 558526.340702550020069, 7481959.810445980168879 ], [ 558653.169789870036766, 7481869.807492359541357 ], [ 558811.488468160037883, 7481735.312533549964428 ], [ 558855.848585069994442, 7481709.810595990158617 ], [ 559388.251004809979349, 7481331.31110505014658 ], [ 560034.599146069958806, 7480850.329705360345542 ], [ 560332.309257369954139, 7480606.831241140142083 ], [ 560579.309177830000408, 7480382.829210110008717 ], [ 560819.990342710050754, 7480190.341357300058007 ], [ 561073.599140699952841, 7480023.831344950012863 ], [ 561282.990936969988979, 7479926.841339250095189 ], [ 561555.988813429954462, 7479823.83794873021543 ], [ 561720.549841640051454, 7479663.841516169719398 ], [ 561897.041405549971387, 7479338.339646079577506 ], [ 562060.639919589972124, 7478961.839952230453491 ], [ 562217.750590660027228, 7478572.839649910107255 ], [ 562305.249252759967931, 7478260.338304109871387 ], [ 562405.520149050047621, 7477941.359709770418704 ], [ 562499.051775350002572, 7477559.349274420179427 ], [ 562548.12923551001586, 7477176.840552739799023 ], [ 562666.860106543055736, 7476861.29614201374352 ], [ 562666.860106543055736, 7474303.736969869583845 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4685", "objectid": "4685", "lithstrtno": "4104", "code": "P_-HAo-ci", "unitname": "Boolgeeda Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Fine-grained finely laminated iron-formation mudstone siltstone and chert; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Boolgeeda Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2445", "maxuncerty": "5", "min_age_ma": "2445", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.84233180388200002, "shape_area": 0.0021427326020500002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 561967.689865470048971, 7490957.840596780180931 ], [ 562111.701183879980817, 7490942.341656750068069 ], [ 562255.138719380018301, 7490942.341470959596336 ], [ 562434.020006260019727, 7490960.339716799557209 ], [ 562666.860106543055736, 7490997.268630385398865 ], [ 562666.860106543055736, 7490327.742040442302823 ], [ 562508.521387450047769, 7490316.349900550208986 ], [ 562232.209474180010147, 7490323.840735719539225 ], [ 561887.998742550029419, 7490364.830492990091443 ], [ 561353.138263929984532, 7490455.839925279840827 ], [ 561149.948077109991573, 7490467.328518300317228 ], [ 560939.491455549956299, 7490454.332256129942834 ], [ 560659.271487800055183, 7490407.830268920399249 ], [ 560036.63073367998004, 7490250.817435380071402 ], [ 559565.77068843995221, 7490140.319842300377786 ], [ 559293.121205250034109, 7490098.320342510007322 ], [ 558944.329036970040761, 7490074.80872633960098 ], [ 558454.619944949983619, 7490079.311080169863999 ], [ 556952.621510909986682, 7490173.289636230096221 ], [ 556613.370150540024042, 7490170.290530409663916 ], [ 556335.350146159995347, 7490144.78921109996736 ], [ 556057.378166969981976, 7490089.779209819622338 ], [ 555922.809317460050806, 7490047.280013689771295 ], [ 555796.610539139946923, 7489986.769164679571986 ], [ 555680.940175779978745, 7489904.280013989657164 ], [ 555422.109302929951809, 7489682.76849140971899 ], [ 555317.190970840048976, 7489627.280259019695222 ], [ 555250.491035289946012, 7489608.778387219645083 ], [ 555181.981955250026658, 7489600.279798209667206 ], [ 555121.180678260046989, 7489605.268457190133631 ], [ 555077.509789519943297, 7489627.27132183033973 ], [ 555057.43090725003276, 7489667.769072749651968 ], [ 555055.669637170038186, 7489722.769396349787712 ], [ 555077.47972264001146, 7489926.771004930138588 ], [ 555064.819724770030007, 7490002.768572620116174 ], [ 555034.847964460030198, 7490071.269424409605563 ], [ 554990.98925154004246, 7490131.268015249632299 ], [ 554936.41038460994605, 7490182.271604879759252 ], [ 554874.289853860042058, 7490224.271523060277104 ], [ 554807.80789655004628, 7490256.269581560045481 ], [ 554678.440193659975193, 7490290.270079569891095 ], [ 554545.757976630004123, 7490299.269265339709818 ], [ 554208.550733990035951, 7490286.260467450134456 ], [ 553999.691431769984774, 7490303.258721450343728 ], [ 553519.378694409970194, 7490376.257764330133796 ], [ 553314.549001369974576, 7490381.750424340367317 ], [ 553041.379191059968434, 7490359.260142910294235 ], [ 552699.760082739987411, 7490298.249241 ], [ 551355.009175600018352, 7489973.566368820145726 ], [ 551355.000405839993618, 7489970.961965770460665 ], [ 550954.048379419953562, 7489876.730932460166514 ], [ 550621.24930092995055, 7489772.729154540225863 ], [ 550433.598883340018801, 7489695.228412760421634 ], [ 550328.029854170046747, 7489628.222351909615099 ], [ 550285.738052150001749, 7489586.229384990409017 ], [ 550253.301929129986092, 7489537.229197359643877 ], [ 550232.6700369999744, 7489481.221961669623852 ], [ 550223.110004200018011, 7489419.719302509911358 ], [ 550223.97110015002545, 7489355.731089119799435 ], [ 550234.669951020041481, 7489292.230416620150208 ], [ 550254.6215788499685, 7489231.729525770060718 ], [ 550283.239334529964253, 7489177.719123959541321 ], [ 550322.429807569948025, 7489129.230446239933372 ], [ 550369.362692189984955, 7489089.229550669901073 ], [ 550480.609119680011645, 7489028.731948739849031 ], [ 550797.231603089952841, 7488911.730072430334985 ], [ 551350.489284290000796, 7488631.60913693998009 ], [ 551592.862106529995799, 7488544.739053940400481 ], [ 552134.688126430031843, 7488391.25076686963439 ], [ 552388.760000659967773, 7488291.758676700294018 ], [ 552690.450839139986783, 7488138.748175430111587 ], [ 553401.070733950007707, 7487733.249943439848721 ], [ 553896.301398920011707, 7487490.769196850247681 ], [ 554405.948296479997225, 7487274.771301779896021 ], [ 555836.071254760026932, 7486728.790605160407722 ], [ 556804.82938687002752, 7486337.79075643979013 ], [ 557264.831118940026499, 7486181.298667410388589 ], [ 557672.411451869993471, 7486076.302588099613786 ], [ 558225.220487660029903, 7485970.809013069607317 ], [ 558779.850868319976144, 7485895.818508500233293 ], [ 559601.098498450010084, 7485823.820487939752638 ], [ 560798.851472449954599, 7485752.840195829980075 ], [ 561372.290765090030618, 7485744.849593220278621 ], [ 561797.648586699971929, 7485767.847794779576361 ], [ 562666.860106543055736, 7485870.348914626054466 ], [ 562666.860106543055736, 7485244.75902686920017 ], [ 561807.929275420028716, 7485214.352229559794068 ], [ 561378.661332880030386, 7485181.329030959866941 ], [ 560646.099169709952548, 7485094.838985750451684 ], [ 560281.059761279961094, 7485063.327579639852047 ], [ 559988.580673109972849, 7485053.330759939737618 ], [ 559770.850210809963755, 7485060.829919259995222 ], [ 559591.731237130006775, 7485082.821547220461071 ], [ 559416.111160399974324, 7485121.319079210050404 ], [ 558823.288362130057067, 7485292.819745820015669 ], [ 558502.350900650024414, 7485368.811100269667804 ], [ 557618.360711049987003, 7485548.799116269685328 ], [ 557410.971217770013027, 7485606.310205210000277 ], [ 556819.960292669944465, 7485816.791321939788759 ], [ 556607.551553230034187, 7485875.289830160327256 ], [ 556319.90044342004694, 7485935.28877651039511 ], [ 555086.388819269952364, 7486292.778706509619951 ], [ 554389.201146050007083, 7486632.268889189697802 ], [ 552762.38842922996264, 7487347.261956869624555 ], [ 552458.420305559993722, 7487508.259410570375621 ], [ 552190.307156149996445, 7487704.748273840174079 ], [ 551348.879236279986799, 7488153.749205430038273 ], [ 551348.8731804699637, 7488151.95201200991869 ], [ 550992.346481370041147, 7488343.015108509920537 ], [ 550581.371146389981732, 7488563.240808730013669 ], [ 550205.898894299985841, 7488652.238660969771445 ], [ 549866.299771460006014, 7488831.230419640429318 ], [ 549562.359360320027918, 7489135.219783149659634 ], [ 549437.210341510013677, 7489367.220461320132017 ], [ 549544.481534000020474, 7489653.720123520120978 ], [ 549687.558985300012864, 7489850.229938889853656 ], [ 549848.407810820033774, 7490011.218461450189352 ], [ 550205.918517110054381, 7490207.726119190454483 ], [ 550574.710670660017058, 7490249.26102614030242 ], [ 550976.810912359971553, 7490294.53687281999737 ], [ 551356.233714660047553, 7490337.249311570078135 ], [ 551356.233513029990718, 7490337.189423720352352 ], [ 552297.549740719958209, 7490511.749160650186241 ], [ 552690.860442089964636, 7490601.252312409691513 ], [ 553048.378829860012047, 7490744.251306530088186 ], [ 553459.540769950021058, 7490815.750678749755025 ], [ 553672.048846399993636, 7490845.750289809890091 ], [ 554212.041539250058122, 7490728.260465569794178 ], [ 554586.930939109995961, 7490675.261713890358806 ], [ 555006.431059389957227, 7490628.260786630213261 ], [ 555521.35792516998481, 7490587.271619060076773 ], [ 556093.739616920007393, 7490584.269089750014246 ], [ 556602.428969210013747, 7490568.778313140384853 ], [ 557149.109579319949262, 7490527.790441599674523 ], [ 557606.920336249982938, 7490512.298539609648287 ], [ 558179.327531220042147, 7490528.301644960418344 ], [ 558764.581863790052012, 7490563.31014512013644 ], [ 559330.811492510023527, 7490623.799296939745545 ], [ 559929.459091600030661, 7490792.82088456954807 ], [ 560526.88127023994457, 7491011.818067179992795 ], [ 560700.429184500011615, 7491060.818243809975684 ], [ 560878.559417800046504, 7491095.331193099729717 ], [ 561058.57812742004171, 7491114.820658599957824 ], [ 561202.150876770028844, 7491117.830765389837325 ], [ 561343.999657099950127, 7491106.820366109721363 ], [ 561447.579118140041828, 7491087.831228899769485 ], [ 561789.330315939965658, 7490993.841509629972279 ], [ 561967.689865470048971, 7490957.840596780180931 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.8420", "objectid": "8421", "lithstrtno": "2219", "code": "A-FO-od", "unitname": "Fortescue Group", "gswastatus": "Informal", "rank": "Formation", "descriptn": "Dolerite dyke or sill", "parentcode": "A-FO-xb-s", "parentname": "Fortescue Group", "rocktype1": "igneous mafic intrusive", "lithname1": "dolerite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": null, "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma); Fortescue Rifting Event (2775 - 2752 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2775", "maxuncerty": null, "min_age_ma": "2629", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.3540091569899999, "shape_area": 0.010743036332199999 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7497990.631876044906676 ], [ 562017.460723969968967, 7497884.259027689695358 ], [ 561539.879878400010057, 7497765.770021039992571 ], [ 561069.011243949993514, 7497704.759833839721978 ], [ 560636.190526859951206, 7497630.76089888997376 ], [ 560088.960638139978983, 7497557.271907770074904 ], [ 559561.129777790047228, 7497553.769323430024087 ], [ 559026.79020450997632, 7497531.261897060088813 ], [ 558631.969253320014104, 7497425.260880719870329 ], [ 558255.600268559996039, 7497185.26009499002248 ], [ 558070.121155599947087, 7496944.770771049894392 ], [ 557896.630763810011558, 7496576.258577490225434 ], [ 556810.039340780000202, 7496760.771355640143156 ], [ 556919.861955519998446, 7497122.759786680340767 ], [ 557035.40986553998664, 7497344.758373170159757 ], [ 557259.399272640002891, 7497649.25935020018369 ], [ 557450.919712999952026, 7497794.760403499938548 ], [ 557673.869504629983567, 7497876.259613890200853 ], [ 557909.380009340005927, 7497912.756985089741647 ], [ 558259.311313159996644, 7497949.258003230206668 ], [ 558679.441208709962666, 7498023.260132320225239 ], [ 559118.799577760044485, 7498154.758440059609711 ], [ 559889.530454299994744, 7498411.251732099801302 ], [ 560627.90070563997142, 7498553.749823899939656 ], [ 561098.710991080035456, 7498583.249814179725945 ], [ 561912.528315510018729, 7498559.2597412802279 ], [ 562421.449098899960518, 7498588.759355739690363 ], [ 562666.860106543055736, 7498620.430423093959689 ], [ 562666.860106543055736, 7497990.631876044906676 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.4687", "objectid": "4687", "lithstrtno": "4068", "code": "P_-TK-s", "unitname": "Turee Creek Group", "gswastatus": "Formal", "rank": "Group", "descriptn": "Mudstone siltstone sandstone conglomerate dolomite; minor diamictite limestone and iron formation; intruded by Balgara Dolerite sills", "parentcode": "AP_-MB-xb-c", "parentname": "Mount Bruce Supergroup", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Turee Creek Group", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Turee Creek Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2445", "maxuncerty": null, "min_age_ma": "2208", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.40256874734699999, "shape_area": 0.0056821573360100004 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 562666.860106543055736, 7485870.348914626054466 ], [ 561797.648586699971929, 7485767.847794779576361 ], [ 561372.290765090030618, 7485744.849593220278621 ], [ 560798.851472449954599, 7485752.840195829980075 ], [ 559601.098498450010084, 7485823.820487939752638 ], [ 558779.850868319976144, 7485895.818508500233293 ], [ 558225.220487660029903, 7485970.809013069607317 ], [ 557672.411451869993471, 7486076.302588099613786 ], [ 557264.831118940026499, 7486181.298667410388589 ], [ 556804.82938687002752, 7486337.79075643979013 ], [ 555836.071254760026932, 7486728.790605160407722 ], [ 554405.948296479997225, 7487274.771301779896021 ], [ 553896.301398920011707, 7487490.769196850247681 ], [ 553401.070733950007707, 7487733.249943439848721 ], [ 552690.450839139986783, 7488138.748175430111587 ], [ 552388.760000659967773, 7488291.758676700294018 ], [ 552134.688126430031843, 7488391.25076686963439 ], [ 551592.862106529995799, 7488544.739053940400481 ], [ 551350.489284290000796, 7488631.60913693998009 ], [ 550797.231603089952841, 7488911.730072430334985 ], [ 550480.609119680011645, 7489028.731948739849031 ], [ 550369.362692189984955, 7489089.229550669901073 ], [ 550322.429807569948025, 7489129.230446239933372 ], [ 550283.239334529964253, 7489177.719123959541321 ], [ 550254.6215788499685, 7489231.729525770060718 ], [ 550234.669951020041481, 7489292.230416620150208 ], [ 550223.97110015002545, 7489355.731089119799435 ], [ 550223.110004200018011, 7489419.719302509911358 ], [ 550232.6700369999744, 7489481.221961669623852 ], [ 550253.301929129986092, 7489537.229197359643877 ], [ 550285.738052150001749, 7489586.229384990409017 ], [ 550328.029854170046747, 7489628.222351909615099 ], [ 550433.598883340018801, 7489695.228412760421634 ], [ 550621.24930092995055, 7489772.729154540225863 ], [ 550954.048379419953562, 7489876.730932460166514 ], [ 551355.000405839993618, 7489970.961965770460665 ], [ 551355.009175600018352, 7489973.566368820145726 ], [ 552699.760082739987411, 7490298.249241 ], [ 553041.379191059968434, 7490359.260142910294235 ], [ 553314.549001369974576, 7490381.750424340367317 ], [ 553519.378694409970194, 7490376.257764330133796 ], [ 553999.691431769984774, 7490303.258721450343728 ], [ 554208.550733990035951, 7490286.260467450134456 ], [ 554545.757976630004123, 7490299.269265339709818 ], [ 554678.440193659975193, 7490290.270079569891095 ], [ 554807.80789655004628, 7490256.269581560045481 ], [ 554874.289853860042058, 7490224.271523060277104 ], [ 554936.41038460994605, 7490182.271604879759252 ], [ 554990.98925154004246, 7490131.268015249632299 ], [ 555034.847964460030198, 7490071.269424409605563 ], [ 555064.819724770030007, 7490002.768572620116174 ], [ 555077.47972264001146, 7489926.771004930138588 ], [ 555055.669637170038186, 7489722.769396349787712 ], [ 555057.43090725003276, 7489667.769072749651968 ], [ 555077.509789519943297, 7489627.27132183033973 ], [ 555121.180678260046989, 7489605.268457190133631 ], [ 555181.981955250026658, 7489600.279798209667206 ], [ 555250.491035289946012, 7489608.778387219645083 ], [ 555317.190970840048976, 7489627.280259019695222 ], [ 555422.109302929951809, 7489682.76849140971899 ], [ 555680.940175779978745, 7489904.280013989657164 ], [ 555796.610539139946923, 7489986.769164679571986 ], [ 555922.809317460050806, 7490047.280013689771295 ], [ 556057.378166969981976, 7490089.779209819622338 ], [ 556335.350146159995347, 7490144.78921109996736 ], [ 556613.370150540024042, 7490170.290530409663916 ], [ 556952.621510909986682, 7490173.289636230096221 ], [ 558454.619944949983619, 7490079.311080169863999 ], [ 558944.329036970040761, 7490074.80872633960098 ], [ 559293.121205250034109, 7490098.320342510007322 ], [ 559565.77068843995221, 7490140.319842300377786 ], [ 560036.63073367998004, 7490250.817435380071402 ], [ 560659.271487800055183, 7490407.830268920399249 ], [ 560939.491455549956299, 7490454.332256129942834 ], [ 561149.948077109991573, 7490467.328518300317228 ], [ 561353.138263929984532, 7490455.839925279840827 ], [ 561887.998742550029419, 7490364.830492990091443 ], [ 562232.209474180010147, 7490323.840735719539225 ], [ 562508.521387450047769, 7490316.349900550208986 ], [ 562666.860106543055736, 7490327.742040442302823 ], [ 562666.860106543055736, 7485870.348914626054466 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14338", "objectid": "14339", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 3.2073941479000001, "shape_area": 0.010145258489 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 548640.953464290942065, 7521273.574077860452235 ], [ 548761.428701419965364, 7521155.699331229552627 ], [ 548900.950248799985275, 7521065.68975913990289 ], [ 549180.109107009950094, 7520943.19092417974025 ], [ 549472.190413629985414, 7520840.188566190190613 ], [ 549808.758831460028887, 7520736.178342989645898 ], [ 550653.059888210031204, 7520426.181568100117147 ], [ 551014.678965050028637, 7520239.669949440285563 ], [ 551242.628899940056726, 7520034.669556410051882 ], [ 551445.290414919960313, 7519868.169856520369649 ], [ 551698.502042190055363, 7519618.671442500315607 ], [ 551977.181308640050702, 7519387.66122165042907 ], [ 552508.919727199943736, 7518875.661261970177293 ], [ 552736.711374880047515, 7518632.649459320120513 ], [ 552951.648096360033378, 7518364.148328660055995 ], [ 553365.709329799981788, 7517646.139826419763267 ], [ 553521.998791010002606, 7517146.120753969997168 ], [ 553490.751053510000929, 7516646.130151580087841 ], [ 553396.94924536999315, 7516396.131426160223782 ], [ 553119.358725509955548, 7516212.130172469653189 ], [ 552934.171248369966634, 7516053.632071820087731 ], [ 552735.878587619983591, 7515800.120999690145254 ], [ 552594.358582830056548, 7515463.632309479638934 ], [ 552472.469793559983373, 7515248.128782370127738 ], [ 552267.968993069953285, 7515045.631445099599659 ], [ 551731.074992449954152, 7514759.201526599936187 ], [ 551298.908410839969292, 7514528.621823900379241 ], [ 550872.358978120028041, 7514435.608253129757941 ], [ 550522.581304499995895, 7514431.12007798999548 ], [ 550096.13010181998834, 7514357.129423620179296 ], [ 549777.157928950036876, 7514142.630515470169485 ], [ 549381.82016482995823, 7513928.131438869982958 ], [ 548700.250355439959094, 7513696.629555179737508 ], [ 548311.548449330031872, 7513533.128911710344255 ], [ 548011.999417399987578, 7513394.639083719812334 ], [ 547744.120906300027855, 7513230.630903270095587 ], [ 547552.240127959987149, 7513009.140230040065944 ], [ 547423.940015339991078, 7512774.140642990358174 ], [ 547301.797638020012528, 7512494.641788500361145 ], [ 547025.85104430001229, 7511974.129926219582558 ], [ 546921.599986459943466, 7511756.871668560430408 ], [ 546910.207894589984789, 7511733.130136489868164 ], [ 546839.032225689967163, 7511472.640136569738388 ], [ 546773.339685610029846, 7511046.639840469695628 ], [ 546747.331027709995396, 7510919.130965920165181 ], [ 546523.250805940013379, 7510615.138416299596429 ], [ 546344.38002908998169, 7510444.151013869792223 ], [ 545834.078861130052246, 7510116.140090740285814 ], [ 545584.70227057999, 7509837.140359420329332 ], [ 545386.061797900008969, 7509520.139114540070295 ], [ 545238.039955170010217, 7509170.651160649955273 ], [ 545122.098981300019659, 7508859.651255340315402 ], [ 544986.967824600054882, 7508529.640704610385001 ], [ 544743.649668990052305, 7508180.64890768006444 ], [ 544659.952399050001986, 7507964.649859149940312 ], [ 544499.401140230009332, 7507634.652536380104721 ], [ 544320.020545160048641, 7507368.150118900462985 ], [ 544044.859332469990477, 7507007.147786979563534 ], [ 543852.741408649948426, 7506721.649244810454547 ], [ 543666.679994179983623, 7506391.651839040219784 ], [ 543486.618928679963574, 7505966.149615850299597 ], [ 543177.948728719959036, 7505267.651104040443897 ], [ 542851.599998170044273, 7504830.148377349600196 ], [ 542628.151267910026945, 7504653.147738579660654 ], [ 541996.49951150000561, 7504230.151673150248826 ], [ 541486.308983789989725, 7503927.648783730342984 ], [ 541052.439851489965804, 7503624.639814630150795 ], [ 540714.57853476004675, 7503454.658803319558501 ], [ 540331.750142619945109, 7503195.649200160056353 ], [ 539885.060554989962839, 7502867.149066110141575 ], [ 539534.279518340015784, 7502671.651546549983323 ], [ 539088.339263470028527, 7502508.650756360031664 ], [ 538115.051889610011131, 7502437.639098499901593 ], [ 537790.329145789961331, 7502369.149316649883986 ], [ 537573.567950980039313, 7502255.649229579605162 ], [ 537394.901242660009302, 7502116.638735800050199 ], [ 537330.598165779956616, 7501970.641640059649944 ], [ 537323.512343090027571, 7501824.63116788957268 ], [ 537322.000254699960351, 7501506.137971930205822 ], [ 537263.759554189979099, 7501296.640788069926202 ], [ 537039.810191430035047, 7501017.629488600417972 ], [ 536612.610229640034959, 7500784.619802930392325 ], [ 536218.050877150031738, 7500716.62982770986855 ], [ 535734.419606919982471, 7500662.120714230462909 ], [ 534972.087890470051207, 7500831.609265670180321 ], [ 534616.169753010035492, 7500865.118759210221469 ], [ 534266.389420230058022, 7500867.109677930362523 ], [ 534081.707948690047488, 7500817.109223029576242 ], [ 533864.937776679988019, 7500710.10962160024792 ], [ 533501.710612179944292, 7500546.609419420361519 ], [ 533285.191948459949344, 7500484.100489480420947 ], [ 533038.928390149958432, 7500854.600384590215981 ], [ 533000.699731510016136, 7500836.09126906003803 ], [ 532828.741958869970404, 7500779.589823200367391 ], [ 532059.217866000020877, 7500783.592576529830694 ], [ 531715.73976946005132, 7500766.589671320281923 ], [ 531009.339159070048481, 7500675.080785560421646 ], [ 530322.572177659953013, 7500685.071386770345271 ], [ 529769.568950040033087, 7500739.068745999597013 ], [ 529089.130638509988785, 7500749.058695370331407 ], [ 528593.159048130037263, 7500745.061562200076878 ], [ 528861.282109110034071, 7500456.376656860113144 ], [ 529080.291546280030161, 7500220.560018570162356 ], [ 528991.080585750052705, 7500183.048984399996698 ], [ 528679.648660099948756, 7500223.049524989910424 ], [ 527986.562664440018125, 7500239.548052719794214 ], [ 527668.650482030003332, 7500241.048918349668384 ], [ 526409.297543440014124, 7500216.030406280420721 ], [ 525849.759919609990902, 7500225.52054840978235 ], [ 525373.009474970051087, 7500266.021161619573832 ], [ 525080.378881589975208, 7500248.520118249580264 ], [ 524717.158815650036559, 7500210.008445120416582 ], [ 525164.741490110056475, 7500478.010388390161097 ], [ 525549.851323970011435, 7500614.030079290270805 ], [ 526591.889810179942288, 7500682.031155990436673 ], [ 527430.069593699998222, 7500795.549122979864478 ], [ 528009.380023929988965, 7501104.558906380087137 ], [ 528302.37962347001303, 7501116.061090369708836 ], [ 528419.508611020050012, 7500966.560950050130486 ], [ 528449.42942168994341, 7500976.550271079875529 ], [ 529061.089658710057847, 7501044.56824946962297 ], [ 529763.349431850016117, 7501135.069384420290589 ], [ 530442.982213509967551, 7501135.069277220405638 ], [ 531190.530099679948762, 7501090.091032720170915 ], [ 532255.239534780033864, 7501090.091991020366549 ], [ 532914.749698439962231, 7501129.601234369911253 ], [ 532980.302307370002382, 7500984.598948219791055 ], [ 533649.940938669955358, 7501055.119656150229275 ], [ 534813.658578719943762, 7501213.618710099719465 ], [ 535289.749861310003325, 7501266.619812849909067 ], [ 535871.598377979942597, 7501240.119965040124953 ], [ 536215.441291820025072, 7501319.618713189847767 ], [ 536585.740454040002078, 7501557.629628020338714 ], [ 536718.007789180031978, 7502060.138529310002923 ], [ 536718.008638269966468, 7502615.629928699694574 ], [ 536770.921030709985644, 7502932.640545120462775 ], [ 536956.039038649993017, 7503170.63928843010217 ], [ 537458.561911060009152, 7503118.13959925994277 ], [ 537934.598100109957159, 7502959.149481950327754 ], [ 538490.040202290052548, 7502853.640004459768534 ], [ 539204.189948190003633, 7503038.640902689658105 ], [ 540447.261362720048055, 7503647.150411129929125 ], [ 541293.589129960048012, 7504202.150551839731634 ], [ 542034.149294179980643, 7504704.65143350046128 ], [ 542748.241729310015216, 7505604.149364749900997 ], [ 543197.859995450009592, 7506291.651044440455735 ], [ 543753.311143380007707, 7507006.14853013958782 ], [ 544255.819560579955578, 7507878.650570879690349 ], [ 544520.360227240016684, 7508619.149100380018353 ], [ 544599.691484899958596, 7509307.151234080083668 ], [ 544626.180307739996351, 7509862.650901610031724 ], [ 544864.169698999961838, 7510153.151318330317736 ], [ 545313.800301290000789, 7510444.152128339745104 ], [ 545684.079341580043547, 7510788.140244360081851 ], [ 546213.101779810036533, 7511581.639293549582362 ], [ 546266.225982900010422, 7511758.854636039584875 ], [ 546292.391366260009818, 7511846.137563469819725 ], [ 546345.340604510041885, 7512190.129451249726117 ], [ 546556.911903640022501, 7512613.13760878983885 ], [ 546821.429407270043157, 7512798.150753559544683 ], [ 546847.837919460027479, 7512824.640321739949286 ], [ 547085.848777150036767, 7513142.140599629841745 ], [ 547535.499783820006996, 7513671.140150490216911 ], [ 547799.999848159961402, 7513935.62943566031754 ], [ 548223.188856089953333, 7514147.138311300426722 ], [ 548725.718877919949591, 7514279.629916179925203 ], [ 549069.508477109950036, 7514358.640474690124393 ], [ 549439.771045750007033, 7514570.129413739778101 ], [ 550048.098786800052039, 7514861.130233380012214 ], [ 551106.047744889976457, 7514993.631505040451884 ], [ 551608.528330349945463, 7515258.118888939730823 ], [ 551952.427688780007884, 7515654.62000382039696 ], [ 552005.308401120011695, 7515972.120834840461612 ], [ 552005.320539579959586, 7516316.120233830064535 ], [ 552031.740366630023345, 7516659.61781414039433 ], [ 552111.14043827005662, 7516950.619430690072477 ], [ 552164.019822699949145, 7517056.618780449964106 ], [ 552190.439047339954413, 7517188.608529070392251 ], [ 552137.581058409996331, 7517321.118114409968257 ], [ 551502.840183029999025, 7517850.120681430213153 ], [ 551264.768027849961072, 7518008.639421570114791 ], [ 551000.289480659994297, 7518326.130060980096459 ], [ 550682.909945619991049, 7518934.651580410078168 ], [ 550471.340299690025859, 7519410.668283799663186 ], [ 550048.162290849955752, 7519860.179352750070393 ], [ 549677.920448170043528, 7520204.177992169745266 ], [ 549096.03939349995926, 7520442.179891030304134 ], [ 548620.001067279954441, 7520918.200960939750075 ], [ 548286.730018491391093, 7521273.574077860452235 ], [ 548640.953464290942065, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14338", "objectid": "14339", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 3.2073941479000001, "shape_area": 0.010145258489 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 515687.31005864002509, 7510208.102885807864368 ], [ 516174.411889459996019, 7510353.441098780371249 ], [ 516492.951762130018324, 7510465.937333139590919 ], [ 517020.139190429996233, 7510529.950958830304444 ], [ 517549.060095640015788, 7510678.458123919554055 ], [ 517866.450773890013807, 7510783.959730369970202 ], [ 518141.521315880003385, 7510910.961119780316949 ], [ 518458.888367109990213, 7510995.468531150370836 ], [ 519199.428999839932658, 7511037.968745009973645 ], [ 519612.440949510026257, 7511174.980778340250254 ], [ 519955.938934519945178, 7511198.499291979707778 ], [ 520700.899943009950221, 7511385.498376620002091 ], [ 520993.898059519939125, 7511473.001950009725988 ], [ 521299.68208722001873, 7511585.508881360292435 ], [ 521898.73540557816159, 7511830.16974357701838 ], [ 521898.73540557816159, 7511830.16974357701838 ], [ 521962.327799500024412, 7511849.52925833966583 ], [ 522108.960515180020593, 7511925.032064230181277 ], [ 522459.529177899996284, 7512088.520967369899154 ], [ 522555.290484579978511, 7512171.029042379930615 ], [ 522695.671639500011224, 7512272.040571300312877 ], [ 523116.790019250009209, 7512556.040891540236771 ], [ 523397.980987849994563, 7512841.028172080405056 ], [ 523666.980231429974083, 7513234.038817330263555 ], [ 523930.951113260001875, 7513907.540365519933403 ], [ 524034.479650379973464, 7514276.041863550432026 ], [ 524208.542307230003644, 7514771.52988651022315 ], [ 524426.06841973005794, 7515044.040656699799001 ], [ 524713.438822360010818, 7515278.041626789607108 ], [ 524765.351799699943513, 7515500.540381940081716 ], [ 524696.669458879972808, 7515768.029474440030754 ], [ 524698.002097900025547, 7516048.040206580422819 ], [ 524794.56922211998608, 7516283.027406759560108 ], [ 524916.629481710027903, 7516549.539432030171156 ], [ 524994.87055044004228, 7516944.028645990416408 ], [ 525085.749328059959225, 7517319.029316320084035 ], [ 525227.687564849969931, 7517751.051117460243404 ], [ 525504.700332000036724, 7518468.57182256039232 ], [ 525722.161406980012543, 7518741.078860250301659 ], [ 525945.672333069960587, 7518931.100659869611263 ], [ 526022.688289919984527, 7519064.102008130401373 ], [ 526017.568704079953022, 7519325.110889060422778 ], [ 525935.481611039955169, 7519459.120913409627974 ], [ 525808.730688430019654, 7519542.599877079948783 ], [ 525351.481491480022669, 7519685.100868449546397 ], [ 525199.187788509996608, 7519762.588524759747088 ], [ 525129.969782790052705, 7519909.090361219830811 ], [ 525105.160121239954606, 7520030.097857830114663 ], [ 525099.700741240056232, 7520227.598221190273762 ], [ 525215.56044709996786, 7520507.118261069990695 ], [ 525489.819585519959219, 7520677.630986260250211 ], [ 525974.109962780028582, 7520865.669559930451214 ], [ 526178.051961730001494, 7520960.180783839896321 ], [ 526312.182531099999323, 7521074.180512679740787 ], [ 526401.691515060025267, 7521181.680516350083053 ], [ 526436.227119922172278, 7521273.574077860452235 ], [ 530080.028660500538535, 7521273.574077860452235 ], [ 530198.73958735994529, 7521243.73099188040942 ], [ 530605.669946389971301, 7521228.739805289544165 ], [ 530872.621390014886856, 7521273.574077860452235 ], [ 530992.855844534235075, 7521273.574077860452235 ], [ 531297.701123569975607, 7520983.249538940377533 ], [ 531475.820392590016127, 7520995.249874849803746 ], [ 531685.429601419949904, 7520949.248811120167375 ], [ 532015.559444969985634, 7520826.7419608598575 ], [ 532308.147656969958916, 7520831.239409450441599 ], [ 532499.439517520018853, 7520951.25150972045958 ], [ 532532.178689119988121, 7521142.239576890133321 ], [ 532504.71503138798289, 7521273.574077860452235 ], [ 534942.625705180340447, 7521273.574077860452235 ], [ 534681.910660160006955, 7521156.260567620396614 ], [ 534443.83951988001354, 7520918.249867100268602 ], [ 534232.281925669987686, 7520547.758248940110207 ], [ 534179.310949980048463, 7520336.249023750424385 ], [ 533967.78170361998491, 7520124.748354859650135 ], [ 533518.159608450019732, 7520071.751074260100722 ], [ 533094.969673049985431, 7519992.238394300453365 ], [ 532155.879878710024059, 7520065.750446840189397 ], [ 531917.638871380011551, 7520292.741055970080197 ], [ 531810.931236980017275, 7520234.75136689003557 ], [ 531184.701630669995211, 7520213.250957230105996 ], [ 530515.288809439982288, 7520299.242387680336833 ], [ 529586.688838250003755, 7520623.21959681995213 ], [ 528809.300388630013913, 7520796.221634940244257 ], [ 528606.400429080007598, 7520985.199372570030391 ], [ 528170.259027419961058, 7521093.710383520461619 ], [ 527556.788195970002562, 7520709.689603740349412 ], [ 526779.38138648995664, 7520428.659740010276437 ], [ 526433.861925230012275, 7520191.14070682041347 ], [ 526390.661484980024397, 7520040.141337719745934 ], [ 526498.578610370052047, 7519845.650696289725602 ], [ 526736.171334589947946, 7519608.140634800307453 ], [ 526973.669562230003066, 7519392.128941999748349 ], [ 527168.042084699962288, 7519111.639367979951203 ], [ 527168.028100849944167, 7518874.129576059989631 ], [ 526779.300390499993227, 7518247.606851640157402 ], [ 526541.700464530033059, 7517513.580407430417836 ], [ 526433.760071319993585, 7516757.578540240414441 ], [ 526563.319796859985217, 7516282.581881569698453 ], [ 526476.911097340052947, 7515634.589470960199833 ], [ 525958.598907200037502, 7514835.5597521699965 ], [ 525245.890789909986779, 7513907.069736359640956 ], [ 524684.430742830038071, 7513216.04936845973134 ], [ 524079.779780430020764, 7512503.560726470313966 ], [ 523431.912117369996849, 7511920.551063950173557 ], [ 523243.802212379989214, 7511810.813952400349081 ], [ 523243.704705209995154, 7511810.814099580049515 ], [ 522654.532024319982156, 7511467.028237969614565 ], [ 521963.520088610006496, 7511251.030114050023258 ], [ 521250.897257780015934, 7510927.007610100321472 ], [ 520343.940526639984455, 7510754.501726740039885 ], [ 519501.770507230015937, 7510646.489690399728715 ], [ 518681.190154069976415, 7510473.470780050382018 ], [ 517947.010351110016927, 7510300.959039909765124 ], [ 516564.999997559993062, 7509955.440505569800735 ], [ 515762.921122459985781, 7509734.929779940284789 ], [ 515687.31005864002509, 7509757.969303893856704 ], [ 515687.31005864002509, 7510208.102885807864368 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14338", "objectid": "14339", "lithstrtno": "2258", "code": "A-HAm-cib", "unitname": "Marra Mamba Iron Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Chert banded iron-formation mudstone and siltstone; minor carbonate; metamorphosed", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": "banded", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Marra Mamba Iron Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2629", "maxuncerty": null, "min_age_ma": "2597", "minuncerty": "5", "max_age_da": "Inferred", "min_age_da": "Isotopic", "extract_da": "2016-06-30", "shape_leng": 3.2073941479000001, "shape_area": 0.010145258489 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 544281.873127667000517, 7521273.574077860452235 ], [ 543039.419224540004507, 7521209.209210650064051 ], [ 542420.362362808198668, 7521273.574077860452235 ], [ 544281.873127667000517, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14337", "objectid": "14338", "lithstrtno": "2257", "code": "A-HAd-kd", "unitname": "Wittenoom Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Thinly bedded dolomite and dolomitic shale with minor black chert shale banded iron formation and sandstone", "parentcode": "A-HAL-xkt-ci", "parentname": "Hamersley Group lower", "rocktype1": "sedimentary carbonate", "lithname1": "dolostone/dolomite", "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group lower", "formation": "Wittenoom Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2597", "maxuncerty": "5", "min_age_ma": "2504", "minuncerty": null, "max_age_da": "Isotopic", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 2.2261876858599998, "shape_area": 0.0140304625072 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 542420.362362808198668, 7521273.574077860452235 ], [ 543039.419224540004507, 7521209.209210650064051 ], [ 544281.873127667000517, 7521273.574077860452235 ], [ 548286.730018491391093, 7521273.574077860452235 ], [ 548620.001067279954441, 7520918.200960939750075 ], [ 549096.03939349995926, 7520442.179891030304134 ], [ 549677.920448170043528, 7520204.177992169745266 ], [ 550048.162290849955752, 7519860.179352750070393 ], [ 550471.340299690025859, 7519410.668283799663186 ], [ 550682.909945619991049, 7518934.651580410078168 ], [ 551000.289480659994297, 7518326.130060980096459 ], [ 551264.768027849961072, 7518008.639421570114791 ], [ 551502.840183029999025, 7517850.120681430213153 ], [ 552137.581058409996331, 7517321.118114409968257 ], [ 552190.439047339954413, 7517188.608529070392251 ], [ 552164.019822699949145, 7517056.618780449964106 ], [ 552111.14043827005662, 7516950.619430690072477 ], [ 552031.740366630023345, 7516659.61781414039433 ], [ 552005.320539579959586, 7516316.120233830064535 ], [ 552005.308401120011695, 7515972.120834840461612 ], [ 551952.427688780007884, 7515654.62000382039696 ], [ 551608.528330349945463, 7515258.118888939730823 ], [ 551106.047744889976457, 7514993.631505040451884 ], [ 550048.098786800052039, 7514861.130233380012214 ], [ 549439.771045750007033, 7514570.129413739778101 ], [ 549069.508477109950036, 7514358.640474690124393 ], [ 548725.718877919949591, 7514279.629916179925203 ], [ 548223.188856089953333, 7514147.138311300426722 ], [ 547799.999848159961402, 7513935.62943566031754 ], [ 547535.499783820006996, 7513671.140150490216911 ], [ 547085.848777150036767, 7513142.140599629841745 ], [ 546847.837919460027479, 7512824.640321739949286 ], [ 546821.429407270043157, 7512798.150753559544683 ], [ 546556.911903640022501, 7512613.13760878983885 ], [ 546345.340604510041885, 7512190.129451249726117 ], [ 546292.391366260009818, 7511846.137563469819725 ], [ 546266.225982900010422, 7511758.854636039584875 ], [ 546213.101779810036533, 7511581.639293549582362 ], [ 545684.079341580043547, 7510788.140244360081851 ], [ 545313.800301290000789, 7510444.152128339745104 ], [ 544864.169698999961838, 7510153.151318330317736 ], [ 544626.180307739996351, 7509862.650901610031724 ], [ 544599.691484899958596, 7509307.151234080083668 ], [ 544520.360227240016684, 7508619.149100380018353 ], [ 544255.819560579955578, 7507878.650570879690349 ], [ 543753.311143380007707, 7507006.14853013958782 ], [ 543197.859995450009592, 7506291.651044440455735 ], [ 542748.241729310015216, 7505604.149364749900997 ], [ 542034.149294179980643, 7504704.65143350046128 ], [ 541293.589129960048012, 7504202.150551839731634 ], [ 540447.261362720048055, 7503647.150411129929125 ], [ 539204.189948190003633, 7503038.640902689658105 ], [ 538490.040202290052548, 7502853.640004459768534 ], [ 537934.598100109957159, 7502959.149481950327754 ], [ 537458.561911060009152, 7503118.13959925994277 ], [ 536956.039038649993017, 7503170.63928843010217 ], [ 536770.921030709985644, 7502932.640545120462775 ], [ 536718.008638269966468, 7502615.629928699694574 ], [ 536718.007789180031978, 7502060.138529310002923 ], [ 536585.740454040002078, 7501557.629628020338714 ], [ 536215.441291820025072, 7501319.618713189847767 ], [ 535871.598377979942597, 7501240.119965040124953 ], [ 535289.749861310003325, 7501266.619812849909067 ], [ 534813.658578719943762, 7501213.618710099719465 ], [ 533649.940938669955358, 7501055.119656150229275 ], [ 532980.302307370002382, 7500984.598948219791055 ], [ 532914.749698439962231, 7501129.601234369911253 ], [ 532255.239534780033864, 7501090.091991020366549 ], [ 531190.530099679948762, 7501090.091032720170915 ], [ 530442.982213509967551, 7501135.069277220405638 ], [ 529763.349431850016117, 7501135.069384420290589 ], [ 529061.089658710057847, 7501044.56824946962297 ], [ 528449.42942168994341, 7500976.550271079875529 ], [ 528419.508611020050012, 7500966.560950050130486 ], [ 528302.37962347001303, 7501116.061090369708836 ], [ 528055.80054874997586, 7501423.059336570091546 ], [ 529283.510124549968168, 7501486.060903140343726 ], [ 529735.54628834000323, 7501486.244186529889703 ], [ 530418.709116179961711, 7501486.495882200077176 ], [ 531172.410778839956038, 7501486.738344410434365 ], [ 532463.803578209946863, 7501487.067533879540861 ], [ 532622.259100739960559, 7501487.100418940186501 ], [ 532540.009993170038797, 7501632.111001109704375 ], [ 532856.65218931005802, 7501611.11120583023876 ], [ 533444.018584429984912, 7501684.610329260118306 ], [ 534325.121031209942885, 7501880.119671490043402 ], [ 534985.921421359991655, 7502076.121785869821906 ], [ 535646.811027529998682, 7502516.630293989554048 ], [ 535891.528701080009341, 7502908.137486189603806 ], [ 536013.901978750014678, 7503250.640689079649746 ], [ 536258.679497829987668, 7503520.142049100250006 ], [ 536527.908533600042574, 7503593.64957720041275 ], [ 536992.93201675999444, 7503520.142260869964957 ], [ 537555.862850739969872, 7503544.648875479586422 ], [ 538020.880797310033813, 7503667.152258199639618 ], [ 538755.142619839985855, 7503960.650235869921744 ], [ 539244.629889119998552, 7504132.149919520132244 ], [ 540125.770195159944706, 7504572.649722670204937 ], [ 540762.078696239972487, 7504939.64010277017951 ], [ 541716.579055089969188, 7505698.161702239885926 ], [ 541936.889746180037037, 7506065.650917610153556 ], [ 542157.18836409994401, 7506530.64897022023797 ], [ 542426.430921099963598, 7507142.661000530235469 ], [ 542597.751156199956313, 7507729.650091419927776 ], [ 542622.220380789949559, 7508170.659347269684076 ], [ 542866.960801149951294, 7508635.647619180381298 ], [ 543136.210824489942752, 7508978.151689469814301 ], [ 543283.109859740012325, 7509198.147471319884062 ], [ 543356.489253900013864, 7509687.648783350363374 ], [ 543381.021468420047313, 7510324.151035180315375 ], [ 543478.910323719959706, 7510911.660685740411282 ], [ 543601.278376020025462, 7511278.650549460202456 ], [ 543772.59828351996839, 7511548.157806159928441 ], [ 544029.577797919977456, 7511765.412042209878564 ], [ 544090.778932159999385, 7511817.15087560005486 ], [ 544335.540762530057691, 7512062.148802960291505 ], [ 544482.410793130053207, 7512551.6588896503672 ], [ 544482.418259960017167, 7513016.647983860224485 ], [ 544678.24831814004574, 7513799.659713629633188 ], [ 544825.082816450041719, 7514215.658196600154042 ], [ 545314.569968260009773, 7514632.161047049798071 ], [ 545632.76747008995153, 7514803.15205886028707 ], [ 546146.721682289964519, 7514876.650525569915771 ], [ 546513.859153309953399, 7515023.638733309693635 ], [ 546758.599542230018415, 7515243.660391540266573 ], [ 546880.978811490000226, 7515611.148687190376222 ], [ 546954.42878852004651, 7515806.658421809785068 ], [ 547248.119517949991859, 7516051.66193072963506 ], [ 547615.228354310034774, 7516271.648910780437291 ], [ 547933.449674039962701, 7516369.641400409862399 ], [ 548447.359045919962227, 7516541.141613990068436 ], [ 548790.080467739957385, 7516712.149872760288417 ], [ 548887.949365769978613, 7517006.139925830066204 ], [ 548814.528343240031973, 7517299.638577819801867 ], [ 548643.208647969993763, 7517520.139687079936266 ], [ 548422.971490449970588, 7517764.649379810318351 ], [ 548276.089059549965896, 7518083.15027062036097 ], [ 548055.852417140034959, 7518401.159735480323434 ], [ 547541.840230589965358, 7518939.660958710126579 ], [ 547076.849915059981868, 7519282.180675569921732 ], [ 546464.969501200015657, 7519478.178228080272675 ], [ 545755.238412400009111, 7519649.69032904971391 ], [ 545094.439139469992369, 7519771.689673730172217 ], [ 544262.249843609984964, 7520065.68780876044184 ], [ 543577.010112980031408, 7520212.209388909861445 ], [ 542671.450893379980698, 7520383.709697290323675 ], [ 541937.188143379986286, 7520653.210939779877663 ], [ 541521.121391479973681, 7520848.708374029956758 ], [ 540982.640750179998577, 7521020.221449459902942 ], [ 540272.898704249993898, 7520922.218769470229745 ], [ 539807.878525439999066, 7520750.719968990422785 ], [ 539342.811559570021927, 7520555.229987599886954 ], [ 539000.201804729993455, 7520285.721641919575632 ], [ 538608.648913390003145, 7519894.229630409739912 ], [ 538265.961347240023315, 7519673.72992848046124 ], [ 537825.370399679988623, 7519576.228570929728448 ], [ 537384.898478670045733, 7519429.231762089766562 ], [ 536724.078674650052562, 7518988.738700640387833 ], [ 536112.210407849983312, 7518646.248493609949946 ], [ 535108.697880489984527, 7518450.237544589675963 ], [ 533909.450898190028965, 7518499.250098859891295 ], [ 533028.401630589971319, 7518401.250747869722545 ], [ 532392.009412940009497, 7518401.250288999639452 ], [ 531462.029136199969798, 7518205.26035728957504 ], [ 530752.209263560012914, 7518009.750843860208988 ], [ 530164.801248240051791, 7517789.222396439872682 ], [ 529773.12969517998863, 7517397.709674839861691 ], [ 529601.811084239976481, 7517030.700361669994891 ], [ 529675.219794600037858, 7516663.697559090331197 ], [ 529846.538256110041402, 7516247.207606200128794 ], [ 530091.311437780037522, 7515684.222140549682081 ], [ 530115.820970879984088, 7515146.220316509716213 ], [ 529748.660451899981126, 7514852.208768350072205 ], [ 529528.320054790005088, 7514632.188188039697707 ], [ 529552.831549320020713, 7514338.19016341958195 ], [ 529650.70078537997324, 7514044.698509619571269 ], [ 529552.809830010053702, 7513653.199009819887578 ], [ 529283.53027829003986, 7513310.179969239979982 ], [ 528965.390379579970613, 7513114.681486169807613 ], [ 528451.322689770022407, 7512992.157981620170176 ], [ 527766.012258989969268, 7512845.148149039596319 ], [ 526786.8993170800386, 7512576.111894340254366 ], [ 526174.970592719968408, 7512331.08860176987946 ], [ 525636.488515109987929, 7512135.577202550135553 ], [ 525112.657200939953327, 7511807.879730549640954 ], [ 525049.020320000010543, 7511768.067746119573712 ], [ 524461.650530240032822, 7511278.559725630097091 ], [ 523849.760689369984902, 7510813.54871303960681 ], [ 522846.268818399985321, 7510275.031419220380485 ], [ 521671.439029879984446, 7509957.018936470150948 ], [ 520790.33930395997595, 7509810.000191969797015 ], [ 519982.678381100005936, 7509614.489995859563351 ], [ 518912.777727360022254, 7509330.469264090061188 ], [ 518067.749226149986498, 7509452.469257179647684 ], [ 517746.860329139977694, 7509496.468574389815331 ], [ 517524.078368620015681, 7509517.960638030432165 ], [ 517412.839451649982948, 7509467.451953100040555 ], [ 516923.330806820013095, 7509295.960885399952531 ], [ 516262.539369589998387, 7509100.438068529590964 ], [ 515748.540348690003157, 7509100.438180999830365 ], [ 515687.31005864002509, 7509097.518641549162567 ], [ 515687.31005864002509, 7509757.969303893856704 ], [ 515762.921122459985781, 7509734.929779940284789 ], [ 516564.999997559993062, 7509955.440505569800735 ], [ 517947.010351110016927, 7510300.959039909765124 ], [ 518681.190154069976415, 7510473.470780050382018 ], [ 519501.770507230015937, 7510646.489690399728715 ], [ 520343.940526639984455, 7510754.501726740039885 ], [ 521250.897257780015934, 7510927.007610100321472 ], [ 521963.520088610006496, 7511251.030114050023258 ], [ 522654.532024319982156, 7511467.028237969614565 ], [ 523243.704705209995154, 7511810.814099580049515 ], [ 523243.802212379989214, 7511810.813952400349081 ], [ 523431.912117369996849, 7511920.551063950173557 ], [ 524079.779780430020764, 7512503.560726470313966 ], [ 524684.430742830038071, 7513216.04936845973134 ], [ 525245.890789909986779, 7513907.069736359640956 ], [ 525958.598907200037502, 7514835.5597521699965 ], [ 526476.911097340052947, 7515634.589470960199833 ], [ 526563.319796859985217, 7516282.581881569698453 ], [ 526433.760071319993585, 7516757.578540240414441 ], [ 526541.700464530033059, 7517513.580407430417836 ], [ 526779.300390499993227, 7518247.606851640157402 ], [ 527168.028100849944167, 7518874.129576059989631 ], [ 527168.042084699962288, 7519111.639367979951203 ], [ 526973.669562230003066, 7519392.128941999748349 ], [ 526736.171334589947946, 7519608.140634800307453 ], [ 526498.578610370052047, 7519845.650696289725602 ], [ 526390.661484980024397, 7520040.141337719745934 ], [ 526433.861925230012275, 7520191.14070682041347 ], [ 526779.38138648995664, 7520428.659740010276437 ], [ 527556.788195970002562, 7520709.689603740349412 ], [ 528170.259027419961058, 7521093.710383520461619 ], [ 528606.400429080007598, 7520985.199372570030391 ], [ 528809.300388630013913, 7520796.221634940244257 ], [ 529586.688838250003755, 7520623.21959681995213 ], [ 530515.288809439982288, 7520299.242387680336833 ], [ 531184.701630669995211, 7520213.250957230105996 ], [ 531810.931236980017275, 7520234.75136689003557 ], [ 531917.638871380011551, 7520292.741055970080197 ], [ 532155.879878710024059, 7520065.750446840189397 ], [ 533094.969673049985431, 7519992.238394300453365 ], [ 533518.159608450019732, 7520071.751074260100722 ], [ 533967.78170361998491, 7520124.748354859650135 ], [ 534179.310949980048463, 7520336.249023750424385 ], [ 534232.281925669987686, 7520547.758248940110207 ], [ 534443.83951988001354, 7520918.249867100268602 ], [ 534681.910660160006955, 7521156.260567620396614 ], [ 534942.625705180340447, 7521273.574077860452235 ], [ 542420.362362808198668, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.14352", "objectid": "14353", "lithstrtno": "4143", "code": "A-FOu-bbo", "unitname": "Bunjinah Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Pillowed and massive basaltic flows; basaltic breccia and basaltic volcanic sandstone; minor chert; amygdaloidal basalt flows occur in upper parts of formation; metamorphosed", "parentcode": "A-FOS4-xbs-bbo", "parentname": "Fortescue Group sequence 4", "rocktype1": "igneous mafic volcanic", "lithname1": "basalt", "qualifier1": "pillowed", "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Fortescue Group", "subgroup": "Fortescue Group sequence 4", "formation": "Bunjinah Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "Large igneous provinces and dyke swarms; West Australian Craton", "ssuite_tec": "Fortescue Large Igneous Province", "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Fortescue Basin", "subbasin": "South Pilbara Sub-basin", "subbasin_e": null, "orogen": null, "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Edmundian Orogeny (1026 - 954 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); Pilbara Craton breakup (2775 - 2445 Ma)", "agefrom": "Neoarchean", "ageto": "Neoarchean", "max_age_ma": "2718", "maxuncerty": null, "min_age_ma": "2715", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.17951522395, "shape_area": 0.030201118051600001 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 519198.644056729972363, 7521273.574077860452235 ], [ 519259.250695589988027, 7521128.530878730118275 ], [ 519320.012013149971608, 7520759.712071959860623 ], [ 519545.337666210078169, 7519817.816332059912384 ], [ 519514.363417299988214, 7519528.12835447024554 ], [ 519366.991627420007717, 7519166.154731409624219 ], [ 519207.277663080021739, 7518718.593676960095763 ], [ 519182.539155819977168, 7518514.49831182975322 ], [ 519047.605427510046866, 7518297.369738539680839 ], [ 519041.232609779981431, 7518093.251300070434809 ], [ 518985.690145989996381, 7517724.575489370152354 ], [ 518936.513313480012584, 7517553.433111510239542 ], [ 518893.289090209989808, 7517244.004207690246403 ], [ 518954.139981639978942, 7516954.201637290418148 ], [ 519027.343064780056011, 7516756.569857959635556 ], [ 519100.495351070072502, 7516519.429266070015728 ], [ 519112.352786110073794, 7516209.932219609618187 ], [ 519041.141933470033109, 7515922.438162029720843 ], [ 519418.43464920000406, 7515485.763669109903276 ], [ 519392.477506569994148, 7515090.1774812201038 ], [ 519282.04083986999467, 7514866.434735249727964 ], [ 519238.956251360010356, 7514668.946241379715502 ], [ 519177.628758140024729, 7514563.666787220165133 ], [ 519018.356625669985078, 7514432.16913719009608 ], [ 519103.875308650021907, 7514306.953248229809105 ], [ 519198.755447090021335, 7514197.602240430191159 ], [ 519174.829437980020884, 7514092.451116800308228 ], [ 519123.1404266700265, 7513920.458620489574969 ], [ 519065.141182710009161, 7513761.960031550377607 ], [ 518968.77945902000647, 7513552.458231610246003 ], [ 518910.620095279999077, 7513355.46910130046308 ], [ 518871.588630190002732, 7513177.461551469750702 ], [ 518852.321420539985411, 7513132.95880111027509 ], [ 518681.600405959994532, 7513163.460244859568775 ], [ 517568.778656709997449, 7513362.440888900309801 ], [ 517536.821597650006879, 7513324.449564079754055 ], [ 517453.790812560007907, 7513254.941454670391977 ], [ 517211.341055419994518, 7513084.441398180089891 ], [ 516950.179108329990413, 7512996.938222900032997 ], [ 516581.109581539989449, 7512947.942037159577012 ], [ 516218.100934160000179, 7512841.928693260066211 ], [ 515874.111506199988071, 7512722.429059149697423 ], [ 515687.31005864002509, 7512669.795848976820707 ], [ 515687.31005864002509, 7521273.574077860452235 ], [ 519198.644056729972363, 7521273.574077860452235 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.6148", "objectid": "6148", "lithstrtno": "4111", "code": "P_-HAj-xci-od", "unitname": "Weeli Wolli Formation", "gswastatus": "Formal", "rank": "Formation", "descriptn": "Banded iron-formation (commonly jaspilitic) mudstone siltstone and numerous dolerite sills; metamorphosed", "parentcode": "P_-HAU-xci-f", "parentname": "Hamersley Group upper", "rocktype1": "sedimentary other chemical or biochemical", "lithname1": "iron formation", "qualifier1": null, "qualifier2": null, "mixedrock": "Mixed", "rocktype2": "igneous mafic intrusive", "lithname2": "dolerite", "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": "Mount Bruce Supergroup", "group_": "Hamersley Group", "subgroup": "Hamersley Group upper", "formation": "Weeli Wolli Formation", "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": null, "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": "Hamersley Basin", "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": null, "events": "Paterson Orogeny (635 - 540 Ma); Miles Orogeny (650 - 600 Ma); Edmundian Orogeny (1026 - 954 Ma); Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma); South Pilbara Subsidence (2690 - 2445 Ma)", "agefrom": "Paleoproterozoic", "ageto": "Paleoproterozoic", "max_age_ma": "2451", "maxuncerty": null, "min_age_ma": "2450", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 1.1135762550099999, "shape_area": 0.0039900960217600003 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 538523.479636730044149, 7511559.700316119939089 ], [ 539052.388189609977417, 7511268.680436610244215 ], [ 539422.657859849976376, 7510951.691127830184996 ], [ 539660.669795469962992, 7510607.68016923032701 ], [ 539898.727658509975299, 7510184.68239211011678 ], [ 540057.371062460006215, 7509681.668901289813221 ], [ 540295.36945720994845, 7509391.167218109592795 ], [ 540480.470579440006986, 7509232.170064670033753 ], [ 540612.738463919959031, 7509073.658652099780738 ], [ 540665.58149836002849, 7508571.170081409625709 ], [ 540348.211415769997984, 7507671.659639820456505 ], [ 539925.049874530057423, 7507090.157736930064857 ], [ 539607.670671500032768, 7506746.159959820099175 ], [ 539052.200798930018209, 7506296.660687520168722 ], [ 538205.909480990027077, 7505952.669931390322745 ], [ 537068.65092739998363, 7505741.16039321012795 ], [ 536169.390165189979598, 7505661.661419860087335 ], [ 535217.291988059994765, 7505503.150627369992435 ], [ 534635.430171989952214, 7505317.651213020086288 ], [ 534027.099943720037118, 7504974.140041249804199 ], [ 533603.881771669955924, 7504709.627261539921165 ], [ 533233.651434050058015, 7504312.631727330386639 ], [ 532466.618771139997989, 7503969.120871730148792 ], [ 531858.340914499945939, 7503651.619851970113814 ], [ 531329.338967559975572, 7503360.611643849872053 ], [ 531092.210039410041645, 7503242.110120669938624 ], [ 530852.970184960053302, 7503491.101557740010321 ], [ 530292.318035469972529, 7503316.099201279692352 ], [ 529603.48162614996545, 7503154.079038679599762 ], [ 529076.73118856002111, 7502911.078795489855111 ], [ 528266.309425930026919, 7502728.569669179618359 ], [ 527759.809933159966022, 7502688.05957665015012 ], [ 527233.139290379942395, 7502607.06084899045527 ], [ 527002.751236020005308, 7502588.051300699822605 ], [ 527190.810228800051846, 7502380.041910080239177 ], [ 526700.850970900035463, 7502355.539378190413117 ], [ 525246.218477030051872, 7502408.520923149771988 ], [ 524294.111731779994443, 7502249.520968340337276 ], [ 523447.779692990006879, 7502091.009804819710553 ], [ 522521.981803109985776, 7501847.499487180262804 ], [ 522422.251586830010638, 7501924.491564869880676 ], [ 521104.139196379983332, 7501751.480945750139654 ], [ 520737.772135290026199, 7501723.97868109960109 ], [ 520343.178845660004299, 7501712.978961739689112 ], [ 519636.90140195999993, 7501633.958211430348456 ], [ 519121.281781309982762, 7501534.949975430034101 ], [ 518389.210392989974935, 7501379.9494513804093 ], [ 517873.439548989990726, 7501235.941138340160251 ], [ 517978.502588119998109, 7501117.440985379740596 ], [ 517828.959920339984819, 7501072.440090700052679 ], [ 517608.669631719996687, 7501023.44241841044277 ], [ 517168.148241000017151, 7500949.939010259695351 ], [ 516703.129406480002217, 7500900.92979499977082 ], [ 516189.159643939987291, 7500778.418782180175185 ], [ 515687.31005864002509, 7500678.361180524341762 ], [ 515687.31005864002509, 7501381.228581719100475 ], [ 516208.029622350004502, 7501404.430479659698904 ], [ 516513.439839239930734, 7501427.929280590265989 ], [ 516806.139175439951941, 7501470.929028630256653 ], [ 517041.529127980000339, 7501482.438852850347757 ], [ 517493.280382250028197, 7501530.939766810275614 ], [ 517626.978287780017126, 7501568.438148479908705 ], [ 517439.452265209984034, 7501894.939140919595957 ], [ 518147.140985219972208, 7502100.460410409606993 ], [ 518734.541179510008078, 7502246.968182840384543 ], [ 519573.797612159978598, 7502354.695541289635003 ], [ 520967.450855029979721, 7502533.48075976036489 ], [ 521973.58024351997301, 7502730.490436179563403 ], [ 522979.729673549998552, 7502796.00996265001595 ], [ 524313.980666519957595, 7502993.020090309903026 ], [ 525298.209493739996105, 7503146.041082710027695 ], [ 526129.429774809977971, 7503146.04971828032285 ], [ 526610.599389689974487, 7503255.540216240100563 ], [ 526960.550516100018285, 7503255.548426319845021 ], [ 527507.377630549948663, 7503343.059446619823575 ], [ 528797.900004970026202, 7503627.080213760025799 ], [ 529213.502345059998333, 7503780.581910129636526 ], [ 529716.559640730032697, 7503911.601014990359545 ], [ 530330.938629699987359, 7504034.600131249986589 ], [ 530456.141345420037396, 7503904.60914792958647 ], [ 530728.50931001000572, 7504046.609459710307419 ], [ 531906.171165960025974, 7504513.618821060284972 ], [ 532495.011441659997217, 7504737.120717509649694 ], [ 533022.90101448004134, 7505082.130395379848778 ], [ 533489.917933249962516, 7505488.139462489634752 ], [ 534038.1795864100568, 7505813.147930650040507 ], [ 534931.557807549950667, 7506158.158888090401888 ], [ 535743.688247720012441, 7506361.159436600282788 ], [ 536616.771521440008655, 7506544.169201100245118 ], [ 537002.52044387999922, 7506686.161332639865577 ], [ 537428.930559089989401, 7507011.171658460050821 ], [ 537631.980831310036592, 7507214.168417110107839 ], [ 538180.211560850031674, 7507599.671520809642971 ], [ 538586.329662399948575, 7507965.169740119948983 ], [ 539012.7302670100471, 7508493.181885650381446 ], [ 539134.550768380053341, 7509041.669524259865284 ], [ 539114.237828589975834, 7509528.669906909577549 ], [ 538972.159902979969047, 7509914.689756290055811 ], [ 538626.999142840038985, 7510523.679197969846427 ], [ 538322.440249609993771, 7510706.688930760137737 ], [ 537266.720861639943905, 7511153.20205038972199 ], [ 536515.48107646999415, 7511295.209174829535186 ], [ 535845.449424559948966, 7511457.710090230219066 ], [ 534870.880958189954981, 7511559.220930890180171 ], [ 534079.009040210046805, 7511478.210979480296373 ], [ 533510.480061769951135, 7511234.208642659708858 ], [ 532292.230620560003445, 7510767.219354189932346 ], [ 531297.329562349943444, 7510503.211238949559629 ], [ 530282.090520340017974, 7510219.191589759662747 ], [ 529408.909576560021378, 7509934.658954329788685 ], [ 528759.181210299953818, 7509752.148616939783096 ], [ 527891.170337439980358, 7509549.630575990304351 ], [ 527150.572323399945162, 7509258.600825910456479 ], [ 526304.178405749960802, 7509047.079424640163779 ], [ 525537.161682610050775, 7508888.560437959618866 ], [ 524796.650109110050835, 7508809.060238439589739 ], [ 524135.411504069983494, 7508571.05088615976274 ], [ 523447.751102910027839, 7508491.531642080284655 ], [ 522495.619599480007309, 7508412.019790690392256 ], [ 522046.009716300060973, 7508306.518230189569294 ], [ 521252.569250860018656, 7508095.008492359891534 ], [ 520459.120535549998749, 7507962.499755850061774 ], [ 519692.141436650010291, 7507777.478591890074313 ], [ 518845.808005279977806, 7507697.980592619627714 ], [ 517884.809234520071186, 7507626.45950067974627 ], [ 517617.678937539982144, 7507621.458239920437336 ], [ 516974.989065799978562, 7507529.450941889546812 ], [ 516567.649635889974888, 7507461.461209960281849 ], [ 516077.559980659978464, 7507374.940313899889588 ], [ 515727.401673869986553, 7507294.44228694960475 ], [ 515687.31005864002509, 7507284.364434811286628 ], [ 515687.31005864002509, 7507785.320344283245504 ], [ 516143.467740970023442, 7507858.440086290240288 ], [ 516913.610774539993145, 7507994.460242169909179 ], [ 517735.199112029979005, 7508250.968857959844172 ], [ 518142.959838100010529, 7508401.480365029536188 ], [ 518760.529426419991069, 7508556.979971840046346 ], [ 519206.109573089983314, 7508643.988675179891288 ], [ 519619.891624330019113, 7508736.979432850144804 ], [ 520052.928003809996881, 7508862.000883810222149 ], [ 521090.551235229999293, 7509073.010523959994316 ], [ 522005.951244029973168, 7508998.029494729824364 ], [ 522324.340485139982775, 7509085.020956199616194 ], [ 522451.571022430027369, 7509097.030138160102069 ], [ 522591.621478160028346, 7509122.02742169983685 ], [ 524151.169281380018219, 7509438.051605530083179 ], [ 524456.689746230025776, 7509487.559559389948845 ], [ 525140.43911667005159, 7509496.570468929596245 ], [ 526119.051335679949261, 7509602.579176349565387 ], [ 527124.119997350033373, 7509920.100146099925041 ], [ 527864.742193619953468, 7510184.620799530297518 ], [ 528658.280241169966757, 7510422.639340680092573 ], [ 529451.790100479964167, 7510766.1697186101228 ], [ 530324.61938511999324, 7511057.199628870002925 ], [ 531118.128920490038581, 7511295.218129090033472 ], [ 532096.70017128996551, 7511533.220152160152793 ], [ 532641.346885110018775, 7511793.761994309723377 ], [ 532705.021947950008325, 7511824.22030740045011 ], [ 533233.978675110032782, 7511983.23097356967628 ], [ 533551.350649280007929, 7512221.220540439710021 ], [ 533789.409573909942992, 7512353.23117852024734 ], [ 534344.770069499965757, 7512432.717863479629159 ], [ 535296.879862120025791, 7512379.720972119830549 ], [ 536513.520092790015042, 7512168.211254799738526 ], [ 537492.028700380004011, 7511930.201284980401397 ], [ 537941.651521719992161, 7511797.699529309757054 ], [ 537981.213230650057085, 7511781.517565599642694 ], [ 538523.479636730044149, 7511559.700316119939089 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16190", "objectid": "16192", "lithstrtno": "4464", "code": "A-s-PRK", "unitname": "Rocklea Inlier greenstones", "gswastatus": "Informal", "rank": "Group", "descriptn": "Sedimentary rock undivided; includes oligomicitic and polymictic conglomerate pebbly sandstone mudstone siltstone and chert; metamorphosed", "parentcode": "TOL", "parentname": "_Top Of Litho-Stratigraphic Order", "rocktype1": "sedimentary siliciclastic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": null, "group_": "Rocklea Inlier greenstones", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": "Pilbara Craton", "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": null, "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": "Pilbara Craton Rocklea Inlier", "events": "Mangaroon Orogeny (1682 - 1619 Ma); Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoarchean", "ageto": "Paleoarchean", "max_age_ma": "3530", "maxuncerty": null, "min_age_ma": "3225", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.43955438034200001, "shape_area": 0.0029221001595600002 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 529450.889285249984823, 7483263.000973359681666 ], [ 529712.271662750048563, 7483395.011301290243864 ], [ 530451.509875620016828, 7483716.010619269683957 ], [ 531609.821962340036407, 7483913.028245289810002 ], [ 532143.878973240032792, 7483885.039836630225182 ], [ 532620.120768659980968, 7483729.540241659618914 ], [ 533153.321361340000294, 7483529.539472719654441 ], [ 533705.727482449961826, 7483348.048920690082014 ], [ 534271.189145580050536, 7483237.040472649969161 ], [ 535307.411674660048448, 7483167.559465959668159 ], [ 535745.990270199952647, 7483114.058705699630082 ], [ 536609.530612439964898, 7482836.058942019939423 ], [ 537225.619498300016858, 7482679.579045910388231 ], [ 537816.838914479943924, 7482619.089825170114636 ], [ 539133.091830539982766, 7482586.607948769815266 ], [ 539857.761162020033225, 7482512.638187630102038 ], [ 540327.690057180006988, 7482376.638795359991491 ], [ 540816.150883599999361, 7482125.660042230039835 ], [ 541349.728197410004213, 7481989.161317829973996 ], [ 541902.139656650018878, 7481820.681552739813924 ], [ 542435.340712219942361, 7481607.680911930277944 ], [ 542961.651990619953722, 7481286.66906442027539 ], [ 543278.448427070048638, 7481036.680964759550989 ], [ 543714.721562610007823, 7480620.180760269984603 ], [ 544064.201096069999039, 7480214.180569579824805 ], [ 544368.639762139995582, 7479729.680836910381913 ], [ 545000.019705810002051, 7478579.670257880352437 ], [ 544323.518753150012344, 7479210.680796929635108 ], [ 543850.099438710021786, 7479563.177159620448947 ], [ 543539.54005779, 7479775.17871059011668 ], [ 543273.430744710029103, 7479986.681214369833469 ], [ 542810.168601599987596, 7480186.172313690185547 ], [ 542003.921304309973493, 7480483.660549759864807 ], [ 541528.288530569989234, 7480753.667894080281258 ], [ 540899.980495239957236, 7481030.660386419855058 ], [ 540092.788811390055344, 7481117.631719100289047 ], [ 539450.069282670039684, 7481044.61925155017525 ], [ 538902.020067770034075, 7480793.10108061041683 ], [ 538468.262211170047522, 7480515.588263570331037 ], [ 537775.93181324005127, 7480703.57045697979629 ], [ 536441.719193030032329, 7480978.031349030323327 ], [ 534592.610763909993693, 7481281.007791340351105 ], [ 533085.269960989942774, 7481251.001002860255539 ], [ 531488.108066829969175, 7481043.489093760028481 ], [ 529827.910515989991836, 7480963.489905229769647 ], [ 529856.887474340037443, 7481720.479547889903188 ], [ 526736.961849370039999, 7480922.959662619978189 ], [ 525590.138856749981642, 7480549.457734939642251 ], [ 525046.501200460013933, 7480304.959696309641004 ], [ 524662.731309870025143, 7480154.449138020165265 ], [ 524826.821140169980936, 7480442.957518120296299 ], [ 525063.879986720043235, 7480804.459229090251029 ], [ 525383.569695619982667, 7481165.460271639749408 ], [ 525837.131990249967203, 7481589.469329429790378 ], [ 526219.932036489946768, 7481860.981002789922059 ], [ 526647.460255819954909, 7482145.481460879556835 ], [ 527449.948290279950015, 7482483.479327520355582 ], [ 528058.949573489953764, 7482635.489615900442004 ], [ 528604.2699740199605, 7482816.493775309994817 ], [ 528762.380300409975462, 7482897.498404650017619 ], [ 528966.250386580009945, 7482979.001210840418935 ], [ 529208.522589650005102, 7483111.489456219598651 ], [ 529450.889285249984823, 7483263.000973359681666 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.16613", "objectid": "16615", "lithstrtno": "4468", "code": "A-b-PRK", "unitname": "Rocklea Inlier greenstones", "gswastatus": "Informal", "rank": "Group", "descriptn": "Basaltic and andesitic flows and associated volcaniclastic rocks; metamorphosed", "parentcode": "TOL", "parentname": "_Top Of Litho-Stratigraphic Order", "rocktype1": "igneous mafic volcanic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": null, "group_": "Rocklea Inlier greenstones", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": "Pilbara Craton", "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": null, "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": "Pilbara Craton Rocklea Inlier", "events": "Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoarchean", "ageto": "Paleoarchean", "max_age_ma": "3530", "maxuncerty": null, "min_age_ma": "3225", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.104657956473, "shape_area": 0.000399970249741 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 541976.461132270051166, 7477384.1186797702685 ], [ 541697.818109209998511, 7477640.132629239931703 ], [ 541616.161132990033366, 7477838.131628380157053 ], [ 541636.100918999989517, 7478022.14067148976028 ], [ 541687.399000389967114, 7478111.151426020078361 ], [ 541865.590316500049084, 7478135.640603840351105 ], [ 542081.720287809963338, 7478115.647714669816196 ], [ 542393.06988393003121, 7478075.650498890317976 ], [ 542729.74923455005046, 7477991.149885689839721 ], [ 542990.09090525994543, 7477900.648642280139029 ], [ 543307.510035800049081, 7477803.151486550457776 ], [ 543573.93015111994464, 7477661.651087479665875 ], [ 543776.55077919003088, 7477469.638466229662299 ], [ 543921.910125790047459, 7477284.139257409609854 ], [ 544003.990012840018608, 7477163.14045783970505 ], [ 543984.660283060045913, 7477112.140265529975295 ], [ 543971.598602070007473, 7477042.141102709807456 ], [ 543982.239278460037895, 7476596.631488529965281 ], [ 544019.370185459963977, 7476380.111608060076833 ], [ 544150.728781630052254, 7475933.609804259613156 ], [ 544257.600703369942494, 7475666.100282370112836 ], [ 544440.75061997002922, 7475397.621103939600289 ], [ 544699.739898180007003, 7475046.109928339719772 ], [ 544653.91856421995908, 7474766.098375639878213 ], [ 544653.680978709948249, 7474709.098554720170796 ], [ 544640.56158791994676, 7474632.590177119709551 ], [ 544614.657629659981467, 7474531.080400019884109 ], [ 544569.630512499948964, 7474416.591412509791553 ], [ 544486.539540939964354, 7474334.580349479801953 ], [ 544358.990066859987564, 7474258.580309939570725 ], [ 544212.599255779990926, 7474234.069832229986787 ], [ 544047.288378549972549, 7474254.069900260306895 ], [ 543913.939341529970989, 7474280.059067719615996 ], [ 543742.570966850034893, 7474351.060028309933841 ], [ 543539.781323360046372, 7474505.061267970129848 ], [ 543476.690170909976587, 7474607.058913320302963 ], [ 543401.182136880001053, 7474773.069725950248539 ], [ 543345.000719630043022, 7474996.081464770250022 ], [ 543321.48089941998478, 7475397.092186010442674 ], [ 543322.669578160042875, 7475645.588219179771841 ], [ 543336.01063446002081, 7475766.087322100065649 ], [ 543336.910838649957441, 7475963.601623520255089 ], [ 543318.81773221003823, 7476173.599816120229661 ], [ 543275.311478639952838, 7476384.108866070397198 ], [ 543186.939394179964438, 7476524.609273049980402 ], [ 542978.120983900036663, 7476742.119599130004644 ], [ 542769.040812000050209, 7476908.609167319722474 ], [ 541976.461132270051166, 7477384.1186797702685 ] ] ] ] } }, + { "type": "Feature", "properties": { "gml_id": "geol_500k.17012", "objectid": "17014", "lithstrtno": "4468", "code": "A-b-PRK", "unitname": "Rocklea Inlier greenstones", "gswastatus": "Informal", "rank": "Group", "descriptn": "Basaltic and andesitic flows and associated volcaniclastic rocks; metamorphosed", "parentcode": "TOL", "parentname": "_Top Of Litho-Stratigraphic Order", "rocktype1": "igneous mafic volcanic", "lithname1": null, "qualifier1": null, "qualifier2": null, "mixedrock": null, "rocktype2": null, "lithname2": null, "mixedqual1": null, "mixedqual2": null, "wastraunit": null, "supersuite": "0", "suite": null, "supergroup": null, "group_": "Rocklea Inlier greenstones", "subgroup": null, "formation": null, "member": null, "bed": null, "state": "Western Australia", "watectunit": "West Australian Craton", "ssuite_tec": null, "suite_tec": null, "craton": "Pilbara Craton", "superterra": null, "craton_ter": null, "domain_": null, "greenstone": null, "superbasin": null, "basin": null, "subbasin": null, "subbasin_e": null, "orogen": "Capricorn Orogen", "province": null, "prov_tzone": null, "tect_subdi": null, "orog_for": null, "orog_forsu": null, "in_outlier": "Pilbara Craton Rocklea Inlier", "events": "Capricorn Orogeny (1817 - 1772 Ma); Ophthalmian Orogeny (2215 - 2145 Ma)", "agefrom": "Paleoarchean", "ageto": "Paleoarchean", "max_age_ma": "3530", "maxuncerty": null, "min_age_ma": "3225", "minuncerty": null, "max_age_da": "Inferred", "min_age_da": "Inferred", "extract_da": "2016-06-30", "shape_leng": 0.085693325364200004, "shape_area": 0.00030709330269699999 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ 534953.58931184001267, 7476969.910778369754553 ], [ 535099.608665390056558, 7476911.921056929975748 ], [ 535194.419056689948775, 7476790.412126430310309 ], [ 535212.887750589987263, 7476663.410822159610689 ], [ 535205.728069989942014, 7476491.398832309991121 ], [ 535211.111269089975394, 7476293.898190249688923 ], [ 535280.599936189944856, 7476198.388064320199192 ], [ 535369.670986799988896, 7476197.888359400443733 ], [ 535490.719155590049922, 7476241.400933040305972 ], [ 535611.560275529976934, 7476240.900449469685555 ], [ 535763.840431499993429, 7476182.881343989633024 ], [ 535903.080141130019911, 7476041.880046259611845 ], [ 535921.589666099986061, 7475920.879242169670761 ], [ 535869.529938000021502, 7475666.870821200311184 ], [ 535805.28640327998437, 7475539.868359600193799 ], [ 535607.230046520009637, 7475343.3599007204175 ], [ 535358.739262609975412, 7475236.848466210067272 ], [ 535122.788080579950474, 7475116.851750509813428 ], [ 534924.689859559992328, 7474895.340122370049357 ], [ 534559.289050610037521, 7474298.81947829015553 ], [ 534405.599816540023312, 7474076.811073710210621 ], [ 534309.929303199984133, 7474007.319938800297678 ], [ 534239.739184070029296, 7473969.820194629952312 ], [ 534169.689554270007648, 7473944.81766203045845 ], [ 534042.55063718999736, 7473964.319312159903347 ], [ 533909.500624060048722, 7474060.820207010023296 ], [ 533839.941206270013936, 7474137.30896526016295 ], [ 533606.567680730018765, 7474539.840133409947157 ], [ 533569.060644509969279, 7474679.82876287959516 ], [ 533589.118865060037933, 7474883.337138920091093 ], [ 533698.498536749975756, 7475150.349448580294847 ], [ 533851.938362259999849, 7475327.350165169686079 ], [ 534069.050725679961033, 7475510.870088989846408 ], [ 534336.971588350017555, 7475687.870841540396214 ], [ 534515.532393840025179, 7475794.878760449588299 ], [ 534650.109833410009742, 7476004.382077129557729 ], [ 534637.920230860006995, 7476118.879857339896262 ], [ 534587.301779170054942, 7476163.879301480017602 ], [ 534231.747922249953263, 7476286.391005779616535 ], [ 534124.298060990055092, 7476427.40031720045954 ], [ 534137.609933770028874, 7476547.907458799891174 ], [ 534272.04126189998351, 7476738.401521010324359 ], [ 534457.180887729977258, 7476889.919906149618328 ], [ 534711.979972340050153, 7476971.410600939765573 ], [ 534953.58931184001267, 7476969.910778369754553 ] ] ] ] } } + ] + } + \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/structures.geojson b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/structures.geojson new file mode 100644 index 000000000..b72bf3787 --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/geodata_files/hamersley/structures.geojson @@ -0,0 +1,125 @@ +{ +"type": "FeatureCollection", +"name": "structures", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::28350" } }, +"features": [ +{ "type": "Feature", "properties": { "dip": 40, "feature": "Bed", "structypei": "BEIN", "azimuth2": 385.0, "index_righ": 44, "gml_id": "geol_500k.7875", "objectid": "7876", "x": 544642.2938, "y": 7487591.038, "strike": 295 }, "geometry": { "type": "Point", "coordinates": [ 544642.293820059974678, 7487591.03977592010051 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bed", "structypei": "BEIN", "azimuth2": 365.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 542483.2258, "y": 7481908.326, "strike": 275 }, "geometry": { "type": "Point", "coordinates": [ 542483.225818059989251, 7481908.327186710201204 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bed", "structypei": "BEIN", "azimuth2": 435.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 545142.1496, "y": 7476403.279, "strike": 345 }, "geometry": { "type": "Point", "coordinates": [ 545142.149675859953277, 7476403.279564829543233 ] } }, +{ "type": "Feature", "properties": { "dip": 45, "feature": "Bed", "structypei": "BEIN", "azimuth2": 180.0, "index_righ": 59, "gml_id": "geol_500k.16613", "objectid": "16615", "x": 544589.04650000017, "y": 7474660.258, "strike": 90 }, "geometry": { "type": "Point", "coordinates": [ 544589.046589800040238, 7474660.258522219955921 ] } }, +{ "type": "Feature", "properties": { "dip": 65, "feature": "Bed", "structypei": "BEIN", "azimuth2": 385.0, "index_righ": 58, "gml_id": "geol_500k.16190", "objectid": "16192", "x": 542937.7522, "y": 7480363.89, "strike": 295 }, "geometry": { "type": "Point", "coordinates": [ 542937.752261140034534, 7480363.891120349988341 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bed", "structypei": "BEIN", "azimuth2": 370.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 530515.1527, "y": 7485813.617, "strike": 280 }, "geometry": { "type": "Point", "coordinates": [ 530515.152796459966339, 7485813.618083230219781 ] } }, +{ "type": "Feature", "properties": { "dip": 40, "feature": "Bed", "structypei": "BEIN", "azimuth2": 360.0, "index_righ": 11, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 535257.6115, "y": 7499029.614, "strike": 270 }, "geometry": { "type": "Point", "coordinates": [ 535257.61161618004553, 7499029.614669750444591 ] } }, +{ "type": "Feature", "properties": { "dip": 33, "feature": "Bed", "structypei": "BEIN", "azimuth2": 380.0, "index_righ": 18, "gml_id": "geol_500k.7579", "objectid": "7580", "x": 529653.2847, "y": 7489335.508, "strike": 290 }, "geometry": { "type": "Point", "coordinates": [ 529653.284794109989889, 7489335.509747129864991 ] } }, +{ "type": "Feature", "properties": { "dip": 58, "feature": "Bed", "structypei": "BEIN", "azimuth2": 368.0, "index_righ": 58, "gml_id": "geol_500k.16190", "objectid": "16192", "x": 534215.359, "y": 7482401.794, "strike": 278 }, "geometry": { "type": "Point", "coordinates": [ 534215.359097130014561, 7482401.795668199658394 ] } }, +{ "type": "Feature", "properties": { "dip": 62, "feature": "Bed", "structypei": "BEIN", "azimuth2": 378.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 534647.383, "y": 7483231.064, "strike": 288 }, "geometry": { "type": "Point", "coordinates": [ 534647.38303052005358, 7483231.064701600000262 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bed", "structypei": "BEIN", "azimuth2": 388.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 542798.4486, "y": 7481931.798, "strike": 298 }, "geometry": { "type": "Point", "coordinates": [ 542798.44862517004367, 7481931.799839390441775 ] } }, +{ "type": "Feature", "properties": { "dip": 18, "feature": "Bed", "structypei": "BEIN", "azimuth2": 245.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 521454.1924, "y": 7476047.703, "strike": 155 }, "geometry": { "type": "Point", "coordinates": [ 521454.192474320007022, 7476047.70487102959305 ] } }, +{ "type": "Feature", "properties": { "dip": 55, "feature": "Bed", "structypei": "BEIN", "azimuth2": 365.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 530225.4499, "y": 7485223.064, "strike": 275 }, "geometry": { "type": "Point", "coordinates": [ 530225.449946569977328, 7485223.064154690131545 ] } }, +{ "type": "Feature", "properties": { "dip": 30, "feature": "Bed", "structypei": "BEIN", "azimuth2": 335.0, "index_righ": 58, "gml_id": "geol_500k.16190", "objectid": "16192", "x": 529573.7825, "y": 7483273.831, "strike": 245 }, "geometry": { "type": "Point", "coordinates": [ 529573.782564210006967, 7483273.83183818962425 ] } }, +{ "type": "Feature", "properties": { "dip": 70, "feature": "Bed", "structypei": "BEIN", "azimuth2": 400.0, "index_righ": 19, "gml_id": "geol_500k.9861", "objectid": "9862", "x": 531138.1801, "y": 7486699.055, "strike": 310 }, "geometry": { "type": "Point", "coordinates": [ 531138.18012836005073, 7486699.05610470008105 ] } }, +{ "type": "Feature", "properties": { "dip": 50, "feature": "Bed", "structypei": "BEIN", "azimuth2": 190.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 548279.3206, "y": 7493304.279, "strike": 100 }, "geometry": { "type": "Point", "coordinates": [ 548279.320612050010823, 7493304.279292579740286 ] } }, +{ "type": "Feature", "properties": { "dip": 55, "feature": "Bed", "structypei": "BEIN", "azimuth2": 190.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 548279.3206, "y": 7493304.279, "strike": 100 }, "geometry": { "type": "Point", "coordinates": [ 548279.320612050010823, 7493304.279292579740286 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bed", "structypei": "BEIN", "azimuth2": 150.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 541013.1603, "y": 7493387.439, "strike": 60 }, "geometry": { "type": "Point", "coordinates": [ 541013.160391859943047, 7493387.439301080070436 ] } }, +{ "type": "Feature", "properties": { "dip": 30, "feature": "Bed", "structypei": "BEIN", "azimuth2": 420.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 523931.7411, "y": 7473700.519, "strike": 330 }, "geometry": { "type": "Point", "coordinates": [ 523931.741164629987907, 7473700.519519000314176 ] } }, +{ "type": "Feature", "properties": { "dip": 29, "feature": "Bed", "structypei": "BEIN", "azimuth2": 235.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 523931.7411, "y": 7473700.519, "strike": 145 }, "geometry": { "type": "Point", "coordinates": [ 523931.741164629987907, 7473700.519519000314176 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bed", "structypei": "BEIN", "azimuth2": 110.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 536742.2321, "y": 7490698.338, "strike": 20 }, "geometry": { "type": "Point", "coordinates": [ 536742.232167589943856, 7490698.339416770264506 ] } }, +{ "type": "Feature", "properties": { "dip": 50, "feature": "Bed", "structypei": "BEIN", "azimuth2": 190.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 548249.1557, "y": 7493512.489, "strike": 100 }, "geometry": { "type": "Point", "coordinates": [ 548249.155882610008121, 7493512.489554589614272 ] } }, +{ "type": "Feature", "properties": { "dip": 55, "feature": "Bed", "structypei": "BEIN", "azimuth2": 190.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 548249.1557, "y": 7493512.489, "strike": 100 }, "geometry": { "type": "Point", "coordinates": [ 548249.155882610008121, 7493512.489554589614272 ] } }, +{ "type": "Feature", "properties": { "dip": 63, "feature": "Bed", "structypei": "BEIN", "azimuth2": 355.0, "index_righ": 43, "gml_id": "geol_500k.15988", "objectid": "15990", "x": 523989.5436, "y": 7500823.547, "strike": 265 }, "geometry": { "type": "Point", "coordinates": [ 523989.543662509997375, 7500823.547114609740674 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bed", "structypei": "BEIN", "azimuth2": 105.0, "index_righ": 28, "gml_id": "geol_500k.16191", "objectid": "16193", "x": 544579.1636, "y": 7477239.626, "strike": 15 }, "geometry": { "type": "Point", "coordinates": [ 544579.163606690010056, 7477239.626580419950187 ] } }, +{ "type": "Feature", "properties": { "dip": 21, "feature": "Bed", "structypei": "BEIN", "azimuth2": 435.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 544816.7652, "y": 7476376.565, "strike": 345 }, "geometry": { "type": "Point", "coordinates": [ 544816.765222960035317, 7476376.566478800028563 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bed", "structypei": "BEIN", "azimuth2": 110.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 537199.0956, "y": 7490607.57, "strike": 20 }, "geometry": { "type": "Point", "coordinates": [ 537199.095638660015538, 7490607.570995840243995 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bed", "structypei": "BEIN", "azimuth2": 385.0, "index_righ": 18, "gml_id": "geol_500k.7579", "objectid": "7580", "x": 532678.4775, "y": 7488131.6, "strike": 295 }, "geometry": { "type": "Point", "coordinates": [ 532678.477559659979306, 7488131.601253040134907 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bed", "structypei": "BEIN", "azimuth2": 330.0, "index_righ": 11, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 543234.9773, "y": 7505326.767, "strike": 240 }, "geometry": { "type": "Point", "coordinates": [ 543234.977398650022224, 7505326.767153630033135 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bed", "structypei": "BEIN", "azimuth2": 330.0, "index_righ": 11, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 543754.1806, "y": 7504599.126, "strike": 240 }, "geometry": { "type": "Point", "coordinates": [ 543754.180680289980955, 7504599.126015749759972 ] } }, +{ "type": "Feature", "properties": { "dip": 55, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 368.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 530221.478, "y": 7485474.506, "strike": 278 }, "geometry": { "type": "Point", "coordinates": [ 530221.478091840050183, 7485474.506277250126004 ] } }, +{ "type": "Feature", "properties": { "dip": 40, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 370.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 532604.3699, "y": 7483996.514, "strike": 280 }, "geometry": { "type": "Point", "coordinates": [ 532604.369975229958072, 7483996.514512909576297 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 368.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 535197.3841, "y": 7517478.457, "strike": 278 }, "geometry": { "type": "Point", "coordinates": [ 535197.384140150039457, 7517478.458130169659853 ] } }, +{ "type": "Feature", "properties": { "dip": 30, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 93.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 522143.0475, "y": 7478175.841, "strike": 3 }, "geometry": { "type": "Point", "coordinates": [ 522143.047553320007864, 7478175.841140150092542 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 165.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 520512.9127, "y": 7497506.014, "strike": 75 }, "geometry": { "type": "Point", "coordinates": [ 520512.912720219988842, 7497506.014648189768195 ] } }, +{ "type": "Feature", "properties": { "dip": 29, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 163.0, "index_righ": 43, "gml_id": "geol_500k.15988", "objectid": "15990", "x": 522441.0406, "y": 7500496.571, "strike": 73 }, "geometry": { "type": "Point", "coordinates": [ 522441.040684339997824, 7500496.572535590268672 ] } }, +{ "type": "Feature", "properties": { "dip": 52, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 365.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 521969.8614, "y": 7509447.167, "strike": 275 }, "geometry": { "type": "Point", "coordinates": [ 521969.861481649975758, 7509447.168316629715264 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 95.0, "index_righ": 13, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 520381.3069, "y": 7518189.622, "strike": 5 }, "geometry": { "type": "Point", "coordinates": [ 520381.306953309976961, 7518189.623318890109658 ] } }, +{ "type": "Feature", "properties": { "dip": 24, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 391.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 530017.1547, "y": 7517395.423, "strike": 301 }, "geometry": { "type": "Point", "coordinates": [ 530017.154735979973339, 7517395.423351770266891 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 370.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 531529.0496, "y": 7516327.456, "strike": 280 }, "geometry": { "type": "Point", "coordinates": [ 531529.049603780033067, 7516327.456395669840276 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 169.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 536743.7518, "y": 7516699.943, "strike": 79 }, "geometry": { "type": "Point", "coordinates": [ 536743.751895789988339, 7516699.943257340230048 ] } }, +{ "type": "Feature", "properties": { "dip": 54, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 381.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 536864.3112, "y": 7516486.44, "strike": 291 }, "geometry": { "type": "Point", "coordinates": [ 536864.311214599991217, 7516486.440060649998486 ] } }, +{ "type": "Feature", "properties": { "dip": 19, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 393.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 537236.751, "y": 7516781.94, "strike": 303 }, "geometry": { "type": "Point", "coordinates": [ 537236.751033399952576, 7516781.940984790213406 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 378.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 538184.3602, "y": 7515938.424, "strike": 288 }, "geometry": { "type": "Point", "coordinates": [ 538184.360327770002186, 7515938.425187329761684 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 408.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 541284.76, "y": 7518655.434, "strike": 318 }, "geometry": { "type": "Point", "coordinates": [ 541284.760004039970227, 7518655.435611880384386 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 397.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 542473.3504, "y": 7515998.898, "strike": 307 }, "geometry": { "type": "Point", "coordinates": [ 542473.350490109995008, 7515998.898037529550493 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 373.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 541120.3912, "y": 7514974.394, "strike": 283 }, "geometry": { "type": "Point", "coordinates": [ 541120.391238030046225, 7514974.394599010236561 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 391.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 543245.6967, "y": 7514289.872, "strike": 301 }, "geometry": { "type": "Point", "coordinates": [ 543245.696730609983206, 7514289.87276969011873 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 373.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 542385.7143, "y": 7515423.89, "strike": 283 }, "geometry": { "type": "Point", "coordinates": [ 542385.714369760011323, 7515423.891766839660704 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 379.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 540085.0803, "y": 7514695.398, "strike": 289 }, "geometry": { "type": "Point", "coordinates": [ 540085.080335729988292, 7514695.398229789920151 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 391.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 537926.9066, "y": 7514695.411, "strike": 301 }, "geometry": { "type": "Point", "coordinates": [ 537926.906666080001742, 7514695.412678790278733 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 410.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 530521.0956, "y": 7513906.411, "strike": 320 }, "geometry": { "type": "Point", "coordinates": [ 530521.095733140013181, 7513906.411135549657047 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 363.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 529732.1882, "y": 7512580.873, "strike": 273 }, "geometry": { "type": "Point", "coordinates": [ 529732.188222049968317, 7512580.874912950210273 ] } }, +{ "type": "Feature", "properties": { "dip": 32, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 383.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 535856.3302, "y": 7512629.9, "strike": 293 }, "geometry": { "type": "Point", "coordinates": [ 535856.330261689960025, 7512629.901913509704173 ] } }, +{ "type": "Feature", "properties": { "dip": 9, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 371.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 538825.1668, "y": 7511863.372, "strike": 281 }, "geometry": { "type": "Point", "coordinates": [ 538825.166878859978169, 7511863.373655679635704 ] } }, +{ "type": "Feature", "properties": { "dip": 26, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 137.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 541065.4097, "y": 7507289.308, "strike": 47 }, "geometry": { "type": "Point", "coordinates": [ 541065.409717830014415, 7507289.308750770054758 ] } }, +{ "type": "Feature", "properties": { "dip": 41, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 110.0, "index_righ": 11, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 528702.0935, "y": 7500732.15, "strike": 20 }, "geometry": { "type": "Point", "coordinates": [ 528702.093518220004626, 7500732.150204709731042 ] } }, +{ "type": "Feature", "properties": { "dip": 40, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 175.0, "index_righ": 11, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 535346.6091, "y": 7499105.696, "strike": 85 }, "geometry": { "type": "Point", "coordinates": [ 535346.60929794004187, 7499105.696668179705739 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 374.0, "index_righ": 19, "gml_id": "geol_500k.9861", "objectid": "9862", "x": 542840.1319, "y": 7483390.162, "strike": 284 }, "geometry": { "type": "Point", "coordinates": [ 542840.131905840011314, 7483390.163239589892328 ] } }, +{ "type": "Feature", "properties": { "dip": 20, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 151.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 525820.946, "y": 7481790.422, "strike": 61 }, "geometry": { "type": "Point", "coordinates": [ 525820.946054399944842, 7481790.422112179920077 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 436.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 545223.0165, "y": 7475727.052, "strike": 346 }, "geometry": { "type": "Point", "coordinates": [ 545223.016550080035813, 7475727.052647089585662 ] } }, +{ "type": "Feature", "properties": { "dip": 10, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 435.0, "index_righ": 36, "gml_id": "geol_500k.16936", "objectid": "16938", "x": 549386.0474, "y": 7474527.116, "strike": 345 }, "geometry": { "type": "Point", "coordinates": [ 549386.047439330024645, 7474527.117315949872136 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 440.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 554781.5243, "y": 7475058.762, "strike": 350 }, "geometry": { "type": "Point", "coordinates": [ 554781.524392939987592, 7475058.762736690230668 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 434.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 559486.8888, "y": 7475661.292, "strike": 344 }, "geometry": { "type": "Point", "coordinates": [ 559486.888806340051815, 7475661.292937439866364 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 409.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 547742.6758, "y": 7479703.669, "strike": 319 }, "geometry": { "type": "Point", "coordinates": [ 547742.675885259988718, 7479703.670715750195086 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 428.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 545836.4934, "y": 7478148.117, "strike": 338 }, "geometry": { "type": "Point", "coordinates": [ 545836.493430939968675, 7478148.118434090167284 ] } }, +{ "type": "Feature", "properties": { "dip": 46, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 390.0, "index_righ": 18, "gml_id": "geol_500k.7579", "objectid": "7580", "x": 550629.4503, "y": 7482157.733, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 550629.450332490028813, 7482157.733772730454803 ] } }, +{ "type": "Feature", "properties": { "dip": 40, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 390.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 553784.6169, "y": 7482787.758, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 553784.616916410042904, 7482787.759406059980392 ] } }, +{ "type": "Feature", "properties": { "dip": 50, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 382.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 555570.309, "y": 7486441.294, "strike": 292 }, "geometry": { "type": "Point", "coordinates": [ 555570.309094520052895, 7486441.295805470086634 ] } }, +{ "type": "Feature", "properties": { "dip": 70, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 384.0, "index_righ": 47, "gml_id": "geol_500k.4686", "objectid": "4686", "x": 554912.9939, "y": 7485625.285, "strike": 294 }, "geometry": { "type": "Point", "coordinates": [ 554912.994029060006142, 7485625.285620509646833 ] } }, +{ "type": "Feature", "properties": { "dip": 50, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 379.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 544406.7446, "y": 7485143.196, "strike": 289 }, "geometry": { "type": "Point", "coordinates": [ 544406.744695800007321, 7485143.197792230173945 ] } }, +{ "type": "Feature", "properties": { "dip": 48, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 168.0, "index_righ": 47, "gml_id": "geol_500k.4686", "objectid": "4686", "x": 559180.06240000017, "y": 7491409.858, "strike": 78 }, "geometry": { "type": "Point", "coordinates": [ 559180.062480399967171, 7491409.858080410398543 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 168.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 554304.9334, "y": 7496947.325, "strike": 78 }, "geometry": { "type": "Point", "coordinates": [ 554304.933485990040936, 7496947.325983230024576 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 362.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 545557.0328, "y": 7494696.218, "strike": 272 }, "geometry": { "type": "Point", "coordinates": [ 545557.032882109982893, 7494696.218082490377128 ] } }, +{ "type": "Feature", "properties": { "dip": 10, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 366.0, "index_righ": 50, "gml_id": "geol_500k.8420", "objectid": "8421", "x": 560867.2052, "y": 7497862.36, "strike": 276 }, "geometry": { "type": "Point", "coordinates": [ 560867.205221259966493, 7497862.36187853012234 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 148.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 553905.1204, "y": 7505481.849, "strike": 58 }, "geometry": { "type": "Point", "coordinates": [ 553905.120414, 7505481.8503198903054 ] } }, +{ "type": "Feature", "properties": { "dip": 11, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 430.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 562663.94480000017, "y": 7506741.508, "strike": 340 }, "geometry": { "type": "Point", "coordinates": [ 562663.944806399988011, 7506741.509795550256968 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 440.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 544921.8294, "y": 7514333.361, "strike": 350 }, "geometry": { "type": "Point", "coordinates": [ 544921.829412610037252, 7514333.362524409778416 ] } }, +{ "type": "Feature", "properties": { "dip": 33, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 400.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 544708.1991, "y": 7514108.86, "strike": 310 }, "geometry": { "type": "Point", "coordinates": [ 544708.199188990052789, 7514108.861192910000682 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 127.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 547332.066, "y": 7516113.867, "strike": 37 }, "geometry": { "type": "Point", "coordinates": [ 547332.066010780050419, 7516113.868296990171075 ] } }, +{ "type": "Feature", "properties": { "dip": 34, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 365.0, "index_righ": 55, "gml_id": "geol_500k.14337", "objectid": "14338", "x": 547704.52560000017, "y": 7513884.341, "strike": 275 }, "geometry": { "type": "Point", "coordinates": [ 547704.525679329992272, 7513884.341709859669209 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 150.0, "index_righ": 10, "gml_id": "geol_500k.14339", "objectid": "14340", "x": 554929.6113, "y": 7515160.855, "strike": 60 }, "geometry": { "type": "Point", "coordinates": [ 554929.611344089964405, 7515160.856294459663332 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 172.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 548756.2865, "y": 7517165.367, "strike": 82 }, "geometry": { "type": "Point", "coordinates": [ 548756.286561049986631, 7517165.368296819739044 ] } }, +{ "type": "Feature", "properties": { "dip": 0, "feature": "Bedding, showing strike and dip", "structypei": null, "azimuth2": 162.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 544752.081, "y": 7517757.405, "strike": 72 }, "geometry": { "type": "Point", "coordinates": [ 544752.081064200028777, 7517757.405165899544954 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 390.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 552049.0524, "y": 7487780.785, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 552049.052401999942958, 7487780.785698380321264 ] } }, +{ "type": "Feature", "properties": { "dip": 34, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 184.0, "index_righ": 52, "gml_id": "geol_500k.14338", "objectid": "14339", "x": 547640.63840000017, "y": 7513734.467, "strike": 94 }, "geometry": { "type": "Point", "coordinates": [ 547640.638480219990015, 7513734.467745999805629 ] } }, +{ "type": "Feature", "properties": { "dip": 9, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 191.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 538617.6198, "y": 7511806.723, "strike": 101 }, "geometry": { "type": "Point", "coordinates": [ 538617.619843840016983, 7511806.723498820327222 ] } }, +{ "type": "Feature", "properties": { "dip": 63, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 370.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 538806.0275, "y": 7483993.093, "strike": 280 }, "geometry": { "type": "Point", "coordinates": [ 538806.027565150056034, 7483993.093063940294087 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 174.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 548578.0466, "y": 7517242.932, "strike": 84 }, "geometry": { "type": "Point", "coordinates": [ 548578.046648949966766, 7517242.932752680033445 ] } }, +{ "type": "Feature", "properties": { "dip": 11, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 250.0, "index_righ": 17, "gml_id": "geol_500k.14310", "objectid": "14311", "x": 562613.5943, "y": 7506579.002, "strike": 160 }, "geometry": { "type": "Point", "coordinates": [ 562613.594478350016288, 7506579.00298373028636 ] } }, +{ "type": "Feature", "properties": { "dip": 32, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 201.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 535859.02690000017, "y": 7512398.304, "strike": 111 }, "geometry": { "type": "Point", "coordinates": [ 535859.026927149971016, 7512398.305493519641459 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 365.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 542344.8415, "y": 7481763.356, "strike": 275 }, "geometry": { "type": "Point", "coordinates": [ 542344.841554780025035, 7481763.357858150266111 ] } }, +{ "type": "Feature", "properties": { "dip": 80, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 390.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 552049.0524, "y": 7487780.785, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 552049.052401999942958, 7487780.785698380321264 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 435.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 545003.7412, "y": 7476258.347, "strike": 345 }, "geometry": { "type": "Point", "coordinates": [ 545003.741205579950474, 7476258.347584360279143 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 305.0, "index_righ": 55, "gml_id": "geol_500k.14337", "objectid": "14338", "x": 547242.81740000017, "y": 7516046.248, "strike": 215 }, "geometry": { "type": "Point", "coordinates": [ 547242.817401160020381, 7516046.249239830300212 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 390.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 552075.5921, "y": 7487793.536, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 552075.592163110035472, 7487793.536227280274034 ] } }, +{ "type": "Feature", "properties": { "dip": 62, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 378.0, "index_righ": 58, "gml_id": "geol_500k.16190", "objectid": "16192", "x": 534509.0571, "y": 7483086.092, "strike": 288 }, "geometry": { "type": "Point", "coordinates": [ 534509.057129219989292, 7483086.092498210258782 ] } }, +{ "type": "Feature", "properties": { "dip": 25, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 348.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 536729.5649, "y": 7516597.336, "strike": 258 }, "geometry": { "type": "Point", "coordinates": [ 536729.564979600021616, 7516597.336132359690964 ] } }, +{ "type": "Feature", "properties": { "dip": 15, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 360.0, "index_righ": 22, "gml_id": "geol_500k.14368", "objectid": "14369", "x": 546137.8575, "y": 7494606.699, "strike": 270 }, "geometry": { "type": "Point", "coordinates": [ 546137.857560900039971, 7494606.699120569974184 ] } }, +{ "type": "Feature", "properties": { "dip": 28, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 338.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 540038.912, "y": 7506751.828, "strike": 248 }, "geometry": { "type": "Point", "coordinates": [ 540038.912072750041261, 7506751.82918475009501 ] } }, +{ "type": "Feature", "properties": { "dip": 24, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 211.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 529955.1185, "y": 7517212.373, "strike": 121 }, "geometry": { "type": "Point", "coordinates": [ 529955.118584670010023, 7517212.374486490152776 ] } }, +{ "type": "Feature", "properties": { "dip": 19, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 388.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 537101.1025, "y": 7516513.646, "strike": 298 }, "geometry": { "type": "Point", "coordinates": [ 537101.102592629962601, 7516513.647987429983914 ] } }, +{ "type": "Feature", "properties": { "dip": 80, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 390.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 552075.5921, "y": 7487793.536, "strike": 300 }, "geometry": { "type": "Point", "coordinates": [ 552075.592163110035472, 7487793.536227280274034 ] } }, +{ "type": "Feature", "properties": { "dip": 52, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 181.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 521796.7218, "y": 7509376.561, "strike": 91 }, "geometry": { "type": "Point", "coordinates": [ 521796.721859230019618, 7509376.56236276961863 ] } }, +{ "type": "Feature", "properties": { "dip": 64, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 420.0, "index_righ": 44, "gml_id": "geol_500k.7875", "objectid": "7876", "x": 553087.8922, "y": 7484583.491, "strike": 330 }, "geometry": { "type": "Point", "coordinates": [ 553087.892269309959374, 7484583.492152259685099 ] } }, +{ "type": "Feature", "properties": { "dip": 33, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 219.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 544671.5774, "y": 7513917.04, "strike": 129 }, "geometry": { "type": "Point", "coordinates": [ 544671.577467399998568, 7513917.040575330145657 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 385.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 539933.7822, "y": 7483374.355, "strike": 295 }, "geometry": { "type": "Point", "coordinates": [ 539933.782225199975073, 7483374.356403660029173 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 171.0, "index_righ": 57, "gml_id": "geol_500k.6148", "objectid": "6148", "x": 521993.3993, "y": 7508834.989, "strike": 81 }, "geometry": { "type": "Point", "coordinates": [ 521993.399334150017239, 7508834.989267899654806 ] } }, +{ "type": "Feature", "properties": { "dip": 60, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 388.0, "index_righ": 31, "gml_id": "geol_500k.16188", "objectid": "16190", "x": 542660.062, "y": 7481786.83, "strike": 298 }, "geometry": { "type": "Point", "coordinates": [ 542660.062078319955617, 7481786.830071079544723 ] } }, +{ "type": "Feature", "properties": { "dip": 35, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 442.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 544608.898, "y": 7514084.372, "strike": 352 }, "geometry": { "type": "Point", "coordinates": [ 544608.898035160033032, 7514084.372596840374172 ] } }, +{ "type": "Feature", "properties": { "dip": 64, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 240.0, "index_righ": 44, "gml_id": "geol_500k.7875", "objectid": "7876", "x": 553113.2509, "y": 7484612.184, "strike": 150 }, "geometry": { "type": "Point", "coordinates": [ 553113.250977969961241, 7484612.185831510461867 ] } }, +{ "type": "Feature", "properties": { "dip": 26, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 405.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 544512.13, "y": 7514096.827, "strike": 315 }, "geometry": { "type": "Point", "coordinates": [ 544512.13000452995766, 7514096.828844400122762 ] } }, +{ "type": "Feature", "properties": { "dip": 24, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 230.0, "index_righ": 32, "gml_id": "geol_500k.5501", "objectid": "5501", "x": 529219.0531, "y": 7512991.483, "strike": 140 }, "geometry": { "type": "Point", "coordinates": [ 529219.053161659976467, 7512991.483141110278666 ] } }, +{ "type": "Feature", "properties": { "dip": 58, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 368.0, "index_righ": 58, "gml_id": "geol_500k.16190", "objectid": "16192", "x": 534077.0355, "y": 7482256.828, "strike": 278 }, "geometry": { "type": "Point", "coordinates": [ 534077.035659849992953, 7482256.829784540459514 ] } }, +{ "type": "Feature", "properties": { "dip": 54, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 200.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 536789.5709, "y": 7516217.953, "strike": 110 }, "geometry": { "type": "Point", "coordinates": [ 536789.57090088003315, 7516217.954258319921792 ] } }, +{ "type": "Feature", "properties": { "dip": 10, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 190.0, "index_righ": 50, "gml_id": "geol_500k.8420", "objectid": "8421", "x": 560770.7347, "y": 7497966.202, "strike": 100 }, "geometry": { "type": "Point", "coordinates": [ 560770.734732890035957, 7497966.203075700439513 ] } }, +{ "type": "Feature", "properties": { "dip": 24, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 181.0, "index_righ": 25, "gml_id": "geol_500k.14340", "objectid": "14341", "x": 537020.134, "y": 7516172.571, "strike": 91 }, "geometry": { "type": "Point", "coordinates": [ 537020.134009359986521, 7516172.571558499708772 ] } }, +{ "type": "Feature", "properties": { "dip": 50, "feature": "Bedding, showing strike and dip", "structypei": "BEIN", "azimuth2": 185.0, "index_righ": 49, "gml_id": "geol_500k.4685", "objectid": "4685", "x": 559881.968, "y": 7490671.207, "strike": 95 }, "geometry": { "type": "Point", "coordinates": [ 559881.968048759968951, 7490671.208677380345762 ] } } +] +} diff --git a/packages/map2loop/src/map2loop/_datasets/geodata_files/load_map2loop_data.py b/packages/map2loop/src/map2loop/_datasets/geodata_files/load_map2loop_data.py new file mode 100644 index 000000000..d1c8be1fe --- /dev/null +++ b/packages/map2loop/src/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -0,0 +1,50 @@ +import geopandas +import map2loop +import pathlib +from osgeo import gdal +gdal.UseExceptions() +def map2loop_dir(folder)-> pathlib.Path: + path = pathlib.Path(map2loop.__file__).parent + path = path / "_datasets"/"geodata_files"/f'{folder}' + return path +def load_hamersley_geology(): + """ + Loads Hamersley geology data from a shapefile + + Args: + path (str): + The path to the shapefile + + Returns: + geopandas.GeoDataFrame: The geology data + """ + + path = map2loop_dir('hamersley') / "geology.geojson" + return geopandas.read_file(str(path)) + + +def load_hamersley_structure(): + """ + Loads Hamersley structure data from a shapefile + + Args: + path (str): + The path to the shapefile + + Returns: + geopandas.GeoDataFrame: The structure data + """ + + path = map2loop_dir('hamersley') / "structure.geojson" + return geopandas.read_file(str(path)) + + +def load_hamersley_dtm(): + """ + Load DTM data from a raster file + + Returns: + gdal.Dataset: The DTM data + """ + path = map2loop_dir('hamersley') / "dtm_rp.tif" + return gdal.Open(str(path)) diff --git a/packages/map2loop/src/map2loop/aus_state_urls.py b/packages/map2loop/src/map2loop/aus_state_urls.py new file mode 100644 index 000000000..df83c60fa --- /dev/null +++ b/packages/map2loop/src/map2loop/aus_state_urls.py @@ -0,0 +1,97 @@ +import os +import pathlib + +module_path = os.path.dirname(__file__) + + +def load_clut(state): + stream = ( + pathlib.Path(module_path) + / pathlib.Path('_datasets') + / pathlib.Path('clut_files') + / pathlib.Path(f'{state}_clut.csv') + ) + return stream + + +def load_config(state): + stream = ( + pathlib.Path(module_path) + / pathlib.Path('_datasets') + / pathlib.Path('config_files') + / pathlib.Path(f'{state}.json') + ) + return stream + + +class AustraliaStateUrls: + aus_geology_urls = { + "WA": "http://13.211.217.129:8080/geoserver/loop/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=loop:500k_geol_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "QLD": "http://13.211.217.129:8080/geoserver/QLD/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=QLD:qld_geol_asud&bbox={BBOX_STR}&srsName=EPSG:28355&outputFormat=shape-zip", + "SA": "http://13.211.217.129:8080/geoserver/SA/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=SA:2m_surface_geology_28354_relage&bbox={BBOX_STR}&srs=EPSG:28354&outputFormat=shape-zip", + "VIC": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=VIC:geolunit_250k_py_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NSW": "http://13.211.217.129:8080/geoserver/NSW/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=NSW:ge_rockunit_lao2&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "ACT": "", + "TAS": "http://13.211.217.129:8080/geoserver/TAS/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=TAS:geol_poly_250_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NT": "", + } + aus_structure_urls = { + "WA": "http://13.211.217.129:8080/geoserver/loop/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=loop:waroxi_wa_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "QLD": "http://13.211.217.129:8080/geoserver/QLD/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=QLD:outcrops_28355&bbox={BBOX_STR}&srsName=EPSG:28355&outputFormat=shape-zip", + "SA": "http://13.211.217.129:8080/geoserver/SA/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=SA:sth_flinders_28354&bbox={BBOX_STR}&srs=EPSG:28354&outputFormat=shape-zip", + "VIC": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=VIC:struc_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NSW": "http://13.211.217.129:8080/geoserver/NSW/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=NSW:lao_struct_pt&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "ACT": "", + "TAS": "http://13.211.217.129:8080/geoserver/TAS/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=TAS:geol_struc_250_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NT": "", + } + aus_fault_urls = { + "WA": "http://13.211.217.129:8080/geoserver/loop/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=loop:500k_faults_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "QLD": "http://13.211.217.129:8080/geoserver/QLD/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=QLD:qld_faults_folds_28355&bbox={BBOX_STR}&srsName=EPSG:28355&outputFormat=shape-zip", + "SA": "http://13.211.217.129:8080/geoserver/SA/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=SA:2m_linear_structures&bbox={BBOX_STR}&srs=EPSG:28354&outputFormat=shape-zip", + "VIC": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=VIC:geolstructure_250k_ln_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NSW": "http://13.211.217.129:8080/geoserver/NSW/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=NSW:faults_joined_left_contains_drop_dups&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "ACT": "", + "TAS": "http://13.211.217.129:8080/geoserver/TAS/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=TAS:geol_line_250_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NT": "", + } + aus_fold_urls = { + "WA": "http://13.211.217.129:8080/geoserver/loop/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=loop:500k_faults_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "QLD": "http://13.211.217.129:8080/geoserver/QLD/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=QLD:qld_faults_folds_28355&bbox={BBOX_STR}&srsName=EPSG:28355&outputFormat=shape-zip", + "SA": "http://13.211.217.129:8080/geoserver/SA/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=SA:2m_linear_structures&bbox={BBOX_STR}&srs=EPSG:28354&outputFormat=shape-zip", + "VIC": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=VIC:geolstructure_250k_ln_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NSW": "http://13.211.217.129:8080/geoserver/NSW/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=NSW:folds_lao&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "ACT": "", + "TAS": "http://13.211.217.129:8080/geoserver/TAS/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=TAS:geol_line_250_28355&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "NT": "", + } + aus_mindep_loopdata = { + "WA": "http://13.211.217.129:8080/geoserver/loop/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=loop:mindeps_2018_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "QLD": "http://13.211.217.129:8080/geoserver/QLD/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=qld_mindeps_28355&bbox={BBOX_STR}&srsName=EPSG:28355&outputFormat=shape-zip", + "SA": "", + "VIC": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=VIC:mindeps_2018_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "NSW": "http://13.211.217.129:8080/geoserver/NSW/wfs?service=WFS&version=1.1.0&request=GetFeature&typeName=NSW:nsw_mindeps&bbox={BBOX_STR}&srs=EPSG:28355&outputFormat=shape-zip", + "ACT": "", + "TAS": "http://13.211.217.129:8080/geoserver/VIC/wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=VIC:mindeps_2018_28350&bbox={BBOX_STR}&srs=EPSG:28350&outputFormat=shape-zip", + "NT": "", + } + aus_config_urls = { + "WA": load_config('WA'), + "QLD": load_config('QLD'), + "SA": load_config('SA'), + "VIC": load_config('VIC'), + "NSW": load_config('NSW'), + "ACT": "", + "TAS": load_config('TAS'), + "NT": "", + } + aus_clut_urls = { + "WA": load_clut('WA'), + "QLD": load_clut('QLD'), + "SA": load_clut('SA'), + "VIC": "", + "NSW": "", + "ACT": "", + "TAS": "", + "NT": "", + } diff --git a/packages/map2loop/src/map2loop/config.py b/packages/map2loop/src/map2loop/config.py new file mode 100644 index 000000000..edff2e20d --- /dev/null +++ b/packages/map2loop/src/map2loop/config.py @@ -0,0 +1,212 @@ +import urllib.error +import beartype +import json +import urllib +import time +import pathlib +from typing import Union + +from .logging import getLogger + +logger = getLogger(__name__) + + +class Config: + """ + A data structure containing column name mappings for files and keywords + + Attributes + ---------- + structure_config: dict + column names and keywords for structure mappings + geology_config: dict + column names and keywords for geology mappings + fault_config: dict + column names and keywords for fault mappings + fold_config: dict + column names and keywords for fold mappings + """ + + def __init__(self): + self.structure_config = { + "orientation_type": "dip direction", + "dipdir_column": "DIPDIR", + "dip_column": "DIP", + "description_column": "DESCRIPTION", + "bedding_text": "bedding", + "overturned_column": "DESCRIPTION", + "overturned_text": "overturned", + "objectid_column": "ID", + } + self.geology_config = { + "unitname_column": "UNITNAME", + "alt_unitname_column": "CODE", + "group_column": "GROUP", + "supergroup_column": "SUPERGROUP", + "description_column": "DESCRIPTION", + "minage_column": "MIN_AGE", + "maxage_column": "MAX_AGE", + "rocktype_column": "ROCKTYPE1", + "alt_rocktype_column": "ROCKTYPE2", + "sill_text": "sill", + "intrusive_text": "intrusive", + "volcanic_text": "volcanic", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"], + } + self.fault_config = { + "structtype_column": "FEATURE", + "fault_text": "fault", + "dip_null_value": "-999", + "dipdir_flag": "num", + "dipdir_column": "DIPDIR", + "dip_column": "DIP", + "orientation_type": "dip direction", + "dipestimate_column": "DIP_ESTIMATE", + "dipestimate_text": "'NORTH_EAST','NORTH',,'NOT ACCESSED'", + "name_column": "NAME", + "objectid_column": "ID", + "minimum_fault_length": -1.0, # negative -1 means not set + "ignore_fault_codes": [None], + } + self.fold_config = { + "structtype_column": "FEATURE", + "fold_text": "fold", + "description_column": "DESCRIPTION", + "synform_text": "syncline", + "foldname_column": "NAME", + "objectid_column": "ID", + } + + def to_dict(self): + """ + Convert the config dictionary to a dictionary + + Returns: + dict: The dictionary representation of the config + """ + return { + "structure": self.structure_config, + "geology": self.geology_config, + "fault": self.fault_config, + "fold": self.fold_config, + } + + @beartype.beartype + def update_from_dictionary(self, dictionary: dict, lower: bool = True): + """ + Update the config dictionary from a provided dict + + Args: + dictionary (dict): The dictionary to update from + """ + + if "structure" in dictionary: + self.structure_config.update(dictionary["structure"]) + for key in dictionary["structure"].keys(): + if key not in self.structure_config: + logger.warning( + f"Config dictionary structure segment contained {key} which is not used" + ) + dictionary.pop("structure") + + if "geology" in dictionary: + self.geology_config.update(dictionary["geology"]) + for key in dictionary["geology"].keys(): + if key not in self.geology_config: + logger.warning( + f"Config dictionary geology segment contained {key} which is not used" + ) + dictionary.pop("geology") + if "fault" in dictionary: + self.fault_config.update(dictionary["fault"]) + for key in dictionary["fault"].keys(): + if key not in self.fault_config: + logger.warning( + f"Config dictionary fault segment contained {key} which is not used" + ) + dictionary.pop("fault") + if "fold" in dictionary: + self.fold_config.update(dictionary["fold"]) + for key in dictionary["fold"].keys(): + if key not in self.fold_config: + logger.warning( + f"Config dictionary fold segment contained {key} which is not used" + ) + dictionary.pop("fold") + if len(dictionary): + logger.warning(f"Unused keys from config format {list(dictionary.keys())}") + + + @beartype.beartype + def update_from_file( + self, filename: Union[pathlib.Path, str], lower: bool = False + ): + """ + Update the config dictionary from the provided json filename or url + + Args: + filename (Union[pathlib.Path, str]): Filename or URL of the JSON config file + lower (bool, optional): convert keys to lowercase. Defaults to False. + """ + func = self.update_from_dictionary + + try: + filename = str(filename) + + # if url, open the url + if filename.startswith("http") or filename.startswith("ftp"): + try_count = 5 + success = False + # try 5 times to access the URL + while try_count > 0 and not success: + try: + with urllib.request.urlopen(filename) as url_data: + data = json.load(url_data) + func(data, lower) + success = True + + # case 1. handle url error + except urllib.error.URLError as e: + # wait 0.25 seconds before trying again + time.sleep(0.25) + # decrease the number of tries by 1 + try_count -= 1 + # if no more tries left, raise the error + if try_count <= 0: + raise urllib.error.URLError( + f"Failed to access URL after multiple attempts: {filename}" + ) from e + + # case 2. handle json error + except json.JSONDecodeError as e: + raise json.JSONDecodeError( + f"Error decoding JSON data from URL: {filename}" + ) from e + else: + try: + with open(filename) as file_data: + data = json.load(file_data) + func(data, lower) + except FileNotFoundError as e: + err_string = f"The specified config file does not exist ({filename}).\n" + err_string += ( + "Please check the file exists and is accessible, then try again.\n" + ) + raise FileNotFoundError(err_string) from e + except json.JSONDecodeError as e: + raise json.JSONDecodeError( + f"Error decoding JSON data from file: {filename}" + ) from e + + except FileNotFoundError: + raise + + except Exception: + err_string = f"There is a problem parsing the config file ({filename}).\n" + if filename.startswith("http"): + err_string += "Please check the file is accessible online and then\n" + else: + err_string += "Please check the file exists and is accessible then\n" + err_string += "Check the contents for mismatched quotes or brackets!" + raise Exception(err_string) \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/contact_extractor.py b/packages/map2loop/src/map2loop/contact_extractor.py new file mode 100644 index 000000000..33d7b099c --- /dev/null +++ b/packages/map2loop/src/map2loop/contact_extractor.py @@ -0,0 +1,102 @@ +import geopandas +import pandas +import shapely +from .logging import getLogger +from typing import Any, Optional + +logger = getLogger(__name__) + +class ContactExtractor: + def __init__(self, geology: geopandas.GeoDataFrame, faults: Optional[geopandas.GeoDataFrame] = None): + self.geology = geology + self.faults = faults + self.contacts = None + self.basal_contacts = None + self.all_basal_contacts = None + def __call__(self, **kwds: Any) -> Any: + if 'stratigraphic_column' in kwds: + return self.extract_basal_contacts(kwds['stratigraphic_column'], save_contacts=kwds.get('save_contacts', True)) + else: + return self.extract_all_contacts(save_contacts=kwds.get('save_contacts', True)) + def extract_all_contacts(self, save_contacts: bool = True) -> geopandas.GeoDataFrame: + logger.info("Extracting contacts") + geology = self.geology.copy() + geology = geology.dissolve(by="UNITNAME", as_index=False) + if 'INTRUSIVE' in geology.columns: + geology = geology[~geology["INTRUSIVE"]] + if 'SILL' in geology.columns: + geology = geology[~geology["SILL"]] + if self.faults is not None: + faults = self.faults.copy() + faults["geometry"] = faults.buffer(50) + geology = geopandas.overlay(geology, faults, how="difference", keep_geom_type=False) + units = geology["UNITNAME"].unique().tolist() + column_names = ["UNITNAME_1", "UNITNAME_2", "geometry"] + contacts = geopandas.GeoDataFrame(crs=geology.crs, columns=column_names, data=None) + while len(units) > 1: + unit1 = units[0] + units = units[1:] + for unit2 in units: + if unit1 != unit2: + join = geopandas.overlay( + geology[geology["UNITNAME"] == unit1], + geology[geology["UNITNAME"] == unit2], + keep_geom_type=False, + )[column_names] + join["geometry"] = join.buffer(1) + buffered = geology[geology["UNITNAME"] == unit2][["geometry"]].copy() + buffered["geometry"] = buffered.boundary + end = geopandas.overlay(buffered, join, keep_geom_type=False) + if len(end): + contacts = pandas.concat([contacts, end], ignore_index=True) + contacts["length"] = [row.length for row in contacts["geometry"]] + if save_contacts: + self.contacts = contacts + return contacts + + def extract_basal_contacts(self, + stratigraphic_column: list, + save_contacts: bool = True) -> geopandas.GeoDataFrame: + + logger.info("Extracting basal contacts") + units = stratigraphic_column + + if self.contacts is None: + self.extract_all_contacts(save_contacts=True) + basal_contacts = self.contacts.copy() + else: + basal_contacts = self.contacts.copy() + if any(unit not in units for unit in basal_contacts["UNITNAME_1"].unique()): + missing_units = ( + basal_contacts[~basal_contacts["UNITNAME_1"].isin(units)]["UNITNAME_1"] + .unique() + .tolist() + ) + logger.error( + "There are units in the Geology dataset, but not in the stratigraphic column: " + + ", ".join(missing_units) + + ". Please readjust the stratigraphic column if this is a user defined column." + ) + raise ValueError( + "There are units in stratigraphic column, but not in the Geology dataset: " + + ", ".join(missing_units) + + ". Please readjust the stratigraphic column if this is a user defined column." + ) + basal_contacts["ID"] = basal_contacts.apply( + lambda row: min(units.index(row["UNITNAME_1"]), units.index(row["UNITNAME_2"])), axis=1 + ) + basal_contacts["basal_unit"] = basal_contacts.apply(lambda row: units[row["ID"]], axis=1) + basal_contacts["stratigraphic_distance"] = basal_contacts.apply( + lambda row: abs(units.index(row["UNITNAME_1"]) - units.index(row["UNITNAME_2"])), axis=1 + ) + basal_contacts["type"] = basal_contacts.apply( + lambda row: "ABNORMAL" if abs(row["stratigraphic_distance"]) > 1 else "BASAL", axis=1 + ) + basal_contacts = basal_contacts[["ID", "basal_unit", "type", "geometry"]] + basal_contacts["geometry"] = [ + shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"] + ] + if save_contacts: + self.all_basal_contacts = basal_contacts + self.basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"] + return basal_contacts diff --git a/packages/map2loop/src/map2loop/data_checks.py b/packages/map2loop/src/map2loop/data_checks.py new file mode 100644 index 000000000..5f031be0e --- /dev/null +++ b/packages/map2loop/src/map2loop/data_checks.py @@ -0,0 +1,883 @@ +# internal imports +from .m2l_enums import Datatype + +# external imports +import beartype as beartype +from beartype.typing import Tuple, Optional, List, Dict, Type, Union +import geopandas +import shapely +import pandas + +from .logging import getLogger +logger = getLogger(__name__) + +@beartype.beartype +def check_geology_fields_validity(mapdata) -> tuple[bool, str]: + #TODO (AR) - add check for gaps in geology data (inspo here: https://medium.com/@achm.firmansyah/an-approach-for-checking-overlaps-and-gaps-in-polygons-using-geopandas-ebd6606e7f70 ) + """ + Validate the columns in GEOLOGY geodataframe + + Several checks to ensure that the geology data: + - Is loaded and valid. + - Contains required columns with appropriate types and no missing or blank values. + - Has optional columns with valid types, if present. + - Does not contain duplicate in IDs. + - Ensures the geometry column has valid geometries. + + Returns: + Tuple[bool, str]: A tuple indicating success (False) or failure (True) + """ + # Check if geology data is loaded and valid + if ( + mapdata.raw_data[Datatype.GEOLOGY] is None + or type(mapdata.raw_data[Datatype.GEOLOGY]) is not geopandas.GeoDataFrame + ): + logger.error("GEOLOGY data is not loaded or is not a valid GeoDataFrame") + return (True, "GEOLOGY data is not loaded or is not a valid GeoDataFrame") + + geology_data = mapdata.raw_data[Datatype.GEOLOGY] + config = mapdata.config.geology_config + + # 2. Validate geometry + failed, message = validate_geometry( + geodata=geology_data, + expected_geom_types=[shapely.geometry.Polygon, shapely.geometry.MultiPolygon], + datatype_name="GEOLOGY" + ) + if failed: + return (failed, message) + + + # check required columns in geology + required_columns = ["unitname_column", "alt_unitname_column"] + + failed, message = validate_required_columns( + geodata=geology_data, + config=config, + required_columns=required_columns, + expected_type=str, + check_blank=True, + datatype_name="GEOLOGY" + ) + if failed: + return (failed, message) + + # check optional columns + optional_string_columns = [ + "group_column", "supergroup_column", "description_column", + "rocktype_column", "alt_rocktype_column", + ] + + string_warnings = validate_optional_columns( + geodata=geology_data, + config=config, + optional_columns=optional_string_columns, + expected_type=str, + check_blank=True, + datatype_name="GEOLOGY" + ) + ### only emit warnings for optional columns + for warning in string_warnings: + logger.warning(warning) + + # 5. Validate Optional Numeric Columns + optional_numeric_columns = ["minage_column", "maxage_column"] + numeric_warnings = validate_optional_columns( + geodata=geology_data, + config=config, + optional_columns=optional_numeric_columns, + expected_type=(int, float), + check_blank=False, + datatype_name="GEOLOGY" + ) + + ### only emit warnings for optional columns + for warning in numeric_warnings: + logger.warning(warning) + + # # 4. check ID column + if "objectid_column" in config: + failed, message = validate_id_column( + geodata=geology_data, + config=config, + id_config_key="objectid_column", + geodata_name="GEOLOGY") + + if failed: + return (failed, message) + + logger.info("Geology fields validation passed.") + return (False, "") + + +@beartype.beartype +def check_structure_fields_validity(mapdata) -> Tuple[bool, str]: + """ + Validate the structure data for required and optional fields. + + Performs the following checks: + - Ensures the structure map is loaded, valid, and contains at least two structures. + - Validates the geometry column + - Checks required numeric columns (`dip_column`, `dipdir_column`) for existence, dtype, range, and null values. + - Checks optional string columns (`description_column`, `overturned_column`) for type and null/empty values. + - Validates the optional numeric `objectid_column` for type, null values, and duplicates. + + Returns: + Tuple[bool, str]: A tuple where the first value indicates if validation failed (True = failed), + and the second value provides a message describing the issue. + """ + + # Check type and size of loaded structure map + if ( + mapdata.raw_data[Datatype.STRUCTURE] is None + or type(mapdata.raw_data[Datatype.STRUCTURE]) is not geopandas.GeoDataFrame + ): + logger.warning("Structure map is not loaded or valid") + return (True, "Structure map is not loaded or valid") + + if len(mapdata.raw_data[Datatype.STRUCTURE]) < 2: + logger.warning( + "Datatype STRUCTURE: map does with not enough orientations to complete calculations (need at least 2), projection may be inconsistent" + ) + + structure_data = mapdata.raw_data[Datatype.STRUCTURE] + config = mapdata.config.structure_config + + # 2. Validate geometry + failed, message = validate_geometry( + geodata=structure_data, + expected_geom_types=[shapely.Point, shapely.MultiPoint], + datatype_name="STRUCTURE" + ) + if failed: + return (failed, message) + + + # check required columns in structure (numeric dips & dip dir) + required_columns = ["dipdir_column", "dip_column"] + failed, message = validate_required_columns( + geodata=structure_data, + config=config, + required_columns=required_columns, + expected_type=(int, float), + check_blank=False, + datatype_name="STRUCTURE" + ) + if failed: + return (failed, message) + + # 4. Validate Dip and Dip Direction value ranges + dip_columns = ["dip_column", "dipdir_column"] + dip_validation_failed, dip_message = validate_dip_columns( + geodata=structure_data, + config=config, + dip_columns=dip_columns, + datatype_name="STRUCTURE", + allow_nulls=False # Dip and dipdir cannot have nulls in structure data + ) + if dip_validation_failed: + logger.warning(dip_message) + + # check optional columns + optional_string_columns = ["description_column", "overturned_column"] + string_warnings = validate_optional_columns( + geodata=structure_data, + config=config, + optional_columns=optional_string_columns, + expected_type=str, + check_blank=True, + datatype_name="STRUCTURE" + ) + + ## only emit warnings for optional columns + for warning in string_warnings: + logger.warning(warning) + + # check ID column + if "objectid_column" in config: + failed, id_message = validate_id_column( + geodata=structure_data, + config=config, + id_config_key="objectid_column", + geodata_name="STRUCTURE") + + if failed: + return (failed, id_message) + + return (False, "") + +@beartype.beartype +def check_fault_fields_validity(mapdata) -> Tuple[bool, str]: + + # Check type of loaded fault map + if ( + mapdata.raw_data[Datatype.FAULT] is None + or type(mapdata.raw_data[Datatype.FAULT]) is not geopandas.GeoDataFrame + ): + logger.warning("Fault map is not loaded or valid") + return (True, "Fault map is not loaded or valid") + + fault_data = mapdata.raw_data[Datatype.FAULT] + config = mapdata.config.fault_config + + # 2. Validate geometry + failed, message = validate_geometry( + geodata=fault_data, + expected_geom_types=[shapely.LineString, shapely.MultiLineString], + datatype_name="FAULT" + ) + if failed: + return (failed, message) + + # # Check "structtype_column" if it exists + text_keys = { + "fault_text": "fault_text" + } + structtype_validation_failed, structtype_message = validate_structtype_column( + geodata=fault_data, + config=config, + datatype_name="FAULT", + required=True, # Assuming structtype_column is required in FAULT + text_keys=text_keys + ) + if structtype_validation_failed: + return (structtype_validation_failed, structtype_message) + + + + #checks on name column + name_column = config.get("name_column") + if name_column not in fault_data.columns: + logger.warning( + f"Datatype FAULT: Column '{name_column}' (config key 'name_column') is missing from the fault data." + "Please ensure it is present, or remove that key from the config." + ) + + if name_column and name_column in fault_data.columns: + # Check if the column contains non-string values + if not fault_data[name_column].apply(lambda x: isinstance(x, str) or pandas.isnull(x)).all(): + logger.error( + f"Datatype FAULT: Column '{name_column}' (config key 'name_column') contains non-string values. Ensure all values are valid strings." + ) + return (True, f"Datatype FAULT: Column '{name_column}' (config key 'name_column') contains non-string values.") + + # Check for NaN values + if fault_data[name_column].isnull().any(): + logger.warning( + f"Datatype FAULT: Column '{name_column}' (config key 'name_column') contains NaN or empty values. This may affect processing." + ) + + # Check for duplicate values + if fault_data[name_column].duplicated().any(): + logger.warning( + f"Datatype FAULT: Column '{name_column}' contains duplicate values. This may affect processing." + ) + + # # dips & strikes + dip_columns = ["dip_column", "dipdir_column"] + dip_validation_failed, dip_message = validate_dip_columns( + geodata=fault_data, + config=config, + dip_columns=dip_columns, + datatype_name="FAULT", + allow_nulls=True # Dip fields can be empty + ) + if dip_validation_failed: + logger.warning(dip_message) + + # dip estimates + dip_estimate_column = config.get("dip_estimate_column") + valid_directions = [ + "north_east", "south_east", "south_west", "north_west", + "north", "east", "south", "west" + ] + + if dip_estimate_column: + if dip_estimate_column in fault_data.columns: + # Ensure all values are in the set of valid directions or are NaN + invalid_values = fault_data[dip_estimate_column][ + ~fault_data[dip_estimate_column].apply(lambda x: x in valid_directions or pandas.isnull(x)) + ] + + if not invalid_values.empty: + logger.error( + f"Datatype FAULT: Column '{dip_estimate_column}' contains invalid values not in the set of allowed dip estimates: {valid_directions}." + ) + return ( + True, + f"Datatype FAULT: Column '{dip_estimate_column}' contains invalid values. Allowed values: {valid_directions}.", + ) + + # Warn if there are NaN or empty values + if fault_data[dip_estimate_column].isnull().any(): + logger.warning( + f"Datatype FAULT: Column '{dip_estimate_column}' contains NaN or empty values. This may affect processing." + ) + else: + logger.error( + f"Datatype FAULT: Column '{dip_estimate_column}' is missing from the fault data. Please ensure the column name is correct or remove that key from the config." + ) + return (True, f"Datatype FAULT: Column '{dip_estimate_column}' is missing from the fault data.") + + + # # 4. check ID column + if "objectid_column" in config: + id_validation_failed, id_message = validate_id_column( + geodata=fault_data, + config=config, + id_config_key="objectid_column", + geodata_name="FAULT") + + if id_validation_failed: + return (id_validation_failed, id_message) + + return (False, "") + +@beartype.beartype +def check_fold_fields_validity(mapdata) -> Tuple[bool, str]: + # Check type of loaded fold map + if ( + mapdata.raw_data[Datatype.FOLD] is None + or type(mapdata.raw_data[Datatype.FOLD]) is not geopandas.GeoDataFrame + ): + logger.warning("Fold map is not loaded or valid") + return (True, "Fold map is not loaded or valid") + + folds = mapdata.raw_data[Datatype.FOLD] + config = mapdata.config.fold_config + + # Debugging: Print column names in the fold_data + logger.debug(f"Fold data columns: {folds.columns.tolist()}") + + # 2. Validate geometry + failed, message = validate_geometry( + geodata=folds, + expected_geom_types=[shapely.LineString, shapely.MultiLineString], + datatype_name="FOLD" + ) + if failed: + return (failed, message) + + ## check structtype column if it exists + text_keys = { + "fold_text": "fold_text", + "synform_text": "synform_text" + } + structtype_validation_failed, structtype_message = validate_structtype_column( + geodata=folds, + config=config, + datatype_name="FOLD", + required=True, # Assuming structtype_column is required in FOLD + text_keys=text_keys + ) + if structtype_validation_failed: + return (structtype_validation_failed, structtype_message) + + # check description column + description_column = config.get("description_column", None) + if description_column: + # Ensure the column exists in the data + if description_column not in folds.columns: + logger.warning( + f"Datatype FOLD: Column '{description_column}' (config key: 'description_column') is missing from the fold data. Consider removing that key from the config." + ) + else: + # Check if all entries in the column are strings + if not folds[description_column].apply(lambda x: isinstance(x, str) or pandas.isnull(x)).all(): + logger.error( + f"Datatype FOLD: Column '{description_column}' (config key: 'description_column') contains non-string values. Please ensure all values in this column are strings." + ) + return (True, f"Datatype FOLD: Column '{description_column}' (config key: 'description_column') contains non-string values.") + + # Warn about empty or null cells + if folds[description_column].isnull().any() or folds[description_column].str.strip().eq("").any(): + logger.warning( + f"Datatype FOLD: Column '{description_column}' contains NaN, empty, or blank values. Processing might not work as expected." + ) + + + # # 4. check ID column + if "objectid_column" in config: + id_validation_failed, id_message = validate_id_column( + geodata=folds, + config=config, + id_config_key="objectid_column", + geodata_name="FOLD") + + if id_validation_failed: + return (id_validation_failed, id_message) + + return (False, "") + + +@beartype.beartype +def validate_config_dictionary(config_dict: dict) -> None: + + # 1) check mandatory keys for "structure" and "geology" + required_keys = { + "structure": {"dipdir_column", "dip_column"}, + "geology": {"unitname_column", "alt_unitname_column"}, + } + + # Loop over "structure" and "geology" + for section, keys in required_keys.items(): + + # 1) Check that "section" exists + if section not in config_dict: + logger.error(f"Missing required section '{section}' in config dictionary.") + raise ValueError(f"Missing required section '{section}' in config dictionary.") + + # 2) Check that each required key is in config_dict[section] + for key in keys: + if key not in config_dict[section]: + logger.error(f"Missing required key '{key}' for '{section}' section of the config dictionary.") + raise ValueError(f"Missing required key '{key}' for '{section}' section of the config dictionary.") + + # 2) check for legacy keys first: + legacy_keys = { + "otype", "dd", "d", "sf", "bedding", "bo", "btype", "gi", "c", "u", + "g", "g2", "ds", "min", "max", "r1", "r2", "sill", "intrusive", "volcanic", + "f", "fdipnull", "fdipdip_flag", "fdipdir", "fdip", "fdipest", + "fdipest_vals", "n", "ff", "t", "syn" + } + + def check_keys(d: dict, parent_key=""): + for key, value in d.items(): + if key in legacy_keys: + logger.error( + f"Legacy key found in config - '{key}' at '{parent_key}'. Please use the new config format. Use map2loop.utils.update_from_legacy_file to convert between the formats if needed" + ) + raise ValueError( + f"Legacy key found in config - '{key}' at '{parent_key}'. Please use the new config format. Use map2loop.utils.update_from_legacy_file to convert between the formats if needed" + ) + if isinstance(value, dict): + check_keys(value, parent_key=f"{parent_key}{key}.") + + check_keys(config_dict) + + # 3) check if all keys are valid: + allowed_keys_by_section = { + "structure": { + "orientation_type", "dipdir_column", "dip_column", + "description_column", "bedding_text", "overturned_column", "overturned_text", + "objectid_column", "desciption_column", "interp_source_column" + }, + "geology": { + "unitname_column", "alt_unitname_column", "group_column", + "supergroup_column", "description_column", "minage_column", + "maxage_column", "rocktype_column", "alt_rocktype_column", + "sill_text", "intrusive_text", "volcanic_text", "objectid_column", "ignore_lithology_codes", + }, + "fault": { + "structtype_column", "fault_text", "dip_null_value", + "dipdir_flag", "dipdir_column", "dip_column", "orientation_type", + "dipestimate_column", "dipestimate_text","displacement_column", + "displacement_text", "name_column","objectid_column", "featureid_column", "minimum_fault_length", + "fault_length_column", "fault_length_text", "ignore_fault_codes", + }, + "fold": { + "structtype_column", "fold_text", "axial_plane_dipdir_column", + "axial_plane_dip_column","tightness_column", "description_column", + "synform_text", "foldname_column","objectid_column", + }, + } + + for section_name, section_dict in config_dict.items(): + # check section + if section_name not in allowed_keys_by_section: + logger.error(f"Unrecognized section '{section_name}' in config dictionary.") + raise ValueError(f"Unrecognized section '{section_name}' in config dictionary.") + + # check keys + allowed_keys = allowed_keys_by_section[section_name] + for key in section_dict.keys(): + if key not in allowed_keys: + logger.error(f"Key '{key}' is not an allowed key in the '{section_name}' section.") + raise ValueError(f"Key '{key}' is not an allowed key in the '{section_name}' section.") + + # 4) check if minimum fault length is a number + mfl = config_dict.get("fault", {}).get("minimum_fault_length", None) + if mfl is not None and not isinstance(mfl, (int, float)): + logger.error("minimum_fault_length must be a number.") + raise ValueError(f"minimum_fault_length must be a number, instead got: {type(mfl)}") + +@beartype.beartype +def validate_geometry( + geodata: geopandas.GeoDataFrame, + expected_geom_types: List[type], + datatype_name: str +) -> Tuple[bool, str]: + geodata.geometry = geodata.geometry.make_valid() + # 1. Check if all geometries are valid + if not geodata.geometry.is_valid.all(): + logger.error(f"Invalid geometries found in datatype {datatype_name}. Please fix them before proceeding.") + return True, f"Invalid geometries found in datatype {datatype_name}" + + # 2. Check if all geometries are of the expected types + if not geodata.geometry.apply(lambda geom: isinstance(geom, tuple(expected_geom_types))).all(): + invalid_types = geodata[~geodata.geometry.apply(lambda geom: isinstance(geom, tuple(expected_geom_types)))] + invalid_indices = invalid_types.index.tolist() + expected_types_names = ', '.join([geom_type.__name__ for geom_type in expected_geom_types]) + logger.error( + f"Datatype {datatype_name}: Invalid geometry types found. Expected types: {expected_types_names}. " + f"Rows with invalid types: {invalid_indices}" + ) + return True, ( + f"Invalid geometry types found in datatype {datatype_name}. " + f"All geometries must be {expected_types_names}." + ) + + # If all checks pass + logger.debug(f"Geometry validation passed for datatype {datatype_name}") + return False, "" + + +@beartype.beartype +def validate_id_column( + geodata: geopandas.GeoDataFrame, + config: dict, + id_config_key: str, + geodata_name: str +) -> Tuple[bool, str]: + + # Retrieve the ID column name from the configuration + id_column = config.get(id_config_key) + + if not id_column: + error_msg = f"Configuration key '{id_config_key}' is missing." + logger.error(error_msg) + return (True, error_msg) + + if id_column in geodata.columns: + geodata[id_column] = pandas.to_numeric(geodata[id_column], errors='coerce') + + # Check for non-numeric values (which are now NaN after coercion) + if geodata[id_column].isnull().any(): + error_msg = ( + f"Datatype {geodata_name}: Column '{id_column}' " + f"(config key: '{id_config_key}') contains non-numeric or NaN values. " + "Please rectify the values, or remove this key from the config dictionary to let map2loop assign IDs." + ) + logger.error(error_msg) + return (True, error_msg) + + if not (geodata[id_column] == geodata[id_column].astype(int)).all(): + error_msg = ( + f"Datatype {geodata_name}: Column '{id_column}' " + f"(config key: '{id_config_key}') contains non-integer values." + ) + logger.error(error_msg) + return (True, error_msg) + + if geodata[id_column].duplicated().any(): + error_msg = ( + f"Datatype {geodata_name}: Column '{id_column}' " + f"(config key: '{id_config_key}') contains duplicate values." + ) + logger.error(error_msg) + return (True, error_msg) + + + elif id_column not in geodata.columns: + msg = ( + f"Datatype {geodata_name}: Column '{id_column}' " + f"(config key: '{id_config_key}') is missing from the data. " + "Map2loop will automatically generate IDs." + ) + logger.warning(msg) + + return (False, "") + +@beartype.beartype +def validate_required_columns( + geodata: geopandas.GeoDataFrame, + config: dict, + required_columns: List[str], + expected_type: Union[Type, Tuple[Type, ...]], + check_blank: bool = False, + datatype_name: str = "UNKNOWN" +) -> Tuple[bool, str]: + + for config_key in required_columns: + column_name = config.get(config_key) + + if not column_name: + error_msg = ( + f"Configuration key '{config_key}' is missing for datatype '{datatype_name}'." + ) + logger.error(error_msg) + return (True, error_msg) + + if column_name not in geodata.columns: + error_msg = ( + f"Datatype {datatype_name.upper()}: Required column with config key '{config_key}' " + f"(column: '{column_name}') is missing from the data." + ) + logger.error(error_msg) + return (True, error_msg) + + # Check data type + if not geodata[column_name].apply(lambda x: isinstance(x, expected_type)).all(): + error_msg = ( + f"Datatype {datatype_name.upper()}: Column '{config_key}' (column: '{column_name}') " + f"must contain only {expected_type if isinstance(expected_type, type) else 'numeric'} values." + ) + logger.error(error_msg) + return (True, error_msg) + + # Check for null values + if geodata[column_name].isnull().any(): + error_msg = ( + f"Datatype {datatype_name.upper()}: Column '{config_key}' (column: '{column_name}') " + f"contains null values. Please ensure all values are present." + ) + logger.error(error_msg) + return (True, error_msg) + + # Optionally check for blank strings + if check_blank and issubclass(expected_type, str): + if geodata[column_name].str.strip().eq("").any(): + error_msg = ( + f"Datatype {datatype_name.upper()}: Column '{config_key}' (column: '{column_name}') " + f"contains blank (empty) values. Please ensure all values are populated." + ) + logger.error(error_msg) + return (True, error_msg) + + # If all required columns pass validation + logger.info(f"Datatype {datatype_name.upper()}: All required columns validated successfully.") + return (False, "") + + +def validate_optional_columns( + geodata: geopandas.GeoDataFrame, + config: Dict[str, str], + optional_columns: List[str], + expected_type: Union[Type, Tuple[Type, ...]], + check_blank: bool = False, + datatype_name: str = "UNKNOWN" +) -> List[str]: + + warnings = [] + + for config_key in optional_columns: + column_name = config.get(config_key) + + if not column_name: + warning_msg = ( + f"Configuration key '{config_key}' is missing for datatype '{datatype_name}'. " + f"Optional column validation for this key is skipped." + ) + logger.warning(warning_msg) + warnings.append(warning_msg) + continue + + if column_name in geodata.columns: + # Type Check + if not geodata[column_name].apply(lambda x: isinstance(x, expected_type) or pandas.isnull(x)).all(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Optional column '{column_name}' " + f"(config key: '{config_key}') contains values that are not of type " + f"{expected_type if isinstance(expected_type, type) else expected_type}. " + "Map2loop processing might not work as expected." + ) + logger.warning(warning_msg) + warnings.append(warning_msg) + + # Blank String Check (if applicable) + if check_blank and issubclass(expected_type, str): + if geodata[column_name].str.strip().eq("").any(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Optional column '{column_name}' " + f"(config key: '{config_key}') contains blank (empty) string values. " + "Map2loop processing might not work as expected." + ) + logger.warning(warning_msg) + warnings.append(warning_msg) + + # Null Value Check + if geodata[column_name].isnull().any(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Optional column '{column_name}' " + f"(config key: '{config_key}') contains NaN or null values. " + "Map2loop processing might not work as expected." + ) + logger.warning(warning_msg) + warnings.append(warning_msg) + + else: + info_msg = ( + f"Datatype {datatype_name.upper()}: Optional column '{column_name}' " + f"(config key: '{config_key}') is missing from the data. " + ) + ###### this might be taking it a bit too far + + logger.info(info_msg) + + return warnings + + +@beartype.beartype +def validate_dip_columns( + geodata: geopandas.GeoDataFrame, + config: Dict[str, str], + dip_columns: List[str], + datatype_name: str = "UNKNOWN", + allow_nulls: bool = False +) -> Tuple[bool, str]: + + validation_failed = False + messages = [] + + # Define fixed ranges + fixed_ranges = { + "dip_column": (0, 90), + "dipdir_column": (0, 360) + } + + for key in dip_columns: + column_name = config.get(key) + if not column_name and datatype_name == "STRUCTURE": # only mandatory for structure, not faults! + warning_msg = ( + f"Configuration key '{key}' is missing for datatype '{datatype_name}'. " + f"Dip column validation for this key is skipped." + ) + logger.warning(warning_msg) + messages.append(warning_msg) + validation_failed = True + continue + + if column_name in geodata.columns: + # Coerce to numeric + geodata[column_name] = pandas.to_numeric(geodata[column_name], errors='coerce') + + # Check for non-numeric or NaN values + if geodata[column_name].isnull().any(): + if not allow_nulls: + warning_msg = ( + f"Datatype {datatype_name.upper()}: Column '{column_name}' " + f"(config key: '{key}') contains non-numeric or NaN values." + ) + logger.warning(warning_msg) + messages.append(warning_msg) + validation_failed = True + + # Check if all values are numeric + if not geodata[column_name].apply(lambda x: isinstance(x, (int, float)) or pandas.isnull(x)).all(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Column '{column_name}' " + f"(config key: '{key}') must contain only numeric values." + ) + logger.warning(warning_msg) + messages.append(warning_msg) + validation_failed = True + + # Range validation + min_val, max_val = fixed_ranges.get(key, (None, None)) + if min_val is not None and max_val is not None: + invalid_values = ~geodata[column_name].between(min_val, max_val, inclusive='both') + if invalid_values.any(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Column '{column_name}' " + f"(config key: '{key}') contains values outside the range [{min_val}, {max_val}]. " + "Is this intentional?" + ) + logger.warning(warning_msg) + messages.append(warning_msg) + + summary_message = "\n".join(messages) + return (validation_failed, summary_message) + + +@beartype.beartype +def validate_structtype_column( + geodata: geopandas.GeoDataFrame, + config: Dict[str, str], + datatype_name: str, + required: bool = True, + text_keys: Optional[Dict[str, str]] = None +) -> Tuple[bool, str]: + + structtype_key = "structtype_column" + structtype_column = config.get(structtype_key) + + if not structtype_column: + if required: + error_msg = ( + f"Configuration key '{structtype_key}' is missing for datatype '{datatype_name}'. " + f"Validation for 'structtype_column' is skipped." + ) + logger.warning(error_msg) + return (True, error_msg) + else: + warning_msg = ( + f"Configuration key '{structtype_key}' is missing for datatype '{datatype_name}'. " + f"Optional 'structtype_column' validation is skipped." + ) + logger.warning(warning_msg) + return (False, "") + + if structtype_column not in geodata.columns: + if required: + error_msg = ( + f"Datatype {datatype_name.upper()}: '{structtype_column}' (config key: '{structtype_key}') " + f"is missing from the data. Consider removing that key from the config." + ) + logger.error(error_msg) + return (True, error_msg) + else: + warning_msg = ( + f"Datatype {datatype_name.upper()}: '{structtype_column}' (config key: '{structtype_key}') " + f"is missing from the data. Consider removing that key from the config." + ) + logger.warning(warning_msg) + return (False, "") + + # Check if all entries are strings or nulls + if not geodata[structtype_column].apply(lambda x: isinstance(x, str) or pandas.isnull(x)).all(): + error_msg = ( + f"Datatype {datatype_name.upper()}: Column '{structtype_column}' " + f"(config key: '{structtype_key}') contains non-string values. " + "Please ensure all values in this column are strings." + ) + logger.error(error_msg) + return (True, error_msg) + + # Warn about empty or null cells + if geodata[structtype_column].isnull().any() or geodata[structtype_column].str.strip().eq("").any(): + warning_msg = ( + f"Datatype {datatype_name.upper()}: Column '{structtype_column}' contains NaN, empty, or blank values. " + "Processing might not work as expected." + ) + logger.warning(warning_msg) + + # Check for specific text keys + if text_keys: + for text_key, config_key in text_keys.items(): + text_value = config.get(config_key, None) + text_pattern = '|'.join(text_value) if text_value else None + if text_value: + if not isinstance(text_value, str): + error_msg = ( + f"Datatype {datatype_name.upper()}: '{config_key}' must be a string. " + "Please ensure it is defined correctly in the config." + ) + logger.error(error_msg) + return (True, error_msg) + + if not geodata[structtype_column].str.contains(text_pattern, case=False, regex=True, na=False).any(): + if text_key == "synform_text": + warning_msg = ( + f"Datatype {datatype_name.upper()}: The '{text_key}' value '{text_value}' is not found in column '{structtype_column}'. " + "This may impact processing." + ) + logger.warning(warning_msg) + else: + error_msg = ( + f"Datatype {datatype_name.upper()}: The '{text_key}' value '{text_value}' is not found in column '{structtype_column}'. " + "Project might end up with no faults." + ) + logger.error(error_msg) + return (True, error_msg) + + return (False, "") diff --git a/packages/map2loop/src/map2loop/deformation_history.py b/packages/map2loop/src/map2loop/deformation_history.py new file mode 100644 index 000000000..1bf47a614 --- /dev/null +++ b/packages/map2loop/src/map2loop/deformation_history.py @@ -0,0 +1,302 @@ +import pandas +import numpy +import beartype +import geopandas +import math + +from .utils import calculate_minimum_fault_length + + +from .logging import getLogger + +logger = getLogger(__name__) + + +class DeformationHistory: + """ + A class containing all the fault and fold summaries and relationships + + Attributes + ---------- + history: list + The time ordered list of deformation events + faultColumns: numpy.dtype + Column names and types for fault summary + foldColumns: numpy.dtype + Column names and types for fold summary + faults: pandas.DataFrame + The fault summary + folds: pandas.DataFrame + The fold summary + + """ + + def __init__(self, project): + """ + The initialiser for the deformation history. All attributes are defaulted + """ + self.history = [] + self.fault_fault_relationships = [] + self.project = project + + # Create empty fault and fold dataframes + self.faultColumns = numpy.dtype( + [ + ("eventId", int), + ("name", str), + ("minAge", float), + ("maxAge", float), + ("group", str), + ("supergroup", str), + ("avgDisplacement", float), + ("avgDownthrowDir", float), + ("influenceDistance", float), + ("verticalRadius", float), + ("horizontalRadius", float), + ("colour", str), + ("centreX", float), + ("centreY", float), + ("centreZ", float), + ("avgSlipDirX", float), + ("avgSlipDirY", float), + ("avgSlipDirZ", float), + ("avgNormalX", float), + ("avgNormalY", float), + ("avgNormalZ", float), + ("length", float), + ] + ) + self.faults = pandas.DataFrame(numpy.empty(0, dtype=self.faultColumns)) + # self.faults = self.faults.set_index("name") + + self.foldColumns = numpy.dtype( + [ + ("eventId", int), + ("name", str), + ("minAge", float), + ("maxAge", float), + ("periodic", bool), + ("wavelength", float), + ("amplitude", float), + ("asymmetry", bool), + ("asymmetryShift", float), + ("secondaryWavelength", float), + ("secondaryAmplitude", float), + ] + ) + self.folds = pandas.DataFrame(numpy.empty(0, dtype=self.foldColumns)) + # self.folds = self.folds.set_index("name") + + + + def findfault(self, id): + """ + Find the fault in the summary based on its eventId + + Args: + id (int or str): + The eventId or name to look for + + Returns: + pandas.DataFrame: The sliced data frame containing the requested fault + """ + if issubclass(type(id), int): + logger.info(f"Finding fault with eventId {id}") + return self.faults[self.faults["eventId"] == id] + elif issubclass(type(id), str): + logger.info(f"Finding fault with name {id}") + return self.faults[self.faults["name"] == id] + else: + logger.error("ERROR: Unknown identifier type used to find fault") + + def findfold(self, id): + """ + Find the fold in the summary based on its eventId + + Args: + id (int or str): + The eventId or name to look for + + Returns: + pandas.DataFrame: The sliced data frame containing the requested fold + """ + if issubclass(type(id), int): + logger.info(f"Finding fold with eventId {id}") + return self.folds[self.folds["foldId"] == id] + elif issubclass(type(id), str): + logger.info(f"Finding fold with name {id}") + return self.folds[self.folds["name"] == id] + else: + logger.error("ERROR: Unknown identifier type used to find fold") + + def addFault(self, fault): + """ + Add fault to the fault summary + + Args: + fault (pandas.DataFrame or dict): + The fault information to add + """ + if issubclass(type(fault), pandas.DataFrame) or issubclass(type(fault), dict): + if "name" in fault.keys(): + if fault["name"] in self.faults.index: + logger.warning("Replacing fault", fault["name"]) + self.faults[fault["name"]] = fault + logger.info("Adding fault", fault["name"]) + else: + logger.error("No name field in fault", fault) + else: + logger.error("Cannot add fault to dataframe with type", type(fault)) + + def removeFaultByName(self, name: str): + """ + Remove the fault from the summary by name + + Args: + name (str): + The name of the fault(s) to remove + """ + logger.info(f"Removing fault with name {name}") + self.faults = self.faults.drop[self.faults.index[self.faults["name"] != name]] + + def removeFaultByEventId(self, eventId: int): + """ + Remove the fault from the summary by eventId + + Args: + eventId (int): + The eventId of the fault to remove + """ + logger.info(f"Removing fault with eventId {eventId}") + self.faults = self.faults[self.faults["eventId"] != eventId].copy() + + def addFold(self, fold): + """ + Add fold to the fold summary + + Args: + fold (pandas.DataFrame or dict): + The fold information to add + """ + if issubclass(type(fold), pandas.DataFrame) or issubclass(type(fold), dict): + if "name" in fold.keys(): + if fold["name"] in self.folds.index: + logger.warning("Replacing fold", fold["name"]) + logger.info("Adding fold", fold["name"]) + self.folds[fold["name"]] = fold + else: + logger.error("No name field in fold", fold) + else: + logger.error("Cannot add fold to dataframe with type", type(fold)) + + @beartype.beartype + def populate(self, faults_map_data: geopandas.GeoDataFrame): + """ + Populate the fault (and fold) summaries from a geodataframe + + Args: + faults_map_data (geopandas.GeoDataFrame): + The parsed data frame from the map + """ + logger.info("Populating fault/fold summary") + if faults_map_data.shape[0] == 0: + return + faults_data = faults_map_data.copy() + faults_data = faults_data.dissolve(by="NAME", as_index=False) + faults_data = faults_data.reset_index(drop=True) + + self.stratigraphicUnits = pandas.DataFrame( + numpy.empty(faults_data.shape[0], dtype=self.faultColumns) + ) + self.faults["eventId"] = faults_data["ID"] + self.faults["name"] = faults_data["NAME"] + self.faults["minAge"] = -1.0 + self.faults["maxAge"] = -1.0 + self.faults["group"] = "" + self.faults["supergroup"] = "" + self.faults["avgDisplacement"] = -1.0 + self.faults["avgDownthrowDir"] = numpy.nan + self.faults["influenceDistance"] = numpy.nan + self.faults["verticalRadius"] = numpy.nan + self.faults["horizontalRadius"] = numpy.nan + self.faults["colour"] = "#000000" + self.faults["centreX"] = numpy.nan + self.faults["centreY"] = numpy.nan + self.faults["centreZ"] = numpy.nan + self.faults["avgSlipDirX"] = numpy.nan + self.faults["avgSlipDirY"] = numpy.nan + self.faults["avgSlipDirZ"] = numpy.nan + self.faults["avgNormalX"] = numpy.nan + self.faults["avgNormalY"] = numpy.nan + self.faults["avgNormalZ"] = numpy.nan + self.faults["length"] = faults_data.geometry.length + for index, fault in self.faults.iterrows(): + bounds = faults_map_data[faults_map_data["ID"] == fault["eventId"]].geometry.bounds + xdist = float(bounds.maxx.iloc[0] - bounds.minx.iloc[0]) + ydist = float(bounds.maxy.iloc[0] - bounds.miny.iloc[0]) + length = math.sqrt(xdist * xdist + ydist * ydist) + self.faults.at[index, "verticalRadius"] = length + self.faults.at[index, "horizontalRadius"] = length / 2.0 + self.faults.at[index, "influenceDistance"] = length / 4.0 + + @beartype.beartype + def summarise_data(self, fault_observations: pandas.DataFrame): + """ + Use fault observations data to add summary data for each fault + + Args: + fault_observations (pandas.DataFrame): + The fault observations data + """ + logger.info("Summarising fault data") + id_list = self.faults["eventId"].unique() + for id in id_list: + observations = fault_observations[fault_observations["ID"] == id] + if len(observations) < 2: + self.removeFaultByEventId(id) + + # id_list = self.faults["eventId"].unique() + for index, fault in self.faults.iterrows(): + observations = fault_observations[fault_observations["ID"] == fault["eventId"]] + # calculate centre point + self.faults.at[index, "centreX"] = numpy.mean(observations["X"]) + self.faults.at[index, "centreY"] = numpy.mean(observations["Y"]) + self.faults.at[index, "centreZ"] = numpy.mean(observations["Z"]) + + + def get_faults_for_export(self): + """ + Get the faults for export (removes any fault that is shorter than the cutoff) + + Returns: + pandas.DataFrame: The filtered fault summary + """ + # if no minimum fault length is set, calculate it + if self.project.get_minimum_fault_length() < 0: + self.project.set_minimum_fault_length( calculate_minimum_fault_length( + bbox=self.project.bounding_box, area_percentage=0.05 + )) + return self.faults[self.faults["length"] >= self.project.get_minimum_fault_length()].copy() + + @beartype.beartype + def get_fault_relationships_with_ids(self, fault_fault_relationships: pandas.DataFrame): + """ + Ammend the fault relationships DataFrame with the fault eventIds + + Args: + fault_fault_relationships (pandas.DataFrame): The fault_fault_relationships + + Returns: + pandas.DataFrame: The fault_relationships with the correct eventIds + """ + logger.info("Getting fault relationships with eventIds") + + faultIds = self.get_faults_for_export()[["eventId", "name"]].copy() + rel = fault_fault_relationships.copy() + rel = rel.merge(faultIds, left_on="Fault1", right_on="eventId") + rel.rename(columns={"eventId": "eventId1"}, inplace=True) + rel.drop(columns=["name"], inplace=True) + rel = rel.merge(faultIds, left_on="Fault2", right_on="eventId") + rel.rename(columns={"eventId": "eventId2"}, inplace=True) + rel.drop(columns=["name"], inplace=True) + return rel diff --git a/packages/map2loop/src/map2loop/fault_orientation.py b/packages/map2loop/src/map2loop/fault_orientation.py new file mode 100644 index 000000000..33c790b53 --- /dev/null +++ b/packages/map2loop/src/map2loop/fault_orientation.py @@ -0,0 +1,101 @@ +from abc import ABC, abstractmethod +import beartype +import pandas +import geopandas +from .mapdata import MapData +import numpy as np + +from .logging import getLogger + +logger = getLogger(__name__) + + +class FaultOrientation(ABC): + """ + Base Class of Fault Orientation assigner to force structure of FaultOrientation + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__(self): + """ + Initialiser of for orientation assigner + """ + self.label = "FaultOrientationBaseClass" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.label + + @beartype.beartype + @abstractmethod + def calculate( + self, + fault_trace: geopandas.GeoDataFrame, + fault_orientations: pandas.DataFrame, + map_data: MapData, + ) -> pandas.DataFrame: + """ + Execute fault orientation assigned method (abstract method) + + Args: + faults (pandas.DataFrame): the data frame of the faults to add throw values to + fault_orientation (pandas.DataFrame): data frame with fault orientations to assign to faults + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: fault orientations assigned to a fault label + """ + pass + + +class FaultOrientationNearest(FaultOrientation): + """ + FaultOrientation class which estimates fault orientation based on nearest orientation + """ + + def __init__(self): + """ + Initialiser for nearest version of the fault orientation assigner + """ + self.label = "FaultOrientationNearest" + + @beartype.beartype + def calculate( + self, + fault_trace: geopandas.GeoDataFrame, + fault_orientations: pandas.DataFrame, + map_data: MapData, + ) -> pandas.DataFrame: + """ + Assigns the nearest fault orientation to a fault + + Args: + fault_trace (geopandas.GeoDataFrame): the data frame of the fault traces + fault_orientation (pandas.DataFrame): data frame with fault orientations to assign to faults + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: fault orientations assigned to a fault label + """ + logger.info("Assigning fault orientations to fault traces from nearest orientation") + orientations = fault_orientations.copy() + logger.info(f'There are {len(orientations)} fault orientations to assign') + + orientations["ID"] = -1 + + for i in orientations.index: + p = orientations.loc[i, :].geometry + orientations.loc[i, "ID"] = fault_trace.loc[ + fault_trace.index[np.argmin(fault_trace.distance(p))], "ID" + ] + orientations.loc[i, "X"] = p.x + orientations.loc[i, "Y"] = p.y + + return orientations.drop(columns="geometry") diff --git a/packages/map2loop/src/map2loop/interpolators.py b/packages/map2loop/src/map2loop/interpolators.py new file mode 100644 index 000000000..9648348ea --- /dev/null +++ b/packages/map2loop/src/map2loop/interpolators.py @@ -0,0 +1,438 @@ +from abc import ABC, abstractmethod +from typing import Any, Union +import beartype +import numpy +from numpy import ndarray +from scipy.interpolate import Rbf, LinearNDInterpolator +from sklearn.cluster import DBSCAN +import pandas + + +from .utils import strike_dip_vector, generate_grid + +from .logging import getLogger +logger = getLogger(__name__) + +class Interpolator(ABC): + """ + Base Class of Interpolator used to force structure of Interpolator + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__(self): + """ + Initialiser of for Interpolator + """ + self.interpolator_label = "InterpolatorBaseClass" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.interpolator_label + + @beartype.beartype + @abstractmethod + def setup_interpolation(self, structure_data: pandas.DataFrame): + """ + abstract method to setup interpolation (abstract method) + + Args: + structure_data (pandas.DataFrame): sampled structural data + """ + pass + + @beartype.beartype + @abstractmethod + def setup_grid(self, bounding_box: dict): + """ + abstract method to setup an XY grid (abstract method) + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data. + The bounding box dictionary should comply with the following format: { + "minx": value, + "maxx": value, + "miny": value, + "maxy": value, + } + """ + pass + + @beartype.beartype + @abstractmethod + def interpolate(self, ni: Union[list, numpy.ndarray]): + """ + Interpolator method + + Args: + + ni (int): number of points + + + Returns: + float: interpolated value + """ + + pass + + @beartype.beartype + @abstractmethod + def __call__( + self, bounding_box: dict, structure_data: pandas.DataFrame, interpolator: Any = None + ) -> Any: + """ + Execute interpolate method (abstract method) + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data + structure_data (pandas.DataFrame): sampled structural data + interpolator: type of interpolator to use by default SciPy Rbf interpolator + + Returns: + list: sorted list of unit names + + """ + pass + + +class NormalVectorInterpolator(Interpolator): + """ + This class is a subclass of the Interpolator abstract base class. It implements the normal vector interpolation + method for a given set of data points. + + Attributes: + dataframe (pandas.DataFrame): A DataFrame that stores the processed data points for interpolation. + x (numpy.ndarray): A numpy array that stores the x-coordinates of the data points. + y (numpy.ndarray): A numpy array that stores the y-coordinates of the data points. + xi (numpy.ndarray): A numpy array that stores the x-coordinates of the grid points for interpolation. + yi (numpy.ndarray): A numpy array that stores the y-coordinates of the grid points for interpolation. + interpolator_label (str): A string that stores the label of the interpolator. For this class, it is + "NormalVectorInterpolator". + + Methods: + type(): Returns the label of the interpolator. + setup_interpolation(structure_data: pandas.DataFrame): Sets up the interpolation by preparing the data points for interpolation. + setup_grid(bounding_box: dict): Sets up the grid for interpolation. + interpolator(ni: Any) -> numpy.ndarray: Performs the interpolation for a given set of values. + interpolate(bounding_box: dict, structure_data: pandas.DataFrame, interpolator: Any) -> numpy.ndarray: Executes the interpolation method. + """ + + def __init__(self): + """ + Initialiser of for NormalVectorInterpolator class + """ + self.dataframe = None + self.x = None + self.y = None + self.xi = None + self.yi = None + self.interpolator_label = "NormalVectorInterpolator" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.interpolator_label + + @beartype.beartype + def setup_interpolation(self, structure_data: pandas.DataFrame): + """ + Setup the interpolation method (abstract method) + + Args: + structure_data (pandas.DataFrame): sampled structural data + """ + # the following code is a slightly modified version from LoopStructural's InputDataProcessor + if ( + "nx" not in structure_data.columns + or "ny" not in structure_data.columns + or "nz" not in structure_data.columns + ): + if "strike" not in structure_data.columns and "azimuth" in structure_data.columns: + structure_data["strike"] = structure_data["azimuth"] - 90 + if "strike" not in structure_data.columns and "dipdir" in structure_data.columns: + structure_data["strike"] = structure_data["dipdir"] - 90 + + if "strike" not in structure_data.columns and "dipDir" in structure_data.columns: + structure_data["strike"] = structure_data["dipDir"] - 90 + if "strike" not in structure_data.columns and "DIPDIR" in structure_data.columns: + structure_data["strike"] = structure_data["DIPDIR"] - 90 + + if "strike" in structure_data.columns and "dip" in structure_data.columns: + structure_data["nx"] = numpy.nan + structure_data["ny"] = numpy.nan + structure_data["nz"] = numpy.nan + structure_data[["nx", "ny", "nz"]] = strike_dip_vector( + structure_data["strike"], structure_data["dip"] + ) + if "strike" in structure_data.columns and "DIP" in structure_data.columns: + structure_data["nx"] = numpy.nan + structure_data["ny"] = numpy.nan + structure_data["nz"] = numpy.nan + structure_data[["nx", "ny", "nz"]] = strike_dip_vector( + structure_data["strike"], structure_data["DIP"] + ) + + if ( + "nx" not in structure_data.columns + or "ny" not in structure_data.columns + or "nz" not in structure_data.columns + ): + raise ValueError( + "Contact orientation data must contain either strike/dipdir, dip, or nx, ny, nz" + ) + + if ( + "X" not in structure_data.columns + or "Y" not in structure_data.columns + or "Z" not in structure_data.columns + ): + if "X" not in structure_data.columns and "easting" in structure_data.columns: + structure_data["X"] = structure_data["easting"] + if "X" not in structure_data.columns and "easting" not in structure_data.columns: + structure_data["X"] = structure_data["geometry"].apply(lambda geom: geom.x) + + if "Y" not in structure_data.columns and "northing" in structure_data.columns: + structure_data["Y"] = structure_data["northing"] + if "Y" not in structure_data.columns and "northing" not in structure_data.columns: + structure_data["Y"] = structure_data["geometry"].apply(lambda geom: geom.y) + if "Z" not in structure_data.columns and "altitude" in structure_data.columns: + structure_data["Z"] = structure_data["altitude"] + if "Z" not in structure_data.columns and "altitude" not in structure_data.columns: + structure_data["Z"] = 0 + + if ( + "X" not in structure_data.columns + or "Y" not in structure_data.columns + or "Z" not in structure_data.columns + ): + raise ValueError( + "Contact orientation data must contain either X, Y, Z or easting, northing, altitude" + ) + + self.dataframe = structure_data + self.x = structure_data["X"].to_numpy() + self.y = structure_data["Y"].to_numpy() + + @beartype.beartype + def setup_grid(self, bounding_box: dict): + """ + Setup the grid for interpolation + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data. + The bounding box dictionary should comply with the following format: { + "minx": value, + "maxx": value, + "miny": value, + "maxy": value, + } + """ + self.xi, self.yi = generate_grid(bounding_box) + + @beartype.beartype + def interpolate(self, ni: Union[ndarray, list], interpolator: Any = Rbf) -> numpy.ndarray: + # TODO: 1. add code to use LoopStructural interpolators + """ + Inverse Distance Weighting interpolation method + + Args: + ni (int): value to interpolate + interpolator: type of interpolator to use by default SciPy Rbf interpolator + + Returns: + Rbf: radial basis function object + """ + if interpolator is Rbf: + rbf = Rbf(self.x, self.y, ni, function="linear") + return rbf(self.xi, self.yi) + + if interpolator is LinearNDInterpolator: + lnd_interpolator = LinearNDInterpolator(list(zip(self.x, self.y)), ni) + return lnd_interpolator(self.xi, self.yi) + + @beartype.beartype + def __call__( + self, bounding_box: dict, structure_data: pandas.DataFrame, interpolator: Any = Rbf + ) -> numpy.ndarray: + """ + Execute interpolation method + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data + structure_data (pandas.DataFrame): sampled structural data + interpolator: type of interpolator to use by default SciPy Rbf interpolator + + Returns: + list: sorted list of unit names + + """ + self.setup_interpolation(structure_data) + self.setup_grid(bounding_box) + # get normal vector components + nx = self.dataframe["nx"].to_numpy() + ny = self.dataframe["ny"].to_numpy() + nz = self.dataframe["nz"].to_numpy() + + # interpolate each component of the normal vector nx, ny, nz + nx_interp = self.interpolate(nx) + ny_interp = self.interpolate(ny) + nz_interp = self.interpolate(nz) + + vecs = numpy.array([nx_interp, ny_interp, nz_interp]).T + # normalize the vectors + vecs /= numpy.linalg.norm(vecs, axis=1)[:, None] + + return vecs + + +class DipDipDirectionInterpolator(Interpolator): + """ + + + Args: + Interpolator(ABC): Derived from Abstract Base Class + """ + + def __init__(self, data_type=None): + """ + Initialiser of for IDWInterpolator + """ + if data_type is None: + self.data_type = ["dip", "dipdir"] + else: + self.data_type = data_type + self.x = None + self.y = None + self.xi = None + self.yi = None + self.dip = None + self.dipdir = None + self.cell_size = None + self.interpolator_label = "DipDipDirectionInterpolator" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.interpolator_label + + @beartype.beartype + def setup_interpolation(self, structure_data: pandas.DataFrame): + """ + Setup the interpolation method + + Args: + structure_data (pandas.DataFrame): sampled structural data + """ + # Check for collocated points and remove them + structure_data = structure_data.drop_duplicates(subset=['X', 'Y']).copy() + # Check for collocated point clusters and average them + coords = structure_data[["X", "Y"]].values + db = DBSCAN(eps=self.cell_size, min_samples=1).fit(coords) + structure_data["cluster"] = db.labels_ + # Check if there are any clusters with more than one point (indicating collocated points) + collocated_clusters = structure_data['cluster'].value_counts() + collocated_clusters = collocated_clusters[collocated_clusters > 1] + + if not collocated_clusters.empty: + # Log a warning if collocated points are detected + logger.warning( + f"Detected {len(collocated_clusters)} collocated point clusters. Aggregating these points.\n " + ) + + # Aggregate data for collocated points by taking the mean of X, Y, DIP, and DIPDIR within each cluster + aggregated_data = ( + structure_data.groupby("cluster") + .agg({"X": "mean", "Y": "mean", "DIP": "mean", "DIPDIR": "mean"}) + .reset_index(drop=True) + ) + + # setup variables for interpolation + self.x = aggregated_data["X"].to_numpy() + self.y = aggregated_data["Y"].to_numpy() + if "dip" in self.data_type: + self.dip = aggregated_data["DIP"].to_numpy() + if "dipdir" in self.data_type: + self.dipdir = aggregated_data["DIPDIR"].to_numpy() + + @beartype.beartype + def setup_grid(self, bounding_box: dict): + """ + Setup the grid for interpolation + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data. + The bounding box dictionary should comply with the following format: { + "minx": value, + "maxx": value, + "miny": value, + "maxy": value, + } + """ + self.xi, self.yi, self.cell_size = generate_grid(bounding_box) + + @beartype.beartype + def interpolate(self, ni: Union[ndarray, list], interpolator: Any = Rbf): + # TODO: 1. add code to use LoopStructural interpolators + """ + Inverse Distance Weighting interpolation method + + Args: + ni (int): value to interpolate + interpolator: type of interpolator to use by default SciPy Rbf interpolator + + Returns: + Rbf: radial basis function object + """ + if interpolator is Rbf: + rbf = Rbf(self.x, self.y, ni, function="linear") + return rbf(self.xi, self.yi) + + if interpolator is LinearNDInterpolator: + lnd_interpolator = LinearNDInterpolator(list(zip(self.x, self.y)), ni) + return lnd_interpolator(self.xi, self.yi) + + @beartype.beartype + def __call__( + self, bounding_box: dict, structure_data: pandas.DataFrame, interpolator: Any = Rbf + ): + """ + Execute interpolation method (abstract method) + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data + structure_data (pandas.DataFrame): sampled structural data + interpolator (Union[Rbf, LinearNDInterpolator]): type of interpolator to use by default SciPy Rbf interpolator + + Returns: + numpy.ndarray: interpolated dip and dip direction values + + """ + self.setup_grid(bounding_box) + self.setup_interpolation(structure_data) + + # interpolate dip and dip direction + if self.dip is not None and self.dipdir is not None: + interpolated_dip = self.interpolate(self.dip, interpolator) + interpolated_dipdir = self.interpolate(self.dipdir, interpolator) + interpolated = numpy.array([interpolated_dip, interpolated_dipdir]).T + return interpolated + + if self.dip is not None and self.dipdir is None: + return self.interpolate(self.dip, interpolator) + + if self.dipdir is not None and self.dip is None: + return self.interpolate(self.dipdir, interpolator) diff --git a/packages/map2loop/src/map2loop/logging.py b/packages/map2loop/src/map2loop/logging.py new file mode 100644 index 000000000..c0fe217c5 --- /dev/null +++ b/packages/map2loop/src/map2loop/logging.py @@ -0,0 +1,118 @@ +import logging + +loggers = {} + +ch = ch = logging.StreamHandler() +formatter = logging.Formatter("%(levelname)s: %(asctime)s: %(filename)s:%(lineno)d -- %(message)s") +ch.setFormatter(formatter) +ch.setLevel(logging.WARNING) +def get_levels(): + """dict for converting to logger levels from string + + + Returns + ------- + dict + contains all strings with corresponding logging levels. + """ + return { + "info": logging.INFO, + "warning": logging.WARNING, + "error": logging.ERROR, + "debug": logging.DEBUG, + } + + +def getLogger(name: str): + """Get a logger object with a specific name + + + Parameters + ---------- + name : str + name of the logger object + + Returns + ------- + logging.Logger + logger object + """ + if name in loggers: + return loggers[name] + logger = logging.getLogger(name) + logger.addHandler(ch) + logger.propagate = False + loggers[name] = logger + return logger + + +logger = getLogger(__name__) + + +def set_level(level: str): + """Set the level of the logging object + + + Parameters + ---------- + level : str + level of the logging object + """ + levels = get_levels() + level = levels.get(level, logging.WARNING) + ch.setLevel(level) + + for name in loggers: + logger = logging.getLogger(name) + logger.setLevel(level) + logger.info(f"Logging level set to {level}") + + +logger = getLogger(__name__) +logger.info("Imported map2loop.logging module") + + +def setLogging(level="info", handler=None): + """Set the logging parameters for log file or custom handler. + + Parameters + ---------- + level : str, optional + Logging level to set, by default "info" + Valid options: 'info', 'warning', 'error', 'debug' + handler : logging.Handler, optional + A logging handler to use instead of the default StreamHandler, by default None + + Examples + -------- + >>> from map2loop.logging import setLogging + >>> setLogging('debug') + >>> setLogging('info', logging.FileHandler('loop.log')) + """ + levels = get_levels() + level_value = levels.get(level, logging.WARNING) + + # Create default handler if none provided + if handler is None: + handler = logging.StreamHandler() + + formatter = logging.Formatter( + "%(levelname)s: %(asctime)s: %(filename)s:%(lineno)d -- %(message)s" + ) + handler.setFormatter(formatter) + handler.setLevel(level_value) + + # Replace handlers in all known loggers + for name in loggers: + logger = logging.getLogger(name) + logger.handlers = [] + logger.addHandler(handler) + logger.setLevel(level_value) + + # Also apply to main module logger + main_logger = logging.getLogger(__name__) + main_logger.handlers = [] + main_logger.addHandler(handler) + main_logger.setLevel(level_value) + + main_logger.info(f"Set logging to {level}") diff --git a/packages/map2loop/src/map2loop/m2l_enums.py b/packages/map2loop/src/map2loop/m2l_enums.py new file mode 100644 index 000000000..f390361a9 --- /dev/null +++ b/packages/map2loop/src/map2loop/m2l_enums.py @@ -0,0 +1,32 @@ +from enum import IntEnum + + +class Datatype(IntEnum): + GEOLOGY = 0 + STRUCTURE = 1 + FAULT = 2 + FOLD = 3 + DTM = 4 + FAULT_ORIENTATION = 5 + + +class Datastate(IntEnum): + UNNAMED = 0 + UNLOADED = 1 + LOADED = 2 + REPROJECTED = 3 + CLIPPED = 4 + COMPLETE = 5 + ERRORED = 9 + + +class ErrorState(IntEnum): + NONE = 0 + URLERROR = 1 + CONFIGERROR = 2 + + +class VerboseLevel(IntEnum): + NONE = 0 + TEXTONLY = 1 + ALL = 2 diff --git a/packages/map2loop/src/map2loop/mapdata.py b/packages/map2loop/src/map2loop/mapdata.py new file mode 100644 index 000000000..5ae780c12 --- /dev/null +++ b/packages/map2loop/src/map2loop/mapdata.py @@ -0,0 +1,1537 @@ +# internal imports +from .m2l_enums import Datatype, Datastate, VerboseLevel +from .config import Config +from .aus_state_urls import AustraliaStateUrls +from .utils import generate_random_hex_colors, calculate_minimum_fault_length +from .data_checks import check_geology_fields_validity, check_structure_fields_validity, check_fault_fields_validity, check_fold_fields_validity + +# external imports +import geopandas +import pandas +import numpy +import pathlib +import shapely +from osgeo import gdal, osr +gdal.UseExceptions() +from owslib.wcs import WebCoverageService +import urllib +from gzip import GzipFile +from uuid import uuid4 +import beartype +import os +from io import BytesIO +from typing import Union +import tempfile + + +from .logging import getLogger +logger = getLogger(__name__) + + + +class MapData: + """ + A data structure containing all the map data loaded from map files + + Attributes + ---------- + raw_data: list of geopandas.DataFrames + A list containing the raw geopanda data frames before any modification + data: list of geopandas.DataFrames + A list containing the geopanda data frames or raster image of all the different map data + contacts: geopandas.DataFrame + A dataframe containing the contacts between units in polylines + basal_contacts: geopandas.DataFrame + A dataframe containing the contacts between units labelled with whether it is basal or not + filenames: list of data source filenames + A list of the filenames/urls of where to find the data to be loaded + dirtyflags: list of booleans + A list of flags indicating whether the data has been loaded or dirtied + data_states: intEnum + Enums representing the state of each of the data sets + working_projection: str + A string containing the projection e.g. "EPSG:28350" + bounding_box: dict + The bounding box in cartesian coordinates with 6 elements + bounding_box_polygon: shapely.geometry.Polygon + The bounding box in polygonal form + bounding_box_str: str + The bounding box in string form (used for url requests) + config_filename: str + The filename of the json config file + colour_filename: str + The filename of the csv colour table file (columns are unit name and colour in #000000 form) + verbose_level: m2l_enums.VerboseLevel + A selection that defines how much console logging is output + config: Config + A link to the config structure which is defined in config.py + """ + + def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): + """ + The initialiser for the map data + + Args: + verbose_level (VerboseLevel, optional): + How much console output is sent. Defaults to VerboseLevel.ALL. + """ + self.raw_data = [None] * len(Datatype) + self.data = [None] * len(Datatype) + self.contacts = None + self.basal_contacts = None + self.sampled_contacts = None + self.filenames = [None] * len(Datatype) + self.dirtyflags = [True] * len(Datatype) + self.data_states = [Datastate.UNNAMED] * len(Datatype) + self.working_projection = None + self.bounding_box = None + self.bounding_box_polygon = None + self.bounding_box_str = None + self.config_filename = None + self.colour_filename = None + self.verbose_level = verbose_level + self.config = Config() + + @property + @beartype.beartype + def minimum_fault_length(self) -> Union[int,float]: + return self.config.fault_config["minimum_fault_length"] + + @minimum_fault_length.setter + @beartype.beartype + def minimum_fault_length(self, length: float): + self.config.fault_config["minimum_fault_length"] = length + + def set_working_projection(self, projection): + """ + Set the working projection for the map data + + Args: + projection (int or str): + The projection to use for map reprojection + """ + + if issubclass(type(projection), int): + projection = f"EPSG:{str(projection)}" + self.working_projection = projection + elif issubclass(type(projection), str): + self.working_projection = projection + else: + logger.warning( + f"Warning: Unknown projection set {projection}. Leaving all map data in original projection\n" + ) + if self.bounding_box is not None: + self.recreate_bounding_box_str() + logger.info(f"Setting working projection to {self.working_projection}") + + def get_working_projection(self): + """ + Get the working projection + + Returns: + str: The working projection in "EPSG:" form + """ + return self.working_projection + + def set_bounding_box(self, bounding_box): + """ + Set the bounding box of the map data + + Args: + bounding_box (tuple or dict): + The bounding box to use for maps + """ + # Convert tuple bounding_box to dict else assign directly + if issubclass(type(bounding_box), tuple): + self.bounding_box = { + "minx": bounding_box[0], + "maxx": bounding_box[1], + "miny": bounding_box[2], + "maxy": bounding_box[3], + } + if len(bounding_box) == 6: + self.bounding_box["top"] = bounding_box[4] + self.bounding_box["base"] = bounding_box[5] + elif issubclass(type(bounding_box), dict): + self.bounding_box = bounding_box + else: + raise TypeError(f"Invalid type for bounding_box {type(bounding_box)}") + + # Check for map based bounding_box and add depth boundaries + if len(self.bounding_box) == 4: + logger.warning( + "Bounding box does not contain top and base values, setting to 0 and 2000" + ) + self.bounding_box["top"] = 0 + self.bounding_box["base"] = 2000 + + # Check that bounding_box has all the right keys + for i in ["minx", "maxx", "miny", "maxy", "top", "base"]: + if i not in self.bounding_box: + raise KeyError(f"bounding_box dictionary does not contain {i} key") + # Create geodataframe boundary for clipping + minx = self.bounding_box["minx"] + miny = self.bounding_box["miny"] + maxx = self.bounding_box["maxx"] + maxy = self.bounding_box["maxy"] + top = self.bounding_box["top"] + base = self.bounding_box["base"] + logger.info(f'Setting bounding box to {minx}, {miny}, {maxx}, {maxy},{base},{top}') + + lat_point_list = [miny, miny, maxy, maxy, miny] + lon_point_list = [minx, maxx, maxx, minx, minx] + self.bounding_box_polygon = geopandas.GeoDataFrame( + index=[0], + crs=self.working_projection, + geometry=[shapely.geometry.Polygon(zip(lon_point_list, lat_point_list))], + ) + self.recreate_bounding_box_str() + + def recreate_bounding_box_str(self): + """ + Creates the bounding box string from the bounding box dict + """ + minx = self.bounding_box["minx"] + miny = self.bounding_box["miny"] + maxx = self.bounding_box["maxx"] + maxy = self.bounding_box["maxy"] + logger.info( + 'Creating bounding box string from: {minx}, {miny}, {maxx}, {maxy}, {self.working_projection}' + ) + self.bounding_box_str = f"{minx},{miny},{maxx},{maxy},{self.working_projection}" + logger.info(f'Bounding box string is {self.bounding_box_str}') + + @beartype.beartype + def get_bounding_box(self, polygon: bool = False): + """ + Get the bounding box in dict or polygon form + + Args: + polygon (bool, optional): Flag to get the bounding box in polygon form. Defaults to False. + + Returns: + dict or shapely.geometry.Polygon: The bounding box in the requested form + """ + if polygon: + return self.bounding_box_polygon + else: + return self.bounding_box + + @beartype.beartype + def set_filename(self, datatype: Datatype, filename: str): + """ + Set the filename for a specific datatype + + Args: + datatype (Datatype): + The datatype for the filename specified + filename (str): + The filename to store + """ + logger.info(f"Setting filename for {datatype} to {filename}") + if self.filenames[datatype] != filename: + self.filenames[datatype] = filename + self.data_states[datatype] = Datastate.UNLOADED + if filename == "": + self.dirtyflags[datatype] = False + else: + self.dirtyflags[datatype] = True + + @beartype.beartype + def get_filename(self, datatype: Datatype): + """ + Get a filename of a specified datatype + + Args: + datatype (Datatype): + The datatype of the filename wanted + + Returns: + string: The filename of the datatype specified + """ + if self.data_states != Datastate.UNNAMED: + return self.filenames[datatype] + else: + logger.warning(f"Requested filename for {str(type(datatype))} is not set\n") + return None + + @beartype.beartype + def set_config_filename( + self, filename: Union[pathlib.Path, str], lower: bool = False + ): + """ + Set the config filename and update the config structure + + Args: + filename (str): + The filename of the config file + lower (bool, optional): + Flag to convert the config file to lowercase. Defaults to False. + """ + logger.info('Setting config filename to {filename}') + + self.config.update_from_file(filename, lower=lower) + + logger.info(f"Config is: {self.config.to_dict()}") + + def get_config_filename(self): + """ + Get the config filename + + Returns: + str: The config filename + """ + return self.config_filename + + @beartype.beartype + def set_colour_filename(self, filename: Union[pathlib.Path, str]): + """ + Set the filename of the colour csv file + + Args: + filename (str): + The csv colour look up table filename + """ + logger.info(f'Colour filename is: {filename}') + self.colour_filename = filename + + def get_colour_filename(self): + """ + Get the colour lookup table filename + + Returns: + str: The colour lookup table filename + """ + return self.colour_filename + + @beartype.beartype + def set_ignore_lithology_codes(self, codes: list): + """ + Set the lithology codes (names) to be ignored in the geology shapefile. + + This method updates the `ignore_lithology_codes` entry in the geology configuration + and marks the geology data as "clipped" to indicate that certain lithologies have been + excluded. Additionally, it sets a dirty flag for the geology data to signal that it + requires reprocessing. + + Args: + codes (list): + A list of lithology names to ignore in the geology shapefile. These + entries will be excluded from further processing. + """ + self.config.geology_config["ignore_lithology_codes"] = codes + self.data_states[Datatype.GEOLOGY] = Datastate.CLIPPED + self.dirtyflags[Datatype.GEOLOGY] = True + + @beartype.beartype + def get_ignore_lithology_codes(self) -> list: + """ + Retrieve the list of lithology names to be ignored in the geology shapefile. + + This method fetches the current list of lithology names or codes from the geology + configuration that have been marked for exclusion during processing. + + Returns: + list: A list of lithology names currently set to be ignored in the + geology shapefile. + """ + return self.config.geology_config["ignore_lithology_codes"] + + @beartype.beartype + def set_ignore_fault_codes(self, codes: list): + """ + Set the list of fault codes to be ignored during processing. + + This method updates the `ignore_fault_codes` entry in the fault configuration and + marks the fault data as "clipped" to indicate that it has been filtered. Additionally, + it sets a dirty flag for the fault data to signal that it requires reprocessing. + + Args: + codes (list): A list of fault codes to ignore during further processing. + """ + self.config.fault_config["ignore_fault_codes"] = codes + self.data_states[Datatype.FAULT] = Datastate.CLIPPED + self.dirtyflags[Datatype.FAULT] = True + + @beartype.beartype + def get_ignore_fault_codes(self) -> list: + """ + Retrieve the list of fault codes that are set to be ignored. + + This method fetches the current list of fault codes from the fault configuration + that have been marked for exclusion during processing. + + Returns: + list: A list of fault codes that are currently marked for exclusion. + """ + return self.config.fault_config["ignore_fault_codes"] + + @beartype.beartype + def set_filenames_from_australian_state(self, state: str): + """ + Set the shape/dtm filenames appropriate to the Australian state + + Args: + state (str): + The abbreviated Australian state name + + Raises: + ValueError: state string not in state list ['WA', 'SA', 'QLD', 'NSW', 'TAS', 'VIC', 'ACT', 'NT'] + """ + logger.info(f"Setting filenames for Australian state {state}") + if state in ["WA", "SA", "QLD", "NSW", "TAS", "VIC", "ACT", "NT"]: + self.set_filename(Datatype.GEOLOGY, AustraliaStateUrls.aus_geology_urls[state]) + self.set_filename(Datatype.STRUCTURE, AustraliaStateUrls.aus_structure_urls[state]) + self.set_filename(Datatype.FAULT, AustraliaStateUrls.aus_fault_urls[state]) + self.set_filename(Datatype.FOLD, AustraliaStateUrls.aus_fold_urls[state]) + self.set_filename(Datatype.DTM, "hawaii") + lower = state == "SA" + + # Check if this is running a documentation test and use local datasets if so + if os.environ.get("DOCUMENTATION_TEST", False): + import map2loop + + # because doc tests runs on docker from within the m2l folder + module_path = map2loop.__file__.replace("__init__.py", "") + + config_path_str = '_datasets/config_files/{}.json'.format(state) + self.set_config_filename(pathlib.Path(module_path) / pathlib.Path(config_path_str)) + + colour_file_str = '_datasets/clut_files/{}_clut.csv'.format(state) + self.set_colour_filename(pathlib.Path(module_path) / pathlib.Path(colour_file_str)) + + else: + self.set_config_filename( + AustraliaStateUrls.aus_config_urls[state], lower=lower + ) + self.set_colour_filename(AustraliaStateUrls.aus_clut_urls[state]) + else: + raise ValueError(f"Australian state {state} not in state url database") + + @beartype.beartype + def check_filename(self, datatype: Datatype) -> bool: + """ + Check the filename for datatype is set + + Args: + datatype (Datatype): + The datatype of the filename to check + + Returns: + bool: true if the filename is set, false otherwise + """ + if self.filenames[datatype] is None or self.filenames[datatype] == "": + logger.warning(f"Warning: Filename for {str(datatype)} is not set") + return False + return True + + def check_filenames(self) -> bool: + """ + Check all filenames to see if they are valid + + Returns: + bool: true if the filenames are set, false otherwise + """ + ret: bool = True + for datatype in Datatype: + ret = ret and self.check_filename(datatype) + return ret + + @beartype.beartype + def load_all_map_data(self): + """ + Load all the map data for each datatype. Cycles through each type and loads it + """ + logger.info('Loading all map data') + for i in [ + Datatype.GEOLOGY, + Datatype.STRUCTURE, + Datatype.FAULT, + Datatype.FOLD, + Datatype.FAULT_ORIENTATION, + ]: + logger.info(f'Loading map data for {i}') + self.load_map_data(i) + self.load_raster_map_data(Datatype.DTM) + + @beartype.beartype + def load_map_data(self, datatype: Datatype): + """ + Load map data from file, reproject and clip it and then check data is valid + + Args: + datatype (Datatype): + The datatype to load + """ + if self.filenames[datatype] is None or self.data_states[datatype] == Datastate.UNNAMED: + logger.warning(f"Datatype {datatype.name} is not set and so cannot be loaded\n") + self.data[datatype] = self.get_empty_dataframe(datatype) + self.dirtyflags[datatype] = False + self.data_states[datatype] = Datastate.COMPLETE + elif self.dirtyflags[datatype] is True: + if self.data_states[datatype] == Datastate.UNLOADED: + # Load data from file + try: + map_filename = self.filenames[datatype] + map_filename = self.update_filename_with_bounding_box(map_filename) + map_filename = self.update_filename_with_projection(map_filename) + self.raw_data[datatype] = geopandas.read_file(map_filename) + self.data_states[datatype] = Datastate.LOADED + except Exception: + logger.error( + f"Failed to open {datatype.name} file called '{self.filenames[datatype]}'\n" + ) + logger.error(f"Cannot continue as {datatype.name} was not loaded\n") + return + if self.data_states[datatype] == Datastate.LOADED: + # Reproject geopanda to required CRS + self.set_working_projection_on_map_data(datatype) + self.data_states[datatype] = Datastate.REPROJECTED + if self.data_states[datatype] == Datastate.REPROJECTED: + # Clip geopanda to bounding polygon + self.raw_data[datatype] = geopandas.clip( + self.raw_data[datatype], self.bounding_box_polygon + ) + self.data_states[datatype] = Datastate.CLIPPED + if self.data_states[datatype] == Datastate.CLIPPED: + # Convert column names using codes_and_labels dictionary + self.check_map(datatype) + self.data_states[datatype] = Datastate.COMPLETE + self.dirtyflags[datatype] = False + + @beartype.beartype + def get_empty_dataframe(self, datatype: Datatype): + """ + Create a basic empty geodataframe for a specified datatype + + Args: + datatype (Datatype): + The datatype of the empty dataset + + Returns: + geopandas.GeoDataFrame or None: The created geodataframe + """ + data = None + if datatype == Datatype.FAULT: + data = geopandas.GeoDataFrame( + columns=["geometry", "ID", "NAME", "DIPDIR", "DIP"], crs=self.working_projection + ) + elif datatype == Datatype.FOLD: + data = geopandas.GeoDataFrame( + columns=["geometry", "ID", "NAME", "SYNCLINE"], crs=self.working_projection + ) + return data + + @beartype.beartype + def open_http_query(url: str): + """ + Attempt to open the http url and unzip the file if required + Note: This is specific to opening remotely hosted dtm data in geotiff format + + Args: + url (str): + The url to open + + Returns: + _type_: The geotiff file + """ + logger.info(f"Opening http query to {url}") + try: + request = urllib.Request(url, headers={"Accept-Encoding": "gzip"}) + response = urllib.request.urlopen(request, timeout=30) + if response.info().get("Content-Encoding") == "gzip": + return GzipFile(fileobj=BytesIO(response.read())) + else: + return response + except urllib.URLError: + return None + + @beartype.beartype + def __retrieve_tif(self, filename: str): + """ + Load geoTIFF files from Geoscience Australia or NOAA hawaii or https sources + + Args: + filename (str): + The filename or url or "au"/"hawaii" source to load from + + Returns: + _type_: The open geotiff in a gdal handler + """ + + # For gdal debugging use exceptions + gdal.UseExceptions() + bb_ll = tuple( + float(coord) + for coord in self.bounding_box_polygon.to_crs("EPSG:4326").geometry.total_bounds + ) + + if filename.lower() == "aus" or filename.lower() == "au": + logger.info('Using Geoscience Australia DEM') + url = "https://services.ga.gov.au/gis/services/Bathymetry_Topography/MapServer/WCSServer?" + wcs = WebCoverageService(url, version="1.0.0") + + coverage = wcs.getCoverage( + identifier="1", bbox=bb_ll, format="GeoTIFF", crs=4326, width=2048, height=2048 + ) + + # This is stupid that gdal cannot read a byte stream and has to have a + # file on the local system to open or otherwise create a gdal file + # from scratch with Create + import pathlib + + tmp_file = pathlib.Path(tempfile.mkdtemp()) / pathlib.Path("temp.tif") + + with open(tmp_file, "wb") as fh: + fh.write(coverage.read()) + + tif = gdal.Open(str(tmp_file)) + + elif filename == "hawaii": + logger.info('Using Hawaii DEM') + import netCDF4 + + bbox_str = ( + f"[({str(bb_ll[1])}):1:({str(bb_ll[3])})][({str(bb_ll[0])}):1:({str(bb_ll[2])})]" + ) + + filename = f"https://pae-paha.pacioos.hawaii.edu/erddap/griddap/srtm30plus_v11_land.nc?elev{bbox_str}" + try: + f = urllib.request.urlopen(filename) + except urllib.error.URLError: + logger.error(f"Failed to open remote file {filename}") + return None + ds = netCDF4.Dataset("in-mem-file", mode="r", memory=f.read()) + spatial = [ + ds.geospatial_lon_min, + ds.geospatial_lon_resolution, + 0, + ds.geospatial_lat_min, + 0, + ds.geospatial_lat_resolution, + ] + srs = osr.SpatialReference() + srs.ImportFromEPSG(4326) + driver = gdal.GetDriverByName("GTiff") + tif = driver.Create( + f"/vsimem/{str(uuid4())}", + xsize=ds.dimensions["longitude"].size, + ysize=ds.dimensions["latitude"].size, + bands=1, + eType=gdal.GDT_Float32, + ) + tif.SetGeoTransform(spatial) + tif.SetProjection(srs.ExportToWkt()) + tif.GetRasterBand(1).WriteArray(numpy.flipud(ds.variables["elev"][:][:])) + elif filename.startswith("http"): + logger.info(f'Opening remote file {filename}') + try: + image_data = self.open_http_query(filename) + except urllib.error.URLError: + logger.error(f"Failed to open remote file {filename}") + return None + if image_data is None: + return None + mmap_name = f"/vsimem/{str(uuid4())}" + gdal.FileFromMemBuffer(mmap_name, image_data.read()) + tif = gdal.Open(mmap_name) + else: + logger.info(f'Opening local file {filename}') + tif = gdal.Open(str(filename), gdal.GA_ReadOnly) + return tif + + @beartype.beartype + def load_raster_map_data(self, datatype: Datatype): + """ + Load raster map data from file, reproject and clip it and then check data is valid + + Args: + datatype (Datatype): + The raster datatype to load + """ + if self.filenames[datatype] is None or self.data_states[datatype] == Datastate.UNNAMED: + logger.warning(f"Datatype {datatype.name} is not set and so cannot be loaded\n") + elif self.dirtyflags[datatype] is True: + if self.data_states[datatype] == Datastate.UNLOADED: + # Load data from file + self.data[datatype] = self.__retrieve_tif(self.filenames[datatype]) + if self.data[datatype] is None: + logger.error(f"Failed to load raster data for {datatype.name}") + return + self.data_states[datatype] = Datastate.LOADED + if self.data_states[datatype] == Datastate.LOADED: + # Reproject raster to required CRS + try: + self.data[datatype] = gdal.Warp( + "", + self.data[datatype], + srcSRS=self.data[datatype].GetProjection(), + dstSRS=self.working_projection, + format="VRT", + outputType=gdal.GDT_Float32, + ) + except Exception: + logger.error(f"Warp failed for {datatype.name}\n") + return + self.data_states[datatype] = Datastate.REPROJECTED + if self.data_states[datatype] == Datastate.REPROJECTED: + # Clip raster image to bounding polygon + bounds = [ + self.bounding_box["minx"], + self.bounding_box["maxy"], + self.bounding_box["maxx"], + self.bounding_box["miny"], + ] + if self.data[datatype] is None: + logger.error(f"No raster data available for {datatype.name}") + return + self.data[datatype] = gdal.Translate( + "", + self.data[datatype], + format="VRT", + outputType=gdal.GDT_Float32, + outputSRS=self.working_projection, + projWin=bounds, + projWinSRS=self.working_projection, + ) + self.data_states[datatype] = Datastate.COMPLETE + self.dirtyflags[datatype] = False + + @beartype.beartype + def check_map(self, datatype: Datatype): + """ + Check the validity of a map data from file + + Args: + datatype (Datatype): + The datatype to check + """ + func = None + #check and parse geology data + if datatype == Datatype.GEOLOGY: + validity_check, message = check_geology_fields_validity(mapdata = self) + if validity_check: + logger.error(f"Datatype GEOLOGY - data validation failed: {message}") + raise ValueError(f"Datatype GEOLOGY - data validation failed: {message}") + func = self.parse_geology_map + + #check and parse structure data + elif datatype == Datatype.STRUCTURE: + validity_check, message = check_structure_fields_validity(mapdata = self) + if validity_check: + logger.error(f"Datatype STRUCTURE - data validation failed: {message}") + raise ValueError(f"Datatype STRUCTURE - data validation failed: {message}") + func = self.parse_structure_map + + #check and parse fault data + elif datatype == Datatype.FAULT: + validity_check, message = check_fault_fields_validity(mapdata = self) + if validity_check: + raise ValueError(f"Datatype FAULT - data validation failed: {message}") + func = self.parse_fault_map + + elif datatype == Datatype.FAULT_ORIENTATION: + func = self.parse_fault_orientations + + #check and parse fold data + elif datatype == Datatype.FOLD: + validity_check, message = check_fold_fields_validity(mapdata = self) + if validity_check: + logger.error(f"Datatype FOLD - data validation failed: {message}") + raise ValueError(f"Datatype FOLD - data validation failed: {message}") + func = self.parse_fold_map + + if func: + error, message = func() + if error: + logger.error(message) + + @beartype.beartype + def parse_fault_orientations(self) -> tuple: + """ + Parse the fault orientations shapefile data into a consistent format + + Returns: + tuple: A tuple of (bool: success/fail, str: failure message) + """ + # Check type and size of loaded structure map + if ( + self.raw_data[Datatype.FAULT_ORIENTATION] is None + or type(self.raw_data[Datatype.FAULT_ORIENTATION]) is not geopandas.GeoDataFrame + ): + logger.warning("Fault orientation shapefile is not loaded or valid") + return (True, "Fault orientation shapefile is not loaded or valid") + + # Create new geodataframe + fault_orientations = geopandas.GeoDataFrame( + self.raw_data[Datatype.FAULT_ORIENTATION]["geometry"] + ) + + config = self.config.fault_config + + # Parse dip direction and dip columns + if config["dipdir_column"] in self.raw_data[Datatype.FAULT_ORIENTATION]: + if config["orientation_type"] == "strike": + fault_orientations["DIPDIR"] = self.raw_data[Datatype.FAULT_ORIENTATION].apply( + lambda row: (row[config["dipdir_column"]] + 90.0) % 360.0, axis=1 + ) + else: + fault_orientations["DIPDIR"] = self.raw_data[Datatype.FAULT_ORIENTATION][ + config["dipdir_column"] + ] + else: + print( + f"Fault orientation shapefile does not contain dipdir_column '{config['dipdir_column']}'" + ) + + if config["dip_column"] in self.raw_data[Datatype.FAULT_ORIENTATION]: + fault_orientations["DIP"] = self.raw_data[Datatype.FAULT_ORIENTATION][ + config["dip_column"] + ] + else: + print( + f"Fault orientation shapefile does not contain dip_column '{config['dip_column']}'" + ) + + # TODO LG would it be worthwhile adding a description column for faults? + # it would be possible to parse out the fault displacement, type, slip direction + # if this was stored in the descriptions? + + # Add object id + if config["objectid_column"] in self.raw_data[Datatype.FAULT_ORIENTATION]: + fault_orientations["ID"] = self.raw_data[Datatype.FAULT_ORIENTATION][ + config["objectid_column"] + ] + else: + fault_orientations["ID"] = numpy.arange(len(fault_orientations)) + self.data[Datatype.FAULT_ORIENTATION] = fault_orientations + + if config["featureid_column"] in self.raw_data[Datatype.FAULT_ORIENTATION]: + fault_orientations["featureId"] = self.raw_data[Datatype.FAULT_ORIENTATION][ + config["featureid_column"] + ] + else: + fault_orientations["featureId"] = numpy.arange(len(fault_orientations)) + + return (False, "") + + + + @beartype.beartype + def parse_geology_map(self) -> tuple: + """ + Parse the geology shapefile data into a consistent format + + Returns: + tuple: A tuple of (bool: success/fail, str: failure message) + """ + + # Create new geodataframe + geology = geopandas.GeoDataFrame(self.raw_data[Datatype.GEOLOGY]["geometry"]) + config = self.config.geology_config + + # Parse unit names and codes + if config["unitname_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["UNITNAME"] = self.raw_data[Datatype.GEOLOGY][config["unitname_column"]].astype( + str + ) + + if config["alt_unitname_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["CODE"] = self.raw_data[Datatype.GEOLOGY][config["alt_unitname_column"]].astype( + str + ) + + # Parse group and supergroup columns + if config["group_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["GROUP"] = self.raw_data[Datatype.GEOLOGY][config["group_column"]].astype(str) + else: + geology["GROUP"] = "" + if config["supergroup_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["SUPERGROUP"] = self.raw_data[Datatype.GEOLOGY][ + config["supergroup_column"] + ].astype(str) + else: + geology["SUPERGROUP"] = "" + + # Parse description and rocktype columns for sill and intrusive flags + if config["description_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["SILL"] = ( + self.raw_data[Datatype.GEOLOGY][config["description_column"]] + .astype(str) + .str.contains(config["sill_text"]) + ) + geology["DESCRIPTION"] = self.raw_data[Datatype.GEOLOGY][ + config["description_column"] + ].astype(str) + else: + geology["SILL"] = False + geology["DESCRIPTION"] = "" + + if config["rocktype_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["INTRUSIVE"] = ( + self.raw_data[Datatype.GEOLOGY][config["rocktype_column"]] + .astype(str) + .str.contains(config["intrusive_text"]) + ) + geology["ROCKTYPE1"] = self.raw_data[Datatype.GEOLOGY][ + config["rocktype_column"] + ].astype(str) + else: + geology["INTRUSIVE"] = False + geology["ROCKTYPE1"] = "" + + if config["alt_rocktype_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["ROCKTYPE2"] = self.raw_data[Datatype.GEOLOGY][ + config["alt_rocktype_column"] + ].astype(str) + else: + geology["ROCKTYPE2"] = "" + + # TODO: Explode intrusion multipart geology + + # Parse age columns + if config["minage_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["MIN_AGE"] = self.raw_data[Datatype.GEOLOGY][config["minage_column"]].astype( + numpy.float64 + ) + else: + geology["MIN_AGE"] = 0.0 + if config["maxage_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["MAX_AGE"] = self.raw_data[Datatype.GEOLOGY][config["maxage_column"]].astype( + numpy.float64 + ) + else: + geology["MAX_AGE"] = 100000.0 + + # Add object id + if config["objectid_column"] in self.raw_data[Datatype.GEOLOGY]: + geology["ID"] = self.raw_data[Datatype.GEOLOGY][config["objectid_column"]] + else: + geology["ID"] = numpy.arange(len(geology)) + + # TODO: Check that the exploded geology has more than 1 unit + # Do we need to explode the geometry at this stage for geology/faults/folds??? + # If not subsequent classes will need to be able to deal with them + # Strip out whitespace (/n /t) and '-', ',', '?' from "UNITNAME", "CODE" "GROUP" "SUPERGROUP" + geology["UNITNAME"] = geology["UNITNAME"].str.replace("[ -/?]", "_", regex=True) + geology["CODE"] = geology["CODE"].str.replace("[ -/?]", "_", regex=True) + geology["GROUP"] = geology["GROUP"].str.replace("[ -/?]", "_", regex=True) + geology["SUPERGROUP"] = geology["SUPERGROUP"].str.replace("[ -/?]", "_", regex=True) + + # Mask out ignored unit_names/codes (ie. for cover) + for code in self.config.geology_config["ignore_lithology_codes"]: + geology = geology[~geology["CODE"].astype(str).str.contains(code)] + geology = geology[~geology["UNITNAME"].astype(str).str.contains(code)] + + geology = geology.dissolve(by="UNITNAME", as_index=False) + + # Note: alt_rocktype_column and volcanic_text columns not used + self.data[Datatype.GEOLOGY] = geology + return (False, "") + + @beartype.beartype + def parse_structure_map(self) -> tuple: + """ + Parse the structure shapefile data into a consistent format + + Returns: + tuple: A tuple of (bool: success/fail, str: failure message) + """ + + # Create new geodataframe + structure = geopandas.GeoDataFrame(self.raw_data[Datatype.STRUCTURE]["geometry"]) + config = self.config.structure_config + + # Parse dip direction and dip columns + if config["dipdir_column"] in self.raw_data[Datatype.STRUCTURE]: + if config["orientation_type"] == "strike": + structure["DIPDIR"] = self.raw_data[Datatype.STRUCTURE].apply( + lambda row: (row[config["dipdir_column"]] + 90.0) % 360.0, axis=1 + ) + else: + structure["DIPDIR"] = self.raw_data[Datatype.STRUCTURE][config["dipdir_column"]] + + # Ensure all DIPDIR values are within [0, 360] + structure["DIPDIR"] = structure["DIPDIR"] % 360.0 + + if config["dip_column"] in self.raw_data[Datatype.STRUCTURE]: + structure["DIP"] = self.raw_data[Datatype.STRUCTURE][config["dip_column"]] + + + # Add bedding and overturned booleans + if config["overturned_column"] in self.raw_data[Datatype.STRUCTURE]: + structure["OVERTURNED"] = ( + self.raw_data[Datatype.STRUCTURE][config["overturned_column"]] + .astype(str) + .str.contains(config["overturned_text"]) + ) + else: + structure["OVERTURNED"] = False + + if config["description_column"] in self.raw_data[Datatype.STRUCTURE]: + structure["BEDDING"] = ( + self.raw_data[Datatype.STRUCTURE][config["description_column"]] + .astype(str) + .str.contains(config["bedding_text"]) + ) + else: + structure["BEDDING"] = False + + # Add object id + if config["objectid_column"] in self.raw_data[Datatype.STRUCTURE]: + structure["ID"] = self.raw_data[Datatype.STRUCTURE][config["objectid_column"]] + else: + structure["ID"] = numpy.arange(len(structure)) + + self.data[Datatype.STRUCTURE] = structure + return (False, "") + + + @beartype.beartype + def parse_fault_map(self) -> tuple: + """ + Parse the fault shapefile data into a consistent format. + + Returns: + tuple: A tuple of (bool: success/fail, str: failure message) + """ + # Create a new geodataframe + faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) + + # Get fault configuration + config = self.config.fault_config + + # update minimum fault length either with the value from the config or calculate it + if self.minimum_fault_length < 0: + logger.info("Calculating minimum fault length") + self.minimum_fault_length = calculate_minimum_fault_length( + bbox=self.bounding_box, area_percentage=0.05 + ) + logger.info(f"Calculated minimum fault length - {self.minimum_fault_length}") + + # crop + faults = faults.loc[faults.geometry.length >= self.minimum_fault_length] + + if config["structtype_column"] in self.raw_data[Datatype.FAULT]: + faults["FEATURE"] = self.raw_data[Datatype.FAULT][config["structtype_column"]] + # Check if the string contains commas indicating multiple substrings + if ',' in config["fault_text"]: + import re + fault_text = config["fault_text"].split(',') + search_terms = [term.strip().strip("'").strip('"') for term in fault_text] + escaped_terms = [re.escape(term) for term in search_terms] + # Combine the escaped terms using the pipe '|' symbol for alternation + fault_text_pattern = '|'.join(escaped_terms) + faults = faults[faults["FEATURE"].astype(str).str.contains(fault_text_pattern, case=False, regex=True, na=False)] + if self.verbose_level > VerboseLevel.NONE: + if len(faults) < len(self.raw_data[Datatype.GEOLOGY]) and len(faults) == 0: + msg = f"Fault map reduced to 0 faults as structtype_column ({config['structtype_column']}) does not contains as row with fault_text \"{config['fault_text']}\"" + print(msg) + logger.warning(msg) + + if config["name_column"] in self.raw_data[Datatype.FAULT]: + faults["NAME"] = self.raw_data[Datatype.FAULT][config["name_column"]].astype(str) + else: + faults["NAME"] = "Fault_" + faults.index.astype(str) + + # crop by the ignore fault codes + ignore_codes = config["ignore_fault_codes"] + + # Find the intersection of ignore_codes and the 'NAME' column values + existing_codes = set(ignore_codes).intersection(set(faults["NAME"].values)) + + # Find the codes that do not exist in the DataFrame + non_existing_codes = set(ignore_codes) - existing_codes + + # Issue a warning if there are any non-existing codes + if non_existing_codes: + logger.info(f"Warning: {non_existing_codes} set to fault ignore codes are not in the provided data. Skipping") + + # Filter the DataFrame to remove rows where 'NAME' is in the existing_codes + if existing_codes: + faults = faults[~faults["NAME"].isin(existing_codes)] + logger.info(f"The following faults were found and removed as per the config: {existing_codes}") + else: + logger.info("None of the fault ignore codes exist in the original fault data.") + pass + + + # parse dip column + if config["dip_column"] in self.raw_data[Datatype.FAULT]: + faults["DIP"] = self.raw_data[Datatype.FAULT][config["dip_column"]].astype( + numpy.float64 + ) + else: + faults["DIP"] = numpy.nan # config["dip_null_value"] + + # Replace dip 0 with nan as dip 0 means unknown + faults["DIP"] = [numpy.nan if dip == 0 else dip for dip in faults["DIP"]] + + # Parse the dip direction for the fault + if config["dipdir_flag"] != "alpha": + if config["dipdir_column"] in self.raw_data[Datatype.FAULT]: + faults["DIPDIR"] = self.raw_data[Datatype.FAULT][config["dipdir_column"]].astype( + numpy.float64 + ) + else: + faults["DIPDIR"] = numpy.nan + else: + # Take the geoDataSeries of the dipdir estimates (assume it's a string description) + if config["dip_estimate_column"] in self.raw_data[Datatype.FAULT]: + dipdir_text_estimates = self.raw_data[Datatype.FAULT][ + config["dip_estimate_column"] + ].astype(str) + elif config["dipdir_column"] in self.raw_data[Datatype.FAULT]: + dipdir_text_estimates = self.raw_data[Datatype.FAULT][ + config["dipdir_column"] + ].astype(str) + else: + dipdir_text_estimates = None + faults["DIPDIR"] = numpy.nan + + # Map dipdir_estimates in text form to cardinal direction + if dipdir_text_estimates: + direction_map = { + "north_east": 45.0, + "south_east": 135.0, + "south_west": 225.0, + "north_west": 315.0, + "north": 0.0, + "east": 90.0, + "south": 180.0, + "west": 270.0, + } + for direction in direction_map: + dipdir_text_estimates = dipdir_text_estimates.astype(str).str.replace( + f".*{direction}.*", direction_map[direction], regex=True + ) + # Catch all for any field that still contains anything that isn't a number + dipdir_text_estimates = dipdir_text_estimates.astype(str).str.replace( + ".*[^0-9.].*", numpy.nan, regex=True + ) + faults["DIPDIR"] = dipdir_text_estimates.astype(numpy.float64) + + # Add object id + if config["objectid_column"] in self.raw_data[Datatype.FAULT]: + faults["ID"] = self.raw_data[Datatype.FAULT][config["objectid_column"]].astype(int) + else: + faults["ID"] = faults.index + + if len(faults): + faults["NAME"] = faults.apply( + lambda fault: ( + "Fault_" + str(fault["ID"]) if fault["NAME"].lower() == "nan" else fault["NAME"] + ), + axis=1, + ) + faults["NAME"] = faults.apply( + lambda fault: ( + "Fault_" + str(fault["ID"]) + if fault["NAME"].lower() == "none" + else fault["NAME"] + ), + axis=1, + ) + faults["NAME"] = faults["NAME"].str.replace(" -/?", "_", regex=True) + self.data[Datatype.FAULT] = faults + + return (False, "") + + + + + @beartype.beartype + def parse_fold_map(self) -> tuple: + """ + Parse the fold shapefile data into a consistent format + + Returns: + tuple: A tuple of (bool: success/fail, str: failure message) + """ + + # Create new geodataframe + folds = geopandas.GeoDataFrame(self.raw_data[Datatype.FOLD]["geometry"]) + config = self.config.fold_config + + if config["structtype_column"] in self.raw_data[Datatype.FOLD]: + folds[config["structtype_column"]] = self.raw_data[Datatype.FOLD][ + config["structtype_column"] + ] + if ',' in config["fold_text"]: + import re + fold_text = config["fold_text"].split(',') + search_terms = [term.strip().strip("'").strip('"') for term in fold_text] + escaped_terms = [re.escape(term) for term in search_terms] + # Combine the escaped terms using the pipe '|' symbol for alternation + fold_text_pattern = '|'.join(escaped_terms) + folds = folds[ + folds[config["structtype_column"]].astype(str).str.contains(fold_text_pattern, case=False, regex=True, na=False) + ] + if self.verbose_level > VerboseLevel.NONE: + if len(folds) < len(self.raw_data[Datatype.GEOLOGY]) and len(folds) == 0: + msg = f"Fold map reduced to 0 folds as structtype_column ({config['structtype_column']}) does not contains any row with fold_text \"{config['fold_text']}\"" + logger.warning(msg) + print(msg) + + if config["foldname_column"] in self.raw_data[Datatype.FOLD]: + folds["NAME"] = self.raw_data[Datatype.FOLD][config["foldname_column"]].astype(str) + else: + folds["NAME"] = numpy.arange(len(folds)) + folds["NAME"] = "Fold_" + folds["NAME"].astype(str) + + # Extract syncline from description field + if config["description_column"] in self.raw_data[Datatype.FOLD]: + folds["SYNCLINE"] = ( + self.raw_data[Datatype.FOLD][config["description_column"]] + .astype(str) + .str.contains(config["synform_text"]) + ) + else: + folds["SYNCLINE"] = False + + # Add object id + if config["objectid_column"] in self.raw_data[Datatype.FOLD]: + folds["ID"] = self.raw_data[Datatype.FOLD][config["objectid_column"]] + else: + folds["ID"] = numpy.arange(len(folds)) + + self.data[Datatype.FOLD] = folds + return (False, "") + + @beartype.beartype + def set_working_projection_on_map_data(self, datatype: Datatype): + """ + Set the working projection on the GeoDataFrame structure or if already set reproject the data + + Args: + datatype (Datatype): + The datatype to set or reproject + """ + if self.working_projection is None: + print("No working projection set leaving map data in original projection") + elif type(self.raw_data[datatype]) is geopandas.GeoDataFrame: + if self.data_states[datatype] >= Datastate.LOADED: + if self.raw_data[datatype].crs is None: + logger.info( + f"No projection on original map data, assigning to working_projection {self.working_projection}" + ) + self.raw_data[datatype].crs = self.working_projection + else: + self.raw_data[datatype].to_crs(crs=self.working_projection, inplace=True) + else: + logger.warning( + f"Type of {datatype.name} map not a GeoDataFrame so cannot change map crs projection" + ) + + @beartype.beartype + def save_all_map_data(self, output_dir: pathlib.Path, extension: str = ".csv"): + """ + Save all the map data to file + + Args: + output_dir (str): + The directory to save to + extension (str, optional): + The extension to use for the data. Defaults to ".csv". + """ + for i in [Datatype.GEOLOGY, Datatype.STRUCTURE, Datatype.FAULT, Datatype.FOLD]: + self.save_raw_map_data(output_dir, i, extension) + + @beartype.beartype + def save_raw_map_data( + self, output_dir: pathlib.Path, datatype: Datatype, extension: str = ".shp.zip" + ): + """ + Save the map data from datatype to file + + Args: + output_dir (pathlib.Path): + The directory to save to + datatype (Datatype): + The datatype of the geopanda to save + extension (str, optional): + The extension to use for the data. Defaults to ".csv". + """ + try: + filename = pathlib.Path(output_dir) / f"{datatype.name}{extension}" + raw_data = self.raw_data[datatype] + + if raw_data is None: + logger.info(f"No data available for {datatype.name}. Skipping saving to file {filename}.") + return + + if extension == ".csv": + raw_data.to_csv(filename, index=False) # Save as CSV + else: + self.raw_data[datatype].to_file(filename) + + except Exception as e: + logger.error(f"Failed to save {datatype.name} to file named {filename}\nError: {str(e)}") + print(f"Failed to save {datatype.name} to file named {filename}\nError: {str(e)}") + + @beartype.beartype + def get_raw_map_data(self, datatype: Datatype): + """ + Get the raw data geopanda of the specified datatype + + Args: + datatype (Datatype): + The datatype to retrieve + + Returns: + geopandas.GeoDataFrame: The raw data + """ + if self.data_states[datatype] != Datastate.COMPLETE or self.dirtyflags[datatype] is True: + self.load_map_data(datatype) + return self.raw_data[datatype] + + @beartype.beartype + def get_map_data(self, datatype: Datatype): + """ + Get the data geopanda of the specified datatype + + Args: + datatype (Datatype): + The datatype to retrieve + + Returns: + geopandas.GeoDataFrame: The dataframe + """ + if self.data_states[datatype] != Datastate.COMPLETE or self.dirtyflags[datatype] is True: + self.load_map_data(datatype) + return self.data[datatype] + + @beartype.beartype + def update_filename_with_bounding_box(self, filename: str): + """ + Update the filename/url with the bounding box + This replace all instances of {BBOX_STR} with the bounding_box_str + + Args: + filename (str): + The original filename + + Raises: + ValueError: Filename is blank + + Returns: + str: The modified filename + """ + if filename is None: + logger.error(f"Filename {filename} is invalid") + raise ValueError(f"Filename {filename} is invalid") + return filename.replace("{BBOX_STR}", self.bounding_box_str) + + @beartype.beartype + def update_filename_with_projection(self, filename: str): + """ + Update the filename/url with the projection + This replace all instances of {PROJ_STR} with the projection string + + Args: + filename (str): + The original filename + + Raises: + ValueError: Filename is blank + + Returns: + str: The modified filename + """ + if filename is None: + logger.error(f"Filename {filename} is invalid") + raise ValueError(f"Filename {filename} is invalid") + return filename.replace("{PROJ_STR}", self.working_projection) + + def calculate_bounding_box_and_projection(self): + """ + Calculate the bounding box and projection from the geology file + + Returns: + dict, str: The bounding box and projection of the geology shapefile + """ + if self.filenames[Datatype.GEOLOGY] is None: + logger.info( + "Could not open geology file as none set, no bounding box or projection available" + ) + return None, None + temp_geology_filename = self.filenames[Datatype.GEOLOGY] + temp_geology_filename = temp_geology_filename.replace("{BBOX_STR}", "") + temp_geology_filename = temp_geology_filename.replace("{PROJ_STR}", "") + try: + geology_data = geopandas.read_file(temp_geology_filename) + bounds = geology_data.total_bounds + return { + "minx": bounds[0], + "maxx": bounds[1], + "miny": bounds[2], + "maxy": bounds[3], + }, geology_data.crs + except Exception: + logger.error( + f"Could not open geology file {temp_geology_filename} so no bounding box or projection found" + ) + return None, None + + @beartype.beartype + def export_wkt_format_files(self): + """ + Save out the geology and fault GeoDataFrames in WKT format + This is used by map2model + """ + # TODO: - Move away from tab seperators entirely (topology and map2model) + + self.map2model_tmp_path = pathlib.Path(tempfile.mkdtemp()) + + # Check geology data status and export to a WKT format file + self.load_map_data(Datatype.GEOLOGY) + if type(self.data[Datatype.GEOLOGY]) is not geopandas.GeoDataFrame: + logger.warning("Cannot export geology data as it is not a GeoDataFrame") + elif self.data_states[Datatype.GEOLOGY] != Datastate.COMPLETE: + logger.warning( + f"Cannot export geology data as it only loaded to {self.data_states[Datatype.GEOLOGY].name} status" + ) + else: + columns = [ + "geometry", + "ID", + "UNITNAME", + "GROUP", + "MIN_AGE", + "MAX_AGE", + "CODE", + "ROCKTYPE1", + "ROCKTYPE2", + "DESCRIPTION", + ] + geology = self.get_map_data(Datatype.GEOLOGY)[columns].copy() + geology.reset_index(inplace=True, drop=True) + geology.rename( + columns={"geometry": "WKT", "CODE": "UNITNAME", "UNITNAME": "CODE"}, inplace=True + ) + geology["MIN_AGE"] = geology["MIN_AGE"].replace("None", 0) + geology["MAX_AGE"] = geology["MAX_AGE"].replace("None", 4500000000) + geology["GROUP"] = geology["GROUP"].replace("None", "") + geology["ROCKTYPE1"] = geology["ROCKTYPE1"].replace("", "None") + geology["ROCKTYPE2"] = geology["ROCKTYPE2"].replace("", "None") + geology.to_csv( + pathlib.Path(self.map2model_tmp_path) / "geology_wkt.csv", sep="\t", index=False + ) + + # Check faults data status and export to a WKT format file + self.load_map_data(Datatype.FAULT) + if type(self.data[Datatype.FAULT]) is not geopandas.GeoDataFrame: + logger.warning("Cannot export fault data as it is not a GeoDataFrame") + elif self.data_states[Datatype.FAULT] != Datastate.COMPLETE: + logger.warning( + f"Cannot export fault data as it only loaded to {self.data_states[Datatype.FAULT].name} status" + ) + else: + faults = self.get_map_data(Datatype.FAULT).copy() + faults.rename(columns={"geometry": "WKT"}, inplace=True) + faults.to_csv( + pathlib.Path(self.map2model_tmp_path) / "faults_wkt.csv", sep="\t", index=False + ) + + @beartype.beartype + def get_value_from_raster(self, datatype: Datatype, x, y): + """ + Get the value from a raster map at the specified point + + Args: + datatype (Datatype): + The datatype of the raster map to retrieve from + x (float or int): + The easting coordinate of the value + y (float or int): + The northing coordinate of the value + + Returns: + float or int: The value at the point specified + """ + data = self.get_map_data(datatype) + if data is None: + logger.warning(f"Cannot get value from {datatype.name} data as data is not loaded") + return None + inv_geotransform = gdal.InvGeoTransform(data.GetGeoTransform()) + + px = int(inv_geotransform[0] + inv_geotransform[1] * x + inv_geotransform[2] * y) + py = int(inv_geotransform[3] + inv_geotransform[4] * x + inv_geotransform[5] * y) + # Clamp values to the edges of raster if past boundary, similiar to GL_CLIP + px = max(px, 0) + px = min(px, data.RasterXSize - 1) + py = max(py, 0) + py = min(py, data.RasterYSize - 1) + val = data.ReadAsArray(px, py, 1, 1)[0][0] + return val + + + + @beartype.beartype + def colour_units( + self, stratigraphic_units: pandas.DataFrame, random: bool = False + ) -> pandas.DataFrame: + """ + Add a colour column to the units in the stratigraphic units structure + + Args: + stratigraphic_units (pandas.DataFrame): + The stratigraphic units data + random (bool, optional): + Flag of whether to add random colours to missing entries in the colour lookup table. Defaults to False. + + Returns: + pandas.DataFrame: The modified units + """ + + colour_lookup = pandas.DataFrame(columns=["UNITNAME", "colour"]) + + if self.colour_filename is not None: + try: + colour_lookup = pandas.read_csv(self.colour_filename, sep=",") + except FileNotFoundError: + logger.info( + f"Colour Lookup file {self.colour_filename} not found. Assigning random colors to units" + ) + self.colour_filename = None + + if self.colour_filename is None: + logger.info("\nNo colour configuration file found. Assigning random colors to units") + missing_colour_n = len(stratigraphic_units["colour"]) + stratigraphic_units.loc[ + stratigraphic_units["colour"].isna(), "colour" + ] = generate_random_hex_colors(missing_colour_n) + + colour_lookup["colour"] = colour_lookup["colour"].str.upper() + # if there are duplicates in the clut file, drop. + colour_lookup = colour_lookup.drop_duplicates(subset=["UNITNAME"]) + + if "UNITNAME" in colour_lookup.columns and "colour" in colour_lookup.columns: + stratigraphic_units = stratigraphic_units.merge( + colour_lookup, + left_on="name", + right_on="UNITNAME", + suffixes=("_old", ""), + how="left", + ) + stratigraphic_units.loc[ + stratigraphic_units["colour"].isna(), "colour" + ] = generate_random_hex_colors(int(stratigraphic_units["colour"].isna().sum())) + stratigraphic_units.drop(columns=["UNITNAME", "colour_old"], inplace=True) + else: + logger.warning( + f"Colour Lookup file {self.colour_filename} does not contain 'UNITNAME' or 'colour' field" + ) + return stratigraphic_units + + @property + def GEOLOGY(self): + return self.get_map_data(Datatype.GEOLOGY) + + @property + def STRUCTURE(self): + return self.get_map_data(Datatype.STRUCTURE) + + @property + def FAULT(self): + return self.get_map_data(Datatype.FAULT) \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/project.py b/packages/map2loop/src/map2loop/project.py new file mode 100644 index 000000000..3cf355fdc --- /dev/null +++ b/packages/map2loop/src/map2loop/project.py @@ -0,0 +1,1190 @@ +# internal imports +from map2loop.fault_orientation import FaultOrientationNearest +from .utils import hex_to_rgb, set_z_values_from_raster_df +from .m2l_enums import VerboseLevel, ErrorState, Datatype +from .mapdata import MapData +from .contact_extractor import ContactExtractor +from .sampler import Sampler, SamplerDecimator, SamplerSpacing +from .thickness_calculator import InterpolatedStructure, ThicknessCalculator +from .throw_calculator import ThrowCalculator, ThrowCalculatorAlpha +from .fault_orientation import FaultOrientation +from .sorter import Sorter, SorterAgeBased, SorterAlpha, SorterUseNetworkX, SorterUseHint +from .stratigraphic_column import StratigraphicColumn +from .deformation_history import DeformationHistory +from .topology import Topology +from .data_checks import validate_config_dictionary + +# external imports +import LoopProjectFile as LPF +from osgeo import gdal +gdal.UseExceptions() +import geopandas +import beartype +from beartype.typing import Union, List, Dict, Any +import pathlib +import numpy +import pandas +import os +import re + +from .logging import getLogger + +logger = getLogger(__name__) + + +class Project(object): + """ + The main entry point into using map2loop + + Attributes + ----------- + verbose_level: m2l_enums.VerboseLevel + A selection that defines how much console logging is output + samplers: Sampler + A list of samplers used to extract point samples from polygons or line segments. Indexed by m2l_enum + sorter: Sorter + The sorting algorithm to use for calculating the stratigraphic column + loop_filename: str + The name of the loop project file used in this project + map_data: MapData + The structure that holds all map and dtm data + map2model: Topology + A wrapper around the map2model module that extracts unit and fault adjacency + stratigraphic_column: StratigraphicColumn + The structure that holds the unit information and ordering + deformation_history: DeformationHistory + The structura that holds the fault and fold information and interactions + """ + + @beartype.beartype + def __init__( + self, + verbose_level: VerboseLevel = VerboseLevel.ALL, + tmp_path: str = "m2l_data_tmp", + working_projection=None, + bounding_box=None, + use_australian_state_data: str = "", + geology_filename: str = "", + structure_filename: str = "", + fault_filename: str = "", + fault_orientation_filename: str = "", + fold_filename: str = "", + dtm_filename: str = "", + config_filename: Union[pathlib.Path, str] = "", + config_dictionary: dict = {}, + clut_filename: Union[pathlib.Path, str] = "", + save_pre_checked_map_data: bool = False, + loop_project_filename: str = "", + overwrite_loopprojectfile: bool = False, + ): + """ + The initialiser for the map2loop project + + Args: + verbose_level (VerboseLevel, optional): + How much console output is sent. Defaults to VerboseLevel.ALL. + tmp_path (str, optional): + The directory for storing temporary files. Defaults to "./m2l_data_tmp". + working_projection (str or int, optional): + The EPSG projection to use. Defaults to None. + bounding_box (list or dict, optional): + The boundary extents of the project (m). Defaults to None. + use_australian_state_data (str, optional): + Whether to use default state data and which state to use. Defaults to "". + geology_filename (str, optional): + The filename of the geology shapefile. Defaults to "". + structure_filename (str, optional): + The filename of the structure shapefile. Defaults to "". + fault_filename (str, optional): + The filename of the fault shapefile. Defaults to "". + fault_orientation_filename (str, optional): + The filename of the fault orientation shapefile. Defaults to "". + fold_filename (str, optional): + The filename fo the fold shapefile. Defaults to "". + dtm_filename (str, optional): + The filename of the digital terrain map to use. Defaults to "". + config_filename (str, optional): + The filename of the configuration json file to use (if not using config_dictionary). Defaults to "". + config_dictionary (dict, optional): + A dictionary version of the configuration file. Defaults to {}. + clut_filename (str, optional): + The filename of the colour look up table to use. Defaults to "". + save_pre_checked_map_data (bool, optional): + A flag to save all map data to file before use. Defaults to False. + loop_project_filename (str, optional): + The filename of the loop project file. Defaults to "". + + Raises: + TypeError: Type of working_projection not a str or int + ValueError: bounding_box not length 4 or 6 + TypeError: Type of bounding_box not a dict or tuple + ValueError: use_australian_state_data not in state list ['WA', 'SA', 'QLD', 'NSW', 'TAS', 'VIC', 'ACT', 'NT'] + """ + + # make sure all the needed arguments are provided + if not use_australian_state_data: # this check has to skip if using Loop server data + self.validate_required_inputs( + bounding_box=bounding_box, + working_projection=working_projection, + geology_filename=geology_filename, + structure_filename=structure_filename, + dtm_filename=dtm_filename, + config_dictionary=config_dictionary, + config_filename=config_filename, + ) + + self._error_state = ErrorState.NONE + self._error_state_msg = "" + self.verbose_level = verbose_level + self.samplers = [SamplerDecimator()] * len(Datatype) + self.set_default_samplers() + self.bounding_box = bounding_box + self.contact_extractor = None + self.sorter = SorterUseHint + self.throw_calculator = ThrowCalculatorAlpha() + self.fault_orientation = FaultOrientationNearest() + self.map_data = MapData(verbose_level=verbose_level) + self.stratigraphic_column = StratigraphicColumn() + self.deformation_history = DeformationHistory(project=self) + self.loop_filename = loop_project_filename + self.overwrite_lpf = overwrite_loopprojectfile + self.active_thickness = None + + + # initialise the dataframes to store data in + self.fault_orientations = pandas.DataFrame( + columns=["ID", "DIPDIR", "DIP", "X", "Y", "Z", "featureId"] + ) + self.fault_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) + self.fold_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) + self.geology_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) + + # Sanity check on working projection parameter + if issubclass(type(working_projection), str) or issubclass(type(working_projection), int): + self.map_data.set_working_projection(working_projection) + elif type(working_projection) is None: + if verbose_level != VerboseLevel.NONE: + logger.warning( + "No working projection set, will attempt to use the projection of the geology map" + ) + else: + logger.error(f"Invalid type for working_projection {type(working_projection)}") + raise TypeError(f"Invalid type for working_projection {type(working_projection)}") + + # Sanity check bounding box + if issubclass(type(bounding_box), dict) or issubclass(type(bounding_box), tuple): + if len(bounding_box) == 4 or len(bounding_box) == 6: + self.map_data.set_bounding_box(bounding_box) + else: + logger.error( + f"Length of bounding_box {len(bounding_box)} is neither 4 (map boundary) nor 6 (volumetric boundary)" + ) + raise ValueError( + f"Length of bounding_box {len(bounding_box)} is neither 4 (map boundary) nor 6 (volumetric boundary)" + ) + else: + logger.error(f"Invalid type for bounding_box {type(bounding_box)}") + raise TypeError(f"Invalid type for bounding_box {type(bounding_box)}") + + # Assign filenames + if use_australian_state_data != "": + # Sanity check on state string + if use_australian_state_data in {"WA", "SA", "QLD", "NSW", "TAS", "VIC", "ACT", "NT"}: + self.map_data.set_filenames_from_australian_state(use_australian_state_data) + else: + logger.error( + f"Australian state {use_australian_state_data} not in state url database" + ) + raise ValueError( + f"Australian state {use_australian_state_data} not in state url database" + ) + # set the data filenames + if geology_filename != "": + self.map_data.set_filename(Datatype.GEOLOGY, geology_filename) + if structure_filename != "": + self.map_data.set_filename(Datatype.STRUCTURE, structure_filename) + if fault_filename != "": + self.map_data.set_filename(Datatype.FAULT, fault_filename) + if fold_filename != "": + self.map_data.set_filename(Datatype.FOLD, fold_filename) + if dtm_filename != "": + self.map_data.set_filename(Datatype.DTM, dtm_filename) + if fault_orientation_filename != "": + self.map_data.set_filename(Datatype.FAULT_ORIENTATION, fault_orientation_filename) + + if config_filename != "": + self.map_data.set_config_filename(config_filename) + + if config_dictionary != {}: + validate_config_dictionary(config_dictionary) + self.map_data.config.update_from_dictionary(config_dictionary) + # print(self.map_data.config) + # self.map_data.config.validate_config_dictionary(config_dictionary) + + if clut_filename != "": + self.map_data.set_colour_filename(clut_filename) + + + # Load all data (both shape and raster) + self.map_data.load_all_map_data() + + # If flag to save out data is check do so + tmp_path = pathlib.Path(tmp_path) + + if save_pre_checked_map_data: + # check if the path exists, and if not, create + if not tmp_path.exists(): + tmp_path.mkdir() + self.map_data.save_all_map_data(tmp_path) + + # Populate the stratigraphic column and deformation history from map data + self.stratigraphic_column.populate(self.map_data.get_map_data(Datatype.GEOLOGY)) + self.deformation_history.populate(self.map_data.get_map_data(Datatype.FAULT)) + self.topology = Topology( + self.map_data.get_map_data(Datatype.GEOLOGY), + self.map_data.get_map_data(Datatype.FAULT) + ) + self.thickness_calculator = [InterpolatedStructure( + dtm_data=self.map_data.get_map_data(Datatype.DTM), + bounding_box=self.bounding_box, + is_strike=False + )] + + + @beartype.beartype + def validate_required_inputs( + self, + bounding_box: Dict[str, Union[float, int]], + working_projection: str, + geology_filename: str, + structure_filename: str, + dtm_filename: str, + config_filename: str = None, + config_dictionary: Dict[str, Any] = {}, + ) -> None: + + required_inputs = { + "bounding_box": bounding_box, + "working_projection": working_projection, # this may be removed when fix is added for https://github.com/Loop3D/map2loop/issues/103 + "geology_filename": geology_filename, + "structure_filename": structure_filename, + "dtm_filename": dtm_filename, + } + + # Check for missing required inputs in project + missing_inputs = [key for key, value in required_inputs.items() if not value] + + if missing_inputs: + missing_list = ", ".join(missing_inputs) + logger.error( + f"Project construction is missing required inputs: {missing_list}. " + "Please add them to the Project()." + ) + raise ValueError( + f"Project construction is missing required inputs: {missing_list}. " + "Please add them to the Project()." + ) + + # Either config_filename or config_dictionary must be provided (but not both or neither) + if not config_filename and not config_dictionary: + logger.error( + "A config file is required to run map2loop - use either 'config_filename' or 'config_dictionary' to initialise the project." + ) + raise ValueError( + "A config file is required to run map2loop - use either 'config_filename' or 'config_dictionary' to initialise the project." + ) + if config_filename and config_dictionary: + logger.error( + "Both 'config_filename' and 'config_dictionary' were provided. Please specify only one config." + ) + raise ValueError( + "Both 'config_filename' and 'config_dictionary' were provided. Please specify only one config." + ) + + + + # Getters and Setters + @beartype.beartype + def set_ignore_lithology_codes(self, codes: list): + """ + Set the lithology unit names to be ignored in the geology shapefile. + + This method sets the lithology codes that should be excluded from the geology shapefile + and triggers the re-population of the stratigraphic column using the updated data + from the geological map, ensuring the excluded lithologies are not considered. + + Args: + codes (list): + A list of strings representing the lithology unit names to be ignored + in the geological shapefile. + """ + self.map_data.set_ignore_lithology_codes(codes) + # Re-populate the units in the column with the new set of ignored geographical units + self.stratigraphic_column.populate(self.map_data.get_map_data(Datatype.GEOLOGY)) + + @beartype.beartype + def set_ignore_fault_codes(self, codes: list): + """ + Set the fault names to be ignored in the fault map. + + This method sets the fault codes to be ignored from the fault map and triggers + re-parsing of the fault map to exclude the ignored faults during subsequent processing. + + Args: + codes (list): + A list of strings representing the fault unit names to be ignored + in the fault map. + """ + self.map_data.set_ignore_fault_codes(codes) + # Re-populate the units in the column with the new set of ignored geographical units + self.map_data.parse_fault_map() # remove the ignored faults + + @beartype.beartype + def set_sorter(self, sorter: Sorter): + """ + Set the sorter for determining stratigraphic order of units + + Args: + sorter (Sorter): + The sorter to use. Must be of base class Sorter + """ + logger.info(f"Setting sorter to {sorter.sorter_label}") + self.sorter = sorter + + def get_sorter(self): + """ + Get the name of the sorter being used + + Returns: + str: The name of the sorter used + """ + return self.sorter.sorter_label + + @beartype.beartype + def set_fault_orientation(self, fault_orientation: FaultOrientation): + """ + Set the fault orientation calculator that estimates fault orientation values for all faults + + Args: + fault_orientation (FaultOrientation): + The calculator to use. Must be of base class FaultOrientation + """ + logger.info(f"Setting fault orientation calculator to {fault_orientation.label}") + self.fault_orientation = fault_orientation + + def get_fault_orientation(self): + """ + Get the name of the fault orientation calculator being used + + Returns: + str: The name of the fault orientation calculator used + """ + return self.fault_orientation.label + + @beartype.beartype + def set_throw_calculator(self, throw_calculator: ThrowCalculator): + """ + Set the throw calculator that estimates fault throw values for all faults + + Args: + throw_calculator (ThrowCalculator): + The calculator to use. Must be of base class ThrowCalculator + """ + logger.info(f"Setting throw calculator to {throw_calculator.throw_calculator_label}") + self.throw_calculator = throw_calculator + + def get_throw_calculator(self): + """ + Get the name of the throw calculator being used + + Returns: + str: The name of the throw calculator used + """ + return self.throw_calculator.throw_calculator_label + + def set_default_samplers(self): + """ + Initialisation function to set or reset the point samplers + """ + logger.info("Setting default samplers") + self.samplers[Datatype.STRUCTURE] = SamplerDecimator(1) + self.samplers[Datatype.GEOLOGY] = SamplerSpacing(50.0) + self.samplers[Datatype.FAULT] = SamplerSpacing(50.0) + self.samplers[Datatype.FOLD] = SamplerSpacing(50.0) + self.samplers[Datatype.DTM] = SamplerSpacing(50.0) + + @beartype.beartype + def set_sampler(self, datatype: Datatype, sampler: Sampler): + """ + Set the point sampler for a specific datatype + + Args: + datatype (Datatype): + The datatype to use this sampler on + sampler (Sampler): + The sampler to use + """ + allowed_samplers = { + Datatype.STRUCTURE: SamplerDecimator, + Datatype.GEOLOGY: SamplerSpacing, + Datatype.FAULT: SamplerSpacing, + Datatype.FOLD: SamplerSpacing, + Datatype.DTM: SamplerSpacing, + } + + # Check for wrong sampler + if datatype in allowed_samplers: + allowed_sampler_type = allowed_samplers[datatype] + if not isinstance(sampler, allowed_sampler_type): + raise ValueError( + f"Got wrong argument for this datatype: {type(sampler).__name__}, please use {allowed_sampler_type.__name__} instead" + ) + ## does the enum print the number or the label? + logger.info(f"Setting sampler for {datatype} to {sampler.sampler_label}") + self.samplers[datatype] = sampler + + @beartype.beartype + def get_sampler(self, datatype: Datatype): + """ + Get the sampler name being used for a datatype + + Args: + datatype (Datatype): The datatype of the sampler + + Returns: + str: The name of the sampler being used on the specified datatype + """ + return self.samplers[datatype].sampler_label + + @beartype.beartype + def set_minimum_fault_length(self, length: Union[float, int]): + """ + Set the cutoff length for faults to ignore + + Args: + length (float): + The cutoff length + """ + logger.info(f"Setting minimum fault length to {length}") + self.map_data.config.fault_config['minimum_fault_length'] = length + self.map_data.parse_fault_map() + + @beartype.beartype + def get_minimum_fault_length(self) -> float: + """ + Get the cutoff length for faults + + Returns: + float: The cutoff length + """ + return float(self.map_data.config.fault_config['minimum_fault_length']) + + @beartype.beartype + def set_active_thickness(self, thickness_calculator: ThicknessCalculator): + """ + Sets the active_thickness attribute based on the provided thickness_calculator. + Args: + thickness_calculator (object or str): The thickness calculator object or its label. + If an object is provided, it should have a 'thickness_calculator_label' attribute. + Returns: + None + Raises: + ValueError: If the thickness calculator label cannot be determined. + """ + + try: + label = thickness_calculator.thickness_calculator_label + except AttributeError: + raise ValueError("The provided thickness calculator object does not have a 'thickness_calculator_label' attribute.") + self.active_thickness = label + + @beartype.beartype + def get_active_thickness(self) -> str: + """ + Retrieves the active_thickness attribute. + + Returns: + str: The label of the active thickness calculator. + """ + return self.active_thickness + + # Processing functions + def sample_map_data(self): + """ + Use the samplers to extract points along polylines or unit boundaries + """ + geology_data = self.map_data.get_map_data(Datatype.GEOLOGY) + dtm_data = self.map_data.get_map_data(Datatype.DTM) + + logger.info(f"Sampling geology map data using {self.samplers[Datatype.GEOLOGY].sampler_label}") + self.geology_samples = self.samplers[Datatype.GEOLOGY].sample(geology_data) + + logger.info(f"Sampling structure map data using {self.samplers[Datatype.STRUCTURE].sampler_label}") + self.samplers[Datatype.STRUCTURE].dtm_data = dtm_data + self.samplers[Datatype.STRUCTURE].geology_data = geology_data + self.structure_samples = self.samplers[Datatype.STRUCTURE].sample(self.map_data.get_map_data(Datatype.STRUCTURE)) + + logger.info(f"Sampling fault map data using {self.samplers[Datatype.FAULT].sampler_label}") + self.fault_samples = self.samplers[Datatype.FAULT].sample(self.map_data.get_map_data(Datatype.FAULT)) + + logger.info(f"Sampling fold map data using {self.samplers[Datatype.FOLD].sampler_label}") + self.fold_samples = self.samplers[Datatype.FOLD].sample(self.map_data.get_map_data(Datatype.FOLD)) + + def extract_geology_contacts(self): + """ + Use the stratigraphic column, and fault and geology data to extract points along contacts + """ + # Use stratigraphic column to determine basal contacts + if self.contact_extractor is None: + self.contact_extractor = ContactExtractor( + self.map_data.get_map_data(Datatype.GEOLOGY), + self.map_data.get_map_data(Datatype.FAULT), + ) + self.contact_extractor.extract_all_contacts() + + basal_contacts = self.contact_extractor.extract_basal_contacts(self.stratigraphic_column.column) + + # sample the contacts + self.map_data.sampled_contacts = self.samplers[Datatype.GEOLOGY].sample(basal_contacts) + dtm_data = self.map_data.get_map_data(Datatype.DTM) + set_z_values_from_raster_df(dtm_data, self.map_data.sampled_contacts) + + def calculate_stratigraphic_order(self, take_best=False): + """ + Use unit relationships, unit ages and the sorter to create a stratigraphic column + """ + if self.contact_extractor is None: + self.contact_extractor = ContactExtractor( + self.map_data.get_map_data(Datatype.GEOLOGY), + self.map_data.get_map_data(Datatype.FAULT), + ) + self.contact_extractor.extract_all_contacts() + if take_best: + sorters = [ + SorterAgeBased(), + SorterAlpha( + contacts=self.contact_extractor.contacts, + ), + SorterUseNetworkX( + unit_relationships=self.topology.get_unit_unit_relationships(), + ), + ] + logger.info( + f"Calculating best stratigraphic column from {[sorter.sorter_label for sorter in sorters]}" + ) + + columns = [ + sorter.sort( + self.stratigraphic_column.stratigraphicUnits, + ) + for sorter in sorters + ] + basal_contacts = [ + self.contact_extractor.extract_basal_contacts( + column, save_contacts=False + ) + for column in columns + ] + basal_lengths = [ + sum(list(contacts[contacts["type"] == "BASAL"]["geometry"].length)) + for contacts in basal_contacts + ] + max_length = -1 + column = columns[0] + best_sorter = sorters[0] + for i in range(len(sorters)): + if basal_lengths[i] > max_length: + max_length = basal_lengths[i] + column = columns[i] + best_sorter = sorters[i] + logger.info( + f"Best sorter {best_sorter.sorter_label} calculated contact length of {max_length}" + ) + self.stratigraphic_column.column = column + else: + logger.info(f'Calculating stratigraphic column using sorter {self.sorter.sorter_label}') + # Update sorter with current data based on what it needs + if hasattr(self.sorter, 'unit_relationships') and self.sorter.unit_relationships is None: + self.sorter.unit_relationships = self.topology.get_unit_unit_relationships() + if hasattr(self.sorter, 'contacts') and self.sorter.contacts is None: + self.sorter.contacts = self.contact_extractor.contacts + if hasattr(self.sorter, 'geology_data') and self.sorter.geology_data is None: + self.sorter.geology_data = self.map_data.get_map_data(Datatype.GEOLOGY) + if hasattr(self.sorter, 'structure_data') and self.sorter.structure_data is None: + self.sorter.structure_data = self.map_data.get_map_data(Datatype.STRUCTURE) + if hasattr(self.sorter, 'dtm_data') and self.sorter.dtm_data is None: + self.sorter.dtm_data = self.map_data.get_map_data(Datatype.DTM) + if hasattr(self.sorter, 'min_age_column') and self.sorter.min_age_column is None: + self.sorter.min_age_column = self.stratigraphic_column.get_min_age_column() + if hasattr(self.sorter, 'max_age_column') and self.sorter.max_age_column is None: + self.sorter.max_age_column = self.stratigraphic_column.get_max_age_column() + + self.stratigraphic_column.column = self.sorter.sort( + self.stratigraphic_column.stratigraphicUnits, + ) + + @beartype.beartype + def set_thickness_calculator( + self, thickness_calculator: Union['ThicknessCalculator', List['ThicknessCalculator']], is_strike: bool = False + ) -> None: + """ + Sets the thickness_calculator attribute for the object. + + If a single instance of ThicknessCalculator is passed, it wraps it in a list. + If a list of ThicknessCalculator instances is passed, it validates that all elements + are instances of ThicknessCalculator before setting the attribute. + + Args: + thickness_calculator (ThicknessCalculator or list of ThicknessCalculator): + An instance or a list of ThicknessCalculator objects. + + Raises: + TypeError: If the provided thickness_calculator is not an instance of + ThicknessCalculator or a list of such instances. + """ + if isinstance(thickness_calculator, ThicknessCalculator): + thickness_calculator.is_strike = is_strike + thickness_calculator = [thickness_calculator] + + # Now check if thickness_calculator is a list of valid instances + if not isinstance(thickness_calculator, list) or not all( + isinstance(tc, ThicknessCalculator) for tc in thickness_calculator + ): + raise TypeError( + "All items must be instances of ThicknessCalculator or a single ThicknessCalculator instance." + ) + + # Finally, set the calculators + for tc in thickness_calculator: + tc.is_strike = is_strike + self.thickness_calculator = thickness_calculator + + def get_thickness_calculator(self) -> List[str]: + """ + Retrieves the thickness_calculator_label from the thickness_calculator attribute. + + This method checks if the thickness_calculator attribute is a list or a single object: + - If it's a list of ThicknessCalculator objects, it returns a list of their labels. + - If it's a single ThicknessCalculator object, it returns the label as a single-item list. + - If neither, it raises a TypeError. + + Returns: + list: A list of thickness_calculator_label(s) from the ThicknessCalculator object(s). + + Raises: + TypeError: If thickness_calculator is neither a list of objects nor a single object + with a 'thickness_calculator_label' attribute. + """ + + if isinstance(self.thickness_calculator, list): + # If it's a list, return labels from all items + return [ + calculator.thickness_calculator_label for calculator in self.thickness_calculator + ] + elif hasattr(self.thickness_calculator, 'thickness_calculator_label'): + # If it's a single object, return the label as a list + return [self.thickness_calculator.thickness_calculator_label] + else: + raise TypeError( + "self.thickness_calculator must be either a list of objects or a single object with a thickness_calculator_label attribute" + ) + + def calculate_unit_thicknesses(self, basal_contacts): + """ + Calculates the unit thickness statistics (mean, median, standard deviation) for each stratigraphic unit + in the stratigraphic column using the provided thickness calculators. + + For each calculator in the `thickness_calculator` list: + - Computes the thickness statistics using the `compute()` method of each calculator. + - Repeats the computed results to match the number of rows in the stratigraphic units. + - Appends these results as new columns to the `stratigraphicUnits` dataframe. + + The new columns added for each calculator will be named in the format: + - {calculator_label}_mean + - {calculator_label}_median + - {calculator_label}_stddev + + Additionally, stores the labels of the calculators in the `thickness_calculator_labels` attribute. + + Returns: + None + + Raises: + None + """ + + labels = [] + + for calculator in self.thickness_calculator: + calculator.dtm_data = self.map_data.get_map_data(Datatype.DTM) + calculator.bounding_box = self.bounding_box + result = calculator.compute( + self.stratigraphic_column.stratigraphicUnits, + self.stratigraphic_column.column, + basal_contacts, + self.structure_samples, + self.map_data.get_map_data(Datatype.GEOLOGY), + self.map_data.sampled_contacts, + )[['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev']].to_numpy() + + label = calculator.thickness_calculator_label + labels.append(label) + + # Repeat the results for the number of rows in stratigraphicUnits + num_rows = self.stratigraphic_column.stratigraphicUnits.shape[0] + repeated_result = numpy.tile(result, (num_rows // result.shape[0], 1)) + + # Append the repeated results to the lists + mean_col_name = f"{label}_mean" + median_col_name = f"{label}_median" + stddev_col_name = f"{label}_stddev" + + # Attach the results as new columns to the stratigraphic column dataframe + self.stratigraphic_column.stratigraphicUnits[mean_col_name] = repeated_result[:, 0] + self.stratigraphic_column.stratigraphicUnits[median_col_name] = repeated_result[:, 1] + self.stratigraphic_column.stratigraphicUnits[stddev_col_name] = repeated_result[:, 2] + + self.thickness_calculator_labels = labels + if self.active_thickness is None: + self.active_thickness = labels[0] + + def calculate_fault_orientations(self): + if self.map_data.get_map_data(Datatype.FAULT_ORIENTATION) is not None: + logger.info(f"Calculating fault orientations using {self.fault_orientation.label}") + self.fault_orientations = self.fault_orientation.calculate( + self.map_data.get_map_data(Datatype.FAULT), + self.map_data.get_map_data(Datatype.FAULT_ORIENTATION), + self.map_data, + ) + dtm_data = self.map_data.get_map_data(Datatype.DTM) + set_z_values_from_raster_df(dtm_data, self.fault_orientations) + else: + logger.warning( + "No fault orientation data found, skipping fault orientation calculation" + ) + + def apply_colour_to_units(self): + """ + Apply the clut file to the units in the stratigraphic column + """ + self.stratigraphic_column.stratigraphicUnits = self.map_data.colour_units( + self.stratigraphic_column.stratigraphicUnits + ) + + def sort_stratigraphic_column(self): + """ + Sort the units in the stratigraphic column data structure to match the column order + """ + logger.info('Sorting stratigraphic column') + self.stratigraphic_column.sort_from_relationship_list(self.stratigraphic_column.column) + + def summarise_fault_data(self): + """ + Use the fault shapefile to make a summary of each fault by name + """ + dtm_data = self.map_data.get_map_data(Datatype.DTM) + set_z_values_from_raster_df(dtm_data, self.fault_samples) + + self.deformation_history.summarise_data(self.fault_samples) + self.deformation_history.faults = self.throw_calculator.compute( + self.deformation_history.faults, + self.stratigraphic_column.column, + self.contact_extractor.basal_contacts, + self.map_data, + ) + logger.info(f'There are {self.deformation_history.faults.shape[0]} faults in the dataset') + + def run_all(self, user_defined_stratigraphic_column=None, take_best=False): + """ + Runs the full map2loop process + + Args: + user_defined_stratigraphic_column (None or list, optional): + A user fed list that overrides the stratigraphic column sorter. Defaults to None. + """ + logger.info('Running all map2loop processes') + if user_defined_stratigraphic_column is not None: + logger.info(f'User defined stratigraphic column: {user_defined_stratigraphic_column}') + + # Calculate contacts before stratigraphic column + self.contact_extractor = ContactExtractor( + self.map_data.get_map_data(Datatype.GEOLOGY), + self.map_data.get_map_data(Datatype.FAULT), + ) + self.map_data.contacts = self.contact_extractor.extract_all_contacts() + + # Calculate the stratigraphic column + if issubclass(type(user_defined_stratigraphic_column), list): + self.stratigraphic_column.column = user_defined_stratigraphic_column + self.topology.run() # if we use a user defined stratigraphic column, we still need to calculate the results of map2model + else: + if user_defined_stratigraphic_column is not None: + logger.warning( + f"user_defined_stratigraphic_column is not of type list and is {type(user_defined_stratigraphic_column)}. Attempting to calculate column" + ) # why not try casting to a list? + self.calculate_stratigraphic_order(take_best) + self.sort_stratigraphic_column() + + # Calculate basal contacts based on stratigraphic column + self.extract_geology_contacts() + self.sample_map_data() + self.calculate_unit_thicknesses(self.contact_extractor.basal_contacts) + self.calculate_fault_orientations() + self.summarise_fault_data() + self.apply_colour_to_units() + self.save_into_projectfile() + + def save_into_projectfile(self): + """ + Creates or updates a loop project file with all the data extracted from the map2loop process + """ + # Open project file + logger.info('Saving data into loop project file') + if not self.loop_filename: + logger.info('No loop project file specified, creating a new one') + output_dir = pathlib.Path.cwd() + output_dir.mkdir(parents=True, exist_ok=True) + filename = "new_project.loop3d" + self.loop_filename = str(output_dir / filename) + + file_exists = os.path.isfile(self.loop_filename) + + if file_exists: + if self.overwrite_lpf: + logger.info('Overwriting existing loop project file') + try: + os.remove(self.loop_filename) + file_exists = False + logger.info(f"\nExisting file '{self.loop_filename}' was successfully deleted.") + except Exception as e: + logger.error(f"\nFailed to delete existing file '{self.loop_filename}': {e}") + raise e + else: + logger.error( + f"\nThere is an existing '{self.loop_filename}' with the same name as specified in project. map2loop process may fail. Set 'overwrite_loopprojectfile' to True to avoid this" + ) + return + + # Initialize the LoopProjectFile + if not file_exists: + LPF.CreateBasic(self.loop_filename) + + version_mismatch = False + existing_extents = None + + if file_exists: + file_version = LPF.Get(self.loop_filename, "version", verbose=False) + if file_version["errorFlag"] is True: + logger.error(f"Error: {file_version['errorString']}") + logger.error( + f" Cannot export loop project file as current file of name {self.loop_filename} is not a loop project file" + ) + raise Exception( + f"Cannot export loop project file as current file of name {self.loop_filename} is not a loop project file" + ) + + else: + version_mismatch = file_version["value"] != LPF.LoopVersion() + if version_mismatch: + logger.warning( + f"Mismatched loop project file versions {LPF.LoopVersion()} and {file_version}, old version will be replaced" + ) + resp = LPF.Get(self.loop_filename, "extents") + if not resp["errorFlag"]: + existing_extents = resp["value"] + + # Save extents + if existing_extents is None: + LPF.Set( + self.loop_filename, + "extents", + geodesic=[-180, -179, 0, 1], + utm=[ + 1, + 1, + self.map_data.bounding_box["minx"], + self.map_data.bounding_box["maxx"], + self.map_data.bounding_box["miny"], + self.map_data.bounding_box["maxy"], + ], + depth=[self.map_data.bounding_box["top"], self.map_data.bounding_box["base"]], + spacing=[1000, 1000, 500], + preference="utm", + epsg=self.map_data.get_working_projection(), + ) + else: + # TODO: Check loopfile extents match project extents before continuing + # if mismatch on extents warn the user and create new file + LPF.Set(self.loop_filename, "extents", **existing_extents) + + # Save unit information + stratigraphic_data = numpy.zeros( + len(self.stratigraphic_column.stratigraphicUnits), LPF.stratigraphicLayerType + ) + stratigraphic_thicknesses = numpy.zeros( + len(self.stratigraphic_column.stratigraphicUnits), LPF.stratigraphicThicknessType) + + stratigraphic_data["layerId"] = self.stratigraphic_column.stratigraphicUnits["layerId"] + stratigraphic_data["minAge"] = self.stratigraphic_column.stratigraphicUnits["minAge"] + stratigraphic_data["maxAge"] = self.stratigraphic_column.stratigraphicUnits["maxAge"] + stratigraphic_data["name"] = self.stratigraphic_column.stratigraphicUnits["name"] + stratigraphic_data["group"] = self.stratigraphic_column.stratigraphicUnits["group"] + stratigraphic_data["enabled"] = 1 + + stratigraphic_thicknesses['name']= self.stratigraphic_column.stratigraphicUnits["name"] + + # store all of the thickness estimates in a separate table + for i, label in enumerate(self.thickness_calculator_labels): + stratigraphic_thicknesses[f'thickness{i+1}_mean'] = self.stratigraphic_column.stratigraphicUnits.get(f'{label}_mean',0) + stratigraphic_thicknesses[f'thickness{i+1}_median'] = self.stratigraphic_column.stratigraphicUnits.get(f'{label}_median',0) + stratigraphic_thicknesses[f'thickness{i+1}_stddev'] = self.stratigraphic_column.stratigraphicUnits.get(f'{label}_stddev',0) + + # store the active thickness calculator as the default thickness + stratigraphic_data["ThicknessMean"] = self.stratigraphic_column.stratigraphicUnits.get(f'{self.active_thickness}_mean',0) + stratigraphic_data["ThicknessMedian"] = self.stratigraphic_column.stratigraphicUnits.get(f'{self.active_thickness}_median',0) + stratigraphic_data["ThicknessStdDev"] = self.stratigraphic_column.stratigraphicUnits.get(f'{self.active_thickness}_stddev',0) + + # Assign colours to startigraphic data + stratigraphic_data["colour1Red"] = [ + int(a[1:3], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] + ] + stratigraphic_data["colour1Green"] = [ + int(a[3:5], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] + ] + stratigraphic_data["colour1Blue"] = [ + int(a[5:7], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] + ] + stratigraphic_data["colour2Red"] = [int(a * 0.95) for a in stratigraphic_data["colour1Red"]] + + stratigraphic_data["colour2Green"] = [ + int(a * 0.95) for a in stratigraphic_data["colour1Green"] + ] + stratigraphic_data["colour2Blue"] = [ + int(a * 0.95) for a in stratigraphic_data["colour1Blue"] + ] + + n_thick_calcs = len(self.thickness_calculator_labels) + # get thickness calculator labels, and fill up with None if empty values up to 5 placeholders + while len(self.thickness_calculator_labels) < 5: + self.thickness_calculator_labels.append("None") + + headers = 'name;'+';'.join([f'{l}_mean;{l}_median;{l}_stddev' for l in self.thickness_calculator_labels[:5]]) + headers = headers.split(';') # split into list + + # save into LPF + LPF.Set( + self.loop_filename, + "stratigraphicLog", + data=stratigraphic_data, + verbose=False, + ) + LPF.Set(self.loop_filename, + "stratigraphicThicknesses", + data=stratigraphic_thicknesses, + headers=headers, + ncols=1+3*n_thick_calcs, # index and mean, median, stddev for each thickness calculator + verbose=False) + + # Save contacts + contacts_data = numpy.zeros(len(self.map_data.sampled_contacts), LPF.contactObservationType) + contacts_data["layerId"] = self.map_data.sampled_contacts["ID"] + contacts_data["easting"] = self.map_data.sampled_contacts["X"] + contacts_data["northing"] = self.map_data.sampled_contacts["Y"] + contacts_data["altitude"] = self.map_data.sampled_contacts["Z"] + contacts_data["featureId"] = self.map_data.sampled_contacts["featureId"] + LPF.Set(self.loop_filename, "contacts", data=contacts_data) + + # Save fault trace information + faults_obs_data = numpy.zeros( + len(self.fault_samples) + len(self.fault_orientations), LPF.faultObservationType + ) + faults_obs_data["val"] = numpy.nan + faults_obs_data["eventId"][0 : len(self.fault_samples)] = self.fault_samples["ID"] + faults_obs_data["easting"][0 : len(self.fault_samples)] = self.fault_samples["X"] + faults_obs_data["northing"][0 : len(self.fault_samples)] = self.fault_samples["Y"] + faults_obs_data["altitude"][0 : len(self.fault_samples)] = self.fault_samples["Z"] + faults_obs_data["featureId"][0 : len(self.fault_samples)] = self.fault_samples["featureId"] + faults_obs_data["dipDir"][0 : len(self.fault_samples)] = numpy.nan + faults_obs_data["dip"][0 : len(self.fault_samples)] = numpy.nan + faults_obs_data["posOnly"][0 : len(self.fault_samples)] = 1 + faults_obs_data[ + "displacement" + ] = 100 # self.fault_samples["DISPLACEMENT"] #TODO remove note needed + + faults_obs_data["eventId"][len(self.fault_samples) :] = self.fault_orientations["ID"] + faults_obs_data["easting"][len(self.fault_samples) :] = self.fault_orientations["X"] + faults_obs_data["northing"][len(self.fault_samples) :] = self.fault_orientations["Y"] + faults_obs_data["altitude"][len(self.fault_samples) :] = self.fault_orientations["Z"] + faults_obs_data["featureId"][len(self.fault_samples) :] = self.fault_orientations[ + "featureId" + ] + faults_obs_data["dipDir"][len(self.fault_samples) :] = self.fault_orientations["DIPDIR"] + faults_obs_data["dip"][len(self.fault_samples) :] = self.fault_orientations["DIP"] + faults_obs_data["posOnly"][len(self.fault_samples) :] = 0 + LPF.Set(self.loop_filename, "faultObservations", data=faults_obs_data) + + faults = self.deformation_history.get_faults_for_export() + faults_data = numpy.zeros(len(faults), LPF.faultEventType) + faults_data["eventId"] = faults["eventId"] + faults_data["name"] = faults["name"] + faults_data["minAge"] = faults["minAge"] + faults_data["maxAge"] = faults["maxAge"] + faults_data["group"] = faults["group"] + faults_data["supergroup"] = faults["supergroup"] + faults_data["avgDisplacement"] = faults["avgDisplacement"] + faults_data["avgDownthrowDir"] = faults["avgDownthrowDir"] + faults_data["influenceDistance"] = faults["influenceDistance"] + faults_data["verticalRadius"] = faults["verticalRadius"] + faults_data["horizontalRadius"] = faults["horizontalRadius"] + faults_data["colour"] = faults["colour"] + faults_data["centreEasting"] = faults["centreX"] + faults_data["centreNorthing"] = faults["centreY"] + faults_data["centreAltitude"] = faults["centreZ"] + faults_data["avgSlipDirEasting"] = faults["avgSlipDirX"] + faults_data["avgSlipDirNorthing"] = faults["avgSlipDirY"] + faults_data["avgSlipDirAltitude"] = faults["avgSlipDirZ"] + faults_data["avgNormalEasting"] = faults["avgNormalX"] + faults_data["avgNormalNorthing"] = faults["avgNormalY"] + faults_data["avgNormalAltitude"] = faults["avgNormalZ"] + LPF.Set(self.loop_filename, "faultLog", data=faults_data) + + # Save structural information + observations = numpy.zeros(len(self.structure_samples), LPF.stratigraphicObservationType) + observations["layer"] = "s0" + observations["layerId"] = self.structure_samples["layerID"] + observations["easting"] = self.structure_samples["X"] + observations["northing"] = self.structure_samples["Y"] + observations["altitude"] = self.structure_samples["Z"] + observations["dipDir"] = self.structure_samples["DIPDIR"] + observations["dip"] = self.structure_samples["DIP"] + observations["dipPolarity"] = self.structure_samples["OVERTURNED"] + LPF.Set(self.loop_filename, "stratigraphicObservations", data=observations) + + if self.topology.fault_fault_relationships is not None: + ff_relationships = self.deformation_history.get_fault_relationships_with_ids( + self.topology.fault_fault_relationships + ) + relationships = numpy.zeros(len(ff_relationships), LPF.eventRelationshipType) + + relationships["eventId1"] = ff_relationships["eventId1"] + relationships["eventId2"] = ff_relationships["eventId2"] + relationships["bidirectional"] = True + relationships["angle"] = ff_relationships["Angle"] + relationships["type"] = LPF.EventRelationshipType.FAULT_FAULT_ABUT + logger.info("Adding fault relationships to projectfile") + logger.info(f"Fault relationships: {relationships}") + LPF.Set(self.loop_filename, "eventRelationships", data=relationships) + + @beartype.beartype + def draw_geology_map(self, points: pandas.DataFrame = None, overlay: str = ""): + """ + Plots the geology map with optional points or specific data + + Args: + points (pandas.DataFrame, optional): + A dataframe to overlay on the geology map (must contains "X" and "Y" columns). Defaults to None. + overlay (str, optional): + Layer of points to overlay (options are "contacts", "basal_contacts", "orientations", "faults"). Defaults to "". + """ + colour_lookup = ( + self.stratigraphic_column.stratigraphicUnits[["name", "colour"]] + .set_index("name") + .to_dict()["colour"] + ) + geol = self.map_data.get_map_data(Datatype.GEOLOGY).copy() + geol["colour"] = geol.apply(lambda row: colour_lookup[row.UNITNAME], axis=1) + geol["colour_rgba"] = geol.apply(lambda row: hex_to_rgb(row["colour"]), axis=1) + if points is None and overlay == "": + geol.plot(color=geol["colour_rgba"]) + return + else: + base = geol.plot(color=geol["colour_rgba"]) + if overlay != "": + if overlay == "basal_contacts": + self.contact_extractor.basal_contacts[self.contact_extractor.basal_contacts["type"] == "BASAL"].plot( + ax=base + ) + + return + elif overlay == "contacts": + points = self.map_data.sampled_contacts + elif overlay == "orientations": + points = self.structure_samples + elif overlay == "faults": + points = self.fault_samples + else: + print(f"Invalid overlay option {overlay}") + return + gdf = geopandas.GeoDataFrame( + points, geometry=geopandas.points_from_xy(points["X"], points["Y"], crs=geol.crs) + ) + gdf.plot(ax=base, marker="o", color="red", markersize=5) + + @beartype.beartype + def save_mapdata_to_files(self, save_path: Union[pathlib.Path,str], extension: str = ".shp.zip"): + """ + Saves the map data frames to csv files + + Args: + save_path (str, optional): + The path to save the file to. Defaults to ".". + extension (str, optional): + An alternate extension to save the GeoDataFrame in. Defaults to ".csv". + """ + + save_path=pathlib.Path(save_path) + if not save_path.exists(): + os.makedirs(save_path) + self.map_data.save_all_map_data(save_path, extension) + + @beartype.beartype + def save_geotiff_raster( + self, filename: str = "test.tif", projection: str = "", pixel_size: int = 25 + ): + """ + Saves the geology map to a geotiff + + Args: + filename (str, optional): + The filename of the geotiff file to save to. Defaults to "test.tif". + projection (str, optional): + A string of the format "EPSG:3857" that is the projection to output. Defaults to the project working projection + pixel_size (int, optional): + The size of a pixel in metres for the geotiff. Defaults to 25 + """ + colour_lookup = ( + self.stratigraphic_column.stratigraphicUnits[["name", "colour"]] + .set_index("name") + .to_dict()["colour"] + ) + geol = self.map_data.get_map_data(Datatype.GEOLOGY).copy() + geol["colour"] = geol.apply(lambda row: colour_lookup[row.UNITNAME], axis=1) + geol["colour_red"] = geol.apply(lambda row: int(row["colour"][1:3], 16), axis=1) + geol["colour_green"] = geol.apply(lambda row: int(row["colour"][3:5], 16), axis=1) + geol["colour_blue"] = geol.apply(lambda row: int(row["colour"][5:7], 16), axis=1) + source_ds = gdal.OpenEx(geol.to_json()) + source_layer = source_ds.GetLayer() + x_min, x_max, y_min, y_max = source_layer.GetExtent() + + # Create the destination data source + x_res = int((x_max - x_min) / pixel_size) + y_res = int((y_max - y_min) / pixel_size) + target_ds = gdal.GetDriverByName("GTiff").Create(filename, x_res, y_res, 4, gdal.GDT_Byte) + target_ds.SetGeoTransform((x_min, pixel_size, 0, y_max, 0, -pixel_size)) + band = target_ds.GetRasterBand(1) + band.SetNoDataValue(0) + + # Rasterize + gdal.RasterizeLayer(target_ds, [1], source_layer, options=["ATTRIBUTE=colour_red"]) + gdal.RasterizeLayer(target_ds, [2], source_layer, options=["ATTRIBUTE=colour_green"]) + gdal.RasterizeLayer(target_ds, [3], source_layer, options=["ATTRIBUTE=colour_blue"]) + gdal.RasterizeLayer(target_ds, [4], source_layer, burn_values=[255]) + if re.search("^epsg:[0-9]+$", projection.lower()): + print("Projection is :", projection) + target_ds.SetProjection(projection) + else: + print("CRS is:", geol.crs.to_string()) + target_ds.SetProjection(geol.crs.to_string()) + target_ds = None + source_layer = None + source_ds = None \ No newline at end of file diff --git a/packages/map2loop/src/map2loop/sampler.py b/packages/map2loop/src/map2loop/sampler.py new file mode 100644 index 000000000..1e928dac6 --- /dev/null +++ b/packages/map2loop/src/map2loop/sampler.py @@ -0,0 +1,195 @@ +# internal imports +from .utils import set_z_values_from_raster_df + +# external imports +from abc import ABC, abstractmethod +import beartype +import geopandas +import pandas +import shapely +import numpy +from typing import Optional +from osgeo import gdal + + +class Sampler(ABC): + """ + Base Class of Sampler used to force structure of Sampler + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__(self, dtm_data=None, geology_data=None): + """ + Initialiser of for Sampler + """ + self.sampler_label = "SamplerBaseClass" + self.dtm_data = dtm_data + self.geology_data = geology_data + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.sampler_label + + @beartype.beartype + @abstractmethod + def sample( + self, spatial_data: geopandas.GeoDataFrame + ) -> pandas.DataFrame: + """ + Execute sampling method (abstract method) + + Args: + spatial_data (geopandas.GeoDataFrame): data frame to sample + + Returns: + pandas.DataFrame: data frame containing samples + """ + pass + def __call__(self, **kwargs): + return self.sample(**kwargs) + +class SamplerDecimator(Sampler): + """ + Decimator sampler class which decimates the geo data frame based on the decimation value + ie. decimation = 10 means take every tenth point + Note: This only works on data frames with lists of points with columns "X" and "Y" + """ + + @beartype.beartype + def __init__(self, decimation: int = 1, dtm_data: Optional[gdal.Dataset] = None, geology_data: Optional[geopandas.GeoDataFrame] = None): + """ + Initialiser for decimator sampler + + Args: + decimation (int, optional): stride of the points to sample. Defaults to 1. + dtm_data (Optional[gdal.Dataset], optional): digital terrain map data. Defaults to None. + geology_data (Optional[geopandas.GeoDataFrame], optional): geology data. Defaults to None. + """ + super().__init__(dtm_data, geology_data) + self.sampler_label = "SamplerDecimator" + decimation = max(decimation, 1) + self.decimation = decimation + + + @beartype.beartype + def sample( + self, spatial_data: geopandas.GeoDataFrame + ) -> pandas.DataFrame: + """ + Execute sample method takes full point data, samples the data and returns the decimated points + + Args: + spatial_data (geopandas.GeoDataFrame): the data frame to sample + + Returns: + pandas.DataFrame: the sampled data points + """ + data = spatial_data.copy() + data["X"] = data.geometry.x + data["Y"] = data.geometry.y + if self.dtm_data is not None: + result = set_z_values_from_raster_df(self.dtm_data, data) + if result is not None: + data["Z"] = result["Z"] + else: + data["Z"] = None + else: + data["Z"] = None + if self.geology_data is not None: + data["layerID"] = geopandas.sjoin( + data, self.geology_data, how='left' + )['index_right'] + else: + data["layerID"] = None + data.reset_index(drop=True, inplace=True) + + return pandas.DataFrame(data[:: self.decimation].drop(columns="geometry")) + + +class SamplerSpacing(Sampler): + """ + Spacing based sampler which decimates the geo data frame based on the distance between points along a line or + in the case of a polygon along the boundary of that polygon + ie. spacing = 500 means take a sample every 500 metres + Note: This only works on data frames that contain MultiPolgon, Polygon, MultiLineString and LineString geometry + """ + + @beartype.beartype + def __init__(self, spacing: float = 50.0, dtm_data: Optional[gdal.Dataset] = None, geology_data: Optional[geopandas.GeoDataFrame] = None): + """ + Initialiser for spacing sampler + + Args: + spacing (float, optional): The distance between samples. Defaults to 50.0. + dtm_data (Optional[gdal.Dataset], optional): digital terrain map data. Defaults to None. + geology_data (Optional[geopandas.GeoDataFrame], optional): geology data. Defaults to None. + """ + super().__init__(dtm_data, geology_data) + self.sampler_label = "SamplerSpacing" + spacing = max(spacing, 1.0) + self.spacing = spacing + + def __call__(self, **kwargs): + return self.sample(**kwargs) + @beartype.beartype + def sample( + self, spatial_data: geopandas.GeoDataFrame + ) -> pandas.DataFrame: + """ + Execute sample method takes full point data, samples the data and returns the sampled points + + Args: + spatial_data (geopandas.GeoDataFrame): the data frame to sample (must contain column ["ID"]) + + Returns: + pandas.DataFrame: the sampled data points + """ + schema = {"ID": str, "X": float, "Y": float, "featureId": str} + df = pandas.DataFrame(columns=schema.keys()).astype(schema) + for _, row in spatial_data.iterrows(): + if type(row.geometry) is shapely.geometry.multipolygon.MultiPolygon: + targets = row.geometry.boundary.geoms + elif type(row.geometry) is shapely.geometry.polygon.Polygon: + targets = [row.geometry.boundary] + elif type(row.geometry) is shapely.geometry.multilinestring.MultiLineString: + targets = row.geometry.geoms + elif type(row.geometry) is shapely.geometry.linestring.LineString: + targets = [row.geometry] + else: + targets = [] + + # For the main cases Polygon and LineString the list 'targets' has one element + for a, target in enumerate(targets): + df2 = pandas.DataFrame(columns=schema.keys()).astype(schema) + distances = numpy.arange(0, target.length, self.spacing)[:-1] + points = [target.interpolate(distance) for distance in distances] + df2["X"] = [point.x for point in points] + df2["Y"] = [point.y for point in points] + + # # account for holes//rings in polygons + df2["featureId"] = str(a) + # 1. check if line is "closed" + if target.is_ring: + target_polygon = shapely.geometry.Polygon(target) + if target_polygon.exterior.is_ccw: # if counterclockwise --> hole + for j, target2 in enumerate(targets): + # skip if line or point + if len(target2.coords) >= 2: + continue + # which poly is the hole in? assign featureId of the same poly + t2_polygon = shapely.geometry.Polygon(target2) + if target.within(t2_polygon): # + df2['featureId'] = str(j) + + df2["ID"] = row["ID"] if "ID" in spatial_data.columns else 0 + df = df2 if len(df) == 0 else pandas.concat([df, df2]) + + df.reset_index(drop=True, inplace=True) + return df diff --git a/packages/map2loop/src/map2loop/sorter.py b/packages/map2loop/src/map2loop/sorter.py new file mode 100644 index 000000000..123d357ce --- /dev/null +++ b/packages/map2loop/src/map2loop/sorter.py @@ -0,0 +1,649 @@ +from abc import ABC, abstractmethod +import beartype +import pandas +import numpy as np +import math +from typing import Union, Optional, List +from map2loop.topology import Topology +import geopandas +from osgeo import gdal +from map2loop.utils import value_from_raster +from .logging import getLogger +import networkx as nx + +logger = getLogger(__name__) + + +class Sorter(ABC): + """ + Base Class of Sorter used to force structure of Sorter + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__(self): + """ + Initialiser for Sorter + + Args: + unit_relationships (pandas.DataFrame): the relationships between units (columns must contain ["Index1", "Unitname1", "Index2", "Unitname2"]) + contacts (pandas.DataFrame): unit contacts with length of the contacts in metres + geology_data (geopandas.GeoDataFrame): the geology data + structure_data (geopandas.GeoDataFrame): the structure data + dtm_data (gdal.Dataset): the dtm data + """ + self.sorter_label = "SorterBaseClass" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.sorter_label + + @beartype.beartype + @abstractmethod + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method (abstract method) + + Args: + units (pandas.DataFrame): the data frame to sort (columns must contain ["layerId", "name", "minAge", "maxAge", "group"]) + + Returns: + list: sorted list of unit names + """ + pass + + def __call__(self, **kwargs): + return self.sort(**kwargs) + + +class SorterUseNetworkX(Sorter): + """ + Sorter class which returns a sorted list of units based on the unit relationships using a topological graph sorting algorithm + """ + + required_arguments: List[str] = ['geology_data', 'unit_name_column'] + + def __init__( + self, + *, + unit_name_column: Optional[str] = 'name', + unit_relationships: Optional[pandas.DataFrame] = None, + geology_data: Optional[geopandas.GeoDataFrame] = None, + ): + """ + Initialiser for networkx graph sorter + + Args: + unit_relationships (pandas.DataFrame): the relationships between units + """ + super().__init__() + self.sorter_label = "SorterUseNetworkX" + self.unit_name_column = unit_name_column + if geology_data is not None: + self.set_geology_data(geology_data) + elif unit_relationships is not None: + self.unit_relationships = unit_relationships + else: + self.unit_relationships = None + + def set_geology_data(self, geology_data: geopandas.GeoDataFrame): + """ + Set geology data and calculate topology and unit relationships + + Args: + geology_data (geopandas.GeoDataFrame): the geology data + """ + self._calculate_topology(geology_data) + + def _calculate_topology(self, geology_data: geopandas.GeoDataFrame): + if geology_data is None: + raise ValueError("geology_data is required") + + if isinstance(geology_data, geopandas.GeoDataFrame) is False: + raise TypeError("geology_data must be a geopandas.GeoDataFrame") + + if 'UNITNAME' not in geology_data.columns: + raise ValueError("geology_data must contain 'UNITNAME' column") + + self.topology = Topology(geology_data=geology_data) + self.unit_relationships = self.topology.get_unit_unit_relationships() + + @beartype.beartype + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method takes unit data and returns the sorted unit names based on this algorithm. + + Args: + units (pandas.DataFrame): the data frame to sort + + Returns: + list: the sorted unit names + """ + import networkx as nx + + if self.unit_relationships is None: + raise ValueError("SorterUseNetworkX requires 'unit_relationships' argument") + graph = nx.DiGraph() + name_to_index = {} + for row in units.iterrows(): + graph.add_node(int(row[1]["layerId"]), name=row[1]["name"]) + name_to_index[row[1]["name"]] = int(row[1]["layerId"]) + for row in self.unit_relationships.iterrows(): + graph.add_edge(name_to_index[row[1]["UNITNAME_1"]], name_to_index[row[1]["UNITNAME_2"]]) + + cycles = list(nx.simple_cycles(graph)) + for i in range(0, len(cycles)): + if graph.has_edge(cycles[i][0], cycles[i][1]): + graph.remove_edge(cycles[i][0], cycles[i][1]) + logger.warning( + " SorterUseNetworkX: Cycle found and contact edge removed:", + units["name"][cycles[i][0]], + units["name"][cycles[i][1]], + ) + + indexes = list(nx.topological_sort(graph)) + order = [units["name"][i] for i in list(indexes)] + logger.info("Stratigraphic order calculated using networkx topological sort") + logger.info(','.join(order)) + return order + + +class SorterUseHint(SorterUseNetworkX): + required_arguments: List[str] = ['unit_relationships'] + + def __init__(self, *, geology_data: Optional[geopandas.GeoDataFrame] = None): + logger.warning("SorterUseHint is deprecated in v3.2. Using SorterUseNetworkX instead") + super().__init__(geology_data=geology_data) + + +class SorterAgeBased(Sorter): + """ + Sorter class which returns a sorted list of units based on the min and max ages of the units + """ + + required_arguments = ['min_age_column', 'max_age_column', 'unit_name_column'] + + def __init__( + self, + *, + unit_name_column: Optional[str] = 'name', + min_age_column: Optional[str] = 'minAge', + max_age_column: Optional[str] = 'maxAge', + ): + """ + Initialiser for age based sorter + """ + super().__init__() + self.unit_name_column = unit_name_column + self.min_age_column = min_age_column + self.max_age_column = max_age_column + self.sorter_label = "SorterAgeBased" + + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method takes unit data and returns the sorted unit names based on this algorithm. + + Args: + units (pandas.DataFrame): the data frame to sort + + Returns: + list: the sorted unit names + """ + logger.info("Calling age based sorter") + sorted_units = units.copy() + + if self.min_age_column in units.columns and self.max_age_column in units.columns: + # print(sorted_units["minAge"], sorted_units["maxAge"]) + sorted_units["meanAge"] = sorted_units.apply( + lambda row: (row[self.min_age_column] + row[self.max_age_column]) / 2.0, axis=1 + ) + else: + logger.error( + f"Columns {self.min_age_column} and {self.max_age_column} must be present in units DataFrame" + ) + logger.error(f"Available columns are: {units.columns.tolist()}") + raise ValueError( + f"Columns {self.min_age_column} and {self.max_age_column} must be present in units DataFrame" + ) + if "group" in units.columns: + sorted_units = sorted_units.sort_values(by=["group", "meanAge"]) + else: + sorted_units = sorted_units.sort_values(by=["meanAge"]) + logger.info("Stratigraphic order calculated using age based sorting") + for _i, row in sorted_units.iterrows(): + logger.info( + f"{row[self.unit_name_column]} - {row[self.min_age_column]} - {row[self.max_age_column]}" + ) + + return list(sorted_units[self.unit_name_column]) + + +class SorterAlpha(Sorter): + """ + Sorter class which returns a sorted list of units based on the adjacency of units + prioritising the units with lower number of contacting units + """ + + required_arguments = ['contacts', 'unit_name_column', 'unitname1_column', 'unitname2_column'] + + def __init__( + self, + *, + contacts: Optional[geopandas.GeoDataFrame] = None, + unit_name_column: Optional[str] = 'name', + unitname1_column: Optional[str] = 'UNITNAME_1', + unitname2_column: Optional[str] = 'UNITNAME_2', + ): + """ + Initialiser for adjacency based sorter + + Args: + contacts (geopandas.GeoDataFrame): unit contacts with length of the contacts in metres + """ + super().__init__() + self.contacts = contacts + self.unit_name_column = unit_name_column + self.sorter_label = "SorterAlpha" + self.unitname1_column = unitname1_column + self.unitname2_column = unitname2_column + if ( + self.unitname1_column not in contacts.columns + or self.unitname2_column not in contacts.columns + or 'length' not in contacts.columns + ): + raise ValueError( + f"contacts GeoDataFrame must contain '{self.unitname1_column}', '{self.unitname2_column}' and 'length' columns" + ) + + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method takes unit data and returns the sorted unit names based on this algorithm. + + Args: + units (pandas.DataFrame): the data frame to sort + + Returns: + list: the sorted unit names + """ + if self.contacts is None: + raise ValueError( + "contacts must be set (not None) before calling sort() in SorterAlpha." + ) + if len(self.contacts) == 0: + raise ValueError("contacts GeoDataFrame is empty in SorterAlpha.") + if 'length' not in self.contacts.columns: + self.contacts['length'] = self.contacts.geometry.length + self.contacts['length'] = self.contacts['length'].astype(float) + sorted_contacts = self.contacts.sort_values(by="length", ascending=False)[ + [self.unitname1_column, self.unitname2_column, "length"] + ] + unit_names = list(units[self.unit_name_column].unique()) + graph = nx.Graph() + for unit in unit_names: + graph.add_node(unit, name=unit) + max_weight = max(list(sorted_contacts["length"])) + 1 + for _, row in sorted_contacts.iterrows(): + graph.add_edge( + row[self.unitname1_column], + row[self.unitname2_column], + weight=int(max_weight - row["length"]), + ) + + cnode = None + new_graph = nx.DiGraph() + while graph.number_of_nodes() > 0: + if cnode is None: + df = pandas.DataFrame(columns=["unit", "num_neighbours"]) + df["unit"] = list(graph.nodes) + df["num_neighbours"] = df.apply( + lambda row: len(list(graph.neighbors(row["unit"]))), axis=1 + ) + df.sort_values(by=["num_neighbours"], inplace=True) + df.reset_index(inplace=True, drop=True) + cnode = df["unit"][0] + new_graph.add_node(cnode) + neighbour_edge_count = {} + for neighbour in list(graph.neighbors(cnode)): + neighbour_edge_count[neighbour] = len(list(graph.neighbors(neighbour))) + if len(neighbour_edge_count) == 0: + graph.remove_node(cnode) + cnode = None + else: + node_with_min_edges = min(neighbour_edge_count, key=neighbour_edge_count.get) + if neighbour_edge_count[node_with_min_edges] < 2: + new_graph.add_node(node_with_min_edges) + new_graph.add_edge(cnode, node_with_min_edges) + graph.remove_node(node_with_min_edges) + else: + new_graph.add_node(node_with_min_edges) + new_graph.add_edge(cnode, node_with_min_edges) + graph.remove_node(cnode) + cnode = node_with_min_edges + order = list(reversed(list(nx.topological_sort(new_graph)))) + logger.info("Stratigraphic order calculated using adjacency based sorting") + logger.info(','.join(order)) + return order + + +class SorterMaximiseContacts(Sorter): + """ + Sorter class which returns a sorted list of units based on the adjacency of units + prioritising the maximum length of each contact + """ + + required_arguments = ['contacts', 'unit_name_column', 'unitname1_column', 'unitname2_column'] + + def __init__( + self, + *, + contacts: Optional[geopandas.GeoDataFrame] = None, + unit_name_column: str = 'name', + unitname1_column: str = 'UNITNAME_1', + unitname2_column: str = 'UNITNAME_2', + ): + """ + Initialiser for adjacency based sorter + + Args: + contacts (pandas.DataFrame): unit contacts with length of the contacts in metres + """ + super().__init__() + self.sorter_label = "SorterMaximiseContacts" + # variables for visualising/interrogating the sorter + self.graph = None + self.route = None + self.directed_graph = None + self.contacts = contacts + self.unit_name_column = unit_name_column + self.unitname1_column = unitname1_column + self.unitname2_column = unitname2_column + if ( + self.unitname1_column not in contacts.columns + or self.unitname2_column not in contacts.columns + or 'length' not in contacts.columns + ): + raise ValueError( + f"contacts GeoDataFrame must contain '{self.unitname1_column}', '{self.unitname2_column}' and 'length' columns" + ) + + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method takes unit data and returns the sorted unit names based on this algorithm. + + Args: + units (pandas.DataFrame): the data frame to sort + + Returns: + list: the sorted unit names + """ + import networkx as nx + import networkx.algorithms.approximation as nx_app + + if self.contacts is None: + raise ValueError("SorterMaximiseContacts requires 'contacts' argument") + if len(self.contacts) == 0: + raise ValueError("contacts GeoDataFrame is empty in SorterMaximiseContacts.") + if "length" not in self.contacts.columns: + self.contacts['length'] = self.contacts.geometry.length + self.contacts['length'] = self.contacts['length'].astype(float) + sorted_contacts = self.contacts.sort_values(by="length", ascending=False) + self.graph = nx.Graph() + unit_names = list(units[self.unit_name_column].unique()) + for unit in unit_names: + ## some units may not have any contacts e.g. if they are intrusives or sills. If we leave this then the + ## sorter crashes + if ( + unit not in sorted_contacts[self.unitname1_column].values + or unit not in sorted_contacts[self.unitname2_column].values + ): + continue + self.graph.add_node(unit, name=unit) + + max_weight = max(list(sorted_contacts["length"])) + 1 + sorted_contacts['length'] /= max_weight + for _, row in sorted_contacts.iterrows(): + self.graph.add_edge( + row[self.unitname1_column], row[self.unitname2_column], weight=(1 - row["length"]) + ) + + self.route = nx_app.traveling_salesman_problem(self.graph) + edge_list = list(nx.utils.pairwise(self.route)) + self.directed_graph = nx.DiGraph() + self.directed_graph.add_node(edge_list[0][0]) + for edge in edge_list: + if edge[1] not in self.directed_graph.nodes(): + self.directed_graph.add_node(edge[1]) + self.directed_graph.add_edge(edge[0], edge[1]) + + # we need to reverse the order of the graph to get the correct order + order = list( + reversed( + list( + nx.dfs_preorder_nodes( + self.directed_graph, source=list(self.directed_graph.nodes())[0] + ) + ) + ) + ) + logger.info("Stratigraphic order calculated using adjacency based sorting") + logger.info(','.join(order)) + return order + + +class SorterObservationProjections(Sorter): + """ + Sorter class which returns a sorted list of units based on the adjacency of units + using the direction of observations to predict which unit is adjacent to the current one + """ + + required_arguments = [ + 'contacts', + 'geology_data', + 'structure_data', + 'dtm_data', + 'unit_name_column', + 'unitname1_column', + 'unitname2_column', + ] + + def __init__( + self, + *, + unitname1_column: Optional[str] = 'UNITNAME_1', + unitname2_column: Optional[str] = 'UNITNAME_2', + unit_name_column: Optional[str] = 'name', + contacts: Optional[geopandas.GeoDataFrame] = None, + geology_data: Optional[geopandas.GeoDataFrame] = None, + structure_data: Optional[geopandas.GeoDataFrame] = None, + dtm_data: Optional[gdal.Dataset] = None, + length: Union[float, int] = 1000, + ): + """ + Initialiser for adjacency based sorter + + Args: + contacts (pandas.DataFrame): unit contacts with length of the contacts in metres + geology_data (geopandas.GeoDataFrame): the geology data + structure_data (geopandas.GeoDataFrame): the structure data + dtm_data (gdal.Dataset): the dtm data + length (int): the length of the projection in metres + """ + super().__init__() + self.contacts = contacts + self.geology_data = geology_data + self.structure_data = structure_data + self.dtm_data = dtm_data + self.unit_name_column = unit_name_column + self.sorter_label = "SorterObservationProjections" + self.length = length + self.lines = [] + self.unit1name_column = unitname1_column + self.unit2name_column = unitname2_column + + def sort(self, units: pandas.DataFrame) -> list: + """ + Execute sorter method takes unit data and returns the sorted unit names based on this algorithm. + + Args: + units (pandas.DataFrame): the data frame to sort + + Returns: + list: the sorted unit names + """ + import networkx as nx + import networkx.algorithms.approximation as nx_app + from shapely.geometry import LineString, Point + + if self.contacts is None: + raise ValueError("SorterObservationProjections requires 'contacts' argument") + if self.geology_data is None: + raise ValueError("SorterObservationProjections requires 'geology_data' argument") + geol = self.geology_data.copy() + if "INTRUSIVE" in geol.columns: + geol = geol.drop(geol.index[geol["INTRUSIVE"]]) + if "SILL" in geol.columns: + geol = geol.drop(geol.index[geol["SILL"]]) + if self.structure_data is None: + raise ValueError("structure_data is required for sorting but is None.") + orientations = self.structure_data.copy() + if self.dtm_data is None: + raise ValueError("DTM data (self.dtm_data) is not set. Cannot proceed with sorting.") + inv_geotransform = gdal.InvGeoTransform(self.dtm_data.GetGeoTransform()) + dtm_array = np.array(self.dtm_data.GetRasterBand(1).ReadAsArray().T) + + # Create a map of maps to store younger/older observations + ordered_unit_observations = [] + for _, row in orientations.iterrows(): + # get containing unit + containing_unit = geol[geol.contains(row.geometry)] + if len(containing_unit) > 1: + logger.info(f"Orientation {row.ID} is within multiple units") + logger.info(f"Check geology map around coordinates {row.geometry}") + + if len(containing_unit) < 1: + logger.info(f"Orientation {row.ID} is not in a unit") + logger.info(f"Check geology map around coordinates {row.geometry}") + else: + first_unit_name = containing_unit.iloc[0]["UNITNAME"] + # Get units that a projected line passes through + length = self.length + dipDirRadians = row.DIPDIR * math.pi / 180.0 + dipRadians = row.DIP * math.pi / 180.0 + start = row.geometry + end = Point( + start.x + math.sin(dipDirRadians) * length, + start.y + math.cos(dipDirRadians) * length, + ) + line = LineString([start, end]) + self.lines.append(line) + inter = geol[line.intersects(geol.geometry)] + + if len(inter) > 1: + intersect = line.intersection(inter.geometry.boundary) + # # Remove containing unit + intersect = intersect.drop(containing_unit.index) + + # sort by distance from start point + sub = geol.loc[intersect.index].copy() + sub["distance"] = geol.distance(start) + sub = sub.sort_values(by="distance") + + # Get first unit it hits and the point of intersection + second_unit_name = sub.iloc[0].UNITNAME + + if intersect.loc[sub.index[0]].geom_type == "MultiPoint": + second_intersect_point = intersect.loc[sub.index[0]].geoms[0] + elif intersect.loc[sub.index[0]].geom_type == "Point": + second_intersect_point = intersect.loc[sub.index[0]] + else: + continue + + # Get heights for intersection point and start of ray + height = value_from_raster(inv_geotransform, dtm_array, start.x, start.y) + first_intersect_point = Point(start.x, start.y, height) + height = value_from_raster( + inv_geotransform, + dtm_array, + second_intersect_point.x, + second_intersect_point.y, + ) + second_intersect_point = Point(second_intersect_point.x, start.y, height) + + # Check vertical difference between points and compare to projected dip angle + horizontal_dist = ( + first_intersect_point.x - first_intersect_point.x, + second_intersect_point.y - first_intersect_point.y, + ) + horizontal_dist = math.sqrt(horizontal_dist[0] ** 2 + horizontal_dist[1] ** 2) + projected_height = first_intersect_point.z + horizontal_dist * math.cos( + dipRadians + ) + + if second_intersect_point.z < projected_height: + ordered_unit_observations += [(first_unit_name, second_unit_name)] + else: + ordered_unit_observations += [(second_unit_name, first_unit_name)] + self.ordered_unit_observations = ordered_unit_observations + # Create a matrix of older versus younger frequency from observations + unit_names = geol.UNITNAME.unique() + df = pandas.DataFrame(0, index=unit_names, columns=unit_names) + for younger, older in ordered_unit_observations: + df.loc[younger, older] += 1 + print(df, df.max()) + max_value = max(df.max()) + + # Using the older/younger matrix create a directed graph + g = nx.DiGraph() + remaining_units = unit_names + for unit1 in unit_names: + g.add_node(unit1) + for unit1 in unit_names: + remaining_units = remaining_units[1:] + for unit2 in remaining_units: + if unit1 != unit2: + weight = df.loc[unit1, unit2] - df.loc[unit2, unit1] + if weight < 0: + g.add_edge(unit1, unit2, weight=max_value + weight) + elif weight > 0: + g.add_edge(unit2, unit1, weight=max_value - weight) + if df.loc[unit1, unit2] > 0 and df.loc[unit2, unit1] > 0 and weight == 0: + # if both units have the same weight add a bidirectional edge + pass + print('') + g.add_edge(unit2, unit1, weight=max_value) + g.add_edge(unit1, unit2, weight=max_value) + self.G = g + # Link in unlinked units from contacts with max weight + g_undirected = g.to_undirected() + for unit in unit_names: + if len(list(g_undirected.neighbors(unit))) < 1: + mask1 = self.contacts[self.unit1name_column] == unit + mask2 = self.contacts[self.unit2name_column] == unit + for _, row in self.contacts[mask1 | mask2].iterrows(): + if unit == row[self.unit1name_column]: + g.add_edge(row[self.unit2name_column], unit, weight=max_value * 10) + else: + g.add_edge(row[self.unit1name_column], unit, weight=max_value * 10) + + # Run travelling salesman using the observation evidence as weighting + route = nx_app.traveling_salesman_problem(g.to_undirected()) + self.route = route + edge_list = list(nx.utils.pairwise(route)) + self.edge_list = edge_list + dd = nx.DiGraph() + dd.add_node(edge_list[0][0]) + for edge in edge_list: + if edge[1] not in dd.nodes(): + dd.add_node(edge[1]) + dd.add_edge(edge[0], edge[1]) + self.directed = dd + logger.info("Stratigraphic order calculated using observation based sorting") + order = list(nx.dfs_preorder_nodes(dd, source=list(dd.nodes())[0])) + logger.info(','.join(order)) + return order diff --git a/packages/map2loop/src/map2loop/stratigraphic_column.py b/packages/map2loop/src/map2loop/stratigraphic_column.py new file mode 100644 index 000000000..8fa6eedfd --- /dev/null +++ b/packages/map2loop/src/map2loop/stratigraphic_column.py @@ -0,0 +1,186 @@ +import pandas +import numpy +import geopandas + + +class StratigraphicColumn: + """ + A class containing all the fault and fold summaries and relationships + + Attributes + ---------- + column: list + List of stratigraphic units in time order + groups: list + List of stratigraphic groups in time order + stratigraphicUnitColumns: numpy.dtype + Column names and types for stratigraphic unit summary + stratigraphicUnits: pandas.DataFrame + The stratigraphic units + lithologyUnitColumns: numpy.dtype + Column names and types for lithology layer summary + lithologyUnits: pandas.DataFrame + The lithology units + + """ + + def __init__(self): + """ + The initialiser for the stratigraphic units. All attributes are defaulted + """ + self.column = [] + self.groups = [] + + # Create empty dataframes for units + self.stratigraphicUnitColumns = numpy.dtype( + [ + ("layerId", int), + ("name", str), + ("minAge", float), + ("maxAge", float), + ("group", str), + ("supergroup", str), + ("colour", str), + ] + ) + self.stratigraphicUnits = pandas.DataFrame( + numpy.empty(0, dtype=self.stratigraphicUnitColumns) + ) + self.stratigraphicUnits = self.stratigraphicUnits.set_index("name") + + self.lithologyUnitColumns = numpy.dtype( + [ + ("layerId", int), + ("name", str), + ("minAge", float), + ("maxAge", float), + ("group", str), + ("colour", str), + ] + ) + self.lithologyUnits = pandas.DataFrame(numpy.empty(0, dtype=self.lithologyUnitColumns)) + self.lithologyUnits = self.lithologyUnits.set_index("name") + + def findStratigraphicUnit(self, id): + """ + Find the unit in the units list based on its layerId or name + + Args: + id (int or str): + The layerId or name to look for + + Returns: + pandas.DataFrame: The sliced data frame containing the requested unit + """ + if issubclass(type(id), int): + return self.stratigraphicUnits[self.stratigraphicUnits["layerId"] == id] + elif issubclass(type(id), str): + return self.stratigraphicUnits[self.stratigraphicUnits["name"] == id] + else: + print("ERROR: Unknown identifier type used to find stratigraphic unit") + + def findLithologyUnit(self, id): + """ + Find the lithology unit in the units list based on its layerId or name + + Args: + id (int or str): + The layerId or name to look for + + Returns: + pandas.DataFrame: The sliced data frame containing the requested unit + """ + if issubclass(type(id), int): + return self.lithologyUnits[self.lithologyUnits["layerId"] == id] + elif issubclass(type(id), str): + return self.lithologyUnits[self.lithologyUnits["name"] == id] + else: + print("ERROR: Unknown identifier type used to find lithology unit") + + def addStratigraphicUnit(self, unit): + """ + Add stratigraphic unit to the units list + + Args: + fault (pandas.DataFrame or dict): + The unit information to add + """ + if issubclass(type(unit), pandas.DataFrame) or issubclass(type(unit), dict): + if "name" in unit.keys(): + if unit["name"] in self.stratigraphicUnits.index: + print("Replacing stratigraphic unit", unit["name"]) + self.stratigraphicUnits.loc[unit["name"]] = unit + else: + print("No name field in stratigraphic unit", unit) + else: + print("Cannot add unit to dataframe with type", type(unit)) + + def addLithologyUnit(self, unit): + """ + Add lithology unit to the units list + + Args: + fault (pandas.DataFrame or dict): + The unit information to add + """ + if issubclass(type(unit), pandas.DataFrame) or issubclass(type(unit), dict): + if "name" in unit.keys(): + if unit["name"] in self.lithologyUnits.index: + print("Replacing lithology unit", unit["name"]) + self.lithologyUnits.loc[unit["name"]] = unit + else: + print("No name field in lithology unit", unit) + else: + print("Cannot add unit to dataframe with type", type(unit)) + + def populate(self, geology_map_data: geopandas.GeoDataFrame): + """ + Parse the geodataframe data into the stratigraphic units list + + Args: + geology_map_data (geopandas.GeoDataFrame): + The geodataframe with the unit data + """ + if geology_map_data.shape[0] == 0: + return + geology_data = geology_map_data.copy() + geology_data = geology_data.drop_duplicates(subset=["UNITNAME"]) + geology_data = geology_data.reset_index(drop=True) + # geology_data = geology_data.dropna(subset=["UNITNAME"]) + + self.stratigraphicUnits = pandas.DataFrame( + numpy.empty(geology_data.shape[0], dtype=self.stratigraphicUnitColumns) + ) + self.stratigraphicUnits["layerId"] = numpy.arange(geology_data.shape[0]) + self.stratigraphicUnits["name"] = geology_data["UNITNAME"] + self.stratigraphicUnits["minAge"] = geology_data["MIN_AGE"] + self.stratigraphicUnits["maxAge"] = geology_data["MAX_AGE"] + self.stratigraphicUnits["group"] = geology_data["GROUP"] + self.stratigraphicUnits["supergroup"] = geology_data["SUPERGROUP"] + self.stratigraphicUnits["colour"] = "#000000" + # self.stratigraphicUnits["indexInGroup"] = -1 + + self.groups = list(self.stratigraphicUnits['group'].unique()) + + def set_stratigraphic_unit_parameter_by_name(self, name: str, parameter: str, value): + """ + Set a specific parameter on a specific stratigraphic unit + + Args: + name (str): The name of the stratigraphic unit + parameter (str): The colmn name of the parameters + value (str or int or float): The value to set + """ + self.stratigraphicUnits.iloc[self.stratigraphicUnits["name"] == name][parameter] = value + + def sort_from_relationship_list(self, relationshipList: list): + """ + Sort the stratigraphic column based on the list of name + + Args: + relationshipList (list): + The order of the units by name + """ + sorter = dict(zip(relationshipList, range(len(relationshipList)))) + self.stratigraphicUnits["stratigraphic_Order"] = self.stratigraphicUnits["name"].map(sorter) + self.stratigraphicUnits.sort_values(["stratigraphic_Order"], inplace=True) diff --git a/packages/map2loop/src/map2loop/thickness_calculator.py b/packages/map2loop/src/map2loop/thickness_calculator.py new file mode 100644 index 000000000..483975d09 --- /dev/null +++ b/packages/map2loop/src/map2loop/thickness_calculator.py @@ -0,0 +1,1113 @@ +# internal imports +from .utils import ( + create_points, + rebuild_sampled_basal_contacts, + calculate_endpoints, + multiline_to_line, + find_segment_strike_from_pt, + set_z_values_from_raster_df, + value_from_raster, + segment_measure_range, + clean_line_geometry, + nearest_orientation_to_line, + iter_line_segments +) +from .interpolators import DipDipDirectionInterpolator + +from .logging import getLogger +logger = getLogger(__name__) + +# external imports +from abc import ABC, abstractmethod +from typing import Optional, List +from collections import defaultdict +import scipy.interpolate +import beartype +import numpy +import scipy +from scipy.spatial import cKDTree +import pandas +import geopandas +import shapely +from shapely.geometry import LineString +import math +from osgeo import gdal +from shapely.errors import UnsupportedGEOSVersionError + +class ThicknessCalculator(ABC): + """ + Base Class of Thickness Calculator used to force structure of ThicknessCalculator + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__( + self, + dtm_data: Optional[gdal.Dataset] = None, + bounding_box: Optional[dict] = None, + max_line_length: Optional[float] = None, + is_strike: Optional[bool] = False, + ): + """ + Initialiser of for ThicknessCalculator + """ + self.thickness_calculator_label = "ThicknessCalculatorBaseClass" + self.max_line_length = max_line_length + self.dtm_data = dtm_data + self.bounding_box = bounding_box + self.is_strike = is_strike + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.thickness_calculator_label + + @beartype.beartype + @abstractmethod + def compute( + self, + units: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + structure_data: pandas.DataFrame, + geology_data: geopandas.GeoDataFrame, + sampled_contacts: pandas.DataFrame, + ) -> pandas.DataFrame: + """ + Execute thickness calculator method (abstract method) + + Args: + units (pandas.DataFrame): the data frame of units to add thicknesses to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + structure_data (pandas.DataFrame): sampled structural data + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: units dataframe with added thickness column for calculated thickness values + + Note: + ----- + Geological units' thicknesses are returned in meters. The thickness is calculated based on the stratigraphic order of the units. + If the thickness is not calculated for a given unit, the assigned thickness is -1. + For the bottom and top units of the stratigraphic sequence, the assigned thickness is -1. + """ + + if len(stratigraphic_order) < 3: + logger.warning( + f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" + ) + return units + + def _check_thickness_percentage_calculations(self, thicknesses: pandas.DataFrame): + units_with_no_thickness = len(thicknesses[thicknesses['ThicknessMean'] == -1]) + total_units = len(thicknesses) + + if total_units > 0 and (units_with_no_thickness / total_units) >= 0.75: + logger.warning( + f"More than {int(0.75 * 100)}% of units ({units_with_no_thickness}/{total_units}) " + f"have a calculated thickness of -1. This may indicate that {self.thickness_calculator_label} " + f"is not suitable for this dataset." + ) + def __call__(self, **kwargs): + return self.compute(**kwargs) + +class ThicknessCalculatorAlpha(ThicknessCalculator): + """ + ThicknessCalculator class which estimates unit thickness based on units, basal_contacts and stratigraphic order + """ + + def __init__(self): + """ + Initialiser for alpha version of the thickness calculator + """ + self.thickness_calculator_label = "ThicknessCalculatorAlpha" + + @beartype.beartype + def compute( + self, + units: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + structure_data: pandas.DataFrame, + geology_data: geopandas.GeoDataFrame, + sampled_contacts: pandas.DataFrame, + ) -> pandas.DataFrame: + """ + Execute thickness calculator method takes unit data, basal_contacts and stratigraphic order and attempts to estimate unit thickness. + Note: Thicknesses of the top and bottom units are not possible with this data and so are assigned the average of all other calculated unit thicknesses. + + Args: + units (pandas.DataFrame): the data frame of units to add thicknesses to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + structure_data (pandas.DataFrame): sampled structural data + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: units dataframe with added thickness column for calculated thickness values + """ + # TODO: If we have orientation data near basal contact points we can estimate + # the actual distance between contacts rather than just using the horizontal distance + no_distance = -1.0 + basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"] + thicknesses = units.copy() + + # Set default values + thicknesses["ThicknessMean"] = no_distance + thicknesses["ThicknessMedian"] = no_distance + thicknesses["ThicknessStdDev"] = no_distance + + basal_unit_list = basal_contacts["basal_unit"].to_list() + sampled_basal_contacts = rebuild_sampled_basal_contacts( + basal_contacts=basal_contacts, sampled_contacts=sampled_contacts + ) + + if len(stratigraphic_order) < 3: + logger.warning( + f"ThicknessCalculatorAlpha: Cannot make any thickness calculations with only {len(stratigraphic_order)} units" + ) + return thicknesses + + for i in range(1, len(stratigraphic_order) - 1): + # Compare basal contacts of adjacent units + if ( + stratigraphic_order[i] in basal_unit_list + and stratigraphic_order[i + 1] in basal_unit_list + ): + contact1 = sampled_basal_contacts[ + sampled_basal_contacts["basal_unit"] == stratigraphic_order[i] + ]["geometry"].to_list()[0] + contact2 = sampled_basal_contacts[ + sampled_basal_contacts["basal_unit"] == stratigraphic_order[i + 1] + ]["geometry"].to_list()[0] + if contact1 is not None and contact2 is not None: + distance = contact1.distance(contact2) + else: + logger.warning( + f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" + ) + distance = no_distance + else: + logger.warning( + f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" + ) + + distance = no_distance + + # Maximum thickness is the horizontal distance between the minimum of these distances + # Find row in unit_dataframe corresponding to unit and replace thickness value if it is -1 or larger than distance + idx = thicknesses.index[thicknesses["name"] == stratigraphic_order[i]].tolist()[0] + if thicknesses.loc[idx, "ThicknessMean"] == -1: + val = distance + else: + val = min(distance, thicknesses.at[idx, "ThicknessMean"]) + thicknesses.loc[idx, "ThicknessMean"] = val + + self._check_thickness_percentage_calculations(thicknesses) + + return thicknesses + + +class InterpolatedStructure(ThicknessCalculator): + """ + This class is a subclass of the ThicknessCalculator abstract base class. It implements the thickness calculation + method for a given set of interpolated data points. + + Attributes: + thickness_calculator_label (str): A string that stores the label of the thickness calculator. + For this class, it is "InterpolatedStructure". + + Methods: + compute(units: pandas.DataFrame, stratigraphic_order: list, basal_contacts: pandas.DataFrame, map_data: MapData) + -> pandas.DataFrame: Calculates a thickness map for the overall map area. + """ + + def __init__( + self, + dtm_data: Optional[gdal.Dataset] = None, + bounding_box: Optional[dict] = None, + max_line_length: Optional[float] = None, + is_strike: Optional[bool] = False + ): + """ + Initialiser for interpolated structure version of the thickness calculator + """ + super().__init__(dtm_data, bounding_box, max_line_length, is_strike) + self.thickness_calculator_label = "InterpolatedStructure" + self.lines = None + + @beartype.beartype + def compute( + self, + units: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + structure_data: pandas.DataFrame, + geology_data: geopandas.GeoDataFrame, + sampled_contacts: pandas.DataFrame, + ) -> pandas.DataFrame: + """ + Execute thickness calculator method takes unit data, basal_contacts, stratigraphic order, orientation data and + DTM data to estimate unit thickness. + + The method works by iterating over the stratigraphic order of units. For each unit, it finds the basal contact + points and the top contact line. It then calculates the shortest line between these points. For each basal + contact point, it finds the interpolated points that are within 10% of the length of the shortest line. It then + calculates the true thickness of the unit at these points using the formula t = L . sin dip, where L is the + length of the line orthogonal to both contacts and dip is the dip of the interpolated points. + The method then calculates the median thickness and standard deviation for the unit. + + Args: + units (pandas.DataFrame): the data frame of units to add thicknesses to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of + the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + structure_data (pandas.DataFrame): sampled structural data + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: units dataframe with added thickness columns: + "ThicknessMedian" is the median thickness of the unit, + "ThicknessStdDev" is the standard deviation of the thickness of the unit + """ + + basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"].copy() + + thicknesses = units.copy() + # Set default value + # thicknesses["ThicknessMedian"] is the median thickness of the unit + thicknesses["ThicknessMedian"] = -1.0 + thicknesses['ThicknessMean'] = -1.0 + # thicknesses["ThicknessStdDev"] is the standard deviation of the thickness of the unit + thicknesses["ThicknessStdDev"] = -1.0 + thicknesses['ThicknessStdDev'] = thicknesses['ThicknessStdDev'].astype('float64') + basal_unit_list = basal_contacts["basal_unit"].to_list() + # increase buffer around basal contacts to ensure that the points are included as intersections + basal_contacts["geometry"] = basal_contacts["geometry"].buffer(0.01) + # get the sampled contacts + contacts = geopandas.GeoDataFrame(sampled_contacts) + # build points from x and y coordinates + geometry2 = geopandas.points_from_xy(contacts['X'], contacts['Y']) + contacts.set_geometry(geometry2, inplace=True) + + # set the crs of the contacts to the crs of the units + contacts = contacts.set_crs(crs=basal_contacts.crs) + if self.dtm_data is not None: + # get the elevation Z of the contacts + contacts = set_z_values_from_raster_df(self.dtm_data, contacts) + # update the geometry of the contact points to include the Z value + contacts["geometry"] = contacts.apply( + lambda row: shapely.geometry.Point(row.geometry.x, row.geometry.y, row["Z"]), axis=1 + ) + else: + contacts["geometry"] = contacts.apply( + lambda row: shapely.geometry.Point(row.geometry.x, row.geometry.y,), axis=1 + ) + # spatial join the contact points with the basal contacts to get the unit for each contact point + contacts = contacts.sjoin(basal_contacts, how="inner", predicate="intersects") + # keep only necessary columns + if 'Z' not in contacts.columns: + contacts = contacts[["X", "Y", "geometry", "basal_unit"]].copy() + if 'Z' in contacts.columns: + contacts = contacts[["X", "Y", "Z", "geometry", "basal_unit"]].copy() + # Interpolate the dip of the contacts + interpolator = DipDipDirectionInterpolator(data_type="dip") + # Interpolate the dip of the contacts + dip = interpolator(self.bounding_box, structure_data, interpolator=scipy.interpolate.Rbf) + # create a GeoDataFrame of the interpolated orientations + interpolated_orientations = geopandas.GeoDataFrame() + # add the dip and dip direction to the GeoDataFrame + interpolated_orientations["dip"] = dip + # interpolated_orientations["dip_direction"] = dip_direction + # get the x and y coordinates of the interpolated points + interpolated_orientations["X"] = interpolator.xi + interpolated_orientations["Y"] = interpolator.yi + xy = numpy.array([interpolator.xi, interpolator.yi]).T + # create Point objects from the x and y coordinates + interpolated_orientations.set_geometry(create_points(xy), inplace=True) + # set the crs of the interpolated orientations to the crs of the units + interpolated_orientations = interpolated_orientations.set_crs(crs=basal_contacts.crs) + if self.dtm_data is not None: + # get the elevation Z of the interpolated points + interpolated_orientations = set_z_values_from_raster_df(self.dtm_data, interpolated_orientations) + # update the geometry of the interpolated points to include the Z value + interpolated_orientations["geometry"] = interpolated_orientations.apply( + lambda row: shapely.geometry.Point(row.geometry.x, row.geometry.y, row["Z"]), axis=1 + ) + # for each interpolated point, assign name of unit using spatial join + units = geology_data.copy() + interpolated_orientations = interpolated_orientations.sjoin( + units, how="inner", predicate="within" + ) + interpolated_orientations = interpolated_orientations[ + ["geometry", "dip", "UNITNAME"] + ].copy() + + _lines = [] + _dips = [] + _location_tracking = [] + + for i in range(0, len(stratigraphic_order) - 1): + if ( + stratigraphic_order[i] in basal_unit_list + and stratigraphic_order[i + 1] in basal_unit_list + ): + basal_contact = contacts.loc[ + contacts["basal_unit"] == stratigraphic_order[i] + ].copy() + top_contact = basal_contacts.loc[ + basal_contacts["basal_unit"] == stratigraphic_order[i + 1] + ].copy() + top_contact_geometry = [ + shapely.geometry.shape(geom.__geo_interface__) for geom in top_contact.geometry + ] + if basal_contact is not None and top_contact is not None: + interp_points = interpolated_orientations.loc[ + interpolated_orientations["UNITNAME"] == stratigraphic_order[i], "geometry" + ].copy() + dip = interpolated_orientations.loc[ + interpolated_orientations["UNITNAME"] == stratigraphic_order[i], "dip" + ].to_numpy() + + _thickness = [] + + for _, row in basal_contact.iterrows(): + # find the shortest line between the basal contact points and top contact points + short_line = shapely.shortest_line(row.geometry, top_contact_geometry) + # check if the short line is + if self.max_line_length is not None and short_line[0].length > self.max_line_length: + continue + if self.dtm_data is not None: + inv_geotransform = gdal.InvGeoTransform(self.dtm_data.GetGeoTransform()) + data_array = numpy.array(self.dtm_data.GetRasterBand(1).ReadAsArray().T) + + # extract the end points of the shortest line + p1 = numpy.zeros(3) + p1[0] = numpy.asarray(short_line[0].coords[0][0]) + p1[1] = numpy.asarray(short_line[0].coords[0][1]) + if self.dtm_data is not None: + # get the elevation Z of the end point p1 + p1[2] = value_from_raster(inv_geotransform, data_array, p1[0], p1[1]) + # create array to store xyz coordinates of the end point p2 + p2 = numpy.zeros(3) + p2[0] = numpy.asarray(short_line[0].coords[-1][0]) + p2[1] = numpy.asarray(short_line[0].coords[-1][1]) + if self.dtm_data is not None: + # get the elevation Z of the end point p2 + p2[2] = value_from_raster(inv_geotransform, data_array, p2[0], p2[1]) + # calculate the length of the shortest line + line_length = scipy.spatial.distance.euclidean(p1, p2) + # find the indices of the points that are within 5% of the length of the shortest line + try: + # GEOS 3.10.0+ + indices = shapely.dwithin(short_line[0], interp_points, line_length * 0.25) + except UnsupportedGEOSVersionError: + indices= numpy.array([shapely.distance(short_line[0],point)<= (line_length * 0.25) for point in interp_points]) + # get the dip of the points that are within + _dip = numpy.deg2rad(dip[indices]) + if len(_dip) > 0: + _lines.extend([short_line[0]]*len(_dip)) + _dips.extend(_dip) + # calculate the true thickness t = L * sin(dip) + thickness = line_length * numpy.sin(_dip) + + # add location tracking + location_tracking = pandas.DataFrame( + { + "p1_x": [p1[0]], "p1_y": [p1[1]], "p1_z": [p1[2]], + "p2_x": [p2[0]], "p2_y": [p2[1]], "p2_z": [p2[2]], + "thickness": [thickness], + "unit": [stratigraphic_order[i]] + } + ) + _location_tracking.append(location_tracking) + + # Average thickness along the shortest line + if all(numpy.isnan(thickness)): + pass + else: + _thickness.append(numpy.nanmean(thickness)) + + # calculate the median thickness and standard deviation for the unit + _thickness = numpy.asarray(_thickness, dtype=numpy.float64) + + median = numpy.nanmedian(_thickness) + mean = numpy.nanmean(_thickness) + std_dev = numpy.nanstd(_thickness, dtype=numpy.float64) + + idx = thicknesses.index[ + thicknesses["name"] == stratigraphic_order[i + 1] + ].tolist()[0] + thicknesses.loc[idx, "ThicknessMean"] = mean + thicknesses.loc[idx, "ThicknessMedian"] = median + thicknesses.loc[idx, "ThicknessStdDev"] = std_dev + + else: + logger.warning( + f"Thickness Calculator InterpolatedStructure: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}\n" + ) + + # Combine all location_tracking DataFrames into a single DataFrame + if _location_tracking and len(_location_tracking) > 0: + combined_location_tracking = pandas.concat(_location_tracking, ignore_index=True) + combined_location_tracking['geometry'] = combined_location_tracking.apply( + lambda row: LineString( + [ + (row['p1_x'], row['p1_y'], row['p1_z']), + (row['p2_x'], row['p2_y'], row['p2_z']), + ] + ), + axis=1, + ) + else: + combined_location_tracking = pandas.DataFrame() + # Save the combined DataFrame as an attribute of the class + + # Convert to GeoDataFrame and set CRS to match basal_contacts + if not combined_location_tracking.empty: + self.location_tracking = geopandas.GeoDataFrame(combined_location_tracking, geometry='geometry', crs=basal_contacts.crs) + else: + self.location_tracking = geopandas.GeoDataFrame(columns=['p1_x', 'p1_y', 'p1_z', 'p2_x', 'p2_y', 'p2_z', 'thickness', 'unit', 'geometry'], crs=basal_contacts.crs) + # Create GeoDataFrame for lines + + self.lines = geopandas.GeoDataFrame(geometry=_lines, crs=basal_contacts.crs) + self.lines['dip'] = _dips + + # Check thickness calculation + self._check_thickness_percentage_calculations(thicknesses) + + return thicknesses + +class StructuralPoint(ThicknessCalculator): + ''' + This class is a subclass of the ThicknessCalculator abstract base class. It implements the thickness calculation using a deterministic workflow based on stratigraphic measurements. + + Attributes: + thickness_calculator_label (str): A string that stores the label of the thickness calculator. + For this class, it is "StrucuturalPoint". + + Methods: + compute(units: pandas.DataFrame, stratigraphic_order: list, basal_contacts: pandas.DataFrame, map_data: MapData) + -> pandas.DataFrame: Calculates the thickness in meters for each unit in the stratigraphic column. + + ''' + + def __init__( + self, + dtm_data: Optional[gdal.Dataset] = None, + bounding_box: Optional[dict] = None, + max_line_length: Optional[float] = None, + is_strike: Optional[bool] = False + ): + super().__init__(dtm_data, bounding_box, max_line_length, is_strike) + self.thickness_calculator_label = "StructuralPoint" + self.strike_allowance = 30 + self.lines = None + + @beartype.beartype + def compute( + self, + units: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + structure_data: pandas.DataFrame, + geology_data: geopandas.GeoDataFrame, + sampled_contacts: pandas.DataFrame, + ) -> pandas.DataFrame: + """ + Method overview: + - define perpendicular line, with strike perpendicular to the stratigraphic measurement's strike + - find intersection points between the perpendicular line and the geological contacts + - Perform the following checks: + 1) is there more than one intersection? + 2) are the intersections between two different lithologies, and if so, grab the neighboring lithologies only. + 3) is the distance between the two intersections less than half the map dimensions? (avoids incorrect intersections to be picked) + 4) is the stratigraphic measurement strike within 30 degrees of the strike of the geological contacts? + + - once the intersections pass the checks, calculate the thickness of the unit at the intersection points, using the general formula L*sin(dip) + + Attributes: + ----------- + units (pandas.DataFrame): the data frame of units to add thicknesses to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of + the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + structure_data (pandas.DataFrame): sampled structural data + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + -------- + pandas.DataFrame: units dataframe with added thickness columns: + "ThicknessMedian" is the median thickness of the unit, + "ThicknessStdDev" is the standard deviation of the thickness of the unit + + Note: + ----- + This method is highly dependent on the existence of stratigraphic measurements that follow the strike of the geological contacts. + If an unit does not contain a stratigraphic measurement, the thickness will not be calculated. Interpolated Structure may be used for such situations and future versions of map2loop will attempt to solve for this. + If the thickness is not calculated for a given unit, the assigned thickness will be -1. + For the bottom and top units of the stratigraphic sequence, the assigned thickness will also be -1. + """ + # input sampled data + sampled_structures = structure_data + basal_contacts = basal_contacts.copy() + + # grab geology polygons and calculate bounding boxes for each lithology + geology = geology_data.copy() + geology[['minx', 'miny', 'maxx', 'maxy']] = geology.bounds + + # create a GeoDataFrame of the sampled structures + sampled_structures = geopandas.GeoDataFrame( + sampled_structures, + geometry=geopandas.points_from_xy(sampled_structures.X, sampled_structures.Y), + crs=basal_contacts.crs, + ) + if 'UNITNAME' in sampled_structures.columns: + sampled_structures = sampled_structures.drop(columns=['UNITNAME']) + # add unitname to the sampled structures + sampled_structures['unit_name'] = geopandas.sjoin( + sampled_structures, geology, how='inner', predicate='within' + )['UNITNAME'] + + # remove nans from sampled structures + # this happens when there are strati measurements within intrusions. If intrusions are removed from the geology map, unit_name will then return a nan + logger.info( + f"skipping row(s) {sampled_structures[sampled_structures['unit_name'].isnull()].index.to_numpy()} in sampled structures dataset, as they do not spatially coincide with a valid geology polygon \n" + ) + sampled_structures = sampled_structures.dropna(subset=['unit_name']) + + # rebuild basal contacts lines based on sampled dataset + sampled_basal_contacts = rebuild_sampled_basal_contacts( + basal_contacts, sampled_contacts + ) + + # calculate map dimensions + map_dx = geology.total_bounds[2] - geology.total_bounds[0] + map_dy = geology.total_bounds[3] - geology.total_bounds[1] + + # create empty lists to store thicknesses and lithologies + thicknesses = [] + lis = [] + _lines = [] + _dip = [] + + # loop over each sampled structural measurement + for s in range(0, len(sampled_structures)): + + # make a shapely point from the measurement + measurement = sampled_structures.iloc[s] + measurement_pt = shapely.geometry.Point(measurement.X, measurement.Y) + + # find unit and strike + litho_in = measurement['unit_name'] + if self.is_strike: + strike = measurement['DIPDIR'] + else: + strike = (measurement['DIPDIR'] - 90) % 360 + + # find bounding box of the lithology + bbox_poly = geology[geology['UNITNAME'] == litho_in][['minx', 'miny', 'maxx', 'maxy']] + + # check if litho_in is in geology + # for a special case when the litho_in is not in the geology + if len(geology[geology['UNITNAME'] == litho_in]) == 0: + logger.info( + f"There are structural measurements in unit - {litho_in} - that are not in the geology shapefile. Skipping this structural measurement" + ) + continue + else: + # make a subset of the geology polygon & find neighbour units + GEO_SUB = geology[geology['UNITNAME'] == litho_in]['geometry'].values[0] + + neighbor_list = list( + basal_contacts[GEO_SUB.intersects(basal_contacts.geometry)]['basal_unit'] + ) + + # draw orthogonal line to the strike (default value 10Km), and clip it by the bounding box of the lithology + if self.max_line_length is None: + self.max_line_length = 10000 + B = calculate_endpoints(measurement_pt, float(strike), float(self.max_line_length), bbox_poly) + b = geopandas.GeoDataFrame({'geometry': [B]}).set_crs(basal_contacts.crs) + + # find all intersections + all_intersections = sampled_basal_contacts.overlay( + b, how='intersection', keep_geom_type=False + ) + all_intersections = all_intersections[ + all_intersections['geometry'].geom_type == 'Point' + ] + + # clip intersections by the neighbouring geology polygons + final_intersections = all_intersections[ + all_intersections['basal_unit'].isin(neighbor_list) + ] + + # sometimes the intersections will return as MultiPoint, so we need to convert them to nearest point + if 'MultiPoint' in final_intersections['geometry'].geom_type.values: + multi = final_intersections[ + final_intersections['geometry'].geom_type == 'MultiPoint' + ].index + for m in multi: + nearest_ = shapely.ops.nearest_points( + final_intersections.loc[m, :].geometry, measurement_pt + )[0] + final_intersections.at[m, 'geometry'] = nearest_ + final_intersections.at[m, 'geometry'] = nearest_ + + # check to see if there's less than 2 intersections + if len(final_intersections) < 2: + continue + + # check to see if the intersections cross two lithologies" + if len(final_intersections['basal_unit'].unique()) == 1: + continue + + # declare the two intersection points + int_pt1 = final_intersections.iloc[0].geometry + int_pt2 = final_intersections.iloc[1].geometry + + # if the intersections are too far apart, skip + if ( + math.sqrt(((int_pt1.x - int_pt2.x) ** 2) + ((int_pt1.y - int_pt2.y) ** 2)) + > map_dx / 2 + or math.sqrt(((int_pt1.x - int_pt2.x) ** 2) + ((int_pt1.y - int_pt2.y) ** 2)) + > map_dy / 2 + ): + continue + + # find the segments that the intersections belong to + seg1 = sampled_basal_contacts[ + sampled_basal_contacts['basal_unit'] == final_intersections.iloc[0]['basal_unit'] + ].geometry.iloc[0] + seg2 = sampled_basal_contacts[ + sampled_basal_contacts['basal_unit'] == final_intersections.iloc[1]['basal_unit'] + ].geometry.iloc[0] + + # simplify the geometries to LineString + if seg1.geom_type == 'MultiLineString': + seg1 = multiline_to_line(seg1) + if seg2.geom_type == 'MultiLineString': + seg2 = multiline_to_line(seg2) + + # find the strike of the segments + strike1 = find_segment_strike_from_pt(seg1, int_pt1, measurement) + strike2 = find_segment_strike_from_pt(seg2, int_pt2, measurement) + + # check to see if the strike of the stratigraphic measurement is within the strike allowance of the strike of the geological contact + b_s = strike - self.strike_allowance, strike + self.strike_allowance + if not (b_s[0] < strike1 < b_s[1] and b_s[0] < strike2 < b_s[1]): + continue + + # build the debug info + line = shapely.geometry.LineString([int_pt1, int_pt2]) + _lines.append(line) + _dip.append(measurement['DIP']) + + # find the lenght of the segment + L = math.sqrt(((int_pt1.x - int_pt2.x) ** 2) + ((int_pt1.y - int_pt2.y) ** 2)) + + # if length is higher than max_line_length, skip + if self.max_line_length is not None and L > self.max_line_length: + continue + + # calculate thickness + thickness = L * math.sin(math.radians(measurement['DIP'])) + + thicknesses.append(thickness) + lis.append(litho_in) + + # create the debug gdf + self.lines = geopandas.GeoDataFrame(geometry=_lines, crs=basal_contacts.crs) + self.lines["DIP"] = _dip + + # create a DataFrame of the thicknesses median and standard deviation by lithology + result = pandas.DataFrame({'unit': lis, 'thickness': thicknesses}) + result = result.groupby('unit')['thickness'].agg(['median', 'mean', 'std']).reset_index() + result.rename(columns={'thickness': 'ThicknessMedian'}, inplace=True) + + output_units = units.copy() + # remove the old thickness column + output_units['ThicknessMedian'] = numpy.full(len(output_units), numpy.nan) + output_units['ThicknessMean'] = numpy.full(len(output_units), numpy.nan) + output_units['ThicknessStdDev'] = numpy.full(len(output_units), numpy.nan) + + # find which units have no thickness calculated + names_not_in_result = units[~units['name'].isin(result['unit'])]['name'].to_list() + # assign the thicknesses to the each unit + for _, unit in result.iterrows(): + idx = units.index[units['name'] == unit['unit']].tolist()[0] + output_units.loc[idx, 'ThicknessMedian'] = unit['median'] + output_units.loc[idx, 'ThicknessMean'] = unit['mean'] + output_units.loc[idx, 'ThicknessStdDev'] = unit['std'] + + output_units["ThicknessMean"] = output_units["ThicknessMean"].fillna(-1) + output_units["ThicknessMedian"] = output_units["ThicknessMedian"].fillna(-1) + output_units["ThicknessStdDev"] = output_units["ThicknessStdDev"].fillna(-1) + + # handle the units that have no thickness + for unit in names_not_in_result: + # if no thickness has been calculated for the unit + if ( + # not a top//bottom unit + (output_units[output_units['name'] == unit]['ThicknessMedian'].all() == 0) + and (unit != stratigraphic_order[-1]) + and (unit != stratigraphic_order[0]) + ): + idx = stratigraphic_order.index(unit) + # throw warning to user + logger.warning( + 'Thickness Calculator StructuralPoint: Cannot calculate thickness between', + unit, + "and ", + stratigraphic_order[idx + 1], + "\n", + ) + # assign -1 as thickness + output_units.loc[output_units["name"] == unit, "ThicknessMedian"] = -1 + output_units.loc[output_units["name"] == unit, "ThicknessMean"] = -1 + output_units.loc[output_units["name"] == unit, "ThicknessStdDev"] = -1 + + # if top//bottom unit assign -1 + if unit in [stratigraphic_order[-1], stratigraphic_order[0]]: + output_units.loc[output_units["name"] == unit, "ThicknessMedian"] = -1 + output_units.loc[output_units["name"] == unit, "ThicknessMean"] = -1 + output_units.loc[output_units["name"] == unit, "ThicknessStdDev"] = -1 + + self._check_thickness_percentage_calculations(output_units) + + return output_units + + +class AlongSection(ThicknessCalculator): + """Thickness calculator that estimates true thicknesses along supplied section lines.""" + + def __init__( + self, + sections: geopandas.GeoDataFrame, + dtm_data: Optional[gdal.Dataset] = None, + bounding_box: Optional[dict] = None, + max_line_length: Optional[float] = None, + is_strike: Optional[bool] = False, + ): + super().__init__(dtm_data, bounding_box, max_line_length, is_strike) # initialise base calculator bits + self.thickness_calculator_label = "AlongSection" # label used externally to identify this strategy + self.sections = ( + sections.copy() # keep a copy so editing outside does not mutate our internal state + if sections is not None + else geopandas.GeoDataFrame({"geometry": []}, geometry="geometry") # ensure predictable structure when no sections supplied + ) + self.section_thickness_records: geopandas.GeoDataFrame = geopandas.GeoDataFrame() # populated as GeoDataFrame during compute + self.section_intersection_points: dict = {} + + def type(self): + """Return the calculator label.""" + return self.thickness_calculator_label + + @beartype.beartype + def compute( + self, + units: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + structure_data: pandas.DataFrame, + geology_data: geopandas.GeoDataFrame, + sampled_contacts: pandas.DataFrame, + ) -> pandas.DataFrame: + """Estimate unit thicknesses along cross sections. + + Args: + units (pandas.DataFrame): Table of stratigraphic units that will be annotated with + thickness statistics. Must expose a ``name`` column used to map aggregated + thickness values back to each unit. + stratigraphic_order (list): Accepted for API compatibility but not used by this + calculator. Retained so the method signature matches the other calculators. + basal_contacts (geopandas.GeoDataFrame): Unused placeholder maintained for parity + with the other calculators. + structure_data (pandas.DataFrame): Orientation measurements containing X/Y columns + and one dip column (``DIP``, ``dip`` or ``Dip``). A KD-tree is built from these + points so each split section segment can grab the nearest dip when converting its + length to true thickness. + geology_data (geopandas.GeoDataFrame): Mandatory polygon dataset describing map + units. Each section is intersected with these polygons to generate unit-aware + line segments whose lengths underpin the thickness calculation. + sampled_contacts (pandas.DataFrame): Part of the public interface but not used in + this implementation. + + Returns: + pandas.DataFrame: Copy of ``units`` with three new columns – ``ThicknessMean``, + ``ThicknessMedian`` and ``ThicknessStdDev`` – populated from the accumulated segment + thickness samples. Units that never receive a measurement retain the sentinel value + ``-1`` in each column. + + Workflow: + 1. Validate the presence of section geometries, geology polygons, and a recognizable + unit-name column. Reproject sections to match the geology CRS when required. + 2. Pre-build helpers: a spatial index over geology polygons for fast section/polygon + queries, and (if possible) a KD-tree of orientation points so the closest dip to a + split segment can be queried in O(log n). + 3. For every section, reduce complex/multi-part geometries to a single `LineString`, + intersect it with candidate geology polygons, and collect the resulting split line + segments along with their length and measure positions along the parent section. + 4. Walk the ordered segments and keep those bounded by two distinct neighbouring units + (i.e., the segment sits between different units on either side). Fetch the nearest + dip (fallback to 90Β° once if no structures exist), convert the segment length to + true thickness using ``length * sin(dip)``, and store the sample plus provenance in + ``self.section_thickness_records``. + 5. Aggregate all collected samples per unit (mean/median/std) and return the enriched + ``units`` table. The helper ``self.section_intersection_points`` captures the raw + split segments grouped by section to aid downstream inspection. + + Notes: + - ``stratigraphic_order``, ``basal_contacts`` and ``sampled_contacts`` are retained for + interface compatibility but do not influence this algorithm. + - When no nearby orientation measurements exist, the method emits a single warning and + assumes a vertical dip (90Β°) for affected segments to avoid silently dropping units. + - ``self.section_thickness_records`` is materialised as a ``GeoDataFrame`` so the split + segments (geometry column) can be visualised directly in notebooks or GIS clients. + """ + + if self.sections is None or self.sections.empty: + logger.warning("AlongSection: No sections provided; skipping thickness calculation.") + return units + + if geology_data is None or geology_data.empty: + logger.warning( + "AlongSection: Geology polygons are required to split sections; skipping thickness calculation." + ) + return units + unit_column = "UNITNAME" + sections = self.sections.copy() + geology = geology_data.copy() + + if geology.crs is not None: + if sections.crs is None: + sections = sections.set_crs(geology.crs) + elif sections.crs != geology.crs: + sections = sections.to_crs(geology.crs) + elif sections.crs is not None: + geology = geology.set_crs(sections.crs) + + try: + geology_sindex = geology.sindex + except Exception as e: + logger.error("Failed to create spatial index for geology data: %s", e, exc_info=True) + geology_sindex = None + + sections_bounds = sections.total_bounds + geology_bounds = geology.total_bounds + if ( + sections_bounds[2] < geology_bounds[0] + or sections_bounds[0] > geology_bounds[2] + or sections_bounds[3] < geology_bounds[1] + or sections_bounds[1] > geology_bounds[3] + ): + logger.warning("AlongSection: Sections do not overlap geology extent; skipping thickness calculation.") + return units + + if geology_sindex is None: + overlaps = False + for geom in sections.geometry: + if geom is None or geom.is_empty: + continue + if geology.intersects(geom).any(): + overlaps = True + break + if not overlaps: + logger.warning("AlongSection: Sections do not overlap geology; skipping thickness calculation.") + return units + else: + overlaps = False + for geom in sections.geometry: + if geom is None or geom.is_empty: + continue + candidate_idx = list(geology_sindex.intersection(geom.bounds)) + if not candidate_idx: + continue + if geology.iloc[candidate_idx].intersects(geom).any(): + overlaps = True + break + if not overlaps: + logger.warning("AlongSection: Sections do not overlap geology; skipping thickness calculation.") + return units + + dip_column = next((col for col in ("DIP", "dip", "Dip") if col in structure_data.columns), None) + orientation_tree = None + orientation_dips = None + orientation_coords = None + if dip_column is not None and {"X", "Y"}.issubset(structure_data.columns): + orient_df = structure_data.dropna(subset=["X", "Y", dip_column]).copy() + if not orient_df.empty: + orient_df["_dip_value"] = pandas.to_numeric(orient_df[dip_column], errors="coerce") + orient_df = orient_df.dropna(subset=["_dip_value"]) + if not orient_df.empty: + try: + orientation_coords = orient_df[["X", "Y"]].astype(float).to_numpy() + except ValueError: + logger.debug( + "Failed to convert orientation coordinates to float for %d rows. Data quality issue likely. Example rows: %s", + len(orient_df), + orient_df[["X", "Y"]].head(3).to_dict(orient="records") + ) + orientation_coords = numpy.empty((0, 2)) + if orientation_coords.size: + orientation_dips = orient_df["_dip_value"].astype(float).to_numpy() + try: + orientation_tree = cKDTree(orientation_coords) + except (ValueError, TypeError) as e: + logger.error(f"Failed to construct cKDTree for orientation data: {e}") + orientation_tree = None + default_dip_warning_emitted = False + + units_lookup = dict(zip(units["name"], units.index)) + thickness_by_unit = {name: [] for name in units_lookup.keys()} + thickness_records: List[dict] = [] + split_segments_by_section: dict = defaultdict(list) + + for section_idx, section_row in sections.iterrows(): + line = clean_line_geometry(section_row.geometry) + if line is None or line.length == 0: + continue + section_id = section_row.get("ID", section_idx) + + candidate_idx = ( + list(geology_sindex.intersection(line.bounds)) + if geology_sindex is not None + else list(range(len(geology))) + ) + if not candidate_idx: + continue + + split_segments = [] + for idx in candidate_idx: + poly = geology.iloc[idx] + polygon_geom = poly.geometry + if polygon_geom is None or polygon_geom.is_empty: + continue + intersection = line.intersection(polygon_geom) + if intersection.is_empty: + continue + for segment in iter_line_segments(intersection): + seg_length = segment.length + if seg_length <= 0: + continue + start_measure, end_measure = segment_measure_range(line, segment) + segment_record = { + "section_id": section_id, + "geometry": segment, + "unit": poly[unit_column], + "length": seg_length, + "start_measure": start_measure, + "end_measure": end_measure, + } + split_segments.append(segment_record) + split_segments_by_section[section_id].append(segment_record) + + if len(split_segments) < 1: + continue + + split_segments.sort(key=lambda item: (item["start_measure"], item["end_measure"])) + + for idx_segment, segment in enumerate(split_segments): + prev_unit = split_segments[idx_segment - 1]["unit"] if idx_segment > 0 else None + next_unit = ( + split_segments[idx_segment + 1]["unit"] + if idx_segment + 1 < len(split_segments) + else None + ) + + if prev_unit is None or next_unit is None: + continue + if prev_unit == segment["unit"] or next_unit == segment["unit"]: + continue + if prev_unit == next_unit: + continue + + dip_value, orientation_idx, orientation_distance = nearest_orientation_to_line( + orientation_tree, + orientation_dips, + orientation_coords, + segment["geometry"] + ) + if numpy.isnan(dip_value): + dip_value = 90.0 + orientation_idx = None + orientation_distance = None + if not default_dip_warning_emitted: + logger.warning( + "AlongSection: Missing structure measurements near some sections; assuming vertical dip (90Β°) for those segments." + ) + default_dip_warning_emitted = True + + thickness = segment["length"] * math.sin(math.radians(dip_value)) + if thickness <= 0: + continue + + unit_name = segment["unit"] + if unit_name not in thickness_by_unit: + thickness_by_unit[unit_name] = [] + thickness_by_unit[unit_name].append(thickness) + + thickness_records.append( + { + "section_id": section_id, + "unit_id": unit_name, + "thickness": thickness, + "segment_length": segment["length"], + "dip_used_deg": dip_value, + "prev_unit": prev_unit, + "next_unit": next_unit, + "orientation_index": orientation_idx, + "orientation_distance": orientation_distance, + "geometry": segment["geometry"], + } + ) + + output_units = units.copy() + output_units["ThicknessMean"] = -1.0 + output_units["ThicknessMedian"] = -1.0 + output_units["ThicknessStdDev"] = -1.0 + + for unit_name, values in thickness_by_unit.items(): + if not values: + continue + idx = units_lookup.get(unit_name) + if idx is None: + continue + arr = numpy.asarray(values, dtype=numpy.float64) + output_units.at[idx, "ThicknessMean"] = float(numpy.nanmean(arr)) + output_units.at[idx, "ThicknessMedian"] = float(numpy.nanmedian(arr)) + output_units.at[idx, "ThicknessStdDev"] = float(numpy.nanstd(arr)) + + if thickness_records: + self.section_thickness_records = geopandas.GeoDataFrame( + thickness_records, + geometry="geometry", + crs=sections.crs, + ) + else: + self.section_thickness_records = geopandas.GeoDataFrame( + columns=[ + "section_id", + "unit_id", + "thickness", + "segment_length", + "dip_used_deg", + "prev_unit", + "next_unit", + "orientation_index", + "orientation_distance", + "geometry", + ], + geometry="geometry", + crs=sections.crs, + ) + self.section_intersection_points = dict(split_segments_by_section) + self._check_thickness_percentage_calculations(output_units) + + return output_units diff --git a/packages/map2loop/src/map2loop/throw_calculator.py b/packages/map2loop/src/map2loop/throw_calculator.py new file mode 100644 index 000000000..96ca4605d --- /dev/null +++ b/packages/map2loop/src/map2loop/throw_calculator.py @@ -0,0 +1,99 @@ +from abc import ABC, abstractmethod +import beartype +import pandas +import geopandas +from .mapdata import MapData + + +class ThrowCalculator(ABC): + """ + Base Class of Throw Calculator used to force structure of ThrowCalculator + + Args: + ABC (ABC): Derived from Abstract Base Class + """ + + def __init__(self): + """ + Initialiser of for Sorter + """ + self.throw_calculator_label = "ThrowCalculatorBaseClass" + + def type(self): + """ + Getter for subclass type label + + Returns: + str: Name of subclass + """ + return self.throw_calculator_label + + @beartype.beartype + @abstractmethod + def compute( + self, + faults: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: geopandas.GeoDataFrame, + map_data: MapData, + ) -> pandas.DataFrame: + """ + Execute throw calculator method (abstract method) + + Args: + faults (pandas.DataFrame): the data frame of the faults to add throw values to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: fault data frame with throw values (avgDisplacement and avgDownthrowDir) filled in + """ + pass + + +class ThrowCalculatorAlpha(ThrowCalculator): + """ + ThrowCalculator class which estimates fault throw values based on units, basal_contacts and stratigraphic order + """ + + def __init__(self): + """ + Initialiser for alpha version of the throw calculator + """ + self.throw_calculator_label = "ThrowCalculatorAlpha" + + @beartype.beartype + def compute( + self, + faults: pandas.DataFrame, + stratigraphic_order: list, + basal_contacts: pandas.DataFrame, + map_data: MapData, + ) -> pandas.DataFrame: + """ + Execute throw calculator method takes fault data, basal_contacts and stratigraphic order and attempts to estimate fault throw. + + Args: + faults (pandas.DataFrame): the data frame of the faults to add throw values to + stratigraphic_order (list): a list of unit names sorted from youngest to oldest + basal_contacts (geopandas.GeoDataFrame): basal contact geo data with locations and unit names of the contacts (columns must contain ["ID","basal_unit","type","geometry"]) + map_data (map2loop.MapData): a catchall so that access to all map data is available + + Returns: + pandas.DataFrame: fault data frame with throw values (avgDisplacement and avgDownthrowDir) filled in + """ + # For each fault take the geometric join of all contact lines and that fault line + + # For each contact join take the length of that join as an approximation of the minimum throw of the fault + + # Take all the min throw approximations and set the largest one as the avgDisplacement + + # If a fault has no contact lines the maximum throw should be less than the thickness of the containing + # unit (if we exclude map height changes and fault angle) + + # Set any remaining displacement values to default value + faults["avgDisplacement"] = faults.apply( + lambda row: 100 if row["avgDisplacement"] == -1 else row["avgDisplacement"], axis=1 + ) + return faults diff --git a/packages/map2loop/src/map2loop/topology.py b/packages/map2loop/src/map2loop/topology.py new file mode 100644 index 000000000..88b4e6435 --- /dev/null +++ b/packages/map2loop/src/map2loop/topology.py @@ -0,0 +1,199 @@ +from typing import Optional +# internal imports +from .m2l_enums import VerboseLevel +from .contact_extractor import ContactExtractor + +# external imports +import geopandas +import pandas +import numpy + +from .logging import getLogger + +logger = getLogger(__name__) + + +class Topology: + """ + Topology calculator for units and faults relationships + + Attributes + ---------- + sorted_units: None or list + the stratigraphic column + fault_fault_relationships: None or pandas.DataFrame + data frame of fault to fault relationships with columns ["Fault1", "Fault2", "Type", "Angle"] + unit_fault_relationships: None or pandas.DataFrame + data frame of unit fault relationships with columns ["Unit", "Fault"] + unit_unit_relationships: None or pandas.DataFrame + data frame of unit unit relationships with columns ["Index1", "UnitName1", "Index2", "UnitName2"] + map_data: MapData + A pointer to the map data structure in project + verbose_level: m2l_enum.VerboseLevel + A selection that defines how much console logging is output + """ + + def __init__( + self, geology_data: geopandas.GeoDataFrame, + fault_data: Optional[geopandas.GeoDataFrame] = None, + verbose_level: VerboseLevel = VerboseLevel.NONE, + id_field: str = 'ID', + ): + """ + The initialiser for the map2model wrapper + + Args: + map_data (MapData): + The project map data structure to reference + verbose_level (VerboseLevel, optional): + How much console output is sent. Defaults to VerboseLevel.ALL. + """ + self.sorted_units = None + self._fault_fault_relationships = None + self._unit_fault_relationships = None + self._unit_unit_relationships = None + self.geology_data = geology_data + self.fault_data = fault_data + self.verbose_level = verbose_level + self.buffer_radius = 500 + self.fault_id_field = id_field + @property + def fault_fault_relationships(self): + if self._fault_fault_relationships is None: + self._calculate_fault_fault_relationships() + + return self._fault_fault_relationships + + @property + def unit_fault_relationships(self): + if self._unit_fault_relationships is None: + self._calculate_fault_unit_relationships() + + return self._unit_fault_relationships + + @property + def unit_unit_relationships(self): + if self._unit_unit_relationships is None: + self._calculate_unit_unit_relationships() + + return self._unit_unit_relationships + + def reset(self): + """ + Reset before the next run + """ + logger.info("Resetting topology calculator") + self.sorted_units = None + self._fault_fault_relationships = None + self._unit_fault_relationships = None + self._unit_unit_relationships = None + + def get_sorted_units(self): + """ + Getter for the map2model sorted units + + Returns: + list: The map2model stratigraphic column estimate + """ + raise NotImplementedError("This method is not implemented") + + + def get_fault_fault_relationships(self): + """ + Getter for the fault fault relationships + + Returns: + pandas.DataFrame: The fault fault relationships + """ + + return self.fault_fault_relationships + + def get_unit_fault_relationships(self): + """ + Getter for the unit fault relationships + + Returns: + pandas.DataFrame: The unit fault relationships + """ + + return self.unit_fault_relationships + + def get_unit_unit_relationships(self): + """ + Getter for the unit unit relationships + + Returns: + pandas.DataFrame: The unit unit relationships + """ + + return self.unit_unit_relationships + + def _calculate_fault_fault_relationships(self): + + faults = self.fault_data.copy() + # reset index so that we can index the adjacency matrix with the index + faults.reset_index(inplace=True) + buffers = faults.buffer(self.buffer_radius) + # create the adjacency matrix + intersection = geopandas.sjoin( + geopandas.GeoDataFrame(geometry=buffers), geopandas.GeoDataFrame(geometry=faults["geometry"]) + ) + intersection["index_left"] = intersection.index + intersection.reset_index(inplace=True) + + adjacency_matrix = numpy.zeros((faults.shape[0], faults.shape[0]), dtype=bool) + adjacency_matrix[ + intersection.loc[:, "index_left"], intersection.loc[:, "index_right"] + ] = True + f1, f2 = numpy.where(numpy.tril(adjacency_matrix, k=-1)) + df = pandas.DataFrame( + {'Fault1': faults.loc[f1, 'ID'].to_list(), 'Fault2': faults.loc[f2, 'ID'].to_list()} + ) + df['Angle'] = 60 # make it big to prevent LS from making splays + df['Type'] = 'T' + self._fault_fault_relationships = df + + def _calculate_fault_unit_relationships(self): + """Calculate unit/fault relationships using geopandas sjoin. + This will return + """ + units = self.geology_data["UNITNAME"].unique() + faults = self.fault_data.copy().reset_index().drop(columns=['index']) + adjacency_matrix = numpy.zeros((len(units), faults.shape[0]), dtype=bool) + for i, u in enumerate(units): + unit = self.geology_data[self.geology_data["UNITNAME"] == u] + intersection = geopandas.sjoin( + geopandas.GeoDataFrame(geometry=faults["geometry"]), + geopandas.GeoDataFrame(geometry=unit["geometry"]), + ) + intersection["index_left"] = intersection.index + intersection.reset_index(inplace=True) + adjacency_matrix[i, intersection.loc[:, "index_left"]] = True + u, f = numpy.where(adjacency_matrix) + df = pandas.DataFrame({"Unit": units[u].tolist(), "Fault": faults.loc[f, "ID"].to_list()}) + self._unit_fault_relationships = df + + def _calculate_unit_unit_relationships(self): + extractor = ContactExtractor( + self.geology_data, + self.fault_data, + ) + contacts = extractor.extract_all_contacts() + self._unit_unit_relationships = contacts.copy().drop( + columns=['length', 'geometry'] + ) + return self._unit_unit_relationships + + def run(self, verbose_level: VerboseLevel = None): + """ + The main execute function that prepares, runs and parse the output of the map2model process + + Args: + verbose_level (VerboseLevel, optional): + How much console output is sent. Defaults to None (which uses the wrapper attribute). + """ + + self.get_fault_fault_relationships() + self.get_unit_fault_relationships() + self.get_unit_unit_relationships() + diff --git a/packages/map2loop/src/map2loop/utils/__init__.py b/packages/map2loop/src/map2loop/utils/__init__.py new file mode 100644 index 000000000..42c4aa09b --- /dev/null +++ b/packages/map2loop/src/map2loop/utils/__init__.py @@ -0,0 +1,22 @@ +from .utility_functions import ( + set_z_values_from_raster_df, + value_from_raster, + update_from_legacy_file, + preprocess_hjson_to_json, + read_hjson_with_json, + calculate_endpoints, + calculate_minimum_fault_length, + hex_to_rgb, + generate_random_hex_colors, + rebuild_sampled_basal_contacts, + multiline_to_line, + find_segment_strike_from_pt, + create_points, + normal_vector_to_dipdirection_dip, + strike_dip_vector, + generate_grid, + segment_measure_range, + clean_line_geometry, + nearest_orientation_to_line, + iter_line_segments +) diff --git a/packages/map2loop/src/map2loop/utils/load_map2loop_data.py b/packages/map2loop/src/map2loop/utils/load_map2loop_data.py new file mode 100644 index 000000000..6cedb18bc --- /dev/null +++ b/packages/map2loop/src/map2loop/utils/load_map2loop_data.py @@ -0,0 +1,21 @@ +import geopandas +import pathlib +from osgeo import gdal +gdal.UseExceptions() + +# Use the path of this file to locate the datasets directory +def map2loop_dir(folder) -> pathlib.Path: + path = pathlib.Path(__file__).parent.parent.parent / 'map2loop' / '_datasets' / 'geodata_files' / f'{folder}' + return path + +def load_hamersley_geology(): + path = map2loop_dir('hamersley') / "geology.geojson" + return geopandas.read_file(str(path)) + +def load_hamersley_structure(): + path = map2loop_dir('hamersley') / "structure.geojson" + return geopandas.read_file(str(path)) + +def load_hamersley_dtm(): + path = map2loop_dir('hamersley') / "dtm_rp.tif" + return gdal.Open(str(path)) diff --git a/packages/map2loop/src/map2loop/utils/utility_functions.py b/packages/map2loop/src/map2loop/utils/utility_functions.py new file mode 100644 index 000000000..7e76ac649 --- /dev/null +++ b/packages/map2loop/src/map2loop/utils/utility_functions.py @@ -0,0 +1,802 @@ +import numpy +import math +import shapely +import geopandas +import beartype +from beartype.typing import Union, Optional, Dict +import pandas +import re +import json +from osgeo import gdal + +from ..logging import getLogger + +logger = getLogger(__name__) + + +@beartype.beartype +def generate_grid(bounding_box: dict, grid_resolution: Optional[int] = None) -> tuple: + """ + Setup the grid for interpolation + + Args: + bounding_box (dict): a dictionary containing the bounding box of the map data. + The bounding box dictionary should comply with the following format: { + "minx": value, + "maxx": value, + "miny": value, + "maxy": value, + } + grid_resolution (int, optional): The number of grid points in the x and y directions. Defaults to None. + + Returns: + xi, yi (numpy.ndarray, numpy.ndarray): The x and y coordinates of the grid points. + grid_resolution (int): The number of grid points in the x and y directions. + """ + + # Define the desired cell size + cell_size = 0.01 * (bounding_box["maxx"] - bounding_box["minx"]) + + if grid_resolution is None: + # Calculate the grid resolution + grid_resolution = round((bounding_box["maxx"] - bounding_box["minx"]) / cell_size) + + # Generate the grid + x = numpy.linspace(bounding_box["minx"], bounding_box["maxx"], grid_resolution) + y = numpy.linspace(bounding_box["miny"], bounding_box["maxy"], grid_resolution) + xi, yi = numpy.meshgrid(x, y) + xi = xi.flatten() + yi = yi.flatten() + + return xi, yi, cell_size + + +def strike_dip_vector( + strike: Union[list, numpy.ndarray], dip: Union[list, numpy.ndarray] +) -> numpy.ndarray: + """ + Calculates the strike-dip vector from the given strike and dip angles. + + Args: + strike (Union[float, list, numpy.ndarray]): The strike angle(s) in degrees. Can be a single value or an array of values. + dip (Union[float, list, numpy.ndarray]): The dip angle(s) in degrees. Can be a single value or an array of values. + + Returns: + numpy.ndarray: The calculated strike-dip vector(s). Each row corresponds to a vector, + and the columns correspond to the x, y, and z components of the vector. + + Note: + This code is adapted from LoopStructural. + """ + + # Initialize a zero vector with the same length as the input strike and dip angles + vec = numpy.zeros((len(strike), 3)) + + # Convert the strike and dip angles from degrees to radians + s_r = numpy.deg2rad(strike) + d_r = numpy.deg2rad(dip) + + # Calculate the x, y, and z components of the strike-dip vector + vec[:, 0] = numpy.sin(d_r) * numpy.cos(s_r) + vec[:, 1] = -numpy.sin(d_r) * numpy.sin(s_r) + vec[:, 2] = numpy.cos(d_r) + + # Normalize the strike-dip vector + vec /= numpy.linalg.norm(vec, axis=1)[:, None] + + return vec + + +@beartype.beartype +def normal_vector_to_dipdirection_dip(normal_vector: numpy.ndarray) -> numpy.ndarray: + """ + Calculates the dip and dip direction from a normal vector. + + Args: + normal_vector (numpy.ndarray): The normal vector(s) for which to calculate the dip and dip direction. + Each row corresponds to a vector, and the columns correspond to the x, y, and z components of the vector. + + Returns: + numpy.ndarray: The calculated dip and dip direction(s). Each row corresponds to a set of dip and dip direction, + and the columns correspond to the dip and dip direction, respectively. + + Note: + This code is adapted from LoopStructural. + """ + + # Calculate the dip direction in degrees, ranging from 0 to 360 + dipdir = numpy.degrees(numpy.arctan2(normal_vector[:, 0], normal_vector[:, 1])) % 360 + + # Calculate the dip angle in degrees, ranging from 0 to 90 + dip = 90 - numpy.degrees(numpy.arcsin(normal_vector[:, 2])) + + # If the dip angle is greater than 90 degrees, adjust the dip and dip direction + mask = dip > 90 + dip[mask] = 180 - dip[mask] + dipdir[mask] = (dipdir[mask] + 180) % 360 + + # Ensure the dip direction is within the range of 0 to 360 degrees + dipdir = dipdir % 360 + dip_dipdir = numpy.array([dip, dipdir]).T + + return dip_dipdir + + +@beartype.beartype +def create_points(xy: Union[list, tuple, numpy.ndarray]) -> numpy.ndarray: + """ + Creates a list of shapely Point objects from a list, tuple, or numpy array of coordinates. + + Args: + xy (Union[list, tuple, numpy.ndarray]): A list, tuple, or numpy array of coordinates, + where each coordinate contains two elements representing the x and y coordinates of a point. + + Returns: + shapely.geometry.Point: A list of Point objects created from the input list of coordinates. + """ + points = shapely.points(xy) + return points + + +@beartype.beartype +def find_segment_strike_from_pt( + line: shapely.geometry.LineString, point: shapely.geometry.Point, measurement: pandas.Series +) -> float: + """ + Finds the strike of a line segment (contact) closest to a given point (structural measurement). + + Parameters: + line (shapely.geometry.LineString): The line segment (from sampled_contacts) + point (shapely.geometry.Point): The point representing the structural measurement + measurement (Geoseries): sampled_contacts.iloc[i, :], where i is a given row number. + + Returns: + float: The strike of the line segment closer to the point + """ + + lines = [] + for c1, c2 in zip(line.coords, line.coords[1:]): + lines.append(shapely.geometry.LineString([c1, c2])) + distances = [segment.distance(point) for segment in lines] + nearest_line = lines[distances.index(min(distances))] + + if 0 <= measurement['DIPDIR'] <= 180: + # 1 is the upper point + # find the index point in seg a that has highest y value + idx1 = numpy.argmin(nearest_line.coords.xy[1]) + x1 = nearest_line.coords.xy[0][idx1] + y1 = nearest_line.coords.xy[1][idx1] + idx2 = numpy.argmax(nearest_line.coords.xy[1]) + x2 = nearest_line.coords.xy[0][idx2] + y2 = nearest_line.coords.xy[1][idx2] + + if 180 < measurement['DIPDIR'] <= 360: + # 1 is the lower point + idx1 = numpy.argmax(nearest_line.coords.xy[1]) + x1 = nearest_line.coords.xy[0][idx1] + y1 = nearest_line.coords.xy[1][idx1] + idx2 = numpy.argmin(nearest_line.coords.xy[1]) + x2 = nearest_line.coords.xy[0][idx2] + y2 = nearest_line.coords.xy[1][idx2] + + strike = numpy.degrees(math.atan2((x2 - x1), (y2 - y1))) % 360 + return strike + + +@beartype.beartype +def calculate_endpoints( + start_point: shapely.geometry.Point, + azimuth_deg: Union[float, int], + distance: Union[float, int], + bbox: pandas.DataFrame, +) -> Union[shapely.geometry.LineString, shapely.geometry.GeometryCollection]: + """ + Calculate the endpoints of a line segment given a start point, azimuth angle, distance, and bounding box. + + Parameters: + start_point (tuple): The coordinates of the start point (x, y). + azimuth_deg (float): The azimuth angle in degrees. + distance (float): The distance of the line segment. + bbox (dict): The bounding box coordinates (minx, miny, maxx, maxy). + + Returns: + shapely.geometry.LineString: A LineString object representing the line segment with endpoints clipped by the bounding box. + """ + bbox = numpy.array(bbox)[0] + minx, miny, maxx, maxy = bbox[0], bbox[1], bbox[2], bbox[3] + x, y = start_point.coords[0] + azimuth_rad = math.radians(90 - azimuth_deg) + + # Calculate the perpendicular azimuths in radians + right_azimuth_rad = (azimuth_rad + math.pi / 2) % (2 * math.pi) + left_azimuth_rad = (azimuth_rad - math.pi / 2) % (2 * math.pi) + + # Calculate offsets for the right-hand perpendicular direction + dx_right = distance * math.cos(right_azimuth_rad) + dy_right = distance * math.sin(right_azimuth_rad) + right_endpoint = (x + dx_right, y + dy_right) + + # Calculate offsets for the left-hand perpendicular direction + dx_left = distance * math.cos(left_azimuth_rad) + dy_left = distance * math.sin(left_azimuth_rad) + left_endpoint = (x + dx_left, y + dy_left) + + line = shapely.geometry.LineString([left_endpoint, right_endpoint]) + + new_line = shapely.ops.clip_by_rect(line, minx, miny, maxx, maxy) + return new_line + + +@beartype.beartype +def multiline_to_line( + geometry: Union[shapely.geometry.LineString, shapely.geometry.MultiLineString], +) -> shapely.geometry.LineString: + """ + Converts a multiline geometry to a single line geometry. + + Args: + geometry (Union[LineString, MultiLineString]): The input geometry to be converted. + + Returns: + LineString: The converted line geometry. + """ + if isinstance(geometry, shapely.geometry.LineString): + return geometry + coords = [list(part.coords) for part in geometry.geoms] + flat_coords = [shapely.geometry.Point(*point) for segment in coords for point in segment] + return shapely.geometry.LineString(flat_coords) + + +@beartype.beartype +def rebuild_sampled_basal_contacts( + basal_contacts: geopandas.GeoDataFrame, sampled_contacts: pandas.DataFrame +) -> geopandas.GeoDataFrame: + """ + Rebuilds the basal contacts as linestrings --> sampled_basal_contacts, based on the existing sampled contact points. + The rebuild process uses the featureId column in the sampled_contacts DataFrame to find contacts that may be represented as multiline geometries. + + Parameters: + basal_contacts (geopandas.GeoDataFrame): A GeoDataFrame containing the original basal contacts (based on full contact data). + sampled_contacts (DataFrame): A DataFrame containing the sampled contact points with columns 'X' and 'Y' for coordinates, 'featureId' for segment number, and 'ID'. + + Returns: + geopandas.GeoDataFrame: A new GeoDataFrame containing sampled_basal_contacts: unique basal units and their corresponding LineString or + MultiLineString geometries, rebuilt from the sampled_contacts. + """ + + sampled_geology = geopandas.GeoDataFrame( + sampled_contacts, + geometry=geopandas.points_from_xy(sampled_contacts.X, sampled_contacts.Y), + crs=basal_contacts.crs, + ) + + basal_contacts.loc[:, 'geometry'] = basal_contacts.buffer(1) + sampled_basal_contacts = sampled_geology.sjoin( + basal_contacts, how='left', predicate='intersects' + ).dropna() + + r = [] + + for basal_u in sampled_basal_contacts['basal_unit'].unique(): + + subset = sampled_basal_contacts[sampled_basal_contacts['basal_unit'] == basal_u] + unique_segments = subset['featureId'].unique() + + if len(unique_segments) == 1: + # make a linestring with all the points in subset + line = shapely.geometry.LineString(subset.geometry) + r.append(line) + + else: + lines = [] + # Process each segment number + for featureId in unique_segments: + seg_subset = subset[subset['featureId'] == featureId] + if len(seg_subset) > 1: # Ensure each segment has at least two points + line_ = shapely.geometry.LineString(seg_subset.geometry.tolist()) + lines.append(line_) + + # If multiple lines were created, combine them into a MultiLineString + if lines: + line = shapely.geometry.MultiLineString(lines) + r.append(line) + + sampled_basal_contacts = geopandas.GeoDataFrame( + sampled_basal_contacts['basal_unit'].unique(), + geometry=r, + crs=basal_contacts.crs, + columns=['basal_unit'], + ) + + return sampled_basal_contacts + + +@beartype.beartype +def generate_random_hex_colors(n: int, seed: int = None) -> list: + """ + Generate a list of unique random hex color codes. + + Args: + n (int): The number of random hex color codes to generate. + + Returns: + list: A list of randomly generated hex color codes as strings. + + Example: + >>> generate_random_hex_colors(3) + ['#1a2b3c', '#4d5e6f', '#7f8e9d'] + """ + if not isinstance(n, int): + raise TypeError( + "n of colours must be an integer" + ) ## not sure if necessary as beartype should handle this + + if seed is not None: + rng = numpy.random.default_rng(seed) + else: + rng = numpy.random.default_rng(123456) + + colors = set() # set prevents duplicates + + while len(colors) < n: + color = "#{:06x}".format(rng.integers(0, 0xFFFFFF)) + colors.add(color) + return list(colors) + + +@beartype.beartype +def hex_to_rgb(hex_color: str) -> tuple: + """ + Convert a hex color code to an RGBA tuple. + Args: + hex_color (str): The hex color code (e.g., "#RRGGBB" or "#RGB"). + alpha (float, optional): The alpha value (opacity) for the color. Defaults to 1.0. + Returns: + tuple: A tuple (r, g, b, a) where r, g, b are in the range 0-1 and a is in the range 0-1. + """ + # if input not string or starts with '#', raise error + if not isinstance(hex_color, str) or not hex_color.startswith('#'): + raise ValueError("Invalid hex color code. Must start with '#'.") + + # Remove '#' from the hex color code + hex_color = hex_color.lstrip('#') + + # check if hex color code is the right length + if len(hex_color) not in [3, 6]: + raise ValueError("Invalid hex color code. Must be 3 or 6 characters long after '#'.") + + # Handle short hex code (e.g., "#RGB") + if len(hex_color) == 3: + hex_color = ''.join([c * 2 for c in hex_color]) + + alpha = 1.0 + # Convert the hex color code to an RGBA tuple// if it fails, return error + try: + r = int(hex_color[0:2], 16) / 255.0 + g = int(hex_color[2:4], 16) / 255.0 + b = int(hex_color[4:6], 16) / 255.0 + + except ValueError as e: + raise ValueError("Invalid hex color code. Contains non-hexadecimal characters.") from e + + return (r, g, b, alpha) + + +@beartype.beartype +def calculate_minimum_fault_length( + bbox: dict[str, Union[int, float]], area_percentage: float +) -> float: + """ + Calculate the minimum fault length based on the map bounding box and a given area percentage. + + Args: + bbox (dict): A dictionary with keys 'minx', 'miny', 'maxx', 'maxy' representing the bounding box in meters. + area_percentage (float): The percentage of the bounding box area to use for calculating the threshold length. + + Returns: + float: The calculated minimum fault length as the square root of the threshold area. + """ + + # Calculate the width and height of the bounding box in meters + width = bbox['maxx'] - bbox['minx'] + height = bbox['maxy'] - bbox['miny'] + + # Calculate the total bounding box area + bbox_area = width * height + + # Calculate the threshold area based on the given percentage + threshold_area = area_percentage * bbox_area + + # Return the square root of the threshold area as the minimum fault length + return threshold_area**0.5 + + +def preprocess_hjson_to_json(hjson_content): + # Remove comments + hjson_content = re.sub(r'#.*', '', hjson_content) + hjson_content = re.sub(r'//.*', '', hjson_content) + # Replace single quotes with double quotes + hjson_content = re.sub(r"(? dict: + try: + # Read the file + with open(file_path, "r", encoding="utf-8") as file: + hjson_content = file.read() + if not hjson_content.strip(): + raise ValueError("The HJSON file is empty.") + # Preprocess HJSON to JSON + preprocessed_content = preprocess_hjson_to_json(hjson_content) + # Parse JSON + return json.loads(preprocessed_content) + except FileNotFoundError as e: + raise FileNotFoundError(f"HJSON file not found: {file_path}") from e + except json.JSONDecodeError as e: + raise ValueError(f"Failed to decode preprocessed HJSON as JSON: {e}") from e + + +@beartype.beartype +def update_from_legacy_file( + filename: str, json_save_path: Optional[str] = None, lower: bool = False +) -> Optional[Dict[str, Dict]]: + """ + Update the config dictionary from the provided old version dictionary + Args: + filename (str): the path to the legacy file + json_save_path (str, optional): the path to save the updated json file. Defaults to None. + lower (bool, optional): whether to convert all strings to lowercase. Defaults to False. + + Returns: + Dict[Dict]: the updated config dictionary + + Example: + from map2loop.utils import update_from_legacy_file + update_from_legacy_file(filename=r"./source_data/example.hjson") + """ + # only import config if needed + from .config import Config + + file_map = Config() + + code_mapping = { + "otype": (file_map.structure_config, "orientation_type"), + "dd": (file_map.structure_config, "dipdir_column"), + "d": (file_map.structure_config, "dip_column"), + "sf": (file_map.structure_config, "description_column"), + "bedding": (file_map.structure_config, "bedding_text"), + "bo": (file_map.structure_config, "overturned_column"), + "btype": (file_map.structure_config, "overturned_text"), + "gi": (file_map.structure_config, "objectid_column"), + "c": (file_map.geology_config, "unitname_column"), + "u": (file_map.geology_config, "alt_unitname_column"), + "g": (file_map.geology_config, "group_column"), + "g2": (file_map.geology_config, "supergroup_column"), + "ds": (file_map.geology_config, "description_column"), + "min": (file_map.geology_config, "minage_column"), + "max": (file_map.geology_config, "maxage_column"), + "r1": (file_map.geology_config, "rocktype_column"), + "r2": (file_map.geology_config, "alt_rocktype_column"), + "sill": (file_map.geology_config, "sill_text"), + "intrusive": (file_map.geology_config, "intrusive_text"), + "volcanic": (file_map.geology_config, "volcanic_text"), + "f": (file_map.fault_config, "structtype_column"), + "fault": (file_map.fault_config, "fault_text"), + "fdipnull": (file_map.fault_config, "dip_null_value"), + "fdipdip_flag": (file_map.fault_config, "dipdir_flag"), + "fdipdir": (file_map.fault_config, "dipdir_column"), + "fdip": (file_map.fault_config, "dip_column"), + "fdipest": (file_map.fault_config, "dipestimate_column"), + "fdipest_vals": (file_map.fault_config, "dipestimate_text"), + "n": (file_map.fault_config, "name_column"), + "ff": (file_map.fold_config, "structtype_column"), + "fold": (file_map.fold_config, "fold_text"), + "t": (file_map.fold_config, "description_column"), + "syn": (file_map.fold_config, "synform_text"), + } + # try and ready the file: + try: + parsed_data = read_hjson_with_json(filename) + except Exception as e: + logger.error(f"Error reading file {filename}: {e}") + return + # map the keys + file_map = file_map.to_dict() + for legacy_key, new_mapping in code_mapping.items(): + if legacy_key in parsed_data: + section, new_key = new_mapping + value = parsed_data[legacy_key] + if lower and isinstance(value, str): + value = value.lower() + section[new_key] = value + + if "o" in parsed_data: + object_id_value = parsed_data["o"] + if lower and isinstance(object_id_value, str): + object_id_value = object_id_value.lower() + file_map['structure']["objectid_column"] = object_id_value + file_map['geology']["objectid_column"] = object_id_value + file_map['fold']["objectid_column"] = object_id_value + + if json_save_path is not None: + with open(json_save_path, "w") as f: + json.dump(parsed_data, f, indent=4) + + return file_map + + +@beartype.beartype +def value_from_raster(inv_geotransform, data, x: float, y: float): + """ + Get the value from a raster dataset at the specified point + + Args: + inv_geotransform (gdal.GeoTransform): + The inverse of the data's geotransform + data (numpy.array): + The raster data + x (float): + The easting coordinate of the value + y (float): + The northing coordinate of the value + + Returns: + float or int: The value at the point specified + """ + px = int(inv_geotransform[0] + inv_geotransform[1] * x + inv_geotransform[2] * y) + py = int(inv_geotransform[3] + inv_geotransform[4] * x + inv_geotransform[5] * y) + # Clamp values to the edges of raster if past boundary, similiar to GL_CLIP + px = max(px, 0) + px = min(px, data.shape[0] - 1) + py = max(py, 0) + py = min(py, data.shape[1] - 1) + return data[px][py] + + +@beartype.beartype +def set_z_values_from_raster_df(dtm_data: gdal.Dataset, df: pandas.DataFrame): + """ + Add a 'Z' column to a dataframe with the heights from the 'X' and 'Y' coordinates + + Args: + dtm_data (gdal.Dataset): + Dtm data from raster map + df (pandas.DataFrame): + The original dataframe with 'X' and 'Y' columns + + Returns: + pandas.DataFrame: The modified dataframe + """ + if len(df) <= 0: + df["Z"] = [] + return df + + if dtm_data is None: + logger.warning("Cannot get value from data as data is not loaded") + return None + + inv_geotransform = gdal.InvGeoTransform(dtm_data.GetGeoTransform()) + data_array = numpy.array(dtm_data.GetRasterBand(1).ReadAsArray().T) + + df["Z"] = df.apply( + lambda row: value_from_raster(inv_geotransform, data_array, row["X"], row["Y"]), axis=1 + ) + + return df + +def clean_line_geometry(geometry: shapely.geometry.base.BaseGeometry): + """Clean and normalize a Shapely geometry to a single LineString or None. + + Args: + geometry (shapely.geometry.base.BaseGeometry | None): Input geometry to be + cleaned. Accepted inputs include ``LineString``, ``MultiLineString``, + ``GeometryCollection``, and other Shapely geometries. If ``None`` or + an empty geometry is provided, the function returns ``None``. + + Returns: + shapely.geometry.LineString or None: A single ``LineString`` if the + geometry is already a ``LineString`` or can be merged/converted into one. + If the input is ``None``, empty, or cannot be converted into a valid + ``LineString``, the function returns ``None``. + + Raises: + None: Exceptions raised by ``shapely.ops.linemerge`` are caught and result + in a ``None`` return rather than being propagated. + + Notes: + - The function uses ``shapely.ops.linemerge`` to attempt to merge multipart + geometries into a single ``LineString``. + - If ``linemerge`` returns a ``MultiLineString``, the longest constituent + ``LineString`` (by ``length``) is returned. + - Geometries that are already ``LineString`` are returned unchanged. + + Examples: + >>> from shapely.geometry import LineString + >>> clean_line_geometry(None) is None + True + >>> ls = LineString([(0, 0), (1, 1)]) + >>> clean_line_geometry(ls) is ls + True + """ + if geometry is None or geometry.is_empty: + return None + if geometry.geom_type == "LineString": + return geometry + try: + merged = shapely.ops.linemerge(geometry) + except Exception: + logger.exception("Exception occurred in shapely.ops.linemerge during clean_line_geometry") + return None + if merged.geom_type == "LineString": + return merged + if merged.geom_type == "MultiLineString": + try: + return max(merged.geoms, key=lambda geom: geom.length) + except ValueError: + return None + return None + +def iter_line_segments(geometry): + """Produce all LineString segments contained in a Shapely geometry. + + Args: + geometry (shapely.geometry.base.BaseGeometry | None): Input geometry. Accepted + types include ``LineString``, ``MultiLineString``, ``GeometryCollection`` + and other Shapely geometries that may contain line parts. If ``None`` or + an empty geometry is provided, an empty list is returned. + + Returns: + list[shapely.geometry.LineString]: A list of ``LineString`` objects extracted + from the input geometry. Behavior by input type: + - ``LineString``: returned as a single-element list. + - ``MultiLineString``: returns the non-zero-length constituent parts. + - ``GeometryCollection``: recursively extracts contained line segments. + - Other geometry types: returns an empty list if no line segments found. + + Notes: + Zero-length segments are filtered out. The function is defensive and + will return an empty list for ``None`` or empty geometries rather than + raising an exception. + + Examples: + >>> from shapely.geometry import LineString + >>> iter_line_segments(LineString([(0, 0), (1, 1)])) + [LineString([(0, 0), (1, 1)])] + """ + if geometry is None or geometry.is_empty: + return [] + if isinstance(geometry, shapely.geometry.LineString): + return [geometry] + if isinstance(geometry, shapely.geometry.MultiLineString): + return [geom for geom in geometry.geoms if geom.length > 0] + if isinstance(geometry, shapely.geometry.GeometryCollection): + segments = [] + for geom in geometry.geoms: + segments.extend(iter_line_segments(geom)) + return segments + return [] + +def nearest_orientation_to_line(orientation_tree, orientation_dips, orientation_coords, line_geom: shapely.geometry.LineString): + """Find the nearest orientation measurement to the midpoint of a line. + + This function queries the provided spatial index and orientation arrays and + returns the dip value, the index of the matched orientation, and the + distance from the line to that orientation point. + + Args: + orientation_tree: Spatial index object (e.g., KDTree) with a ``query`` + method accepting an (x, y) tuple and optional ``k``. Typically + provided by the caller so the utility remains stateless. + orientation_dips (Sequence[float]): Sequence of dip values aligned with + ``orientation_coords``. + orientation_coords (Sequence[tuple]): Sequence of (x, y) coordinate + tuples for each orientation measurement. + line_geom (shapely.geometry.LineString): Line geometry for which the + nearest orientation should be found. The midpoint (interpolated at + 50% of the line length) is used as the query point; if the + midpoint is empty, the line centroid is used as a fallback. + + Returns: + tuple: A tuple ``(dip, index, distance)`` where: + - ``dip`` (float or numpy.nan): the dip value from + ``orientation_dips`` at the nearest orientation. Returns + ``numpy.nan`` if no valid orientation can be found or on error. + - ``index`` (int or None): the integer index into the orientation + arrays for the best match, or ``None`` if not found. + - ``distance`` (float or None): the shortest geometric distance + between ``line_geom`` and the matched orientation point, or + ``None`` if not available. + + Notes: + - The function queries up to 5 nearest neighbors (or fewer if fewer + orientations exist) and then computes the actual geometry distance + between the ``line_geom`` and each candidate point to select the + closest match. Any exceptions from the spatial query are caught and + result in ``(numpy.nan, None, None)`` being returned instead of + propagating the exception. + - The function is defensive: invalid or empty geometries return + ``(numpy.nan, None, None)`` rather than raising. + + Examples: + >>> dip, idx, dist = nearest_orientation_to_line(tree, dips, coords, my_line) + >>> if idx is not None: + ... print(f"Nearest dip={dip} at index={idx} (distance={dist})") + """ + if orientation_tree is None or orientation_dips is None or orientation_coords is None: + return numpy.nan, None, None + midpoint = line_geom.interpolate(0.5, normalized=True) + if midpoint.is_empty: + midpoint = line_geom.centroid + if midpoint.is_empty: + return numpy.nan, None, None + query_xy = (float(midpoint.x), float(midpoint.y)) + k = min(len(orientation_dips), 5) + try: + distances, indices = orientation_tree.query(query_xy, k=k) + except Exception: + logger.exception("Exception occurred during KDTree query in nearest_orientation_to_line; returning (nan, None, None)") + return numpy.nan, None, None + distances = numpy.atleast_1d(distances) + indices = numpy.atleast_1d(indices) + best_idx = None + best_dist = numpy.inf + for _approx_dist, idx in zip(distances, indices): + if idx is None: + continue + candidate_point = shapely.geometry.Point(orientation_coords[int(idx)]) + actual_dist = line_geom.distance(candidate_point) + if actual_dist < best_dist: + best_dist = actual_dist + best_idx = int(idx) + if best_idx is None: + return numpy.nan, None, None + return float(orientation_dips[best_idx]), best_idx, best_dist + +def segment_measure_range(parent_line: shapely.geometry.LineString, segment: shapely.geometry.LineString): + """Compute projected measures of a segment's end points along a parent line. + + This function projects the start and end points of ``segment`` onto + ``parent_line`` using Shapely's ``project`` method and returns the two + measures in ascending order (start <= end). Measures are distances along + the parent line's linear reference (units of the geometry's CRS). + + Args: + parent_line (shapely.geometry.LineString): The reference line onto which + the segment end points will be projected. + segment (shapely.geometry.LineString): The segment whose first and last + vertices will be projected onto ``parent_line``. The function uses + ``segment.coords[0]`` and ``segment.coords[-1]`` as the start and + end points respectively. + + Returns: + tuple(float, float): A tuple ``(start_measure, end_measure)`` containing + the projected distances along ``parent_line`` for the segment's start + and end points. The values are ordered so that ``start_measure <= end_measure``. + + Notes: + - If ``segment`` is degenerate (e.g., a single point), both measures may + be equal. + - The returned measures are in the same linear units as the input + geometries (e.g., metres for projected CRS). + - No validation is performed on the inputs; callers should ensure both + geometries are valid and share a common CRS. + + Examples: + >>> start_m, end_m = segment_measure_range(parent_line, segment) + >>> assert start_m <= end_m + """ + start_point = shapely.geometry.Point(segment.coords[0]) + end_point = shapely.geometry.Point(segment.coords[-1]) + start_measure = parent_line.project(start_point) + end_measure = parent_line.project(end_point) + if end_measure < start_measure: + start_measure, end_measure = end_measure, start_measure + return start_measure, end_measure diff --git a/packages/map2loop/src/map2loop/version.py b/packages/map2loop/src/map2loop/version.py new file mode 100644 index 000000000..ff0416876 --- /dev/null +++ b/packages/map2loop/src/map2loop/version.py @@ -0,0 +1 @@ +__version__ = "3.3.1" diff --git a/packages/map2loop/tests/__init__.py b/packages/map2loop/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/packages/map2loop/tests/contact_extractor/test_contact_extractor.py b/packages/map2loop/tests/contact_extractor/test_contact_extractor.py new file mode 100644 index 000000000..1c5acef67 --- /dev/null +++ b/packages/map2loop/tests/contact_extractor/test_contact_extractor.py @@ -0,0 +1,37 @@ +import sys +sys.path.append('/usr/lib/python3/dist-packages') +from map2loop.contact_extractor import ContactExtractor +import geopandas as gpd +from shapely.geometry import Polygon + +def simple_geology(): + poly1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) + poly2 = Polygon([(1, 0), (2, 0), (2, 1), (1, 1)]) + return gpd.GeoDataFrame( + { + "UNITNAME": ["A", "B"], + "INTRUSIVE": [False, False], + "SILL": [False, False], + "geometry": [poly1, poly2], + }, + geometry="geometry", + crs="EPSG:28350", + ) + +def test_extract_all_contacts(): + geology = simple_geology() + extractor = ContactExtractor(geology, None) + contacts = extractor.extract_all_contacts() + assert len(contacts) == 1 + assert {contacts.loc[0, "UNITNAME_1"], contacts.loc[0, "UNITNAME_2"]} == {"A", "B"} + +def test_extract_basal_contacts(): + geology = simple_geology() + extractor = ContactExtractor(geology, None) + extractor.extract_all_contacts() + basal = extractor.extract_basal_contacts(["A", "B"], save_contacts=True) + assert len(basal) == 1 + assert basal.loc[0, "basal_unit"] == "A" + assert basal.loc[0, "type"] == "BASAL" + assert extractor.basal_contacts is not None + assert extractor.all_basal_contacts is not None diff --git a/packages/map2loop/tests/data_checks/test_config.py b/packages/map2loop/tests/data_checks/test_config.py new file mode 100644 index 000000000..cc6f01ba2 --- /dev/null +++ b/packages/map2loop/tests/data_checks/test_config.py @@ -0,0 +1,135 @@ +import pytest +from map2loop.data_checks import validate_config_dictionary + + +@pytest.fixture +def valid_config(): + return { + "structure": { + "orientation_type": "dip direction", + "dipdir_column": "azimuth", + "dip_column": "inclinatn", + "description_column": "DESCRIPTION", + "bedding_text": "bed", + "overturned_column": "no_col", + "overturned_text": "blah", + "objectid_column": "geographic", + "desciption_column": "sub_type" + }, + "geology": { + "unitname_column": "formatted_", + "alt_unitname_column": "abbreviate", + "group_column": "no_col", + "supergroup_column": "interpreta", + "description_column": "text_descr", + "minage_column": "no_col", + "maxage_column": "no_col", + "rocktype_column": "rank", + "alt_rocktype_column": "type", + "sill_text": "sill", + "intrusive_text": "intrusion", + "volcanic_text": "volc", + "objectid_column": "ID", + "ignore_lithology_codes": ["cover"] + }, + "fault": { + "structtype_column": "featuretyp", + "fault_text": "s", + "dip_null_value": "0", + "dipdir_flag": "num", + "dipdir_column": "no_col", + "dip_column": "no_col", + "orientation_type": "dip direction", + "dipestimate_column": "no_col", + "dipestimate_text": "no_col", + "name_column": "no_col", + "objectid_column": "geographic", + "minimum_fault_length": 100.0, + "ignore_fault_codes": [] + }, + "fold": { + "structtype_column": "featuretyp", + "fold_text": "fold", + "description_column": "no_col", + "synform_text": "syn", + "foldname_column": "NAME", + "objectid_column": "geographic" + } + } + + +def test_valid_config_no_errors(valid_config): + # Should not raise any error + validate_config_dictionary(valid_config) + + +def test_missing_required_section(valid_config): + + config_missing_structure = dict(valid_config) + del config_missing_structure["structure"] # remove required section + + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_missing_structure) + assert "Missing required section 'structure'" in str(exc_info.value) + + +def test_missing_required_key(valid_config): + + config_missing_dip = dict(valid_config) + + del config_missing_dip["structure"]["dip_column"] # remove required key + + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_missing_dip) + assert "Missing required key 'dip_column' for 'structure'" in str(exc_info.value) + + +def test_unrecognized_section(valid_config): + + config_extra_section = dict(valid_config) + config_extra_section["random_section"] = {"random_key": "random_value"} + + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_extra_section) + assert "Unrecognized section 'random_section'" in str(exc_info.value) + + +def test_unrecognized_key_in_section(valid_config): + + config_extra_key = dict(valid_config) + config_extra_key["structure"]["random_key"] = "random_value" + + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_extra_key) + assert "Key 'random_key' is not an allowed key in the 'structure' section." in str(exc_info.value) + + +def test_legacy_key_detected(valid_config): + + config_with_legacy = dict(valid_config) + config_with_legacy["structure"]["otype"] = "legacy_value" # 'otype' --> legacy key + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_with_legacy) + assert "Legacy key found in config - 'otype'" in str(exc_info.value) + + +def test_minimum_fault_length_wrong_type(valid_config): + + config_wrong_mfl = dict(valid_config) + config_wrong_mfl["fault"]["minimum_fault_length"] = "one_hundred" # invalid type + + with pytest.raises(ValueError) as exc_info: + validate_config_dictionary(config_wrong_mfl) + assert "minimum_fault_length must be a number" in str(exc_info.value) + + +def test_minimum_fault_length_missing(valid_config): + """ + Remove minimum_fault_length entirely. That should be fine (None -> no check). + """ + config_no_mfl = dict(valid_config) + del config_no_mfl["fault"]["minimum_fault_length"] + + # Should not raise any error, as it's optional + validate_config_dictionary(config_no_mfl) + diff --git a/packages/map2loop/tests/data_checks/test_input_data_faults.py b/packages/map2loop/tests/data_checks/test_input_data_faults.py new file mode 100644 index 000000000..7cdd8fc73 --- /dev/null +++ b/packages/map2loop/tests/data_checks/test_input_data_faults.py @@ -0,0 +1,108 @@ +import pytest +import geopandas as gpd +import shapely.geometry +from map2loop.mapdata import MapData +from map2loop.m2l_enums import Datatype +from map2loop.data_checks import check_fault_fields_validity + + +@pytest.mark.parametrize( + "fault_data, fault_config, expected_validity, expected_message", + [ + # Valid data + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]), + ], + "FEATURE": ["Fault A", "Fault B"], + "ID": [1, 2], + }, + {"structtype_column": "FEATURE", "fault_text": "Fault", "objectid_column": "ID"}, + False, + "", + ), + # Invalid geometry + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.Polygon( + [(0, 0), (1, 1), (1, 0), (0, 1), (0, 0)] + ), # Invalid geometry + ], + "FEATURE": ["Fault A", "Fault B"], + "ID": [1, 2], + }, + {"structtype_column": "FEATURE", "fault_text": "Fault", "objectid_column": "ID"}, + True, + "Invalid geometry types found in datatype FAULT. All geometries must be LineString, MultiLineString.", + ), + # Non-string FEATURE column + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]), + ], + "FEATURE": [5, 2], + "ID": [1, 2], + }, + {"structtype_column": "FEATURE", "fault_text": "Fault", "objectid_column": "ID"}, + True, + "Datatype FAULT: Column 'FEATURE' (config key: 'structtype_column') contains non-string values. Please ensure all values in this column are strings.", + ), + # Invalid values in DIP estimate column + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]), + ], + "FEATURE": ["Fault", "Fault"], + "NAME": ["Zuleika", "Zuleika"], + "ID": [1, 2], + "DIP": [70, 50], + "STRIKE": [150, None], + "DEC": ["north_east", "southt"], + }, + { + "structtype_column": "FEATURE", + "fault_text": "Fault", + "objectid_column": "ID", + "name_column": "NAME", + "dip_column": "DIP", + "dipdir_column": "STRIKE", + "dip_estimate_column": "DEC", + }, + True, + "Datatype FAULT: Column 'DEC' contains invalid values. Allowed values: ['north_east', 'south_east', 'south_west', 'north_west', 'north', 'east', 'south', 'west'].", + ), + ], + ids=[ + "Valid fault data", + "Invalid geometry", + "Non-string FEATURE column", + "Invalid DIP estimate column", + ], +) +def test_check_fault_fields_validity(fault_data, fault_config, expected_validity, expected_message): + # Dynamically create the mock config for this test case + class MockConfig: + def __init__(self, config): + self.fault_config = config + + # Create a GeoDataFrame + fault_gdf = gpd.GeoDataFrame(fault_data, crs="EPSG:4326") + + # Instantiate the MapData class with the dynamic mock config and data + map_data = MapData() + map_data.config = MockConfig(fault_config) + map_data.raw_data = [None] * len(Datatype.__dict__) + map_data.raw_data[Datatype.FAULT] = fault_gdf + + # Test the check_fault_fields_validity function + validity_check, message = check_fault_fields_validity(map_data) + assert validity_check == expected_validity + assert message == expected_message diff --git a/packages/map2loop/tests/data_checks/test_input_data_fold.py b/packages/map2loop/tests/data_checks/test_input_data_fold.py new file mode 100644 index 000000000..8d5e5b691 --- /dev/null +++ b/packages/map2loop/tests/data_checks/test_input_data_fold.py @@ -0,0 +1,112 @@ +import pytest +import geopandas as gpd +import shapely.geometry +from map2loop.mapdata import MapData +from map2loop.m2l_enums import Datatype +from map2loop.data_checks import check_fold_fields_validity + +@pytest.mark.parametrize( + "fold_data, fold_config, expected_validity, expected_message", + [ + # Valid data + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]) + ], + "FEATURE": ["fold A", "fold B"], + "ID": [1, 2], + "description": ["desc1", "desc2"] + }, + {"structtype_column": "FEATURE", "fold_text": "fold", "objectid_column": "ID", "description_column": "description"}, + False, + "" + ), + # Missing geometry + ( + { + "geometry": [ + shapely.geometry.LineString([(0,0), (0,0)]), # Invalid type + shapely.geometry.LineString([(0, 0), (1, 1)]) + ], + "FEATURE": ["fold A", "fold B"], + "ID": [1, 2], + "description": ["desc1", "desc2"] + }, + {"structtype_column": "FEATURE", "fold_text": "fold", "objectid_column": "ID", "description_column": "description"}, + True, + "Invalid geometry types found in datatype FOLD. All geometries must be LineString, MultiLineString." + ), + # Non-string FEATURE column + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]) + ], + "FEATURE": [123, 456], # Invalid type + "ID": [1, 2], + "description": ["desc1", "desc2"] + }, + {"structtype_column": "FEATURE", "fold_text": "fold", "objectid_column": "ID", "description_column": "description"}, + True, + "Datatype FOLD: Column 'FEATURE' (config key: 'structtype_column') contains non-string values. Please ensure all values in this column are strings." + ), + # Missing ID column + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]) + ], + "FEATURE": ["fold A", "fold B"], + "description": ["desc1", "desc2"] + }, + {"structtype_column": "FEATURE", "fold_text": "fold", "objectid_column": "ID", "description_column": "description"}, + False, + "" + ), + # Duplicate ID values + ( + { + "geometry": [ + shapely.geometry.LineString([(0, 0), (1, 1)]), + shapely.geometry.MultiLineString([[(0, 0), (1, 1)], [(1, 1), (2, 2)]]) + ], + "FEATURE": ["fold A", "fold B"], + "ID": [1, 1], # Duplicate values + "description": ["desc1", "desc2"] + }, + {"structtype_column": "FEATURE", "fold_text": "fold", "objectid_column": "ID", "description_column": "description"}, + True, + "Datatype FOLD: Column 'ID' (config key: 'objectid_column') contains duplicate values." + ), + ], + ids=[ + "Valid fold data", + "Invalid geometry", + "Non-string FEATURE column", + "Missing ID column", + "Duplicate ID values" + ] +) +def test_check_fold_fields_validity(fold_data, fold_config, expected_validity, expected_message): + # Dynamically create the mock config for this test case + class MockConfig: + def __init__(self, config): + self.fold_config = config + + # Create a GeoDataFrame + fold_gdf = gpd.GeoDataFrame(fold_data, crs="EPSG:4326") + + # Instantiate the MapData class with the dynamic mock config and data + map_data = MapData() + map_data.config = MockConfig(fold_config) + map_data.raw_data = [None] * len(Datatype.__dict__) + map_data.raw_data[Datatype.FOLD] = fold_gdf + + # Test the check_fold_fields_validity function + validity_check, message = check_fold_fields_validity(map_data) + assert validity_check == expected_validity + assert message == expected_message diff --git a/packages/map2loop/tests/data_checks/test_input_data_geology.py b/packages/map2loop/tests/data_checks/test_input_data_geology.py new file mode 100644 index 000000000..2cc42408a --- /dev/null +++ b/packages/map2loop/tests/data_checks/test_input_data_geology.py @@ -0,0 +1,203 @@ +import pytest +import geopandas as gpd +import shapely.geometry +from map2loop.mapdata import MapData +from map2loop.data_checks import check_geology_fields_validity + +# Datatype Enum +class Datatype: + GEOLOGY = 0 + +# Config +class MockConfig: + def __init__(self): + self.geology_config = { + "unitname_column": "UNITNAME", + "alt_unitname_column": "CODE", + "group_column": "GROUP", + "supergroup_column": "SUPERGROUP", + "description_column": "DESCRIPTION", + "rocktype_column": "ROCKTYPE1", + "alt_rocktype_column": "ROCKTYPE2", + "minage_column": "MIN_AGE", + "maxage_column": "MAX_AGE", + "objectid_column": "ID", + "ignore_lithology_codes": [], + } + +@pytest.mark.parametrize( + "geology_data, expected_validity, expected_message", + [ + # Valid data + ( + { + "geometry": [shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])], + "UNITNAME": ["Sandstone"], + "CODE": ["SST"], + "GROUP": ["Sedimentary"], + "SUPERGROUP": ["Mesozoic"], + "DESCRIPTION": ["A type of sandstone"], + "ROCKTYPE1": ["Clastic"], + "ROCKTYPE2": ["Quartz"], + "MIN_AGE": [150.0], + "MAX_AGE": [200.0], + "ID": [1], + }, + False, + "", + ), + # Invalid geometry + ( + { + "geometry": [shapely.geometry.Polygon([(0, 0), (1, 1), (1, 0), (0, 1), (0, 0)])], + "UNITNAME": ["Sandstone"], + "CODE": ["SST"], + "GROUP": ["Sedimentary"], + "SUPERGROUP": ["Mesozoic"], + "DESCRIPTION": ["A type of sandstone"], + "ROCKTYPE1": ["Clastic"], + "ROCKTYPE2": ["Quartz"], + "MIN_AGE": [150.0], + "MAX_AGE": [200.0], + "ID": [1], + }, + False, + "", + ), + # Missing required column + ( + { + "geometry": [shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])], + "UNITNAME": ["Sandstone"], + # "CODE": ["SST"], # Missing required column + "GROUP": ["Sedimentary"], + "SUPERGROUP": ["Mesozoic"], + "DESCRIPTION": ["A type of sandstone"], + "ROCKTYPE1": ["Clastic"], + "ROCKTYPE2": ["Quartz"], + "MIN_AGE": [150.0], + "MAX_AGE": [200.0], + "ID": [1], + }, + True, + "Datatype GEOLOGY: Required column with config key 'alt_unitname_column' (column: 'CODE') is missing from the data.", + ), + # Non-string value in required column + ( + { + "geometry": [shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])], + "UNITNAME": ["Sandstone"], + "CODE": [2], # Non-string value + "GROUP": ["Sedimentary"], + "SUPERGROUP": ["Mesozoic"], + "DESCRIPTION": ["A type of sandstone"], + "ROCKTYPE1": ["Clastic"], + "ROCKTYPE2": ["Quartz"], + "MIN_AGE": [150.0], + "MAX_AGE": [200.0], + "ID": [1], + }, + True, + "Datatype GEOLOGY: Column 'alt_unitname_column' (column: 'CODE') must contain only values.", + ), + # NaN or blank value in required column + ( + { + "geometry": [shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])], + "UNITNAME": [""], # Blank value + "CODE": ["SST"], + "GROUP": ["Sedimentary"], + "SUPERGROUP": ["Mesozoic"], + "DESCRIPTION": ["A type of sandstone"], + "ROCKTYPE1": ["Clastic"], + "ROCKTYPE2": ["Quartz"], + "MIN_AGE": [150.0], + "MAX_AGE": [200.0], + "ID": [1], + }, + True, + "Datatype GEOLOGY: Column 'unitname_column' (column: 'UNITNAME') contains blank (empty) values. Please ensure all values are populated.", + ), + # Duplicate ID values + ( + { + "geometry": [ + shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]), + shapely.geometry.Polygon([(0, 0), (10, 0), (1, 1), (0, 10)]), + ], + "UNITNAME": ["fr", "df"], + "CODE": ["SST", "FGH"], + "GROUP": ["Sedimentary", "Ign"], + "SUPERGROUP": ["Mesozoic", "Arc"], + "DESCRIPTION": ["A", "B"], + "ROCKTYPE1": ["A", "B"], + "ROCKTYPE2": ["Quartz", "FDS"], + "MIN_AGE": [150.0, 200], + "MAX_AGE": [200.0, 250], + "ID": [1, 1], # Duplicate ID + }, + True, + "Datatype GEOLOGY: Column 'ID' (config key: 'objectid_column') contains duplicate values.", + ), + # nan in id + ( + { + "geometry": [ + shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]), + shapely.geometry.Polygon([(0, 0), (10, 0), (1, 1), (0, 10)]), + ], + "UNITNAME": ["fr", "df"], + "CODE": ["SST", "FGH"], + "GROUP": ["Sedimentary", "Ign"], + "SUPERGROUP": ["Mesozoic", "Arc"], + "DESCRIPTION": ["A", "B"], + "ROCKTYPE1": ["A", "B"], + "ROCKTYPE2": ["Quartz", "FDS"], + "MIN_AGE": [150.0, 200], + "MAX_AGE": [200.0, 250], + "ID": [1, None], + }, + True, + "Datatype GEOLOGY: Column 'ID' (config key: 'objectid_column') contains non-numeric or NaN values. Please rectify the values, or remove this key from the config dictionary to let map2loop assign IDs.", + ), + # nan in unit name + ( + { + "geometry": [ + shapely.geometry.Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]), + shapely.geometry.Polygon([(0, 0), (10, 0), (1, 1), (0, 10)]), + ], + "UNITNAME": ["fr", None], + "CODE": ["SST", "FGH"], + "GROUP": ["Sedimentary", "Ign"], + "SUPERGROUP": ["Mesozoic", "Arc"], + "DESCRIPTION": ["A", "B"], + "ROCKTYPE1": ["A", "B"], + "ROCKTYPE2": ["Quartz", "FDS"], + "MIN_AGE": [150.0, 200], + "MAX_AGE": [200.0, 250], + "ID": [1, 1], # Duplicate ID + }, + True, + "Datatype GEOLOGY: Column 'unitname_column' (column: 'UNITNAME') must contain only values.", + ), + ], +) + + + +def test_check_geology_fields_validity(geology_data, expected_validity, expected_message): + # Create a GeoDataFrame + geology_gdf = gpd.GeoDataFrame(geology_data, crs="EPSG:4326") + + # Instantiate the MapData class with the mock config and data + map_data = MapData() + map_data.config = MockConfig() + map_data.raw_data = [None] * len(Datatype.__dict__) + map_data.raw_data[Datatype.GEOLOGY] = geology_gdf + + # Test the check_geology_fields_validity function + validity_check, message = check_geology_fields_validity(map_data) + + assert validity_check == expected_validity + assert message == expected_message \ No newline at end of file diff --git a/packages/map2loop/tests/data_checks/test_input_data_structure.py b/packages/map2loop/tests/data_checks/test_input_data_structure.py new file mode 100644 index 000000000..4cabca285 --- /dev/null +++ b/packages/map2loop/tests/data_checks/test_input_data_structure.py @@ -0,0 +1,124 @@ +import pytest +import geopandas as gpd +import shapely.geometry +from map2loop.mapdata import MapData +from map2loop.data_checks import check_structure_fields_validity + +# Datatype Enum +class Datatype: + STRUCTURE = 1 + +# Config +class MockConfig: + def __init__(self): + self.structure_config = { + "dipdir_column": "DIPDIR", + "dip_column": "DIP", + "description_column": "DESCRIPTION", + "overturned_column": "OVERTURNED", + "objectid_column": "ID", + } + + +@pytest.mark.parametrize( + "structure_data, expected_validity, expected_message", + [ + # Valid data + ( + { + "geometry": [shapely.geometry.Point(0, 0), shapely.geometry.Point(1, 1)], + "DIPDIR": [45.0, 135.0], + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 2], + }, + False, + "", + ), + # Invalid geometry + ( + { + "geometry": [ + shapely.geometry.Point(0, 0), + shapely.geometry.Polygon( + [(0, 0), (1, 1), (1, 0), (0, 1), (0, 0)] + ), # Invalid geometry + ], + "DIPDIR": [45.0, 135.0], + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 2], + }, + True, + "Invalid geometry types found in datatype STRUCTURE. All geometries must be Point, MultiPoint.", + ), + # Missing required column + ( + { + "geometry": [shapely.geometry.Point(0, 0), shapely.geometry.Point(1, 1)], + # "DIPDIR": [45.0, 135.0], # Missing required column + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 2], + }, + True, + "Datatype STRUCTURE: Required column with config key 'dipdir_column' (column: 'DIPDIR') is missing from the data.", + ), + # Non-numeric value in numeric column + ( + { + "geometry": [shapely.geometry.Point(0, 0), shapely.geometry.Point(1, 1)], + "DIPDIR": ["A", "B"], # Non-numeric value + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 2], + }, + True, + "Datatype STRUCTURE: Column 'dipdir_column' (column: 'DIPDIR') must contain only numeric values.", + ), + # NaN or blank value in required column + ( + { + "geometry": [shapely.geometry.Point(0, 0), shapely.geometry.Point(1, 1)], + "DIPDIR": [None, 3], # NaN value + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 2], + }, + True, + "Datatype STRUCTURE: Column 'dipdir_column' (column: 'DIPDIR') contains null values. Please ensure all values are present.", + ), + # Duplicate ID column + ( + { + "geometry": [shapely.geometry.Point(0, 0), shapely.geometry.Point(1, 1)], + "DIPDIR": [45.0, 135.0], + "DIP": [30.0, 45.0], + "DESCRIPTION": ["Description1", "Description2"], + "OVERTURNED": ["Yes", "No"], + "ID": [1, 1], # Duplicate ID + }, + True, + "Datatype STRUCTURE: Column 'ID' (config key: 'objectid_column') contains duplicate values.", + ), + ], +) +def test_check_structure_fields_validity(structure_data, expected_validity, expected_message): + # Create a GeoDataFrame + structure_gdf = gpd.GeoDataFrame(structure_data, crs="EPSG:4326") + + # Instantiate the MapData class with the mock config and data + map_data = MapData() + map_data.config = MockConfig() + map_data.raw_data = [None] * len(Datatype.__dict__) + map_data.raw_data[Datatype.STRUCTURE] = structure_gdf + + # Test the check_structure_fields_validity function + validity_check, message = check_structure_fields_validity(map_data) + assert validity_check == expected_validity + assert message == expected_message diff --git a/packages/map2loop/tests/mapdata/test_mapdata_assign_random_colours_to_units.py b/packages/map2loop/tests/mapdata/test_mapdata_assign_random_colours_to_units.py new file mode 100644 index 000000000..e438265e8 --- /dev/null +++ b/packages/map2loop/tests/mapdata/test_mapdata_assign_random_colours_to_units.py @@ -0,0 +1,79 @@ +### This file tests the function colour_units() in map2loop/mapdata.py +### Two main test cases are considered: cases in which there is clut file and cases in which there is no clut file + +import pandas as pd +from map2loop.mapdata import MapData + + +# are random colours being assigned to stratigraphic units in cases where no clut file is provided? +def test_colour_units_no_clut_file(): + # Create a sample DataFrame with missing 'colour' values + data = {"name": ["Unit1", "Unit2", "Unit3"], "colour": [None, None, None]} + stratigraphic_units = pd.DataFrame(data) + + # Instantiate the class and call the method + md = MapData() + md.colour_filename = None # Ensure no file is used + result = md.colour_units(stratigraphic_units) + + # check that there are no duplicates in the 'unit' column + assert result['name'].is_unique, "colour_units() in mapdata.py producing duplicate units" + + # Check that the 'colour' column has been assigned random colors + assert ( + len(result["colour"].dropna()) == 3 + ), "function MapData.colour_units not assigning the right len of random colours" + + # are the generated colours valid hex colours? + colours = result["colour"] + + assert colours.apply( + isinstance, args=(str,) + ).all(), ( + "function MapData.colour_units without clut file not assigning random hex colours as str" + ) + assert colours.str.startswith( + "#" + ).all(), "function MapData.colour_units without clut file not generating the right hex codes with # at the start" + assert ( + colours.str.len().isin([7, 4]).all() + ), "function MapData.colour_units without clut file not generating the right hex codes with 7 or 4 characters" + + +def test_colour_units_with_colour_file(tmp_path): + # Create a strati units df with missing 'colour' values + data = {"name": ["Unit1", "Unit2", "Unit3"], "colour": [None, None, None]} + stratigraphic_units = pd.DataFrame(data) + + # Create a temp clut file + colour_data = {"UNITNAME": ["Unit1", "Unit2"], "colour": ["#112233", "#445566"]} + colour_lookup_df = pd.DataFrame(colour_data) + colour_filename = tmp_path / "colour_lookup.csv" + colour_lookup_df.to_csv(colour_filename, index=False) + + # Instantiate the class and call the method + md = MapData() + md.colour_filename = str(colour_filename) + result = md.colour_units(stratigraphic_units) + + # check that there are no duplicates in the 'unit' column + assert result['name'].is_unique, "colour_units() in mapdata.py producing duplicate units" + + # Check that the 'colour' column has been merged correctly and missing colors are assigned + expected_colors = ["#112233", "#445566"] + assert ( + result["colour"].iloc[0] == expected_colors[0] + ), "function MapData.colour_units with clut file not assigning the right colour from the lookup file" + assert ( + result["colour"].iloc[1] == expected_colors[1] + ), "function MapData.colour_units with clut file not assigning the right colour from the lookup file" + assert isinstance( + result["colour"].iloc[2], str + ), "function MapData.colour_units with clut file not assigning random hex colours as str" + assert ( + result["colour"].iloc[2].startswith("#") + ), "function MapData.colour_units with clut file not generating the right hex codes with # at the start" + assert len(result["colour"].iloc[2]) in { + 7, + 4, + }, "function MapData.colour_units with clut file not generating the right hex codes with 7 or 4 characters" diff --git a/packages/map2loop/tests/mapdata/test_mapdata_dipdir.py b/packages/map2loop/tests/mapdata/test_mapdata_dipdir.py new file mode 100644 index 000000000..e6107aead --- /dev/null +++ b/packages/map2loop/tests/mapdata/test_mapdata_dipdir.py @@ -0,0 +1,58 @@ +### This file tests the function parse_structure_map() in map2loop/mapdata.py +### at the moment only tests for DIPDIR values lower than 360 degrees +### TODO: add more tests for this function + +import pytest +import geopandas +import shapely +from map2loop.mapdata import MapData +from map2loop.m2l_enums import Datatype + + +def test_if_m2l_returns_all_sampled_structures_with_DIPDIR_lower_than_360(): + + # call the class + md = MapData() + + # add config definition + md.config.structure_config = { + "dipdir_column": "DIPDIR", + "dip_column": "DIP", + "description_column": "DESCRIPTION", + "bedding_text": "Bedding", + "objectid_column": "ID", + "overturned_column": "facing", + "overturned_text": "DOWN", + "orientation_type": "strike", + } + + # create mock data + data = { + 'geometry': [shapely.geometry.Point(1, 1), shapely.geometry.Point(2, 2), shapely.geometry.Point(3, 3)], + 'DIPDIR': [45.0, 370.0, 420.0], + 'DIP': [30.0, 60.0, 50], + 'OVERTURNED': ["False", "True", "True"], + 'DESCRIPTION': ["Bedding", "Bedding", "Bedidng"], + 'ID': [1, 2, 3], + } + + # build geodataframe to hold the data + data = geopandas.GeoDataFrame(data) + + # set it as the raw_data + md.raw_data[Datatype.STRUCTURE] = data + + # make it parse the structure map and raise exception if error in parse_structure_map + + try: + md.parse_structure_map() + except Exception as e: + pytest.fail(f"parse_structure_map raised an exception: {e}") + + # check if all values below 360 + assert ( + md.data[Datatype.STRUCTURE]['DIPDIR'].all() < 360 + ), "MapData.STRUCTURE is producing DIPDIRs > 360 degrees" + + +# diff --git a/packages/map2loop/tests/mapdata/test_minimum_fault_length.py b/packages/map2loop/tests/mapdata/test_minimum_fault_length.py new file mode 100644 index 000000000..ce78bcc17 --- /dev/null +++ b/packages/map2loop/tests/mapdata/test_minimum_fault_length.py @@ -0,0 +1,124 @@ +import pytest +import geopandas as gpd +import shapely +import numpy + +from map2loop.mapdata import MapData +from map2loop.m2l_enums import VerboseLevel, Datatype + + +@pytest.fixture +def setup_map_data(): + # Create a mock MapData object with verbose level set to ALL + map_data = MapData(verbose_level=VerboseLevel.ALL) + + # Simulate config with no minimum_fault_length set + map_data.config.fault_config['minimum_fault_length'] = -1.0 + + return map_data + + +# for cases when there is no minimum_fault_length set in the config by user - does it update from map? +def test_update_minimum_fault_length_from_faults(setup_map_data): + map_data = setup_map_data + + # Define a test bounding box (in meters) + bounding_box = { + "minx": 0, + "miny": 0, + "maxx": 10000, # width = 10,000 meters + "maxy": 10000, # height = 10,000 meters + } + + # Set the bounding box in the map data + map_data.set_bounding_box(bounding_box) + + # update config + map_data.config.fault_config['name_column'] = 'NAME' + map_data.config.fault_config['dip_column'] = 'DIP' + + # Define a dummy fault GeoDataFrame with faults of varying lengths + faults = gpd.GeoDataFrame( + { + 'geometry': [ + shapely.geometry.LineString( + [(0, 0), (50, 50)] + ), # Fault 1 (small, length ~70.7 meters) + shapely.geometry.LineString( + [(0, 0), (3000, 3000)] + ), # Fault 2 (length ~4242 meters) + shapely.geometry.LineString( + [(0, 0), (7000, 7000)] + ), # Fault 3 (length ~9899 meters) + ], + 'NAME': ['Fault_1', 'Fault_2', 'Fault_3'], + 'DIP': [60, 45, 30], + } + ) + + faults.crs = "EPSG: 7850" + + # get the cropped fault dataset from parse_fault_map + map_data.raw_data[Datatype.FAULT] = faults + map_data.parse_fault_map() + cropped_faults = map_data.data[Datatype.FAULT] + + # calculate 5% length of the bounding box area + expected_minimum_fault_length = numpy.sqrt( + 0.05 + * (bounding_box['maxx'] - bounding_box['minx']) + * (bounding_box['maxy'] - bounding_box['miny']) + ) + + # Verify that the minimum_fault_length was calculated correctly + assert map_data.minimum_fault_length == pytest.approx(expected_minimum_fault_length, rel=1e-3) + + # There should only be two faults remaining (the second and third ones) + assert len(cropped_faults) == 2 + + # Ensure that the remaining faults are the correct ones + remaining_lengths = cropped_faults.geometry.length + assert all(remaining_lengths >= expected_minimum_fault_length) + assert cropped_faults.geometry.equals( + faults.iloc[1:]['geometry'] + ) # Faults 2 and 3 geometries should be the same in the faults raw and faults cropped + + +# are faults with length less than minimum_fault_length removed from the dataset? +def test_cropping_faults_by_minimum_fault_length(setup_map_data): + map_data = setup_map_data + + # Set minimum_fault_length in the config to 10 + map_data.config.fault_config['minimum_fault_length'] = 10.0 + + map_data.config.fault_config['name_column'] = 'NAME' + map_data.config.fault_config['dip_column'] = 'DIP' + + # Create a mock faults dataset with lengths < 10 and > 10 + faults = gpd.GeoDataFrame( + { + 'geometry': [ + shapely.geometry.LineString([(0, 0), (2, 2)]), # Length ~2.83 (should be cropped) + shapely.geometry.LineString([(0, 0), (5, 5)]), # Length ~7.07 (should be cropped) + shapely.geometry.LineString([(0, 0), (10, 10)]), # Length ~14.14 (should remain) + ], + 'NAME': ['Fault_1', 'Fault_2', 'Fault_3'], + 'DIP': [60, 45, 30], + 'DIPDIR': [90, 120, 150], + } + ) + + # Set the raw data in the map_data object to simulate loaded fault data + map_data.raw_data[Datatype.FAULT] = faults + map_data.parse_fault_map() + cropped_faults = map_data.data[Datatype.FAULT] + + # Assert that only 1 fault remains (the one with length ~14.14) + assert ( + len(cropped_faults) == 1 + ), f"Expected only 1 fault remaining after cropping, but found {len(cropped_faults)}" + + # Optionally, check that the remaining fault has the correct geometry (the long one) + assert cropped_faults.iloc[0].geometry.length == pytest.approx( + 14.14, 0.01 + ), f"Expected remaining fault length to be 14.14, but got {cropped_faults.iloc[0].geometry.length}" diff --git a/packages/map2loop/tests/mapdata/test_set_get_recreate_bounding_box.py b/packages/map2loop/tests/mapdata/test_set_get_recreate_bounding_box.py new file mode 100644 index 000000000..6e131c399 --- /dev/null +++ b/packages/map2loop/tests/mapdata/test_set_get_recreate_bounding_box.py @@ -0,0 +1,104 @@ +import pytest +from map2loop.mapdata import MapData +import geopandas +import shapely + + +@pytest.fixture +def md(): + return MapData() + + +def test_set_bounding_box_with_tuple(md): + bounding_box = (0, 10, 0, 10) + md.set_bounding_box(bounding_box) + + assert md.bounding_box == { + "minx": 0, + "maxx": 10, + "miny": 0, + "maxy": 10, + "top": 0, + "base": 2000, + }, "MapData.set_bounding_box() not working as expected" + + +def test_set_bounding_box_with_dict(md): + bounding_box = {"minx": 0, "maxx": 10, "miny": 0, "maxy": 10, "top": 5, "base": 15} + md.set_bounding_box(bounding_box) + + assert md.bounding_box == bounding_box, "MapData.set_bounding_box() not working as expected" + + +def test_bounding_box_keys(md): + bounding_box = (0, 10, 0, 10) + md.set_bounding_box(bounding_box) + + for key in ["minx", "maxx", "miny", "maxy", "top", "base"]: + assert key in md.bounding_box, f"MapData.bounding_box missing key: {key}" + + +def test_bounding_box_polygon(md): + bounding_box = (0, 10, 0, 10) + md.set_bounding_box(bounding_box) + + minx, miny, maxx, maxy = 0, 0, 10, 10 + lat_point_list = [miny, miny, maxy, maxy, miny] + lon_point_list = [minx, maxx, maxx, minx, minx] + expected_polygon = geopandas.GeoDataFrame( + index=[0], + crs=md.working_projection, + geometry=[shapely.geometry.Polygon(zip(lon_point_list, lat_point_list))], + ) + + assert md.bounding_box_polygon.equals( + expected_polygon + ), "MapData.bounding_box_polygon not returning the correct GeoDataFrame" + + +def test_get_bounding_box_as_dict(md): + bounding_box = {"minx": 0, "maxx": 10, "miny": 0, "maxy": 10, "top": 5, "base": 15} + md.set_bounding_box(bounding_box) + result = md.get_bounding_box() + + assert ( + result == bounding_box + ), "MapData.get_bounding_box() not returning the correct bounding box" + + +def test_get_bounding_box_as_polygon(md): + bounding_box = (0, 10, 0, 10) + md.set_bounding_box(bounding_box) + result = md.get_bounding_box(polygon=True) + + assert isinstance( + result, geopandas.GeoDataFrame + ), "MapData.get_bounding_box(polygon=True) not returning a GeoDataFrame" + assert result.equals( + md.bounding_box_polygon + ), "MapData.get_bounding_box(polygon=True) not returning the correct GeoDataFrame" + + +def test_recreate_bounding_box_str(md): + bounding_box = (0, 10, 0, 10) + md.set_working_projection("EPSG:4326") + md.set_bounding_box(bounding_box) + md.recreate_bounding_box_str() + + expected_str = "0,0,10,10,EPSG:4326" + assert ( + md.bounding_box_str == expected_str + ), "MapData.recreate_bounding_box_str() not working as expected" + + +def test_set_bounding_box_with_missing_keys(md): + bounding_box = { + "minx": 0, + "maxx": 10, + "miny": 0 + # Missing "maxy", "top", "base" + } + with pytest.raises(KeyError): + md.set_bounding_box( + bounding_box + ), "MapData.set_bounding_box accepting wrong argument, but should raise KeyError" diff --git a/packages/map2loop/tests/mapdata/test_set_get_working_projection.py b/packages/map2loop/tests/mapdata/test_set_get_working_projection.py new file mode 100644 index 000000000..a0c937cbc --- /dev/null +++ b/packages/map2loop/tests/mapdata/test_set_get_working_projection.py @@ -0,0 +1,43 @@ +import pytest +from map2loop.mapdata import MapData + + +@pytest.mark.parametrize( + "projection, expected_projection, bounding_box, expected_warning", + [ + (4326, "EPSG:4326", None, None), # happy path with int projection + ("EPSG:3857", "EPSG:3857", None, None), # happy path with str projection + (9999, "EPSG:9999", None, None), # edge case with high int projection + ("EPSG:9999", "EPSG:9999", None, None), # edge case with high str projection + (None, None, None, True), # error case with None + ([], None, None, True), # error case with list + ({}, None, None, True), # error case with dict + ], + ids=[ + "int_projection", + "str_projection", + "high_int_projection", + "high_str_projection", + "none_projection", + "list_projection", + "dict_projection", + ], +) +def test_set_working_projection(projection, expected_projection, bounding_box, expected_warning): + # Set up MapData object + map_data = MapData() + map_data.bounding_box = bounding_box + + # Call the method + map_data.set_working_projection(projection) + + # Assert the working projection is correctly set + assert map_data.working_projection == expected_projection, ( + f"Expected working_projection to be {expected_projection}, but got {map_data.working_projection}" + ) + + # Check for the presence of warnings via side effects (if applicable) + if expected_warning: + assert map_data.working_projection is None, ( + "Expected working_projection to remain None when an invalid projection is provided" + ) diff --git a/packages/map2loop/tests/project/test_config_arguments.py b/packages/map2loop/tests/project/test_config_arguments.py new file mode 100644 index 000000000..53e6ce356 --- /dev/null +++ b/packages/map2loop/tests/project/test_config_arguments.py @@ -0,0 +1,148 @@ +import pytest +import pathlib +from map2loop.project import Project +import map2loop + +# ------------------------------------------------------------------------------ +# Common fixtures or helper data (bounding box, minimal filenames, etc.) +# ------------------------------------------------------------------------------ + +@pytest.fixture +def minimal_bounding_box(): + return { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, + } + +@pytest.fixture +def geology_file(): + return str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/geology.geojson') + ) + +@pytest.fixture +def structure_file(): + return str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/structure.geojson') + ) + +@pytest.fixture +def dtm_file(): + return str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/dtm_rp.tif') + ) + +@pytest.fixture +def valid_config_dictionary(): + """ + A valid config dictionary that meets the 'structure' and 'geology' requirements + """ + return { + "structure": { + "dipdir_column": "azimuth2", + "dip_column": "dip" + }, + "geology": { + "unitname_column": "unitname", + "alt_unitname_column": "code", + } + } + + + +# 1) config_filename and config_dictionary both present should raise ValueError +def test_config_filename_and_dictionary_raises_error( + minimal_bounding_box, geology_file, dtm_file, structure_file, valid_config_dictionary +): + + with pytest.raises(ValueError, match="Both 'config_filename' and 'config_dictionary' were provided"): + Project( + bounding_box=minimal_bounding_box, + working_projection="EPSG:28350", + geology_filename=geology_file, + dtm_filename=dtm_file, + structure_filename=structure_file, + config_filename="dummy_config.json", + config_dictionary=valid_config_dictionary, + ) + +# 2) No config_filename or config_dictionary should raise ValueError +def test_no_config_provided_raises_error( + minimal_bounding_box, geology_file, dtm_file, structure_file +): + + with pytest.raises(ValueError, match="A config file is required to run map2loop"): + Project( + bounding_box=minimal_bounding_box, + working_projection="EPSG:28350", + geology_filename=geology_file, + dtm_filename=dtm_file, + structure_filename=structure_file, + ) + +# 3) Passing an unexpected argument should raise TypeError +def test_unexpected_argument_raises_error( + minimal_bounding_box, geology_file, dtm_file, structure_file, valid_config_dictionary +): + + with pytest.raises(TypeError, match="unexpected keyword argument 'config_file'"): + Project( + bounding_box=minimal_bounding_box, + working_projection="EPSG:28350", + geology_filename=geology_file, + dtm_filename=dtm_file, + structure_filename=structure_file, + config_dictionary=valid_config_dictionary, + config_file="wrong_kwarg.json", + ) + +# 4) Dictionary missing a required key should raise ValueError + +def test_dictionary_missing_required_key_raises_error( + minimal_bounding_box, geology_file, dtm_file, structure_file +): + + invalid_dictionary = { + "structure": {"dipdir_column": "azimuth2", "dip_column": "dip"}, + "geology": {"unitname_column": "unitname"} # alt_unitname_column missing + } + + with pytest.raises(ValueError, match="Missing required key 'alt_unitname_column' for 'geology'"): + Project( + bounding_box=minimal_bounding_box, + working_projection="EPSG:28350", + geology_filename=geology_file, + dtm_filename=dtm_file, + structure_filename=structure_file, + config_dictionary=invalid_dictionary, + ) + +# 5) All good => The Project should be created without errors +def test_good_config_runs_successfully( + minimal_bounding_box, geology_file, dtm_file, structure_file, valid_config_dictionary +): + project = None + try: + project = Project( + bounding_box=minimal_bounding_box, + working_projection="EPSG:28350", + geology_filename=geology_file, + dtm_filename=dtm_file, + structure_filename=structure_file, + config_dictionary=valid_config_dictionary, + ) + except Exception as e: + pytest.fail(f"Project initialization raised an unexpected exception: {e}") + + assert project is not None, "Project was not created." + assert project.map_data.config.structure_config["dipdir_column"] == "azimuth2" + assert project.map_data.config.structure_config["dip_column"] == "dip" + assert project.map_data.config.geology_config["unitname_column"] == "unitname" + assert project.map_data.config.geology_config["alt_unitname_column"] == "code" \ No newline at end of file diff --git a/packages/map2loop/tests/project/test_ignore_codes_setters_getters.py b/packages/map2loop/tests/project/test_ignore_codes_setters_getters.py new file mode 100644 index 000000000..0674ca959 --- /dev/null +++ b/packages/map2loop/tests/project/test_ignore_codes_setters_getters.py @@ -0,0 +1,73 @@ +import pathlib +from map2loop.project import Project +from map2loop.m2l_enums import Datatype +import map2loop +from unittest.mock import patch + + +# Sample test function for lithology and fault ignore codes +def test_set_get_ignore_codes(): + # Set up a sample bounding box and other required data + bbox_3d = { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, + } + + # Set up the config dictionary + config_dictionary = { + "structure": {"dipdir_column": "azimuth2", "dip_column": "dip"}, + "geology": {"unitname_column": "unitname", "alt_unitname_column": "code"}, + "fault": {'structtype_column': 'feature', 'fault_text': 'Fault'}, + } + with patch.object(Project, 'validate_required_inputs', return_value=None): + project = Project( + working_projection='EPSG:28350', + bounding_box=bbox_3d, + geology_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/geology.geojson') + ), + fault_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/faults.geojson') + ), + dtm_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/dtm_rp.tif') + ), + config_dictionary=config_dictionary, + structure_filename="", + ) + + # Define test ignore codes for lithology and faults + lithology_codes = ["cover", "Fortescue_Group", "A_FO_od"] + fault_codes = ['Fault_9', "NotAFault"] + + # Test Lithology ignore codes + project.set_ignore_lithology_codes(lithology_codes) + assert ( + project.map_data.get_ignore_lithology_codes() == lithology_codes + ), "Lithology ignore codes mismatch" + + # Test Fault ignore codes + project.set_ignore_fault_codes(fault_codes) + assert project.map_data.get_ignore_fault_codes() == fault_codes, "Fault ignore codes mismatch" + + project.map_data.parse_fault_map() + # check if the skipped fault has been removed now: + assert not project.map_data.get_map_data(Datatype.FAULT)['NAME'].str.contains('Fault_9').any() + + project.map_data.parse_geology_map() + # check if the skipped lithology has been removed now: + assert ( + not project.map_data.get_map_data(Datatype.GEOLOGY)['UNITNAME'] + .str.contains('Fortescue_Group') + .any() + ) + assert ( + not project.map_data.get_map_data(Datatype.GEOLOGY)['UNITNAME'].str.contains('cover').any() + ) diff --git a/packages/map2loop/tests/project/test_plot_hamersley.py b/packages/map2loop/tests/project/test_plot_hamersley.py new file mode 100644 index 000000000..dadbb7d70 --- /dev/null +++ b/packages/map2loop/tests/project/test_plot_hamersley.py @@ -0,0 +1,99 @@ +import pytest +from map2loop.project import Project +from map2loop.sorter import SorterUseNetworkX +from map2loop.m2l_enums import VerboseLevel +from unittest.mock import patch +from pyproj.exceptions import CRSError +import requests +import os + +# Define constants for common parameters +bbox_3d = { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, +} +loop_project_filename = "wa_output.loop3d" + +# create a project function +def create_project(state_data="WA", projection="EPSG:28350"): + return Project( + use_australian_state_data=state_data, + working_projection=projection, + bounding_box=bbox_3d, + verbose_level=VerboseLevel.NONE, + loop_project_filename=loop_project_filename, + overwrite_loopprojectfile=True, + ) + + +# is the project running? +def test_project_execution(): + try: + proj = create_project() + except Exception: + pytest.skip("Skipping the project test from server data due to loading failure") + try: + proj.set_sorter(SorterUseNetworkX()) + proj.run_all(take_best=True) + except requests.exceptions.ReadTimeout: + pytest.skip( + "Skipping the project test from server data due to timeout while attempting to run proj.run_all" + ) + + # if no timeout: + # is there a project? + assert proj is not None, "Plot Hamersley Basin failed to execute" + # is there a LPF? + assert os.path.exists( + loop_project_filename + ), f"Expected file {loop_project_filename} was not created" + + +# Is the test_project_execution working - ie, is the test skipped on timeout? +def test_timeout_handling(): + # Mock `openURL` in `owslib.util` to raise a ReadTimeout directly + with patch("owslib.util.openURL"): + # Run `test_project_execution` and check if the skip occurs + result = pytest.main( + ["-q", "--tb=short", "--disable-warnings", "-k", "test_project_execution"] + ) + assert ( + result.value == pytest.ExitCode.OK + ), "The test was not skipped as expected on timeout." + + +# does the project fail when the CRS is invalid? +def test_expect_crs_error(): + try: + with pytest.raises(CRSError): + create_project(projection="InvalidCRS") + print("CRSError was raised as expected.") + except requests.exceptions.ReadTimeout: + print("Timeout occurred, skipping test_expect_crs_error.") + pytest.skip("Skipping test_expect_crs_error due to a timeout.") + + +# does the project fail when the Aus state name is invalid? +def test_expect_state_error(): + try: + with pytest.raises(ValueError): + create_project(state_data="InvalidState") + print("ValueError was raised as expected.") + except requests.exceptions.ReadTimeout: + print("Timeout occurred, skipping test_expect_state_error.") + pytest.skip("Skipping test_expect_state_error due to a timeout.") + + +# does the project fail when a config file is invalid? +def test_expect_config_error(): + try: + with pytest.raises(Exception): + create_project(config_file='InvalidConfig.csv') + print("FileNotFoundError//Exception by catchall in project.py was raised as expected.") + except requests.exceptions.ReadTimeout: + print("Timeout occurred, skipping test_expect_config_error.") + pytest.skip("Skipping test_expect_config_error due to a timeout.") diff --git a/packages/map2loop/tests/project/test_thickness_calculations.py b/packages/map2loop/tests/project/test_thickness_calculations.py new file mode 100644 index 000000000..7f601c84b --- /dev/null +++ b/packages/map2loop/tests/project/test_thickness_calculations.py @@ -0,0 +1,1749 @@ +# imports +import pandas +import geopandas +import numpy + +from map2loop.utils import load_map2loop_data +from map2loop.thickness_calculator import InterpolatedStructure, StructuralPoint +from map2loop.project import Project + +# 1. self.stratigraphic_column.stratigraphicUnits, +st_units = pandas.DataFrame( + { + 'Unnamed: 0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'layerId': [7, 0, 10, 8, 1, 5, 9, 4, 3, 2, 6], + 'name': [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + ], + 'minAge': [0.0] * 11, + 'maxAge': [100000.0] * 11, + 'group': [None] * 11, + 'supergroup': [None] * 11, + 'stratigraphic_Order': list(range(11)), + 'colour': [ + '#5d7e60', + '#387866', + '#628304', + '#a2f290', + '#0c2562', + '#5fb3c5', + '#f48b70', + '#1932e2', + '#106e8a', + '#d0d47c', + '#e7f2f3', + ], + } +) + +# 2. self.stratigraphic_column.column +st_column = [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + 'Fortescue_Group', +] + +# 3. map_data.basal_contacts +basal_c = [ + {'ID': 0, 'basal_unit': 'Turee_Creek_Group', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Boolgeeda_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Brockman_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Weeli_Wolli_Formation', 'type': 'BASAL'}, + {'ID': 4, 'basal_unit': 'Jeerinah_Formation', 'type': 'BASAL'}, + {'ID': 5, 'basal_unit': 'Bunjinah_Formation', 'type': 'BASAL'}, + {'ID': 6, 'basal_unit': 'Marra_Mamba_Iron_Formation', 'type': 'BASAL'}, + {'ID': 7, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 8, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 9, 'basal_unit': 'Wittenoom_Formation', 'type': 'BASAL'}, + {'ID': 10, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'BASAL'}, + {'ID': 11, 'basal_unit': 'Woongarra_Rhyolite', 'type': 'BASAL'}, +] +bc_geoms = geopandas.GeoSeries.from_wkt( + [ + 'MULTILINESTRING ((520000.0000000000000000 7506463.0589317083358765, 520000.0000000000000000 7506464.0583261400461197, 521798.5784270099829882 7506667.5086746597662568, 524292.0583883899962530 7507105.0368000296875834, 525888.7772752699675038 7507345.5593877695500851, 526916.8410634599858895 7507564.5817003501579165, 528098.0088455299846828 7507783.0997126800939441, 529344.8316910399589688 7507958.1297348998486996, 530263.5311044099507853 7508220.6498684398829937, 531357.2706492099678144 7508395.6678343201056123, 532013.4010351699544117 7508548.6697535198181868, 532538.3520777500234544 7508548.6775182196870446, 532932.1086069300072268 7508483.1717491699382663, 533085.1519033299991861 7508308.1688938299193978, 533107.0194513100432232 7508045.6694244500249624, 533041.4099823100259528 7507717.6704597100615501, 532866.4200693099992350 7507455.1614942299202085, 531685.2195994600187987 7506755.1383216800168157, 530875.8998375800438225 7506317.6329081403091550, 530175.9800506900064647 7506011.6195486104115844, 529279.1401694599771872 7505442.5995908901095390, 528426.1115621499484405 7505027.0810785600915551, 526654.3696992900222540 7504655.0613197097554803, 525210.7310010100482032 7504567.5296983895823359, 523067.1991962700267322 7504217.5111659299582243, 521098.6489177999901585 7503867.9904129095375538, 520414.0195790100260638 7503782.4897812502458692, 520000.0000000000000000 7503710.2290291301906109, 520000.0000000000000000 7503711.2441460378468037))', + 'MULTILINESTRING ((520000.0000000000000000 7503245.2598590906709433, 520000.0000000000000000 7503246.2595371659845114, 520271.9002807399956509 7503274.9797609802335501, 520982.5192159600555897 7503437.4804947897791862, 521754.8289336899761111 7503561.4991028197109699, 522673.5081250499933958 7503780.5075413398444653, 523439.0304306600592099 7503868.0182901099324226, 525079.5116741600213572 7504086.5288977697491646, 526041.9114880500128493 7504086.5408970797434449, 527157.4277337800012901 7504239.5578404404222965, 528710.4300827099941671 7504589.5780827598646283, 529322.8810412200400606 7504699.1013501295819879, 529519.7383159700548276 7504721.1013953704386950, 529782.1897067499812692 7504852.1116183400154114, 529846.5792647199705243 7505018.1105302302166820, 530434.1504480800358579 7505322.1195039302110672, 531001.4219496899750084 7505585.1193884601816535, 531730.7807765699690208 7505767.6295145899057388, 531892.8382770799798891 7505828.6311367200687528, 532231.0984191700117663 7506036.1303443796932697, 532535.6622749799862504 7506280.1284634796902537, 533205.6884558700257912 7506665.6397261302918196, 533571.2115816300502047 7506929.6612275000661612, 534139.7121901500504464 7507214.1599170295521617, 534444.3105956399813294 7507356.1602175496518612, 534769.1609872799599543 7507478.1677699098363519, 534911.2916754200123250 7507518.6696750596165657, 535114.3212854999583215 7507640.6607389999553561, 535236.1208061299985275 7507823.1785498997196555, 535358.0217514700489119 7508351.1807611100375652, 535520.5093329700175673 7508594.6879638703539968, 535743.8194368999684229 7508818.1783391702920198, 536007.7499623399926350 7508980.6794774401932955, 536576.2579947899794206 7509386.6783681297674775, 536718.4177284899633378 7509630.1906582303345203, 536637.2394275299739093 7509975.6913913199678063, 536604.7901494553079829 7510000.0000000000000000, 536606.4580603817012161 7510000.0000000000000000), (533429.9102329264860600 7510000.0000000000000000, 533432.8839227686403319 7510000.0000000000000000, 533307.4205499000381678 7509955.1997412098571658, 532718.6210473099490628 7509792.6996827302500606, 531297.2519883899949491 7509264.6781625803560019, 530525.7001818099524826 7509021.1595332501456141, 529551.0197801099857315 7508858.6513834102079272, 528251.4977760600158945 7508655.6207956997677684, 527134.7110856899525970 7508351.0991824995726347, 525794.5900796599453315 7508066.5579961901530623, 524596.6507077199639753 7507782.5406945496797562, 523662.6590976800071076 7507681.0381808001548052, 522830.1799164600088261 7507498.0297148795798421, 522038.3083402099437080 7507295.0188862504437566, 520677.9482569899992086 7507010.9990820102393627, 520000.0000000000000000 7506956.5663501676172018, 520000.0000000000000000 7506957.5695682624354959), (550000.0000000000000000 7490095.5414067916572094, 550000.0000000000000000 7490094.5419130371883512, 549848.4078108200337738 7490011.2184614501893520, 549837.1990841374499723 7490000.0000000000000000, 549836.1991053668316454 7490000.0000000000000000))', + 'MULTILINESTRING ((520000.0000000000000000 7500803.4896762184798717, 520000.0000000000000000 7500804.4889609171077609, 520473.5791580000077374 7500907.4720744201913476, 521144.7272773912409320 7501014.1576358489692211, 521145.5101736339274794 7501013.5373818902298808), (523032.4352534925565124 7510000.0000000000000000, 523034.2386217917664908 7510000.0000000000000000, 522935.2510594900231808 7509934.0400712601840496, 521858.9592969599762000 7509706.5850364100188017, 521402.0897869099862874 7509610.0089996904134750, 520906.0067273600143380 7509526.0576650602743030, 520005.1707852099789307 7509373.5673304200172424, 520000.0000000000000000 7509372.6918550245463848, 520000.0000000000000000 7509373.7060850486159325), (521279.9150416324264370 7501034.6344962781295180, 521278.8505533785792068 7501035.4778430974110961, 521543.4397763700108044 7501077.5368893602862954, 522373.8810591999790631 7501209.4896944900974631, 523030.4162207188783213 7501391.7815449377521873, 523031.2068098201416433 7501391.1711508315056562), (527953.2198819570476189 7501611.1241540247574449, 527952.4394709372427315 7501611.9876126917079091, 527953.2198819570476189 7501611.1241540247574449, 528269.5491108499700204 7501675.5494663203135133, 528644.5797393700340763 7501769.5606017401441932, 529113.4114604999776930 7501800.5704611297696829, 529800.9698748099617660 7501832.0698146400973201, 530707.2799876299686730 7501832.0906658703461289, 531832.3692170899594203 7502050.6015144297853112, 532080.1110293077072129 7502146.1749884476885200, 532080.7953341902466491 7502145.4462257148697972), (532471.3224294331157580 7501854.8021797873079777, 532470.6117427451536059 7501856.0567162586376071, 532551.2005992300109938 7501832.0981646096333861, 533020.0292473699664697 7501925.6022116597741842, 533613.8304010899737477 7502019.6212948998436332, 534488.9388966499827802 7502207.1201175795868039, 534926.4299064800143242 7502457.1309860097244382, 535239.0000169699778780 7502707.1384293204173446, 535551.5432611800497398 7503144.6412358498200774, 535676.5302752000279725 7503519.6384271895512938, 535926.5516183800064027 7503894.6519359098747373, 536270.3683300199918449 7504082.1422335496172309, 536676.5897916300455108 7504113.6475562499836087, 536989.1799710299819708 7504051.1521394196897745, 537895.5108797400025651 7503957.1480598496273160, 538364.2599795899586752 7504113.6601144503802061, 539051.8112280699424446 7504394.6494075302034616, 539676.8889227600302547 7504613.6505787996575236, 540145.7008413899457082 7504988.6477605598047376, 540770.7923636999912560 7505332.1517110802233219, 541145.7601316999644041 7505676.1485500596463680, 541614.6014505899511278 7506144.6516708899289370, 541895.8687167000025511 7506645.1619760403409600, 542083.3585663399426267 7507145.1590369800105691, 542208.3892406800296158 7507707.6589486598968506, 542145.9084491999819875 7508332.6592682404443622, 542239.6581270300084725 7508645.1607529902830720, 542458.4708741100039333 7508957.6600440395995975, 542677.2416874299524352 7509082.6624572100117803, 542864.7195600100094453 7509239.1611510002985597, 542927.2699991799890995 7509989.1508510801941156, 542927.2698631049133837 7510000.0000000000000000, 542928.2698600001167506 7510000.0000000000000000), (542679.7431424340466037 7490560.7071135109290481, 542680.4317333664512262 7490559.9283441118896008, 542592.3105463000247255 7490517.6513492902740836, 542387.8711325100157410 7490321.1590552795678377, 542278.4307441100245342 7490048.1597586404532194, 542272.8549225005554035 7490000.0000000000000000, 542271.8556170752272010 7490000.0000000000000000), (544273.9324713232927024 7491662.8551605539396405, 544274.6237809687154368 7491662.1230727611109614, 544238.3782646199688315 7491635.1603938303887844, 544135.6185495100216940 7491432.1611171104013920, 543918.3223162599606439 7491197.6698569804430008, 543420.6783191299764439 7490869.6585929403081536, 543038.3205035700229928 7490699.6702497899532318, 542815.3584537300048396 7490624.6607478400692344, 542773.7009090904612094 7490604.6751364599913359, 542773.0674823645967990 7490605.4474027175456285), (550000.0000000000000000 7492637.9491975577548146, 550000.0000000000000000 7492636.9501683469861746, 549769.4085893699666485 7492521.7100056502968073, 549501.4603817999595776 7492462.1984654497355223, 549174.0184454700211063 7492372.7009732704609632, 548668.0100578600540757 7492343.2083122497424483, 547774.9591860000509769 7492343.1903728395700455, 547358.2082652900135145 7492402.6892563700675964, 546971.2795143900439143 7492432.1799347596243024, 546524.7789019900374115 7492402.6676745600998402, 546018.6897931500570849 7492283.6581326704472303, 545304.2811550099868327 7491926.1592656997963786, 545036.3909502900205553 7491777.1605294896289706, 544828.0104751100298017 7491628.6593068800866604, 544708.9605470900423825 7491509.6700969301164150, 544618.5316022647311911 7491404.1884233895689249, 544617.8842772342031822 7491404.9697802281007171))', + 'MULTILINESTRING ((520293.4320175029570237 7501708.4171284157782793, 520293.4981995084672235 7501707.4205201249569654, 520000.0000000000000000 7501674.5829317998141050, 520000.0000000000000000 7501675.5891712857410312), (520000.0000000000000000 7508845.7206690181046724, 520000.0000000000000000 7508846.7200987627729774, 520052.9280038099968806 7508862.0008838102221489, 521090.5512352299992926 7509073.0105239599943161, 522005.9512440299731679 7508998.0294947298243642, 522324.3404851399827749 7509085.0209561996161938, 522451.5710224300273694 7509097.0301381601020694, 522591.6214781600283459 7509122.0274216998368502, 524151.1692813800182194 7509438.0516055300831795, 524456.6897462300257757 7509487.5595593899488449, 525140.4391166700515896 7509496.5704689295962453, 526119.0513356799492612 7509602.5791763495653868, 527124.1199973500333726 7509920.1001460999250412, 527347.8288250340847299 7510000.0000000000000000, 527348.8276206540176645 7510000.0000000000000000), (522351.1343196252128109 7501916.1655494002625346, 522352.2528255800134502 7501915.3037830777466297, 521104.1391963799833320 7501751.4809457501396537, 520737.7721352900261991 7501723.9786810996010900, 520420.9591136300005019 7501715.1471717469394207, 520420.1756578796193935 7501715.7678689807653427), (527125.4548547224840149 7502377.7747816061601043, 527126.3209163650171831 7502376.8168430794030428, 526700.8509709000354633 7502355.5393781904131174, 525246.2184770300518721 7502408.5209231497719884, 524294.1117317799944431 7502249.5209683403372765, 523447.7796929900068790 7502091.0098048197105527, 522583.0080486031947657 7501863.5510688340291381, 522582.2173395422287285 7501864.1615555742755532), (530798.8710058355936781 7503475.2625857004895806, 530799.6446038441499695 7503474.4564733263105154, 530292.3180354699725285 7503316.0992012796923518, 529603.4816261499654502 7503154.0790386795997620, 529076.7311885600211099 7502911.0787954898551106, 528266.3094259300269186 7502728.5696691796183586, 527759.8099331599660218 7502688.0595766501501203, 527233.1392903799423948 7502607.0608489904552698, 527065.4771157877985388 7502593.2268756395205855, 527064.8072133261011913 7502593.9678452722728252), (539955.9743753559887409 7510000.0000000000000000, 539956.9738961729453877 7510000.0000000000000000, 540057.3710624600062147 7509681.6689012898132205, 540295.3694572099484503 7509391.1672181095927954, 540480.4705794400069863 7509232.1700646700337529, 540612.7384639199590310 7509073.6586520997807384, 540665.5814983600284904 7508571.1700814096257091, 540348.2114157699979842 7507671.6596398204565048, 539925.0498745300574228 7507090.1577369300648570, 539607.6706715000327677 7506746.1599598200991750, 539052.2007989300182089 7506296.6606875201687217, 538205.9094809900270775 7505952.6699313903227448, 537068.6509273999836296 7505741.1603932101279497, 536169.3901651899795979 7505661.6614198600873351, 535217.2919880599947646 7505503.1506273699924350, 534635.4301719899522141 7505317.6512130200862885, 534027.0999437200371176 7504974.1400412498041987, 533603.8817716699559242 7504709.6272615399211645, 533233.6514340500580147 7504312.6317273303866386, 532466.6187711399979889 7503969.1208717301487923, 531858.3409144999459386 7503651.6198519701138139, 531329.3389675599755719 7503360.6116438498720527, 531139.0552856920985505 7503265.5203097239136696, 531138.3627150403335690 7503266.2411932516843081), (546233.0059536607004702 7490000.0000000000000000, 546232.0059536602348089 7490000.0000000000000000, 546232.0095286100404337 7490128.6799554601311684, 546425.2915191700449213 7490406.1914659300819039, 546769.6909271699842066 7490574.1895378697663546, 547082.8998588599497452 7490707.6977680595591664, 547486.2694205499719828 7490854.1999811800196767, 548366.2786710499785841 7491037.7003361200913787, 548806.2997251900378615 7491074.2083575604483485, 549612.9294149799970910 7491257.7084028301760554, 550000.0000000000000000 7491301.9012328926473856, 550000.0000000000000000 7491300.8947363123297691))', + 'MULTILINESTRING ((520000.0000000000000000 7496937.7387266764417291, 520000.0000000000000000 7496940.1299340603873134, 520002.3885029399534687 7496934.9419469097629189, 520209.1083645300241187 7496271.9499225998297334, 520062.0993496900191531 7496119.9397722100839019, 520000.0000000000000000 7496068.6646597366780043, 520000.0000000000000000 7496069.9614912457764149), (523381.4890356060350314 7498414.2473349031060934, 523382.0906666574883275 7498413.4010553266853094, 523169.7519518999615684 7498336.9916863301768899, 523067.8999133500619791 7498311.9897804697975516, 522895.7909434399916790 7498236.4781237496063113, 522615.2015952100045979 7498072.4703307598829269, 521882.6812058400246315 7497821.9590960601344705, 521526.3299231799901463 7497779.4584824498742819, 521208.3405302499886602 7497768.4611136997118592, 520979.3200964700081386 7497743.9708666298538446, 520246.9187887199805118 7497531.9419434396550059, 520000.0000000000000000 7497468.9978941539302468, 520000.0000000000000000 7497470.0298743853345513), (525280.9678179419133812 7499008.5035365633666515, 525281.4949324887711555 7499007.5775622371584177, 525203.0376252799760550 7498994.5084805004298687, 524869.2387656100327149 7498918.5108462898060679, 524080.2303868400631472 7498843.0101468600332737, 523609.8704664499964565 7498706.4891386404633522, 523343.3935284681501798 7498640.4214922022074461, 523342.8145249948720448 7498641.2359428005293012), (534272.9718145289225504 7499007.8629990173503757, 534273.7464286693139002 7499006.7735539842396975, 533821.5094927400350571 7499055.6005880599841475, 533411.8113768999464810 7499131.0899759698659182, 532789.7513422400224954 7499313.0907301902770996, 532046.2501181999687105 7499359.0887924302369356, 531560.6700862100115046 7499404.5924122100695968, 531257.2500160000054166 7499404.5794073604047298, 530968.9126983700552955 7499419.5698141297325492, 530650.2800068800570443 7499495.5805069999769330, 530361.9716437599854544 7499601.5801136298105121, 530210.2997778200078756 7499647.0707991197705269, 530073.7308944800170138 7499647.0701257800683379, 529891.5828257299726829 7499586.5608606198802590, 529755.0991281700553373 7499495.5807948503643274, 529648.8292915900237858 7499434.5578709095716476, 528920.5188349500531331 7499359.0610773200169206, 527979.7492919899523258 7499328.5417763004079461, 527312.1506295599974692 7499283.0298913996666670, 526705.1804492699448019 7499192.0412488700821996, 525809.9994778400287032 7499116.0194425499066710, 525476.2009420599788427 7499040.0108542302623391, 525386.5961969492491335 7499025.0848800987005234, 525386.1020599714247510 7499025.9529232168570161), (547423.9512601103633642 7510000.0000000000000000, 547425.9598791532916948 7510000.0000000000000000, 547270.3128660599468276 7509910.6501949401572347, 547123.4215484600281343 7509784.1305715003982186, 546931.6794150100322440 7509581.6403483096510172, 546815.5487570599652827 7509245.1501061804592609, 546813.4198143399553373 7508786.6386062400415540, 546793.0495528799947351 7508519.6417614798992872, 546760.1718947299523279 7508297.1516221202909946, 546630.1392768600489944 7507705.6514096902683377, 546603.1807938199490309 7507387.6502600098028779, 546506.4978075700346380 7507121.1480851704254746, 546347.0615013099741191 7507032.6372693302109838, 546098.2091887400019914 7506843.1486029401421547, 545931.3088385299779475 7506525.6525994800031185, 545783.2304036399582401 7506157.6511867698282003, 545590.6004368900321424 7505770.1490056701004505, 545302.2208498599939048 7505307.1615147199481726, 544943.5218329799827188 7504761.6597001496702433, 544725.5899502099491656 7504406.6611849600449204, 544501.3301299399463460 7504057.6593816699460149, 544123.7492673799861223 7503569.6505599301308393, 543753.3717356600100175 7503247.1585790300741792, 543357.1403491899836808 7502835.6512618502601981, 543024.9804781300481409 7502538.1512261899188161, 541869.5108813600381836 7501596.1483753900974989, 541378.0882920400472358 7501255.1483567599207163, 540868.3004191899672151 7501022.1397865395992994, 540434.9686214999528602 7500840.1404092302545905, 539886.7884534699842334 7500575.6385581698268652, 539472.3796638699714094 7500361.6388751100748777, 539128.0079635200090706 7500159.6402211003005505, 538782.9978578999871388 7499830.6288305800408125, 538476.5108094000024721 7499571.6312278602272272, 538240.7492773899575695 7499470.6311592804268003, 537903.1197484800359234 7499358.1302875401452184, 537565.7982155899517238 7499296.1290474496781826, 536808.4890007500071079 7499179.6114020701497793, 536356.4701961500104517 7499080.1195044601336122, 535866.5394221700262278 7499031.6102768797427416, 535319.4902977800229564 7498996.6221683695912361, 534772.7408331099431962 7499031.6016195202246308, 534285.8976723682135344 7499162.2542209504172206, 534285.3182902499102056 7499163.0690846843644977), (537098.9795529744587839 7490000.0000000000000000, 537097.9807571568526328 7490000.0000000000000000, 537082.7614457299932837 7490032.1078298501670361, 537064.9390341599937528 7490293.1209420198574662, 537085.1899132600519806 7490547.6190917901694775, 537118.4598460316192359 7490667.2163930963724852, 537119.4298784348648041 7490666.9776619225740433), (537417.0468347219284624 7490706.0521089499816298, 537416.5515447265934199 7490706.2860060287639499, 537416.1256071323296055 7490706.4396555135026574, 537487.4418410599464551 7490882.6095111798495054, 537654.0587315800366923 7491149.1116127697750926, 537858.8020591400563717 7491415.1179784098640084, 537992.9993732899893075 7491548.1193249300122261, 538056.9795873910188675 7491588.6379907196387649, 538057.9059167269151658 7491588.2641664957627654), (538156.4071117863059044 7491653.3615979626774788, 538155.5143074670340866 7491653.8223220268264413, 538299.8710431599756703 7491877.6190374298021197, 538434.6211939599597827 7492137.6200953898951411, 538652.5613591700093821 7492492.6281045097857714, 538768.5901984019437805 7492667.4812555732205510, 538769.1307524497387931 7492666.4872721917927265), (539076.4825414990773425 7492310.6365013578906655, 539076.0048737846082076 7492311.5148478839546442, 539256.6677916899789125 7492496.1301840599626303, 539703.5787173799471930 7492843.6307888999581337, 540053.9791185399517417 7492994.6384690301492810, 540455.2317104099784046 7493113.1314762597903609, 540786.5202559200115502 7493232.1414313204586506, 541041.4298104699701071 7493351.6418332597240806, 541239.2018903200514615 7493478.1304302699863911, 541332.9279536200920120 7493553.2876135194674134, 541333.7303589903749526 7493552.6927433693781495), (541996.2659877514233813 7493323.2507506581023335, 541995.3182718952884898 7493323.6649971948936582, 542500.6798850599443540 7493961.1386070298030972, 542743.6307616099948063 7494233.6408173600211740, 543082.0077898399904370 7494518.1417143298313022, 543356.1986791399540380 7494663.1389560597017407, 543789.2602507199626416 7494794.6498441295698285, 544139.2511316499439999 7494849.6397826299071312, 544641.6300744400359690 7494840.6485728900879622, 545175.3190517800394446 7494736.1496383799239993, 545741.0922157400054857 7494688.1493368400260806, 546307.7507409299723804 7494838.1492867600172758, 546786.0567151700379327 7495109.1620891699567437, 547188.0597629300318658 7495399.6700470102950931, 547621.6999697199789807 7495652.1683375202119350, 547965.6989555200561881 7495764.6696619400754571, 548207.3907420800533146 7495776.1700877603143454, 548481.1595977500546724 7495844.6798296095803380, 548863.0792892000172287 7495925.1790779400616884, 549506.2123941599857062 7496087.1879144096747041, 550000.0000000000000000 7496197.8834195006638765, 550000.0000000000000000 7496196.8585999859496951))', + 'MULTILINESTRING ((524266.0954626141465269 7490000.0000000000000000, 524264.0581623602192849 7490000.0000000000000000, 524274.6716975499875844 7490005.9794874498620629, 524580.9296716400422156 7490207.9900786597281694, 525263.6310803899541497 7490681.4799169795587659, 525633.8797883000224829 7490965.9987491900101304, 526080.4097873299615458 7491262.5022844001650810, 526392.7913924700114876 7491426.5083817597478628, 526680.5080642091343179 7491700.2571335136890411, 526680.9617382686119527 7491699.3084705946967006), (527736.6980700913118199 7490014.9772448325529695, 527736.3587646851083264 7490015.9580855472013354, 528010.6905607599765062 7490033.0087006296962500, 528554.6395948999561369 7490014.5194057403132319, 528659.0582184605300426 7490000.0000000000000000, 528651.7973667406477034 7490000.0000000000000000), (528242.3239959123311564 7492064.7222724705934525, 528241.7088020627852529 7492065.7254664935171604, 528666.1973901799647138 7492063.5307877697050571, 529212.3307416000170633 7491907.5399811398237944, 529719.6322913799667731 7491605.5284209195524454, 530163.0910896200221032 7491234.0305473301559687, 530511.5112620899453759 7490958.5415406301617622, 531453.6296071013202891 7490000.0000000000000000, 531452.2274564296239987 7490000.0000000000000000))', + 'MULTILINESTRING ((522423.1507045699981973 7499760.7176261981949210, 522423.9203800179529935 7499759.6364277126267552, 522349.8299966399208643 7499766.9809384401887655, 522165.4282854500343092 7499767.9805885404348373, 521783.7590640200069174 7499750.9782179798930883, 521446.5883731800131500 7499727.4790324503555894, 521058.2386758999782614 7499640.4595605703070760, 520701.5588286300189793 7499521.4718082202598453, 520204.5092078600428067 7499313.9601706201210618, 520000.0000000000000000 7499193.2638115361332893, 520000.0000000000000000 7499194.4249778995290399), (522555.9904544320888817 7499746.5444441922008991, 522555.4111143556656316 7499747.3582698311656713, 522555.9904544320888817 7499746.5444441922008991, 522960.0394677100121044 7499706.4914416698738933, 523297.1696609099744819 7499723.9880460202693939, 523539.3288009500829503 7499824.4885594900697470, 523807.0801918199867941 7499963.0007417099550366, 524452.2040554300183430 7500171.9706728672608733, 524451.4118937810417265 7500172.7652285397052765), (529030.4932832464110106 7500200.7058669319376349, 529031.2178299439838156 7500199.9257171414792538, 528991.0805857500527054 7500183.0489843999966979, 528679.6486600999487564 7500223.0495249899104238, 527986.5626644400181249 7500239.5480527197942138, 527668.6504820300033316 7500241.0489183496683836, 526409.2975434400141239 7500216.0304062804207206, 525849.7599196099909022 7500225.5205484097823501, 525373.0094749700510874 7500266.0211616195738316, 525080.3788815899752080 7500248.5201182495802641, 524717.1588156500365585 7500210.0084451204165816, 524719.1996265298221260 7500211.2304345155134797), (532993.0805511008948088 7500834.6403764961287379, 532993.3489576445426792 7500834.0452068466693163, 532993.5077827317873016 7500833.7281568944454193, 532828.7419588699704036 7500779.5898232003673911, 532059.2178660000208765 7500783.5925765298306942, 531715.7397694600513205 7500766.5896713202819228, 531009.3391590700484812 7500675.0807855604216456, 530322.5721776599530131 7500685.0713867703452706, 529769.5689500400330871 7500739.0687459995970130, 529089.1306385099887848 7500749.0586953703314066, 528660.8910052364226431 7500745.6074274424463511, 528660.2112883693771437 7500746.3392704948782921), (545728.9288492670748383 7510000.0000000000000000, 545730.2700878457399085 7510000.0000000000000000, 545584.7022705799899995 7509837.1403594203293324, 545386.0617979000089690 7509520.1391145400702953, 545238.0399551700102165 7509170.6511606499552727, 545122.0989813000196591 7508859.6512553403154016, 544986.9678246000548825 7508529.6407046103850007, 544743.6496689900523052 7508180.6489076800644398, 544659.9523990500019863 7507964.6498591499403119, 544499.4011402300093323 7507634.6525363801047206, 544320.0205451600486413 7507368.1501189004629850, 544044.8593324699904770 7507007.1477869795635343, 543852.7414086499484256 7506721.6492448104545474, 543666.6799941799836233 7506391.6518390402197838, 543486.6189286799635738 7505966.1496158502995968, 543177.9487287199590355 7505267.6511040404438972, 542851.5999981700442731 7504830.1483773496001959, 542628.1512679100269452 7504653.1477385796606541, 541996.4995115000056103 7504230.1516731502488256, 541486.3089837899897248 7503927.6487837303429842, 541052.4398514899658039 7503624.6398146301507950, 540714.5785347600467503 7503454.6588033195585012, 540331.7501426199451089 7503195.6492001600563526, 539885.0605549899628386 7502867.1490661101415753, 539534.2795183400157839 7502671.6515465499833226, 539088.3392634700285271 7502508.6507563600316644, 538115.0518896100111306 7502437.6390984999015927, 537790.3291457899613306 7502369.1493166498839855, 537573.5679509800393134 7502255.6492295796051621, 537394.9012426600093022 7502116.6387358000501990, 537330.5981657799566165 7501970.6416400596499443, 537323.5123430900275707 7501824.6311678895726800, 537322.0002546999603510 7501506.1379719302058220, 537263.7595541899790987 7501296.6407880699262023, 537039.8101914300350472 7501017.6294886004179716, 536612.6102296400349587 7500784.6198029303923249, 536218.0508771500317380 7500716.6298277098685503, 535734.4196069199824706 7500662.1207142304629087, 534972.0878904700512066 7500831.6092656701803207, 534616.1697530100354925 7500865.1187592102214694, 534266.3894202300580218 7500867.1096779303625226, 534081.7079486900474876 7500817.1092230295762420, 533864.9377766799880192 7500710.1096216002479196, 533501.7106121799442917 7500546.6094194203615189, 533336.0891072107478976 7500498.7944972664117813, 533335.5105264986632392 7500499.6086738053709269), (540652.7093492220155895 7490387.5987470783293247, 540651.8620166190667078 7490388.1283743241801858, 540716.9413671500515193 7490648.6385009195655584, 540890.1206744499504566 7490959.6384145403280854, 541069.2507452500285581 7491181.1377072203904390, 541209.8013249200303108 7491327.1401432603597641, 541318.3109204999636859 7491402.6507735904306173, 541522.3790933899581432 7491516.1502364799380302, 541726.1788735899608582 7491597.6481381803750992, 541866.3201340900268406 7491635.1395976599305868, 542152.3343121195212007 7491644.4789796750992537, 542152.5743099044775590 7491643.5087957028299570), (542310.5385527068283409 7491467.5166142378002405, 542310.2017283077584580 7491468.4781577382236719, 542387.0478783199796453 7491479.6506026098504663, 542508.2986270999535918 7491568.1487769903615117, 542623.6207645100075752 7491745.6495260195806623, 542707.3887829299783334 7491974.6494024097919464, 542804.3198439499828964 7492292.1578110801056027, 542874.8705274199601263 7492419.1503577204421163, 543015.3294375799596310 7492539.1386309601366520, 543157.3559995990945026 7492607.0648720515891910, 543158.2323379423469305 7492606.5854770792648196), (543285.3188949242467061 7492641.8684887290000916, 543284.1699949501780793 7492642.7301141498610377, 543785.6400337499799207 7492706.6602805098518729, 544142.1796537400223315 7492794.1595931304618716, 544346.3083736399421468 7492926.6612573396414518, 544550.7481039999984205 7493129.1590701797977090, 544793.1985071500530466 7493287.1483336500823498, 545098.8382594300201163 7493361.6606107000261545, 545620.5201594299869612 7493403.1614144695922732, 546046.6321061899652705 7493420.1597612500190735, 546440.8310840800404549 7493399.1707573700696230, 546822.0285851999651641 7493326.6682714400812984, 547241.4683955300133675 7493267.1695830002427101, 548296.9793255199911073 7493223.1783396899700165, 548710.8022534899646416 7493316.6910186298191547, 548978.0409311200492084 7493359.6988639002665877, 549474.6489930299576372 7493478.1999030597507954, 549870.0192977499682456 7493704.7011540196835995, 550000.0000000000000000 7493802.1282507702708244, 550000.0000000000000000 7493800.8785204347223043))', + 'MULTILINESTRING ((524718.0163713778601959 7500210.5219292528927326, 524717.1588156500365585 7500210.0084451204165816, 524574.9860907683614641 7500190.5280320746824145, 524574.2798689020564780 7500191.2344054849818349))', + 'MULTILINESTRING ((524193.8328189906897023 7500431.1064537204802036, 524194.6307847223361023 7500430.3067480474710464, 523397.8001402500085533 7500183.4910121802240610, 522854.1015355099807493 7500070.4906302299350500, 522324.1118496610433795 7500072.2749801976606250, 522323.5325372974039055 7500073.0887669073417783), (527905.8476731716655195 7501050.4671189449727535, 527908.1407460733316839 7501050.5568969398736954, 527430.0695936999982223 7500795.5491229798644781, 526591.8898101799422875 7500682.0311559904366732, 525549.8513239700114354 7500614.0300792902708054, 525164.7414901100564748 7500478.0103883901610970, 524717.1588156500365585 7500210.0084451204165816, 524716.1685345589648932 7500209.8727574581280351))', + 'MULTILINESTRING ((522198.7010203180252574 7500076.0088302092626691, 522199.4341642370563932 7500074.9790627742186189, 521744.1016206499771215 7500092.9814525097608566, 521177.7584161399863660 7500024.9713861504569650, 520656.7282556199934334 7499911.9717762302607298, 520226.3289424299728125 7499730.4618171695619822, 520000.0000000000000000 7499617.2908613989129663, 520000.0000000000000000 7499618.4089082013815641), (532860.9091847165254876 7501127.3776061432436109, 532861.3487732587382197 7501126.4021477382630110, 532255.2395347800338641 7501090.0919910203665495, 531190.5300996799487621 7501090.0910327201709151, 530442.9822135099675506 7501135.0692772204056382, 529763.3494318500161171 7501135.0693844202905893, 529061.0896587100578472 7501044.5682494696229696, 528473.1436554730171338 7500979.1873466055840254, 528472.5273607608396560 7500979.9734598090872169), (544737.4093717507785186 7510000.0000000000000000, 544738.7021026653237641 7510000.0000000000000000, 544626.1803077399963513 7509862.6509016100317240, 544599.6914848999585956 7509307.1512340800836682, 544520.3602272400166839 7508619.1491003800183535, 544255.8195605799555779 7507878.6505708796903491, 543753.3111433800077066 7507006.1485301395878196, 543197.8599954500095919 7506291.6510444404557347, 542748.2417293100152165 7505604.1493647499009967, 542034.1492941799806431 7504704.6514335004612803, 541293.5891299600480124 7504202.1505518397316337, 540447.2613627200480551 7503647.1504111299291253, 539204.1899481900036335 7503038.6409026896581054, 538490.0402022900525481 7502853.6400044597685337, 537934.5981001099571586 7502959.1494819503277540, 537458.5619110600091517 7503118.1395992599427700, 536956.0390386499930173 7503170.6392884301021695, 536770.9210307099856436 7502932.6405451204627752, 536718.0086382699664682 7502615.6299286996945739, 536718.0077891800319776 7502060.1385293100029230, 536585.7404540400020778 7501557.6296280203387141, 536215.4412918200250715 7501319.6187131898477674, 535871.5983779799425974 7501240.1199650401249528, 535289.7498613100033253 7501266.6198128499090672, 534813.6585787199437618 7501213.6187100997194648, 533649.9409386699553579 7501055.1196561502292752, 533032.6647448980947956 7500990.1133196894079447, 533032.2540093590505421 7500991.0240919245406985), (540991.6145223230123520 7490051.9104150431230664, 540990.9120639010798186 7490052.6205057417973876, 540994.1994521199958399 7490125.1404810203239322, 541020.3115120199508965 7490265.1499587204307318, 541071.8600603099912405 7490404.6513284202665091, 541225.5412088100565597 7490626.6515073096379638, 541378.8100700799841434 7490759.6511909803375602, 541621.1913036600453779 7490904.6496356101706624, 541850.5094163799658418 7490992.6486446103081107, 542117.9989447799744084 7491067.6498956503346562, 542339.6836309707723558 7491081.8338681170716882, 542340.0139575036009774 7491080.8908742861822248), (542448.3669101102277637 7491085.2667160956189036, 542447.8281487500062212 7491086.2563206022605300, 542645.9278556300560012 7491090.1496953703463078, 542881.8001631699735299 7491216.1593797197565436, 543022.5110186899546534 7491374.6574428202584386, 543093.4196471800096333 7491577.6600298201665282, 543100.6207402900326997 7491755.6605573296546936, 543146.0011632499517873 7491940.1524548903107643, 543242.2113231299445033 7492092.6493198703974485, 543420.5594578799791634 7492167.6605370296165347, 543736.0608669177163392 7492178.8340415228158236, 543736.8605833266628906 7492178.2342887129634619), (543994.7063397207530215 7492105.4846383240073919, 543993.9952419346664101 7492106.2410740470513701, 544164.7493750499561429 7492195.6611232999712229, 544311.5085405800491571 7492303.1592243798077106, 544713.1909174999454990 7492510.6592104202136397, 545414.1404617800144479 7492806.1695769801735878, 545739.0797240600222722 7492931.6574951196089387, 546146.6309219299582765 7493050.6718051703646779, 546566.3691623499616981 7493067.1693900702521205, 547017.7696958100423217 7493033.1687579201534390, 547411.5708465500501916 7492935.1810991801321507, 547824.2799819100182503 7492786.6796223297715187, 548154.3804447900038213 7492676.6903927102684975, 548555.1085242800181732 7492681.1924451002851129, 548956.0910621000220999 7492755.1982696000486612, 549427.3525090899784118 7492886.2018355997279286, 549924.2300843800185248 7493068.2112118601799011, 550000.0000000000000000 7493102.4734313925728202, 550000.0000000000000000 7493101.3759462386369705))', + 'MULTILINESTRING ((520000.0000000000000000 7500333.5864726584404707, 520000.0000000000000000 7500334.5854991283267736, 520251.9812008599983528 7500460.4708616798743606, 520790.4299846600042656 7500582.9693757295608521, 521328.8990372599801049 7500656.4806792000308633, 521537.9934471686137840 7500702.5902975173667073, 521538.7771375657757744 7500701.9694143859669566, 521537.9934471686137840 7500702.5902975173667073), (521826.3962308935006149 7510000.0000000000000000, 521830.2234692216152325 7510000.0000000000000000, 521671.4390298799844459 7509957.0189364701509476, 520790.3393039599759504 7509810.0001919697970152, 520000.0000000000000000 7509619.7119117267429829, 520000.0000000000000000 7509618.6830340670421720, 520000.0000000000000000 7509619.7119117267429829), (532600.3302651896374300 7501627.1083485167473555, 532599.7396073570707813 7501628.1497170943766832, 532856.6521893100580201 7501611.1112058302387595, 533444.0185844299849123 7501684.6103292601183057, 534325.1210312099428847 7501880.1196714900434017, 534985.9214213599916548 7502076.1217858698219061, 535646.8110275299986824 7502516.6302939895540476, 535891.5287010800093412 7502908.1374861896038055, 536013.9019787500146776 7503250.6406890796497464, 536258.6794978299876675 7503520.1420491002500057, 536527.9085336000425741 7503593.6495772004127502, 536992.9320167599944398 7503520.1422608699649572, 537555.8628507399698719 7503544.6488754795864224, 538020.8807973100338131 7503667.1522581996396184, 538755.1426198399858549 7503960.6502358699217439, 539244.6298891199985519 7504132.1499195201322436, 540125.7701951599447057 7504572.6497226702049375, 540762.0786962399724871 7504939.6401027701795101, 541716.5790550899691880 7505698.1617022398859262, 541936.8897461800370365 7506065.6509176101535559, 542157.1883640999440104 7506530.6489702202379704, 542426.4309210999635980 7507142.6610005302354693, 542597.7511561999563128 7507729.6500914199277759, 542622.2203807899495587 7508170.6593472696840763, 542866.9608011499512941 7508635.6476191803812981, 543136.2108244899427518 7508978.1516894698143005, 543283.1098597400123253 7509198.1474713198840618, 543356.4892539000138640 7509687.6487833503633738, 543368.5279655156191438 7510000.0000000000000000, 543369.5268157882383093 7510000.0000000000000000), (542475.7818017150275409 7490825.7722711022943258, 542476.2623097165487707 7490824.8896671906113625, 542121.6113261700375006 7490675.1504720998927951, 541942.0503731799544767 7490540.6584189096465707, 541762.5393725200556219 7490428.6507309796288610, 541605.5117328099440783 7490293.6494011301547289, 541560.6191276300232857 7490159.1616177195683122, 541538.0986778000369668 7490024.6489791097119451, 541545.8831280654994771 7490000.0000000000000000, 541544.8344431390287355 7490000.0000000000000000), (544083.8251957478933036 7491864.6897576972842216, 544084.5100616407580674 7491863.9622678663581610, 543916.8111612600041553 7491662.6594603899866343, 543467.9909774400293827 7491303.6579534802585840, 543288.5212596700293943 7491169.1625096900388598, 543041.6283885700395331 7491034.6487735398113728, 542929.4202479800442234 7490989.6511897603049874, 542705.0600305399857461 7490877.1614052504301071, 542571.8228042328264564 7490858.5011789817363024, 542571.3451686579501256 7490859.3785067796707153), (550000.0000000000000000 7492916.1826057024300098, 550000.0000000000000000 7492915.1826563579961658, 549683.9776767699513584 7492784.7010641396045685, 549457.1530677999835461 7492715.7030614195391536, 549167.8620524300495163 7492627.6976040797308087, 549044.6585097600473091 7492599.7510081203654408, 548674.1506595800165087 7492515.7009411500766873, 548609.5248929499648511 7492518.2924996195361018, 548113.1504889399511740 7492538.1886065695434809, 547800.5016407900257036 7492572.8691065600141883, 547379.9360571899451315 7492619.5098762298002839, 547103.3177899100119248 7492650.1804305203258991, 546676.9415344200097024 7492650.1683770902454853, 546362.8189851900096983 7492582.6708111502230167, 546048.6516915999818593 7492493.1693898700177670, 545734.4392289100214839 7492380.6604282101616263, 545353.0321352999890223 7492201.1703274799510837, 544926.6382374600507319 7492066.6692933803424239, 544724.7222984499530867 7491977.1600893298164010, 544410.5210711299441755 7491797.6681312201544642, 544324.8354344329563901 7491754.6016815919429064, 544324.1489822026342154 7491755.3286254471167922))', + 'MULTILINESTRING ((530271.9887491008266807 7504023.8181659672409296, 530272.8096558250254020 7504022.9626687979325652, 529716.5596407300326973 7503911.6010149903595448, 529213.5023450599983335 7503780.5819101296365261, 528797.9000049700262025 7503627.0802137600257993, 527507.3776305499486625 7503343.0594466198235750, 526960.5505161000182852 7503255.5484263198450208, 526610.5993896899744868 7503255.5402162401005626, 526129.4297748099779710 7503146.0497182803228498, 525298.2094937399961054 7503146.0410827100276947, 524313.9806665199575946 7502993.0200903099030256, 522979.7296735499985516 7502796.0099626500159502, 521973.5802435199730098 7502730.4904361795634031, 520967.4508550300379284 7502533.4807597603648901, 520000.0000000000000000 7502409.3710406739264727, 520000.0000000000000000 7502410.3792356532067060), (520000.0000000000000000 7507850.7456019073724747, 520000.0000000000000000 7507851.7444353895261884, 520459.1205355499987490 7507962.4997558500617743, 521252.5692508600186557 7508095.0084923598915339, 522046.0097163000609726 7508306.5182301895692945, 522495.6195994799491018 7508412.0197906903922558, 523447.7511029100278392 7508491.5316420802846551, 524135.4115040699834935 7508571.0508861597627401, 524796.6501091100508347 7508809.0602384395897388, 525537.1616826100507751 7508888.5604379596188664, 526304.1784057499608025 7509047.0794246401637793, 527150.5723233999451622 7509258.6008259104564786, 527891.1703374399803579 7509549.6305759903043509, 528759.1812102999538183 7509752.1486169397830963, 529408.9095765600213781 7509934.6589543297886848, 529609.4298291478771716 7510000.0000000000000000, 529610.4290333546232432 7510000.0000000000000000), (538922.8089907000539824 7510000.0000000000000000, 538923.8080818294547498 7510000.0000000000000000, 538972.1599029799690470 7509914.6897562900558114, 539114.2378285899758339 7509528.6699069095775485, 539134.5507683800533414 7509041.6695242598652840, 539012.7302670100471005 7508493.1818856503814459, 538586.3296623999485746 7507965.1697401199489832, 538180.2115608500316739 7507599.6715208096429706, 537631.9808313100365922 7507214.1684171101078391, 537428.9305590899894014 7507011.1716584600508213, 537002.5204438799992204 7506686.1613326398655772, 536616.7715214400086552 7506544.1692011002451181, 535743.6882477200124413 7506361.1594366002827883, 534931.5578075499506667 7506158.1588880904018879, 534038.1795864100567997 7505813.1479306500405073, 533489.9179332499625161 7505488.1394624896347523, 533022.9010144800413400 7505082.1303953798487782, 532495.0114416599972174 7504737.1207175096496940, 531906.1711659600259736 7504513.6188210602849722, 530728.5093100100057200 7504046.6094597103074193, 530502.3308432935737073 7503928.6902586026117206, 530501.6387504261219874 7503929.4114401936531067), (549037.6348608708940446 7490000.0000000000000000, 549036.4332247237907723 7490000.0000000000000000, 549043.9079029599670321 7490011.2185191400349140, 549204.8611184799810871 7490100.2200202103704214, 549687.5501057700021192 7490279.2203355301171541, 550000.0000000000000000 7490413.2414639443159103, 550000.0000000000000000 7490412.1533525427803397))', + ] +) +bc_gdf = geopandas.GeoDataFrame(basal_c, geometry=bc_geoms, crs='EPSG:28350') + +# Structure samples +structures = pandas.DataFrame( + { + 'ID': [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], + 'DIPDIR': [190.0, 190.0, 0.0, 330.0, 165.0, 150.0, 180.0, 210.0, 240.0, 270.0, 300.0], + 'DIP': [55, 55, 15, 15, 0, 45, 30, 20, 10, 5, 50], + 'OVERTURNED': [False] * 11, + 'BEDDING': [False] * 11, + 'X': [ + 548279.320612, + 548249.155883, + 546137.857561, + 543754.180680, + 520512.912720, + 528512.912720, + 529512.912720, + 530512.912720, + 531512.912720, + 532512.912720, + 533512.912720, + ], + 'Y': [ + 7.493304e06, + 7.493512e06, + 7.494607e06, + 7.504599e06, + 7.497506e06, + 7.497806e06, + 7.498506e06, + 7.499506e06, + 7.500506e06, + 7.501506e06, + 7.502506e06, + ], + 'Z': [543.0, 543.0, 532.0, 559.0, 503.0, 553.0, 563.0, 573.0, 583.0, 593.0, 603.0], + 'layerID': [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2], + } +) + +# geology +geology_map_data = load_map2loop_data.load_hamersley_geology() + + +# DTM +dtm = load_map2loop_data.load_hamersley_dtm() + +# sampled contacts + +IDS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, +] +X = [ + 520000.0, + 520992.6699257682, + 521984.6869456721, + 522969.6388939231, + 523954.5908421741, + 524942.1013152138, + 525930.4850180566, + 526908.535657469, + 527891.805258285, + 528880.6323520339, + 529855.6352847969, + 530832.075832642, + 531813.1634102948, + 532804.1384816798, + 533019.2882480841, + 532243.2409444518, + 531376.1445685071, + 530480.68269627, + 529612.3980015446, + 528734.9447395488, + 527783.6457775467, + 526804.9871671252, + 525809.8226356399, + 524816.1487769039, + 523829.21986169985, + 522842.8215091018, + 521858.22077695775, + 520000.0, + 520979.22944531543, + 521963.40533887857, + 522941.7587850634, + 523934.147302897, + 524925.392627546, + 525924.0314485825, + 526915.8477737093, + 527895.0821625991, + 528872.0657047849, + 529800.4947308041, + 530625.584657682, + 531569.6370222451, + 532437.052847155, + 533287.2652070294, + 534152.4134851344, + 535068.2792519473, + 535460.6891555252, + 536224.4983751376, + 533429.9102329265, + 532481.4641957916, + 531544.0571021343, + 530594.6994174849, + 529610.6855646572, + 528622.769870241, + 527649.2613247755, + 526678.2236776681, + 525700.529526533, + 524727.502968803, + 523736.1966217523, + 522758.8160138651, + 521787.52440495713, + 520000.0, + 523032.43525349256, + 522075.0050621681, + 521094.2495766504, + 521279.9150416324, + 527953.219881957, + 528932.1661473936, + 529931.0489500397, + 530926.9444223469, + 532471.3224294331, + 533451.0808071761, + 534430.5181256596, + 535259.9903455864, + 535733.754706194, + 536530.414399986, + 537520.9367684029, + 538483.8842249501, + 539416.5488248907, + 540254.201848269, + 541073.3185078846, + 541731.634304068, + 542111.7328311033, + 542153.227246826, + 542648.3360907623, + 544273.9324713233, + 550000.0, + 549046.9473048343, + 548047.5904092644, + 547052.7023355255, + 546066.4155333972, + 520000.0, + 520977.906499162, + 521972.6466978357, + 522950.7862194081, + 523930.86647590954, + 524922.3632146807, + 525917.7966582401, + 522351.1343196252, + 527125.4548547225, + 526128.5235193562, + 525130.7081813341, + 524144.8882983563, + 530798.8710058356, + 529837.3189358161, + 528901.4390783398, + 539955.974375356, + 540509.7202600716, + 540554.4697958604, + 540124.5665895239, + 539457.7385073705, + 538609.0930945011, + 537650.6482494324, + 536662.2132646953, + 535670.9952466968, + 534702.7550180865, + 533831.4503084399, + 533061.3425394666, + 532157.7972663342, + 546233.0059536607, + 546906.7057886998, + 547857.5988940151, + 548844.1779325017, + 523381.48903560604, + 522468.0997263235, + 521503.9257619144, + 525280.9678179419, + 534272.9718145289, + 533289.726130804, + 532311.6002925185, + 531314.2350300908, + 530343.2573956609, + 529404.0267836585, + 528406.8877962828, + 527408.438540811, + 526416.4831948339, + 547423.9512601104, + 546818.8696391915, + 546751.8787156106, + 546564.3507434212, + 545942.2297277196, + 545512.8225309709, + 544971.65760404, + 544429.4936548981, + 543746.9451913793, + 543030.8690031096, + 542256.0397376382, + 541457.6565650662, + 540552.3950139998, + 539652.2355835018, + 538839.7378067289, + 537990.4340473542, + 537007.3752328141, + 536022.1700130996, + 537417.0468347219, + 538156.4071117863, + 539076.4825414991, + 539863.903717873, + 541996.2659877514, + 542624.1105710816, + 543421.4023585871, + 544400.4790130118, + 545389.5363446891, + 546360.828213827, + 547201.2564344314, + 548117.0745406685, + 524266.09546261415, + 525089.486889288, + 528242.3239959123, + 529217.7910440405, + 530038.4913963537, + 522423.15070457, + 521427.2884053698, + 522555.9904544321, + 529030.4932832464, + 528038.4263267842, + 527038.5688849417, + 526038.746341665, + 532993.0805511009, + 532003.260610268, + 531009.5137000929, + 530011.0692840518, + 545728.9288492671, + 545228.7527245631, + 544793.6165900896, + 544324.0658601674, + 543757.1054321213, + 543343.5919286992, + 542816.8120473484, + 541997.2329619491, + 541153.4587884084, + 540302.4609239949, + 539458.859568292, + 538484.4409203371, + 537531.6718874933, + 537267.7621267324, + 536473.9828749119, + 535486.8616121166, + 534501.006691062, + 540652.709349222, + 541131.4261559306, + 542310.5385527068, + 543285.3188949242, + 544247.7959926978, + 545089.9263310316, + 546087.6202142882, + 547077.7264906017, + 548075.363336421, + 549059.0245534881, + 524193.8328189907, + 527905.8476731717, + 526978.3198189315, + 525983.1425512254, + 522198.701020318, + 521204.9277157221, + 532860.9091847165, + 531863.5053478461, + 530864.0956853683, + 529864.8572444214, + 544737.4093717508, + 544569.3339346765, + 544327.771360188, + 543863.477011355, + 543275.0341084594, + 542715.4199777856, + 542093.6525093828, + 541285.7709317384, + 540449.5406616033, + 539551.5492211859, + 538610.5312377414, + 537640.4148034687, + 536770.6743346298, + 536686.2888205624, + 536054.8844726445, + 535061.7313647007, + 534070.1286353774, + 540991.614522323, + 542448.3669101102, + 543994.7063397208, + 544871.8490877205, + 545799.7056238599, + 546784.2744169813, + 547750.3419044648, + 548724.9651694401, + 520000.0, + 521826.3962308935, + 532600.3302651896, + 533589.8503320153, + 534561.7759873917, + 535449.8915779426, + 535993.0214361007, + 536819.0801195968, + 537807.793036829, + 538744.8306413345, + 539665.2325617559, + 540546.0055358304, + 541349.6936467969, + 541980.9483774537, + 542394.1133221515, + 542614.8288802537, + 543077.7762354391, + 542475.781801715, + 544083.8251957479, + 550000.0, + 549053.1439277239, + 548063.5281953025, + 547069.414890058, + 546087.5377901661, + 530271.9887491008, + 529298.9639373667, + 528340.209952825, + 527361.9910066663, + 526373.1685692647, + 525379.3992484873, + 524390.3065754601, + 523401.1210929096, + 522406.9032212814, + 521418.36474354746, + 520000.0, + 520978.6362345788, + 521950.47117176966, + 522933.3988561018, + 523928.4054918701, + 524884.9875455543, + 525874.1190162523, + 526848.2966478025, + 527791.3040361393, + 538922.8089907, + 539134.0778793262, + 538736.0836775531, + 538004.1174260699, + 537223.7768297916, + 536312.6322191659, + 535337.4942052161, + 534389.0342257542, + 533501.4998407771, + 532715.1008693202, + 531806.479694858, + 549037.6348608709, +] +Y = [ + 7506463.058931708, + 7506576.346475119, + 7506700.1649271855, + 7506872.99333815, + 7507045.821749114, + 7507202.956357559, + 7507354.44495147, + 7507562.8122875495, + 7507744.951704663, + 7507892.96504778, + 7508104.092849379, + 7508311.6272335, + 7508501.976685256, + 7508504.460999884, + 7507684.484812225, + 7507085.842450439, + 7506588.057267194, + 7506144.839214603, + 7505654.042415291, + 7505177.516716159, + 7504892.17995596, + 7504686.687074701, + 7504603.854204072, + 7504503.098141689, + 7504341.941955539, + 7504177.672377438, + 7504002.8541911375, + 7503245.259859091, + 7503436.728206725, + 7503611.222655113, + 7503811.172638808, + 7503933.967406592, + 7504066.000381116, + 7504086.539427338, + 7504206.419975162, + 7504405.812567679, + 7504618.483028057, + 7504899.302718434, + 7505410.872728581, + 7505727.305923727, + 7506201.128560977, + 7506724.563539154, + 7507220.081115803, + 7507612.996219244, + 7508505.040226217, + 7509135.469929169, + 7510000.0, + 7509704.59876308, + 7509356.363295672, + 7509042.9372015195, + 7508868.599440474, + 7508713.626424883, + 7508491.404999385, + 7508254.175495736, + 7508044.257347997, + 7507813.564222933, + 7507689.029948036, + 7507479.73426719, + 7507242.659510909, + 7500803.4896762185, + 7510000.0, + 7509752.2424489865, + 7509557.913698296, + 7501034.634496278, + 7501611.124154025, + 7501788.582382207, + 7501832.072807334, + 7501874.753115009, + 7501854.802179787, + 7501993.852453728, + 7502194.603011602, + 7502736.52101189, + 7503605.470838049, + 7504102.310629672, + 7503995.998654295, + 7504162.548298732, + 7504522.438259361, + 7505048.271868659, + 7505609.690332235, + 7506352.909638542, + 7507272.811883032, + 7508259.448754307, + 7509066.146225987, + 7491662.855160554, + 7492637.949197558, + 7492365.294641344, + 7492343.195849396, + 7492425.974104291, + 7492294.881093971, + 7508845.720669018, + 7509050.10324461, + 7509000.757492466, + 7509194.807969997, + 7509393.409809908, + 7509493.696517873, + 7509580.778152611, + 7501916.1655494, + 7502377.774781606, + 7502376.385050711, + 7502389.230930838, + 7502221.572623042, + 7503475.2625857005, + 7503209.079556105, + 7502871.602548231, + 7510000.0, + 7509197.116898042, + 7508256.250238412, + 7507364.330453778, + 7506624.831329774, + 7506116.551366933, + 7505849.401377124, + 7505705.229350432, + 7505578.685761046, + 7505339.114590024, + 7504851.858361741, + 7504235.464249766, + 7503807.926211051, + 7490000.0, + 7490632.5934013035, + 7490931.629951538, + 7491082.825264233, + 7498414.247334903, + 7498022.163648057, + 7497778.683655275, + 7499008.503536563, + 7499007.862999017, + 7499166.809369003, + 7499342.672418874, + 7499404.581849788, + 7499607.193046319, + 7499409.181598686, + 7499342.398484021, + 7499289.594081205, + 7499167.5240981905, + 7510000.0, + 7509254.772409647, + 7508259.427108908, + 7507280.617024052, + 7506546.4275029935, + 7505645.278178703, + 7504804.447980701, + 7503964.813485547, + 7503240.48427183, + 7502543.425302152, + 7501911.2681202525, + 7501310.361086443, + 7500889.459500117, + 7500454.516031106, + 7499884.737649882, + 7499387.224113458, + 7499210.211525513, + 7499047.019637048, + 7490706.05210895, + 7491653.361597963, + 7492310.636501358, + 7492912.724049956, + 7493323.250750658, + 7494099.582786533, + 7494682.93982123, + 7494844.964517663, + 7494717.975402998, + 7494868.223497515, + 7495407.3541522715, + 7495771.872569879, + 7490000.0, + 7490560.701632605, + 7492064.722272471, + 7491904.289302209, + 7491338.4112052, + 7499760.717626198, + 7499723.154391495, + 7499746.544444192, + 7500200.705866932, + 7500238.3134670025, + 7500228.5316139795, + 7500222.315208985, + 7500834.640376496, + 7500780.822571908, + 7500675.103396037, + 7500715.487725784, + 7510000.0, + 7509145.739106326, + 7508252.316578914, + 7507374.160168251, + 7506552.029851974, + 7505642.489778755, + 7504802.59176734, + 7504230.642840398, + 7503695.190221784, + 7503174.1096064225, + 7502644.083926628, + 7502464.589954097, + 7502223.052264384, + 7501311.038411527, + 7500760.731710168, + 7500717.160069187, + 7500865.774257174, + 7490387.598747078, + 7491245.724857572, + 7491467.516614238, + 7492641.868488729, + 7492862.716044601, + 7493359.487961125, + 7493417.977361985, + 7493290.396821679, + 7493232.414779238, + 7493379.023244919, + 7500431.1064537205, + 7501050.467118945, + 7500734.366883766, + 7500642.3056855835, + 7500076.008830209, + 7500028.234047118, + 7501127.377606143, + 7501090.091638437, + 7501109.731843927, + 7501135.069368409, + 7510000.0, + 7509043.874690335, + 7508080.057040733, + 7507197.428797968, + 7506390.922978456, + 7505562.805840937, + 7504779.60394153, + 7504197.023577066, + 7503648.645117141, + 7503208.680546424, + 7502884.853275787, + 7503057.40301376, + 7502931.162530749, + 7501939.632101527, + 7501282.496918272, + 7501241.235538427, + 7501112.3494773, + 7490051.910415043, + 7491085.266716096, + 7492105.484638324, + 7492577.547240268, + 7492949.361650263, + 7493050.756214061, + 7492813.284106591, + 7492712.54139396, + 7500333.586472658, + 7510000.0, + 7501627.108348517, + 7501716.96918736, + 7501950.3146539405, + 7502385.375857322, + 7503192.199394774, + 7503547.6234244285, + 7503611.016851668, + 7503956.5283480855, + 7504342.417675098, + 7504815.020093556, + 7505406.605492606, + 7506158.648222525, + 7507069.200253583, + 7508037.442205912, + 7508903.818976895, + 7490825.772271102, + 7491864.689757697, + 7492916.182605702, + 7492601.675778644, + 7492543.692947827, + 7492650.179472104, + 7492504.2474401975, + 7504023.818165967, + 7503802.840013571, + 7503526.350863925, + 7503319.79261976, + 7503201.512659313, + 7503146.041926193, + 7503004.886707106, + 7502858.230922394, + 7502758.70803037, + 7502621.773975609, + 7507850.745601907, + 7508049.260711595, + 7508281.05024187, + 7508448.578437336, + 7508547.11325418, + 7508818.54401165, + 7508958.199252176, + 7509183.0594342025, + 7509510.386527048, + 7510000.0, + 7509039.540376887, + 7508150.610234313, + 7507475.846219083, + 7506854.803228106, + 7506480.417593711, + 7506259.626961826, + 7505948.643392906, + 7505495.005195306, + 7504880.9632680155, + 7504474.085528871, + 7490000.0, +] +Z = [ + 533.0, + 533.0, + 540.0, + 540.0, + 549.0, + 550.0, + 556.0, + 558.0, + 568.0, + 571.0, + 582.0, + 586.0, + 593.0, + 598.0, + 591.0, + 582.0, + 569.0, + 565.0, + 563.0, + 556.0, + 554.0, + 549.0, + 543.0, + 537.0, + 535.0, + 531.0, + 525.0, + 518.0, + 528.0, + 536.0, + 538.0, + 531.0, + 539.0, + 544.0, + 546.0, + 551.0, + 556.0, + 562.0, + 571.0, + 574.0, + 575.0, + 581.0, + 586.0, + 601.0, + 609.0, + 619.0, + 609.0, + 606.0, + 597.0, + 588.0, + 581.0, + 574.0, + 569.0, + 563.0, + 561.0, + 556.0, + 553.0, + 542.0, + 539.0, + 640.0, + 577.0, + 601.0, + 584.0, + 629.0, + 561.0, + 562.0, + 600.0, + 658.0, + 660.0, + 767.0, + 778.0, + 724.0, + 772.0, + 739.0, + 791.0, + 812.0, + 675.0, + 649.0, + 690.0, + 670.0, + 682.0, + 761.0, + 804.0, + 629.0, + 582.0, + 596.0, + 585.0, + 611.0, + 634.0, + 650.0, + 594.0, + 558.0, + 607.0, + 578.0, + 599.0, + 594.0, + 551.0, + 555.0, + 558.0, + 553.0, + 561.0, + 590.0, + 578.0, + 560.0, + 667.0, + 656.0, + 649.0, + 638.0, + 631.0, + 623.0, + 623.0, + 615.0, + 608.0, + 607.0, + 602.0, + 602.0, + 606.0, + 643.0, + 617.0, + 594.0, + 572.0, + 504.0, + 484.0, + 497.0, + 503.0, + 507.0, + 521.0, + 521.0, + 520.0, + 512.0, + 506.0, + 502.0, + 502.0, + 504.0, + 598.0, + 575.0, + 580.0, + 564.0, + 567.0, + 555.0, + 540.0, + 539.0, + 552.0, + 537.0, + 527.0, + 532.0, + 547.0, + 534.0, + 521.0, + 496.0, + 516.0, + 503.0, + 510.0, + 503.0, + 532.0, + 529.0, + 566.0, + 528.0, + 555.0, + 558.0, + 533.0, + 535.0, + 547.0, + 538.0, + 600.0, + 549.0, + 465.0, + 533.0, + 521.0, + 536.0, + 561.0, + 559.0, + 583.0, + 560.0, + 533.0, + 556.0, + 544.0, + 561.0, + 560.0, + 543.0, + 691.0, + 719.0, + 667.0, + 642.0, + 621.0, + 640.0, + 625.0, + 598.0, + 614.0, + 585.0, + 596.0, + 636.0, + 634.0, + 571.0, + 561.0, + 534.0, + 565.0, + 552.0, + 573.0, + 585.0, + 546.0, + 547.0, + 555.0, + 540.0, + 543.0, + 544.0, + 551.0, + 545.0, + 546.0, + 544.0, + 555.0, + 546.0, + 529.0, + 541.0, + 569.0, + 553.0, + 561.0, + 681.0, + 646.0, + 639.0, + 619.0, + 612.0, + 602.0, + 600.0, + 591.0, + 579.0, + 580.0, + 602.0, + 593.0, + 585.0, + 570.0, + 552.0, + 554.0, + 560.0, + 636.0, + 602.0, + 600.0, + 608.0, + 591.0, + 585.0, + 573.0, + 571.0, + 581.0, + 564.0, + 625.0, + 650.0, + 664.0, + 608.0, + 635.0, + 644.0, + 659.0, + 812.0, + 616.0, + 611.0, + 622.0, + 629.0, + 677.0, + 641.0, + 647.0, + 602.0, + 600.0, + 603.0, + 582.0, + 573.0, + 591.0, + 634.0, + 573.0, + 566.0, + 554.0, + 549.0, + 545.0, + 549.0, + 550.0, + 550.0, + 543.0, + 532.0, + 545.0, + 546.0, + 544.0, + 549.0, + 551.0, + 568.0, + 577.0, + 580.0, + 584.0, + 629.0, + 628.0, + 617.0, + 609.0, + 600.0, + 594.0, + 591.0, + 594.0, + 592.0, + 596.0, + 592.0, + 579.0, +] +featureid = [ + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '0', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '7', + '7', + '7', + '7', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '6', + '6', + '6', + '6', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '8', + '8', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '0', + '0', + '2', + '2', + '2', + '0', + '0', + '1', + '2', + '2', + '2', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '5', + '5', + '6', + '7', + '7', + '7', + '7', + '7', + '7', + '7', + '0', + '1', + '1', + '1', + '0', + '0', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '0', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', +] + +s_c = pandas.DataFrame({'X': X, 'Y': Y, 'Z': Z, 'featureId': featureid}) + +############################################ +##### test calculate_unit_thicknesses ###### +############################################ + +import map2loop +import pathlib + + +def test_calculate_unit_thicknesses(): + + units = st_units + stratigraphic_order = st_column + structure_data = structures + + # units, stratigraphic_order, basal_contacts, structure_data, map_data = sample_data + config_dictionary = { + "structure": {"dipdir_column": "azimuth2", "dip_column": "dip"}, + "geology": {"unitname_column": "unitname", "alt_unitname_column": "code"}, + } + bbox_3d = { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, + } + project = Project( + working_projection='EPSG:28350', + bounding_box=bbox_3d, + geology_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/geology.geojson') + ), + structure_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/structures.geojson') + ), + dtm_filename=str( + pathlib.Path(map2loop.__file__).parent + / pathlib.Path('_datasets/geodata_files/hamersley/dtm_rp.tif') + ), + config_dictionary=config_dictionary, + ) + + project.structure_samples = structure_data + project.map_data.basal_contacts = bc_gdf + + # Create sample map data + + project.map_data.sampled_contacts = s_c + + # Inject the sample data into the project's stratigraphic column + project.stratigraphic_column.stratigraphicUnits = units + project.stratigraphic_column.column = stratigraphic_order + + ## test if set/get is working for thickness calculator + + assert project.get_thickness_calculator() == [ + 'InterpolatedStructure' + ], "Default for thickness calculator not set" ## default is InterpolatedStructure + + # check set + print("****",StructuralPoint.__module__) + + project.set_thickness_calculator([StructuralPoint(dtm_data=dtm, bounding_box=bbox_3d), InterpolatedStructure(dtm_data=dtm, bounding_box=bbox_3d)]) + assert project.get_thickness_calculator() == [ + 'StructuralPoint', + 'InterpolatedStructure', + ], "Setter method for thickness calculator not working" ## default is InterpolatedStructure + + # Run the calculate_unit_thicknesses + project.calculate_unit_thicknesses(bc_gdf) + + # # Check if all thicknesses have been calculated + columns_to_check = [ + 'StructuralPoint_mean', + 'StructuralPoint_median', + 'StructuralPoint_stddev', + 'InterpolatedStructure_mean', + 'InterpolatedStructure_median', + 'InterpolatedStructure_stddev', + ] + + for column in columns_to_check: + # have all thicknesses been calculated + assert ( + column in project.stratigraphic_column.stratigraphicUnits.columns + ), f"project::calculate_unit_thicknesses: column {column} not in thickness results" + # is the result a number + assert ( + project.stratigraphic_column.stratigraphicUnits[column].dtype == numpy.float64 + ), f"project::calculate_unit_thicknesses: column {column} is not of type numpy.float64" + # should not contain nans + assert ( + not project.stratigraphic_column.stratigraphicUnits[column].isna().any() + ), f"project::calculate_unit_thicknesses: column {column} contains NaNs" + + # have all the units been calculated + assert ( + 'name' in project.stratigraphic_column.stratigraphicUnits.columns + ), 'project::calculate_unit_thicknesses: unitname not in result' + assert all( + name in project.stratigraphic_column.stratigraphicUnits['name'].values + for name in st_units['name'].values + ), 'project::calculate_unit_thicknesses: units missing in results' diff --git a/packages/map2loop/tests/sampler/geo_test.csv b/packages/map2loop/tests/sampler/geo_test.csv new file mode 100644 index 000000000..9f7f6bb08 --- /dev/null +++ b/packages/map2loop/tests/sampler/geo_test.csv @@ -0,0 +1,12 @@ +,UNITNAME,geometry,CODE,GROUP,SUPERGROUP,SILL,DESCRIPTION,INTRUSIVE,ROCKTYPE1,ROCKTYPE2,MIN_AGE,MAX_AGE,ID +0,Boolgeeda_Iron_Formation,"MULTIPOLYGON (((516678.09851031005 7502381.430084916, 516985.4093417867 7502432.939720497, 517381.0303675341 7501996.450458597, 517068.9677902753 7501902.438979194, 516636.0783435459 7501815.939950414, 516241.7603391522 7501804.9294619, 515739.5490648174 7501845.930023763, 515687.31005864 7501854.524165708, 515687.31005864 7502462.967454206, 515987.7592461791 7502401.430705549, 516678.09851031005 7502381.430084916)), ((516466.3690544315 7506220.949263664, 516873.7407970939 7506307.961476462, 517281.4186902522 7506445.959485294, 518147.5506430069 7506708.468301451, 518548.6599812934 7506807.981043728, 519662.7397499528 7506929.487592224, 520677.94825699006 7507010.99908201, 522038.3083402148 7507295.018886253, 522830.179916455 7507498.029714879, 523662.6590976772 7507681.038180801, 524596.6507077189 7507782.540694546, 525794.5900796568 7508066.557996191, 527134.7110856865 7508351.0991825005, 528251.4977760621 7508655.620795703, 529551.0197801124 7508858.651383413, 530525.7001818055 7509021.159533253, 531297.2519883884 7509264.678162582, 532718.6210473053 7509792.699682726, 533307.4205498956 7509955.199741203, 533875.9285406307 7510158.20165744, 534200.7423490481 7510219.191578516, 534627.2018242583 7510239.69044112, 535540.80903133 7510219.199873121, 536028.1312395525 7510219.199188102, 536393.6089245887 7510158.201416498, 536637.2394275275 7509975.691391321, 536718.4177284883 7509630.190658225, 536576.2579947866 7509386.678368123, 536007.7499623377 7508980.6794774365, 535743.8194368999 7508818.178339167, 535520.5093329677 7508594.687963869, 535358.0217514716 7508351.180761108, 535236.1208061283 7507823.1785499025, 535114.3212854977 7507640.660738995, 534911.2916754175 7507518.6696750615, 534769.1609872838 7507478.167769906, 534444.310595638 7507356.160217548, 534139.7121901498 7507214.159917029, 533571.2115816264 7506929.6612274945, 533205.6884558678 7506665.639726128, 532535.6622749837 7506280.128463482, 532231.0984191688 7506036.130344378, 531892.8382770831 7505828.631136723, 531730.7807765736 7505767.629514587, 531001.4219496874 7505585.119388457, 530434.1504480846 7505322.119503924, 529846.5792647229 7505018.110530231, 529782.1897067534 7504852.111618344, 529519.7383159703 7504721.101395365, 529322.8810412188 7504699.101350132, 528710.4300827074 7504589.578082755, 527157.4277337838 7504239.557840437, 526041.911488045 7504086.540897081, 525079.5116741647 7504086.528897766, 523439.03043066466 7503868.018290106, 522673.50812505255 7503780.507541341, 521754.82893368974 7503561.499102821, 520982.5192159618 7503437.480494792, 520271.90028074256 7503274.979760984, 519500.3501477047 7503193.482631056, 518992.72030422825 7503112.471846308, 518363.34063700767 7502949.957825634, 517652.7008891681 7502787.440623052, 517080.5991710863 7502644.356281735, 516863.057892551 7502589.942326081, 516559.5288458597 7502992.442232459, 517327.8402004926 7503193.448910357, 518160.2822955752 7503355.949978584, 519297.3110573332 7503599.468447633, 519947.01063597447 7503700.980550331, 520414.01957901166 7503782.489781251, 521098.64891779853 7503867.990412911, 523067.19919627137 7504217.511165934, 525210.7310010112 7504567.529698393, 526654.3696992868 7504655.06131971, 528426.1115621547 7505027.0810785545, 529279.1401694642 7505442.599590892, 530175.9800506906 7506011.619548611, 530875.8998375781 7506317.632908142, 531685.2195994601 7506755.138321674, 532866.4200693102 7507455.161494225, 533041.4099823105 7507717.670459705, 533107.019451309 7508045.669424446, 533085.1519033327 7508308.168893826, 532932.1086069325 7508483.171749172, 532538.3520777494 7508548.677518224, 532013.4010351673 7508548.669753515, 531357.2706492116 7508395.667834316, 530263.5311044148 7508220.649868442, 529344.8316910393 7507958.129734904, 528098.008845533 7507783.099712681, 526916.8410634564 7507564.581700354, 525888.7772752688 7507345.559387773, 524292.0583883931 7507105.036800025, 521798.57842701033 7506667.508674661, 519283.22895568464 7506382.979115697, 518708.4700036491 7506299.9906321615, 518079.0515951517 7506117.4687682595, 517530.84908190224 7505975.462046549, 516820.2293229884 7505812.951413073, 515987.7299865257 7505650.451000418, 515687.31005864 7505599.152506509, 515687.31005864 7506092.9797914745, 515906.28962533496 7506134.938835809, 516466.3690544315 7506220.949263664)))",P__HAo_ci,Hamersley_Group,None,FALSE,"Fine-grained, finely laminated iron-formation, mudstone, siltstone, and chert; metamorphosed",FALSE,sedimentary other chemical or biochemical,None,2445,2445,18 +1,Brockman_Iron_Formation,"MULTIPOLYGON (((558997.299511152 7493801.793448554, 559314.8095751925 7493920.801283302, 559791.5705624844 7493873.8011092, 560930.5491833736 7494014.308365822, 561445.871286734 7494055.810433237, 562017.8682529833 7493989.310636561, 562666.860106543 7493948.500266527, 562666.860106543 7493446.76593407, 558049.3462389561 7493446.76593407, 558461.5013462113 7493623.279629111, 558997.299511152 7493801.793448554)), ((542864.7195600083 7509239.161151003, 542677.2416874336 7509082.662457213, 542458.4708741052 7508957.660044044, 542239.658127031 7508645.160752991, 542145.9084492023 7508332.659268241, 542208.3892406807 7507707.658948663, 542083.358566338 7507145.159036974, 541895.8687167019 7506645.161976043, 541614.6014505886 7506144.651670894, 541145.7601316958 7505676.1485500615, 540770.7923636963 7505332.151711078, 540145.7008413936 7504988.647760561, 539676.8889227604 7504613.650578799, 539051.811228066 7504394.649407532, 538364.2599795916 7504113.660114445, 537895.5108797394 7503957.148059852, 536989.1799710266 7504051.152139422, 536676.5897916277 7504113.64755625, 536270.3683300179 7504082.142233546, 535926.5516183792 7503894.651935911, 535676.5302751992 7503519.6384271905, 535551.5432611828 7503144.641235851, 535239.0000169724 7502707.138429321, 534926.429906485 7502457.130986004, 534488.938896653 7502207.120117575, 533613.8304010862 7502019.621294899, 533020.0292473664 7501925.602211657, 532551.2005992332 7501832.098164607, 532401.5081382872 7501876.600775925, 532130.4601205576 7502165.598587238, 531832.3692170901 7502050.601514432, 530707.2799876283 7501832.090665868, 529800.9698748067 7501832.069814637, 529113.4114605029 7501800.570461128, 528644.5797393748 7501769.560601743, 528269.5491108517 7501675.549466317, 527895.3804132865 7501600.550623674, 528055.8005487525 7501423.059336569, 528302.3796234686 7501116.061090368, 528009.3800239285 7501104.558906376, 526591.3817509151 7501049.041682794, 525518.2012575322 7500983.103860429, 524403.0688352056 7500914.508251944, 523814.80919091677 7500861.501062083, 523576.89012020186 7501033.501141634, 523090.5919463073 7501408.489780863, 522373.88105920254 7501209.489694493, 521543.43977636826 7501077.536889363, 520473.5791580021 7500907.47207442, 519976.9100607757 7500799.467891492, 519631.44173262396 7500691.461144079, 519372.2888861367 7500431.949672808, 519069.99947665556 7500108.460693729, 518839.3087217495 7499930.939910483, 518912.2703785664 7499695.460613201, 518636.630131695 7499603.948979337, 518293.9995506779 7499579.442325524, 517682.1190903442 7499358.941561984, 516752.1097919952 7498820.421163431, 516399.8008133813 7498690.920674295, 516132.4019624576 7498877.912625973, 516084.35138976463 7498918.921142539, 515937.86030956055 7499043.418337672, 515699.65068941494 7498844.919029786, 515687.31005864 7498836.6824742975, 515687.31005864 7500678.361180522, 516189.1596439413 7500778.41878218, 516703.12940648245 7500900.929794995, 517168.14824099984 7500949.939010262, 517608.66963171936 7501023.442418405, 517828.95992033836 7501072.440090696, 517978.50258811587 7501117.440985382, 517873.43954899284 7501235.941138336, 518389.21039298974 7501379.949451383, 519121.2817813142 7501534.949975431, 519636.90140196204 7501633.958211428, 520343.17884565605 7501712.978961738, 520737.7721352853 7501723.978681096, 521104.13919638324 7501751.4809457455, 522422.25158683065 7501924.491564866, 522521.98180311493 7501847.499487177, 523447.7796929872 7502091.0098048225, 524294.1117317752 7502249.520968337, 525246.218477027 7502408.520923147, 526700.8509709035 7502355.539378185, 527190.8102288014 7502380.04191008, 527002.7512360156 7502588.051300699, 527233.1392903796 7502607.060848987, 527759.8099331601 7502688.059576647, 528266.3094259326 7502728.56966918, 529076.7311885592 7502911.078795484, 529603.481626151 7503154.07903868, 530292.3180354721 7503316.099201279, 530852.9701849594 7503491.101557735, 531092.2100394127 7503242.110120671, 531329.3389675578 7503360.611643844, 531858.3409145023 7503651.619851969, 532466.6187711438 7503969.12087173, 533233.6514340461 7504312.63172733, 533603.8817716703 7504709.62726154, 534027.0999437242 7504974.140041251, 534635.4301719851 7505317.65121302, 535217.2919880576 7505503.150627365, 536169.3901651907 7505661.661419861, 537068.6509273968 7505741.160393212, 538205.9094809934 7505952.6699313875, 539052.200798928 7506296.660687522, 539607.670671504 7506746.159959816, 539925.0498745313 7507090.1577369245, 540348.2114157699 7507671.659639817, 540665.5814983585 7508571.170081407, 540612.7384639209 7509073.658652099, 540480.4705794358 7509232.170064665, 540295.3694572111 7509391.167218113, 540057.3710624615 7509681.668901291, 539898.7276585057 7510184.68239211, 539660.6697954691 7510607.680169231, 539422.6578598478 7510951.691127828, 539052.3881896138 7511268.680436604, 539043.4943342534 7511273.57407786, 542813.6132503639 7511273.57407786, 542927.261376111 7510676.660736442, 542927.2699991837 7509989.150851081, 542864.7195600083 7509239.161151003)), ((528658.2802411651 7510422.639340675, 527864.7421936209 7510184.620799529, 527124.1199973462 7509920.100146097, 526119.0513356786 7509602.579176346, 525140.4391166749 7509496.570468929, 524456.6897462322 7509487.559559392, 524151.1692813777 7509438.05160553, 522591.62147816404 7509122.027421697, 522451.57102242974 7509097.030138154, 522324.3404851429 7509085.020956203, 522005.9512440277 7508998.029494725, 521090.5512352326 7509073.01052396, 520052.92800381104 7508862.000883804, 519619.8916243296 7508736.979432851, 519206.1095730919 7508643.988675173, 518760.5294264208 7508556.979971839, 518142.95983809966 7508401.480365034, 517735.1991120291 7508250.968857957, 516913.6107745424 7507994.460242172, 516143.46774096537 7507858.440086285, 515687.31005864 7507785.32034428, 515687.31005864 7508702.941175408, 516068.3611047208 7508702.950624801, 516500.23908221396 7508810.949452151, 516932.1294444653 7508983.448731998, 517364.01031440287 7509199.458663939, 518067.74922614626 7509452.469257174, 518912.7777273635 7509330.4692640845, 519307.44022161217 7509273.4899786115, 519868.8700767889 7509350.490000427, 520005.17078520963 7509373.567330418, 520906.0067273626 7509526.057665058, 521402.08978690987 7509610.00899969, 521858.95929696417 7509706.585036412, 522935.2510594871 7509934.040071262, 523323.94062763144 7510193.041663176, 523647.8605990965 7510430.539885054, 523991.42905727075 7510603.559072675, 524162.85905036354 7510539.051478794, 524175.58166239597 7510552.060833326, 524296.7088650404 7510608.561523401, 524449.9398367784 7510735.050195138, 524628.9312608214 7510931.060058156, 524788.129109536 7510968.569844436, 524991.7714599696 7510993.08095076, 525201.9617750401 7511074.579809792, 525355.4707649952 7511252.092282772, 525367.1410828978 7511273.57407786, 531045.9716679277 7511273.57407786, 530324.6193851209 7511057.199628872, 529451.7901004837 7510766.169718606, 528658.2802411651 7510422.639340675)))",P__HAb_cib,Hamersley_Group,None,FALSE,"Banded iron-formation, chert, mudstone, and siltstone; metamorphosed",FALSE,sedimentary other chemical or biochemical,None,2451,2494,1 +2,Bunjinah_Formation,"POLYGON ((515749.42953324167 7494583.898371277, 515921.6777142523 7494697.41118314, 516100.6819566825 7494893.90875186, 516401.34070647624 7495261.409630321, 516663.82867221197 7495628.911218898, 516855.68842698564 7495863.411676503, 517026.3192496095 7495626.907642668, 517393.62924843834 7495306.91982853, 517804.7701799663 7494846.419316642, 518184.8404649407 7494525.9200763535, 518363.050268227 7494563.417820644, 518471.9005371297 7494715.428815294, 518543.0604543913 7494963.429076398, 518588.7601342047 7495217.430626449, 518705.0694736702 7495598.94054332, 518769.2901477404 7495725.92848905, 518383.9314657774 7496275.420112822, 517992.7799213823 7496926.429134877, 517847.87960707064 7497213.920483814, 518014.12685069727 7497123.757406966, 519021.35990318016 7496577.430042788, 519433.31787936296 7496282.440096311, 519762.19907704194 7495904.939755936, 519908.908905628 7495993.451213341, 520062.09934968926 7496119.939772207, 520209.1083645308 7496271.949922595, 520002.3885029421 7496934.941946905, 519782.08844691695 7497413.448312005, 520246.9187887205 7497531.941943437, 520979.32009647455 7497743.970866632, 521208.3405302452 7497768.4611137025, 521526.329923179 7497779.458482446, 521882.68120583834 7497821.9590960555, 522615.2015952141 7498072.470330764, 522895.79094343656 7498236.47812375, 523067.8999133475 7498311.989780473, 523169.7519518991 7498336.9916863255, 523430.94108519924 7498430.97971337, 523291.2388393459 7498627.490776373, 523609.870466445 7498706.489138644, 524080.2303868365 7498843.010146859, 524869.2387656079 7498918.51084629, 525203.0376252765 7498994.508480495, 525476.2009420571 7499040.010854232, 525809.9994778357 7499116.019442553, 526705.180449267 7499192.041248869, 527312.1506295647 7499283.029891403, 527979.7492919912 7499328.541776303, 528920.5188349494 7499359.061077322, 529648.8292915868 7499434.5578709105, 529755.0991281664 7499495.580794845, 529891.5828257337 7499586.560860623, 530073.7308944844 7499647.070125781, 530210.2997778169 7499647.070799118, 530361.9716437634 7499601.580113631, 530650.2800068778 7499495.580507001, 530968.9126983685 7499419.569814132, 531257.2500160005 7499404.579407357, 531560.67008621 7499404.592412204, 532046.2501181982 7499359.088792428, 532789.7513422351 7499313.090730185, 533411.8113768979 7499131.089975966, 533821.5094927405 7499055.600588054, 534340.198053612 7498999.598917203, 534210.0803737598 7499182.601076152, 534772.740833108 7499031.601619519, 535319.4902977825 7498996.622168367, 535866.5394221739 7499031.6102768835, 536356.470196148 7499080.119504457, 536808.4890007469 7499179.611402069, 537565.798215594 7499296.129047448, 537903.1197484749 7499358.130287537, 538240.7492773887 7499470.63115928, 538476.5108094017 7499571.63122786, 538782.997857895 7499830.628830574, 539128.0079635188 7500159.640221103, 539472.3796638706 7500361.638875108, 539886.7884534674 7500575.63855817, 540434.9686214997 7500840.1404092265, 540868.3004191916 7501022.139786543, 541378.0882920383 7501255.14835676, 541869.5108813633 7501596.148375388, 543024.9804781342 7502538.151226191, 543357.1403491914 7502835.651261853, 543753.3717356625 7503247.158579025, 544123.7492673827 7503569.65055993, 544501.3301299365 7504057.659381664, 544725.589950206 7504406.661184955, 544943.5218329843 7504761.659700146, 545302.220849858 7505307.161514722, 545590.6004368869 7505770.149005672, 545783.2304036418 7506157.651186772, 545931.3088385327 7506525.652599484, 546098.2091887437 7506843.148602944, 546347.0615013136 7507032.637269333, 546506.4978075675 7507121.148085169, 546603.1807938237 7507387.650260012, 546630.1392768638 7507705.651409691, 546760.1718947286 7508297.151622124, 546793.0495528793 7508519.641761478, 546813.4198143367 7508786.638606241, 546815.5487570565 7509245.15010618, 546931.6794150105 7509581.64034831, 547123.4215484572 7509784.1305714995, 547270.3128660641 7509910.650194941, 547468.00993696 7510024.139007827, 547704.25953919 7510226.642881071, 547742.74022461 7510290.129271863, 547768.5005213317 7510360.139111111, 548034.6985979096 7510174.130197281, 548214.5917593987 7510548.640630638, 548272.1405476438 7510624.629289403, 548241.1415831931 7510796.629177393, 548292.1977257754 7510834.630641138, 548413.8699626504 7510999.637639921, 548581.631353986 7511273.57407786, 551286.1887806365 7511273.57407786, 550990.4710949745 7510958.141390674, 550490.3986120932 7510332.63038627, 550209.0481608754 7509926.638127832, 549896.5491011539 7509364.150753701, 549896.550455353 7508895.150275201, 550052.798911349 7508832.651493076, 550240.3708309255 7509051.650358544, 550646.6286423431 7509707.641543532, 550990.4587734916 7510239.130163433, 551424.6087815453 7510724.136291137, 551521.7291258766 7510832.627482786, 552053.0314757305 7511270.62928883, 552056.2047063287 7511273.57407786, 562666.860106543 7511273.57407786, 562666.860106543 7499551.859449973, 562216.039372047 7499518.7385578435, 561038.6588890187 7499334.229885818, 560573.8899308814 7499228.730333986, 560045.2206943354 7499053.240250288, 559000.8089759169 7498747.261756245, 558491.2920519081 7498590.749170912, 558058.2921971494 7498478.748251107, 557109.1783667881 7498140.251189096, 556452.0293500419 7497704.259780826, 556164.7716675085 7497476.759236839, 555934.658746587 7497223.749905121, 555698.2706531745 7497002.250901474, 555500.5885493306 7496894.751310745, 555397.4323193779 7496948.761133501, 555303.8493495903 7496972.251311228, 555214.7785811978 7496966.737625429, 555089.2403626724 7497031.250550734, 554862.0307353397 7497234.060149197, 554527.5386105 7496881.231944211, 554307.5390245214 7497121.239912188, 553873.4072640458 7497069.228741993, 553167.0194358358 7496964.731368855, 552785.1098338484 7496871.719957018, 552441.1679652601 7496771.719051793, 552052.4778554059 7496608.219438959, 551619.3505001432 7496470.708245261, 551376.7360818523 7496433.791175256, 551376.7391543848 7496434.705870153, 550607.4712494242 7496316.71069902, 550117.3510088347 7496224.190740789, 549506.2123941588 7496087.187914414, 548863.0792892018 7495925.17907794, 548481.1595977487 7495844.6798296105, 548207.390742082 7495776.170087762, 547965.6989555173 7495764.669661934, 547621.6999697199 7495652.1683375165, 547188.05976293 7495399.670047009, 546786.0567151656 7495109.162089173, 546307.7507409333 7494838.14928676, 545741.0922157379 7494688.149336837, 545175.3190517782 7494736.149638384, 544641.6300744432 7494840.648572885, 544139.2511316538 7494849.639782634, 543789.2602507211 7494794.649844134, 543356.1986791402 7494663.138956059, 543082.0077898353 7494518.141714334, 542743.6307616133 7494233.640817355, 542500.6798850611 7493961.138607033, 542092.9073910024 7493446.76593407, 541644.078490998 7493446.76593407, 541373.2598002416 7493585.6289696, 541239.2018903212 7493478.130430274, 541190.1617254814 7493446.76593407, 515687.31005864 7493446.76593407, 515687.31005864 7494569.5471912725, 515749.42953324167 7494583.898371277))",A_FOu_bbo,Fortescue_Group,None,FALSE,Pillowed and massive basaltic flows; basaltic breccia and basaltic volcanic sandstone; minor chert; amygdaloidal basalt flows occur in upper parts of formation; metamorphosed,FALSE,igneous mafic volcanic,None,2715,2718,10 +3,Fortescue_Group,"MULTIPOLYGON (((555397.4323193779 7496948.761133501, 555500.5885493306 7496894.751310745, 555340.4594648676 7496653.75065691, 555072.2694065165 7496419.74275294, 555257.9615553323 7496120.253690178, 555169.5686030496 7496080.645912303, 555079.651138233 7495856.180409489, 554951.7946676933 7495656.452342719, 554533.3239061945 7495685.344775209, 554222.4811897052 7495584.240095554, 553674.9205753736 7495440.742040478, 553121.1078226736 7495335.73040181, 552058.2981235299 7495176.229097788, 551372.390996049 7495140.572720597, 550837.0307137701 7495112.720892535, 550366.4709901289 7495115.19929261, 549927.7112917822 7495130.19940953, 549476.347991506 7495158.198621837, 549081.6980313304 7495096.689537182, 548794.8388745028 7494951.690788921, 548041.8512948015 7494395.679813126, 547812.0081846036 7494218.67027884, 547308.8393438096 7494049.681729642, 546939.9003523845 7494039.159448417, 546539.4099109794 7494060.158678468, 546208.9613330006 7494119.158106569, 545732.5183750818 7494223.659155598, 545262.2110360289 7494277.14960509, 544861.5606814523 7494285.647513806, 544428.9491432902 7494243.648458176, 544084.9995434324 7494137.151736918, 543779.0783263644 7493992.649916977, 543543.1895387281 7493866.648261895, 543249.8219460404 7493696.147726809, 543032.7494259652 7493525.639886754, 542949.8518137042 7493446.76593407, 542551.9314321359 7493446.76593407, 542561.8203943172 7493458.150018612, 542747.3903865305 7493686.141672978, 543028.1376158899 7493882.139863286, 543398.1372971284 7494128.140172742, 543755.121623552 7494304.649267806, 544277.1396248837 7494416.150826637, 545237.5013537839 7494449.160052078, 545695.3095593718 7494434.148953231, 546566.5084900459 7494423.159816975, 546821.5793286121 7494568.161856819, 547096.8991614142 7494948.16062027, 547498.7012571043 7495194.170186197, 547925.5985514517 7495364.171054493, 548396.782193949 7495482.180683494, 548816.8920220842 7495569.17953259, 549217.7599034318 7495617.679179128, 549618.7696334233 7495685.69018444, 550019.9697485289 7495810.698891819, 550312.9106155859 7495892.210300537, 550733.0999585621 7495985.210589865, 551076.650700129 7496021.709231702, 551375.3608070231 7496024.402736781, 551521.8618771131 7496025.721549902, 551954.1498072515 7495997.719214061, 552322.9617591208 7495989.22034849, 552666.4888160233 7496019.231565898, 553462.2795814356 7496205.73064436, 553736.679746853 7496382.731079688, 554011.0793316799 7496591.241597956, 554189.5285915995 7496672.741518642, 554361.8606759825 7496812.242042959, 554527.5386105 7496881.231944211, 554862.0307353397 7497234.060149197, 555089.2403626724 7497031.250550734, 555214.7785811978 7496966.737625429, 555303.8493495903 7496972.251311228, 555397.4323193779 7496948.761133501)), ((561069.0112439514 7497704.759833835, 560636.1905268632 7497630.760898889, 560088.9606381406 7497557.271907767, 559561.1297777918 7497553.769323433, 559026.7902045063 7497531.26189706, 558631.9692533187 7497425.260880724, 558255.6002685567 7497185.260094993, 558070.1211555986 7496944.770771053, 557896.630763811 7496576.258577488, 556810.039340778 7496760.771355643, 556919.8619555234 7497122.75978668, 557035.4098655393 7497344.758373174, 557259.3992726393 7497649.259350194, 557450.9197129995 7497794.760403495, 557673.8695046322 7497876.259613888, 557909.3800093358 7497912.756985085, 558259.3113131571 7497949.258003226, 558679.4412087072 7498023.260132313, 559118.7995777644 7498154.758440055, 559889.5304543005 7498411.251732101, 560627.9007056375 7498553.7498239, 561098.7109910822 7498583.249814175, 561912.5283155104 7498559.259741278, 562421.449098904 7498588.759355744, 562666.860106543 7498620.430423093, 562666.860106543 7497990.631876048, 562017.4607239686 7497884.259027691, 561539.8798784001 7497765.770021034, 561069.0112439514 7497704.759833835)), ((549896.5491011539 7509364.150753701, 550209.0481608754 7509926.638127832, 550490.3986120932 7510332.63038627, 550990.4710949745 7510958.141390674, 551286.1887806365 7511273.57407786, 552056.2047063287 7511273.57407786, 552053.0314757305 7511270.62928883, 551521.7291258766 7510832.627482786, 551424.6087815453 7510724.136291137, 550990.4587734916 7510239.130163433, 550646.6286423431 7509707.641543532, 550240.3708309255 7509051.650358544, 550052.798911349 7508832.651493076, 549896.550455353 7508895.150275201, 549896.5491011539 7509364.150753701)), ((547768.5005213317 7510360.139111111, 547274.1485721432 7510712.640855634, 547275.2605938074 7510942.138586918, 547299.6917173745 7511273.57407786, 547866.346912276 7511273.57407786, 547988.0581958856 7511059.142060453, 547885.3303025676 7510849.6390516255, 547833.5195149541 7510658.638555709, 547768.5005213317 7510360.139111111)), ((518143.76982640155 7511252.968656216, 517851.0309907953 7511209.959799787, 517500.92836104217 7511135.449482633, 517163.40139120014 7511035.449545613, 516431.11017213535 7510841.937734678, 516099.9117498277 7510729.441395104, 515687.31005864 7510535.495148476, 515687.31005864 7511091.777985906, 516172.1291149464 7511206.442232702, 516430.7693107754 7511273.57407786, 518209.50350111787 7511273.57407786, 518143.76982640155 7511252.968656216)))",A_FO_od,Fortescue_Group,None,TRUE,Dolerite dyke or sill,TRUE,igneous mafic intrusive,None,2629,2775,13 +4,Jeerinah_Formation,"MULTIPOLYGON (((541190.1617254814 7493446.76593407, 541239.2018903212 7493478.130430274, 541373.2598002416 7493585.6289696, 541644.078490998 7493446.76593407, 541190.1617254814 7493446.76593407)), ((543356.1986791402 7494663.138956059, 543789.2602507211 7494794.649844134, 544139.2511316538 7494849.639782634, 544641.6300744432 7494840.648572885, 545175.3190517782 7494736.149638384, 545741.0922157379 7494688.149336837, 546307.7507409333 7494838.14928676, 546786.0567151656 7495109.162089173, 547188.05976293 7495399.670047009, 547621.6999697199 7495652.1683375165, 547965.6989555173 7495764.669661934, 548207.390742082 7495776.170087762, 548481.1595977487 7495844.6798296105, 548863.0792892018 7495925.17907794, 549506.2123941588 7496087.187914414, 550117.3510088347 7496224.190740789, 550607.4712494242 7496316.71069902, 551376.7391543848 7496434.705870153, 551376.7360818523 7496433.791175256, 551619.3505001432 7496470.708245261, 552052.4778554059 7496608.219438959, 552441.1679652601 7496771.719051793, 552785.1098338484 7496871.719957018, 553167.0194358358 7496964.731368855, 553873.4072640458 7497069.228741993, 554307.5390245214 7497121.239912188, 554527.5386105 7496881.231944211, 554361.8606759825 7496812.242042959, 554189.5285915995 7496672.741518642, 554011.0793316799 7496591.241597956, 553736.679746853 7496382.731079688, 553462.2795814356 7496205.73064436, 552666.4888160233 7496019.231565898, 552322.9617591208 7495989.22034849, 551954.1498072515 7495997.719214061, 551521.8618771131 7496025.721549902, 551375.3608070231 7496024.402736781, 551076.650700129 7496021.709231702, 550733.0999585621 7495985.210589865, 550312.9106155859 7495892.210300537, 550019.9697485289 7495810.698891819, 549618.7696334233 7495685.69018444, 549217.7599034318 7495617.679179128, 548816.8920220842 7495569.17953259, 548396.782193949 7495482.180683494, 547925.5985514517 7495364.171054493, 547498.7012571043 7495194.170186197, 547096.8991614142 7494948.16062027, 546821.5793286121 7494568.161856819, 546566.5084900459 7494423.159816975, 545695.3095593718 7494434.148953231, 545237.5013537839 7494449.160052078, 544277.1396248837 7494416.150826637, 543755.121623552 7494304.649267806, 543398.1372971284 7494128.140172742, 543028.1376158899 7493882.139863286, 542747.3903865305 7493686.141672978, 542561.8203943172 7493458.150018612, 542551.9314321359 7493446.76593407, 542092.9073910024 7493446.76593407, 542500.6798850611 7493961.138607033, 542743.6307616133 7494233.640817355, 543082.0077898353 7494518.141714334, 543356.1986791402 7494663.138956059)), ((516265.4181695774 7497432.421495873, 516489.1098908469 7497660.420436237, 516642.61860185623 7497850.430777944, 516885.90208859614 7498199.4297917355, 516997.112233693 7498099.4291966865, 517473.779419789 7497665.421633448, 517847.87960707064 7497213.920483814, 517992.7799213823 7496926.429134877, 518383.9314657774 7496275.420112822, 518769.2901477404 7495725.92848905, 518705.0694736702 7495598.94054332, 518588.7601342047 7495217.430626449, 518543.0604543913 7494963.429076398, 518471.9005371297 7494715.428815294, 518363.050268227 7494563.417820644, 518184.8404649407 7494525.9200763535, 517804.7701799663 7494846.419316642, 517393.62924843834 7495306.91982853, 517026.3192496095 7495626.907642668, 516855.68842698564 7495863.411676503, 516663.82867221197 7495628.911218898, 516401.34070647624 7495261.409630321, 516100.6819566825 7494893.90875186, 515921.6777142523 7494697.41118314, 515749.42953324167 7494583.898371277, 515687.31005864 7494569.5471912725, 515687.31005864 7497115.820520519, 515754.79905719316 7497040.409498656, 515793.1289313223 7497078.399584744, 515863.18009091436 7497103.421118297, 516265.4181695774 7497432.421495873)), ((559889.5304543005 7498411.251732101, 559118.7995777644 7498154.758440055, 558679.4412087072 7498023.260132313, 558259.3113131571 7497949.258003226, 557909.3800093358 7497912.756985085, 557673.8695046322 7497876.259613888, 557450.9197129995 7497794.760403495, 557259.3992726393 7497649.259350194, 557035.4098655393 7497344.758373174, 556919.8619555234 7497122.75978668, 556810.039340778 7496760.771355643, 557896.630763811 7496576.258577488, 558070.1211555986 7496944.770771053, 558255.6002685567 7497185.260094993, 558631.9692533187 7497425.260880724, 559026.7902045063 7497531.26189706, 559561.1297777918 7497553.769323433, 560088.9606381406 7497557.271907767, 560636.1905268632 7497630.760898889, 561069.0112439514 7497704.759833835, 561539.8798784001 7497765.770021034, 562017.4607239686 7497884.259027691, 562666.860106543 7497990.631876048, 562666.860106543 7497133.237551528, 562127.4581839192 7496948.281933181, 561840.6888721345 7496822.281185539, 561630.5810302994 7496778.7807272645, 561191.0721468813 7496634.770176873, 561025.3187766486 7496546.7798468955, 560884.8301239749 7496420.277748018, 560801.5591118434 7496299.777937588, 560744.0715808567 7496242.778021171, 560127.8629817173 7496386.282164244, 559327.1712826471 7496505.271246152, 558316.3107512194 7496567.771325105, 558359.9787040332 7496395.76903628, 558371.6879997047 7496179.270977483, 558351.9290179008 7496032.767925892, 558255.4401164817 7495804.280857233, 558052.2300452122 7495869.268662621, 558045.0891852239 7495703.781962683, 557961.7901537216 7495576.769842969, 557693.3499518783 7495291.781233804, 557444.6893065755 7495159.7725422345, 557170.7491252203 7495052.771290165, 556852.2186769426 7494939.759161146, 556616.1003064514 7494775.75995823, 556156.5304626453 7494415.761871083, 555894.8612740205 7494219.759863367, 555639.8499168649 7494093.759371987, 555397.8077534148 7494012.260754716, 555105.050060367 7493956.761668192, 554755.1705566598 7493939.249121815, 554329.0876227041 7493941.7473724075, 553794.9208082039 7493950.738151981, 553210.1513026675 7493998.742212988, 551988.9826816262 7493979.718334819, 551569.3581511112 7493988.721048221, 551368.6268095953 7494020.756694729, 551118.1800596238 7494060.722641811, 550558.2990232613 7494000.2100665225, 550106.1609767345 7493881.70126101, 549870.0192977528 7493704.701154016, 549474.6489930322 7493478.199903062, 549342.9171320348 7493446.76593407, 542949.8518137042 7493446.76593407, 543032.7494259652 7493525.639886754, 543249.8219460404 7493696.147726809, 543543.1895387281 7493866.648261895, 543779.0783263644 7493992.649916977, 544084.9995434324 7494137.151736918, 544428.9491432902 7494243.648458176, 544861.5606814523 7494285.647513806, 545262.2110360289 7494277.14960509, 545732.5183750818 7494223.659155598, 546208.9613330006 7494119.158106569, 546539.4099109794 7494060.158678468, 546939.9003523845 7494039.159448417, 547308.8393438096 7494049.681729642, 547812.0081846036 7494218.67027884, 548041.8512948015 7494395.679813126, 548794.8388745028 7494951.690788921, 549081.6980313304 7495096.689537182, 549476.347991506 7495158.198621837, 549927.7112917822 7495130.19940953, 550366.4709901289 7495115.19929261, 550837.0307137701 7495112.720892535, 551372.390996049 7495140.572720597, 552058.2981235299 7495176.229097788, 553121.1078226736 7495335.73040181, 553674.9205753736 7495440.742040478, 554222.4811897052 7495584.240095554, 554533.3239061945 7495685.344775209, 554951.7946676933 7495656.452342719, 555079.651138233 7495856.180409489, 555169.5686030496 7496080.645912303, 555257.9615553323 7496120.253690178, 555072.2694065165 7496419.74275294, 555340.4594648676 7496653.75065691, 555500.5885493306 7496894.751310745, 555698.2706531745 7497002.250901474, 555934.658746587 7497223.749905121, 556164.7716675085 7497476.759236839, 556452.0293500419 7497704.259780826, 557109.1783667881 7498140.251189096, 558058.2921971494 7498478.748251107, 558491.2920519081 7498590.749170912, 559000.8089759169 7498747.261756245, 560045.2206943354 7499053.240250288, 560573.8899308814 7499228.730333986, 561038.6588890187 7499334.229885818, 562216.039372047 7499518.7385578435, 562666.860106543 7499551.859449973, 562666.860106543 7498620.430423093, 562421.449098904 7498588.759355744, 561912.5283155104 7498559.259741278, 561098.7109910822 7498583.249814175, 560627.9007056375 7498553.7498239, 559889.5304543005 7498411.251732101)), ((547742.74022461 7510290.129271863, 547704.25953919 7510226.642881071, 547468.00993696 7510024.139007827, 547270.3128660641 7509910.650194941, 547123.4215484572 7509784.1305714995, 546931.6794150105 7509581.64034831, 546815.5487570565 7509245.15010618, 546813.4198143367 7508786.638606241, 546793.0495528793 7508519.641761478, 546760.1718947286 7508297.151622124, 546630.1392768638 7507705.651409691, 546603.1807938237 7507387.650260012, 546506.4978075675 7507121.148085169, 546347.0615013136 7507032.637269333, 546098.2091887437 7506843.148602944, 545931.3088385327 7506525.652599484, 545783.2304036418 7506157.651186772, 545590.6004368869 7505770.149005672, 545302.220849858 7505307.161514722, 544943.5218329843 7504761.659700146, 544725.589950206 7504406.661184955, 544501.3301299365 7504057.659381664, 544123.7492673827 7503569.65055993, 543753.3717356625 7503247.158579025, 543357.1403491914 7502835.651261853, 543024.9804781342 7502538.151226191, 541869.5108813633 7501596.148375388, 541378.0882920383 7501255.14835676, 540868.3004191916 7501022.139786543, 540434.9686214997 7500840.1404092265, 539886.7884534674 7500575.63855817, 539472.3796638706 7500361.638875108, 539128.0079635188 7500159.640221103, 538782.997857895 7499830.628830574, 538476.5108094017 7499571.63122786, 538240.7492773887 7499470.63115928, 537903.1197484749 7499358.130287537, 537565.798215594 7499296.129047448, 536808.4890007469 7499179.611402069, 536356.470196148 7499080.119504457, 535866.5394221739 7499031.6102768835, 535319.4902977825 7498996.622168367, 534772.740833108 7499031.601619519, 534210.0803737598 7499182.601076152, 534340.198053612 7498999.598917203, 533821.5094927405 7499055.600588054, 533411.8113768979 7499131.089975966, 532789.7513422351 7499313.090730185, 532046.2501181982 7499359.088792428, 531560.67008621 7499404.592412204, 531257.2500160005 7499404.579407357, 530968.9126983685 7499419.569814132, 530650.2800068778 7499495.580507001, 530361.9716437634 7499601.580113631, 530210.2997778169 7499647.070799118, 530073.7308944844 7499647.070125781, 529891.5828257337 7499586.560860623, 529755.0991281664 7499495.580794845, 529648.8292915868 7499434.5578709105, 528920.5188349494 7499359.061077322, 527979.7492919912 7499328.541776303, 527312.1506295647 7499283.029891403, 526705.180449267 7499192.041248869, 525809.9994778357 7499116.019442553, 525476.2009420571 7499040.010854232, 525203.0376252765 7498994.508480495, 524869.2387656079 7498918.51084629, 524080.2303868365 7498843.010146859, 523609.870466445 7498706.489138644, 523291.2388393459 7498627.490776373, 523430.94108519924 7498430.97971337, 523169.7519518991 7498336.9916863255, 523067.8999133475 7498311.989780473, 522895.79094343656 7498236.47812375, 522615.2015952141 7498072.470330764, 521882.68120583834 7497821.9590960555, 521526.329923179 7497779.458482446, 521208.3405302452 7497768.4611137025, 520979.32009647455 7497743.970866632, 520246.9187887205 7497531.941943437, 519782.08844691695 7497413.448312005, 520002.3885029421 7496934.941946905, 520209.1083645308 7496271.949922595, 520062.09934968926 7496119.939772207, 519908.908905628 7495993.451213341, 519762.19907704194 7495904.939755936, 519433.31787936296 7496282.440096311, 519021.35990318016 7496577.430042788, 518014.12685069727 7497123.757406966, 517847.87960707064 7497213.920483814, 518052.6588929064 7497479.929860756, 518378.75004365854 7497847.439117733, 518634.3200345988 7498094.449079171, 518908.5794034575 7498264.440973526, 519335.6618072438 7498472.439554902, 519252.20101762953 7498679.952354821, 519560.6297179958 7498905.449083999, 519841.0594230981 7499099.460949831, 520204.50920786086 7499313.960170623, 520701.5588286266 7499521.471808222, 521058.2386759036 7499640.459560571, 521446.58837317635 7499727.479032446, 521783.7590640183 7499750.978217975, 522165.4282854522 7499767.980588535, 522349.82999664184 7499766.980938438, 522960.039467707 7499706.491441668, 523297.16966091254 7499723.988046024, 523539.32880094706 7499824.488559486, 523807.08019181894 7499963.000741711, 524463.0992449556 7500175.499866457, 524512.8016415874 7500182.007559836, 524717.1588156507 7500210.008445114, 525080.3788815879 7500248.520118253, 525373.009474968 7500266.021161621, 525849.7599196057 7500225.520548406, 526409.2975434399 7500216.0304062795, 527668.6504820347 7500241.048918353, 527986.5626644411 7500239.548052716, 528679.6486600972 7500223.049524989, 528991.0805857518 7500183.048984395, 529080.2915462828 7500220.560018571, 528861.2821091067 7500456.376656858, 528593.1590481335 7500745.061562195, 529089.1306385137 7500749.058695367, 529769.5689500389 7500739.068746001, 530322.5721776648 7500685.071386769, 531009.3391590683 7500675.080785563, 531715.7397694591 7500766.5896713175, 532059.217865999 7500783.592576525, 532828.7419588722 7500779.5898232, 533000.6997315121 7500836.091269061, 533038.9283901458 7500854.600384592, 533285.1919484579 7500484.100489479, 533501.7106121776 7500546.609419422, 533864.9377766768 7500710.109621601, 534081.707948689 7500817.109223025, 534266.3894202294 7500867.109677931, 534616.1697530068 7500865.118759207, 534972.0878904671 7500831.60926567, 535734.4196069153 7500662.120714227, 536218.0508771543 7500716.629827709, 536612.6102296428 7500784.619802926, 537039.8101914302 7501017.629488595, 537263.759554188 7501296.640788067, 537322.0002546984 7501506.137971934, 537323.512343094 7501824.631167889, 537330.5981657798 7501970.64164006, 537394.9012426569 7502116.6387358, 537573.5679509791 7502255.649229575, 537790.3291457944 7502369.149316649, 538115.0518896088 7502437.639098501, 539088.3392634689 7502508.650756364, 539534.2795183354 7502671.651546545, 539885.0605549935 7502867.1490661055, 540331.7501426223 7503195.64920016, 540714.5785347596 7503454.658803316, 541052.4398514851 7503624.639814632, 541486.308983785 7503927.648783734, 541996.4995114992 7504230.151673151, 542628.1512679089 7504653.147738583, 542851.5999981739 7504830.14837735, 543177.9487287153 7505267.651104042, 543486.6189286782 7505966.149615844, 543666.679994183 7506391.651839036, 543852.7414086531 7506721.6492448095, 544044.8593324737 7507007.147786982, 544320.0205451642 7507368.1501189, 544499.4011402257 7507634.652536377, 544659.9523990505 7507964.649859147, 544743.6496689884 7508180.648907676, 544986.9678246026 7508529.640704611, 545122.0989812994 7508859.651255335, 545238.039955168 7509170.651160647, 545386.0617978976 7509520.139114544, 545584.7022705829 7509837.140359415, 545834.0788611344 7510116.140090743, 546344.380029087 7510444.151013868, 546523.2508059363 7510615.138416301, 546747.331027712 7510919.130965919, 546773.3396856086 7511046.639840472, 546808.3346999853 7511273.57407786, 547299.6917173745 7511273.57407786, 547275.2605938074 7510942.138586918, 547274.1485721432 7510712.640855634, 547768.5005213317 7510360.139111111, 547742.74022461 7510290.129271863)), ((548272.1405476438 7510624.629289403, 548214.5917593987 7510548.640630638, 548034.6985979096 7510174.130197281, 547768.5005213317 7510360.139111111, 547833.5195149541 7510658.638555709, 547885.3303025676 7510849.6390516255, 547988.0581958856 7511059.142060453, 547866.346912276 7511273.57407786, 548581.631353986 7511273.57407786, 548413.8699626504 7510999.637639921, 548292.1977257754 7510834.630641138, 548241.1415831931 7510796.629177393, 548272.1405476438 7510624.629289403)), ((518458.88836710755 7510995.46853115, 518141.52131587744 7510910.961119785, 517866.45077388664 7510783.959730373, 517549.06009563577 7510678.458123916, 517020.1391904314 7510529.950958829, 516492.95176213 7510465.9373331405, 516174.4118894598 7510353.441098779, 515687.31005864 7510208.10288581, 515687.31005864 7510535.495148476, 516099.9117498277 7510729.441395104, 516431.11017213535 7510841.937734678, 517163.40139120014 7511035.449545613, 517500.92836104217 7511135.449482633, 517851.0309907953 7511209.959799787, 518143.76982640155 7511252.968656216, 518209.50350111787 7511273.57407786, 520255.0194798138 7511273.57407786, 519955.93893452483 7511198.499291981, 519612.4409495074 7511174.9807783365, 519199.4289998404 7511037.968745014, 518458.88836710755 7510995.46853115)), ((516430.7693107754 7511273.57407786, 516172.1291149464 7511206.442232702, 515687.31005864 7511091.777985906, 515687.31005864 7511273.57407786, 516430.7693107754 7511273.57407786)))",A_FOj_xs_b,Fortescue_Group,None,TRUE,"Siliciclastic sedimentary rocks, mafic volcanic rocks and minor felsic volcanic rocks; local carbonate rocks, chert, and dolerite sills",FALSE,sedimentary siliciclastic,igneous mafic volcanic,2629,2713,0 +5,Marra_Mamba_Iron_Formation,"MULTIPOLYGON (((561529.0693433502 7495500.300697606, 561172.3202910237 7495368.299701564, 560402.5707222706 7495308.800442472, 560097.5707669309 7495361.790681838, 559741.4321324346 7495363.289721617, 559352.7508186981 7495212.791316452, 558785.4216429396 7494929.281944961, 558352.1304150695 7494747.279626002, 557957.2594565495 7494615.783141114, 557645.1894847138 7494528.2791383695, 557243.7197996498 7494358.769946707, 556931.3508738689 7494207.7788869515, 556452.9984456993 7493898.268556669, 556185.1780198755 7493759.771520052, 555822.1082243335 7493634.262409395, 555427.5004939327 7493560.25970817, 554988.7283185879 7493568.758602278, 554708.9872348415 7493583.250167057, 554250.8577867728 7493534.748806437, 553888.0314194866 7493460.250612048, 553837.1502217959 7493446.76593407, 552169.8038740085 7493446.76593407, 552120.029440871 7493450.72875792, 552020.9983376762 7493446.76593407, 549342.9171320348 7493446.76593407, 549474.6489930322 7493478.199903062, 549870.0192977528 7493704.701154016, 550106.1609767345 7493881.70126101, 550558.2990232613 7494000.2100665225, 551118.1800596238 7494060.722641811, 551368.6268095953 7494020.756694729, 551569.3581511112 7493988.721048221, 551988.9826816262 7493979.718334819, 553210.1513026675 7493998.742212988, 553794.9208082039 7493950.738151981, 554329.0876227041 7493941.7473724075, 554755.1705566598 7493939.249121815, 555105.050060367 7493956.761668192, 555397.8077534148 7494012.260754716, 555639.8499168649 7494093.759371987, 555894.8612740205 7494219.759863367, 556156.5304626453 7494415.761871083, 556616.1003064514 7494775.75995823, 556852.2186769426 7494939.759161146, 557170.7491252203 7495052.771290165, 557444.6893065755 7495159.7725422345, 557693.3499518783 7495291.781233804, 557961.7901537216 7495576.769842969, 558045.0891852239 7495703.781962683, 558052.2300452122 7495869.268662621, 558255.4401164817 7495804.280857233, 558351.9290179008 7496032.767925892, 558371.6879997047 7496179.270977483, 558359.9787040332 7496395.76903628, 558316.3107512194 7496567.771325105, 559327.1712826471 7496505.271246152, 560127.8629817173 7496386.282164244, 560744.0715808567 7496242.778021171, 560801.5591118434 7496299.777937588, 560884.8301239749 7496420.277748018, 561025.3187766486 7496546.7798468955, 561191.0721468813 7496634.770176873, 561630.5810302994 7496778.7807272645, 561840.6888721345 7496822.281185539, 562127.4581839192 7496948.281933181, 562666.860106543 7497133.237551528, 562666.860106543 7495992.320895091, 562491.4003763469 7495921.30078255, 562019.8203147285 7495720.302675132, 561529.0693433502 7495500.300697606)), ((515793.1289313223 7497078.399584744, 515754.79905719316 7497040.409498656, 515687.31005864 7497115.820520519, 515687.31005864 7497389.639072334, 515870.97036341205 7497621.410565415, 516091.26101893315 7498037.406657402, 516446.6907421405 7498643.43120897, 516885.90208859614 7498199.4297917355, 516642.61860185623 7497850.430777944, 516489.1098908469 7497660.420436237, 516265.4181695774 7497432.421495873, 515863.18009091436 7497103.421118297, 515793.1289313223 7497078.399584744)), ((518052.6588929064 7497479.929860756, 517847.87960707064 7497213.920483814, 517473.779419789 7497665.421633448, 517576.33932652103 7497748.931734686, 518083.56025949726 7498211.439638004, 518466.13040320994 7498460.429988716, 518804.2710189213 7498665.4398353575, 519198.90885567555 7498812.449021301, 519142.37342451006 7498952.950562375, 519103.0915856651 7499079.938515901, 519637.3397090967 7499435.950325359, 520226.328942433 7499730.461817173, 520656.72825562104 7499911.9717762275, 521177.75841613725 7500024.971386151, 521744.1016206479 7500092.981452505, 522262.5892723424 7500072.482112171, 522854.1015355051 7500070.490630232, 523397.800140245 7500183.491012175, 524248.5879006177 7500447.019791599, 524512.8016415874 7500182.007559836, 524463.0992449556 7500175.499866457, 523807.08019181894 7499963.000741711, 523539.32880094706 7499824.488559486, 523297.16966091254 7499723.988046024, 522960.039467707 7499706.491441668, 522349.82999664184 7499766.980938438, 522165.4282854522 7499767.980588535, 521783.7590640183 7499750.978217975, 521446.58837317635 7499727.479032446, 521058.2386759036 7499640.459560571, 520701.5588286266 7499521.471808222, 520204.50920786086 7499313.960170623, 519841.0594230981 7499099.460949831, 519560.6297179958 7498905.449083999, 519252.20101762953 7498679.952354821, 519335.6618072438 7498472.439554902, 518908.5794034575 7498264.440973526, 518634.3200345988 7498094.449079171, 518378.75004365854 7497847.439117733, 518052.6588929064 7497479.929860756)), ((546344.380029087 7510444.151013868, 545834.0788611344 7510116.140090743, 545584.7022705829 7509837.140359415, 545386.0617978976 7509520.139114544, 545238.039955168 7509170.651160647, 545122.0989812994 7508859.651255335, 544986.9678246026 7508529.640704611, 544743.6496689884 7508180.648907676, 544659.9523990505 7507964.649859147, 544499.4011402257 7507634.652536377, 544320.0205451642 7507368.1501189, 544044.8593324737 7507007.147786982, 543852.7414086531 7506721.6492448095, 543666.679994183 7506391.651839036, 543486.6189286782 7505966.149615844, 543177.9487287153 7505267.651104042, 542851.5999981739 7504830.14837735, 542628.1512679089 7504653.147738583, 541996.4995114992 7504230.151673151, 541486.308983785 7503927.648783734, 541052.4398514851 7503624.639814632, 540714.5785347596 7503454.658803316, 540331.7501426223 7503195.64920016, 539885.0605549935 7502867.1490661055, 539534.2795183354 7502671.651546545, 539088.3392634689 7502508.650756364, 538115.0518896088 7502437.639098501, 537790.3291457944 7502369.149316649, 537573.5679509791 7502255.649229575, 537394.9012426569 7502116.6387358, 537330.5981657798 7501970.64164006, 537323.512343094 7501824.631167889, 537322.0002546984 7501506.137971934, 537263.759554188 7501296.640788067, 537039.8101914302 7501017.629488595, 536612.6102296428 7500784.619802926, 536218.0508771543 7500716.629827709, 535734.4196069153 7500662.120714227, 534972.0878904671 7500831.60926567, 534616.1697530068 7500865.118759207, 534266.3894202294 7500867.109677931, 534081.707948689 7500817.109223025, 533864.9377766768 7500710.109621601, 533501.7106121776 7500546.609419422, 533285.1919484579 7500484.100489479, 533038.9283901458 7500854.600384592, 533000.6997315121 7500836.091269061, 532828.7419588722 7500779.5898232, 532059.217865999 7500783.592576525, 531715.7397694591 7500766.5896713175, 531009.3391590683 7500675.080785563, 530322.5721776648 7500685.071386769, 529769.5689500389 7500739.068746001, 529089.1306385137 7500749.058695367, 528593.1590481335 7500745.061562195, 528861.2821091067 7500456.376656858, 529080.2915462828 7500220.560018571, 528991.0805857518 7500183.048984395, 528679.6486600972 7500223.049524989, 527986.5626644411 7500239.548052716, 527668.6504820347 7500241.048918353, 526409.2975434399 7500216.0304062795, 525849.7599196057 7500225.520548406, 525373.009474968 7500266.021161621, 525080.3788815879 7500248.520118253, 524717.1588156507 7500210.008445114, 525164.741490112 7500478.010388386, 525549.8513239659 7500614.030079294, 526591.8898101806 7500682.031155989, 527430.0695936965 7500795.54912298, 528009.3800239285 7501104.558906376, 528302.3796234686 7501116.061090368, 528419.5086110234 7500966.560950048, 528449.4294216911 7500976.550271084, 529061.0896587145 7501044.568249466, 529763.3494318491 7501135.069384416, 530442.9822135061 7501135.069277219, 531190.5300996846 7501090.091032721, 532255.2395347834 7501090.091991021, 532914.7496984366 7501129.60123437, 532980.3023073664 7500984.598948223, 533649.9409386696 7501055.119656148, 534813.6585787236 7501213.618710101, 535289.7498613112 7501266.619812854, 535871.5983779838 7501240.119965034, 536215.4412918156 7501319.618713187, 536585.7404540353 7501557.629628016, 536718.0077891762 7502060.13852931, 536718.0086382702 7502615.629928695, 536770.9210307123 7502932.64054512, 536956.0390386477 7503170.639288427, 537458.5619110551 7503118.139599254, 537934.598100105 7502959.149481947, 538490.0402022891 7502853.640004457, 539204.189948189 7503038.640902684, 540447.2613627176 7503647.150411133, 541293.5891299595 7504202.1505518425, 542034.1492941775 7504704.651433502, 542748.2417293066 7505604.149364745, 543197.8599954516 7506291.651044439, 543753.3111433779 7507006.148530141, 544255.8195605794 7507878.650570881, 544520.3602272364 7508619.14910038, 544599.6914848969 7509307.151234082, 544626.1803077393 7509862.650901608, 544864.1696989994 7510153.151318326, 545313.8003012887 7510444.152128339, 545684.0793415828 7510788.140244358, 546007.7160119219 7511273.57407786, 546808.3346999853 7511273.57407786, 546773.3396856086 7511046.639840472, 546747.331027712 7510919.130965919, 546523.2508059363 7510615.138416301, 546344.380029087 7510444.151013868)), ((517549.06009563577 7510678.458123916, 517866.45077388664 7510783.959730373, 518141.52131587744 7510910.961119785, 518458.88836710755 7510995.46853115, 519199.4289998404 7511037.968745014, 519612.4409495074 7511174.9807783365, 519955.93893452483 7511198.499291981, 520255.0194798138 7511273.57407786, 522035.6417709113 7511273.57407786, 521963.5200886072 7511251.03011405, 521250.89725778217 7510927.007610097, 520343.9405266365 7510754.501726737, 519501.7705072275 7510646.489690395, 518681.19015407236 7510473.4707800485, 517947.0103511128 7510300.959039912, 516564.99999755877 7509955.440505572, 515762.9211224568 7509734.929779939, 515687.31005864 7509757.969303892, 515687.31005864 7510208.10288581, 516174.4118894598 7510353.441098779, 516492.95176213 7510465.9373331405, 517020.1391904314 7510529.950958829, 517549.06009563577 7510678.458123916)))",A_HAm_cib,Hamersley_Group,None,FALSE,"Chert, banded iron-formation, mudstone, and siltstone; minor carbonate; metamorphosed",FALSE,sedimentary other chemical or biochemical,None,2597,2629,3 +6,Mount_McRae_Shale_and_Mount_Sylvia_Formation,"MULTIPOLYGON (((560930.5491833736 7494014.308365822, 559791.5705624844 7493873.8011092, 559314.8095751925 7493920.801283302, 558997.299511152 7493801.793448554, 558461.5013462113 7493623.279629111, 558049.3462389561 7493446.76593407, 556617.9701895867 7493446.76593407, 556864.8193376454 7493525.279066282, 557246.2883167304 7493682.770033922, 557538.0586532991 7493817.278351041, 558772.2402817137 7494310.790513374, 559221.0506580516 7494378.2908439655, 559647.42067953 7494400.799023818, 560051.2903302552 7494400.798726682, 561128.4306050688 7494512.809020082, 562070.9410962691 7494625.308588614, 562430.0096109334 7494692.3196648555, 562666.860106543 7494692.319922045, 562666.860106543 7493948.500266527, 562017.8682529833 7493989.310636561, 561445.871286734 7494055.810433237, 560930.5491833736 7494014.308365822)), ((515687.31005864 7498557.94276498, 515687.31005864 7498836.6824742975, 515699.65068941494 7498844.919029786, 515937.86030956055 7499043.418337672, 516084.35138976463 7498918.921142539, 515687.31005864 7498557.94276498)), ((518293.9995506779 7499579.442325524, 518636.630131695 7499603.948979337, 518912.2703785664 7499695.460613201, 518839.3087217495 7499930.939910483, 519069.99947665556 7500108.460693729, 519372.2888861367 7500431.949672808, 519631.44173262396 7500691.461144079, 519976.9100607757 7500799.467891492, 520473.5791580021 7500907.47207442, 521543.43977636826 7501077.536889363, 522373.88105920254 7501209.489694493, 523090.5919463073 7501408.489780863, 523576.89012020186 7501033.501141634, 523814.80919091677 7500861.501062083, 524403.0688352056 7500914.508251944, 525518.2012575322 7500983.103860429, 526591.3817509151 7501049.041682794, 528009.3800239285 7501104.558906376, 527430.0695936965 7500795.54912298, 526591.8898101806 7500682.031155989, 525549.8513239659 7500614.030079294, 525164.741490112 7500478.010388386, 524717.1588156507 7500210.008445114, 524512.8016415874 7500182.007559836, 524248.5879006177 7500447.019791599, 523397.800140245 7500183.491012175, 522854.1015355051 7500070.490630232, 522262.5892723424 7500072.482112171, 522066.4407673655 7500347.9905595165, 521600.9787950013 7500716.479862276, 521328.89903726405 7500656.4806792, 520790.4299846636 7500582.969375729, 520251.98120085674 7500460.470861681, 519713.5306122653 7500191.470446845, 519321.9798674347 7499823.9479718935, 518959.73934571334 7499542.451161012, 519006.42959692003 7499391.451385064, 518930.35734212684 7499358.950494657, 518342.97221727547 7499040.940498443, 517877.9401371055 7498746.941773088, 517461.8811086684 7498453.430531878, 516997.112233693 7498099.4291966865, 516885.90208859614 7498199.4297917355, 516446.6907421405 7498643.43120897, 516399.8008133813 7498690.920674295, 516752.1097919952 7498820.421163431, 517682.1190903442 7499358.941561984, 518293.9995506779 7499579.442325524)), ((543356.4892538954 7509687.648783354, 543283.1098597427 7509198.147471319, 543136.210824489 7508978.151689474, 542866.960801154 7508635.64761918, 542622.2203807895 7508170.659347272, 542597.7511561977 7507729.650091417, 542426.4309210991 7507142.661000531, 542157.188364097 7506530.648970222, 541936.8897461828 7506065.650917606, 541716.579055085 7505698.161702238, 540762.0786962437 7504939.640102765, 540125.7701951619 7504572.649722667, 539244.6298891233 7504132.1499195155, 538755.1426198388 7503960.650235864, 538020.880797314 7503667.152258195, 537555.8628507385 7503544.648875479, 536992.9320167609 7503520.142260872, 536527.9085336014 7503593.649577202, 536258.6794978298 7503520.1420490965, 536013.9019787532 7503250.6406890815, 535891.5287010848 7502908.137486189, 535646.811027526 7502516.630293993, 534985.9214213598 7502076.121785872, 534325.1210312116 7501880.119671486, 533444.0185844316 7501684.610329261, 532856.6521893132 7501611.111205827, 532540.0099931683 7501632.111001113, 532622.2591007367 7501487.100418941, 532463.8035782139 7501487.0675338805, 531172.4107788386 7501486.738344409, 530418.7091161757 7501486.4958821945, 529735.546288338 7501486.244186527, 529283.5101245476 7501486.060903136, 528055.8005487525 7501423.059336569, 527895.3804132865 7501600.550623674, 528269.5491108517 7501675.549466317, 528644.5797393748 7501769.560601743, 529113.4114605029 7501800.570461128, 529800.9698748067 7501832.069814637, 530707.2799876283 7501832.090665868, 531832.3692170901 7502050.601514432, 532130.4601205576 7502165.598587238, 532401.5081382872 7501876.600775925, 532551.2005992332 7501832.098164607, 533020.0292473664 7501925.602211657, 533613.8304010862 7502019.621294899, 534488.938896653 7502207.120117575, 534926.429906485 7502457.130986004, 535239.0000169724 7502707.138429321, 535551.5432611828 7503144.641235851, 535676.5302751992 7503519.6384271905, 535926.5516183792 7503894.651935911, 536270.3683300179 7504082.142233546, 536676.5897916277 7504113.64755625, 536989.1799710266 7504051.152139422, 537895.5108797394 7503957.148059852, 538364.2599795916 7504113.660114445, 539051.811228066 7504394.649407532, 539676.8889227604 7504613.650578799, 540145.7008413936 7504988.647760561, 540770.7923636963 7505332.151711078, 541145.7601316958 7505676.1485500615, 541614.6014505886 7506144.651670894, 541895.8687167019 7506645.161976043, 542083.358566338 7507145.159036974, 542208.3892406807 7507707.658948663, 542145.9084492023 7508332.659268241, 542239.658127031 7508645.160752991, 542458.4708741052 7508957.660044044, 542677.2416874336 7509082.662457213, 542864.7195600083 7509239.161151003, 542927.2699991837 7509989.150851081, 542927.261376111 7510676.660736442, 542813.6132503639 7511273.57407786, 543599.5856918202 7511273.57407786, 543478.9103237179 7510911.660685738, 543381.0214684247 7510324.1510351775, 543356.4892538954 7509687.648783354)), ((515687.31005864 7509097.518641549, 515748.5403486908 7509100.438181, 516262.53936959297 7509100.438068526, 516923.33080682124 7509295.9608854, 517412.839451653 7509467.451953103, 517524.0783686196 7509517.9606380295, 517746.86032913945 7509496.468574394, 518067.74922614626 7509452.469257174, 517364.01031440287 7509199.458663939, 516932.1294444653 7508983.448731998, 516500.23908221396 7508810.949452151, 516068.3611047208 7508702.950624801, 515687.31005864 7508702.941175408, 515687.31005864 7509097.518641549)), ((524788.129109536 7510968.569844436, 524628.9312608214 7510931.060058156, 524449.9398367784 7510735.050195138, 524296.7088650404 7510608.561523401, 524175.58166239597 7510552.060833326, 524162.85905036354 7510539.051478794, 523991.42905727075 7510603.559072675, 523647.8605990965 7510430.539885054, 523323.94062763144 7510193.041663176, 522935.2510594871 7509934.040071262, 521858.95929696417 7509706.585036412, 521402.08978690987 7509610.00899969, 520906.0067273626 7509526.057665058, 520005.17078520963 7509373.567330418, 519868.8700767889 7509350.490000427, 519307.44022161217 7509273.4899786115, 518912.7777273635 7509330.4692640845, 519982.6783810983 7509614.489995858, 520790.3393039586 7509810.000191968, 521671.43902987737 7509957.0189364655, 522846.2688184008 7510275.031419221, 523849.76068936964 7510813.548713037, 524455.0901109544 7511273.57407786, 525367.1410828978 7511273.57407786, 525355.4707649952 7511252.092282772, 525201.9617750401 7511074.579809792, 524991.7714599696 7510993.08095076, 524788.129109536 7510968.569844436)))",A_HAu_xsl_ci,Hamersley_Group,None,FALSE,"Mudstone, siltstone, chert, banded iron-formation, and dolomite; metamorphosed",FALSE,sedimentary siliciclastic,sedimentary other chemical or biochemical,2501,2541,4 +7,Turee_Creek_Group,"POLYGON ((528098.008845533 7507783.099712681, 529344.8316910393 7507958.129734904, 530263.5311044148 7508220.649868442, 531357.2706492116 7508395.667834316, 532013.4010351673 7508548.669753515, 532538.3520777494 7508548.677518224, 532932.1086069325 7508483.171749172, 533085.1519033327 7508308.168893826, 533107.019451309 7508045.669424446, 533041.4099823105 7507717.670459705, 532866.4200693102 7507455.161494225, 531685.2195994601 7506755.138321674, 530875.8998375781 7506317.632908142, 530175.9800506906 7506011.619548611, 529279.1401694642 7505442.599590892, 528426.1115621547 7505027.0810785545, 526654.3696992868 7504655.06131971, 525210.7310010112 7504567.529698393, 523067.19919627137 7504217.511165934, 521098.64891779853 7503867.990412911, 520414.01957901166 7503782.489781251, 519947.01063597447 7503700.980550331, 519297.3110573332 7503599.468447633, 518160.2822955752 7503355.949978584, 517327.8402004926 7503193.448910357, 516559.5288458597 7502992.442232459, 516863.057892551 7502589.942326081, 516985.4093417867 7502432.939720497, 516678.09851031005 7502381.430084916, 515987.7592461791 7502401.430705549, 515687.31005864 7502462.967454206, 515687.31005864 7505599.152506509, 515987.7299865257 7505650.451000418, 516820.2293229884 7505812.951413073, 517530.84908190224 7505975.462046549, 518079.0515951517 7506117.4687682595, 518708.4700036491 7506299.9906321615, 519283.22895568464 7506382.979115697, 521798.57842701033 7506667.508674661, 524292.0583883931 7507105.036800025, 525888.7772752688 7507345.559387773, 526916.8410634564 7507564.581700354, 528098.008845533 7507783.099712681))",P__TK_s,Turee_Creek_Group,None,TRUE,"Mudstone, siltstone, sandstone, conglomerate, dolomite; minor diamictite, limestone and iron formation; intruded by Balgara Dolerite sills",FALSE,sedimentary siliciclastic,None,2208,2445,19 +8,Weeli_Wolli_Formation,"MULTIPOLYGON (((539422.6578598478 7510951.691127828, 539660.6697954691 7510607.680169231, 539898.7276585057 7510184.68239211, 540057.3710624615 7509681.668901291, 540295.3694572111 7509391.167218113, 540480.4705794358 7509232.170064665, 540612.7384639209 7509073.658652099, 540665.5814983585 7508571.170081407, 540348.2114157699 7507671.659639817, 539925.0498745313 7507090.1577369245, 539607.670671504 7506746.159959816, 539052.200798928 7506296.660687522, 538205.9094809934 7505952.6699313875, 537068.6509273968 7505741.160393212, 536169.3901651907 7505661.661419861, 535217.2919880576 7505503.150627365, 534635.4301719851 7505317.65121302, 534027.0999437242 7504974.140041251, 533603.8817716703 7504709.62726154, 533233.6514340461 7504312.63172733, 532466.6187711438 7503969.12087173, 531858.3409145023 7503651.619851969, 531329.3389675578 7503360.611643844, 531092.2100394127 7503242.110120671, 530852.9701849594 7503491.101557735, 530292.3180354721 7503316.099201279, 529603.481626151 7503154.07903868, 529076.7311885592 7502911.078795484, 528266.3094259326 7502728.56966918, 527759.8099331601 7502688.059576647, 527233.1392903796 7502607.060848987, 527002.7512360156 7502588.051300699, 527190.8102288014 7502380.04191008, 526700.8509709035 7502355.539378185, 525246.218477027 7502408.520923147, 524294.1117317752 7502249.520968337, 523447.7796929872 7502091.0098048225, 522521.98180311493 7501847.499487177, 522422.25158683065 7501924.491564866, 521104.13919638324 7501751.4809457455, 520737.7721352853 7501723.978681096, 520343.17884565605 7501712.978961738, 519636.90140196204 7501633.958211428, 519121.2817813142 7501534.949975431, 518389.21039298974 7501379.949451383, 517873.43954899284 7501235.941138336, 517978.50258811587 7501117.440985382, 517828.95992033836 7501072.440090696, 517608.66963171936 7501023.442418405, 517168.14824099984 7500949.939010262, 516703.12940648245 7500900.929794995, 516189.1596439413 7500778.41878218, 515687.31005864 7500678.361180522, 515687.31005864 7501381.228581716, 516208.0296223537 7501404.4304796625, 516513.43983924395 7501427.9292805875, 516806.13917544344 7501470.929028626, 517041.529127982 7501482.43885285, 517493.2803822524 7501530.9397668075, 517626.97828778083 7501568.438148484, 517439.4522652144 7501894.939140918, 518147.1409852186 7502100.460410408, 518734.5411795068 7502246.968182836, 519573.7976121586 7502354.695541283, 520967.45085503306 7502533.480759755, 521973.58024351613 7502730.490436181, 522979.72967354686 7502796.0099626435, 524313.9806665231 7502993.020090313, 525298.2094937422 7503146.041082706, 526129.4297748083 7503146.049718277, 526610.599389693 7503255.540216237, 526960.5505161036 7503255.548426319, 527507.3776305515 7503343.059446624, 528797.9000049669 7503627.080213759, 529213.5023450628 7503780.58191013, 529716.559640727 7503911.60101499, 530330.938629704 7504034.600131254, 530456.1413454224 7503904.6091479305, 530728.5093100072 7504046.609459706, 531906.171165955 7504513.61882106, 532495.0114416644 7504737.120717508, 533022.901014481 7505082.130395377, 533489.9179332453 7505488.139462488, 534038.179586407 7505813.147930646, 534931.5578075495 7506158.158888093, 535743.6882477176 7506361.1594366, 536616.7715214416 7506544.1692010965, 537002.5204438849 7506686.161332644, 537428.9305590896 7507011.171658462, 537631.9808313145 7507214.168417105, 538180.2115608531 7507599.671520811, 538586.3296624002 7507965.169740124, 539012.7302670052 7508493.181885645, 539134.5507683798 7509041.669524262, 539114.2378285888 7509528.6699069105, 538972.1599029788 7509914.689756285, 538626.9991428351 7510523.679197967, 538322.4402496128 7510706.688930759, 537266.7208616388 7511153.202050386, 536629.9341059177 7511273.57407786, 539043.4943342534 7511273.57407786, 539052.3881896138 7511268.680436604, 539422.6578598478 7510951.691127828)), ((532292.2306205566 7510767.219354186, 531297.3295623484 7510503.211238948, 530282.090520335 7510219.191589758, 529408.9095765568 7509934.658954328, 528759.1812103037 7509752.148616942, 527891.1703374396 7509549.630575992, 527150.5723233982 7509258.600825904, 526304.1784057483 7509047.07942464, 525537.1616826141 7508888.560437961, 524796.6501091121 7508809.060238443, 524135.4115040663 7508571.050886159, 523447.75110291137 7508491.531642083, 522495.61959948245 7508412.019790693, 522046.0097162984 7508306.518230193, 521252.5692508576 7508095.008492359, 520459.1205355452 7507962.499755844, 519692.14143665205 7507777.478591884, 518845.8080052769 7507697.980592622, 517884.80923452356 7507626.459500684, 517617.6789375373 7507621.458239922, 516974.9890657959 7507529.450941888, 516567.64963589073 7507461.461209964, 516077.55998065916 7507374.940313898, 515727.4016738701 7507294.44228695, 515687.31005864 7507284.364434812, 515687.31005864 7507785.32034428, 516143.46774096537 7507858.440086285, 516913.6107745424 7507994.460242172, 517735.1991120291 7508250.968857957, 518142.95983809966 7508401.480365034, 518760.5294264208 7508556.979971839, 519206.1095730919 7508643.988675173, 519619.8916243296 7508736.979432851, 520052.92800381104 7508862.000883804, 521090.5512352326 7509073.01052396, 522005.9512440277 7508998.029494725, 522324.3404851429 7509085.020956203, 522451.57102242974 7509097.030138154, 522591.62147816404 7509122.027421697, 524151.1692813777 7509438.05160553, 524456.6897462322 7509487.559559392, 525140.4391166749 7509496.570468929, 526119.0513356786 7509602.579176346, 527124.1199973462 7509920.100146097, 527864.7421936209 7510184.620799529, 528658.2802411651 7510422.639340675, 529451.7901004837 7510766.169718606, 530324.6193851209 7511057.199628872, 531045.9716679277 7511273.57407786, 533602.2020958705 7511273.57407786, 533510.480061766 7511234.208642662, 532292.2306205566 7510767.219354186)))",P__HAj_xci_od,Hamersley_Group,None,TRUE,"Banded iron-formation (commonly jaspilitic), mudstone, siltstone, and numerous dolerite sills; metamorphosed",FALSE,sedimentary other chemical or biochemical,igneous mafic intrusive,2450,2451,25 +9,Wittenoom_Formation,"MULTIPOLYGON (((552020.9983376762 7493446.76593407, 552120.029440871 7493450.72875792, 552169.8038740085 7493446.76593407, 552020.9983376762 7493446.76593407)), ((560051.2903302552 7494400.798726682, 559647.42067953 7494400.799023818, 559221.0506580516 7494378.2908439655, 558772.2402817137 7494310.790513374, 557538.0586532991 7493817.278351041, 557246.2883167304 7493682.770033922, 556864.8193376454 7493525.279066282, 556617.9701895867 7493446.76593407, 553837.1502217959 7493446.76593407, 553888.0314194866 7493460.250612048, 554250.8577867728 7493534.748806437, 554708.9872348415 7493583.250167057, 554988.7283185879 7493568.758602278, 555427.5004939327 7493560.25970817, 555822.1082243335 7493634.262409395, 556185.1780198755 7493759.771520052, 556452.9984456993 7493898.268556669, 556931.3508738689 7494207.7788869515, 557243.7197996498 7494358.769946707, 557645.1894847138 7494528.2791383695, 557957.2594565495 7494615.783141114, 558352.1304150695 7494747.279626002, 558785.4216429396 7494929.281944961, 559352.7508186981 7495212.791316452, 559741.4321324346 7495363.289721617, 560097.5707669309 7495361.790681838, 560402.5707222706 7495308.800442472, 561172.3202910237 7495368.299701564, 561529.0693433502 7495500.300697606, 562019.8203147285 7495720.302675132, 562491.4003763469 7495921.30078255, 562666.860106543 7495992.320895091, 562666.860106543 7494692.319922045, 562430.0096109334 7494692.3196648555, 562070.9410962691 7494625.308588614, 561128.4306050688 7494512.809020082, 560051.2903302552 7494400.798726682)), ((516446.6907421405 7498643.43120897, 516091.26101893315 7498037.406657402, 515870.97036341205 7497621.410565415, 515687.31005864 7497389.639072334, 515687.31005864 7498557.94276498, 516084.35138976463 7498918.921142539, 516132.4019624576 7498877.912625973, 516399.8008133813 7498690.920674295, 516446.6907421405 7498643.43120897)), ((522262.5892723424 7500072.482112171, 521744.1016206479 7500092.981452505, 521177.75841613725 7500024.971386151, 520656.72825562104 7499911.9717762275, 520226.328942433 7499730.461817173, 519637.3397090967 7499435.950325359, 519103.0915856651 7499079.938515901, 519142.37342451006 7498952.950562375, 519198.90885567555 7498812.449021301, 518804.2710189213 7498665.4398353575, 518466.13040320994 7498460.429988716, 518083.56025949726 7498211.439638004, 517576.33932652103 7497748.931734686, 517473.779419789 7497665.421633448, 516997.112233693 7498099.4291966865, 517461.8811086684 7498453.430531878, 517877.9401371055 7498746.941773088, 518342.97221727547 7499040.940498443, 518930.35734212684 7499358.950494657, 519006.42959692003 7499391.451385064, 518959.73934571334 7499542.451161012, 519321.9798674347 7499823.9479718935, 519713.5306122653 7500191.470446845, 520251.98120085674 7500460.470861681, 520790.4299846636 7500582.969375729, 521328.89903726405 7500656.4806792, 521600.9787950013 7500716.479862276, 522066.4407673655 7500347.9905595165, 522262.5892723424 7500072.482112171)), ((544626.1803077393 7509862.650901608, 544599.6914848969 7509307.151234082, 544520.3602272364 7508619.14910038, 544255.8195605794 7507878.650570881, 543753.3111433779 7507006.148530141, 543197.8599954516 7506291.651044439, 542748.2417293066 7505604.149364745, 542034.1492941775 7504704.651433502, 541293.5891299595 7504202.1505518425, 540447.2613627176 7503647.150411133, 539204.189948189 7503038.640902684, 538490.0402022891 7502853.640004457, 537934.598100105 7502959.149481947, 537458.5619110551 7503118.139599254, 536956.0390386477 7503170.639288427, 536770.9210307123 7502932.64054512, 536718.0086382702 7502615.629928695, 536718.0077891762 7502060.13852931, 536585.7404540353 7501557.629628016, 536215.4412918156 7501319.618713187, 535871.5983779838 7501240.119965034, 535289.7498613112 7501266.619812854, 534813.6585787236 7501213.618710101, 533649.9409386696 7501055.119656148, 532980.3023073664 7500984.598948223, 532914.7496984366 7501129.60123437, 532255.2395347834 7501090.091991021, 531190.5300996846 7501090.091032721, 530442.9822135061 7501135.069277219, 529763.3494318491 7501135.069384416, 529061.0896587145 7501044.568249466, 528449.4294216911 7500976.550271084, 528419.5086110234 7500966.560950048, 528302.3796234686 7501116.061090368, 528055.8005487525 7501423.059336569, 529283.5101245476 7501486.060903136, 529735.546288338 7501486.244186527, 530418.7091161757 7501486.4958821945, 531172.4107788386 7501486.738344409, 532463.8035782139 7501487.0675338805, 532622.2591007367 7501487.100418941, 532540.0099931683 7501632.111001113, 532856.6521893132 7501611.111205827, 533444.0185844316 7501684.610329261, 534325.1210312116 7501880.119671486, 534985.9214213598 7502076.121785872, 535646.811027526 7502516.630293993, 535891.5287010848 7502908.137486189, 536013.9019787532 7503250.6406890815, 536258.6794978298 7503520.1420490965, 536527.9085336014 7503593.649577202, 536992.9320167609 7503520.142260872, 537555.8628507385 7503544.648875479, 538020.880797314 7503667.152258195, 538755.1426198388 7503960.650235864, 539244.6298891233 7504132.1499195155, 540125.7701951619 7504572.649722667, 540762.0786962437 7504939.640102765, 541716.579055085 7505698.161702238, 541936.8897461828 7506065.650917606, 542157.188364097 7506530.648970222, 542426.4309210991 7507142.661000531, 542597.7511561977 7507729.650091417, 542622.2203807895 7508170.659347272, 542866.960801154 7508635.64761918, 543136.210824489 7508978.151689474, 543283.1098597427 7509198.147471319, 543356.4892538954 7509687.648783354, 543381.0214684247 7510324.1510351775, 543478.9103237179 7510911.660685738, 543599.5856918202 7511273.57407786, 546007.7160119219 7511273.57407786, 545684.0793415828 7510788.140244358, 545313.8003012887 7510444.152128339, 544864.1696989994 7510153.151318326, 544626.1803077393 7509862.650901608)), ((520790.3393039586 7509810.000191968, 519982.6783810983 7509614.489995858, 518912.7777273635 7509330.4692640845, 518067.74922614626 7509452.469257174, 517746.86032913945 7509496.468574394, 517524.0783686196 7509517.9606380295, 517412.839451653 7509467.451953103, 516923.33080682124 7509295.9608854, 516262.53936959297 7509100.438068526, 515748.5403486908 7509100.438181, 515687.31005864 7509097.518641549, 515687.31005864 7509757.969303892, 515762.9211224568 7509734.929779939, 516564.99999755877 7509955.440505572, 517947.0103511128 7510300.959039912, 518681.19015407236 7510473.4707800485, 519501.7705072275 7510646.489690395, 520343.9405266365 7510754.501726737, 521250.89725778217 7510927.007610097, 521963.5200886072 7511251.03011405, 522035.6417709113 7511273.57407786, 524455.0901109544 7511273.57407786, 523849.76068936964 7510813.548713037, 522846.2688184008 7510275.031419221, 521671.43902987737 7509957.0189364655, 520790.3393039586 7509810.000191968)))",A_HAd_kd,Hamersley_Group,None,FALSE,"Thinly bedded dolomite and dolomitic shale, with minor black chert, shale, banded iron formation and sandstone",FALSE,sedimentary carbonate,None,2504,2597,2 +10,Woongarra_Rhyolite,"POLYGON ((515727.4016738701 7507294.44228695, 516077.55998065916 7507374.940313898, 516567.64963589073 7507461.461209964, 516974.9890657959 7507529.450941888, 517617.6789375373 7507621.458239922, 517884.80923452356 7507626.459500684, 518845.8080052769 7507697.980592622, 519692.14143665205 7507777.478591884, 520459.1205355452 7507962.499755844, 521252.5692508576 7508095.008492359, 522046.0097162984 7508306.518230193, 522495.61959948245 7508412.019790693, 523447.75110291137 7508491.531642083, 524135.4115040663 7508571.050886159, 524796.6501091121 7508809.060238443, 525537.1616826141 7508888.560437961, 526304.1784057483 7509047.07942464, 527150.5723233982 7509258.600825904, 527891.1703374396 7509549.630575992, 528759.1812103037 7509752.148616942, 529408.9095765568 7509934.658954328, 530282.090520335 7510219.191589758, 531297.3295623484 7510503.211238948, 532292.2306205566 7510767.219354186, 533510.480061766 7511234.208642662, 533602.2020958705 7511273.57407786, 536629.9341059177 7511273.57407786, 537266.7208616388 7511153.202050386, 538322.4402496128 7510706.688930759, 538626.9991428351 7510523.679197967, 538972.1599029788 7509914.689756285, 539114.2378285888 7509528.6699069105, 539134.5507683798 7509041.669524262, 539012.7302670052 7508493.181885645, 538586.3296624002 7507965.169740124, 538180.2115608531 7507599.671520811, 537631.9808313145 7507214.168417105, 537428.9305590896 7507011.171658462, 537002.5204438849 7506686.161332644, 536616.7715214416 7506544.1692010965, 535743.6882477176 7506361.1594366, 534931.5578075495 7506158.158888093, 534038.179586407 7505813.147930646, 533489.9179332453 7505488.139462488, 533022.901014481 7505082.130395377, 532495.0114416644 7504737.120717508, 531906.171165955 7504513.61882106, 530728.5093100072 7504046.609459706, 530456.1413454224 7503904.6091479305, 530330.938629704 7504034.600131254, 529716.559640727 7503911.60101499, 529213.5023450628 7503780.58191013, 528797.9000049669 7503627.080213759, 527507.3776305515 7503343.059446624, 526960.5505161036 7503255.548426319, 526610.599389693 7503255.540216237, 526129.4297748083 7503146.049718277, 525298.2094937422 7503146.041082706, 524313.9806665231 7502993.020090313, 522979.72967354686 7502796.0099626435, 521973.58024351613 7502730.490436181, 520967.45085503306 7502533.480759755, 519573.7976121586 7502354.695541283, 518734.5411795068 7502246.968182836, 518147.1409852186 7502100.460410408, 517439.4522652144 7501894.939140918, 517626.97828778083 7501568.438148484, 517493.2803822524 7501530.9397668075, 517041.529127982 7501482.43885285, 516806.13917544344 7501470.929028626, 516513.43983924395 7501427.9292805875, 516208.0296223537 7501404.4304796625, 515687.31005864 7501381.228581716, 515687.31005864 7501854.524165708, 515739.5490648174 7501845.930023763, 516241.7603391522 7501804.9294619, 516636.0783435459 7501815.939950414, 517068.9677902753 7501902.438979194, 517381.0303675341 7501996.450458597, 516985.4093417867 7502432.939720497, 516863.057892551 7502589.942326081, 517080.5991710863 7502644.356281735, 517652.7008891681 7502787.440623052, 518363.34063700767 7502949.957825634, 518992.72030422825 7503112.471846308, 519500.3501477047 7503193.482631056, 520271.90028074256 7503274.979760984, 520982.5192159618 7503437.480494792, 521754.82893368974 7503561.499102821, 522673.50812505255 7503780.507541341, 523439.03043066466 7503868.018290106, 525079.5116741647 7504086.528897766, 526041.911488045 7504086.540897081, 527157.4277337838 7504239.557840437, 528710.4300827074 7504589.578082755, 529322.8810412188 7504699.101350132, 529519.7383159703 7504721.101395365, 529782.1897067534 7504852.111618344, 529846.5792647229 7505018.110530231, 530434.1504480846 7505322.119503924, 531001.4219496874 7505585.119388457, 531730.7807765736 7505767.629514587, 531892.8382770831 7505828.631136723, 532231.0984191688 7506036.130344378, 532535.6622749837 7506280.128463482, 533205.6884558678 7506665.639726128, 533571.2115816264 7506929.6612274945, 534139.7121901498 7507214.159917029, 534444.310595638 7507356.160217548, 534769.1609872838 7507478.167769906, 534911.2916754175 7507518.6696750615, 535114.3212854977 7507640.660738995, 535236.1208061283 7507823.1785499025, 535358.0217514716 7508351.180761108, 535520.5093329677 7508594.687963869, 535743.8194368999 7508818.178339167, 536007.7499623377 7508980.6794774365, 536576.2579947866 7509386.678368123, 536718.4177284883 7509630.190658225, 536637.2394275275 7509975.691391321, 536393.6089245887 7510158.201416498, 536028.1312395525 7510219.199188102, 535540.80903133 7510219.199873121, 534627.2018242583 7510239.69044112, 534200.7423490481 7510219.191578516, 533875.9285406307 7510158.20165744, 533307.4205498956 7509955.199741203, 532718.6210473053 7509792.699682726, 531297.2519883884 7509264.678162582, 530525.7001818055 7509021.159533253, 529551.0197801124 7508858.651383413, 528251.4977760621 7508655.620795703, 527134.7110856865 7508351.0991825005, 525794.5900796568 7508066.557996191, 524596.6507077189 7507782.540694546, 523662.6590976772 7507681.038180801, 522830.179916455 7507498.029714879, 522038.3083402148 7507295.018886253, 520677.94825699006 7507010.99908201, 519662.7397499528 7506929.487592224, 518548.6599812934 7506807.981043728, 518147.5506430069 7506708.468301451, 517281.4186902522 7506445.959485294, 516873.7407970939 7506307.961476462, 516466.3690544315 7506220.949263664, 515906.28962533496 7506134.938835809, 515687.31005864 7506092.9797914745, 515687.31005864 7507284.364434812, 515727.4016738701 7507294.44228695))",P__HAw_fr,Hamersley_Group,None,FALSE,"Rhyolite, rhyodacite, rhyolitic breccia, and banded iron-formation; metamorphosed",FALSE,igneous felsic volcanic,None,2445,2449,6 diff --git a/packages/map2loop/tests/sampler/test_SamplerSpacing.py b/packages/map2loop/tests/sampler/test_SamplerSpacing.py new file mode 100644 index 000000000..017f24670 --- /dev/null +++ b/packages/map2loop/tests/sampler/test_SamplerSpacing.py @@ -0,0 +1,87 @@ +import pandas +from map2loop.sampler import SamplerSpacing +from beartype.roar import BeartypeCallHintParamViolation +import pytest +import shapely +import geopandas +import numpy + +# add test for SamplerSpacing specifically + + +@pytest.fixture +def sampler_spacing(): + return SamplerSpacing(spacing=1.0) + + +@pytest.fixture +def correct_geodata(): + data = { + 'geometry': [ + shapely.geometry.LineString([(0, 0), (1, 1), (2, 2)]), + shapely.geometry.Polygon([(0, 0), (1, 1), (1, 0), (0, 0)]), + shapely.geometry.MultiLineString( + [shapely.geometry.LineString([(0, 0), (1, 1)]), shapely.geometry.LineString([(2, 2), (3, 3)])] + ), + ], + 'ID': ['1', '2', '3'], + } + return geopandas.GeoDataFrame(data, geometry='geometry') + + +@pytest.fixture +def incorrect_geodata(): + data = {'geometry': [shapely.geometry.Point(0, 0), "Not a geometry"], 'ID': ['1', '2']} + return pandas.DataFrame(data) + + +# test if correct outputs are generated from the right input +def test_sample_function_correct_data(sampler_spacing, correct_geodata): + result = sampler_spacing.sample(correct_geodata) + assert isinstance(result, pandas.DataFrame) + assert 'X' in result.columns + assert 'Y' in result.columns + assert 'featureId' in result.columns + + +# add test for incorrect inputs - does it raise a BeartypeCallHintParamViolation error? +def test_sample_function_incorrect_data(sampler_spacing, incorrect_geodata): + with pytest.raises(BeartypeCallHintParamViolation): + sampler_spacing.sample(spatial_data=incorrect_geodata) + + +# for a specific >2 case +def test_sample_function_target_less_than_or_equal_to_2(): + sampler_spacing = SamplerSpacing(spacing=1.0) + data = { + 'geometry': [shapely.geometry.LineString([(0, 0), (0, 1)]), shapely.geometry.LineString([(0, 0), (1, 0)])], + 'ID': ['1', '2'], + } + gdf = geopandas.GeoDataFrame(data, geometry='geometry') + result = sampler_spacing.sample(spatial_data=gdf) + assert len(result) == 0 # No points should be sampled from the linestring + + +# Test if the extracted points are correct +def test_sample_function_extracted_points(sampler_spacing, correct_geodata): + + result = sampler_spacing.sample(correct_geodata) + + expected_points = [ + (0.0, 0.0), + (0.707107, 0.707107), + (0.0, 0.0), + (0.707107, 0.707107), + (1.0, 0.414214), + (0.0, 0.0), + [2.0, 2.0], + ] + + sampled_points = list(zip(result['X'], result['Y'])) + + distances = [ + shapely.geometry.Point(xy).distance(shapely.geometry.Point(ex)) + for xy, ex in zip(sampled_points, expected_points) + ] + + assert numpy.absolute(distances).all() == 0.0 diff --git a/packages/map2loop/tests/sampler/test_SamplerSpacing_featureId.py b/packages/map2loop/tests/sampler/test_SamplerSpacing_featureId.py new file mode 100644 index 000000000..4ce1cbb98 --- /dev/null +++ b/packages/map2loop/tests/sampler/test_SamplerSpacing_featureId.py @@ -0,0 +1,58 @@ +from pathlib import Path + +import pandas +from map2loop.sampler import SamplerSpacing +import shapely +import geopandas + +geology_original = pandas.read_csv(Path(__file__).parent / "geo_test.csv") +geology_original['geometry'] = geology_original['geometry'].apply(shapely.wkt.loads) +geology_original = geopandas.GeoDataFrame(geology_original, crs='epsg:7854') + +sampler_space = 700.0 + +sampler = SamplerSpacing(spacing=sampler_space) +geology_samples = sampler.sample(geology_original) + + +# the actual test: +def test_featureId(): + for _, poly in geology_original.iterrows(): + # check if one polygon, only 0 in featureId + multipolygon = poly['geometry'] + corresponding_rows = geology_samples[geology_samples['ID'] == poly['ID']] + + if poly['geometry'].geom_type == 'Polygon': + if poly.geometry.area < sampler_space: + continue + # check if zero featureId + assert ( + corresponding_rows['featureId'].unique() == '0' + ), "Polygon with featureId 0 is not sampled." + + # check if in the right place + for _, sample in corresponding_rows.iterrows(): + point = shapely.geometry.Point(sample['X'], sample['Y']).buffer(1) + assert point.intersects( + poly.geometry + ), f"Point from featureId 0 is not in the correct polygon segment of ID {poly['ID']}." + + if poly['geometry'].geom_type == 'MultiPolygon': + if any(geom.area < sampler_space for geom in multipolygon.geoms): + continue # skip tiny little polys + + # # is the number of segs the same as the geology polygon? + assert len(multipolygon.geoms) == len( + corresponding_rows.featureId.unique() + ), "Mismatch in the number of geo_polygons and featureId" + + for i, polygon in enumerate(poly.geometry.geoms): + polygon_samples = corresponding_rows[corresponding_rows['featureId'] == str(i)] + print(polygon_samples) + for _, sample in polygon_samples.iterrows(): + point = shapely.geometry.Point(sample['X'], sample['Y']).buffer( + 1 + ) # buffer just to make sure + assert point.intersects( + polygon + ), f"Point from featureId {i} is not in the correct polygon segment of ID {poly['ID']}." diff --git a/packages/map2loop/tests/test_import.py b/packages/map2loop/tests/test_import.py new file mode 100644 index 000000000..be06c9e72 --- /dev/null +++ b/packages/map2loop/tests/test_import.py @@ -0,0 +1,10 @@ +import pytest + + +def test_import_map2loop(): + try: + import map2loop + + map2loop.__version__ + except ImportError: + pytest.fail("Failed to import map2loop module") diff --git a/packages/map2loop/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/packages/map2loop/tests/thickness/InterpolatedStructure/test_interpolated_structure.py new file mode 100644 index 000000000..bbda4e35c --- /dev/null +++ b/packages/map2loop/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -0,0 +1,1737 @@ +import pandas +import geopandas +import numpy + +from map2loop.mapdata import MapData +from map2loop.thickness_calculator import InterpolatedStructure +from map2loop.utils.load_map2loop_data import ( + load_hamersley_geology, + load_hamersley_dtm, +) +from map2loop.m2l_enums import Datatype + +########################################################################## +### Define the test data for ThicknessCalculator InterpolatedStructure ### +########################################################################## + +# Sample stratigraphic units data +st_units = pandas.DataFrame( + { + 'Unnamed: 0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'layerId': [7, 0, 10, 8, 1, 5, 9, 4, 3, 2, 6], + 'name': [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + ], + 'minAge': [0.0] * 11, + 'maxAge': [100000.0] * 11, + 'group': [None] * 11, + 'supergroup': [None] * 11, + 'ThicknessMean_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessMedian_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessStdDev_ThicknessCalculatorAlpha': [0.0] * 11, + 'stratigraphic_Order': list(range(11)), + 'colour': [ + '#5d7e60', + '#387866', + '#628304', + '#a2f290', + '#0c2562', + '#5fb3c5', + '#f48b70', + '#1932e2', + '#106e8a', + '#d0d47c', + '#e7f2f3', + ], + } +) + +st_column = [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + 'Fortescue_Group', +] + +# 3. map_data.basal_contacts +basal_c = [ + {'ID': 0, 'basal_unit': 'Turee_Creek_Group', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Boolgeeda_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Brockman_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Weeli_Wolli_Formation', 'type': 'BASAL'}, + {'ID': 4, 'basal_unit': 'Jeerinah_Formation', 'type': 'BASAL'}, + {'ID': 5, 'basal_unit': 'Bunjinah_Formation', 'type': 'BASAL'}, + {'ID': 6, 'basal_unit': 'Marra_Mamba_Iron_Formation', 'type': 'BASAL'}, + {'ID': 7, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 8, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 9, 'basal_unit': 'Wittenoom_Formation', 'type': 'BASAL'}, + {'ID': 10, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'BASAL'}, + {'ID': 11, 'basal_unit': 'Woongarra_Rhyolite', 'type': 'BASAL'}, +] +bc_geoms = geopandas.GeoSeries.from_wkt( + [ + 'MULTILINESTRING ((520000.0000000000000000 7506463.0589317083358765, 520000.0000000000000000 7506464.0583261400461197, 521798.5784270099829882 7506667.5086746597662568, 524292.0583883899962530 7507105.0368000296875834, 525888.7772752699675038 7507345.5593877695500851, 526916.8410634599858895 7507564.5817003501579165, 528098.0088455299846828 7507783.0997126800939441, 529344.8316910399589688 7507958.1297348998486996, 530263.5311044099507853 7508220.6498684398829937, 531357.2706492099678144 7508395.6678343201056123, 532013.4010351699544117 7508548.6697535198181868, 532538.3520777500234544 7508548.6775182196870446, 532932.1086069300072268 7508483.1717491699382663, 533085.1519033299991861 7508308.1688938299193978, 533107.0194513100432232 7508045.6694244500249624, 533041.4099823100259528 7507717.6704597100615501, 532866.4200693099992350 7507455.1614942299202085, 531685.2195994600187987 7506755.1383216800168157, 530875.8998375800438225 7506317.6329081403091550, 530175.9800506900064647 7506011.6195486104115844, 529279.1401694599771872 7505442.5995908901095390, 528426.1115621499484405 7505027.0810785600915551, 526654.3696992900222540 7504655.0613197097554803, 525210.7310010100482032 7504567.5296983895823359, 523067.1991962700267322 7504217.5111659299582243, 521098.6489177999901585 7503867.9904129095375538, 520414.0195790100260638 7503782.4897812502458692, 520000.0000000000000000 7503710.2290291301906109, 520000.0000000000000000 7503711.2441460378468037))', + 'MULTILINESTRING ((520000.0000000000000000 7503245.2598590906709433, 520000.0000000000000000 7503246.2595371659845114, 520271.9002807399956509 7503274.9797609802335501, 520982.5192159600555897 7503437.4804947897791862, 521754.8289336899761111 7503561.4991028197109699, 522673.5081250499933958 7503780.5075413398444653, 523439.0304306600592099 7503868.0182901099324226, 525079.5116741600213572 7504086.5288977697491646, 526041.9114880500128493 7504086.5408970797434449, 527157.4277337800012901 7504239.5578404404222965, 528710.4300827099941671 7504589.5780827598646283, 529322.8810412200400606 7504699.1013501295819879, 529519.7383159700548276 7504721.1013953704386950, 529782.1897067499812692 7504852.1116183400154114, 529846.5792647199705243 7505018.1105302302166820, 530434.1504480800358579 7505322.1195039302110672, 531001.4219496899750084 7505585.1193884601816535, 531730.7807765699690208 7505767.6295145899057388, 531892.8382770799798891 7505828.6311367200687528, 532231.0984191700117663 7506036.1303443796932697, 532535.6622749799862504 7506280.1284634796902537, 533205.6884558700257912 7506665.6397261302918196, 533571.2115816300502047 7506929.6612275000661612, 534139.7121901500504464 7507214.1599170295521617, 534444.3105956399813294 7507356.1602175496518612, 534769.1609872799599543 7507478.1677699098363519, 534911.2916754200123250 7507518.6696750596165657, 535114.3212854999583215 7507640.6607389999553561, 535236.1208061299985275 7507823.1785498997196555, 535358.0217514700489119 7508351.1807611100375652, 535520.5093329700175673 7508594.6879638703539968, 535743.8194368999684229 7508818.1783391702920198, 536007.7499623399926350 7508980.6794774401932955, 536576.2579947899794206 7509386.6783681297674775, 536718.4177284899633378 7509630.1906582303345203, 536637.2394275299739093 7509975.6913913199678063, 536604.7901494553079829 7510000.0000000000000000, 536606.4580603817012161 7510000.0000000000000000), (533429.9102329264860600 7510000.0000000000000000, 533432.8839227686403319 7510000.0000000000000000, 533307.4205499000381678 7509955.1997412098571658, 532718.6210473099490628 7509792.6996827302500606, 531297.2519883899949491 7509264.6781625803560019, 530525.7001818099524826 7509021.1595332501456141, 529551.0197801099857315 7508858.6513834102079272, 528251.4977760600158945 7508655.6207956997677684, 527134.7110856899525970 7508351.0991824995726347, 525794.5900796599453315 7508066.5579961901530623, 524596.6507077199639753 7507782.5406945496797562, 523662.6590976800071076 7507681.0381808001548052, 522830.1799164600088261 7507498.0297148795798421, 522038.3083402099437080 7507295.0188862504437566, 520677.9482569899992086 7507010.9990820102393627, 520000.0000000000000000 7506956.5663501676172018, 520000.0000000000000000 7506957.5695682624354959), (550000.0000000000000000 7490095.5414067916572094, 550000.0000000000000000 7490094.5419130371883512, 549848.4078108200337738 7490011.2184614501893520, 549837.1990841374499723 7490000.0000000000000000, 549836.1991053668316454 7490000.0000000000000000))', + 'MULTILINESTRING ((520000.0000000000000000 7500803.4896762184798717, 520000.0000000000000000 7500804.4889609171077609, 520473.5791580000077374 7500907.4720744201913476, 521144.7272773912409320 7501014.1576358489692211, 521145.5101736339274794 7501013.5373818902298808), (523032.4352534925565124 7510000.0000000000000000, 523034.2386217917664908 7510000.0000000000000000, 522935.2510594900231808 7509934.0400712601840496, 521858.9592969599762000 7509706.5850364100188017, 521402.0897869099862874 7509610.0089996904134750, 520906.0067273600143380 7509526.0576650602743030, 520005.1707852099789307 7509373.5673304200172424, 520000.0000000000000000 7509372.6918550245463848, 520000.0000000000000000 7509373.7060850486159325), (521279.9150416324264370 7501034.6344962781295180, 521278.8505533785792068 7501035.4778430974110961, 521543.4397763700108044 7501077.5368893602862954, 522373.8810591999790631 7501209.4896944900974631, 523030.4162207188783213 7501391.7815449377521873, 523031.2068098201416433 7501391.1711508315056562), (527953.2198819570476189 7501611.1241540247574449, 527952.4394709372427315 7501611.9876126917079091, 527953.2198819570476189 7501611.1241540247574449, 528269.5491108499700204 7501675.5494663203135133, 528644.5797393700340763 7501769.5606017401441932, 529113.4114604999776930 7501800.5704611297696829, 529800.9698748099617660 7501832.0698146400973201, 530707.2799876299686730 7501832.0906658703461289, 531832.3692170899594203 7502050.6015144297853112, 532080.1110293077072129 7502146.1749884476885200, 532080.7953341902466491 7502145.4462257148697972), (532471.3224294331157580 7501854.8021797873079777, 532470.6117427451536059 7501856.0567162586376071, 532551.2005992300109938 7501832.0981646096333861, 533020.0292473699664697 7501925.6022116597741842, 533613.8304010899737477 7502019.6212948998436332, 534488.9388966499827802 7502207.1201175795868039, 534926.4299064800143242 7502457.1309860097244382, 535239.0000169699778780 7502707.1384293204173446, 535551.5432611800497398 7503144.6412358498200774, 535676.5302752000279725 7503519.6384271895512938, 535926.5516183800064027 7503894.6519359098747373, 536270.3683300199918449 7504082.1422335496172309, 536676.5897916300455108 7504113.6475562499836087, 536989.1799710299819708 7504051.1521394196897745, 537895.5108797400025651 7503957.1480598496273160, 538364.2599795899586752 7504113.6601144503802061, 539051.8112280699424446 7504394.6494075302034616, 539676.8889227600302547 7504613.6505787996575236, 540145.7008413899457082 7504988.6477605598047376, 540770.7923636999912560 7505332.1517110802233219, 541145.7601316999644041 7505676.1485500596463680, 541614.6014505899511278 7506144.6516708899289370, 541895.8687167000025511 7506645.1619760403409600, 542083.3585663399426267 7507145.1590369800105691, 542208.3892406800296158 7507707.6589486598968506, 542145.9084491999819875 7508332.6592682404443622, 542239.6581270300084725 7508645.1607529902830720, 542458.4708741100039333 7508957.6600440395995975, 542677.2416874299524352 7509082.6624572100117803, 542864.7195600100094453 7509239.1611510002985597, 542927.2699991799890995 7509989.1508510801941156, 542927.2698631049133837 7510000.0000000000000000, 542928.2698600001167506 7510000.0000000000000000), (542679.7431424340466037 7490560.7071135109290481, 542680.4317333664512262 7490559.9283441118896008, 542592.3105463000247255 7490517.6513492902740836, 542387.8711325100157410 7490321.1590552795678377, 542278.4307441100245342 7490048.1597586404532194, 542272.8549225005554035 7490000.0000000000000000, 542271.8556170752272010 7490000.0000000000000000), (544273.9324713232927024 7491662.8551605539396405, 544274.6237809687154368 7491662.1230727611109614, 544238.3782646199688315 7491635.1603938303887844, 544135.6185495100216940 7491432.1611171104013920, 543918.3223162599606439 7491197.6698569804430008, 543420.6783191299764439 7490869.6585929403081536, 543038.3205035700229928 7490699.6702497899532318, 542815.3584537300048396 7490624.6607478400692344, 542773.7009090904612094 7490604.6751364599913359, 542773.0674823645967990 7490605.4474027175456285), (550000.0000000000000000 7492637.9491975577548146, 550000.0000000000000000 7492636.9501683469861746, 549769.4085893699666485 7492521.7100056502968073, 549501.4603817999595776 7492462.1984654497355223, 549174.0184454700211063 7492372.7009732704609632, 548668.0100578600540757 7492343.2083122497424483, 547774.9591860000509769 7492343.1903728395700455, 547358.2082652900135145 7492402.6892563700675964, 546971.2795143900439143 7492432.1799347596243024, 546524.7789019900374115 7492402.6676745600998402, 546018.6897931500570849 7492283.6581326704472303, 545304.2811550099868327 7491926.1592656997963786, 545036.3909502900205553 7491777.1605294896289706, 544828.0104751100298017 7491628.6593068800866604, 544708.9605470900423825 7491509.6700969301164150, 544618.5316022647311911 7491404.1884233895689249, 544617.8842772342031822 7491404.9697802281007171))', + 'MULTILINESTRING ((520293.4320175029570237 7501708.4171284157782793, 520293.4981995084672235 7501707.4205201249569654, 520000.0000000000000000 7501674.5829317998141050, 520000.0000000000000000 7501675.5891712857410312), (520000.0000000000000000 7508845.7206690181046724, 520000.0000000000000000 7508846.7200987627729774, 520052.9280038099968806 7508862.0008838102221489, 521090.5512352299992926 7509073.0105239599943161, 522005.9512440299731679 7508998.0294947298243642, 522324.3404851399827749 7509085.0209561996161938, 522451.5710224300273694 7509097.0301381601020694, 522591.6214781600283459 7509122.0274216998368502, 524151.1692813800182194 7509438.0516055300831795, 524456.6897462300257757 7509487.5595593899488449, 525140.4391166700515896 7509496.5704689295962453, 526119.0513356799492612 7509602.5791763495653868, 527124.1199973500333726 7509920.1001460999250412, 527347.8288250340847299 7510000.0000000000000000, 527348.8276206540176645 7510000.0000000000000000), (522351.1343196252128109 7501916.1655494002625346, 522352.2528255800134502 7501915.3037830777466297, 521104.1391963799833320 7501751.4809457501396537, 520737.7721352900261991 7501723.9786810996010900, 520420.9591136300005019 7501715.1471717469394207, 520420.1756578796193935 7501715.7678689807653427), (527125.4548547224840149 7502377.7747816061601043, 527126.3209163650171831 7502376.8168430794030428, 526700.8509709000354633 7502355.5393781904131174, 525246.2184770300518721 7502408.5209231497719884, 524294.1117317799944431 7502249.5209683403372765, 523447.7796929900068790 7502091.0098048197105527, 522583.0080486031947657 7501863.5510688340291381, 522582.2173395422287285 7501864.1615555742755532), (530798.8710058355936781 7503475.2625857004895806, 530799.6446038441499695 7503474.4564733263105154, 530292.3180354699725285 7503316.0992012796923518, 529603.4816261499654502 7503154.0790386795997620, 529076.7311885600211099 7502911.0787954898551106, 528266.3094259300269186 7502728.5696691796183586, 527759.8099331599660218 7502688.0595766501501203, 527233.1392903799423948 7502607.0608489904552698, 527065.4771157877985388 7502593.2268756395205855, 527064.8072133261011913 7502593.9678452722728252), (539955.9743753559887409 7510000.0000000000000000, 539956.9738961729453877 7510000.0000000000000000, 540057.3710624600062147 7509681.6689012898132205, 540295.3694572099484503 7509391.1672181095927954, 540480.4705794400069863 7509232.1700646700337529, 540612.7384639199590310 7509073.6586520997807384, 540665.5814983600284904 7508571.1700814096257091, 540348.2114157699979842 7507671.6596398204565048, 539925.0498745300574228 7507090.1577369300648570, 539607.6706715000327677 7506746.1599598200991750, 539052.2007989300182089 7506296.6606875201687217, 538205.9094809900270775 7505952.6699313903227448, 537068.6509273999836296 7505741.1603932101279497, 536169.3901651899795979 7505661.6614198600873351, 535217.2919880599947646 7505503.1506273699924350, 534635.4301719899522141 7505317.6512130200862885, 534027.0999437200371176 7504974.1400412498041987, 533603.8817716699559242 7504709.6272615399211645, 533233.6514340500580147 7504312.6317273303866386, 532466.6187711399979889 7503969.1208717301487923, 531858.3409144999459386 7503651.6198519701138139, 531329.3389675599755719 7503360.6116438498720527, 531139.0552856920985505 7503265.5203097239136696, 531138.3627150403335690 7503266.2411932516843081), (546233.0059536607004702 7490000.0000000000000000, 546232.0059536602348089 7490000.0000000000000000, 546232.0095286100404337 7490128.6799554601311684, 546425.2915191700449213 7490406.1914659300819039, 546769.6909271699842066 7490574.1895378697663546, 547082.8998588599497452 7490707.6977680595591664, 547486.2694205499719828 7490854.1999811800196767, 548366.2786710499785841 7491037.7003361200913787, 548806.2997251900378615 7491074.2083575604483485, 549612.9294149799970910 7491257.7084028301760554, 550000.0000000000000000 7491301.9012328926473856, 550000.0000000000000000 7491300.8947363123297691))', + 'MULTILINESTRING ((520000.0000000000000000 7496937.7387266764417291, 520000.0000000000000000 7496940.1299340603873134, 520002.3885029399534687 7496934.9419469097629189, 520209.1083645300241187 7496271.9499225998297334, 520062.0993496900191531 7496119.9397722100839019, 520000.0000000000000000 7496068.6646597366780043, 520000.0000000000000000 7496069.9614912457764149), (523381.4890356060350314 7498414.2473349031060934, 523382.0906666574883275 7498413.4010553266853094, 523169.7519518999615684 7498336.9916863301768899, 523067.8999133500619791 7498311.9897804697975516, 522895.7909434399916790 7498236.4781237496063113, 522615.2015952100045979 7498072.4703307598829269, 521882.6812058400246315 7497821.9590960601344705, 521526.3299231799901463 7497779.4584824498742819, 521208.3405302499886602 7497768.4611136997118592, 520979.3200964700081386 7497743.9708666298538446, 520246.9187887199805118 7497531.9419434396550059, 520000.0000000000000000 7497468.9978941539302468, 520000.0000000000000000 7497470.0298743853345513), (525280.9678179419133812 7499008.5035365633666515, 525281.4949324887711555 7499007.5775622371584177, 525203.0376252799760550 7498994.5084805004298687, 524869.2387656100327149 7498918.5108462898060679, 524080.2303868400631472 7498843.0101468600332737, 523609.8704664499964565 7498706.4891386404633522, 523343.3935284681501798 7498640.4214922022074461, 523342.8145249948720448 7498641.2359428005293012), (534272.9718145289225504 7499007.8629990173503757, 534273.7464286693139002 7499006.7735539842396975, 533821.5094927400350571 7499055.6005880599841475, 533411.8113768999464810 7499131.0899759698659182, 532789.7513422400224954 7499313.0907301902770996, 532046.2501181999687105 7499359.0887924302369356, 531560.6700862100115046 7499404.5924122100695968, 531257.2500160000054166 7499404.5794073604047298, 530968.9126983700552955 7499419.5698141297325492, 530650.2800068800570443 7499495.5805069999769330, 530361.9716437599854544 7499601.5801136298105121, 530210.2997778200078756 7499647.0707991197705269, 530073.7308944800170138 7499647.0701257800683379, 529891.5828257299726829 7499586.5608606198802590, 529755.0991281700553373 7499495.5807948503643274, 529648.8292915900237858 7499434.5578709095716476, 528920.5188349500531331 7499359.0610773200169206, 527979.7492919899523258 7499328.5417763004079461, 527312.1506295599974692 7499283.0298913996666670, 526705.1804492699448019 7499192.0412488700821996, 525809.9994778400287032 7499116.0194425499066710, 525476.2009420599788427 7499040.0108542302623391, 525386.5961969492491335 7499025.0848800987005234, 525386.1020599714247510 7499025.9529232168570161), (547423.9512601103633642 7510000.0000000000000000, 547425.9598791532916948 7510000.0000000000000000, 547270.3128660599468276 7509910.6501949401572347, 547123.4215484600281343 7509784.1305715003982186, 546931.6794150100322440 7509581.6403483096510172, 546815.5487570599652827 7509245.1501061804592609, 546813.4198143399553373 7508786.6386062400415540, 546793.0495528799947351 7508519.6417614798992872, 546760.1718947299523279 7508297.1516221202909946, 546630.1392768600489944 7507705.6514096902683377, 546603.1807938199490309 7507387.6502600098028779, 546506.4978075700346380 7507121.1480851704254746, 546347.0615013099741191 7507032.6372693302109838, 546098.2091887400019914 7506843.1486029401421547, 545931.3088385299779475 7506525.6525994800031185, 545783.2304036399582401 7506157.6511867698282003, 545590.6004368900321424 7505770.1490056701004505, 545302.2208498599939048 7505307.1615147199481726, 544943.5218329799827188 7504761.6597001496702433, 544725.5899502099491656 7504406.6611849600449204, 544501.3301299399463460 7504057.6593816699460149, 544123.7492673799861223 7503569.6505599301308393, 543753.3717356600100175 7503247.1585790300741792, 543357.1403491899836808 7502835.6512618502601981, 543024.9804781300481409 7502538.1512261899188161, 541869.5108813600381836 7501596.1483753900974989, 541378.0882920400472358 7501255.1483567599207163, 540868.3004191899672151 7501022.1397865395992994, 540434.9686214999528602 7500840.1404092302545905, 539886.7884534699842334 7500575.6385581698268652, 539472.3796638699714094 7500361.6388751100748777, 539128.0079635200090706 7500159.6402211003005505, 538782.9978578999871388 7499830.6288305800408125, 538476.5108094000024721 7499571.6312278602272272, 538240.7492773899575695 7499470.6311592804268003, 537903.1197484800359234 7499358.1302875401452184, 537565.7982155899517238 7499296.1290474496781826, 536808.4890007500071079 7499179.6114020701497793, 536356.4701961500104517 7499080.1195044601336122, 535866.5394221700262278 7499031.6102768797427416, 535319.4902977800229564 7498996.6221683695912361, 534772.7408331099431962 7499031.6016195202246308, 534285.8976723682135344 7499162.2542209504172206, 534285.3182902499102056 7499163.0690846843644977), (537098.9795529744587839 7490000.0000000000000000, 537097.9807571568526328 7490000.0000000000000000, 537082.7614457299932837 7490032.1078298501670361, 537064.9390341599937528 7490293.1209420198574662, 537085.1899132600519806 7490547.6190917901694775, 537118.4598460316192359 7490667.2163930963724852, 537119.4298784348648041 7490666.9776619225740433), (537417.0468347219284624 7490706.0521089499816298, 537416.5515447265934199 7490706.2860060287639499, 537416.1256071323296055 7490706.4396555135026574, 537487.4418410599464551 7490882.6095111798495054, 537654.0587315800366923 7491149.1116127697750926, 537858.8020591400563717 7491415.1179784098640084, 537992.9993732899893075 7491548.1193249300122261, 538056.9795873910188675 7491588.6379907196387649, 538057.9059167269151658 7491588.2641664957627654), (538156.4071117863059044 7491653.3615979626774788, 538155.5143074670340866 7491653.8223220268264413, 538299.8710431599756703 7491877.6190374298021197, 538434.6211939599597827 7492137.6200953898951411, 538652.5613591700093821 7492492.6281045097857714, 538768.5901984019437805 7492667.4812555732205510, 538769.1307524497387931 7492666.4872721917927265), (539076.4825414990773425 7492310.6365013578906655, 539076.0048737846082076 7492311.5148478839546442, 539256.6677916899789125 7492496.1301840599626303, 539703.5787173799471930 7492843.6307888999581337, 540053.9791185399517417 7492994.6384690301492810, 540455.2317104099784046 7493113.1314762597903609, 540786.5202559200115502 7493232.1414313204586506, 541041.4298104699701071 7493351.6418332597240806, 541239.2018903200514615 7493478.1304302699863911, 541332.9279536200920120 7493553.2876135194674134, 541333.7303589903749526 7493552.6927433693781495), (541996.2659877514233813 7493323.2507506581023335, 541995.3182718952884898 7493323.6649971948936582, 542500.6798850599443540 7493961.1386070298030972, 542743.6307616099948063 7494233.6408173600211740, 543082.0077898399904370 7494518.1417143298313022, 543356.1986791399540380 7494663.1389560597017407, 543789.2602507199626416 7494794.6498441295698285, 544139.2511316499439999 7494849.6397826299071312, 544641.6300744400359690 7494840.6485728900879622, 545175.3190517800394446 7494736.1496383799239993, 545741.0922157400054857 7494688.1493368400260806, 546307.7507409299723804 7494838.1492867600172758, 546786.0567151700379327 7495109.1620891699567437, 547188.0597629300318658 7495399.6700470102950931, 547621.6999697199789807 7495652.1683375202119350, 547965.6989555200561881 7495764.6696619400754571, 548207.3907420800533146 7495776.1700877603143454, 548481.1595977500546724 7495844.6798296095803380, 548863.0792892000172287 7495925.1790779400616884, 549506.2123941599857062 7496087.1879144096747041, 550000.0000000000000000 7496197.8834195006638765, 550000.0000000000000000 7496196.8585999859496951))', + 'MULTILINESTRING ((524266.0954626141465269 7490000.0000000000000000, 524264.0581623602192849 7490000.0000000000000000, 524274.6716975499875844 7490005.9794874498620629, 524580.9296716400422156 7490207.9900786597281694, 525263.6310803899541497 7490681.4799169795587659, 525633.8797883000224829 7490965.9987491900101304, 526080.4097873299615458 7491262.5022844001650810, 526392.7913924700114876 7491426.5083817597478628, 526680.5080642091343179 7491700.2571335136890411, 526680.9617382686119527 7491699.3084705946967006), (527736.6980700913118199 7490014.9772448325529695, 527736.3587646851083264 7490015.9580855472013354, 528010.6905607599765062 7490033.0087006296962500, 528554.6395948999561369 7490014.5194057403132319, 528659.0582184605300426 7490000.0000000000000000, 528651.7973667406477034 7490000.0000000000000000), (528242.3239959123311564 7492064.7222724705934525, 528241.7088020627852529 7492065.7254664935171604, 528666.1973901799647138 7492063.5307877697050571, 529212.3307416000170633 7491907.5399811398237944, 529719.6322913799667731 7491605.5284209195524454, 530163.0910896200221032 7491234.0305473301559687, 530511.5112620899453759 7490958.5415406301617622, 531453.6296071013202891 7490000.0000000000000000, 531452.2274564296239987 7490000.0000000000000000))', + 'MULTILINESTRING ((522423.1507045699981973 7499760.7176261981949210, 522423.9203800179529935 7499759.6364277126267552, 522349.8299966399208643 7499766.9809384401887655, 522165.4282854500343092 7499767.9805885404348373, 521783.7590640200069174 7499750.9782179798930883, 521446.5883731800131500 7499727.4790324503555894, 521058.2386758999782614 7499640.4595605703070760, 520701.5588286300189793 7499521.4718082202598453, 520204.5092078600428067 7499313.9601706201210618, 520000.0000000000000000 7499193.2638115361332893, 520000.0000000000000000 7499194.4249778995290399), (522555.9904544320888817 7499746.5444441922008991, 522555.4111143556656316 7499747.3582698311656713, 522555.9904544320888817 7499746.5444441922008991, 522960.0394677100121044 7499706.4914416698738933, 523297.1696609099744819 7499723.9880460202693939, 523539.3288009500829503 7499824.4885594900697470, 523807.0801918199867941 7499963.0007417099550366, 524452.2040554300183430 7500171.9706728672608733, 524451.4118937810417265 7500172.7652285397052765), (529030.4932832464110106 7500200.7058669319376349, 529031.2178299439838156 7500199.9257171414792538, 528991.0805857500527054 7500183.0489843999966979, 528679.6486600999487564 7500223.0495249899104238, 527986.5626644400181249 7500239.5480527197942138, 527668.6504820300033316 7500241.0489183496683836, 526409.2975434400141239 7500216.0304062804207206, 525849.7599196099909022 7500225.5205484097823501, 525373.0094749700510874 7500266.0211616195738316, 525080.3788815899752080 7500248.5201182495802641, 524717.1588156500365585 7500210.0084451204165816, 524719.1996265298221260 7500211.2304345155134797), (532993.0805511008948088 7500834.6403764961287379, 532993.3489576445426792 7500834.0452068466693163, 532993.5077827317873016 7500833.7281568944454193, 532828.7419588699704036 7500779.5898232003673911, 532059.2178660000208765 7500783.5925765298306942, 531715.7397694600513205 7500766.5896713202819228, 531009.3391590700484812 7500675.0807855604216456, 530322.5721776599530131 7500685.0713867703452706, 529769.5689500400330871 7500739.0687459995970130, 529089.1306385099887848 7500749.0586953703314066, 528660.8910052364226431 7500745.6074274424463511, 528660.2112883693771437 7500746.3392704948782921), (545728.9288492670748383 7510000.0000000000000000, 545730.2700878457399085 7510000.0000000000000000, 545584.7022705799899995 7509837.1403594203293324, 545386.0617979000089690 7509520.1391145400702953, 545238.0399551700102165 7509170.6511606499552727, 545122.0989813000196591 7508859.6512553403154016, 544986.9678246000548825 7508529.6407046103850007, 544743.6496689900523052 7508180.6489076800644398, 544659.9523990500019863 7507964.6498591499403119, 544499.4011402300093323 7507634.6525363801047206, 544320.0205451600486413 7507368.1501189004629850, 544044.8593324699904770 7507007.1477869795635343, 543852.7414086499484256 7506721.6492448104545474, 543666.6799941799836233 7506391.6518390402197838, 543486.6189286799635738 7505966.1496158502995968, 543177.9487287199590355 7505267.6511040404438972, 542851.5999981700442731 7504830.1483773496001959, 542628.1512679100269452 7504653.1477385796606541, 541996.4995115000056103 7504230.1516731502488256, 541486.3089837899897248 7503927.6487837303429842, 541052.4398514899658039 7503624.6398146301507950, 540714.5785347600467503 7503454.6588033195585012, 540331.7501426199451089 7503195.6492001600563526, 539885.0605549899628386 7502867.1490661101415753, 539534.2795183400157839 7502671.6515465499833226, 539088.3392634700285271 7502508.6507563600316644, 538115.0518896100111306 7502437.6390984999015927, 537790.3291457899613306 7502369.1493166498839855, 537573.5679509800393134 7502255.6492295796051621, 537394.9012426600093022 7502116.6387358000501990, 537330.5981657799566165 7501970.6416400596499443, 537323.5123430900275707 7501824.6311678895726800, 537322.0002546999603510 7501506.1379719302058220, 537263.7595541899790987 7501296.6407880699262023, 537039.8101914300350472 7501017.6294886004179716, 536612.6102296400349587 7500784.6198029303923249, 536218.0508771500317380 7500716.6298277098685503, 535734.4196069199824706 7500662.1207142304629087, 534972.0878904700512066 7500831.6092656701803207, 534616.1697530100354925 7500865.1187592102214694, 534266.3894202300580218 7500867.1096779303625226, 534081.7079486900474876 7500817.1092230295762420, 533864.9377766799880192 7500710.1096216002479196, 533501.7106121799442917 7500546.6094194203615189, 533336.0891072107478976 7500498.7944972664117813, 533335.5105264986632392 7500499.6086738053709269), (540652.7093492220155895 7490387.5987470783293247, 540651.8620166190667078 7490388.1283743241801858, 540716.9413671500515193 7490648.6385009195655584, 540890.1206744499504566 7490959.6384145403280854, 541069.2507452500285581 7491181.1377072203904390, 541209.8013249200303108 7491327.1401432603597641, 541318.3109204999636859 7491402.6507735904306173, 541522.3790933899581432 7491516.1502364799380302, 541726.1788735899608582 7491597.6481381803750992, 541866.3201340900268406 7491635.1395976599305868, 542152.3343121195212007 7491644.4789796750992537, 542152.5743099044775590 7491643.5087957028299570), (542310.5385527068283409 7491467.5166142378002405, 542310.2017283077584580 7491468.4781577382236719, 542387.0478783199796453 7491479.6506026098504663, 542508.2986270999535918 7491568.1487769903615117, 542623.6207645100075752 7491745.6495260195806623, 542707.3887829299783334 7491974.6494024097919464, 542804.3198439499828964 7492292.1578110801056027, 542874.8705274199601263 7492419.1503577204421163, 543015.3294375799596310 7492539.1386309601366520, 543157.3559995990945026 7492607.0648720515891910, 543158.2323379423469305 7492606.5854770792648196), (543285.3188949242467061 7492641.8684887290000916, 543284.1699949501780793 7492642.7301141498610377, 543785.6400337499799207 7492706.6602805098518729, 544142.1796537400223315 7492794.1595931304618716, 544346.3083736399421468 7492926.6612573396414518, 544550.7481039999984205 7493129.1590701797977090, 544793.1985071500530466 7493287.1483336500823498, 545098.8382594300201163 7493361.6606107000261545, 545620.5201594299869612 7493403.1614144695922732, 546046.6321061899652705 7493420.1597612500190735, 546440.8310840800404549 7493399.1707573700696230, 546822.0285851999651641 7493326.6682714400812984, 547241.4683955300133675 7493267.1695830002427101, 548296.9793255199911073 7493223.1783396899700165, 548710.8022534899646416 7493316.6910186298191547, 548978.0409311200492084 7493359.6988639002665877, 549474.6489930299576372 7493478.1999030597507954, 549870.0192977499682456 7493704.7011540196835995, 550000.0000000000000000 7493802.1282507702708244, 550000.0000000000000000 7493800.8785204347223043))', + 'MULTILINESTRING ((524718.0163713778601959 7500210.5219292528927326, 524717.1588156500365585 7500210.0084451204165816, 524574.9860907683614641 7500190.5280320746824145, 524574.2798689020564780 7500191.2344054849818349))', + 'MULTILINESTRING ((524193.8328189906897023 7500431.1064537204802036, 524194.6307847223361023 7500430.3067480474710464, 523397.8001402500085533 7500183.4910121802240610, 522854.1015355099807493 7500070.4906302299350500, 522324.1118496610433795 7500072.2749801976606250, 522323.5325372974039055 7500073.0887669073417783), (527905.8476731716655195 7501050.4671189449727535, 527908.1407460733316839 7501050.5568969398736954, 527430.0695936999982223 7500795.5491229798644781, 526591.8898101799422875 7500682.0311559904366732, 525549.8513239700114354 7500614.0300792902708054, 525164.7414901100564748 7500478.0103883901610970, 524717.1588156500365585 7500210.0084451204165816, 524716.1685345589648932 7500209.8727574581280351))', + 'MULTILINESTRING ((522198.7010203180252574 7500076.0088302092626691, 522199.4341642370563932 7500074.9790627742186189, 521744.1016206499771215 7500092.9814525097608566, 521177.7584161399863660 7500024.9713861504569650, 520656.7282556199934334 7499911.9717762302607298, 520226.3289424299728125 7499730.4618171695619822, 520000.0000000000000000 7499617.2908613989129663, 520000.0000000000000000 7499618.4089082013815641), (532860.9091847165254876 7501127.3776061432436109, 532861.3487732587382197 7501126.4021477382630110, 532255.2395347800338641 7501090.0919910203665495, 531190.5300996799487621 7501090.0910327201709151, 530442.9822135099675506 7501135.0692772204056382, 529763.3494318500161171 7501135.0693844202905893, 529061.0896587100578472 7501044.5682494696229696, 528473.1436554730171338 7500979.1873466055840254, 528472.5273607608396560 7500979.9734598090872169), (544737.4093717507785186 7510000.0000000000000000, 544738.7021026653237641 7510000.0000000000000000, 544626.1803077399963513 7509862.6509016100317240, 544599.6914848999585956 7509307.1512340800836682, 544520.3602272400166839 7508619.1491003800183535, 544255.8195605799555779 7507878.6505708796903491, 543753.3111433800077066 7507006.1485301395878196, 543197.8599954500095919 7506291.6510444404557347, 542748.2417293100152165 7505604.1493647499009967, 542034.1492941799806431 7504704.6514335004612803, 541293.5891299600480124 7504202.1505518397316337, 540447.2613627200480551 7503647.1504111299291253, 539204.1899481900036335 7503038.6409026896581054, 538490.0402022900525481 7502853.6400044597685337, 537934.5981001099571586 7502959.1494819503277540, 537458.5619110600091517 7503118.1395992599427700, 536956.0390386499930173 7503170.6392884301021695, 536770.9210307099856436 7502932.6405451204627752, 536718.0086382699664682 7502615.6299286996945739, 536718.0077891800319776 7502060.1385293100029230, 536585.7404540400020778 7501557.6296280203387141, 536215.4412918200250715 7501319.6187131898477674, 535871.5983779799425974 7501240.1199650401249528, 535289.7498613100033253 7501266.6198128499090672, 534813.6585787199437618 7501213.6187100997194648, 533649.9409386699553579 7501055.1196561502292752, 533032.6647448980947956 7500990.1133196894079447, 533032.2540093590505421 7500991.0240919245406985), (540991.6145223230123520 7490051.9104150431230664, 540990.9120639010798186 7490052.6205057417973876, 540994.1994521199958399 7490125.1404810203239322, 541020.3115120199508965 7490265.1499587204307318, 541071.8600603099912405 7490404.6513284202665091, 541225.5412088100565597 7490626.6515073096379638, 541378.8100700799841434 7490759.6511909803375602, 541621.1913036600453779 7490904.6496356101706624, 541850.5094163799658418 7490992.6486446103081107, 542117.9989447799744084 7491067.6498956503346562, 542339.6836309707723558 7491081.8338681170716882, 542340.0139575036009774 7491080.8908742861822248), (542448.3669101102277637 7491085.2667160956189036, 542447.8281487500062212 7491086.2563206022605300, 542645.9278556300560012 7491090.1496953703463078, 542881.8001631699735299 7491216.1593797197565436, 543022.5110186899546534 7491374.6574428202584386, 543093.4196471800096333 7491577.6600298201665282, 543100.6207402900326997 7491755.6605573296546936, 543146.0011632499517873 7491940.1524548903107643, 543242.2113231299445033 7492092.6493198703974485, 543420.5594578799791634 7492167.6605370296165347, 543736.0608669177163392 7492178.8340415228158236, 543736.8605833266628906 7492178.2342887129634619), (543994.7063397207530215 7492105.4846383240073919, 543993.9952419346664101 7492106.2410740470513701, 544164.7493750499561429 7492195.6611232999712229, 544311.5085405800491571 7492303.1592243798077106, 544713.1909174999454990 7492510.6592104202136397, 545414.1404617800144479 7492806.1695769801735878, 545739.0797240600222722 7492931.6574951196089387, 546146.6309219299582765 7493050.6718051703646779, 546566.3691623499616981 7493067.1693900702521205, 547017.7696958100423217 7493033.1687579201534390, 547411.5708465500501916 7492935.1810991801321507, 547824.2799819100182503 7492786.6796223297715187, 548154.3804447900038213 7492676.6903927102684975, 548555.1085242800181732 7492681.1924451002851129, 548956.0910621000220999 7492755.1982696000486612, 549427.3525090899784118 7492886.2018355997279286, 549924.2300843800185248 7493068.2112118601799011, 550000.0000000000000000 7493102.4734313925728202, 550000.0000000000000000 7493101.3759462386369705))', + 'MULTILINESTRING ((520000.0000000000000000 7500333.5864726584404707, 520000.0000000000000000 7500334.5854991283267736, 520251.9812008599983528 7500460.4708616798743606, 520790.4299846600042656 7500582.9693757295608521, 521328.8990372599801049 7500656.4806792000308633, 521537.9934471686137840 7500702.5902975173667073, 521538.7771375657757744 7500701.9694143859669566, 521537.9934471686137840 7500702.5902975173667073), (521826.3962308935006149 7510000.0000000000000000, 521830.2234692216152325 7510000.0000000000000000, 521671.4390298799844459 7509957.0189364701509476, 520790.3393039599759504 7509810.0001919697970152, 520000.0000000000000000 7509619.7119117267429829, 520000.0000000000000000 7509618.6830340670421720, 520000.0000000000000000 7509619.7119117267429829), (532600.3302651896374300 7501627.1083485167473555, 532599.7396073570707813 7501628.1497170943766832, 532856.6521893100580201 7501611.1112058302387595, 533444.0185844299849123 7501684.6103292601183057, 534325.1210312099428847 7501880.1196714900434017, 534985.9214213599916548 7502076.1217858698219061, 535646.8110275299986824 7502516.6302939895540476, 535891.5287010800093412 7502908.1374861896038055, 536013.9019787500146776 7503250.6406890796497464, 536258.6794978299876675 7503520.1420491002500057, 536527.9085336000425741 7503593.6495772004127502, 536992.9320167599944398 7503520.1422608699649572, 537555.8628507399698719 7503544.6488754795864224, 538020.8807973100338131 7503667.1522581996396184, 538755.1426198399858549 7503960.6502358699217439, 539244.6298891199985519 7504132.1499195201322436, 540125.7701951599447057 7504572.6497226702049375, 540762.0786962399724871 7504939.6401027701795101, 541716.5790550899691880 7505698.1617022398859262, 541936.8897461800370365 7506065.6509176101535559, 542157.1883640999440104 7506530.6489702202379704, 542426.4309210999635980 7507142.6610005302354693, 542597.7511561999563128 7507729.6500914199277759, 542622.2203807899495587 7508170.6593472696840763, 542866.9608011499512941 7508635.6476191803812981, 543136.2108244899427518 7508978.1516894698143005, 543283.1098597400123253 7509198.1474713198840618, 543356.4892539000138640 7509687.6487833503633738, 543368.5279655156191438 7510000.0000000000000000, 543369.5268157882383093 7510000.0000000000000000), (542475.7818017150275409 7490825.7722711022943258, 542476.2623097165487707 7490824.8896671906113625, 542121.6113261700375006 7490675.1504720998927951, 541942.0503731799544767 7490540.6584189096465707, 541762.5393725200556219 7490428.6507309796288610, 541605.5117328099440783 7490293.6494011301547289, 541560.6191276300232857 7490159.1616177195683122, 541538.0986778000369668 7490024.6489791097119451, 541545.8831280654994771 7490000.0000000000000000, 541544.8344431390287355 7490000.0000000000000000), (544083.8251957478933036 7491864.6897576972842216, 544084.5100616407580674 7491863.9622678663581610, 543916.8111612600041553 7491662.6594603899866343, 543467.9909774400293827 7491303.6579534802585840, 543288.5212596700293943 7491169.1625096900388598, 543041.6283885700395331 7491034.6487735398113728, 542929.4202479800442234 7490989.6511897603049874, 542705.0600305399857461 7490877.1614052504301071, 542571.8228042328264564 7490858.5011789817363024, 542571.3451686579501256 7490859.3785067796707153), (550000.0000000000000000 7492916.1826057024300098, 550000.0000000000000000 7492915.1826563579961658, 549683.9776767699513584 7492784.7010641396045685, 549457.1530677999835461 7492715.7030614195391536, 549167.8620524300495163 7492627.6976040797308087, 549044.6585097600473091 7492599.7510081203654408, 548674.1506595800165087 7492515.7009411500766873, 548609.5248929499648511 7492518.2924996195361018, 548113.1504889399511740 7492538.1886065695434809, 547800.5016407900257036 7492572.8691065600141883, 547379.9360571899451315 7492619.5098762298002839, 547103.3177899100119248 7492650.1804305203258991, 546676.9415344200097024 7492650.1683770902454853, 546362.8189851900096983 7492582.6708111502230167, 546048.6516915999818593 7492493.1693898700177670, 545734.4392289100214839 7492380.6604282101616263, 545353.0321352999890223 7492201.1703274799510837, 544926.6382374600507319 7492066.6692933803424239, 544724.7222984499530867 7491977.1600893298164010, 544410.5210711299441755 7491797.6681312201544642, 544324.8354344329563901 7491754.6016815919429064, 544324.1489822026342154 7491755.3286254471167922))', + 'MULTILINESTRING ((530271.9887491008266807 7504023.8181659672409296, 530272.8096558250254020 7504022.9626687979325652, 529716.5596407300326973 7503911.6010149903595448, 529213.5023450599983335 7503780.5819101296365261, 528797.9000049700262025 7503627.0802137600257993, 527507.3776305499486625 7503343.0594466198235750, 526960.5505161000182852 7503255.5484263198450208, 526610.5993896899744868 7503255.5402162401005626, 526129.4297748099779710 7503146.0497182803228498, 525298.2094937399961054 7503146.0410827100276947, 524313.9806665199575946 7502993.0200903099030256, 522979.7296735499985516 7502796.0099626500159502, 521973.5802435199730098 7502730.4904361795634031, 520967.4508550300379284 7502533.4807597603648901, 520000.0000000000000000 7502409.3710406739264727, 520000.0000000000000000 7502410.3792356532067060), (520000.0000000000000000 7507850.7456019073724747, 520000.0000000000000000 7507851.7444353895261884, 520459.1205355499987490 7507962.4997558500617743, 521252.5692508600186557 7508095.0084923598915339, 522046.0097163000609726 7508306.5182301895692945, 522495.6195994799491018 7508412.0197906903922558, 523447.7511029100278392 7508491.5316420802846551, 524135.4115040699834935 7508571.0508861597627401, 524796.6501091100508347 7508809.0602384395897388, 525537.1616826100507751 7508888.5604379596188664, 526304.1784057499608025 7509047.0794246401637793, 527150.5723233999451622 7509258.6008259104564786, 527891.1703374399803579 7509549.6305759903043509, 528759.1812102999538183 7509752.1486169397830963, 529408.9095765600213781 7509934.6589543297886848, 529609.4298291478771716 7510000.0000000000000000, 529610.4290333546232432 7510000.0000000000000000), (538922.8089907000539824 7510000.0000000000000000, 538923.8080818294547498 7510000.0000000000000000, 538972.1599029799690470 7509914.6897562900558114, 539114.2378285899758339 7509528.6699069095775485, 539134.5507683800533414 7509041.6695242598652840, 539012.7302670100471005 7508493.1818856503814459, 538586.3296623999485746 7507965.1697401199489832, 538180.2115608500316739 7507599.6715208096429706, 537631.9808313100365922 7507214.1684171101078391, 537428.9305590899894014 7507011.1716584600508213, 537002.5204438799992204 7506686.1613326398655772, 536616.7715214400086552 7506544.1692011002451181, 535743.6882477200124413 7506361.1594366002827883, 534931.5578075499506667 7506158.1588880904018879, 534038.1795864100567997 7505813.1479306500405073, 533489.9179332499625161 7505488.1394624896347523, 533022.9010144800413400 7505082.1303953798487782, 532495.0114416599972174 7504737.1207175096496940, 531906.1711659600259736 7504513.6188210602849722, 530728.5093100100057200 7504046.6094597103074193, 530502.3308432935737073 7503928.6902586026117206, 530501.6387504261219874 7503929.4114401936531067), (549037.6348608708940446 7490000.0000000000000000, 549036.4332247237907723 7490000.0000000000000000, 549043.9079029599670321 7490011.2185191400349140, 549204.8611184799810871 7490100.2200202103704214, 549687.5501057700021192 7490279.2203355301171541, 550000.0000000000000000 7490413.2414639443159103, 550000.0000000000000000 7490412.1533525427803397))', + ] +) +bc_gdf = geopandas.GeoDataFrame(basal_c, geometry=bc_geoms, crs='EPSG:28350') + +structures = pandas.DataFrame( + { + 'ID': [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], + 'DIPDIR': [190.0, 190.0, 0.0, 330.0, 165.0, 150.0, 180.0, 210.0, 240.0, 270.0, 300.0], + 'DIP': [55, 55, 15, 15, 0, 45, 30, 20, 10, 5, 50], + 'OVERTURNED': [False] * 11, + 'BEDDING': [False] * 11, + 'X': [ + 548279.320612, + 548249.155883, + 546137.857561, + 543754.180680, + 520512.912720, + 528512.912720, + 529512.912720, + 530512.912720, + 531512.912720, + 532512.912720, + 533512.912720, + ], + 'Y': [ + 7.493304e06, + 7.493512e06, + 7.494607e06, + 7.504599e06, + 7.497506e06, + 7.497806e06, + 7.498506e06, + 7.499506e06, + 7.500506e06, + 7.501506e06, + 7.502506e06, + ], + 'Z': [543.0, 543.0, 532.0, 559.0, 503.0, 553.0, 563.0, 573.0, 583.0, 593.0, 603.0], + 'layerID': [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2], + } +) + +# sampled contacts + +IDS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, +] +X = [ + 520000.0, + 520992.6699257682, + 521984.6869456721, + 522969.6388939231, + 523954.5908421741, + 524942.1013152138, + 525930.4850180566, + 526908.535657469, + 527891.805258285, + 528880.6323520339, + 529855.6352847969, + 530832.075832642, + 531813.1634102948, + 532804.1384816798, + 533019.2882480841, + 532243.2409444518, + 531376.1445685071, + 530480.68269627, + 529612.3980015446, + 528734.9447395488, + 527783.6457775467, + 526804.9871671252, + 525809.8226356399, + 524816.1487769039, + 523829.21986169985, + 522842.8215091018, + 521858.22077695775, + 520000.0, + 520979.22944531543, + 521963.40533887857, + 522941.7587850634, + 523934.147302897, + 524925.392627546, + 525924.0314485825, + 526915.8477737093, + 527895.0821625991, + 528872.0657047849, + 529800.4947308041, + 530625.584657682, + 531569.6370222451, + 532437.052847155, + 533287.2652070294, + 534152.4134851344, + 535068.2792519473, + 535460.6891555252, + 536224.4983751376, + 533429.9102329265, + 532481.4641957916, + 531544.0571021343, + 530594.6994174849, + 529610.6855646572, + 528622.769870241, + 527649.2613247755, + 526678.2236776681, + 525700.529526533, + 524727.502968803, + 523736.1966217523, + 522758.8160138651, + 521787.52440495713, + 520000.0, + 523032.43525349256, + 522075.0050621681, + 521094.2495766504, + 521279.9150416324, + 527953.219881957, + 528932.1661473936, + 529931.0489500397, + 530926.9444223469, + 532471.3224294331, + 533451.0808071761, + 534430.5181256596, + 535259.9903455864, + 535733.754706194, + 536530.414399986, + 537520.9367684029, + 538483.8842249501, + 539416.5488248907, + 540254.201848269, + 541073.3185078846, + 541731.634304068, + 542111.7328311033, + 542153.227246826, + 542648.3360907623, + 544273.9324713233, + 550000.0, + 549046.9473048343, + 548047.5904092644, + 547052.7023355255, + 546066.4155333972, + 520000.0, + 520977.906499162, + 521972.6466978357, + 522950.7862194081, + 523930.86647590954, + 524922.3632146807, + 525917.7966582401, + 522351.1343196252, + 527125.4548547225, + 526128.5235193562, + 525130.7081813341, + 524144.8882983563, + 530798.8710058356, + 529837.3189358161, + 528901.4390783398, + 539955.974375356, + 540509.7202600716, + 540554.4697958604, + 540124.5665895239, + 539457.7385073705, + 538609.0930945011, + 537650.6482494324, + 536662.2132646953, + 535670.9952466968, + 534702.7550180865, + 533831.4503084399, + 533061.3425394666, + 532157.7972663342, + 546233.0059536607, + 546906.7057886998, + 547857.5988940151, + 548844.1779325017, + 523381.48903560604, + 522468.0997263235, + 521503.9257619144, + 525280.9678179419, + 534272.9718145289, + 533289.726130804, + 532311.6002925185, + 531314.2350300908, + 530343.2573956609, + 529404.0267836585, + 528406.8877962828, + 527408.438540811, + 526416.4831948339, + 547423.9512601104, + 546818.8696391915, + 546751.8787156106, + 546564.3507434212, + 545942.2297277196, + 545512.8225309709, + 544971.65760404, + 544429.4936548981, + 543746.9451913793, + 543030.8690031096, + 542256.0397376382, + 541457.6565650662, + 540552.3950139998, + 539652.2355835018, + 538839.7378067289, + 537990.4340473542, + 537007.3752328141, + 536022.1700130996, + 537417.0468347219, + 538156.4071117863, + 539076.4825414991, + 539863.903717873, + 541996.2659877514, + 542624.1105710816, + 543421.4023585871, + 544400.4790130118, + 545389.5363446891, + 546360.828213827, + 547201.2564344314, + 548117.0745406685, + 524266.09546261415, + 525089.486889288, + 528242.3239959123, + 529217.7910440405, + 530038.4913963537, + 522423.15070457, + 521427.2884053698, + 522555.9904544321, + 529030.4932832464, + 528038.4263267842, + 527038.5688849417, + 526038.746341665, + 532993.0805511009, + 532003.260610268, + 531009.5137000929, + 530011.0692840518, + 545728.9288492671, + 545228.7527245631, + 544793.6165900896, + 544324.0658601674, + 543757.1054321213, + 543343.5919286992, + 542816.8120473484, + 541997.2329619491, + 541153.4587884084, + 540302.4609239949, + 539458.859568292, + 538484.4409203371, + 537531.6718874933, + 537267.7621267324, + 536473.9828749119, + 535486.8616121166, + 534501.006691062, + 540652.709349222, + 541131.4261559306, + 542310.5385527068, + 543285.3188949242, + 544247.7959926978, + 545089.9263310316, + 546087.6202142882, + 547077.7264906017, + 548075.363336421, + 549059.0245534881, + 524193.8328189907, + 527905.8476731717, + 526978.3198189315, + 525983.1425512254, + 522198.701020318, + 521204.9277157221, + 532860.9091847165, + 531863.5053478461, + 530864.0956853683, + 529864.8572444214, + 544737.4093717508, + 544569.3339346765, + 544327.771360188, + 543863.477011355, + 543275.0341084594, + 542715.4199777856, + 542093.6525093828, + 541285.7709317384, + 540449.5406616033, + 539551.5492211859, + 538610.5312377414, + 537640.4148034687, + 536770.6743346298, + 536686.2888205624, + 536054.8844726445, + 535061.7313647007, + 534070.1286353774, + 540991.614522323, + 542448.3669101102, + 543994.7063397208, + 544871.8490877205, + 545799.7056238599, + 546784.2744169813, + 547750.3419044648, + 548724.9651694401, + 520000.0, + 521826.3962308935, + 532600.3302651896, + 533589.8503320153, + 534561.7759873917, + 535449.8915779426, + 535993.0214361007, + 536819.0801195968, + 537807.793036829, + 538744.8306413345, + 539665.2325617559, + 540546.0055358304, + 541349.6936467969, + 541980.9483774537, + 542394.1133221515, + 542614.8288802537, + 543077.7762354391, + 542475.781801715, + 544083.8251957479, + 550000.0, + 549053.1439277239, + 548063.5281953025, + 547069.414890058, + 546087.5377901661, + 530271.9887491008, + 529298.9639373667, + 528340.209952825, + 527361.9910066663, + 526373.1685692647, + 525379.3992484873, + 524390.3065754601, + 523401.1210929096, + 522406.9032212814, + 521418.36474354746, + 520000.0, + 520978.6362345788, + 521950.47117176966, + 522933.3988561018, + 523928.4054918701, + 524884.9875455543, + 525874.1190162523, + 526848.2966478025, + 527791.3040361393, + 538922.8089907, + 539134.0778793262, + 538736.0836775531, + 538004.1174260699, + 537223.7768297916, + 536312.6322191659, + 535337.4942052161, + 534389.0342257542, + 533501.4998407771, + 532715.1008693202, + 531806.479694858, + 549037.6348608709, +] +Y = [ + 7506463.058931708, + 7506576.346475119, + 7506700.1649271855, + 7506872.99333815, + 7507045.821749114, + 7507202.956357559, + 7507354.44495147, + 7507562.8122875495, + 7507744.951704663, + 7507892.96504778, + 7508104.092849379, + 7508311.6272335, + 7508501.976685256, + 7508504.460999884, + 7507684.484812225, + 7507085.842450439, + 7506588.057267194, + 7506144.839214603, + 7505654.042415291, + 7505177.516716159, + 7504892.17995596, + 7504686.687074701, + 7504603.854204072, + 7504503.098141689, + 7504341.941955539, + 7504177.672377438, + 7504002.8541911375, + 7503245.259859091, + 7503436.728206725, + 7503611.222655113, + 7503811.172638808, + 7503933.967406592, + 7504066.000381116, + 7504086.539427338, + 7504206.419975162, + 7504405.812567679, + 7504618.483028057, + 7504899.302718434, + 7505410.872728581, + 7505727.305923727, + 7506201.128560977, + 7506724.563539154, + 7507220.081115803, + 7507612.996219244, + 7508505.040226217, + 7509135.469929169, + 7510000.0, + 7509704.59876308, + 7509356.363295672, + 7509042.9372015195, + 7508868.599440474, + 7508713.626424883, + 7508491.404999385, + 7508254.175495736, + 7508044.257347997, + 7507813.564222933, + 7507689.029948036, + 7507479.73426719, + 7507242.659510909, + 7500803.4896762185, + 7510000.0, + 7509752.2424489865, + 7509557.913698296, + 7501034.634496278, + 7501611.124154025, + 7501788.582382207, + 7501832.072807334, + 7501874.753115009, + 7501854.802179787, + 7501993.852453728, + 7502194.603011602, + 7502736.52101189, + 7503605.470838049, + 7504102.310629672, + 7503995.998654295, + 7504162.548298732, + 7504522.438259361, + 7505048.271868659, + 7505609.690332235, + 7506352.909638542, + 7507272.811883032, + 7508259.448754307, + 7509066.146225987, + 7491662.855160554, + 7492637.949197558, + 7492365.294641344, + 7492343.195849396, + 7492425.974104291, + 7492294.881093971, + 7508845.720669018, + 7509050.10324461, + 7509000.757492466, + 7509194.807969997, + 7509393.409809908, + 7509493.696517873, + 7509580.778152611, + 7501916.1655494, + 7502377.774781606, + 7502376.385050711, + 7502389.230930838, + 7502221.572623042, + 7503475.2625857005, + 7503209.079556105, + 7502871.602548231, + 7510000.0, + 7509197.116898042, + 7508256.250238412, + 7507364.330453778, + 7506624.831329774, + 7506116.551366933, + 7505849.401377124, + 7505705.229350432, + 7505578.685761046, + 7505339.114590024, + 7504851.858361741, + 7504235.464249766, + 7503807.926211051, + 7490000.0, + 7490632.5934013035, + 7490931.629951538, + 7491082.825264233, + 7498414.247334903, + 7498022.163648057, + 7497778.683655275, + 7499008.503536563, + 7499007.862999017, + 7499166.809369003, + 7499342.672418874, + 7499404.581849788, + 7499607.193046319, + 7499409.181598686, + 7499342.398484021, + 7499289.594081205, + 7499167.5240981905, + 7510000.0, + 7509254.772409647, + 7508259.427108908, + 7507280.617024052, + 7506546.4275029935, + 7505645.278178703, + 7504804.447980701, + 7503964.813485547, + 7503240.48427183, + 7502543.425302152, + 7501911.2681202525, + 7501310.361086443, + 7500889.459500117, + 7500454.516031106, + 7499884.737649882, + 7499387.224113458, + 7499210.211525513, + 7499047.019637048, + 7490706.05210895, + 7491653.361597963, + 7492310.636501358, + 7492912.724049956, + 7493323.250750658, + 7494099.582786533, + 7494682.93982123, + 7494844.964517663, + 7494717.975402998, + 7494868.223497515, + 7495407.3541522715, + 7495771.872569879, + 7490000.0, + 7490560.701632605, + 7492064.722272471, + 7491904.289302209, + 7491338.4112052, + 7499760.717626198, + 7499723.154391495, + 7499746.544444192, + 7500200.705866932, + 7500238.3134670025, + 7500228.5316139795, + 7500222.315208985, + 7500834.640376496, + 7500780.822571908, + 7500675.103396037, + 7500715.487725784, + 7510000.0, + 7509145.739106326, + 7508252.316578914, + 7507374.160168251, + 7506552.029851974, + 7505642.489778755, + 7504802.59176734, + 7504230.642840398, + 7503695.190221784, + 7503174.1096064225, + 7502644.083926628, + 7502464.589954097, + 7502223.052264384, + 7501311.038411527, + 7500760.731710168, + 7500717.160069187, + 7500865.774257174, + 7490387.598747078, + 7491245.724857572, + 7491467.516614238, + 7492641.868488729, + 7492862.716044601, + 7493359.487961125, + 7493417.977361985, + 7493290.396821679, + 7493232.414779238, + 7493379.023244919, + 7500431.1064537205, + 7501050.467118945, + 7500734.366883766, + 7500642.3056855835, + 7500076.008830209, + 7500028.234047118, + 7501127.377606143, + 7501090.091638437, + 7501109.731843927, + 7501135.069368409, + 7510000.0, + 7509043.874690335, + 7508080.057040733, + 7507197.428797968, + 7506390.922978456, + 7505562.805840937, + 7504779.60394153, + 7504197.023577066, + 7503648.645117141, + 7503208.680546424, + 7502884.853275787, + 7503057.40301376, + 7502931.162530749, + 7501939.632101527, + 7501282.496918272, + 7501241.235538427, + 7501112.3494773, + 7490051.910415043, + 7491085.266716096, + 7492105.484638324, + 7492577.547240268, + 7492949.361650263, + 7493050.756214061, + 7492813.284106591, + 7492712.54139396, + 7500333.586472658, + 7510000.0, + 7501627.108348517, + 7501716.96918736, + 7501950.3146539405, + 7502385.375857322, + 7503192.199394774, + 7503547.6234244285, + 7503611.016851668, + 7503956.5283480855, + 7504342.417675098, + 7504815.020093556, + 7505406.605492606, + 7506158.648222525, + 7507069.200253583, + 7508037.442205912, + 7508903.818976895, + 7490825.772271102, + 7491864.689757697, + 7492916.182605702, + 7492601.675778644, + 7492543.692947827, + 7492650.179472104, + 7492504.2474401975, + 7504023.818165967, + 7503802.840013571, + 7503526.350863925, + 7503319.79261976, + 7503201.512659313, + 7503146.041926193, + 7503004.886707106, + 7502858.230922394, + 7502758.70803037, + 7502621.773975609, + 7507850.745601907, + 7508049.260711595, + 7508281.05024187, + 7508448.578437336, + 7508547.11325418, + 7508818.54401165, + 7508958.199252176, + 7509183.0594342025, + 7509510.386527048, + 7510000.0, + 7509039.540376887, + 7508150.610234313, + 7507475.846219083, + 7506854.803228106, + 7506480.417593711, + 7506259.626961826, + 7505948.643392906, + 7505495.005195306, + 7504880.9632680155, + 7504474.085528871, + 7490000.0, +] +Z = [ + 533.0, + 533.0, + 540.0, + 540.0, + 549.0, + 550.0, + 556.0, + 558.0, + 568.0, + 571.0, + 582.0, + 586.0, + 593.0, + 598.0, + 591.0, + 582.0, + 569.0, + 565.0, + 563.0, + 556.0, + 554.0, + 549.0, + 543.0, + 537.0, + 535.0, + 531.0, + 525.0, + 518.0, + 528.0, + 536.0, + 538.0, + 531.0, + 539.0, + 544.0, + 546.0, + 551.0, + 556.0, + 562.0, + 571.0, + 574.0, + 575.0, + 581.0, + 586.0, + 601.0, + 609.0, + 619.0, + 609.0, + 606.0, + 597.0, + 588.0, + 581.0, + 574.0, + 569.0, + 563.0, + 561.0, + 556.0, + 553.0, + 542.0, + 539.0, + 640.0, + 577.0, + 601.0, + 584.0, + 629.0, + 561.0, + 562.0, + 600.0, + 658.0, + 660.0, + 767.0, + 778.0, + 724.0, + 772.0, + 739.0, + 791.0, + 812.0, + 675.0, + 649.0, + 690.0, + 670.0, + 682.0, + 761.0, + 804.0, + 629.0, + 582.0, + 596.0, + 585.0, + 611.0, + 634.0, + 650.0, + 594.0, + 558.0, + 607.0, + 578.0, + 599.0, + 594.0, + 551.0, + 555.0, + 558.0, + 553.0, + 561.0, + 590.0, + 578.0, + 560.0, + 667.0, + 656.0, + 649.0, + 638.0, + 631.0, + 623.0, + 623.0, + 615.0, + 608.0, + 607.0, + 602.0, + 602.0, + 606.0, + 643.0, + 617.0, + 594.0, + 572.0, + 504.0, + 484.0, + 497.0, + 503.0, + 507.0, + 521.0, + 521.0, + 520.0, + 512.0, + 506.0, + 502.0, + 502.0, + 504.0, + 598.0, + 575.0, + 580.0, + 564.0, + 567.0, + 555.0, + 540.0, + 539.0, + 552.0, + 537.0, + 527.0, + 532.0, + 547.0, + 534.0, + 521.0, + 496.0, + 516.0, + 503.0, + 510.0, + 503.0, + 532.0, + 529.0, + 566.0, + 528.0, + 555.0, + 558.0, + 533.0, + 535.0, + 547.0, + 538.0, + 600.0, + 549.0, + 465.0, + 533.0, + 521.0, + 536.0, + 561.0, + 559.0, + 583.0, + 560.0, + 533.0, + 556.0, + 544.0, + 561.0, + 560.0, + 543.0, + 691.0, + 719.0, + 667.0, + 642.0, + 621.0, + 640.0, + 625.0, + 598.0, + 614.0, + 585.0, + 596.0, + 636.0, + 634.0, + 571.0, + 561.0, + 534.0, + 565.0, + 552.0, + 573.0, + 585.0, + 546.0, + 547.0, + 555.0, + 540.0, + 543.0, + 544.0, + 551.0, + 545.0, + 546.0, + 544.0, + 555.0, + 546.0, + 529.0, + 541.0, + 569.0, + 553.0, + 561.0, + 681.0, + 646.0, + 639.0, + 619.0, + 612.0, + 602.0, + 600.0, + 591.0, + 579.0, + 580.0, + 602.0, + 593.0, + 585.0, + 570.0, + 552.0, + 554.0, + 560.0, + 636.0, + 602.0, + 600.0, + 608.0, + 591.0, + 585.0, + 573.0, + 571.0, + 581.0, + 564.0, + 625.0, + 650.0, + 664.0, + 608.0, + 635.0, + 644.0, + 659.0, + 812.0, + 616.0, + 611.0, + 622.0, + 629.0, + 677.0, + 641.0, + 647.0, + 602.0, + 600.0, + 603.0, + 582.0, + 573.0, + 591.0, + 634.0, + 573.0, + 566.0, + 554.0, + 549.0, + 545.0, + 549.0, + 550.0, + 550.0, + 543.0, + 532.0, + 545.0, + 546.0, + 544.0, + 549.0, + 551.0, + 568.0, + 577.0, + 580.0, + 584.0, + 629.0, + 628.0, + 617.0, + 609.0, + 600.0, + 594.0, + 591.0, + 594.0, + 592.0, + 596.0, + 592.0, + 579.0, +] +featureid = [ + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '0', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '7', + '7', + '7', + '7', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '6', + '6', + '6', + '6', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '8', + '8', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '0', + '0', + '2', + '2', + '2', + '0', + '0', + '1', + '2', + '2', + '2', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '5', + '5', + '6', + '7', + '7', + '7', + '7', + '7', + '7', + '7', + '0', + '1', + '1', + '1', + '0', + '0', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '0', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', +] + +s_c = pandas.DataFrame({'X': X, 'Y': Y, 'Z': Z, 'featureId': featureid}) + + +################################## +### TEST InterpolatedStructure ### +################################## + +geology = load_hamersley_geology() +geology.rename(columns={'unitname': 'UNITNAME', 'code': 'CODE'}, inplace=True) + + +def check_thickness_values(result, column, description): + for order, position in [ + (max(st_units['stratigraphic_Order']), 'bottom'), + (min(st_units['stratigraphic_Order']), 'top'), + ]: + assert ( + result[result['stratigraphic_Order'] == order][column].values == -1 + ), f"InterpolatedStructure: {position} unit not assigned as -1 ({description})" + + +def test_calculate_thickness_InterpolatedStructure(): + # Run the calculation + + md = MapData() + md.sampled_contacts = s_c + md.raw_data[Datatype.GEOLOGY] = geology + md.load_map_data(Datatype.GEOLOGY) + md.check_map(Datatype.GEOLOGY) + md.parse_geology_map() + + md.raw_data[Datatype.DTM] = load_hamersley_dtm() + md.data[Datatype.DTM] = md.get_raw_map_data(Datatype.DTM) + + md.bounding_box = { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, + } + thickness_calculator = InterpolatedStructure(dtm_data=md.get_map_data(Datatype.DTM), + bounding_box=md.bounding_box, + is_strike=False) + + result = thickness_calculator.compute( + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + geology_data=md.get_map_data(Datatype.GEOLOGY), + sampled_contacts=md.sampled_contacts, + ) + + # is thickness calc alpha the label? + assert ( + thickness_calculator.thickness_calculator_label == 'InterpolatedStructure' + ), 'InterpolatedStructure: thickness calculator name not set correctly' + + # is the result a pandas dataframe? + assert isinstance( + result, pandas.DataFrame + ), 'InterpolatedStructure result not a pandas DataFrame' + + # Check if there is mean, std, and median in results + required_columns = ['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev'] + for column in required_columns: + assert column in result.columns, f'{column} not in InterpolatedStructure result' + + # check if all units are in the results + assert 'name' in result.columns, 'unit_name not in InterpolatedStructure result' + assert all( + name in result['name'].values for name in st_units['name'].values + ), 'units missing from in InterpolatedStructure result' + + # are bottom and top units being assigned -1 + for column, description in [ + ('ThicknessMean', 'mean'), + ('ThicknessMedian', 'median'), + ('ThicknessStdDev', 'std dev'), + ]: + check_thickness_values(result, column, description) + + # are the dtypes numpy.float? + for column in required_columns: + assert ( + result[column].dtype == numpy.float64 + ), f'InterpolatedStructure: result column {column} not numpy.float64' + + # check for nans in the results + for column in required_columns: + assert ( + not result[column].isnull().values.any() + ), f'InterpolatedStructure: result column {column} has NaN values' diff --git a/packages/map2loop/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py b/packages/map2loop/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py new file mode 100644 index 000000000..0fbc1185b --- /dev/null +++ b/packages/map2loop/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py @@ -0,0 +1,1718 @@ +import pandas +import geopandas +import numpy + +from map2loop.mapdata import MapData +from map2loop.thickness_calculator import StructuralPoint +from map2loop.utils.load_map2loop_data import load_hamersley_geology +from map2loop.m2l_enums import Datatype + +#################################################################### +### Define the test data for ThicknessCalculator StructuralPoint ### +#################################################################### + +# Sample stratigraphic units data +st_units = pandas.DataFrame( + { + 'Unnamed: 0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'layerId': [7, 0, 10, 8, 1, 5, 9, 4, 3, 2, 6], + 'name': [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + ], + 'minAge': [0.0] * 11, + 'maxAge': [100000.0] * 11, + 'group': [None] * 11, + 'supergroup': [None] * 11, + 'ThicknessMean_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessMedian_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessStdDev_ThicknessCalculatorAlpha': [0.0] * 11, + 'stratigraphic_Order': list(range(11)), + 'colour': [ + '#5d7e60', + '#387866', + '#628304', + '#a2f290', + '#0c2562', + '#5fb3c5', + '#f48b70', + '#1932e2', + '#106e8a', + '#d0d47c', + '#e7f2f3', + ], + } +) + +st_column = [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + 'Fortescue_Group', +] + +# 3. map_data.basal_contacts +basal_c = [ + {'ID': 0, 'basal_unit': 'Turee_Creek_Group', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Boolgeeda_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Brockman_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Weeli_Wolli_Formation', 'type': 'BASAL'}, + {'ID': 4, 'basal_unit': 'Jeerinah_Formation', 'type': 'BASAL'}, + {'ID': 5, 'basal_unit': 'Bunjinah_Formation', 'type': 'BASAL'}, + {'ID': 6, 'basal_unit': 'Marra_Mamba_Iron_Formation', 'type': 'BASAL'}, + {'ID': 7, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 8, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 9, 'basal_unit': 'Wittenoom_Formation', 'type': 'BASAL'}, + {'ID': 10, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'BASAL'}, + {'ID': 11, 'basal_unit': 'Woongarra_Rhyolite', 'type': 'BASAL'}, +] +bc_geoms = geopandas.GeoSeries.from_wkt( + [ + 'MULTILINESTRING ((520000.0000000000000000 7506463.0589317083358765, 520000.0000000000000000 7506464.0583261400461197, 521798.5784270099829882 7506667.5086746597662568, 524292.0583883899962530 7507105.0368000296875834, 525888.7772752699675038 7507345.5593877695500851, 526916.8410634599858895 7507564.5817003501579165, 528098.0088455299846828 7507783.0997126800939441, 529344.8316910399589688 7507958.1297348998486996, 530263.5311044099507853 7508220.6498684398829937, 531357.2706492099678144 7508395.6678343201056123, 532013.4010351699544117 7508548.6697535198181868, 532538.3520777500234544 7508548.6775182196870446, 532932.1086069300072268 7508483.1717491699382663, 533085.1519033299991861 7508308.1688938299193978, 533107.0194513100432232 7508045.6694244500249624, 533041.4099823100259528 7507717.6704597100615501, 532866.4200693099992350 7507455.1614942299202085, 531685.2195994600187987 7506755.1383216800168157, 530875.8998375800438225 7506317.6329081403091550, 530175.9800506900064647 7506011.6195486104115844, 529279.1401694599771872 7505442.5995908901095390, 528426.1115621499484405 7505027.0810785600915551, 526654.3696992900222540 7504655.0613197097554803, 525210.7310010100482032 7504567.5296983895823359, 523067.1991962700267322 7504217.5111659299582243, 521098.6489177999901585 7503867.9904129095375538, 520414.0195790100260638 7503782.4897812502458692, 520000.0000000000000000 7503710.2290291301906109, 520000.0000000000000000 7503711.2441460378468037))', + 'MULTILINESTRING ((520000.0000000000000000 7503245.2598590906709433, 520000.0000000000000000 7503246.2595371659845114, 520271.9002807399956509 7503274.9797609802335501, 520982.5192159600555897 7503437.4804947897791862, 521754.8289336899761111 7503561.4991028197109699, 522673.5081250499933958 7503780.5075413398444653, 523439.0304306600592099 7503868.0182901099324226, 525079.5116741600213572 7504086.5288977697491646, 526041.9114880500128493 7504086.5408970797434449, 527157.4277337800012901 7504239.5578404404222965, 528710.4300827099941671 7504589.5780827598646283, 529322.8810412200400606 7504699.1013501295819879, 529519.7383159700548276 7504721.1013953704386950, 529782.1897067499812692 7504852.1116183400154114, 529846.5792647199705243 7505018.1105302302166820, 530434.1504480800358579 7505322.1195039302110672, 531001.4219496899750084 7505585.1193884601816535, 531730.7807765699690208 7505767.6295145899057388, 531892.8382770799798891 7505828.6311367200687528, 532231.0984191700117663 7506036.1303443796932697, 532535.6622749799862504 7506280.1284634796902537, 533205.6884558700257912 7506665.6397261302918196, 533571.2115816300502047 7506929.6612275000661612, 534139.7121901500504464 7507214.1599170295521617, 534444.3105956399813294 7507356.1602175496518612, 534769.1609872799599543 7507478.1677699098363519, 534911.2916754200123250 7507518.6696750596165657, 535114.3212854999583215 7507640.6607389999553561, 535236.1208061299985275 7507823.1785498997196555, 535358.0217514700489119 7508351.1807611100375652, 535520.5093329700175673 7508594.6879638703539968, 535743.8194368999684229 7508818.1783391702920198, 536007.7499623399926350 7508980.6794774401932955, 536576.2579947899794206 7509386.6783681297674775, 536718.4177284899633378 7509630.1906582303345203, 536637.2394275299739093 7509975.6913913199678063, 536604.7901494553079829 7510000.0000000000000000, 536606.4580603817012161 7510000.0000000000000000), (533429.9102329264860600 7510000.0000000000000000, 533432.8839227686403319 7510000.0000000000000000, 533307.4205499000381678 7509955.1997412098571658, 532718.6210473099490628 7509792.6996827302500606, 531297.2519883899949491 7509264.6781625803560019, 530525.7001818099524826 7509021.1595332501456141, 529551.0197801099857315 7508858.6513834102079272, 528251.4977760600158945 7508655.6207956997677684, 527134.7110856899525970 7508351.0991824995726347, 525794.5900796599453315 7508066.5579961901530623, 524596.6507077199639753 7507782.5406945496797562, 523662.6590976800071076 7507681.0381808001548052, 522830.1799164600088261 7507498.0297148795798421, 522038.3083402099437080 7507295.0188862504437566, 520677.9482569899992086 7507010.9990820102393627, 520000.0000000000000000 7506956.5663501676172018, 520000.0000000000000000 7506957.5695682624354959), (550000.0000000000000000 7490095.5414067916572094, 550000.0000000000000000 7490094.5419130371883512, 549848.4078108200337738 7490011.2184614501893520, 549837.1990841374499723 7490000.0000000000000000, 549836.1991053668316454 7490000.0000000000000000))', + 'MULTILINESTRING ((520000.0000000000000000 7500803.4896762184798717, 520000.0000000000000000 7500804.4889609171077609, 520473.5791580000077374 7500907.4720744201913476, 521144.7272773912409320 7501014.1576358489692211, 521145.5101736339274794 7501013.5373818902298808), (523032.4352534925565124 7510000.0000000000000000, 523034.2386217917664908 7510000.0000000000000000, 522935.2510594900231808 7509934.0400712601840496, 521858.9592969599762000 7509706.5850364100188017, 521402.0897869099862874 7509610.0089996904134750, 520906.0067273600143380 7509526.0576650602743030, 520005.1707852099789307 7509373.5673304200172424, 520000.0000000000000000 7509372.6918550245463848, 520000.0000000000000000 7509373.7060850486159325), (521279.9150416324264370 7501034.6344962781295180, 521278.8505533785792068 7501035.4778430974110961, 521543.4397763700108044 7501077.5368893602862954, 522373.8810591999790631 7501209.4896944900974631, 523030.4162207188783213 7501391.7815449377521873, 523031.2068098201416433 7501391.1711508315056562), (527953.2198819570476189 7501611.1241540247574449, 527952.4394709372427315 7501611.9876126917079091, 527953.2198819570476189 7501611.1241540247574449, 528269.5491108499700204 7501675.5494663203135133, 528644.5797393700340763 7501769.5606017401441932, 529113.4114604999776930 7501800.5704611297696829, 529800.9698748099617660 7501832.0698146400973201, 530707.2799876299686730 7501832.0906658703461289, 531832.3692170899594203 7502050.6015144297853112, 532080.1110293077072129 7502146.1749884476885200, 532080.7953341902466491 7502145.4462257148697972), (532471.3224294331157580 7501854.8021797873079777, 532470.6117427451536059 7501856.0567162586376071, 532551.2005992300109938 7501832.0981646096333861, 533020.0292473699664697 7501925.6022116597741842, 533613.8304010899737477 7502019.6212948998436332, 534488.9388966499827802 7502207.1201175795868039, 534926.4299064800143242 7502457.1309860097244382, 535239.0000169699778780 7502707.1384293204173446, 535551.5432611800497398 7503144.6412358498200774, 535676.5302752000279725 7503519.6384271895512938, 535926.5516183800064027 7503894.6519359098747373, 536270.3683300199918449 7504082.1422335496172309, 536676.5897916300455108 7504113.6475562499836087, 536989.1799710299819708 7504051.1521394196897745, 537895.5108797400025651 7503957.1480598496273160, 538364.2599795899586752 7504113.6601144503802061, 539051.8112280699424446 7504394.6494075302034616, 539676.8889227600302547 7504613.6505787996575236, 540145.7008413899457082 7504988.6477605598047376, 540770.7923636999912560 7505332.1517110802233219, 541145.7601316999644041 7505676.1485500596463680, 541614.6014505899511278 7506144.6516708899289370, 541895.8687167000025511 7506645.1619760403409600, 542083.3585663399426267 7507145.1590369800105691, 542208.3892406800296158 7507707.6589486598968506, 542145.9084491999819875 7508332.6592682404443622, 542239.6581270300084725 7508645.1607529902830720, 542458.4708741100039333 7508957.6600440395995975, 542677.2416874299524352 7509082.6624572100117803, 542864.7195600100094453 7509239.1611510002985597, 542927.2699991799890995 7509989.1508510801941156, 542927.2698631049133837 7510000.0000000000000000, 542928.2698600001167506 7510000.0000000000000000), (542679.7431424340466037 7490560.7071135109290481, 542680.4317333664512262 7490559.9283441118896008, 542592.3105463000247255 7490517.6513492902740836, 542387.8711325100157410 7490321.1590552795678377, 542278.4307441100245342 7490048.1597586404532194, 542272.8549225005554035 7490000.0000000000000000, 542271.8556170752272010 7490000.0000000000000000), (544273.9324713232927024 7491662.8551605539396405, 544274.6237809687154368 7491662.1230727611109614, 544238.3782646199688315 7491635.1603938303887844, 544135.6185495100216940 7491432.1611171104013920, 543918.3223162599606439 7491197.6698569804430008, 543420.6783191299764439 7490869.6585929403081536, 543038.3205035700229928 7490699.6702497899532318, 542815.3584537300048396 7490624.6607478400692344, 542773.7009090904612094 7490604.6751364599913359, 542773.0674823645967990 7490605.4474027175456285), (550000.0000000000000000 7492637.9491975577548146, 550000.0000000000000000 7492636.9501683469861746, 549769.4085893699666485 7492521.7100056502968073, 549501.4603817999595776 7492462.1984654497355223, 549174.0184454700211063 7492372.7009732704609632, 548668.0100578600540757 7492343.2083122497424483, 547774.9591860000509769 7492343.1903728395700455, 547358.2082652900135145 7492402.6892563700675964, 546971.2795143900439143 7492432.1799347596243024, 546524.7789019900374115 7492402.6676745600998402, 546018.6897931500570849 7492283.6581326704472303, 545304.2811550099868327 7491926.1592656997963786, 545036.3909502900205553 7491777.1605294896289706, 544828.0104751100298017 7491628.6593068800866604, 544708.9605470900423825 7491509.6700969301164150, 544618.5316022647311911 7491404.1884233895689249, 544617.8842772342031822 7491404.9697802281007171))', + 'MULTILINESTRING ((520293.4320175029570237 7501708.4171284157782793, 520293.4981995084672235 7501707.4205201249569654, 520000.0000000000000000 7501674.5829317998141050, 520000.0000000000000000 7501675.5891712857410312), (520000.0000000000000000 7508845.7206690181046724, 520000.0000000000000000 7508846.7200987627729774, 520052.9280038099968806 7508862.0008838102221489, 521090.5512352299992926 7509073.0105239599943161, 522005.9512440299731679 7508998.0294947298243642, 522324.3404851399827749 7509085.0209561996161938, 522451.5710224300273694 7509097.0301381601020694, 522591.6214781600283459 7509122.0274216998368502, 524151.1692813800182194 7509438.0516055300831795, 524456.6897462300257757 7509487.5595593899488449, 525140.4391166700515896 7509496.5704689295962453, 526119.0513356799492612 7509602.5791763495653868, 527124.1199973500333726 7509920.1001460999250412, 527347.8288250340847299 7510000.0000000000000000, 527348.8276206540176645 7510000.0000000000000000), (522351.1343196252128109 7501916.1655494002625346, 522352.2528255800134502 7501915.3037830777466297, 521104.1391963799833320 7501751.4809457501396537, 520737.7721352900261991 7501723.9786810996010900, 520420.9591136300005019 7501715.1471717469394207, 520420.1756578796193935 7501715.7678689807653427), (527125.4548547224840149 7502377.7747816061601043, 527126.3209163650171831 7502376.8168430794030428, 526700.8509709000354633 7502355.5393781904131174, 525246.2184770300518721 7502408.5209231497719884, 524294.1117317799944431 7502249.5209683403372765, 523447.7796929900068790 7502091.0098048197105527, 522583.0080486031947657 7501863.5510688340291381, 522582.2173395422287285 7501864.1615555742755532), (530798.8710058355936781 7503475.2625857004895806, 530799.6446038441499695 7503474.4564733263105154, 530292.3180354699725285 7503316.0992012796923518, 529603.4816261499654502 7503154.0790386795997620, 529076.7311885600211099 7502911.0787954898551106, 528266.3094259300269186 7502728.5696691796183586, 527759.8099331599660218 7502688.0595766501501203, 527233.1392903799423948 7502607.0608489904552698, 527065.4771157877985388 7502593.2268756395205855, 527064.8072133261011913 7502593.9678452722728252), (539955.9743753559887409 7510000.0000000000000000, 539956.9738961729453877 7510000.0000000000000000, 540057.3710624600062147 7509681.6689012898132205, 540295.3694572099484503 7509391.1672181095927954, 540480.4705794400069863 7509232.1700646700337529, 540612.7384639199590310 7509073.6586520997807384, 540665.5814983600284904 7508571.1700814096257091, 540348.2114157699979842 7507671.6596398204565048, 539925.0498745300574228 7507090.1577369300648570, 539607.6706715000327677 7506746.1599598200991750, 539052.2007989300182089 7506296.6606875201687217, 538205.9094809900270775 7505952.6699313903227448, 537068.6509273999836296 7505741.1603932101279497, 536169.3901651899795979 7505661.6614198600873351, 535217.2919880599947646 7505503.1506273699924350, 534635.4301719899522141 7505317.6512130200862885, 534027.0999437200371176 7504974.1400412498041987, 533603.8817716699559242 7504709.6272615399211645, 533233.6514340500580147 7504312.6317273303866386, 532466.6187711399979889 7503969.1208717301487923, 531858.3409144999459386 7503651.6198519701138139, 531329.3389675599755719 7503360.6116438498720527, 531139.0552856920985505 7503265.5203097239136696, 531138.3627150403335690 7503266.2411932516843081), (546233.0059536607004702 7490000.0000000000000000, 546232.0059536602348089 7490000.0000000000000000, 546232.0095286100404337 7490128.6799554601311684, 546425.2915191700449213 7490406.1914659300819039, 546769.6909271699842066 7490574.1895378697663546, 547082.8998588599497452 7490707.6977680595591664, 547486.2694205499719828 7490854.1999811800196767, 548366.2786710499785841 7491037.7003361200913787, 548806.2997251900378615 7491074.2083575604483485, 549612.9294149799970910 7491257.7084028301760554, 550000.0000000000000000 7491301.9012328926473856, 550000.0000000000000000 7491300.8947363123297691))', + 'MULTILINESTRING ((520000.0000000000000000 7496937.7387266764417291, 520000.0000000000000000 7496940.1299340603873134, 520002.3885029399534687 7496934.9419469097629189, 520209.1083645300241187 7496271.9499225998297334, 520062.0993496900191531 7496119.9397722100839019, 520000.0000000000000000 7496068.6646597366780043, 520000.0000000000000000 7496069.9614912457764149), (523381.4890356060350314 7498414.2473349031060934, 523382.0906666574883275 7498413.4010553266853094, 523169.7519518999615684 7498336.9916863301768899, 523067.8999133500619791 7498311.9897804697975516, 522895.7909434399916790 7498236.4781237496063113, 522615.2015952100045979 7498072.4703307598829269, 521882.6812058400246315 7497821.9590960601344705, 521526.3299231799901463 7497779.4584824498742819, 521208.3405302499886602 7497768.4611136997118592, 520979.3200964700081386 7497743.9708666298538446, 520246.9187887199805118 7497531.9419434396550059, 520000.0000000000000000 7497468.9978941539302468, 520000.0000000000000000 7497470.0298743853345513), (525280.9678179419133812 7499008.5035365633666515, 525281.4949324887711555 7499007.5775622371584177, 525203.0376252799760550 7498994.5084805004298687, 524869.2387656100327149 7498918.5108462898060679, 524080.2303868400631472 7498843.0101468600332737, 523609.8704664499964565 7498706.4891386404633522, 523343.3935284681501798 7498640.4214922022074461, 523342.8145249948720448 7498641.2359428005293012), (534272.9718145289225504 7499007.8629990173503757, 534273.7464286693139002 7499006.7735539842396975, 533821.5094927400350571 7499055.6005880599841475, 533411.8113768999464810 7499131.0899759698659182, 532789.7513422400224954 7499313.0907301902770996, 532046.2501181999687105 7499359.0887924302369356, 531560.6700862100115046 7499404.5924122100695968, 531257.2500160000054166 7499404.5794073604047298, 530968.9126983700552955 7499419.5698141297325492, 530650.2800068800570443 7499495.5805069999769330, 530361.9716437599854544 7499601.5801136298105121, 530210.2997778200078756 7499647.0707991197705269, 530073.7308944800170138 7499647.0701257800683379, 529891.5828257299726829 7499586.5608606198802590, 529755.0991281700553373 7499495.5807948503643274, 529648.8292915900237858 7499434.5578709095716476, 528920.5188349500531331 7499359.0610773200169206, 527979.7492919899523258 7499328.5417763004079461, 527312.1506295599974692 7499283.0298913996666670, 526705.1804492699448019 7499192.0412488700821996, 525809.9994778400287032 7499116.0194425499066710, 525476.2009420599788427 7499040.0108542302623391, 525386.5961969492491335 7499025.0848800987005234, 525386.1020599714247510 7499025.9529232168570161), (547423.9512601103633642 7510000.0000000000000000, 547425.9598791532916948 7510000.0000000000000000, 547270.3128660599468276 7509910.6501949401572347, 547123.4215484600281343 7509784.1305715003982186, 546931.6794150100322440 7509581.6403483096510172, 546815.5487570599652827 7509245.1501061804592609, 546813.4198143399553373 7508786.6386062400415540, 546793.0495528799947351 7508519.6417614798992872, 546760.1718947299523279 7508297.1516221202909946, 546630.1392768600489944 7507705.6514096902683377, 546603.1807938199490309 7507387.6502600098028779, 546506.4978075700346380 7507121.1480851704254746, 546347.0615013099741191 7507032.6372693302109838, 546098.2091887400019914 7506843.1486029401421547, 545931.3088385299779475 7506525.6525994800031185, 545783.2304036399582401 7506157.6511867698282003, 545590.6004368900321424 7505770.1490056701004505, 545302.2208498599939048 7505307.1615147199481726, 544943.5218329799827188 7504761.6597001496702433, 544725.5899502099491656 7504406.6611849600449204, 544501.3301299399463460 7504057.6593816699460149, 544123.7492673799861223 7503569.6505599301308393, 543753.3717356600100175 7503247.1585790300741792, 543357.1403491899836808 7502835.6512618502601981, 543024.9804781300481409 7502538.1512261899188161, 541869.5108813600381836 7501596.1483753900974989, 541378.0882920400472358 7501255.1483567599207163, 540868.3004191899672151 7501022.1397865395992994, 540434.9686214999528602 7500840.1404092302545905, 539886.7884534699842334 7500575.6385581698268652, 539472.3796638699714094 7500361.6388751100748777, 539128.0079635200090706 7500159.6402211003005505, 538782.9978578999871388 7499830.6288305800408125, 538476.5108094000024721 7499571.6312278602272272, 538240.7492773899575695 7499470.6311592804268003, 537903.1197484800359234 7499358.1302875401452184, 537565.7982155899517238 7499296.1290474496781826, 536808.4890007500071079 7499179.6114020701497793, 536356.4701961500104517 7499080.1195044601336122, 535866.5394221700262278 7499031.6102768797427416, 535319.4902977800229564 7498996.6221683695912361, 534772.7408331099431962 7499031.6016195202246308, 534285.8976723682135344 7499162.2542209504172206, 534285.3182902499102056 7499163.0690846843644977), (537098.9795529744587839 7490000.0000000000000000, 537097.9807571568526328 7490000.0000000000000000, 537082.7614457299932837 7490032.1078298501670361, 537064.9390341599937528 7490293.1209420198574662, 537085.1899132600519806 7490547.6190917901694775, 537118.4598460316192359 7490667.2163930963724852, 537119.4298784348648041 7490666.9776619225740433), (537417.0468347219284624 7490706.0521089499816298, 537416.5515447265934199 7490706.2860060287639499, 537416.1256071323296055 7490706.4396555135026574, 537487.4418410599464551 7490882.6095111798495054, 537654.0587315800366923 7491149.1116127697750926, 537858.8020591400563717 7491415.1179784098640084, 537992.9993732899893075 7491548.1193249300122261, 538056.9795873910188675 7491588.6379907196387649, 538057.9059167269151658 7491588.2641664957627654), (538156.4071117863059044 7491653.3615979626774788, 538155.5143074670340866 7491653.8223220268264413, 538299.8710431599756703 7491877.6190374298021197, 538434.6211939599597827 7492137.6200953898951411, 538652.5613591700093821 7492492.6281045097857714, 538768.5901984019437805 7492667.4812555732205510, 538769.1307524497387931 7492666.4872721917927265), (539076.4825414990773425 7492310.6365013578906655, 539076.0048737846082076 7492311.5148478839546442, 539256.6677916899789125 7492496.1301840599626303, 539703.5787173799471930 7492843.6307888999581337, 540053.9791185399517417 7492994.6384690301492810, 540455.2317104099784046 7493113.1314762597903609, 540786.5202559200115502 7493232.1414313204586506, 541041.4298104699701071 7493351.6418332597240806, 541239.2018903200514615 7493478.1304302699863911, 541332.9279536200920120 7493553.2876135194674134, 541333.7303589903749526 7493552.6927433693781495), (541996.2659877514233813 7493323.2507506581023335, 541995.3182718952884898 7493323.6649971948936582, 542500.6798850599443540 7493961.1386070298030972, 542743.6307616099948063 7494233.6408173600211740, 543082.0077898399904370 7494518.1417143298313022, 543356.1986791399540380 7494663.1389560597017407, 543789.2602507199626416 7494794.6498441295698285, 544139.2511316499439999 7494849.6397826299071312, 544641.6300744400359690 7494840.6485728900879622, 545175.3190517800394446 7494736.1496383799239993, 545741.0922157400054857 7494688.1493368400260806, 546307.7507409299723804 7494838.1492867600172758, 546786.0567151700379327 7495109.1620891699567437, 547188.0597629300318658 7495399.6700470102950931, 547621.6999697199789807 7495652.1683375202119350, 547965.6989555200561881 7495764.6696619400754571, 548207.3907420800533146 7495776.1700877603143454, 548481.1595977500546724 7495844.6798296095803380, 548863.0792892000172287 7495925.1790779400616884, 549506.2123941599857062 7496087.1879144096747041, 550000.0000000000000000 7496197.8834195006638765, 550000.0000000000000000 7496196.8585999859496951))', + 'MULTILINESTRING ((524266.0954626141465269 7490000.0000000000000000, 524264.0581623602192849 7490000.0000000000000000, 524274.6716975499875844 7490005.9794874498620629, 524580.9296716400422156 7490207.9900786597281694, 525263.6310803899541497 7490681.4799169795587659, 525633.8797883000224829 7490965.9987491900101304, 526080.4097873299615458 7491262.5022844001650810, 526392.7913924700114876 7491426.5083817597478628, 526680.5080642091343179 7491700.2571335136890411, 526680.9617382686119527 7491699.3084705946967006), (527736.6980700913118199 7490014.9772448325529695, 527736.3587646851083264 7490015.9580855472013354, 528010.6905607599765062 7490033.0087006296962500, 528554.6395948999561369 7490014.5194057403132319, 528659.0582184605300426 7490000.0000000000000000, 528651.7973667406477034 7490000.0000000000000000), (528242.3239959123311564 7492064.7222724705934525, 528241.7088020627852529 7492065.7254664935171604, 528666.1973901799647138 7492063.5307877697050571, 529212.3307416000170633 7491907.5399811398237944, 529719.6322913799667731 7491605.5284209195524454, 530163.0910896200221032 7491234.0305473301559687, 530511.5112620899453759 7490958.5415406301617622, 531453.6296071013202891 7490000.0000000000000000, 531452.2274564296239987 7490000.0000000000000000))', + 'MULTILINESTRING ((522423.1507045699981973 7499760.7176261981949210, 522423.9203800179529935 7499759.6364277126267552, 522349.8299966399208643 7499766.9809384401887655, 522165.4282854500343092 7499767.9805885404348373, 521783.7590640200069174 7499750.9782179798930883, 521446.5883731800131500 7499727.4790324503555894, 521058.2386758999782614 7499640.4595605703070760, 520701.5588286300189793 7499521.4718082202598453, 520204.5092078600428067 7499313.9601706201210618, 520000.0000000000000000 7499193.2638115361332893, 520000.0000000000000000 7499194.4249778995290399), (522555.9904544320888817 7499746.5444441922008991, 522555.4111143556656316 7499747.3582698311656713, 522555.9904544320888817 7499746.5444441922008991, 522960.0394677100121044 7499706.4914416698738933, 523297.1696609099744819 7499723.9880460202693939, 523539.3288009500829503 7499824.4885594900697470, 523807.0801918199867941 7499963.0007417099550366, 524452.2040554300183430 7500171.9706728672608733, 524451.4118937810417265 7500172.7652285397052765), (529030.4932832464110106 7500200.7058669319376349, 529031.2178299439838156 7500199.9257171414792538, 528991.0805857500527054 7500183.0489843999966979, 528679.6486600999487564 7500223.0495249899104238, 527986.5626644400181249 7500239.5480527197942138, 527668.6504820300033316 7500241.0489183496683836, 526409.2975434400141239 7500216.0304062804207206, 525849.7599196099909022 7500225.5205484097823501, 525373.0094749700510874 7500266.0211616195738316, 525080.3788815899752080 7500248.5201182495802641, 524717.1588156500365585 7500210.0084451204165816, 524719.1996265298221260 7500211.2304345155134797), (532993.0805511008948088 7500834.6403764961287379, 532993.3489576445426792 7500834.0452068466693163, 532993.5077827317873016 7500833.7281568944454193, 532828.7419588699704036 7500779.5898232003673911, 532059.2178660000208765 7500783.5925765298306942, 531715.7397694600513205 7500766.5896713202819228, 531009.3391590700484812 7500675.0807855604216456, 530322.5721776599530131 7500685.0713867703452706, 529769.5689500400330871 7500739.0687459995970130, 529089.1306385099887848 7500749.0586953703314066, 528660.8910052364226431 7500745.6074274424463511, 528660.2112883693771437 7500746.3392704948782921), (545728.9288492670748383 7510000.0000000000000000, 545730.2700878457399085 7510000.0000000000000000, 545584.7022705799899995 7509837.1403594203293324, 545386.0617979000089690 7509520.1391145400702953, 545238.0399551700102165 7509170.6511606499552727, 545122.0989813000196591 7508859.6512553403154016, 544986.9678246000548825 7508529.6407046103850007, 544743.6496689900523052 7508180.6489076800644398, 544659.9523990500019863 7507964.6498591499403119, 544499.4011402300093323 7507634.6525363801047206, 544320.0205451600486413 7507368.1501189004629850, 544044.8593324699904770 7507007.1477869795635343, 543852.7414086499484256 7506721.6492448104545474, 543666.6799941799836233 7506391.6518390402197838, 543486.6189286799635738 7505966.1496158502995968, 543177.9487287199590355 7505267.6511040404438972, 542851.5999981700442731 7504830.1483773496001959, 542628.1512679100269452 7504653.1477385796606541, 541996.4995115000056103 7504230.1516731502488256, 541486.3089837899897248 7503927.6487837303429842, 541052.4398514899658039 7503624.6398146301507950, 540714.5785347600467503 7503454.6588033195585012, 540331.7501426199451089 7503195.6492001600563526, 539885.0605549899628386 7502867.1490661101415753, 539534.2795183400157839 7502671.6515465499833226, 539088.3392634700285271 7502508.6507563600316644, 538115.0518896100111306 7502437.6390984999015927, 537790.3291457899613306 7502369.1493166498839855, 537573.5679509800393134 7502255.6492295796051621, 537394.9012426600093022 7502116.6387358000501990, 537330.5981657799566165 7501970.6416400596499443, 537323.5123430900275707 7501824.6311678895726800, 537322.0002546999603510 7501506.1379719302058220, 537263.7595541899790987 7501296.6407880699262023, 537039.8101914300350472 7501017.6294886004179716, 536612.6102296400349587 7500784.6198029303923249, 536218.0508771500317380 7500716.6298277098685503, 535734.4196069199824706 7500662.1207142304629087, 534972.0878904700512066 7500831.6092656701803207, 534616.1697530100354925 7500865.1187592102214694, 534266.3894202300580218 7500867.1096779303625226, 534081.7079486900474876 7500817.1092230295762420, 533864.9377766799880192 7500710.1096216002479196, 533501.7106121799442917 7500546.6094194203615189, 533336.0891072107478976 7500498.7944972664117813, 533335.5105264986632392 7500499.6086738053709269), (540652.7093492220155895 7490387.5987470783293247, 540651.8620166190667078 7490388.1283743241801858, 540716.9413671500515193 7490648.6385009195655584, 540890.1206744499504566 7490959.6384145403280854, 541069.2507452500285581 7491181.1377072203904390, 541209.8013249200303108 7491327.1401432603597641, 541318.3109204999636859 7491402.6507735904306173, 541522.3790933899581432 7491516.1502364799380302, 541726.1788735899608582 7491597.6481381803750992, 541866.3201340900268406 7491635.1395976599305868, 542152.3343121195212007 7491644.4789796750992537, 542152.5743099044775590 7491643.5087957028299570), (542310.5385527068283409 7491467.5166142378002405, 542310.2017283077584580 7491468.4781577382236719, 542387.0478783199796453 7491479.6506026098504663, 542508.2986270999535918 7491568.1487769903615117, 542623.6207645100075752 7491745.6495260195806623, 542707.3887829299783334 7491974.6494024097919464, 542804.3198439499828964 7492292.1578110801056027, 542874.8705274199601263 7492419.1503577204421163, 543015.3294375799596310 7492539.1386309601366520, 543157.3559995990945026 7492607.0648720515891910, 543158.2323379423469305 7492606.5854770792648196), (543285.3188949242467061 7492641.8684887290000916, 543284.1699949501780793 7492642.7301141498610377, 543785.6400337499799207 7492706.6602805098518729, 544142.1796537400223315 7492794.1595931304618716, 544346.3083736399421468 7492926.6612573396414518, 544550.7481039999984205 7493129.1590701797977090, 544793.1985071500530466 7493287.1483336500823498, 545098.8382594300201163 7493361.6606107000261545, 545620.5201594299869612 7493403.1614144695922732, 546046.6321061899652705 7493420.1597612500190735, 546440.8310840800404549 7493399.1707573700696230, 546822.0285851999651641 7493326.6682714400812984, 547241.4683955300133675 7493267.1695830002427101, 548296.9793255199911073 7493223.1783396899700165, 548710.8022534899646416 7493316.6910186298191547, 548978.0409311200492084 7493359.6988639002665877, 549474.6489930299576372 7493478.1999030597507954, 549870.0192977499682456 7493704.7011540196835995, 550000.0000000000000000 7493802.1282507702708244, 550000.0000000000000000 7493800.8785204347223043))', + 'MULTILINESTRING ((524718.0163713778601959 7500210.5219292528927326, 524717.1588156500365585 7500210.0084451204165816, 524574.9860907683614641 7500190.5280320746824145, 524574.2798689020564780 7500191.2344054849818349))', + 'MULTILINESTRING ((524193.8328189906897023 7500431.1064537204802036, 524194.6307847223361023 7500430.3067480474710464, 523397.8001402500085533 7500183.4910121802240610, 522854.1015355099807493 7500070.4906302299350500, 522324.1118496610433795 7500072.2749801976606250, 522323.5325372974039055 7500073.0887669073417783), (527905.8476731716655195 7501050.4671189449727535, 527908.1407460733316839 7501050.5568969398736954, 527430.0695936999982223 7500795.5491229798644781, 526591.8898101799422875 7500682.0311559904366732, 525549.8513239700114354 7500614.0300792902708054, 525164.7414901100564748 7500478.0103883901610970, 524717.1588156500365585 7500210.0084451204165816, 524716.1685345589648932 7500209.8727574581280351))', + 'MULTILINESTRING ((522198.7010203180252574 7500076.0088302092626691, 522199.4341642370563932 7500074.9790627742186189, 521744.1016206499771215 7500092.9814525097608566, 521177.7584161399863660 7500024.9713861504569650, 520656.7282556199934334 7499911.9717762302607298, 520226.3289424299728125 7499730.4618171695619822, 520000.0000000000000000 7499617.2908613989129663, 520000.0000000000000000 7499618.4089082013815641), (532860.9091847165254876 7501127.3776061432436109, 532861.3487732587382197 7501126.4021477382630110, 532255.2395347800338641 7501090.0919910203665495, 531190.5300996799487621 7501090.0910327201709151, 530442.9822135099675506 7501135.0692772204056382, 529763.3494318500161171 7501135.0693844202905893, 529061.0896587100578472 7501044.5682494696229696, 528473.1436554730171338 7500979.1873466055840254, 528472.5273607608396560 7500979.9734598090872169), (544737.4093717507785186 7510000.0000000000000000, 544738.7021026653237641 7510000.0000000000000000, 544626.1803077399963513 7509862.6509016100317240, 544599.6914848999585956 7509307.1512340800836682, 544520.3602272400166839 7508619.1491003800183535, 544255.8195605799555779 7507878.6505708796903491, 543753.3111433800077066 7507006.1485301395878196, 543197.8599954500095919 7506291.6510444404557347, 542748.2417293100152165 7505604.1493647499009967, 542034.1492941799806431 7504704.6514335004612803, 541293.5891299600480124 7504202.1505518397316337, 540447.2613627200480551 7503647.1504111299291253, 539204.1899481900036335 7503038.6409026896581054, 538490.0402022900525481 7502853.6400044597685337, 537934.5981001099571586 7502959.1494819503277540, 537458.5619110600091517 7503118.1395992599427700, 536956.0390386499930173 7503170.6392884301021695, 536770.9210307099856436 7502932.6405451204627752, 536718.0086382699664682 7502615.6299286996945739, 536718.0077891800319776 7502060.1385293100029230, 536585.7404540400020778 7501557.6296280203387141, 536215.4412918200250715 7501319.6187131898477674, 535871.5983779799425974 7501240.1199650401249528, 535289.7498613100033253 7501266.6198128499090672, 534813.6585787199437618 7501213.6187100997194648, 533649.9409386699553579 7501055.1196561502292752, 533032.6647448980947956 7500990.1133196894079447, 533032.2540093590505421 7500991.0240919245406985), (540991.6145223230123520 7490051.9104150431230664, 540990.9120639010798186 7490052.6205057417973876, 540994.1994521199958399 7490125.1404810203239322, 541020.3115120199508965 7490265.1499587204307318, 541071.8600603099912405 7490404.6513284202665091, 541225.5412088100565597 7490626.6515073096379638, 541378.8100700799841434 7490759.6511909803375602, 541621.1913036600453779 7490904.6496356101706624, 541850.5094163799658418 7490992.6486446103081107, 542117.9989447799744084 7491067.6498956503346562, 542339.6836309707723558 7491081.8338681170716882, 542340.0139575036009774 7491080.8908742861822248), (542448.3669101102277637 7491085.2667160956189036, 542447.8281487500062212 7491086.2563206022605300, 542645.9278556300560012 7491090.1496953703463078, 542881.8001631699735299 7491216.1593797197565436, 543022.5110186899546534 7491374.6574428202584386, 543093.4196471800096333 7491577.6600298201665282, 543100.6207402900326997 7491755.6605573296546936, 543146.0011632499517873 7491940.1524548903107643, 543242.2113231299445033 7492092.6493198703974485, 543420.5594578799791634 7492167.6605370296165347, 543736.0608669177163392 7492178.8340415228158236, 543736.8605833266628906 7492178.2342887129634619), (543994.7063397207530215 7492105.4846383240073919, 543993.9952419346664101 7492106.2410740470513701, 544164.7493750499561429 7492195.6611232999712229, 544311.5085405800491571 7492303.1592243798077106, 544713.1909174999454990 7492510.6592104202136397, 545414.1404617800144479 7492806.1695769801735878, 545739.0797240600222722 7492931.6574951196089387, 546146.6309219299582765 7493050.6718051703646779, 546566.3691623499616981 7493067.1693900702521205, 547017.7696958100423217 7493033.1687579201534390, 547411.5708465500501916 7492935.1810991801321507, 547824.2799819100182503 7492786.6796223297715187, 548154.3804447900038213 7492676.6903927102684975, 548555.1085242800181732 7492681.1924451002851129, 548956.0910621000220999 7492755.1982696000486612, 549427.3525090899784118 7492886.2018355997279286, 549924.2300843800185248 7493068.2112118601799011, 550000.0000000000000000 7493102.4734313925728202, 550000.0000000000000000 7493101.3759462386369705))', + 'MULTILINESTRING ((520000.0000000000000000 7500333.5864726584404707, 520000.0000000000000000 7500334.5854991283267736, 520251.9812008599983528 7500460.4708616798743606, 520790.4299846600042656 7500582.9693757295608521, 521328.8990372599801049 7500656.4806792000308633, 521537.9934471686137840 7500702.5902975173667073, 521538.7771375657757744 7500701.9694143859669566, 521537.9934471686137840 7500702.5902975173667073), (521826.3962308935006149 7510000.0000000000000000, 521830.2234692216152325 7510000.0000000000000000, 521671.4390298799844459 7509957.0189364701509476, 520790.3393039599759504 7509810.0001919697970152, 520000.0000000000000000 7509619.7119117267429829, 520000.0000000000000000 7509618.6830340670421720, 520000.0000000000000000 7509619.7119117267429829), (532600.3302651896374300 7501627.1083485167473555, 532599.7396073570707813 7501628.1497170943766832, 532856.6521893100580201 7501611.1112058302387595, 533444.0185844299849123 7501684.6103292601183057, 534325.1210312099428847 7501880.1196714900434017, 534985.9214213599916548 7502076.1217858698219061, 535646.8110275299986824 7502516.6302939895540476, 535891.5287010800093412 7502908.1374861896038055, 536013.9019787500146776 7503250.6406890796497464, 536258.6794978299876675 7503520.1420491002500057, 536527.9085336000425741 7503593.6495772004127502, 536992.9320167599944398 7503520.1422608699649572, 537555.8628507399698719 7503544.6488754795864224, 538020.8807973100338131 7503667.1522581996396184, 538755.1426198399858549 7503960.6502358699217439, 539244.6298891199985519 7504132.1499195201322436, 540125.7701951599447057 7504572.6497226702049375, 540762.0786962399724871 7504939.6401027701795101, 541716.5790550899691880 7505698.1617022398859262, 541936.8897461800370365 7506065.6509176101535559, 542157.1883640999440104 7506530.6489702202379704, 542426.4309210999635980 7507142.6610005302354693, 542597.7511561999563128 7507729.6500914199277759, 542622.2203807899495587 7508170.6593472696840763, 542866.9608011499512941 7508635.6476191803812981, 543136.2108244899427518 7508978.1516894698143005, 543283.1098597400123253 7509198.1474713198840618, 543356.4892539000138640 7509687.6487833503633738, 543368.5279655156191438 7510000.0000000000000000, 543369.5268157882383093 7510000.0000000000000000), (542475.7818017150275409 7490825.7722711022943258, 542476.2623097165487707 7490824.8896671906113625, 542121.6113261700375006 7490675.1504720998927951, 541942.0503731799544767 7490540.6584189096465707, 541762.5393725200556219 7490428.6507309796288610, 541605.5117328099440783 7490293.6494011301547289, 541560.6191276300232857 7490159.1616177195683122, 541538.0986778000369668 7490024.6489791097119451, 541545.8831280654994771 7490000.0000000000000000, 541544.8344431390287355 7490000.0000000000000000), (544083.8251957478933036 7491864.6897576972842216, 544084.5100616407580674 7491863.9622678663581610, 543916.8111612600041553 7491662.6594603899866343, 543467.9909774400293827 7491303.6579534802585840, 543288.5212596700293943 7491169.1625096900388598, 543041.6283885700395331 7491034.6487735398113728, 542929.4202479800442234 7490989.6511897603049874, 542705.0600305399857461 7490877.1614052504301071, 542571.8228042328264564 7490858.5011789817363024, 542571.3451686579501256 7490859.3785067796707153), (550000.0000000000000000 7492916.1826057024300098, 550000.0000000000000000 7492915.1826563579961658, 549683.9776767699513584 7492784.7010641396045685, 549457.1530677999835461 7492715.7030614195391536, 549167.8620524300495163 7492627.6976040797308087, 549044.6585097600473091 7492599.7510081203654408, 548674.1506595800165087 7492515.7009411500766873, 548609.5248929499648511 7492518.2924996195361018, 548113.1504889399511740 7492538.1886065695434809, 547800.5016407900257036 7492572.8691065600141883, 547379.9360571899451315 7492619.5098762298002839, 547103.3177899100119248 7492650.1804305203258991, 546676.9415344200097024 7492650.1683770902454853, 546362.8189851900096983 7492582.6708111502230167, 546048.6516915999818593 7492493.1693898700177670, 545734.4392289100214839 7492380.6604282101616263, 545353.0321352999890223 7492201.1703274799510837, 544926.6382374600507319 7492066.6692933803424239, 544724.7222984499530867 7491977.1600893298164010, 544410.5210711299441755 7491797.6681312201544642, 544324.8354344329563901 7491754.6016815919429064, 544324.1489822026342154 7491755.3286254471167922))', + 'MULTILINESTRING ((530271.9887491008266807 7504023.8181659672409296, 530272.8096558250254020 7504022.9626687979325652, 529716.5596407300326973 7503911.6010149903595448, 529213.5023450599983335 7503780.5819101296365261, 528797.9000049700262025 7503627.0802137600257993, 527507.3776305499486625 7503343.0594466198235750, 526960.5505161000182852 7503255.5484263198450208, 526610.5993896899744868 7503255.5402162401005626, 526129.4297748099779710 7503146.0497182803228498, 525298.2094937399961054 7503146.0410827100276947, 524313.9806665199575946 7502993.0200903099030256, 522979.7296735499985516 7502796.0099626500159502, 521973.5802435199730098 7502730.4904361795634031, 520967.4508550300379284 7502533.4807597603648901, 520000.0000000000000000 7502409.3710406739264727, 520000.0000000000000000 7502410.3792356532067060), (520000.0000000000000000 7507850.7456019073724747, 520000.0000000000000000 7507851.7444353895261884, 520459.1205355499987490 7507962.4997558500617743, 521252.5692508600186557 7508095.0084923598915339, 522046.0097163000609726 7508306.5182301895692945, 522495.6195994799491018 7508412.0197906903922558, 523447.7511029100278392 7508491.5316420802846551, 524135.4115040699834935 7508571.0508861597627401, 524796.6501091100508347 7508809.0602384395897388, 525537.1616826100507751 7508888.5604379596188664, 526304.1784057499608025 7509047.0794246401637793, 527150.5723233999451622 7509258.6008259104564786, 527891.1703374399803579 7509549.6305759903043509, 528759.1812102999538183 7509752.1486169397830963, 529408.9095765600213781 7509934.6589543297886848, 529609.4298291478771716 7510000.0000000000000000, 529610.4290333546232432 7510000.0000000000000000), (538922.8089907000539824 7510000.0000000000000000, 538923.8080818294547498 7510000.0000000000000000, 538972.1599029799690470 7509914.6897562900558114, 539114.2378285899758339 7509528.6699069095775485, 539134.5507683800533414 7509041.6695242598652840, 539012.7302670100471005 7508493.1818856503814459, 538586.3296623999485746 7507965.1697401199489832, 538180.2115608500316739 7507599.6715208096429706, 537631.9808313100365922 7507214.1684171101078391, 537428.9305590899894014 7507011.1716584600508213, 537002.5204438799992204 7506686.1613326398655772, 536616.7715214400086552 7506544.1692011002451181, 535743.6882477200124413 7506361.1594366002827883, 534931.5578075499506667 7506158.1588880904018879, 534038.1795864100567997 7505813.1479306500405073, 533489.9179332499625161 7505488.1394624896347523, 533022.9010144800413400 7505082.1303953798487782, 532495.0114416599972174 7504737.1207175096496940, 531906.1711659600259736 7504513.6188210602849722, 530728.5093100100057200 7504046.6094597103074193, 530502.3308432935737073 7503928.6902586026117206, 530501.6387504261219874 7503929.4114401936531067), (549037.6348608708940446 7490000.0000000000000000, 549036.4332247237907723 7490000.0000000000000000, 549043.9079029599670321 7490011.2185191400349140, 549204.8611184799810871 7490100.2200202103704214, 549687.5501057700021192 7490279.2203355301171541, 550000.0000000000000000 7490413.2414639443159103, 550000.0000000000000000 7490412.1533525427803397))', + ] +) +bc_gdf = geopandas.GeoDataFrame(basal_c, geometry=bc_geoms, crs='EPSG:28350') + +structures = pandas.DataFrame( + { + 'ID': [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], + 'DIPDIR': [190.0, 190.0, 0.0, 330.0, 165.0, 150.0, 180.0, 210.0, 240.0, 270.0, 300.0], + 'DIP': [55, 55, 15, 15, 0, 45, 30, 20, 10, 5, 50], + 'OVERTURNED': [False] * 11, + 'BEDDING': [False] * 11, + 'X': [ + 548279.320612, + 548249.155883, + 546137.857561, + 543754.180680, + 520512.912720, + 528512.912720, + 529512.912720, + 530512.912720, + 531512.912720, + 532512.912720, + 533512.912720, + ], + 'Y': [ + 7.493304e06, + 7.493512e06, + 7.494607e06, + 7.504599e06, + 7.497506e06, + 7.497806e06, + 7.498506e06, + 7.499506e06, + 7.500506e06, + 7.501506e06, + 7.502506e06, + ], + 'Z': [543.0, 543.0, 532.0, 559.0, 503.0, 553.0, 563.0, 573.0, 583.0, 593.0, 603.0], + 'layerID': [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2], + } +) + +# sampled contacts + +IDS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, +] +X = [ + 520000.0, + 520992.6699257682, + 521984.6869456721, + 522969.6388939231, + 523954.5908421741, + 524942.1013152138, + 525930.4850180566, + 526908.535657469, + 527891.805258285, + 528880.6323520339, + 529855.6352847969, + 530832.075832642, + 531813.1634102948, + 532804.1384816798, + 533019.2882480841, + 532243.2409444518, + 531376.1445685071, + 530480.68269627, + 529612.3980015446, + 528734.9447395488, + 527783.6457775467, + 526804.9871671252, + 525809.8226356399, + 524816.1487769039, + 523829.21986169985, + 522842.8215091018, + 521858.22077695775, + 520000.0, + 520979.22944531543, + 521963.40533887857, + 522941.7587850634, + 523934.147302897, + 524925.392627546, + 525924.0314485825, + 526915.8477737093, + 527895.0821625991, + 528872.0657047849, + 529800.4947308041, + 530625.584657682, + 531569.6370222451, + 532437.052847155, + 533287.2652070294, + 534152.4134851344, + 535068.2792519473, + 535460.6891555252, + 536224.4983751376, + 533429.9102329265, + 532481.4641957916, + 531544.0571021343, + 530594.6994174849, + 529610.6855646572, + 528622.769870241, + 527649.2613247755, + 526678.2236776681, + 525700.529526533, + 524727.502968803, + 523736.1966217523, + 522758.8160138651, + 521787.52440495713, + 520000.0, + 523032.43525349256, + 522075.0050621681, + 521094.2495766504, + 521279.9150416324, + 527953.219881957, + 528932.1661473936, + 529931.0489500397, + 530926.9444223469, + 532471.3224294331, + 533451.0808071761, + 534430.5181256596, + 535259.9903455864, + 535733.754706194, + 536530.414399986, + 537520.9367684029, + 538483.8842249501, + 539416.5488248907, + 540254.201848269, + 541073.3185078846, + 541731.634304068, + 542111.7328311033, + 542153.227246826, + 542648.3360907623, + 544273.9324713233, + 550000.0, + 549046.9473048343, + 548047.5904092644, + 547052.7023355255, + 546066.4155333972, + 520000.0, + 520977.906499162, + 521972.6466978357, + 522950.7862194081, + 523930.86647590954, + 524922.3632146807, + 525917.7966582401, + 522351.1343196252, + 527125.4548547225, + 526128.5235193562, + 525130.7081813341, + 524144.8882983563, + 530798.8710058356, + 529837.3189358161, + 528901.4390783398, + 539955.974375356, + 540509.7202600716, + 540554.4697958604, + 540124.5665895239, + 539457.7385073705, + 538609.0930945011, + 537650.6482494324, + 536662.2132646953, + 535670.9952466968, + 534702.7550180865, + 533831.4503084399, + 533061.3425394666, + 532157.7972663342, + 546233.0059536607, + 546906.7057886998, + 547857.5988940151, + 548844.1779325017, + 523381.48903560604, + 522468.0997263235, + 521503.9257619144, + 525280.9678179419, + 534272.9718145289, + 533289.726130804, + 532311.6002925185, + 531314.2350300908, + 530343.2573956609, + 529404.0267836585, + 528406.8877962828, + 527408.438540811, + 526416.4831948339, + 547423.9512601104, + 546818.8696391915, + 546751.8787156106, + 546564.3507434212, + 545942.2297277196, + 545512.8225309709, + 544971.65760404, + 544429.4936548981, + 543746.9451913793, + 543030.8690031096, + 542256.0397376382, + 541457.6565650662, + 540552.3950139998, + 539652.2355835018, + 538839.7378067289, + 537990.4340473542, + 537007.3752328141, + 536022.1700130996, + 537417.0468347219, + 538156.4071117863, + 539076.4825414991, + 539863.903717873, + 541996.2659877514, + 542624.1105710816, + 543421.4023585871, + 544400.4790130118, + 545389.5363446891, + 546360.828213827, + 547201.2564344314, + 548117.0745406685, + 524266.09546261415, + 525089.486889288, + 528242.3239959123, + 529217.7910440405, + 530038.4913963537, + 522423.15070457, + 521427.2884053698, + 522555.9904544321, + 529030.4932832464, + 528038.4263267842, + 527038.5688849417, + 526038.746341665, + 532993.0805511009, + 532003.260610268, + 531009.5137000929, + 530011.0692840518, + 545728.9288492671, + 545228.7527245631, + 544793.6165900896, + 544324.0658601674, + 543757.1054321213, + 543343.5919286992, + 542816.8120473484, + 541997.2329619491, + 541153.4587884084, + 540302.4609239949, + 539458.859568292, + 538484.4409203371, + 537531.6718874933, + 537267.7621267324, + 536473.9828749119, + 535486.8616121166, + 534501.006691062, + 540652.709349222, + 541131.4261559306, + 542310.5385527068, + 543285.3188949242, + 544247.7959926978, + 545089.9263310316, + 546087.6202142882, + 547077.7264906017, + 548075.363336421, + 549059.0245534881, + 524193.8328189907, + 527905.8476731717, + 526978.3198189315, + 525983.1425512254, + 522198.701020318, + 521204.9277157221, + 532860.9091847165, + 531863.5053478461, + 530864.0956853683, + 529864.8572444214, + 544737.4093717508, + 544569.3339346765, + 544327.771360188, + 543863.477011355, + 543275.0341084594, + 542715.4199777856, + 542093.6525093828, + 541285.7709317384, + 540449.5406616033, + 539551.5492211859, + 538610.5312377414, + 537640.4148034687, + 536770.6743346298, + 536686.2888205624, + 536054.8844726445, + 535061.7313647007, + 534070.1286353774, + 540991.614522323, + 542448.3669101102, + 543994.7063397208, + 544871.8490877205, + 545799.7056238599, + 546784.2744169813, + 547750.3419044648, + 548724.9651694401, + 520000.0, + 521826.3962308935, + 532600.3302651896, + 533589.8503320153, + 534561.7759873917, + 535449.8915779426, + 535993.0214361007, + 536819.0801195968, + 537807.793036829, + 538744.8306413345, + 539665.2325617559, + 540546.0055358304, + 541349.6936467969, + 541980.9483774537, + 542394.1133221515, + 542614.8288802537, + 543077.7762354391, + 542475.781801715, + 544083.8251957479, + 550000.0, + 549053.1439277239, + 548063.5281953025, + 547069.414890058, + 546087.5377901661, + 530271.9887491008, + 529298.9639373667, + 528340.209952825, + 527361.9910066663, + 526373.1685692647, + 525379.3992484873, + 524390.3065754601, + 523401.1210929096, + 522406.9032212814, + 521418.36474354746, + 520000.0, + 520978.6362345788, + 521950.47117176966, + 522933.3988561018, + 523928.4054918701, + 524884.9875455543, + 525874.1190162523, + 526848.2966478025, + 527791.3040361393, + 538922.8089907, + 539134.0778793262, + 538736.0836775531, + 538004.1174260699, + 537223.7768297916, + 536312.6322191659, + 535337.4942052161, + 534389.0342257542, + 533501.4998407771, + 532715.1008693202, + 531806.479694858, + 549037.6348608709, +] +Y = [ + 7506463.058931708, + 7506576.346475119, + 7506700.1649271855, + 7506872.99333815, + 7507045.821749114, + 7507202.956357559, + 7507354.44495147, + 7507562.8122875495, + 7507744.951704663, + 7507892.96504778, + 7508104.092849379, + 7508311.6272335, + 7508501.976685256, + 7508504.460999884, + 7507684.484812225, + 7507085.842450439, + 7506588.057267194, + 7506144.839214603, + 7505654.042415291, + 7505177.516716159, + 7504892.17995596, + 7504686.687074701, + 7504603.854204072, + 7504503.098141689, + 7504341.941955539, + 7504177.672377438, + 7504002.8541911375, + 7503245.259859091, + 7503436.728206725, + 7503611.222655113, + 7503811.172638808, + 7503933.967406592, + 7504066.000381116, + 7504086.539427338, + 7504206.419975162, + 7504405.812567679, + 7504618.483028057, + 7504899.302718434, + 7505410.872728581, + 7505727.305923727, + 7506201.128560977, + 7506724.563539154, + 7507220.081115803, + 7507612.996219244, + 7508505.040226217, + 7509135.469929169, + 7510000.0, + 7509704.59876308, + 7509356.363295672, + 7509042.9372015195, + 7508868.599440474, + 7508713.626424883, + 7508491.404999385, + 7508254.175495736, + 7508044.257347997, + 7507813.564222933, + 7507689.029948036, + 7507479.73426719, + 7507242.659510909, + 7500803.4896762185, + 7510000.0, + 7509752.2424489865, + 7509557.913698296, + 7501034.634496278, + 7501611.124154025, + 7501788.582382207, + 7501832.072807334, + 7501874.753115009, + 7501854.802179787, + 7501993.852453728, + 7502194.603011602, + 7502736.52101189, + 7503605.470838049, + 7504102.310629672, + 7503995.998654295, + 7504162.548298732, + 7504522.438259361, + 7505048.271868659, + 7505609.690332235, + 7506352.909638542, + 7507272.811883032, + 7508259.448754307, + 7509066.146225987, + 7491662.855160554, + 7492637.949197558, + 7492365.294641344, + 7492343.195849396, + 7492425.974104291, + 7492294.881093971, + 7508845.720669018, + 7509050.10324461, + 7509000.757492466, + 7509194.807969997, + 7509393.409809908, + 7509493.696517873, + 7509580.778152611, + 7501916.1655494, + 7502377.774781606, + 7502376.385050711, + 7502389.230930838, + 7502221.572623042, + 7503475.2625857005, + 7503209.079556105, + 7502871.602548231, + 7510000.0, + 7509197.116898042, + 7508256.250238412, + 7507364.330453778, + 7506624.831329774, + 7506116.551366933, + 7505849.401377124, + 7505705.229350432, + 7505578.685761046, + 7505339.114590024, + 7504851.858361741, + 7504235.464249766, + 7503807.926211051, + 7490000.0, + 7490632.5934013035, + 7490931.629951538, + 7491082.825264233, + 7498414.247334903, + 7498022.163648057, + 7497778.683655275, + 7499008.503536563, + 7499007.862999017, + 7499166.809369003, + 7499342.672418874, + 7499404.581849788, + 7499607.193046319, + 7499409.181598686, + 7499342.398484021, + 7499289.594081205, + 7499167.5240981905, + 7510000.0, + 7509254.772409647, + 7508259.427108908, + 7507280.617024052, + 7506546.4275029935, + 7505645.278178703, + 7504804.447980701, + 7503964.813485547, + 7503240.48427183, + 7502543.425302152, + 7501911.2681202525, + 7501310.361086443, + 7500889.459500117, + 7500454.516031106, + 7499884.737649882, + 7499387.224113458, + 7499210.211525513, + 7499047.019637048, + 7490706.05210895, + 7491653.361597963, + 7492310.636501358, + 7492912.724049956, + 7493323.250750658, + 7494099.582786533, + 7494682.93982123, + 7494844.964517663, + 7494717.975402998, + 7494868.223497515, + 7495407.3541522715, + 7495771.872569879, + 7490000.0, + 7490560.701632605, + 7492064.722272471, + 7491904.289302209, + 7491338.4112052, + 7499760.717626198, + 7499723.154391495, + 7499746.544444192, + 7500200.705866932, + 7500238.3134670025, + 7500228.5316139795, + 7500222.315208985, + 7500834.640376496, + 7500780.822571908, + 7500675.103396037, + 7500715.487725784, + 7510000.0, + 7509145.739106326, + 7508252.316578914, + 7507374.160168251, + 7506552.029851974, + 7505642.489778755, + 7504802.59176734, + 7504230.642840398, + 7503695.190221784, + 7503174.1096064225, + 7502644.083926628, + 7502464.589954097, + 7502223.052264384, + 7501311.038411527, + 7500760.731710168, + 7500717.160069187, + 7500865.774257174, + 7490387.598747078, + 7491245.724857572, + 7491467.516614238, + 7492641.868488729, + 7492862.716044601, + 7493359.487961125, + 7493417.977361985, + 7493290.396821679, + 7493232.414779238, + 7493379.023244919, + 7500431.1064537205, + 7501050.467118945, + 7500734.366883766, + 7500642.3056855835, + 7500076.008830209, + 7500028.234047118, + 7501127.377606143, + 7501090.091638437, + 7501109.731843927, + 7501135.069368409, + 7510000.0, + 7509043.874690335, + 7508080.057040733, + 7507197.428797968, + 7506390.922978456, + 7505562.805840937, + 7504779.60394153, + 7504197.023577066, + 7503648.645117141, + 7503208.680546424, + 7502884.853275787, + 7503057.40301376, + 7502931.162530749, + 7501939.632101527, + 7501282.496918272, + 7501241.235538427, + 7501112.3494773, + 7490051.910415043, + 7491085.266716096, + 7492105.484638324, + 7492577.547240268, + 7492949.361650263, + 7493050.756214061, + 7492813.284106591, + 7492712.54139396, + 7500333.586472658, + 7510000.0, + 7501627.108348517, + 7501716.96918736, + 7501950.3146539405, + 7502385.375857322, + 7503192.199394774, + 7503547.6234244285, + 7503611.016851668, + 7503956.5283480855, + 7504342.417675098, + 7504815.020093556, + 7505406.605492606, + 7506158.648222525, + 7507069.200253583, + 7508037.442205912, + 7508903.818976895, + 7490825.772271102, + 7491864.689757697, + 7492916.182605702, + 7492601.675778644, + 7492543.692947827, + 7492650.179472104, + 7492504.2474401975, + 7504023.818165967, + 7503802.840013571, + 7503526.350863925, + 7503319.79261976, + 7503201.512659313, + 7503146.041926193, + 7503004.886707106, + 7502858.230922394, + 7502758.70803037, + 7502621.773975609, + 7507850.745601907, + 7508049.260711595, + 7508281.05024187, + 7508448.578437336, + 7508547.11325418, + 7508818.54401165, + 7508958.199252176, + 7509183.0594342025, + 7509510.386527048, + 7510000.0, + 7509039.540376887, + 7508150.610234313, + 7507475.846219083, + 7506854.803228106, + 7506480.417593711, + 7506259.626961826, + 7505948.643392906, + 7505495.005195306, + 7504880.9632680155, + 7504474.085528871, + 7490000.0, +] +Z = [ + 533.0, + 533.0, + 540.0, + 540.0, + 549.0, + 550.0, + 556.0, + 558.0, + 568.0, + 571.0, + 582.0, + 586.0, + 593.0, + 598.0, + 591.0, + 582.0, + 569.0, + 565.0, + 563.0, + 556.0, + 554.0, + 549.0, + 543.0, + 537.0, + 535.0, + 531.0, + 525.0, + 518.0, + 528.0, + 536.0, + 538.0, + 531.0, + 539.0, + 544.0, + 546.0, + 551.0, + 556.0, + 562.0, + 571.0, + 574.0, + 575.0, + 581.0, + 586.0, + 601.0, + 609.0, + 619.0, + 609.0, + 606.0, + 597.0, + 588.0, + 581.0, + 574.0, + 569.0, + 563.0, + 561.0, + 556.0, + 553.0, + 542.0, + 539.0, + 640.0, + 577.0, + 601.0, + 584.0, + 629.0, + 561.0, + 562.0, + 600.0, + 658.0, + 660.0, + 767.0, + 778.0, + 724.0, + 772.0, + 739.0, + 791.0, + 812.0, + 675.0, + 649.0, + 690.0, + 670.0, + 682.0, + 761.0, + 804.0, + 629.0, + 582.0, + 596.0, + 585.0, + 611.0, + 634.0, + 650.0, + 594.0, + 558.0, + 607.0, + 578.0, + 599.0, + 594.0, + 551.0, + 555.0, + 558.0, + 553.0, + 561.0, + 590.0, + 578.0, + 560.0, + 667.0, + 656.0, + 649.0, + 638.0, + 631.0, + 623.0, + 623.0, + 615.0, + 608.0, + 607.0, + 602.0, + 602.0, + 606.0, + 643.0, + 617.0, + 594.0, + 572.0, + 504.0, + 484.0, + 497.0, + 503.0, + 507.0, + 521.0, + 521.0, + 520.0, + 512.0, + 506.0, + 502.0, + 502.0, + 504.0, + 598.0, + 575.0, + 580.0, + 564.0, + 567.0, + 555.0, + 540.0, + 539.0, + 552.0, + 537.0, + 527.0, + 532.0, + 547.0, + 534.0, + 521.0, + 496.0, + 516.0, + 503.0, + 510.0, + 503.0, + 532.0, + 529.0, + 566.0, + 528.0, + 555.0, + 558.0, + 533.0, + 535.0, + 547.0, + 538.0, + 600.0, + 549.0, + 465.0, + 533.0, + 521.0, + 536.0, + 561.0, + 559.0, + 583.0, + 560.0, + 533.0, + 556.0, + 544.0, + 561.0, + 560.0, + 543.0, + 691.0, + 719.0, + 667.0, + 642.0, + 621.0, + 640.0, + 625.0, + 598.0, + 614.0, + 585.0, + 596.0, + 636.0, + 634.0, + 571.0, + 561.0, + 534.0, + 565.0, + 552.0, + 573.0, + 585.0, + 546.0, + 547.0, + 555.0, + 540.0, + 543.0, + 544.0, + 551.0, + 545.0, + 546.0, + 544.0, + 555.0, + 546.0, + 529.0, + 541.0, + 569.0, + 553.0, + 561.0, + 681.0, + 646.0, + 639.0, + 619.0, + 612.0, + 602.0, + 600.0, + 591.0, + 579.0, + 580.0, + 602.0, + 593.0, + 585.0, + 570.0, + 552.0, + 554.0, + 560.0, + 636.0, + 602.0, + 600.0, + 608.0, + 591.0, + 585.0, + 573.0, + 571.0, + 581.0, + 564.0, + 625.0, + 650.0, + 664.0, + 608.0, + 635.0, + 644.0, + 659.0, + 812.0, + 616.0, + 611.0, + 622.0, + 629.0, + 677.0, + 641.0, + 647.0, + 602.0, + 600.0, + 603.0, + 582.0, + 573.0, + 591.0, + 634.0, + 573.0, + 566.0, + 554.0, + 549.0, + 545.0, + 549.0, + 550.0, + 550.0, + 543.0, + 532.0, + 545.0, + 546.0, + 544.0, + 549.0, + 551.0, + 568.0, + 577.0, + 580.0, + 584.0, + 629.0, + 628.0, + 617.0, + 609.0, + 600.0, + 594.0, + 591.0, + 594.0, + 592.0, + 596.0, + 592.0, + 579.0, +] +featureid = [ + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '0', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '7', + '7', + '7', + '7', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '6', + '6', + '6', + '6', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '8', + '8', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '0', + '0', + '2', + '2', + '2', + '0', + '0', + '1', + '2', + '2', + '2', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '5', + '5', + '6', + '7', + '7', + '7', + '7', + '7', + '7', + '7', + '0', + '1', + '1', + '1', + '0', + '0', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '0', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', +] + +s_c = pandas.DataFrame({'X': X, 'Y': Y, 'Z': Z, 'featureId': featureid}) + + +############################ +### TEST StructuralPoint ### +############################ + +geology = load_hamersley_geology() +geology.rename(columns={'unitname': 'UNITNAME', 'code': 'CODE'}, inplace=True) + + +def check_thickness_values(result, column, description): + for order, position in [ + (max(st_units['stratigraphic_Order']), 'bottom'), + (min(st_units['stratigraphic_Order']), 'top'), + ]: + assert ( + result[result['stratigraphic_Order'] == order][column].values == -1 + ), f"StructuralPoint: {position} unit not assigned as -1 ({description})" + + +def test_calculate_thickness_structural_point(): + # Run the calculation + thickness_calculator = StructuralPoint(is_strike=False) + + md = MapData() + md.sampled_contacts = s_c + md.raw_data[Datatype.GEOLOGY] = geology + md.load_map_data(Datatype.GEOLOGY) + md.check_map(Datatype.GEOLOGY) + md.parse_geology_map() + + result = thickness_calculator.compute( + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + geology_data=md.get_map_data(Datatype.GEOLOGY), + sampled_contacts=md.sampled_contacts, + ) + + # is thickness calc alpha the label? + assert ( + thickness_calculator.thickness_calculator_label == 'StructuralPoint' + ), 'StructuralPoint: thickness calculator name not set correctly' + + # is the result a pandas dataframe? + assert isinstance(result, pandas.DataFrame), 'StructuralPoint result not a pandas DataFrame' + + # Check if there is mean, std, and median in results + required_columns = ['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev'] + for column in required_columns: + assert column in result.columns, f'{column} not in StructuralPoint result' + + # check if all units are in the results + assert 'name' in result.columns, 'unit_name not in StructuralPoint result' + assert all( + name in result['name'].values for name in st_units['name'].values + ), 'units missing from in StructuralPoint result' + + # are bottom and top units being assigned -1 + for column, description in [ + ('ThicknessMean', 'mean'), + ('ThicknessMedian', 'median'), + ('ThicknessStdDev', 'std dev'), + ]: + check_thickness_values(result, column, description) + + # are the dtypes numpy.float? + for column in required_columns: + assert ( + result[column].dtype == numpy.float64 + ), f'StructuralPoint: result column {column} not numpy.float64' + + # check for nans in the results + for column in required_columns: + assert ( + not result[column].isnull().values.any() + ), f'StructuralPoint: result column {column} has NaN values' diff --git a/packages/map2loop/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py b/packages/map2loop/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py new file mode 100644 index 000000000..ba740a18e --- /dev/null +++ b/packages/map2loop/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py @@ -0,0 +1,1714 @@ +import pandas +import geopandas +import numpy + +from map2loop.mapdata import MapData +from map2loop.m2l_enums import Datatype +from map2loop.thickness_calculator import ThicknessCalculatorAlpha +from map2loop.utils.load_map2loop_data import load_hamersley_geology + + +######################################################### +### Define the test data for ThicknessCalculatorAlpha ### +######################################################### + +# Sample stratigraphic units data +st_units = pandas.DataFrame( + { + 'Unnamed: 0': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10], + 'layerId': [7, 0, 10, 8, 1, 5, 9, 4, 3, 2, 6], + 'name': [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + ], + 'minAge': [0.0] * 11, + 'maxAge': [100000.0] * 11, + 'group': [None] * 11, + 'supergroup': [None] * 11, + 'ThicknessMean_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessMedian_ThicknessCalculatorAlpha': [0.0] * 11, + 'ThicknessStdDev_ThicknessCalculatorAlpha': [0.0] * 11, + 'stratigraphic_Order': list(range(11)), + 'colour': [ + '#5d7e60', + '#387866', + '#628304', + '#a2f290', + '#0c2562', + '#5fb3c5', + '#f48b70', + '#1932e2', + '#106e8a', + '#d0d47c', + '#e7f2f3', + ], + } +) + +st_column = [ + 'Turee_Creek_Group', + 'Boolgeeda_Iron_Formation', + 'Woongarra_Rhyolite', + 'Weeli_Wolli_Formation', + 'Brockman_Iron_Formation', + 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', + 'Wittenoom_Formation', + 'Marra_Mamba_Iron_Formation', + 'Jeerinah_Formation', + 'Bunjinah_Formation', + 'Pyradie_Formation', + 'Fortescue_Group', +] + +# 3. map_data.basal_contacts +basal_c = [ + {'ID': 0, 'basal_unit': 'Turee_Creek_Group', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Boolgeeda_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Brockman_Iron_Formation', 'type': 'BASAL'}, + {'ID': 1, 'basal_unit': 'Weeli_Wolli_Formation', 'type': 'BASAL'}, + {'ID': 4, 'basal_unit': 'Jeerinah_Formation', 'type': 'BASAL'}, + {'ID': 5, 'basal_unit': 'Bunjinah_Formation', 'type': 'BASAL'}, + {'ID': 6, 'basal_unit': 'Marra_Mamba_Iron_Formation', 'type': 'BASAL'}, + {'ID': 7, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 8, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'ABNORMAL'}, + {'ID': 9, 'basal_unit': 'Wittenoom_Formation', 'type': 'BASAL'}, + {'ID': 10, 'basal_unit': 'Mount_McRae_Shale_and_Mount_Sylvia_Formation', 'type': 'BASAL'}, + {'ID': 11, 'basal_unit': 'Woongarra_Rhyolite', 'type': 'BASAL'}, +] +bc_geoms = geopandas.GeoSeries.from_wkt( + [ + 'MULTILINESTRING ((520000.0000000000000000 7506463.0589317083358765, 520000.0000000000000000 7506464.0583261400461197, 521798.5784270099829882 7506667.5086746597662568, 524292.0583883899962530 7507105.0368000296875834, 525888.7772752699675038 7507345.5593877695500851, 526916.8410634599858895 7507564.5817003501579165, 528098.0088455299846828 7507783.0997126800939441, 529344.8316910399589688 7507958.1297348998486996, 530263.5311044099507853 7508220.6498684398829937, 531357.2706492099678144 7508395.6678343201056123, 532013.4010351699544117 7508548.6697535198181868, 532538.3520777500234544 7508548.6775182196870446, 532932.1086069300072268 7508483.1717491699382663, 533085.1519033299991861 7508308.1688938299193978, 533107.0194513100432232 7508045.6694244500249624, 533041.4099823100259528 7507717.6704597100615501, 532866.4200693099992350 7507455.1614942299202085, 531685.2195994600187987 7506755.1383216800168157, 530875.8998375800438225 7506317.6329081403091550, 530175.9800506900064647 7506011.6195486104115844, 529279.1401694599771872 7505442.5995908901095390, 528426.1115621499484405 7505027.0810785600915551, 526654.3696992900222540 7504655.0613197097554803, 525210.7310010100482032 7504567.5296983895823359, 523067.1991962700267322 7504217.5111659299582243, 521098.6489177999901585 7503867.9904129095375538, 520414.0195790100260638 7503782.4897812502458692, 520000.0000000000000000 7503710.2290291301906109, 520000.0000000000000000 7503711.2441460378468037))', + 'MULTILINESTRING ((520000.0000000000000000 7503245.2598590906709433, 520000.0000000000000000 7503246.2595371659845114, 520271.9002807399956509 7503274.9797609802335501, 520982.5192159600555897 7503437.4804947897791862, 521754.8289336899761111 7503561.4991028197109699, 522673.5081250499933958 7503780.5075413398444653, 523439.0304306600592099 7503868.0182901099324226, 525079.5116741600213572 7504086.5288977697491646, 526041.9114880500128493 7504086.5408970797434449, 527157.4277337800012901 7504239.5578404404222965, 528710.4300827099941671 7504589.5780827598646283, 529322.8810412200400606 7504699.1013501295819879, 529519.7383159700548276 7504721.1013953704386950, 529782.1897067499812692 7504852.1116183400154114, 529846.5792647199705243 7505018.1105302302166820, 530434.1504480800358579 7505322.1195039302110672, 531001.4219496899750084 7505585.1193884601816535, 531730.7807765699690208 7505767.6295145899057388, 531892.8382770799798891 7505828.6311367200687528, 532231.0984191700117663 7506036.1303443796932697, 532535.6622749799862504 7506280.1284634796902537, 533205.6884558700257912 7506665.6397261302918196, 533571.2115816300502047 7506929.6612275000661612, 534139.7121901500504464 7507214.1599170295521617, 534444.3105956399813294 7507356.1602175496518612, 534769.1609872799599543 7507478.1677699098363519, 534911.2916754200123250 7507518.6696750596165657, 535114.3212854999583215 7507640.6607389999553561, 535236.1208061299985275 7507823.1785498997196555, 535358.0217514700489119 7508351.1807611100375652, 535520.5093329700175673 7508594.6879638703539968, 535743.8194368999684229 7508818.1783391702920198, 536007.7499623399926350 7508980.6794774401932955, 536576.2579947899794206 7509386.6783681297674775, 536718.4177284899633378 7509630.1906582303345203, 536637.2394275299739093 7509975.6913913199678063, 536604.7901494553079829 7510000.0000000000000000, 536606.4580603817012161 7510000.0000000000000000), (533429.9102329264860600 7510000.0000000000000000, 533432.8839227686403319 7510000.0000000000000000, 533307.4205499000381678 7509955.1997412098571658, 532718.6210473099490628 7509792.6996827302500606, 531297.2519883899949491 7509264.6781625803560019, 530525.7001818099524826 7509021.1595332501456141, 529551.0197801099857315 7508858.6513834102079272, 528251.4977760600158945 7508655.6207956997677684, 527134.7110856899525970 7508351.0991824995726347, 525794.5900796599453315 7508066.5579961901530623, 524596.6507077199639753 7507782.5406945496797562, 523662.6590976800071076 7507681.0381808001548052, 522830.1799164600088261 7507498.0297148795798421, 522038.3083402099437080 7507295.0188862504437566, 520677.9482569899992086 7507010.9990820102393627, 520000.0000000000000000 7506956.5663501676172018, 520000.0000000000000000 7506957.5695682624354959), (550000.0000000000000000 7490095.5414067916572094, 550000.0000000000000000 7490094.5419130371883512, 549848.4078108200337738 7490011.2184614501893520, 549837.1990841374499723 7490000.0000000000000000, 549836.1991053668316454 7490000.0000000000000000))', + 'MULTILINESTRING ((520000.0000000000000000 7500803.4896762184798717, 520000.0000000000000000 7500804.4889609171077609, 520473.5791580000077374 7500907.4720744201913476, 521144.7272773912409320 7501014.1576358489692211, 521145.5101736339274794 7501013.5373818902298808), (523032.4352534925565124 7510000.0000000000000000, 523034.2386217917664908 7510000.0000000000000000, 522935.2510594900231808 7509934.0400712601840496, 521858.9592969599762000 7509706.5850364100188017, 521402.0897869099862874 7509610.0089996904134750, 520906.0067273600143380 7509526.0576650602743030, 520005.1707852099789307 7509373.5673304200172424, 520000.0000000000000000 7509372.6918550245463848, 520000.0000000000000000 7509373.7060850486159325), (521279.9150416324264370 7501034.6344962781295180, 521278.8505533785792068 7501035.4778430974110961, 521543.4397763700108044 7501077.5368893602862954, 522373.8810591999790631 7501209.4896944900974631, 523030.4162207188783213 7501391.7815449377521873, 523031.2068098201416433 7501391.1711508315056562), (527953.2198819570476189 7501611.1241540247574449, 527952.4394709372427315 7501611.9876126917079091, 527953.2198819570476189 7501611.1241540247574449, 528269.5491108499700204 7501675.5494663203135133, 528644.5797393700340763 7501769.5606017401441932, 529113.4114604999776930 7501800.5704611297696829, 529800.9698748099617660 7501832.0698146400973201, 530707.2799876299686730 7501832.0906658703461289, 531832.3692170899594203 7502050.6015144297853112, 532080.1110293077072129 7502146.1749884476885200, 532080.7953341902466491 7502145.4462257148697972), (532471.3224294331157580 7501854.8021797873079777, 532470.6117427451536059 7501856.0567162586376071, 532551.2005992300109938 7501832.0981646096333861, 533020.0292473699664697 7501925.6022116597741842, 533613.8304010899737477 7502019.6212948998436332, 534488.9388966499827802 7502207.1201175795868039, 534926.4299064800143242 7502457.1309860097244382, 535239.0000169699778780 7502707.1384293204173446, 535551.5432611800497398 7503144.6412358498200774, 535676.5302752000279725 7503519.6384271895512938, 535926.5516183800064027 7503894.6519359098747373, 536270.3683300199918449 7504082.1422335496172309, 536676.5897916300455108 7504113.6475562499836087, 536989.1799710299819708 7504051.1521394196897745, 537895.5108797400025651 7503957.1480598496273160, 538364.2599795899586752 7504113.6601144503802061, 539051.8112280699424446 7504394.6494075302034616, 539676.8889227600302547 7504613.6505787996575236, 540145.7008413899457082 7504988.6477605598047376, 540770.7923636999912560 7505332.1517110802233219, 541145.7601316999644041 7505676.1485500596463680, 541614.6014505899511278 7506144.6516708899289370, 541895.8687167000025511 7506645.1619760403409600, 542145.9084491999819875 7508332.6592682404443622, 542239.6581270300084725 7508645.1607529902830720, 542458.4708741100039333 7508957.6600440395995975, 542677.2416874299524352 7509082.6624572100117803, 542864.7195600100094453 7509239.1611510002985597, 542927.2699991799890995 7509989.1508510801941156, 542927.2698631049133837 7510000.0000000000000000, 542928.2698600001167506 7510000.0000000000000000), (542679.7431424340466037 7490560.7071135109290481, 542680.4317333664512262 7490559.9283441118896008, 542592.3105463000247255 7490517.6513492902740836, 542387.8711325100157410 7490321.1590552795678377, 542278.4307441100245342 7490048.1597586404532194, 542272.8549225005554035 7490000.0000000000000000, 542271.8556170752272010 7490000.0000000000000000), (544273.9324713232927024 7491662.8551605539396405, 544274.6237809687154368 7491662.1230727611109614, 544238.3782646199688315 7491635.1603938303887844, 544135.6185495100216940 7491432.1611171104013920, 543918.3223162599606439 7491197.6698569804430008, 543420.6783191299764439 7490869.6585929403081536, 543038.3205035700229928 7490699.6702497899532318, 542815.3584537300048396 7490624.6607478400692344, 542773.7009090904612094 7490604.6751364599913359, 542773.0674823645967990 7490605.4474027175456285), (550000.0000000000000000 7492637.9491975577548146, 550000.0000000000000000 7492636.9501683469861746, 549769.4085893699666485 7492521.7100056502968073, 549501.4603817999595776 7492462.1984654497355223, 549174.0184454700211063 7492372.7009732704609632, 548668.0100578600540757 7492343.2083122497424483, 547774.9591860000509769 7492343.1903728395700455, 547358.2082652900135145 7492402.6892563700675964, 546971.2795143900439143 7492432.1799347596243024, 546524.7789019900374115 7492402.6676745600998402, 546018.6897931500570849 7492283.6581326704472303, 545304.2811550099868327 7491926.1592656997963786, 545036.3909502900205553 7491777.1605294896289706, 544828.0104751100298017 7491628.6593068800866604, 544708.9605470900423825 7491509.6700969301164150, 544618.5316022647311911 7491404.1884233895689249, 544617.8842772342031822 7491404.9697802281007171))', + 'MULTILINESTRING ((520293.4320175029570237 7501708.4171284157782793, 520293.4981995084672235 7501707.4205201249569654, 520000.0000000000000000 7501674.5829317998141050, 520000.0000000000000000 7501675.5891712857410312), (520000.0000000000000000 7508845.7206690181046724, 520000.0000000000000000 7508846.7200987627729774, 520052.9280038099968806 7508862.0008838102221489, 521090.5512352299992926 7509073.0105239599943161, 522005.9512440299731679 7508998.0294947298243642, 522324.3404851399827749 7509085.0209561996161938, 522451.5710224300273694 7509097.0301381601020694, 522591.6214781600283459 7509122.0274216998368502, 524151.1692813800182194 7509438.0516055300831795, 524456.6897462300257757 7509487.5595593899488449, 525140.4391166700515896 7509496.5704689295962453, 526119.0513356799492612 7509602.5791763495653868, 527124.1199973500333726 7509920.1001460999250412, 527347.8288250340847299 7510000.0000000000000000, 527348.8276206540176645 7510000.0000000000000000), (522351.1343196252128109 7501916.1655494002625346, 522352.2528255800134502 7501915.3037830777466297, 521104.1391963799833320 7501751.4809457501396537, 520737.7721352900261991 7501723.9786810996010900, 520420.9591136300005019 7501715.1471717469394207, 520420.1756578796193935 7501715.7678689807653427), (527125.4548547224840149 7502377.7747816061601043, 527126.3209163650171831 7502376.8168430794030428, 526700.8509709000354633 7502355.5393781904131174, 525246.2184770300518721 7502408.5209231497719884, 524294.1117317799944431 7502249.5209683403372765, 523447.7796929900068790 7502091.0098048197105527, 522583.0080486031947657 7501863.5510688340291381, 522582.2173395422287285 7501864.1615555742755532), (530798.8710058355936781 7503475.2625857004895806, 530799.6446038441499695 7503474.4564733263105154, 530292.3180354699725285 7503316.0992012796923518, 529603.4816261499654502 7503154.0790386795997620, 529076.7311885600211099 7502911.0787954898551106, 528266.3094259300269186 7502728.5696691796183586, 527759.8099331599660218 7502688.0595766501501203, 527233.1392903799423948 7502607.0608489904552698, 527065.4771157877985388 7502593.2268756395205855, 527064.8072133261011913 7502593.9678452722728252), (539955.9743753559887409 7510000.0000000000000000, 539956.9738961729453877 7510000.0000000000000000, 540057.3710624600062147 7509681.6689012898132205, 540295.3694572099484503 7509391.1672181095927954, 540480.4705794400069863 7509232.1700646700337529, 540612.7384639199590310 7509073.6586520997807384, 540665.5814983600284904 7508571.1700814096257091, 540348.2114157699979842 7507671.6596398204565048, 539925.0498745300574228 7507090.1577369300648570, 539607.6706715000327677 7506746.1599598200991750, 539052.2007989300182089 7506296.6606875201687217, 538205.9094809900270775 7505952.6699313903227448, 537068.6509273999836296 7505741.1603932101279497, 536169.3901651899795979 7505661.6614198600873351, 535217.2919880599947646 7505503.1506273699924350, 534635.4301719899522141 7505317.6512130200862885, 534027.0999437200371176 7504974.1400412498041987, 533603.8817716699559242 7504709.6272615399211645, 533233.6514340500580147 7504312.6317273303866386, 532466.6187711399979889 7503969.1208717301487923, 531858.3409144999459386 7503651.6198519701138139, 531329.3389675599755719 7503360.6116438498720527, 531139.0552856920985505 7503265.5203097239136696, 531138.3627150403335690 7503266.2411932516843081), (546233.0059536607004702 7490000.0000000000000000, 546232.0059536602348089 7490000.0000000000000000, 546232.0095286100404337 7490128.6799554601311684, 546425.2915191700449213 7490406.1914659300819039, 546769.6909271699842066 7490574.1895378697663546, 547082.8998588599497452 7490707.6977680595591664, 547486.2694205499719828 7490854.1999811800196767, 548366.2786710499785841 7491037.7003361200913787, 548806.2997251900378615 7491074.2083575604483485, 549612.9294149799970910 7491257.7084028301760554, 550000.0000000000000000 7491301.9012328926473856, 550000.0000000000000000 7491300.8947363123297691))', + 'MULTILINESTRING ((520000.0000000000000000 7496937.7387266764417291, 520000.0000000000000000 7496940.1299340603873134, 520002.3885029399534687 7496934.9419469097629189, 520209.1083645300241187 7496271.9499225998297334, 520062.0993496900191531 7496119.9397722100839019, 520000.0000000000000000 7496068.6646597366780043, 520000.0000000000000000 7496069.9614912457764149), (523381.4890356060350314 7498414.2473349031060934, 523382.0906666574883275 7498413.4010553266853094, 523169.7519518999615684 7498336.9916863301768899, 523067.8999133500619791 7498311.9897804697975516, 522895.7909434399916790 7498236.4781237496063113, 522615.2015952100045979 7498072.4703307598829269, 521882.6812058400246315 7497821.9590960601344705, 521526.3299231799901463 7497779.4584824498742819, 521208.3405302499886602 7497768.4611136997118592, 520979.3200964700081386 7497743.9708666298538446, 520246.9187887199805118 7497531.9419434396550059, 520000.0000000000000000 7497468.9978941539302468, 520000.0000000000000000 7497470.0298743853345513), (525280.9678179419133812 7499008.5035365633666515, 525281.4949324887711555 7499007.5775622371584177, 525203.0376252799760550 7498994.5084805004298687, 524869.2387656100327149 7498918.5108462898060679, 524080.2303868400631472 7498843.0101468600332737, 523609.8704664499964565 7498706.4891386404633522, 523343.3935284681501798 7498640.4214922022074461, 523342.8145249948720448 7498641.2359428005293012), (534272.9718145289225504 7499007.8629990173503757, 534273.7464286693139002 7499006.7735539842396975, 533821.5094927400350571 7499055.6005880599841475, 533411.8113768999464810 7499131.0899759698659182, 532789.7513422400224954 7499313.0907301902770996, 532046.2501181999687105 7499359.0887924302369356, 531560.6700862100115046 7499404.5924122100695968, 531257.2500160000054166 7499404.5794073604047298, 530968.9126983700552955 7499419.5698141297325492, 530650.2800068800570443 7499495.5805069999769330, 530361.9716437599854544 7499601.5801136298105121, 530210.2997778200078756 7499647.0707991197705269, 530073.7308944800170138 7499647.0701257800683379, 529891.5828257299726829 7499586.5608606198802590, 529755.0991281700553373 7499495.5807948503643274, 529648.8292915900237858 7499434.5578709095716476, 528920.5188349500531331 7499359.0610773200169206, 527979.7492919899523258 7499328.5417763004079461, 527312.1506295599974692 7499283.0298913996666670, 526705.1804492699448019 7499192.0412488700821996, 525809.9994778400287032 7499116.0194425499066710, 525476.2009420599788427 7499040.0108542302623391, 525386.5961969492491335 7499025.0848800987005234, 525386.1020599714247510 7499025.9529232168570161), (547423.9512601103633642 7510000.0000000000000000, 547425.9598791532916948 7510000.0000000000000000, 547270.3128660599468276 7509910.6501949401572347, 547123.4215484600281343 7509784.1305715003982186, 546931.6794150100322440 7509581.6403483096510172, 546815.5487570599652827 7509245.1501061804592609, 546813.4198143399553373 7508786.6386062400415540, 546793.0495528799947351 7508519.6417614798992872, 546760.1718947299523279 7508297.1516221202909946, 546630.1392768600489944 7507705.6514096902683377, 546603.1807938199490309 7507387.6502600098028779, 546506.4978075700346380 7507121.1480851704254746, 546347.0615013099741191 7507032.6372693302109838, 546098.2091887400019914 7506843.1486029401421547, 545931.3088385299779475 7506525.6525994800031185, 545783.2304036399582401 7506157.6511867698282003, 545590.6004368900321424 7505770.1490056701004505, 545302.2208498599939048 7505307.1615147199481726, 544943.5218329799827188 7504761.6597001496702433, 544725.5899502099491656 7504406.6611849600449204, 544501.3301299399463460 7504057.6593816699460149, 544123.7492673799861223 7503569.6505599301308393, 543753.3717356600100175 7503247.1585790300741792, 543357.1403491899836808 7502835.6512618502601981, 543024.9804781300481409 7502538.1512261899188161, 541869.5108813600381836 7501596.1483753900974989, 541378.0882920400472358 7501255.1483567599207163, 540868.3004191899672151 7501022.1397865395992994, 540434.9686214999528602 7500840.1404092302545905, 539886.7884534699842334 7500575.6385581698268652, 539472.3796638699714094 7500361.6388751100748777, 539128.0079635200090706 7500159.6402211003005505, 538782.9978578999871388 7499830.6288305800408125, 538476.5108094000024721 7499571.6312278602272272, 538240.7492773899575695 7499470.6311592804268003, 537903.1197484800359234 7499358.1302875401452184, 537565.7982155899517238 7499296.1290474496781826, 536808.4890007500071079 7499179.6114020701497793, 536356.4701961500104517 7499080.1195044601336122, 535866.5394221700262278 7499031.6102768797427416, 535319.4902977800229564 7498996.6221683695912361, 534772.7408331099431962 7499031.6016195202246308, 534285.8976723682135344 7499162.2542209504172206, 534285.3182902499102056 7499163.0690846843644977), (537098.9795529744587839 7490000.0000000000000000, 537097.9807571568526328 7490000.0000000000000000, 537082.7614457299932837 7490032.1078298501670361, 537064.9390341599937528 7490293.1209420198574662, 537085.1899132600519806 7490547.6190917901694775, 537118.4598460316192359 7490667.2163930963724852, 537119.4298784348648041 7490666.9776619225740433), (537417.0468347219284624 7490706.0521089499816298, 537416.5515447265934199 7490706.2860060287639499, 537416.1256071323296055 7490706.4396555135026574, 537487.4418410599464551 7490882.6095111798495054, 537654.0587315800366923 7491149.1116127697750926, 537858.8020591400563717 7491415.1179784098640084, 537992.9993732899893075 7491548.1193249300122261, 538056.9795873910188675 7491588.6379907196387649, 538057.9059167269151658 7491588.2641664957627654), (538156.4071117863059044 7491653.3615979626774788, 538155.5143074670340866 7491653.8223220268264413, 538299.8710431599756703 7491877.6190374298021197, 538434.6211939599597827 7492137.6200953898951411, 538652.5613591700093821 7492492.6281045097857714, 538768.5901984019437805 7492667.4812555732205510, 538769.1307524497387931 7492666.4872721917927265), (539076.4825414990773425 7492310.6365013578906655, 539076.0048737846082076 7492311.5148478839546442, 539256.6677916899789125 7492496.1301840599626303, 539703.5787173799471930 7492843.6307888999581337, 540053.9791185399517417 7492994.6384690301492810, 540455.2317104099784046 7493113.1314762597903609, 540786.5202559200115502 7493232.1414313204586506, 541041.4298104699701071 7493351.6418332597240806, 541239.2018903200514615 7493478.1304302699863911, 541332.9279536200920120 7493553.2876135194674134, 541333.7303589903749526 7493552.6927433693781495), (541996.2659877514233813 7493323.2507506581023335, 541995.3182718952884898 7493323.6649971948936582, 542500.6798850599443540 7493961.1386070298030972, 542743.6307616099948063 7494233.6408173600211740, 543082.0077898399904370 7494518.1417143298313022, 543356.1986791399540380 7494663.1389560597017407, 543789.2602507199626416 7494794.6498441295698285, 544139.2511316499439999 7494849.6397826299071312, 544641.6300744400359690 7494840.6485728900879622, 545175.3190517800394446 7494736.1496383799239993, 545741.0922157400054857 7494688.1493368400260806, 546307.7507409299723804 7494838.1492867600172758, 546786.0567151700379327 7495109.1620891699567437, 547188.0597629300318658 7495399.6700470102950931, 547621.6999697199789807 7495652.1683375202119350, 547965.6989555200561881 7495764.6696619400754571, 548207.3907420800533146 7495776.1700877603143454, 548481.1595977500546724 7495844.6798296095803380, 548863.0792892000172287 7495925.1790779400616884, 549506.2123941599857062 7496087.1879144096747041, 550000.0000000000000000 7496197.8834195006638765, 550000.0000000000000000 7496196.8585999859496951))', + 'MULTILINESTRING ((524266.0954626141465269 7490000.0000000000000000, 524264.0581623602192849 7490000.0000000000000000, 524274.6716975499875844 7490005.9794874498620629, 524580.9296716400422156 7490207.9900786597281694, 525263.6310803899541497 7490681.4799169795587659, 525633.8797883000224829 7490965.9987491900101304, 526080.4097873299615458 7491262.5022844001650810, 526392.7913924700114876 7491426.5083817597478628, 526680.5080642091343179 7491700.2571335136890411, 526680.9617382686119527 7491699.3084705946967006), (527736.6980700913118199 7490014.9772448325529695, 527736.3587646851083264 7490015.9580855472013354, 528010.6905607599765062 7490033.0087006296962500, 528554.6395948999561369 7490014.5194057403132319, 528659.0582184605300426 7490000.0000000000000000, 528651.7973667406477034 7490000.0000000000000000), (528242.3239959123311564 7492064.7222724705934525, 528241.7088020627852529 7492065.7254664935171604, 528666.1973901799647138 7492063.5307877697050571, 529212.3307416000170633 7491907.5399811398237944, 529719.6322913799667731 7491605.5284209195524454, 530163.0910896200221032 7491234.0305473301559687, 530511.5112620899453759 7490958.5415406301617622, 531453.6296071013202891 7490000.0000000000000000, 531452.2274564296239987 7490000.0000000000000000))', + 'MULTILINESTRING ((522423.1507045699981973 7499760.7176261981949210, 522423.9203800179529935 7499759.6364277126267552, 522349.8299966399208643 7499766.9809384401887655, 522165.4282854500343092 7499767.9805885404348373, 521783.7590640200069174 7499750.9782179798930883, 521446.5883731800131500 7499727.4790324503555894, 521058.2386758999782614 7499640.4595605703070760, 520701.5588286300189793 7499521.4718082202598453, 520204.5092078600428067 7499313.9601706201210618, 520000.0000000000000000 7499193.2638115361332893, 520000.0000000000000000 7499194.4249778995290399), (522555.9904544320888817 7499746.5444441922008991, 522555.4111143556656316 7499747.3582698311656713, 522555.9904544320888817 7499746.5444441922008991, 522960.0394677100121044 7499706.4914416698738933, 523297.1696609099744819 7499723.9880460202693939, 523539.3288009500829503 7499824.4885594900697470, 523807.0801918199867941 7499963.0007417099550366, 524452.2040554300183430 7500171.9706728672608733, 524451.4118937810417265 7500172.7652285397052765), (529030.4932832464110106 7500200.7058669319376349, 529031.2178299439838156 7500199.9257171414792538, 528991.0805857500527054 7500183.0489843999966979, 528679.6486600999487564 7500223.0495249899104238, 527986.5626644400181249 7500239.5480527197942138, 527668.6504820300033316 7500241.0489183496683836, 526409.2975434400141239 7500216.0304062804207206, 525849.7599196099909022 7500225.5205484097823501, 525373.0094749700510874 7500266.0211616195738316, 525080.3788815899752080 7500248.5201182495802641, 524717.1588156500365585 7500210.0084451204165816, 524719.1996265298221260 7500211.2304345155134797), (532993.0805511008948088 7500834.6403764961287379, 532993.3489576445426792 7500834.0452068466693163, 532993.5077827317873016 7500833.7281568944454193, 532828.7419588699704036 7500779.5898232003673911, 532059.2178660000208765 7500783.5925765298306942, 531715.7397694600513205 7500766.5896713202819228, 531009.3391590700484812 7500675.0807855604216456, 530322.5721776599530131 7500685.0713867703452706, 529769.5689500400330871 7500739.0687459995970130, 529089.1306385099887848 7500749.0586953703314066, 528660.8910052364226431 7500745.6074274424463511, 528660.2112883693771437 7500746.3392704948782921), (545728.9288492670748383 7510000.0000000000000000, 545730.2700878457399085 7510000.0000000000000000, 545584.7022705799899995 7509837.1403594203293324, 545386.0617979000089690 7509520.1391145400702953, 545238.0399551700102165 7509170.6511606499552727, 545122.0989813000196591 7508859.6512553403154016, 544986.9678246000548825 7508529.6407046103850007, 544743.6496689900523052 7508180.6489076800644398, 544659.9523990500019863 7507964.6498591499403119, 544499.4011402300093323 7507634.6525363801047206, 544320.0205451600486413 7507368.1501189004629850, 544044.8593324699904770 7507007.1477869795635343, 543852.7414086499484256 7506721.6492448104545474, 543666.6799941799836233 7506391.6518390402197838, 543486.6189286799635738 7505966.1496158502995968, 543177.9487287199590355 7505267.6511040404438972, 542851.5999981700442731 7504830.1483773496001959, 542628.1512679100269452 7504653.1477385796606541, 541996.4995115000056103 7504230.1516731502488256, 541486.3089837899897248 7503927.6487837303429842, 541052.4398514899658039 7503624.6398146301507950, 540714.5785347600467503 7503454.6588033195585012, 540331.7501426199451089 7503195.6492001600563526, 539885.0605549899628386 7502867.1490661101415753, 539534.2795183400157839 7502671.6515465499833226, 539088.3392634700285271 7502508.6507563600316644, 538115.0518896100111306 7502437.6390984999015927, 537790.3291457899613306 7502369.1493166498839855, 537573.5679509800393134 7502255.6492295796051621, 537394.9012426600093022 7502116.6387358000501990, 537330.5981657799566165 7501970.6416400596499443, 537323.5123430900275707 7501824.6311678895726800, 537322.0002546999603510 7501506.1379719302058220, 537263.7595541899790987 7501296.6407880699262023, 537039.8101914300350472 7501017.6294886004179716, 536612.6102296400349587 7500784.6198029303923249, 536218.0508771500317380 7500716.6298277098685503, 535734.4196069199824706 7500662.1207142304629087, 534972.0878904700512066 7500831.6092656701803207, 534616.1697530100354925 7500865.1187592102214694, 534266.3894202300580218 7500867.1096779303625226, 534081.7079486900474876 7500817.1092230295762420, 533864.9377766799880192 7500710.1096216002479196, 533501.7106121799442917 7500546.6094194203615189, 533336.0891072107478976 7500498.7944972664117813, 533335.5105264986632392 7500499.6086738053709269), (540652.7093492220155895 7490387.5987470783293247, 540651.8620166190667078 7490388.1283743241801858, 540716.9413671500515193 7490648.6385009195655584, 540890.1206744499504566 7490959.6384145403280854, 541069.2507452500285581 7491181.1377072203904390, 541209.8013249200303108 7491327.1401432603597641, 541318.3109204999636859 7491402.6507735904306173, 541522.3790933899581432 7491516.1502364799380302, 541726.1788735899608582 7491597.6481381803750992, 541866.3201340900268406 7491635.1395976599305868, 542152.3343121195212007 7491644.4789796750992537, 542152.5743099044775590 7491643.5087957028299570), (542310.5385527068283409 7491467.5166142378002405, 542310.2017283077584580 7491468.4781577382236719, 542387.0478783199796453 7491479.6506026098504663, 542508.2986270999535918 7491568.1487769903615117, 542623.6207645100075752 7491745.6495260195806623, 542707.3887829299783334 7491974.6494024097919464, 542804.3198439499828964 7492292.1578110801056027, 542874.8705274199601263 7492419.1503577204421163, 543015.3294375799596310 7492539.1386309601366520, 543157.3559995990945026 7492607.0648720515891910, 543158.2323379423469305 7492606.5854770792648196), (543285.3188949242467061 7492641.8684887290000916, 543284.1699949501780793 7492642.7301141498610377, 543785.6400337499799207 7492706.6602805098518729, 544142.1796537400223315 7492794.1595931304618716, 544346.3083736399421468 7492926.6612573396414518, 544550.7481039999984205 7493129.1590701797977090, 544793.1985071500530466 7493287.1483336500823498, 545098.8382594300201163 7493361.6606107000261545, 545620.5201594299869612 7493403.1614144695922732, 546046.6321061899652705 7493420.1597612500190735, 546440.8310840800404549 7493399.1707573700696230, 546822.0285851999651641 7493326.6682714400812984, 547241.4683955300133675 7493267.1695830002427101, 548296.9793255199911073 7493223.1783396899700165, 548710.8022534899646416 7493316.6910186298191547, 548978.0409311200492084 7493359.6988639002665877, 549474.6489930299576372 7493478.1999030597507954, 549870.0192977499682456 7493704.7011540196835995, 550000.0000000000000000 7493802.1282507702708244, 550000.0000000000000000 7493800.8785204347223043))', + 'MULTILINESTRING ((524718.0163713778601959 7500210.5219292528927326, 524717.1588156500365585 7500210.0084451204165816, 524574.9860907683614641 7500190.5280320746824145, 524574.2798689020564780 7500191.2344054849818349))', + 'MULTILINESTRING ((524193.8328189906897023 7500431.1064537204802036, 524194.6307847223361023 7500430.3067480474710464, 523397.8001402500085533 7500183.4910121802240610, 522854.1015355099807493 7500070.4906302299350500, 522324.1118496610433795 7500072.2749801976606250, 522323.5325372974039055 7500073.0887669073417783), (527905.8476731716655195 7501050.4671189449727535, 527908.1407460733316839 7501050.5568969398736954, 527430.0695936999982223 7500795.5491229798644781, 526591.8898101799422875 7500682.0311559904366732, 525549.8513239700114354 7500614.0300792902708054, 525164.7414901100564748 7500478.0103883901610970, 524717.1588156500365585 7500210.0084451204165816, 524716.1685345589648932 7500209.8727574581280351))', + 'MULTILINESTRING ((522198.7010203180252574 7500076.0088302092626691, 522199.4341642370563932 7500074.9790627742186189, 521744.1016206499771215 7500092.9814525097608566, 521177.7584161399863660 7500024.9713861504569650, 520656.7282556199934334 7499911.9717762302607298, 520226.3289424299728125 7499730.4618171695619822, 520000.0000000000000000 7499617.2908613989129663, 520000.0000000000000000 7499618.4089082013815641), (532860.9091847165254876 7501127.3776061432436109, 532861.3487732587382197 7501126.4021477382630110, 532255.2395347800338641 7501090.0919910203665495, 531190.5300996799487621 7501090.0910327201709151, 530442.9822135099675506 7501135.0692772204056382, 529763.3494318500161171 7501135.0693844202905893, 529061.0896587100578472 7501044.5682494696229696, 528473.1436554730171338 7500979.1873466055840254, 528472.5273607608396560 7500979.9734598090872169), (544737.4093717507785186 7510000.0000000000000000, 544738.7021026653237641 7510000.0000000000000000, 544626.1803077399963513 7509862.6509016100317240, 544599.6914848999585956 7509307.1512340800836682, 544520.3602272400166839 7508619.1491003800183535, 544255.8195605799555779 7507878.6505708796903491, 543753.3111433800077066 7507006.1485301395878196, 543197.8599954500095919 7506291.6510444404557347, 542748.2417293100152165 7505604.1493647499009967, 542034.1492941799806431 7504704.6514335004612803, 541293.5891299600480124 7504202.1505518397316337, 540447.2613627200480551 7503647.1504111299291253, 539204.1899481900036335 7503038.6409026896581054, 538490.0402022900525481 7502853.6400044597685337, 537934.5981001099571586 7502959.1494819503277540, 537458.5619110600091517 7503118.1395992599427700, 536956.0390386499930173 7503170.6392884301021695, 536770.9210307099856436 7502932.6405451204627752, 536718.0086382699664682 7502615.6299286996945739, 536718.0077891800319776 7502060.1385293100029230, 536585.7404540400020778 7501557.6296280203387141, 536215.4412918200250715 7501319.6187131898477674, 535871.5983779799425974 7501240.1199650401249528, 535289.7498613100033253 7501266.6198128499090672, 534813.6585787199437618 7501213.6187100997194648, 533649.9409386699553579 7501055.1196561502292752, 533032.6647448980947956 7500990.1133196894079447, 533032.2540093590505421 7500991.0240919245406985), (540991.6145223230123520 7490051.9104150431230664, 540990.9120639010798186 7490052.6205057417973876, 540994.1994521199958399 7490125.1404810203239322, 541020.3115120199508965 7490265.1499587204307318, 541071.8600603099912405 7490404.6513284202665091, 541225.5412088100565597 7490626.6515073096379638, 541378.8100700799841434 7490759.6511909803375602, 541621.1913036600453779 7490904.6496356101706624, 541850.5094163799658418 7490992.6486446103081107, 542117.9989447799744084 7491067.6498956503346562, 542339.6836309707723558 7491081.8338681170716882, 542340.0139575036009774 7491080.8908742861822248), (542448.3669101102277637 7491085.2667160956189036, 542447.8281487500062212 7491086.2563206022605300, 542645.9278556300560012 7491090.1496953703463078, 542881.8001631699735299 7491216.1593797197565436, 543022.5110186899546534 7491374.6574428202584386, 543093.4196471800096333 7491577.6600298201665282, 543100.6207402900326997 7491755.6605573296546936, 543146.0011632499517873 7491940.1524548903107643, 543242.2113231299445033 7492092.6493198703974485, 543420.5594578799791634 7492167.6605370296165347, 543736.0608669177163392 7492178.8340415228158236, 543736.8605833266628906 7492178.2342887129634619), (543994.7063397207530215 7492105.4846383240073919, 543993.9952419346664101 7492106.2410740470513701, 544164.7493750499561429 7492195.6611232999712229, 544311.5085405800491571 7492303.1592243798077106, 544713.1909174999454990 7492510.6592104202136397, 545414.1404617800144479 7492806.1695769801735878, 545739.0797240600222722 7492931.6574951196089387, 546146.6309219299582765 7493050.6718051703646779, 546566.3691623499616981 7493067.1693900702521205, 547017.7696958100423217 7493033.1687579201534390, 547411.5708465500501916 7492935.1810991801321507, 547824.2799819100182503 7492786.6796223297715187, 548154.3804447900038213 7492676.6903927102684975, 548555.1085242800181732 7492681.1924451002851129, 548956.0910621000220999 7492755.1982696000486612, 549427.3525090899784118 7492886.2018355997279286, 549924.2300843800185248 7493068.2112118601799011, 550000.0000000000000000 7493102.4734313925728202, 550000.0000000000000000 7493101.3759462386369705))', + 'MULTILINESTRING ((520000.0000000000000000 7500333.5864726584404707, 520000.0000000000000000 7500334.5854991283267736, 520251.9812008599983528 7500460.4708616798743606, 520790.4299846600042656 7500582.9693757295608521, 521328.8990372599801049 7500656.4806792000308633, 521537.9934471686137840 7500702.5902975173667073, 521538.7771375657757744 7500701.9694143859669566, 521537.9934471686137840 7500702.5902975173667073), (521826.3962308935006149 7510000.0000000000000000, 521830.2234692216152325 7510000.0000000000000000, 521671.4390298799844459 7509957.0189364701509476, 520790.3393039599759504 7509810.0001919697970152, 520000.0000000000000000 7509619.7119117267429829, 520000.0000000000000000 7509618.6830340670421720, 520000.0000000000000000 7509619.7119117267429829), (532600.3302651896374300 7501627.1083485167473555, 532599.7396073570707813 7501628.1497170943766832, 532856.6521893100580201 7501611.1112058302387595, 533444.0185844299849123 7501684.6103292601183057, 534325.1210312099428847 7501880.1196714900434017, 534985.9214213599916548 7502076.1217858698219061, 535646.8110275299986824 7502516.6302939895540476, 535891.5287010800093412 7502908.1374861896038055, 536013.9019787500146776 7503250.6406890796497464, 536258.6794978299876675 7503520.1420491002500057, 536527.9085336000425741 7503593.6495772004127502, 536992.9320167599944398 7503520.1422608699649572, 537555.8628507399698719 7503544.6488754795864224, 538020.8807973100338131 7503667.1522581996396184, 538755.1426198399858549 7503960.6502358699217439, 539244.6298891199985519 7504132.1499195201322436, 540125.7701951599447057 7504572.6497226702049375, 540762.0786962399724871 7504939.6401027701795101, 541716.5790550899691880 7505698.1617022398859262, 541936.8897461800370365 7506065.6509176101535559, 542157.1883640999440104 7506530.6489702202379704, 542426.4309210999635980 7507142.6610005302354693, 542597.7511561999563128 7507729.6500914199277759, 542622.2203807899495587 7508170.6593472696840763, 542866.9608011499512941 7508635.6476191803812981, 543136.2108244899427518 7508978.1516894698143005, 543283.1098597400123253 7509198.1474713198840618, 543356.4892539000138640 7509687.6487833503633738, 543368.5279655156191438 7510000.0000000000000000, 543369.5268157882383093 7510000.0000000000000000), (542475.7818017150275409 7490825.7722711022943258, 542476.2623097165487707 7490824.8896671906113625, 542121.6113261700375006 7490675.1504720998927951, 541942.0503731799544767 7490540.6584189096465707, 541762.5393725200556219 7490428.6507309796288610, 541605.5117328099440783 7490293.6494011301547289, 541560.6191276300232857 7490159.1616177195683122, 541538.0986778000369668 7490024.6489791097119451, 541545.8831280654994771 7490000.0000000000000000, 541544.8344431390287355 7490000.0000000000000000), (544083.8251957478933036 7491864.6897576972842216, 544084.5100616407580674 7491863.9622678663581610, 543916.8111612600041553 7491662.6594603899866343, 543467.9909774400293827 7491303.6579534802585840, 543288.5212596700293943 7491169.1625096900388598, 543041.6283885700395331 7491034.6487735398113728, 542929.4202479800442234 7490989.6511897603049874, 542705.0600305399857461 7490877.1614052504301071, 542571.8228042328264564 7490858.5011789817363024, 542571.3451686579501256 7490859.3785067796707153), (550000.0000000000000000 7492916.1826057024300098, 550000.0000000000000000 7492915.1826563579961658, 549683.9776767699513584 7492784.7010641396045685, 549457.1530677999835461 7492715.7030614195391536, 549167.8620524300495163 7492627.6976040797308087, 549044.6585097600473091 7492599.7510081203654408, 548674.1506595800165087 7492515.7009411500766873, 548609.5248929499648511 7492518.2924996195361018, 548113.1504889399511740 7492538.1886065695434809, 547800.5016407900257036 7492572.8691065600141883, 547379.9360571899451315 7492619.5098762298002839, 547103.3177899100119248 7492650.1804305203258991, 546676.9415344200097024 7492650.1683770902454853, 546362.8189851900096983 7492582.6708111502230167, 546048.6516915999818593 7492493.1693898700177670, 545734.4392289100214839 7492380.6604282101616263, 545353.0321352999890223 7492201.1703274799510837, 544926.6382374600507319 7492066.6692933803424239, 544724.7222984499530867 7491977.1600893298164010, 544410.5210711299441755 7491797.6681312201544642, 544324.8354344329563901 7491754.6016815919429064, 544324.1489822026342154 7491755.3286254471167922))', + 'MULTILINESTRING ((530271.9887491008266807 7504023.8181659672409296, 530272.8096558250254020 7504022.9626687979325652, 529716.5596407300326973 7503911.6010149903595448, 529213.5023450599983335 7503780.5819101296365261, 528797.9000049700262025 7503627.0802137600257993, 527507.3776305499486625 7503343.0594466198235750, 526960.5505161000182852 7503255.5484263198450208, 526610.5993896899744868 7503255.5402162401005626, 526129.4297748099779710 7503146.0497182803228498, 525298.2094937399961054 7503146.0410827100276947, 524313.9806665199575946 7502993.0200903099030256, 522979.7296735499985516 7502796.0099626500159502, 521973.5802435199730098 7502730.4904361795634031, 520967.4508550300379284 7502533.4807597603648901, 520000.0000000000000000 7502409.3710406739264727, 520000.0000000000000000 7502410.3792356532067060), (520000.0000000000000000 7507850.7456019073724747, 520000.0000000000000000 7507851.7444353895261884, 520459.1205355499987490 7507962.4997558500617743, 521252.5692508600186557 7508095.0084923598915339, 522046.0097163000609726 7508306.5182301895692945, 522495.6195994799491018 7508412.0197906903922558, 523447.7511029100278392 7508491.5316420802846551, 524135.4115040699834935 7508571.0508861597627401, 524796.6501091100508347 7508809.0602384395897388, 525537.1616826100507751 7508888.5604379596188664, 526304.1784057499608025 7509047.0794246401637793, 527150.5723233999451622 7509258.6008259104564786, 527891.1703374399803579 7509549.6305759903043509, 528759.1812102999538183 7509752.1486169397830963, 529408.9095765600213781 7509934.6589543297886848, 529609.4298291478771716 7510000.0000000000000000, 529610.4290333546232432 7510000.0000000000000000), (538922.8089907000539824 7510000.0000000000000000, 538923.8080818294547498 7510000.0000000000000000, 538972.1599029799690470 7509914.6897562900558114, 539114.2378285899758339 7509528.6699069095775485, 539134.5507683800533414 7509041.6695242598652840, 539012.7302670100471005 7508493.1818856503814459, 538586.3296623999485746 7507965.1697401199489832, 538180.2115608500316739 7507599.6715208096429706, 537631.9808313100365922 7507214.1684171101078391, 537428.9305590899894014 7507011.1716584600508213, 537002.5204438799992204 7506686.1613326398655772, 536616.7715214400086552 7506544.1692011002451181, 535743.6882477200124413 7506361.1594366002827883, 534931.5578075499506667 7506158.1588880904018879, 534038.1795864100567997 7505813.1479306500405073, 533489.9179332499625161 7505488.1394624896347523, 533022.9010144800413400 7505082.1303953798487782, 532495.0114416599972174 7504737.1207175096496940, 531906.1711659600259736 7504513.6188210602849722, 530728.5093100100057200 7504046.6094597103074193, 530502.3308432935737073 7503928.6902586026117206, 530501.6387504261219874 7503929.4114401936531067), (549037.6348608708940446 7490000.0000000000000000, 549036.4332247237907723 7490000.0000000000000000, 549043.9079029599670321 7490011.2185191400349140, 549204.8611184799810871 7490100.2200202103704214, 549687.5501057700021192 7490279.2203355301171541, 550000.0000000000000000 7490413.2414639443159103, 550000.0000000000000000 7490412.1533525427803397))', + ] +) +bc_gdf = geopandas.GeoDataFrame(basal_c, geometry=bc_geoms, crs='EPSG:28350') + +structures = pandas.DataFrame( + { + 'ID': [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20], + 'DIPDIR': [190.0, 190.0, 0.0, 330.0, 165.0, 150.0, 180.0, 210.0, 240.0, 270.0, 300.0], + 'DIP': [55, 55, 15, 15, 0, 45, 30, 20, 10, 5, 50], + 'OVERTURNED': [False] * 11, + 'BEDDING': [False] * 11, + 'X': [ + 548279.320612, + 548249.155883, + 546137.857561, + 543754.180680, + 520512.912720, + 528512.912720, + 529512.912720, + 530512.912720, + 531512.912720, + 532512.912720, + 533512.912720, + ], + 'Y': [ + 7.493304e06, + 7.493512e06, + 7.494607e06, + 7.504599e06, + 7.497506e06, + 7.497806e06, + 7.498506e06, + 7.499506e06, + 7.500506e06, + 7.501506e06, + 7.502506e06, + ], + 'Z': [543.0, 543.0, 532.0, 559.0, 503.0, 553.0, 563.0, 573.0, 583.0, 593.0, 603.0], + 'layerID': [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2], + } +) + + +# sampled contacts + +IDS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 3, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 8, + 9, + 9, + 9, + 9, + 9, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 5, + 5, + 5, + 5, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 5, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, +] +X = [ + 520000.0, + 520992.6699257682, + 521984.6869456721, + 522969.6388939231, + 523954.5908421741, + 524942.1013152138, + 525930.4850180566, + 526908.535657469, + 527891.805258285, + 528880.6323520339, + 529855.6352847969, + 530832.075832642, + 531813.1634102948, + 532804.1384816798, + 533019.2882480841, + 532243.2409444518, + 531376.1445685071, + 530480.68269627, + 529612.3980015446, + 528734.9447395488, + 527783.6457775467, + 526804.9871671252, + 525809.8226356399, + 524816.1487769039, + 523829.21986169985, + 522842.8215091018, + 521858.22077695775, + 520000.0, + 520979.22944531543, + 521963.40533887857, + 522941.7587850634, + 523934.147302897, + 524925.392627546, + 525924.0314485825, + 526915.8477737093, + 527895.0821625991, + 528872.0657047849, + 529800.4947308041, + 530625.584657682, + 531569.6370222451, + 532437.052847155, + 533287.2652070294, + 534152.4134851344, + 535068.2792519473, + 535460.6891555252, + 536224.4983751376, + 533429.9102329265, + 532481.4641957916, + 531544.0571021343, + 530594.6994174849, + 529610.6855646572, + 528622.769870241, + 527649.2613247755, + 526678.2236776681, + 525700.529526533, + 524727.502968803, + 523736.1966217523, + 522758.8160138651, + 521787.52440495713, + 520000.0, + 523032.43525349256, + 522075.0050621681, + 521094.2495766504, + 521279.9150416324, + 527953.219881957, + 528932.1661473936, + 529931.0489500397, + 530926.9444223469, + 532471.3224294331, + 533451.0808071761, + 534430.5181256596, + 535259.9903455864, + 535733.754706194, + 536530.414399986, + 537520.9367684029, + 538483.8842249501, + 539416.5488248907, + 540254.201848269, + 541073.3185078846, + 541731.634304068, + 542111.7328311033, + 542153.227246826, + 542648.3360907623, + 544273.9324713233, + 550000.0, + 549046.9473048343, + 548047.5904092644, + 547052.7023355255, + 546066.4155333972, + 520000.0, + 520977.906499162, + 521972.6466978357, + 522950.7862194081, + 523930.86647590954, + 524922.3632146807, + 525917.7966582401, + 522351.1343196252, + 527125.4548547225, + 526128.5235193562, + 525130.7081813341, + 524144.8882983563, + 530798.8710058356, + 529837.3189358161, + 528901.4390783398, + 539955.974375356, + 540509.7202600716, + 540554.4697958604, + 540124.5665895239, + 539457.7385073705, + 538609.0930945011, + 537650.6482494324, + 536662.2132646953, + 535670.9952466968, + 534702.7550180865, + 533831.4503084399, + 533061.3425394666, + 532157.7972663342, + 546233.0059536607, + 546906.7057886998, + 547857.5988940151, + 548844.1779325017, + 523381.48903560604, + 522468.0997263235, + 521503.9257619144, + 525280.9678179419, + 534272.9718145289, + 533289.726130804, + 532311.6002925185, + 531314.2350300908, + 530343.2573956609, + 529404.0267836585, + 528406.8877962828, + 527408.438540811, + 526416.4831948339, + 547423.9512601104, + 546818.8696391915, + 546751.8787156106, + 546564.3507434212, + 545942.2297277196, + 545512.8225309709, + 544971.65760404, + 544429.4936548981, + 543746.9451913793, + 543030.8690031096, + 542256.0397376382, + 541457.6565650662, + 540552.3950139998, + 539652.2355835018, + 538839.7378067289, + 537990.4340473542, + 537007.3752328141, + 536022.1700130996, + 537417.0468347219, + 538156.4071117863, + 539076.4825414991, + 539863.903717873, + 541996.2659877514, + 542624.1105710816, + 543421.4023585871, + 544400.4790130118, + 545389.5363446891, + 546360.828213827, + 547201.2564344314, + 548117.0745406685, + 524266.09546261415, + 525089.486889288, + 528242.3239959123, + 529217.7910440405, + 530038.4913963537, + 522423.15070457, + 521427.2884053698, + 522555.9904544321, + 529030.4932832464, + 528038.4263267842, + 527038.5688849417, + 526038.746341665, + 532993.0805511009, + 532003.260610268, + 531009.5137000929, + 530011.0692840518, + 545728.9288492671, + 545228.7527245631, + 544793.6165900896, + 544324.0658601674, + 543757.1054321213, + 543343.5919286992, + 542816.8120473484, + 541997.2329619491, + 541153.4587884084, + 540302.4609239949, + 539458.859568292, + 538484.4409203371, + 537531.6718874933, + 537267.7621267324, + 536473.9828749119, + 535486.8616121166, + 534501.006691062, + 540652.709349222, + 541131.4261559306, + 542310.5385527068, + 543285.3188949242, + 544247.7959926978, + 545089.9263310316, + 546087.6202142882, + 547077.7264906017, + 548075.363336421, + 549059.0245534881, + 524193.8328189907, + 527905.8476731717, + 526978.3198189315, + 525983.1425512254, + 522198.701020318, + 521204.9277157221, + 532860.9091847165, + 531863.5053478461, + 530864.0956853683, + 529864.8572444214, + 544737.4093717508, + 544569.3339346765, + 544327.771360188, + 543863.477011355, + 543275.0341084594, + 542715.4199777856, + 542093.6525093828, + 541285.7709317384, + 540449.5406616033, + 539551.5492211859, + 538610.5312377414, + 537640.4148034687, + 536770.6743346298, + 536686.2888205624, + 536054.8844726445, + 535061.7313647007, + 534070.1286353774, + 540991.614522323, + 542448.3669101102, + 543994.7063397208, + 544871.8490877205, + 545799.7056238599, + 546784.2744169813, + 547750.3419044648, + 548724.9651694401, + 520000.0, + 521826.3962308935, + 532600.3302651896, + 533589.8503320153, + 534561.7759873917, + 535449.8915779426, + 535993.0214361007, + 536819.0801195968, + 537807.793036829, + 538744.8306413345, + 539665.2325617559, + 540546.0055358304, + 541349.6936467969, + 541980.9483774537, + 542394.1133221515, + 542614.8288802537, + 543077.7762354391, + 542475.781801715, + 544083.8251957479, + 550000.0, + 549053.1439277239, + 548063.5281953025, + 547069.414890058, + 546087.5377901661, + 530271.9887491008, + 529298.9639373667, + 528340.209952825, + 527361.9910066663, + 526373.1685692647, + 525379.3992484873, + 524390.3065754601, + 523401.1210929096, + 522406.9032212814, + 521418.36474354746, + 520000.0, + 520978.6362345788, + 521950.47117176966, + 522933.3988561018, + 523928.4054918701, + 524884.9875455543, + 525874.1190162523, + 526848.2966478025, + 527791.3040361393, + 538922.8089907, + 539134.0778793262, + 538736.0836775531, + 538004.1174260699, + 537223.7768297916, + 536312.6322191659, + 535337.4942052161, + 534389.0342257542, + 533501.4998407771, + 532715.1008693202, + 531806.479694858, + 549037.6348608709, +] +Y = [ + 7506463.058931708, + 7506576.346475119, + 7506700.1649271855, + 7506872.99333815, + 7507045.821749114, + 7507202.956357559, + 7507354.44495147, + 7507562.8122875495, + 7507744.951704663, + 7507892.96504778, + 7508104.092849379, + 7508311.6272335, + 7508501.976685256, + 7508504.460999884, + 7507684.484812225, + 7507085.842450439, + 7506588.057267194, + 7506144.839214603, + 7505654.042415291, + 7505177.516716159, + 7504892.17995596, + 7504686.687074701, + 7504603.854204072, + 7504503.098141689, + 7504341.941955539, + 7504177.672377438, + 7504002.8541911375, + 7503245.259859091, + 7503436.728206725, + 7503611.222655113, + 7503811.172638808, + 7503933.967406592, + 7504066.000381116, + 7504086.539427338, + 7504206.419975162, + 7504405.812567679, + 7504618.483028057, + 7504899.302718434, + 7505410.872728581, + 7505727.305923727, + 7506201.128560977, + 7506724.563539154, + 7507220.081115803, + 7507612.996219244, + 7508505.040226217, + 7509135.469929169, + 7510000.0, + 7509704.59876308, + 7509356.363295672, + 7509042.9372015195, + 7508868.599440474, + 7508713.626424883, + 7508491.404999385, + 7508254.175495736, + 7508044.257347997, + 7507813.564222933, + 7507689.029948036, + 7507479.73426719, + 7507242.659510909, + 7500803.4896762185, + 7510000.0, + 7509752.2424489865, + 7509557.913698296, + 7501034.634496278, + 7501611.124154025, + 7501788.582382207, + 7501832.072807334, + 7501874.753115009, + 7501854.802179787, + 7501993.852453728, + 7502194.603011602, + 7502736.52101189, + 7503605.470838049, + 7504102.310629672, + 7503995.998654295, + 7504162.548298732, + 7504522.438259361, + 7505048.271868659, + 7505609.690332235, + 7506352.909638542, + 7507272.811883032, + 7508259.448754307, + 7509066.146225987, + 7491662.855160554, + 7492637.949197558, + 7492365.294641344, + 7492343.195849396, + 7492425.974104291, + 7492294.881093971, + 7508845.720669018, + 7509050.10324461, + 7509000.757492466, + 7509194.807969997, + 7509393.409809908, + 7509493.696517873, + 7509580.778152611, + 7501916.1655494, + 7502377.774781606, + 7502376.385050711, + 7502389.230930838, + 7502221.572623042, + 7503475.2625857005, + 7503209.079556105, + 7502871.602548231, + 7510000.0, + 7509197.116898042, + 7508256.250238412, + 7507364.330453778, + 7506624.831329774, + 7506116.551366933, + 7505849.401377124, + 7505705.229350432, + 7505578.685761046, + 7505339.114590024, + 7504851.858361741, + 7504235.464249766, + 7503807.926211051, + 7490000.0, + 7490632.5934013035, + 7490931.629951538, + 7491082.825264233, + 7498414.247334903, + 7498022.163648057, + 7497778.683655275, + 7499008.503536563, + 7499007.862999017, + 7499166.809369003, + 7499342.672418874, + 7499404.581849788, + 7499607.193046319, + 7499409.181598686, + 7499342.398484021, + 7499289.594081205, + 7499167.5240981905, + 7510000.0, + 7509254.772409647, + 7508259.427108908, + 7507280.617024052, + 7506546.4275029935, + 7505645.278178703, + 7504804.447980701, + 7503964.813485547, + 7503240.48427183, + 7502543.425302152, + 7501911.2681202525, + 7501310.361086443, + 7500889.459500117, + 7500454.516031106, + 7499884.737649882, + 7499387.224113458, + 7499210.211525513, + 7499047.019637048, + 7490706.05210895, + 7491653.361597963, + 7492310.636501358, + 7492912.724049956, + 7493323.250750658, + 7494099.582786533, + 7494682.93982123, + 7494844.964517663, + 7494717.975402998, + 7494868.223497515, + 7495407.3541522715, + 7495771.872569879, + 7490000.0, + 7490560.701632605, + 7492064.722272471, + 7491904.289302209, + 7491338.4112052, + 7499760.717626198, + 7499723.154391495, + 7499746.544444192, + 7500200.705866932, + 7500238.3134670025, + 7500228.5316139795, + 7500222.315208985, + 7500834.640376496, + 7500780.822571908, + 7500675.103396037, + 7500715.487725784, + 7510000.0, + 7509145.739106326, + 7508252.316578914, + 7507374.160168251, + 7506552.029851974, + 7505642.489778755, + 7504802.59176734, + 7504230.642840398, + 7503695.190221784, + 7503174.1096064225, + 7502644.083926628, + 7502464.589954097, + 7502223.052264384, + 7501311.038411527, + 7500760.731710168, + 7500717.160069187, + 7500865.774257174, + 7490387.598747078, + 7491245.724857572, + 7491467.516614238, + 7492641.868488729, + 7492862.716044601, + 7493359.487961125, + 7493417.977361985, + 7493290.396821679, + 7493232.414779238, + 7493379.023244919, + 7500431.1064537205, + 7501050.467118945, + 7500734.366883766, + 7500642.3056855835, + 7500076.008830209, + 7500028.234047118, + 7501127.377606143, + 7501090.091638437, + 7501109.731843927, + 7501135.069368409, + 7510000.0, + 7509043.874690335, + 7508080.057040733, + 7507197.428797968, + 7506390.922978456, + 7505562.805840937, + 7504779.60394153, + 7504197.023577066, + 7503648.645117141, + 7503208.680546424, + 7502884.853275787, + 7503057.40301376, + 7502931.162530749, + 7501939.632101527, + 7501282.496918272, + 7501241.235538427, + 7501112.3494773, + 7490051.910415043, + 7491085.266716096, + 7492105.484638324, + 7492577.547240268, + 7492949.361650263, + 7493050.756214061, + 7492813.284106591, + 7492712.54139396, + 7500333.586472658, + 7510000.0, + 7501627.108348517, + 7501716.96918736, + 7501950.3146539405, + 7502385.375857322, + 7503192.199394774, + 7503547.6234244285, + 7503611.016851668, + 7503956.5283480855, + 7504342.417675098, + 7504815.020093556, + 7505406.605492606, + 7506158.648222525, + 7507069.200253583, + 7508037.442205912, + 7508903.818976895, + 7490825.772271102, + 7491864.689757697, + 7492916.182605702, + 7492601.675778644, + 7492543.692947827, + 7492650.179472104, + 7492504.2474401975, + 7504023.818165967, + 7503802.840013571, + 7503526.350863925, + 7503319.79261976, + 7503201.512659313, + 7503146.041926193, + 7503004.886707106, + 7502858.230922394, + 7502758.70803037, + 7502621.773975609, + 7507850.745601907, + 7508049.260711595, + 7508281.05024187, + 7508448.578437336, + 7508547.11325418, + 7508818.54401165, + 7508958.199252176, + 7509183.0594342025, + 7509510.386527048, + 7510000.0, + 7509039.540376887, + 7508150.610234313, + 7507475.846219083, + 7506854.803228106, + 7506480.417593711, + 7506259.626961826, + 7505948.643392906, + 7505495.005195306, + 7504880.9632680155, + 7504474.085528871, + 7490000.0, +] +Z = [ + 533.0, + 533.0, + 540.0, + 540.0, + 549.0, + 550.0, + 556.0, + 558.0, + 568.0, + 571.0, + 582.0, + 586.0, + 593.0, + 598.0, + 591.0, + 582.0, + 569.0, + 565.0, + 563.0, + 556.0, + 554.0, + 549.0, + 543.0, + 537.0, + 535.0, + 531.0, + 525.0, + 518.0, + 528.0, + 536.0, + 538.0, + 531.0, + 539.0, + 544.0, + 546.0, + 551.0, + 556.0, + 562.0, + 571.0, + 574.0, + 575.0, + 581.0, + 586.0, + 601.0, + 609.0, + 619.0, + 609.0, + 606.0, + 597.0, + 588.0, + 581.0, + 574.0, + 569.0, + 563.0, + 561.0, + 556.0, + 553.0, + 542.0, + 539.0, + 640.0, + 577.0, + 601.0, + 584.0, + 629.0, + 561.0, + 562.0, + 600.0, + 658.0, + 660.0, + 767.0, + 778.0, + 724.0, + 772.0, + 739.0, + 791.0, + 812.0, + 675.0, + 649.0, + 690.0, + 670.0, + 682.0, + 761.0, + 804.0, + 629.0, + 582.0, + 596.0, + 585.0, + 611.0, + 634.0, + 650.0, + 594.0, + 558.0, + 607.0, + 578.0, + 599.0, + 594.0, + 551.0, + 555.0, + 558.0, + 553.0, + 561.0, + 590.0, + 578.0, + 560.0, + 667.0, + 656.0, + 649.0, + 638.0, + 631.0, + 623.0, + 623.0, + 615.0, + 608.0, + 607.0, + 602.0, + 602.0, + 606.0, + 643.0, + 617.0, + 594.0, + 572.0, + 504.0, + 484.0, + 497.0, + 503.0, + 507.0, + 521.0, + 521.0, + 520.0, + 512.0, + 506.0, + 502.0, + 502.0, + 504.0, + 598.0, + 575.0, + 580.0, + 564.0, + 567.0, + 555.0, + 540.0, + 539.0, + 552.0, + 537.0, + 527.0, + 532.0, + 547.0, + 534.0, + 521.0, + 496.0, + 516.0, + 503.0, + 510.0, + 503.0, + 532.0, + 529.0, + 566.0, + 528.0, + 555.0, + 558.0, + 533.0, + 535.0, + 547.0, + 538.0, + 600.0, + 549.0, + 465.0, + 533.0, + 521.0, + 536.0, + 561.0, + 559.0, + 583.0, + 560.0, + 533.0, + 556.0, + 544.0, + 561.0, + 560.0, + 543.0, + 691.0, + 719.0, + 667.0, + 642.0, + 621.0, + 640.0, + 625.0, + 598.0, + 614.0, + 585.0, + 596.0, + 636.0, + 634.0, + 571.0, + 561.0, + 534.0, + 565.0, + 552.0, + 573.0, + 585.0, + 546.0, + 547.0, + 555.0, + 540.0, + 543.0, + 544.0, + 551.0, + 545.0, + 546.0, + 544.0, + 555.0, + 546.0, + 529.0, + 541.0, + 569.0, + 553.0, + 561.0, + 681.0, + 646.0, + 639.0, + 619.0, + 612.0, + 602.0, + 600.0, + 591.0, + 579.0, + 580.0, + 602.0, + 593.0, + 585.0, + 570.0, + 552.0, + 554.0, + 560.0, + 636.0, + 602.0, + 600.0, + 608.0, + 591.0, + 585.0, + 573.0, + 571.0, + 581.0, + 564.0, + 625.0, + 650.0, + 664.0, + 608.0, + 635.0, + 644.0, + 659.0, + 812.0, + 616.0, + 611.0, + 622.0, + 629.0, + 677.0, + 641.0, + 647.0, + 602.0, + 600.0, + 603.0, + 582.0, + 573.0, + 591.0, + 634.0, + 573.0, + 566.0, + 554.0, + 549.0, + 545.0, + 549.0, + 550.0, + 550.0, + 543.0, + 532.0, + 545.0, + 546.0, + 544.0, + 549.0, + 551.0, + 568.0, + 577.0, + 580.0, + 584.0, + 629.0, + 628.0, + 617.0, + 609.0, + 600.0, + 594.0, + 591.0, + 594.0, + 592.0, + 596.0, + 592.0, + 579.0, +] +featureid = [ + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '0', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '7', + '7', + '7', + '7', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '5', + '6', + '6', + '6', + '6', + '1', + '1', + '1', + '2', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '6', + '7', + '8', + '8', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '9', + '0', + '0', + '2', + '2', + '2', + '0', + '0', + '1', + '2', + '2', + '2', + '2', + '3', + '3', + '3', + '3', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '4', + '5', + '5', + '6', + '7', + '7', + '7', + '7', + '7', + '7', + '7', + '0', + '1', + '1', + '1', + '0', + '0', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '5', + '0', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', + '4', + '5', + '5', + '5', + '5', + '5', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '0', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '1', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '2', + '3', +] + +s_c = pandas.DataFrame({'X': X, 'Y': Y, 'Z': Z, 'featureId': featureid}) + +##################################### +### TEST ThicknessCalculatorAlpha ### +##################################### + + +def check_thickness_values(result, column, description): + for order, position in [ + (max(st_units['stratigraphic_Order']), 'bottom'), + (min(st_units['stratigraphic_Order']), 'top'), + ]: + assert ( + result[result['stratigraphic_Order'] == order][column].values == -1 + ), f"ThicknessCalculatorAlpha: {position} unit not assigned as -1 ({description})" + + +geology = load_hamersley_geology() +geology.rename(columns={'unitname': 'UNITNAME', 'code': 'CODE'}, inplace=True) + +def test_calculate_thickness_thickness_calculator_alpha(): + # Run the calculation + md = MapData() + md.sampled_contacts = s_c + md.raw_data[Datatype.GEOLOGY] = geology + md.load_map_data(Datatype.GEOLOGY) + md.check_map(Datatype.GEOLOGY) + md.parse_geology_map() + + thickness_calculator = ThicknessCalculatorAlpha() + result = thickness_calculator.compute( + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + geology_data=md.get_map_data(Datatype.GEOLOGY), + sampled_contacts=md.sampled_contacts, + ) + + # is thickness calc alpha the label? + assert ( + thickness_calculator.thickness_calculator_label == 'ThicknessCalculatorAlpha' + ), 'ThicknessCalcAlpha: thickness calculator name not set correctly' + + # is the result a pandas dataframe? + assert isinstance(result, pandas.DataFrame), 'ThicknessCalcAlpha result not a pandas DataFrame' + + # Check if there is mean, std, and median in results + required_columns = ['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev'] + for column in required_columns: + assert column in result.columns, f'{column} not in ThicknessCalcAlpha result' + + # check if all units are in the results + assert 'name' in result.columns, 'unit_name not in ThicknessCalcAlpha result' + assert all( + name in result['name'].values for name in st_units['name'].values + ), 'units missing from in ThicknessCalcAlpha result' + + # are bottom and top units being assigned -1 + for column, description in [ + ('ThicknessMean', 'mean'), + ('ThicknessMedian', 'median'), + ('ThicknessStdDev', 'median'), + ]: + check_thickness_values(result, column, description) + + # are the dtypes numpy.float? + for column in required_columns: + assert result[column].dtype == numpy.float64, f'{column} not numpy.float64' + + # check for nans in the results + for column in required_columns: + assert not result[column].isnull().values.any(), f'{column} has NaN values' diff --git a/packages/map2loop/tests/topology/test_topology.py b/packages/map2loop/tests/topology/test_topology.py new file mode 100644 index 000000000..d5adce10f --- /dev/null +++ b/packages/map2loop/tests/topology/test_topology.py @@ -0,0 +1,90 @@ +import geopandas as gpd +from shapely.geometry import Polygon, LineString + +from map2loop.topology import Topology + + + +def simple_geology(): + poly1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)]) + poly2 = Polygon([(1, 0), (2, 0), (2, 1), (1, 1)]) + return gpd.GeoDataFrame( + { + "UNITNAME": ["A", "B"], + "INTRUSIVE": [False, False], + "SILL": [False, False], + "geometry": [poly1, poly2], + }, + geometry="geometry", + crs="EPSG:28350", + ) + + +def faults(): + line1 = LineString([(0, 0), (2, 1)]) + line2 = LineString([(0, 1), (2, 0)]) + return gpd.GeoDataFrame( + {"ID": [1, 2], "geometry": [line1, line2]}, geometry="geometry", crs="EPSG:28350" + ) + + +def test_initialisation_defaults(): + geology_data = simple_geology() + faults_data = faults() + topo = Topology(geology_data, faults_data) + + assert topo.sorted_units is None + assert topo._fault_fault_relationships is None + assert topo._unit_fault_relationships is None + assert topo._unit_unit_relationships is None + assert topo.buffer_radius == 500 + + +def test_calculate_fault_fault_relationships(): + geology_data = simple_geology() + faults_data = faults() + topo = Topology(geology_data, faults_data) + topo.buffer_radius = 0.1 + + df = topo.get_fault_fault_relationships() + assert list(df.columns) == ["Fault1", "Fault2", "Angle", "Type"] + assert len(df) == 1 + assert set(df.loc[0, ["Fault1", "Fault2"]]) == {1, 2} + assert df.loc[0, "Angle"] == 60 + assert df.loc[0, "Type"] == "T" + + +def test_calculate_unit_fault_relationships(): + geology_data = simple_geology() + faults_data = faults() + topo = Topology(geology_data, faults_data) + topo.buffer_radius = 0.1 + + df = topo.get_unit_fault_relationships() + assert set(df["Unit"]) == {"A", "B"} + assert set(df["Fault"]) == {1, 2} + # each unit is intersected by both faults + assert len(df) == 4 + + +def test_calculate_unit_unit_relationships_with_contacts(): + geology_data = simple_geology() + topo = Topology(geology_data, None) + df = topo.get_unit_unit_relationships() + assert list(df.columns) == ["UNITNAME_1", "UNITNAME_2"] + assert len(df) == 1 + assert set(df.loc[0]) == {"A", "B"} + + +def test_reset(): + geology_data = simple_geology() + faults_data = faults() + topo = Topology(geology_data, faults_data) + topo.buffer_radius = 0.1 + ffr = topo.get_fault_fault_relationships() + assert ffr is not None + + topo.reset() + assert topo._fault_fault_relationships is None + assert topo._unit_fault_relationships is None + assert topo._unit_unit_relationships is None \ No newline at end of file diff --git a/packages/map2loop/tests/utils/test_rgb_and_hex_functions.py b/packages/map2loop/tests/utils/test_rgb_and_hex_functions.py new file mode 100644 index 000000000..a4d82fd96 --- /dev/null +++ b/packages/map2loop/tests/utils/test_rgb_and_hex_functions.py @@ -0,0 +1,47 @@ +### This file tests the function generate_random_hex_colors() and hex_to_rgba() in map2loop/utils.py + +import pytest +import re +from map2loop.utils import generate_random_hex_colors, hex_to_rgb + +# does it return the right number of colors? +def test_generate_random_hex_colors_length(): + n = 5 + colors = generate_random_hex_colors(n) + assert ( + len(colors) == n + ), f"utils function generate_random_hex_colors not returning the right number of hex codes.Expected {n} colors, got {len(colors)}" + + +# are the returned hex strings the right format? +def test_generate_random_hex_colors_format(): + n = 10 + hex_pattern = re.compile(r'^#[0-9A-Fa-f]{6}$') + colors = generate_random_hex_colors(n) + for color in colors: + assert hex_pattern.match( + color + ), f"utils function generate_random_hex_colors not returning hex strings in the right format. Got {color} instead." + + +# is hex conversion to rgba working as expected? +def test_hex_to_rgba_long_hex(): + hex_color = "#1a2b3c" # long hex versions + expected_output = (0.10196078431372549, 0.16862745098039217, 0.23529411764705882, 1.0) + assert ( + hex_to_rgb(hex_color) == expected_output + ), f"utils function hex_to_rgba not doing hex to rgba conversion correctly. Expected {expected_output}, got {hex_to_rgb(hex_color)}" + + +def test_hex_to_rgba_short_hex(): + hex_color = "#abc" # short hex versions + expected_output = (0.6666666666666666, 0.7333333333333333, 0.8, 1.0) + assert hex_to_rgb(hex_color) == expected_output + + +# does it handle invalid inputs correctly? +def test_hex_to_rgba_invalid_hex(): + with pytest.raises(ValueError): + hex_to_rgb( + "12FF456" + ), "utils function hex_to_rgba is expected to raise a ValueError when an invalid hex string is passed, but it did not." diff --git a/pyproject.toml b/pyproject.toml index 68e0c1820..4cc805ad7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,6 +93,8 @@ members = ["packages/*"] [tool.uv.sources] loop-common = { workspace = true } loop-interpolation = { workspace = true } +loopstructuralvisualisation = { workspace = true } +LoopStructural = { workspace = true } [tool.pytest.ini_options] addopts = "--import-mode=importlib" @@ -206,6 +208,8 @@ allow-dict-calls-with-keyword-arguments = true # policy in a later stage. "packages/loop_common/src/**/*.py" = ["D", "ANN"] "packages/loop_interpolation/src/**/*.py" = ["D", "ANN"] +"packages/map2loop/src/**/*.py" = ["D", "ANN"] +"packages/loopstructural_visualisation/src/**/*.py" = ["D", "ANN"] "LoopStructural/__init__.py" = ["D", "ANN"] "LoopStructural/datasets/__init__.py" = ["D", "ANN"] "LoopStructural/datasets/_base.py" = ["D", "ANN"] @@ -285,7 +289,6 @@ allow-dict-calls-with-keyword-arguments = true "LoopStructural/modelling/intrusions/intrusion_feature.py" = ["D", "ANN"] "LoopStructural/modelling/intrusions/intrusion_frame.py" = ["D", "ANN"] "LoopStructural/modelling/intrusions/intrusion_frame_builder.py" = ["D", "ANN"] -"LoopStructural/modelling/intrusions/intrusion_support_functions.py" = ["D", "ANN"] "LoopStructural/utils/__init__.py" = ["D", "ANN"] "LoopStructural/utils/_api_registry.py" = ["D", "ANN"] "LoopStructural/utils/_log_sinks.py" = ["D", "ANN"] @@ -315,3 +318,5 @@ allow-dict-calls-with-keyword-arguments = true "setup.py" = ["D", "ANN"] "packages/loop_common/tests/*" = ["D", "ANN"] "packages/loop_interpolation/tests/*" = ["D", "ANN"] +"packages/map2loop/tests/*" = ["D", "ANN"] +"packages/loopstructural_visualisation/tests/*" = ["D", "ANN"] diff --git a/release-please-config.json b/release-please-config.json index 12789e168..9f6cc8d8f 100644 --- a/release-please-config.json +++ b/release-please-config.json @@ -11,6 +11,20 @@ "packages/loop_interpolation": { "release-type": "python", "component": "loop-interpolation" + }, + "packages/map2loop": { + "release-type": "python", + "component": "map2loop" + }, + "packages/loopstructural_visualisation": { + "release-type": "python", + "component": "loopstructuralvisualisation", + "extra-files": [ + { + "type": "generic", + "path": "src/loopstructuralvisualisation/version.py" + } + ] } } } diff --git a/tests/unit/modelling/intrusions/test_intrusions.py b/tests/unit/modelling/intrusions/test_intrusions.py index e700114fc..7d3b18685 100644 --- a/tests/unit/modelling/intrusions/test_intrusions.py +++ b/tests/unit/modelling/intrusions/test_intrusions.py @@ -1,3 +1,7 @@ +import numpy as np +import pandas as pd +import pytest + # Loop library from LoopStructural import GeologicalModel from LoopStructural.datasets import load_tabular_intrusion @@ -150,6 +154,301 @@ def counting_prepare_data(*args, **kwargs): assert intrusion_builder._up_to_date is True +def test_intrusion_gyxgz_weight_reaches_frame_build(): + """Regression test for a `gxygz`/`gyxgz` typo in + `GeologicalModel._build_intrusion` that silently dropped the caller's + coordinate-2 orthogonality weight: it was passed to + `IntrusionFrameBuilder.build` under the wrong keyword (`gxygz`), which + `StructuralFrameBuilder.build` doesn't recognise, so it fell into + `**kwargs` and `w3` silently stayed at its default. See INTRUSIONS.md + finding 3. + """ + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + model.data = data + model.nsteps = [10, 10, 10] + + conformable_feature = model.create_and_add_foliation("stratigraphy") + + captured_kwargs = {} + original_build = IntrusionFrameBuilder.build + + def capturing_build(self, *args, **kwargs): + captured_kwargs.update(kwargs) + return original_build(self, *args, **kwargs) + + IntrusionFrameBuilder.build = capturing_build + try: + model.create_and_add_intrusion( + "tabular_intrusion", + "tabular_intrusion_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [conformable_feature], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + gyxgz=5, + ) + finally: + IntrusionFrameBuilder.build = original_build + + assert captured_kwargs.get("gyxgz") == 5 + + +def test_intrusion_geometric_scaling_not_implemented(): + """`geometric_scaling_parameters` is only reached when one of the two + contacts (roof/floor) has no data. Before this test, that path always + raised `NotImplementedError` regardless of what was passed in, several + calls deep inside a helper that looked like it partially worked (see + INTRUSIONS.md finding 2). This pins the simplified, immediate failure + so the behaviour stays an explicit "not supported" rather than silently + regressing to something that looks like it works. + """ + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + single_contact_data = data[ + ~( + (data["feature_name"] == "tabular_intrusion") + & (data["intrusion_contact_type"] == "floor") + ) + ].copy() + # `tabular_intrusion.csv` doesn't have nx/ny/nz/tx/ty/tz columns, so it + # must be routed through `prepare_data` before evaluating any feature + # end-to-end (`model.data = ...` alone does not normalise columns) -- see + # INTRUSIONS.md finding 1b. + model.data = model.prepare_data(single_contact_data) + model.nsteps = [10, 10, 10] + + conformable_feature = model.create_and_add_foliation("stratigraphy") + + intrusion_feature = model.create_and_add_intrusion( + "tabular_intrusion", + "tabular_intrusion_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [conformable_feature], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + geometric_scaling_parameters={"thickness": 5.0}, + ) + + with pytest.raises( + NotImplementedError, match="geometric_scaling_parameters is not currently supported" + ): + intrusion_feature.evaluate_value(np.array([[2.5, 2.5, 1.5]])) + + +def test_intrusion_missing_data_raises_clear_error(): + """Before this test, an intrusion_name/intrusion_frame_name typo (or a + feature_name with no matching rows) would fail deep inside + `IntrusionFrameBuilder`/`IntrusionBuilder` with a bare `KeyError`, not at + the `create_and_add_intrusion` boundary. See INTRUSIONS.md finding 4. + """ + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + model.data = model.prepare_data(data) + model.nsteps = [10, 10, 10] + + conformable_feature = model.create_and_add_foliation("stratigraphy") + + with pytest.raises(ValueError, match="No data found for intrusion 'not_a_real_feature'"): + model.create_and_add_intrusion( + "not_a_real_feature", + "tabular_intrusion_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [conformable_feature], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + with pytest.raises(ValueError, match="No data found for intrusion frame 'not_a_real_frame'"): + model.create_and_add_intrusion( + "tabular_intrusion", + "not_a_real_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [conformable_feature], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + +def test_intrusion_missing_contact_type_column_raises_clear_error(): + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + incomplete_data = model.prepare_data(data).drop(columns=["intrusion_contact_type"]) + model.data = incomplete_data + model.nsteps = [10, 10, 10] + + conformable_feature = model.create_and_add_foliation("stratigraphy") + + with pytest.raises(ValueError, match="missing required column"): + model.create_and_add_intrusion( + "tabular_intrusion", + "tabular_intrusion_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [conformable_feature], + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + +def test_intrusion_missing_contact_anisotropies_raises_clear_error(): + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + model.data = model.prepare_data(data) + model.nsteps = [10, 10, 10] + + with pytest.raises(ValueError, match="contact_anisotropies"): + model.create_and_add_intrusion( + "tabular_intrusion", + "tabular_intrusion_frame", + intrusion_frame_parameters={"contact": "roof"}, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + +def _build_marginal_fault_model(): + """A minimal sill offset by a single bounding fault, to exercise the + `marginal_faults` code path in `IntrusionFrameBuilder` + (`set_marginal_faults_parameters`/`create_constraints_for_c0`), which + -- unlike the plain tabular-intrusion path -- has no test or example + anywhere in the codebase (see INTRUSIONS.md finding 1). Reuses the + `stratigraphy` feature and the `tabular_intrusion`/`tabular_intrusion_frame` + geometry from `load_tabular_intrusion()` (proven to build end-to-end), + just renamed, plus one fault. + """ + stratigraphy_rows = data[data["feature_name"] == "stratigraphy"].copy() + + fault_rows = pd.DataFrame( + [ + [2.5, 2.5, 2.5, 0, 1, 0, 0, "marginal_fault", 0], + [2.5, 2.5, 2.5, 1, 0, 0, 1, "marginal_fault", 0], + [2.5, 2.5, 2.5, 0, 0, 1, 2, "marginal_fault", 0], + ], + columns=["X", "Y", "Z", "nx", "ny", "nz", "coord", "feature_name", "val"], + ) + + sill_frame_rows = pd.DataFrame( + [ + [2.00, 2.00, 2.00, 0, np.nan, 0, 0, -1, "sill_frame"], + [3.00, 1.00, 2.00, 0, np.nan, 0, 0, -1, "sill_frame"], + [1.00, 3.00, 2.00, 0, np.nan, 0, 0, -1, "sill_frame"], + [3.00, 2.00, 1.00, 1, 0, np.nan, np.nan, np.nan, "sill_frame"], + [3.00, 2.00, 1.00, 1, np.nan, 0, 1, 0, "sill_frame"], + [2.50, 1.00, 1.00, 2, 0, np.nan, np.nan, np.nan, "sill_frame"], + [2.50, 2.00, 1.00, 2, 0, np.nan, np.nan, np.nan, "sill_frame"], + [2.50, 2.00, 1.00, 2, np.nan, 1, 0, 0, "sill_frame"], + ], + columns=["X", "Y", "Z", "coord", "val", "gx", "gy", "gz", "feature_name"], + ) + + # Roof/floor contact points spanning both sides of the Y=2.5 fault, and + # a handful flagged for the lateral (side) extent -- same shape as + # `tabular_intrusion`'s own contact data, just relabelled. + sill_contact_rows = pd.DataFrame( + [ + [3.04, 2.12, 2.18, "roof", False], + [4.02, 3.85, 2.14, "roof", True], + [2.02, 3.16, 2.02, "roof", False], + [2.12, 2.16, 2.02, "roof", False], + [1.14, 3.50, 2.04, "roof", True], + [4.08, 3.02, 1.18, "floor", True], + [1.14, 1.06, 1.16, "floor", True], + [4.20, 2.18, 1.12, "floor", True], + [1.02, 3.02, 1.12, "floor", True], + ], + columns=["X", "Y", "Z", "intrusion_contact_type", "intrusion_side"], + ) + sill_contact_rows["feature_name"] = "sill" + + model_data = pd.concat( + [stratigraphy_rows, fault_rows, sill_frame_rows, sill_contact_rows], + ignore_index=True, + ) + + model = GeologicalModel(boundary_points[0, :], boundary_points[1, :]) + model.data = model.prepare_data(model_data) + model.nsteps = [10, 10, 10] + + stratigraphy = model.create_and_add_foliation("stratigraphy") + fault = model.create_and_add_fault("marginal_fault", 0.5, nelements=1e4) + + return model, stratigraphy, fault + + +def test_intrusion_marginal_faults(): + model, stratigraphy, fault = _build_marginal_fault_model() + + intrusion_feature = model.create_and_add_intrusion( + "sill", + "sill_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [stratigraphy], + "marginal_faults": { + 0: { + "structure": fault, + "block": "hanging wall", + "series": stratigraphy, + } + }, + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + value = intrusion_feature.evaluate_value(np.array([[2.5, 2.5, 1.5]])) + assert np.isfinite(value).all() + + +def test_intrusion_steps_broken_with_current_stratigraphic_column(): + """`intrusion_steps` is currently unusable, not just untested. + + `IntrusionFrameBuilder.set_intrusion_steps_parameters` + (`intrusion_frame_builder.py`) reads + `self.model.stratigraphic_column[series_from_name.name][unit_from_name]`, + i.e. it expects `model.stratigraphic_column` to be the old nested + `{group_name: {unit_name: {...}}}` dict. `GeologicalModel.stratigraphic_column` + is now a `StratigraphicColumn` object whose `__getitem__` looks up a + single element by `uuid` (not by group/series name), and + `GeologicalModel.set_stratigraphic_column` (the old dict-based setter) + unconditionally raises `DeprecationWarning` -- so there is no longer any + way to put the model into the shape `intrusion_steps` expects. This is a + real regression from an unrelated stratigraphic-column refactor that was + never propagated to the intrusions module (see INTRUSIONS.md finding 1, + revised). This test pins the current failure so a future fix (Stage 6) + has a clear target and so this doesn't regress further/silently. + """ + model, stratigraphy, fault = _build_marginal_fault_model() + model.stratigraphic_column.add_unit("unitA", thickness=1) + model.stratigraphic_column.add_unit("unitB", thickness=1) + + with pytest.raises(KeyError, match="No element found with uuid"): + model.create_and_add_intrusion( + "sill", + "sill_frame", + intrusion_frame_parameters={ + "contact": "roof", + "contact_anisotropies": [stratigraphy], + "intrusion_steps": { + 0: { + "structure": fault, + "unit_from": "unitA", + "series_from": stratigraphy, + "unit_to": "unitB", + "series_to": stratigraphy, + } + }, + }, + intrusion_lateral_extent_model=ellipse_function, + intrusion_vertical_extent_model=constant_function, + ) + + # if __name__ == "__main__": # test_intrusion_freame_builder() # test_intrusion_builder() diff --git a/uv.lock b/uv.lock index a2cd82fb0..6debccde2 100644 --- a/uv.lock +++ b/uv.lock @@ -2,16 +2,20 @@ version = 1 revision = 3 requires-python = ">=3.9" resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] @@ -20,6 +24,8 @@ members = [ "loop-common", "loop-interpolation", "loopstructural", + "loopstructuralvisualisation", + "map2loop", ] [[package]] @@ -51,16 +57,20 @@ name = "aiohappyeyeballs" version = "2.7.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757, upload-time = "2026-07-01T17:11:55.501Z" } wheels = [ @@ -212,16 +222,20 @@ name = "aiohttp" version = "3.14.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "aiohappyeyeballs", version = "2.7.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -386,16 +400,20 @@ name = "alabaster" version = "1.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } wheels = [ @@ -419,16 +437,20 @@ name = "annotated-types" version = "0.8.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz", hash = "sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7", size = 15893, upload-time = "2026-07-23T20:16:13.995Z" } wheels = [ @@ -457,16 +479,20 @@ name = "anyio" version = "4.14.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "exceptiongroup", marker = "python_full_version == '3.10.*'" }, @@ -576,6 +602,43 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] +[[package]] +name = "beartype" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +sdist = { url = "https://files.pythonhosted.org/packages/04/96/43ed27f27127155f24f5cf85df0c27fd2ac2ab67d94cecc8f76933f91679/beartype-0.22.2.tar.gz", hash = "sha256:ff3a7df26af8d15fa87f97934f0f6d41bbdadca971c410819104998dd26013d2", size = 1574491, upload-time = "2025-10-04T06:37:56.451Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/2a/a4773109619010192e72f48e95165b14790413a51f513c879c8d63f67e17/beartype-0.22.2-py3-none-any.whl", hash = "sha256:12077afe3528eba5c5b801f816712f7ff06f6da5509994c79561e29b48bcedb8", size = 1317280, upload-time = "2025-10-04T06:37:53.99Z" }, +] + +[[package]] +name = "beartype" +version = "0.22.9" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", size = 1608866, upload-time = "2025-12-13T06:50:30.72Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", size = 1333658, upload-time = "2025-12-13T06:50:28.266Z" }, +] + [[package]] name = "beautifulsoup4" version = "4.15.0" @@ -615,16 +678,20 @@ name = "bleach" version = "6.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "webencodings", marker = "python_full_version >= '3.10'" }, @@ -750,16 +817,20 @@ name = "cffi" version = "2.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, @@ -867,6 +938,118 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/17/1073b53b68c9b5ca6914adf5f8bf55aacc2d3be102418c90700160ea8605/cffi-2.1.0-cp315-cp315t-win_arm64.whl", hash = "sha256:cbb7640ce37159548d2147b5b8c241f962143d4c71231431820783f4dc78f210", size = 186405, upload-time = "2026-07-06T21:34:24.857Z" }, ] +[[package]] +name = "cftime" +version = "1.6.4.post1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ab/c8/1155d1d58003105307c7e5985f422ae5bcb2ca0cbc553cc828f3c5a934a7/cftime-1.6.4.post1.tar.gz", hash = "sha256:50ac76cc9f10ab7bd46e44a71c51a6927051b499b4407df4f29ab13d741b942f", size = 54631, upload-time = "2024-10-22T18:48:34.194Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/6a/7ebd692ccf5b28d8c5e170fd11b0a2945f530392bc9887e858a0302b1745/cftime-1.6.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0baa9bc4850929da9f92c25329aa1f651e2d6f23e237504f337ee9e12a769f5d", size = 233017, upload-time = "2024-10-22T18:47:40.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/65/3b7a11139282f81ce40872acad7f99b65291f7401ceec7b6bb94c39c8441/cftime-1.6.4.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bb6b087f4b2513c37670bccd457e2a666ca489c5f2aad6e2c0e94604dc1b5b9", size = 213927, upload-time = "2024-10-22T18:47:42.536Z" }, + { url = "https://files.pythonhosted.org/packages/70/e3/1a56832b13ce0c5f3b798bf7bc60d4550fa1c514e04b613f9b0e48edc535/cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d9bdeb9174962c9ca00015190bfd693de6b0ec3ec0b3dbc35c693a4f48efdcc", size = 1252052, upload-time = "2024-10-22T18:47:44.25Z" }, + { url = "https://files.pythonhosted.org/packages/5c/aa/f62ce24417ecb19f5ba1aa1dbe72394d11f11f5e53fc53497ccfaab83d3c/cftime-1.6.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e735cfd544878eb94d0108ff5a093bd1a332dba90f979a31a357756d609a90d5", size = 1289731, upload-time = "2024-10-22T18:47:46.52Z" }, + { url = "https://files.pythonhosted.org/packages/e4/21/0cf99e16e9953d17cc37286201922d07f17ffc1743dbc50d0c9e6f98ddda/cftime-1.6.4.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dcd1b140bf50da6775c56bd7ca179e84bd258b2f159b53eefd5c514b341f2bf", size = 1317229, upload-time = "2024-10-22T18:47:47.754Z" }, + { url = "https://files.pythonhosted.org/packages/68/0f/95ce359a3bd91a8ec9b79d4961753053c72a5115e820a072d451568684c3/cftime-1.6.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:e60b8f24b20753f7548f410f7510e28b941f336f84bd34e3cfd7874af6e70281", size = 189078, upload-time = "2024-10-22T18:47:48.867Z" }, + { url = "https://files.pythonhosted.org/packages/85/e6/6a7d2120fcffee208cf637d22b0d8f2701d91f69f68a96940056429950f3/cftime-1.6.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1bf7be0a0afc87628cb8c8483412aac6e48e83877004faa0936afb5bf8a877ba", size = 233445, upload-time = "2024-10-22T18:47:51.09Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/fe0d14d52cffa72d3f1c281ff9f0f384968058d86ce24fdf9e736ce5b755/cftime-1.6.4.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0f64ca83acc4e3029f737bf3a32530ffa1fbf53124f5bee70b47548bc58671a7", size = 214458, upload-time = "2024-10-22T18:47:52.245Z" }, + { url = "https://files.pythonhosted.org/packages/55/c6/72f8fb5ee057f33ab747ba361f1396d2839a4689669aabd6217bc38430f7/cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7ebdfd81726b0cfb8b524309224fa952898dfa177c13d5f6af5b18cefbf497d", size = 1379075, upload-time = "2024-10-22T18:47:53.338Z" }, + { url = "https://files.pythonhosted.org/packages/77/81/6b30815698ede50f89013f25e46d66ed3a290b8a2d6b97f95bacbbe1eb5c/cftime-1.6.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9ea0965a4c87739aebd84fe8eed966e5809d10065eeffd35c99c274b6f8da15", size = 1415218, upload-time = "2024-10-22T18:47:54.763Z" }, + { url = "https://files.pythonhosted.org/packages/24/0d/73ab09a32da1478d3ef5f4ab6c59d42f2db2a2383b427c87e05ad81b71ad/cftime-1.6.4.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:800a18aea4e8cb2b206450397cb8a53b154798738af3cdd3c922ce1ca198b0e6", size = 1450704, upload-time = "2024-10-22T18:47:56.035Z" }, + { url = "https://files.pythonhosted.org/packages/79/b1/6551603f8ea31de55913c84e4def3c36670563bdea6e195fcc4b6225ddf7/cftime-1.6.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:5dcfc872f455db1f12eabe3c3ba98e93757cd60ed3526a53246e966ccde46c8a", size = 190200, upload-time = "2024-10-22T18:47:58.036Z" }, + { url = "https://files.pythonhosted.org/packages/50/81/0bb28d54088a61592f61a11e7fcabcea6d261c47af79e18d0f9cbcd940ae/cftime-1.6.4.post1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a590f73506f4704ba5e154ef55bfbaed5e1b4ac170f3caeb8c58e4f2c619ee4e", size = 226615, upload-time = "2024-10-22T18:47:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1e/38dbbf8a828dfb5e0e6e5c912818b77aacf2e7bcb97b262ac6126beeb29f/cftime-1.6.4.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:933cb10e1af4e362e77f513e3eb92b34a688729ddbf938bbdfa5ac20a7f44ba0", size = 209193, upload-time = "2024-10-22T18:48:00.767Z" }, + { url = "https://files.pythonhosted.org/packages/9b/60/0db884c76311ecaaf31f628aa9358beae5fcb0fbbdc2eb0b790a93aa258f/cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf17a1b36f62e9e73c4c9363dd811e1bbf1170f5ac26d343fb26012ccf482908", size = 1320215, upload-time = "2024-10-22T18:48:02.275Z" }, + { url = "https://files.pythonhosted.org/packages/8d/7d/2d5fc7af06da4f3bdea59a204f741bf7a30bc5019355991b2f083e557e4e/cftime-1.6.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e18021f421aa26527bad8688c1acf0c85fa72730beb6efce969c316743294f2", size = 1367426, upload-time = "2024-10-22T18:48:03.57Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ab/e8b26d05323fc5629356c82a7f64026248f121ea1361b49df441bbc8f2d7/cftime-1.6.4.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5835b9d622f9304d1c23a35603a0f068739f428d902860f25e6e7e5a1b7cd8ea", size = 1385593, upload-time = "2024-10-22T18:48:04.918Z" }, + { url = "https://files.pythonhosted.org/packages/af/7b/ca72a075a3f660315b031d62d39a3e9cfef71f7929da2621d5120077a75f/cftime-1.6.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:7f50bf0d1b664924aaee636eb2933746b942417d1f8b82ab6c1f6e8ba0da6885", size = 178918, upload-time = "2024-10-22T18:48:06.195Z" }, + { url = "https://files.pythonhosted.org/packages/da/d8/81f086dbdc6f5a4e0bb068263471f1d12861b72562fe8c18df38268e4e29/cftime-1.6.4.post1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5c89766ebf088c097832ea618c24ed5075331f0b7bf8e9c2d4144aefbf2f1850", size = 223418, upload-time = "2024-10-22T18:48:08.056Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cc/60a825d92a4023655e330470758280a31e7b82665ef77d0e2a0fe71ea958/cftime-1.6.4.post1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f27113f7ccd1ca32881fdcb9a4bec806a5f54ae621fc1c374f1171f3ed98ef2", size = 207395, upload-time = "2024-10-22T18:48:09.877Z" }, + { url = "https://files.pythonhosted.org/packages/ca/90/f5b26949899decce262fc76a1e64915b92050473114e0160cd6f7297f854/cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da367b23eea7cf4df071c88e014a1600d6c5bbf22e3393a4af409903fa397e28", size = 1318113, upload-time = "2024-10-22T18:48:11.465Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f8/6f13d37abb7ade46e65a08acc31af776a96dde0eb569e05d4c4b01422ba6/cftime-1.6.4.post1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6579c5c83cdf09d73aa94c7bc34925edd93c5f2c7dd28e074f568f7e376271a0", size = 1366034, upload-time = "2024-10-22T18:48:13.154Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/335cb17f3b708f9a24f96ca4abb00889c7aa20b0ae273313e7c11faf1f97/cftime-1.6.4.post1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6b731c7133d17b479ca0c3c46a7a04f96197f0a4d753f4c2284c3ff0447279b4", size = 1390156, upload-time = "2024-10-22T18:48:15.22Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2d/980323fb5ec1ef369604b61ba259a41d0336cc1a85b639ed7bd210bd1290/cftime-1.6.4.post1-cp313-cp313-win_amd64.whl", hash = "sha256:d2a8c223faea7f1248ab469cc0d7795dd46f2a423789038f439fee7190bae259", size = 178496, upload-time = "2024-10-22T18:48:16.8Z" }, + { url = "https://files.pythonhosted.org/packages/88/2e/8ed932c4deba0010a330c31a090fcbb4538761696a0706afcbc46967be03/cftime-1.6.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:44e9f8052600803b55f8cb6bcac2be49405c21efa900ec77a9fb7f692db2f7a6", size = 233329, upload-time = "2024-10-22T18:48:25.201Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ff/da16cf74a1c8e1803370973852692008d84b8263d53d51b60755c8e714e6/cftime-1.6.4.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a90b6ef4a3fc65322c212a2c99cec75d1886f1ebaf0ff6189f7b327566762222", size = 214269, upload-time = "2024-10-22T18:48:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/faa2137f268211ab3977997494cc1fa7f2883578cc2c42c3e8daf27ec375/cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:652700130dbcca3ae36dbb5b61ff360e62aa09fabcabc42ec521091a14389901", size = 1254873, upload-time = "2024-10-22T18:48:28.813Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e1/365495f6224ed2af76aa46d0a2e2611991486ef1a4655e7b2a48df706899/cftime-1.6.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a7fb6cc541a027dab37fdeb695f8a2b21cd7d200be606f81b5abc38f2391e2", size = 1290854, upload-time = "2024-10-22T18:48:30.21Z" }, + { url = "https://files.pythonhosted.org/packages/74/ee/9bc0c5d2f2be8305c3eae4b1f7b2fc88f314170c4c5a8cb80634311b68ed/cftime-1.6.4.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fc2c0abe2dbd147e1b1e6d0f3de19a5ea8b04956acc204830fd8418066090989", size = 1315314, upload-time = "2024-10-22T18:48:31.63Z" }, + { url = "https://files.pythonhosted.org/packages/33/c3/7bfe4945e2cb42bf88c090dfc2141e7cef5f296ee046738a469d2ce43b6c/cftime-1.6.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:0ee2f5af8643aa1b47b7e388763a1a6e0dc05558cd2902cffb9cbcf954397648", size = 189177, upload-time = "2024-10-22T18:48:32.888Z" }, +] + +[[package]] +name = "cftime" +version = "1.6.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/65/dc/470ffebac2eb8c54151eb893055024fe81b1606e7c6ff8449a588e9cd17f/cftime-1.6.5.tar.gz", hash = "sha256:8225fed6b9b43fb87683ebab52130450fc1730011150d3092096a90e54d1e81e", size = 326605, upload-time = "2025-10-13T18:56:26.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/45/dcc38d7b293107d3e33b3d94b2619687eb414a4f16880e2e841cdb6ac49a/cftime-1.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ad81e8cb0eb873b33c3d1e22c6168163fdc64daa8f7aeb4da8092f272575f4d", size = 510221, upload-time = "2025-10-13T18:55:52.976Z" }, + { url = "https://files.pythonhosted.org/packages/68/63/2875341516fcfe80f1a16f86b420aec9441223ab5381d554441c9fdae56e/cftime-1.6.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:12d95c6af852114a13301c5a61e41afdbd1542e72939c1083796f8418b9b8b0e", size = 490684, upload-time = "2025-10-13T18:55:54.685Z" }, + { url = "https://files.pythonhosted.org/packages/80/7f/85f2c4c7ae8300b7871af7d7d144ad06f71dc0dd6258f0d18fd966067d1b/cftime-1.6.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2659b7df700e27d9e3671f686ce474dfb5fc274966961edf996acc148dfa094a", size = 1592268, upload-time = "2025-10-13T19:39:10.992Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9a/72dbd72498e958edf41a770bbd05e68141774325a945092059f4eb9c653d/cftime-1.6.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:94cebdfcda6a985b8e69aed22d00d6b8aa1f421495adbdcff1d59b3e896d81e2", size = 1624716, upload-time = "2025-10-13T18:55:55.848Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/2c4c720ad8bbe87994ca62a0e3c09d3786b984af664a91a6f3a668aa0b13/cftime-1.6.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:179681b023349a2fe277ceccc89d4fc52c0dd105cb59b7187b5bc5d442875133", size = 1705927, upload-time = "2025-10-13T18:55:57.711Z" }, + { url = "https://files.pythonhosted.org/packages/da/77/66484061dee5fbcb2fdcfa6a491d4efb880725117f4a339d20a5323105df/cftime-1.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:d8b9fdecb466879cfe8ca4472b229b6f8d0bb65e4ffd44266ae17484bac2cf38", size = 472435, upload-time = "2025-10-13T18:55:59.092Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f6/9da7aba9548ede62d25936b8b448acd7e53e5dcc710896f66863dcc9a318/cftime-1.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:474e728f5a387299418f8d7cb9c52248dcd5d977b2a01de7ec06bba572e26b02", size = 512733, upload-time = "2025-10-13T18:56:00.189Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d5/d86ad95fc1fd89947c34b495ff6487b6d361cf77500217423b4ebcb1f0c2/cftime-1.6.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ab9e80d4de815cac2e2d88a2335231254980e545d0196eb34ee8f7ed612645f1", size = 492946, upload-time = "2025-10-13T18:56:01.262Z" }, + { url = "https://files.pythonhosted.org/packages/4f/93/d7e8dd76b03a9d5be41a3b3185feffc7ea5359228bdffe7aa43ac772a75b/cftime-1.6.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ad24a563784e4795cb3d04bd985895b5db49ace2cbb71fcf1321fd80141f9a52", size = 1689856, upload-time = "2025-10-13T19:39:12.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8d/86586c0d75110f774e46e2bd6d134e2d1cca1dedc9bb08c388fa3df76acd/cftime-1.6.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a3cda6fd12c7fb25eff40a6a857a2bf4d03e8cc71f80485d8ddc65ccbd80f16a", size = 1718573, upload-time = "2025-10-13T18:56:02.788Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fe/7956914cfc135992e89098ebbc67d683c51ace5366ba4b114fef1de89b21/cftime-1.6.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:28cda78d685397ba23d06273b9c916c3938d8d9e6872a537e76b8408a321369b", size = 1788563, upload-time = "2025-10-13T18:56:04.075Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c7/6669708fcfe1bb7b2a7ce693b8cc67165eac00d3ac5a5e8f6ce1be551ff9/cftime-1.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:93ead088e3a216bdeb9368733a0ef89a7451dfc1d2de310c1c0366a56ad60dc8", size = 473631, upload-time = "2025-10-13T18:56:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/82/c5/d70cb1ab533ca790d7c9b69f98215fa4fead17f05547e928c8f2b8f96e54/cftime-1.6.5-cp311-cp311-win_arm64.whl", hash = "sha256:3384d69a0a7f3d45bded21a8cbcce66c8ba06c13498eac26c2de41b1b9b6e890", size = 459383, upload-time = "2026-01-02T21:16:47.317Z" }, + { url = "https://files.pythonhosted.org/packages/b6/c1/e8cb7f78a3f87295450e7300ebaecf83076d96a99a76190593d4e1d2be40/cftime-1.6.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:eef25caed5ebd003a38719bd3ff8847cd52ef2ea56c3ebdb2c9345ba131fc7c5", size = 504175, upload-time = "2025-10-13T18:56:06.398Z" }, + { url = "https://files.pythonhosted.org/packages/50/1a/86e1072b09b2f9049bb7378869f64b6747f96a4f3008142afed8955b52a4/cftime-1.6.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c87d2f3b949e45463e559233c69e6a9cf691b2b378c1f7556166adfabbd1c6b0", size = 485980, upload-time = "2025-10-13T18:56:08.669Z" }, + { url = "https://files.pythonhosted.org/packages/35/28/d3177b60da3f308b60dee2aef2eb69997acfab1e863f0bf0d2a418396ce5/cftime-1.6.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:82cb413973cc51b55642b3a1ca5b28db5b93a294edbef7dc049c074b478b4647", size = 1591166, upload-time = "2025-10-13T19:39:14.109Z" }, + { url = "https://files.pythonhosted.org/packages/d1/fd/a7266970312df65e68b5641b86e0540a739182f5e9c62eec6dbd29f18055/cftime-1.6.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85ba8e7356d239cfe56ef7707ac30feaf67964642ac760a82e507ee3c5db4ac4", size = 1642614, upload-time = "2025-10-13T18:56:09.815Z" }, + { url = "https://files.pythonhosted.org/packages/c4/73/f0035a4bc2df8885bb7bd5fe63659686ea1ec7d0cc74b4e3d50e447402e5/cftime-1.6.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:456039af7907a3146689bb80bfd8edabd074c7f3b4eca61f91b9c2670addd7ad", size = 1688090, upload-time = "2025-10-13T18:56:11.442Z" }, + { url = "https://files.pythonhosted.org/packages/88/15/8856a0ab76708553ff597dd2e617b088c734ba87dc3fd395e2b2f3efffe8/cftime-1.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:da84534c43699960dc980a9a765c33433c5de1a719a4916748c2d0e97a071e44", size = 464840, upload-time = "2025-10-13T18:56:12.506Z" }, + { url = "https://files.pythonhosted.org/packages/3a/85/451009a986d9273d2208fc0898aa00262275b5773259bf3f942f6716a9e7/cftime-1.6.5-cp312-cp312-win_arm64.whl", hash = "sha256:c62cd8db9ea40131eea7d4523691c5d806d3265d31279e4a58574a42c28acd77", size = 450534, upload-time = "2026-01-02T21:16:48.784Z" }, + { url = "https://files.pythonhosted.org/packages/2e/60/74ea344b3b003fada346ed98a6899085d6fd4c777df608992d90c458fda6/cftime-1.6.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4aba66fd6497711a47c656f3a732c2d1755ad15f80e323c44a8716ebde39ddd5", size = 502453, upload-time = "2025-10-13T18:56:13.545Z" }, + { url = "https://files.pythonhosted.org/packages/1e/14/adb293ac6127079b49ff11c05cf3d5ce5c1f17d097f326dc02d74ddfcb6e/cftime-1.6.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89e7cba699242366e67d6fb5aee579440e791063f92a93853610c91647167c0d", size = 484541, upload-time = "2025-10-13T18:56:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/4f/74/bb8a4566af8d0ef3f045d56c462a9115da4f04b07c7fbbf2b4875223eebd/cftime-1.6.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f1eb43d7a7b919ec99aee709fb62ef87ef1cf0679829ef93d37cc1c725781e9", size = 1591014, upload-time = "2025-10-13T19:39:15.346Z" }, + { url = "https://files.pythonhosted.org/packages/ba/08/52f06ff2f04d376f9cd2c211aefcf2b37f1978e43289341f362fc99f6a0e/cftime-1.6.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e02a1d80ffc33fe469c7db68aa24c4a87f01da0c0c621373e5edadc92964900b", size = 1633625, upload-time = "2025-10-13T18:56:15.745Z" }, + { url = "https://files.pythonhosted.org/packages/cf/33/03e0b23d58ea8fab94ecb4f7c5b721e844a0800c13694876149d98830a73/cftime-1.6.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18ab754805233cdd889614b2b3b86a642f6d51a57a1ec327c48053f3414f87d8", size = 1684269, upload-time = "2025-10-13T18:56:17.04Z" }, + { url = "https://files.pythonhosted.org/packages/a4/60/a0cfba63847b43599ef1cdbbf682e61894994c22b9a79fd9e1e8c7e9de41/cftime-1.6.5-cp313-cp313-win_amd64.whl", hash = "sha256:6c27add8f907f4a4cd400e89438f2ea33e2eb5072541a157a4d013b7dbe93f9c", size = 465364, upload-time = "2025-10-13T18:56:18.05Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e8/ec32f2aef22c15604e6fda39ff8d581a00b5469349f8fba61640d5358d2c/cftime-1.6.5-cp313-cp313-win_arm64.whl", hash = "sha256:31d1ff8f6bbd4ca209099d24459ec16dea4fb4c9ab740fbb66dd057ccbd9b1b9", size = 450468, upload-time = "2026-01-02T21:16:50.193Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6c/a9618f589688358e279720f5c0fe67ef0077fba07334ce26895403ebc260/cftime-1.6.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c69ce3bdae6a322cbb44e9ebc20770d47748002fb9d68846a1e934f1bd5daf0b", size = 502725, upload-time = "2025-10-13T18:56:19.424Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e3/da3c36398bfb730b96248d006cabaceed87e401ff56edafb2a978293e228/cftime-1.6.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e62e9f2943e014c5ef583245bf2e878398af131c97e64f8cd47c1d7baef5c4e2", size = 485445, upload-time = "2025-10-13T18:56:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/32/93/b05939e5abd14bd1ab69538bbe374b4ee2a15467b189ff895e9a8cdaddf6/cftime-1.6.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7da5fdaa4360d8cb89b71b8ded9314f2246aa34581e8105c94ad58d6102d9e4f", size = 1584434, upload-time = "2025-10-13T19:39:17.084Z" }, + { url = "https://files.pythonhosted.org/packages/7f/89/648397f9936e0b330999c4e776ebf296ec3c6a65f9901687dbca4ab820da/cftime-1.6.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bff865b4ea4304f2744a1ad2b8149b8328b321dd7a2b9746ef926d229bd7cd49", size = 1609812, upload-time = "2025-10-13T18:56:21.971Z" }, + { url = "https://files.pythonhosted.org/packages/e7/0f/901b4835aa67ad3e915605d4e01d0af80a44b114eefab74ae33de6d36933/cftime-1.6.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e552c5d1c8a58f25af7521e49237db7ca52ed2953e974fe9f7c4491e95fdd36c", size = 1669768, upload-time = "2025-10-13T18:56:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/22/d5/e605e4b28363e7a9ae98ed12cabbda5b155b6009270e6a231d8f10182a17/cftime-1.6.5-cp314-cp314-win_amd64.whl", hash = "sha256:e645b095dc50a38ac454b7e7f0742f639e7d7f6b108ad329358544a6ff8c9ba2", size = 463818, upload-time = "2025-10-13T18:56:25.376Z" }, + { url = "https://files.pythonhosted.org/packages/3d/89/a8f85ae697ff10206ec401c2621f5ca9f327554f586d62f244739ceeb347/cftime-1.6.5-cp314-cp314-win_arm64.whl", hash = "sha256:b9044d7ac82d3d8af189df1032fdc871bbd3f3dd41a6ec79edceb5029b71e6e0", size = 459862, upload-time = "2026-01-02T20:45:02.625Z" }, + { url = "https://files.pythonhosted.org/packages/ab/05/7410e12fd03a0c52717e74e6a1b49958810807dda212e23b65d43ea99676/cftime-1.6.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9ef56460cb0576e1a9161e1428c9e1a633f809a23fa9d598f313748c1ae5064e", size = 533781, upload-time = "2026-01-02T20:45:04.818Z" }, + { url = "https://files.pythonhosted.org/packages/44/ba/10e3546426d3ed9f9cc82e4a99836bb6fac1642c7830f7bdd0ac1c3f0805/cftime-1.6.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4f4873d38b10032f9f3111c547a1d485519ae64eee6a7a2d091f1f8b08e1ba50", size = 515218, upload-time = "2026-01-02T20:45:06.788Z" }, + { url = "https://files.pythonhosted.org/packages/bd/68/efa11eae867749e921bfec6a865afdba8166e96188112dde70bb8bb49254/cftime-1.6.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ccce0f4c9d3f38dd948a117e578b50d0e0db11e2ca9435fb358fd524813e4b61", size = 1579932, upload-time = "2026-01-02T20:45:11.194Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6c/0971e602c1390a423e6621dfbad9f1d375186bdaf9c9c7f75e06f1fbf355/cftime-1.6.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19cbfc5152fb0b34ce03acf9668229af388d7baa63a78f936239cb011ccbe6b1", size = 1555894, upload-time = "2026-01-02T20:45:16.351Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fc/8475a15b7c3209a4a68b563dfc5e01ce74f2d8b9822372c3d30c68ab7f39/cftime-1.6.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4470cd5ef3c2514566f53efbcbb64dd924fa0584637d90285b2f983bd4ee7d97", size = 513027, upload-time = "2026-01-02T20:45:20.023Z" }, + { url = "https://files.pythonhosted.org/packages/f7/80/4ecbda8318fbf40ad4e005a4a93aebba69e81382e5b4c6086251cd5d0ee8/cftime-1.6.5-cp314-cp314t-win_arm64.whl", hash = "sha256:034c15a67144a0a5590ef150c99f844897618b148b87131ed34fda7072614662", size = 469065, upload-time = "2026-01-02T20:45:23.398Z" }, +] + [[package]] name = "charset-normalizer" version = "3.4.9" @@ -1029,16 +1212,20 @@ name = "colorcet" version = "3.2.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/3f/af/b969f541242b84cbbacabdf20862e487689e352bf0f02f90df2795d29da5/colorcet-3.2.1.tar.gz", hash = "sha256:48d9a67e6e59dc5c0a965aa1b46fe5d59cdc95cc36a95949f29313f950ac59f7", size = 2202958, upload-time = "2026-04-28T16:25:37.43Z" } wheels = [ @@ -1137,7 +1324,8 @@ name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -1207,11 +1395,14 @@ name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -1362,7 +1553,8 @@ name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } @@ -1375,11 +1567,14 @@ name = "docutils" version = "0.22.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -1493,16 +1688,20 @@ name = "fonttools" version = "4.63.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } wheels = [ @@ -1717,10 +1916,12 @@ name = "geoh5py" version = "0.1.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] dependencies = [ @@ -1740,10 +1941,12 @@ name = "geoh5py" version = "0.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -1784,16 +1987,20 @@ name = "geopandas" version = "1.1.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -1855,16 +2062,20 @@ name = "h5py" version = "3.15.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -1943,16 +2154,20 @@ name = "imageio" version = "2.37.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -1981,16 +2196,20 @@ name = "imagesize" version = "2.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } wheels = [ @@ -2038,16 +2257,20 @@ name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ @@ -2084,7 +2307,8 @@ name = "ipython" version = "8.39.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "colorama", marker = "python_full_version == '3.10.*' and sys_platform == 'win32'" }, @@ -2109,11 +2333,14 @@ name = "ipython" version = "9.15.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -2200,16 +2427,20 @@ name = "jedi" version = "0.20.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "parso", marker = "python_full_version >= '3.10'" }, @@ -2257,16 +2488,20 @@ name = "jsonpointer" version = "3.1.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } wheels = [ @@ -2309,16 +2544,20 @@ name = "jsonschema" version = "4.26.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "attrs", marker = "python_full_version >= '3.10'" }, @@ -2383,16 +2622,20 @@ name = "jupyter-client" version = "8.9.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "jupyter-core", version = "5.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -2429,16 +2672,20 @@ name = "jupyter-core" version = "5.9.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "platformdirs", version = "4.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -2509,16 +2756,20 @@ name = "jupyter-server" version = "2.20.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "anyio", version = "4.14.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -2705,16 +2956,20 @@ name = "kiwisolver" version = "1.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } wheels = [ @@ -2868,7 +3123,7 @@ wheels = [ [[package]] name = "loop-common" -version = "0.1.0" +version = "0.0.2" source = { editable = "packages/loop_common" } dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -2906,7 +3161,7 @@ provides-extras = ["tests"] [[package]] name = "loop-interpolation" -version = "0.1.0" +version = "0.0.1" source = { editable = "packages/loop_interpolation" } dependencies = [ { name = "loop-common" }, @@ -2936,6 +3191,22 @@ requires-dist = [ ] provides-extras = ["tests"] +[[package]] +name = "loopprojectfile" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "netcdf4", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "netcdf4", version = "1.7.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'" }, + { name = "netcdf4", version = "1.7.4", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.10' and platform_machine != 'ARM64') or (python_full_version >= '3.11' and platform_machine == 'ARM64' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'win32')" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/38/6c/d2ffa1ddf84a09d5314a0e0249eb7b8f5752df909428117a6dc56ddfb920/loopprojectfile-0.2.2.tar.gz", hash = "sha256:b5589228c7cecb0a39a9c8ec87dab803ba24aa8e001e85b04fd09cb916980ae5", size = 29456, upload-time = "2024-12-16T04:38:45.819Z" } + [[package]] name = "loopsolver" version = "0.1.0" @@ -3057,9 +3328,9 @@ requires-dist = [ { name = "loop-common", editable = "packages/loop_common" }, { name = "loop-interpolation", editable = "packages/loop_interpolation" }, { name = "loopsolver", marker = "extra == 'inequalities'" }, - { name = "loopstructural", extras = ["inequalities"], marker = "extra == 'all'" }, - { name = "loopstructuralvisualisation", marker = "extra == 'visualisation'", specifier = ">=0.1.14" }, - { name = "loopstructuralvisualisation", extras = ["all"], marker = "extra == 'docs'" }, + { name = "loopstructural", extras = ["inequalities"], marker = "extra == 'all'", editable = "." }, + { name = "loopstructuralvisualisation", marker = "extra == 'visualisation'", editable = "packages/loopstructural_visualisation" }, + { name = "loopstructuralvisualisation", extras = ["all"], marker = "extra == 'docs'", editable = "packages/loopstructural_visualisation" }, { name = "matplotlib", marker = "extra == 'visualisation'" }, { name = "meshio", marker = "extra == 'docs'" }, { name = "myst-parser", marker = "extra == 'docs'" }, @@ -3089,8 +3360,7 @@ provides-extras = ["all", "visualisation", "export", "jupyter", "inequalities", [[package]] name = "loopstructuralvisualisation" -version = "0.1.17" -source = { registry = "https://pypi.org/simple" } +source = { editable = "packages/loopstructural_visualisation" } dependencies = [ { name = "loopstructural" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -3099,23 +3369,229 @@ dependencies = [ { name = "pyvista", version = "0.46.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pyvista", version = "0.48.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/43/6e/ad1f34c464fb4a592bb5cefe14b890ff3d7698fbf3467d24aba8a68d291c/loopstructuralvisualisation-0.1.17.tar.gz", hash = "sha256:70b5021fc1d29246db29da7d3690c419c9f71171cad73d78760f6b0329d598f2", size = 15888, upload-time = "2025-08-14T06:44:23.487Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/71/da/7cefd4d60451fe99bf29903144a698ce73ce6f6b786bfd17395d40fd37ba/loopstructuralvisualisation-0.1.17-py3-none-any.whl", hash = "sha256:f67eddb3f5417583bee33abd5e6ee559db0682dd2e0a3a80e3e4ac98a64f5fdb", size = 16810, upload-time = "2025-08-14T06:44:22.029Z" }, -] [package.optional-dependencies] all = [ { name = "pyvista", version = "0.46.5", source = { registry = "https://pypi.org/simple" }, extra = ["all"], marker = "python_full_version < '3.10'" }, { name = "pyvista", version = "0.48.4", source = { registry = "https://pypi.org/simple" }, extra = ["all"], marker = "python_full_version >= '3.10'" }, ] +jupyter = [ + { name = "pyvista", version = "0.46.5", source = { registry = "https://pypi.org/simple" }, extra = ["jupyter"], marker = "python_full_version < '3.10'" }, + { name = "pyvista", version = "0.48.4", source = { registry = "https://pypi.org/simple" }, extra = ["jupyter"], marker = "python_full_version >= '3.10'" }, +] +tests = [ + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[package.metadata] +requires-dist = [ + { name = "loopstructural", editable = "." }, + { name = "numpy", specifier = ">=1.18" }, + { name = "pytest", marker = "extra == 'tests'" }, + { name = "pyvista", specifier = ">=0.42" }, + { name = "pyvista", extras = ["all"], marker = "extra == 'all'" }, + { name = "pyvista", extras = ["jupyter"], marker = "extra == 'jupyter'" }, +] +provides-extras = ["jupyter", "all", "tests"] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/da/dbe4dfc01ac226fb0504fad035f4d69f3202f3502e20e68537631daddd96/lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60", size = 8541124, upload-time = "2026-05-18T19:17:11.589Z" }, + { url = "https://files.pythonhosted.org/packages/78/20/f7095ed9fc2c025f9cfe71cc6ec9f1feb05624edc1812423b5f1aecf3d4b/lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d", size = 4602783, upload-time = "2026-05-18T19:17:20.888Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a4/65c63ca98bd129f6cff7b8c2fa48953ab058cc6005b541354e7dd54d8000/lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea", size = 5002687, upload-time = "2026-05-18T19:17:01.738Z" }, + { url = "https://files.pythonhosted.org/packages/96/1d/ab7a5c4b5a394d98a94e2d0fc67bab8297597426770dd4978370fbdaf531/lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074", size = 5155099, upload-time = "2026-05-18T19:17:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b1/07603bfeeb891a2596d5c2a68f7d2f70f7d11c841ebe391412c69c2857b0/lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30", size = 5057225, upload-time = "2026-05-18T19:17:08.117Z" }, + { url = "https://files.pythonhosted.org/packages/7a/16/cb391ee4b90186fa16d9ebcbe3ea96c71b8da3b0686386c8dcbcc3c67d44/lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315", size = 5287643, upload-time = "2026-05-18T19:17:11.507Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d6/b619717f918fd76747448fdbaee0e769edbc70e659b5b5d0112b7020b7a3/lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1", size = 5412445, upload-time = "2026-05-18T19:17:22.182Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/12bc5390ac0a3edeb579d9535e5049a5dda663438728e179d52fb319c33a/lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206", size = 4770864, upload-time = "2026-05-18T19:17:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/0b/59/6500c09da3137f54f020e908d81cfc5ee3e8888e908fd380207afad7c2e6/lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067", size = 5359594, upload-time = "2026-05-18T19:17:32.527Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9b/f64b4cc6b7ebcf75d95af3cde934d254b5f2f10d4163928d838d86b6eb48/lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a", size = 5107713, upload-time = "2026-05-18T19:17:04.402Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/c7388ad5d3a72315d2832dc1458cbf4f2af7f2b990b606ff4876efd04511/lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa", size = 4803973, upload-time = "2026-05-18T19:17:06.545Z" }, + { url = "https://files.pythonhosted.org/packages/3f/22/76197f0bbf165f0b9e75be59be4997e5259cde973f12f098c1b54c7f5d60/lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383", size = 5349925, upload-time = "2026-05-18T19:17:09.743Z" }, + { url = "https://files.pythonhosted.org/packages/24/52/d2a0cfeccb9bcdc47c7ee05cdae5d69b48c9acf20997790a6338bb0d0b3b/lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1", size = 5309825, upload-time = "2026-05-18T19:17:13.831Z" }, + { url = "https://files.pythonhosted.org/packages/19/4a/b30944266776c2f49749ef2445aa7e78898194134b80ad776386f61b56ae/lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a", size = 3598402, upload-time = "2026-05-18T19:17:08.21Z" }, + { url = "https://files.pythonhosted.org/packages/9e/97/33691c66a4d7ec1a5a98e7c909a5b83ee45c7f7ba4cf92b1c4cf26e98079/lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5", size = 4021295, upload-time = "2026-05-18T19:17:28.638Z" }, + { url = "https://files.pythonhosted.org/packages/d0/5f/26a4dd0e12b9456ff7b12a21af5b491eb6629680d1edd73f4140fd386bcf/lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485", size = 3667717, upload-time = "2026-05-19T19:22:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/62/b0/83f481780d1548750b8ce2ec824073deef2f452d9cd1a6faff8507e3d16d/lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2", size = 8526461, upload-time = "2026-05-18T19:17:25.862Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/30fa0f808002c7329397bfbb24e306789c0b29f04aa5842c07b174b4216f/lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d", size = 4595375, upload-time = "2026-05-18T19:17:34.555Z" }, + { url = "https://files.pythonhosted.org/packages/4f/d2/edb71cf0e561581a7c5eb2626244320eb04e9f8ce6d563184fd668b45073/lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510", size = 4923654, upload-time = "2026-05-18T19:17:42.917Z" }, + { url = "https://files.pythonhosted.org/packages/4c/77/1bc7eeb0de4577d783fb625aa092cc9357883bba35845a3666bf1259f3dc/lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a", size = 5067921, upload-time = "2026-05-18T19:17:49.175Z" }, + { url = "https://files.pythonhosted.org/packages/1b/3c/c0690d74bd2bc17bc03b5b0d093569ead597dd0bfa088bf99eef8c24e19c/lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d", size = 5002456, upload-time = "2026-05-18T19:17:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/66/8d/d1b3271af0c0f1e27e8472a849e4d2c65bc7766884b9ad2da9e76e145c88/lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8", size = 5202776, upload-time = "2026-05-18T19:18:08.924Z" }, + { url = "https://files.pythonhosted.org/packages/7a/45/689824ffb237fd10125ad273f32b28ff04dc6203c2822c85ff65a93df65e/lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009", size = 5329945, upload-time = "2026-05-18T19:18:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/5d/c0/ef73af53767e958fd87d437c170f272e2f6e6c0f854939f133a895f1e711/lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6", size = 4659237, upload-time = "2026-05-18T19:18:18.657Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5e/e1158e40397585e91cb0472374a1f63d0926a1ddeaa92f13d1a1ffe306d5/lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8", size = 5265904, upload-time = "2026-05-18T19:18:24.883Z" }, + { url = "https://files.pythonhosted.org/packages/a0/16/8687e5d1400ed1c0bc41dace232ebb7553952b618ea1f2e5fb6e2cfbbe23/lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83", size = 5045225, upload-time = "2026-05-18T19:17:20.073Z" }, + { url = "https://files.pythonhosted.org/packages/ca/18/d877bd1ae2e5ffdfd4836565aba350db31feb2f2656d6ce70316ed66a05e/lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6", size = 4712721, upload-time = "2026-05-18T19:17:40.512Z" }, + { url = "https://files.pythonhosted.org/packages/44/4d/1f44fd1d770b10dacbf6b5c6e520f4d6e0708744930f719dc04e67cab981/lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c", size = 5252549, upload-time = "2026-05-18T19:17:51.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/5d/1d66b84f850089254c230ef6ea6b267a5a54e2e179a5d960036a05d501d7/lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08", size = 5226877, upload-time = "2026-05-18T19:18:00.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/00/84c4b5302d42a2d0184f38d538c8a197f33b52a50bd4f7bcfe990bce3036/lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621", size = 3594072, upload-time = "2026-05-18T19:17:12.714Z" }, + { url = "https://files.pythonhosted.org/packages/61/9d/2e2f7d876349f45e0f3e29f72da311668853d59b58d473a2dea4f0160135/lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28", size = 4025469, upload-time = "2026-05-18T19:17:50.566Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d5/570e6390e4110331e6208b2ba83d1482cc9146808ee118b22824a34c1070/lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b", size = 3667640, upload-time = "2026-05-19T19:22:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, + { url = "https://files.pythonhosted.org/packages/a5/eb/7e6f37c5584ccbb2ff267f56fd0339016938c1c8684cfefab9b33ffc2f36/lxml-6.1.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:68a9198d0fc122d14bb76837de9aa80cf84caed990b5b237f532ed87d3706736", size = 8559780, upload-time = "2026-05-18T19:17:57.661Z" }, + { url = "https://files.pythonhosted.org/packages/a1/36/587c2521cf23a2cd6c9c22108aa7528f683a1f195ed7ccd23a4b1786ad36/lxml-6.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7d47866cb32fb503450b6edc9df355d10dc49836af2e89901bd6ac6b0896d9d9", size = 4618006, upload-time = "2026-05-18T19:18:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ca/ab7bfe2bf4c972af5e7878262845ead3a24a929a9b04bc11c7c1ece6c82a/lxml-6.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb7c9811bfaa8b1ed5ed319f5d370dfbcaa59d52ea64be2a5a85e18195930354", size = 4924139, upload-time = "2026-05-18T19:19:04.873Z" }, + { url = "https://files.pythonhosted.org/packages/6b/55/a0c72851dfee5ecc689f949723a73dea457758912542cb955b108eaf0d8f/lxml-6.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:762ff394d5bd56da0cf034a23dcce4e13923f15321a2adfa2ac00201dc6d3fca", size = 5082329, upload-time = "2026-05-18T19:19:09.728Z" }, + { url = "https://files.pythonhosted.org/packages/f0/b6/0608f7d61a3b96cc67e5648a3d906e31a5082093e10e7be65b3886289938/lxml-6.1.1-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a088f287f7d8275a33c07f2cac6c50b9319309a0200a39e7e75d80c707723099", size = 4993564, upload-time = "2026-05-18T19:19:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/4c/66/ae227524b066d29d55bf0b453d93d2d793c40218657d643dcbbca13b8faf/lxml-6.1.1-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e902da4b04e6b52e5893900d4b8ab46068f75f3561f01bf1080957f9fd932ed6", size = 5613467, upload-time = "2026-05-18T19:19:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/a6/76/dbe4a00b50385e40194231dcfe5a12c059de7cf90e89c83407d2b085b719/lxml-6.1.1-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d4962d4c66bf830a7e59ed6cfc17d148149898a3aefa8ec6e59763e6e3ed085", size = 5228304, upload-time = "2026-05-18T19:19:19.354Z" }, + { url = "https://files.pythonhosted.org/packages/1c/01/00b1b8442ed2041793336868ba0b9ea4b13d7da7c085c6404c207a63bf79/lxml-6.1.1-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:581d4c8ae690a6609e64862dd6b7c2489635c2d13907fc2b20f2bc200ff1d21e", size = 5341607, upload-time = "2026-05-18T19:19:22.297Z" }, + { url = "https://files.pythonhosted.org/packages/63/36/1ad29931e9a4638bb707869f01d423a6c815f82152138d1a40dfcfde2b95/lxml-6.1.1-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:876e1ff5930ed8bf295ec5ef9a8155e9b6b1876bbf1deed8b3a8069311875a8f", size = 4700168, upload-time = "2026-05-18T19:19:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d1/a9536cecf9be18a0dc72d32bead283a2332d1ffebd2dd3ac70ce444686e5/lxml-6.1.1-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9eb9b5a968f6e0f6d640092a567e14529ff8cea2e29d00da6f78a79fa49f013c", size = 5232487, upload-time = "2026-05-18T19:19:28.603Z" }, + { url = "https://files.pythonhosted.org/packages/0e/77/b4fb1e03bf5d130e879214d3100092e386418807fb74dd0adc4b0a48f351/lxml-6.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:aa49e06d94aba782c6a02eecb7e507969e7e7a41b267f1b359bb35585f295d5b", size = 5044231, upload-time = "2026-05-18T19:18:42.246Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/d00daeeb0a5530c4028a9232aa1b93db3ef4ed2158c116ea73c79a9765b3/lxml-6.1.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:70cdfd80589d59e43e18005dd7244e8895e93db8ab6a620b7e23df5445a4e3d2", size = 4769450, upload-time = "2026-05-18T19:18:48.013Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6a/715a3a8d156ce42f29cf014706f5410c2ff3b02267774110fc23266409fe/lxml-6.1.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:aad9aa39483ed8ec44d6d2e59e5b98a0d80676ef0d92f44bfc374836111f62f5", size = 5635874, upload-time = "2026-05-18T19:18:51.914Z" }, + { url = "https://files.pythonhosted.org/packages/45/37/0544bc21dde2a88f3a17b504e6fc79c0e01d25a33c2f6079724e9e72b9c7/lxml-6.1.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:d49514be2f28d895c38cf9d2b72d7b9a07d00314519f456c0b50b53cfcf4c785", size = 5223987, upload-time = "2026-05-18T19:18:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/4d/f8/f6a5e8185bcb28c2befae3d31f8e3df3b811cb0f47746517a81279fcafe1/lxml-6.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:47402e62c52ff5988c1e8c6c63177f5708bccf48e366dea4e3dcf1e645e04947", size = 5250276, upload-time = "2026-05-18T19:19:03.834Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f2/1a2b9f1b7a49d45495369be7ef9ad05b262930f2eab3e3145706fca8083f/lxml-6.1.1-cp313-cp313-win32.whl", hash = "sha256:3483644525531e1d5762b0c44a8e18b6efba321b6dcf8a8952de10b037618bca", size = 3596903, upload-time = "2026-05-18T19:17:29.863Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/f4ffb024f238eec2131aaa09f3278fb6129cf892741bf68e1fc1afb8c100/lxml-6.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:a10bd2fd62e8ce916ececb342f348f190724a098c1faa056fdfb2a22ad5e8660", size = 3995869, upload-time = "2026-05-18T19:18:02.596Z" }, + { url = "https://files.pythonhosted.org/packages/d1/53/70eb8c5c6037f27448f1e3c54ebede9545a801ae63f0a7254afca4fe8e45/lxml-6.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:424aa57aca0897eb922aef34395bd1289b3b6f04e6bae20ea123c0c7e333cffc", size = 3658490, upload-time = "2026-05-19T19:22:53.846Z" }, + { url = "https://files.pythonhosted.org/packages/13/e2/2e325795566de01d0d7c3bb57d3c370616b2d07b01214e84eec5d3b10963/lxml-6.1.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:19b7ab10b210b0b3ad7985d9ac4eb66ab09a90b20fe6e2f7ba55d01a234345d0", size = 8577146, upload-time = "2026-05-18T19:18:17.765Z" }, + { url = "https://files.pythonhosted.org/packages/93/cf/5630b5e4be7d2e6bee8efe83865c925221103cf0221303b104ce134b01e2/lxml-6.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c08e5c694306507275f2290073350c4f32e383db15213b2c69e7ff39c1193840", size = 4623866, upload-time = "2026-05-18T19:18:30.669Z" }, + { url = "https://files.pythonhosted.org/packages/d2/51/3904907c063451cf8d4a5c9fe0cad95fa1f4ec57f4e3884fa0731bd7a305/lxml-6.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:74a9717fd0d82effef5c2854f0d917231d5324b5a3eb7275c43ac9fa32f97a14", size = 4950022, upload-time = "2026-05-18T19:19:31.958Z" }, + { url = "https://files.pythonhosted.org/packages/94/cd/9c7611a51c37a2830928405817cc5d56a97f64fab83cc3f628748b135749/lxml-6.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efe0374196335f93b53269acd811b944f2e6bdc88e8894f214bd636455484909", size = 5086695, upload-time = "2026-05-18T19:19:34.764Z" }, + { url = "https://files.pythonhosted.org/packages/da/d6/24e3b5906abb0b674ff2ae195bc3ce59708df2bcd17cf17703b2d7dd643a/lxml-6.1.1-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac931cdc9442c1763b8a8f6cd62c0c938737eafc5be75eff88df55fc73bc0d00", size = 5031642, upload-time = "2026-05-18T19:19:37.771Z" }, + { url = "https://files.pythonhosted.org/packages/2d/db/6ec54f99019838bff54785c51da07f189eb4676861c5f2730962b0d8d665/lxml-6.1.1-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:aee395f5d0927f947758b4ec119fd5fc8ec71f07a1c5c52077b30b04c0fa6955", size = 5647338, upload-time = "2026-05-18T19:19:40.553Z" }, + { url = "https://files.pythonhosted.org/packages/42/3d/ef4dcfffd22d27a61805d8ed9f7fb888495bc6aa88648fa07c1eaa5586b6/lxml-6.1.1-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9395002973c827b3ed67db77e6ec09f092919a587022174554096a269378fb13", size = 5239528, upload-time = "2026-05-18T19:19:43.657Z" }, + { url = "https://files.pythonhosted.org/packages/62/bb/37fb3f0dff146bdcfa78eec47879273820b2a0bf350ec236ce14bd0b1c26/lxml-6.1.1-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:73bc2086f141224ebddb7fc5c6a36ca58b31b94b561e1dfe8e073e3270fad1e7", size = 5350730, upload-time = "2026-05-18T19:19:46.307Z" }, + { url = "https://files.pythonhosted.org/packages/90/42/43253f168388df4fae1f38c01df36ddb9bee39e2048167b54cdcbae85ea3/lxml-6.1.1-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:3779def59032b81e44a5f70096ef6bf2082f8d901937dca354474ba09782e245", size = 4697530, upload-time = "2026-05-18T19:19:49.889Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a8/c5a8504f81bbdfc8e7094c2c850cdb4ed6777fc4d5ddd9e5ab819f3b0d54/lxml-6.1.1-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:86c89b9d55ebf820ad7c90bc533410f0d098054f293351f10603c0c46ff598f5", size = 5250670, upload-time = "2026-05-18T19:19:53.199Z" }, + { url = "https://files.pythonhosted.org/packages/77/b7/c7e76ab18744d75e21f320ebf9ff9d1ceae2b54dd431ea5a64caf26c9672/lxml-6.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19607c6bbff2a44cf3fe8250abccd20942d3462473e0a721d01d379ed017e462", size = 5084485, upload-time = "2026-05-18T19:19:08.422Z" }, + { url = "https://files.pythonhosted.org/packages/31/31/b35c53f8ef7b7c31cacd23d3638652fff7bcd1deb6eedb709ab43b685908/lxml-6.1.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:c6ed5141a5c7507cf3ee76bd363b0d6f801e3321adc35b5d825a23115faa5465", size = 4737635, upload-time = "2026-05-18T19:19:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/d9/06/31f23c813a7fe8e0cb1b175e915b08c9bf4e86d225b210feadbdbe519667/lxml-6.1.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:62aeb7e85b5d60320b9d77eef2e773994e2c0ce10121b277e0a19804e1654a5a", size = 5670681, upload-time = "2026-05-18T19:19:15.001Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bc/ce619bccc89b1fd9ad8a8e1330ee3f3beff9f2ff95b712d7bbcdd6e22fc3/lxml-6.1.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:b1b963fd8f5caa68e99dfae060d54de1fe9cba899b8718b44a00cdca53c3e590", size = 5238229, upload-time = "2026-05-18T19:19:18.131Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5d/b329acbbedc0b619ebc2be6cf7ee9ed07e80892c88d4dfd612c33805789a/lxml-6.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63876be28efefa04a1df615b46770e82042cce445cfdce55160522f57b231ccb", size = 5264191, upload-time = "2026-05-18T19:19:21.118Z" }, + { url = "https://files.pythonhosted.org/packages/d6/85/be36fb1425b30db3c3f9df75fe86343ebffb79e6320bd7f588e25bfeac39/lxml-6.1.1-cp314-cp314-win32.whl", hash = "sha256:7f7a92e8583f06b1fd49d01158143b8461cfcd135dcb10ec807270a3051bd603", size = 3657202, upload-time = "2026-05-18T19:17:39.509Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ce/3cf9a827342269f54d405a6202397de63f07c69cbd6ce7d183a3f0cba1e9/lxml-6.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:b2d444f2e66624d68e9c6b211e28a76e22fff5fcabcfff4deac18b529b7d4137", size = 4064497, upload-time = "2026-05-18T19:18:14.662Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3e/1a957bde8f0760039e627f94699f82caa782c9d838d86c3d28245ee67212/lxml-6.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:3fd9728a2735fda14f4e8235830c86b539e9661e849665bf926d3f867943b4bf", size = 3741991, upload-time = "2026-05-19T19:22:59.111Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/00ed55b3a2efa4658fb795c38d1090ec9b3e8a6c3683d4441fa517f09c3b/lxml-6.1.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:787b2496d0dbe8cd180984e8d29e3a6f76e7ea34db781cb3bd55e4ba1ef8b4ee", size = 8827545, upload-time = "2026-05-18T19:18:41.193Z" }, + { url = "https://files.pythonhosted.org/packages/c0/73/74573db19baa618d5f266f2407898b087ff6927115b00b71e5fc1b700847/lxml-6.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2c8daa471358dc2d6fcf02165e80ec68f77871a286df95bc5cc3816153b0fd2c", size = 4735736, upload-time = "2026-05-18T19:18:46.761Z" }, + { url = "https://files.pythonhosted.org/packages/16/02/6f7061f4f95f51e545d48e87647c54791d204a4e881be4156e7a26ba5338/lxml-6.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:acd7d70b64c0aae0c7922cca83d288a16f5f6da523637697872253415269baef", size = 4970291, upload-time = "2026-05-18T19:19:56.215Z" }, + { url = "https://files.pythonhosted.org/packages/b0/02/55fc057d8283427dea7d6edb102e7a840239c77a64a983d92f62a304c0e9/lxml-6.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4f0dd2f01f9f8a89f565d000e03abcf0a13d692a346c8d22f628d49af098777a", size = 5102822, upload-time = "2026-05-18T19:19:59.223Z" }, + { url = "https://files.pythonhosted.org/packages/e4/48/8e1cf78d89d66850121d9255a2a24414c98f775da93b90cf976956c24b14/lxml-6.1.1-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b7e8a14c8634bf6f7a568634cb395305a6d964aeb5b7ee32248094bed3a7e2c", size = 5027923, upload-time = "2026-05-18T19:20:01.549Z" }, + { url = "https://files.pythonhosted.org/packages/ed/00/0632a0647612c8af24d26997b3b961397daa9d5b2581444805933629a4cb/lxml-6.1.1-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:86281fbdd6a8162756f8d603f37e3435bfa38043adb79c6dc6a2dfee065e7525", size = 5595843, upload-time = "2026-05-18T19:20:03.93Z" }, + { url = "https://files.pythonhosted.org/packages/bc/86/ab008a7dc360711b66858d61c80a5979a70a09f2aa2b05d9698df80b803d/lxml-6.1.1-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5d7152ec39ca7c402d8fb9bad86140a15b9503bd0c54484e3f1bbe3dd37ceca", size = 5224515, upload-time = "2026-05-18T19:20:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/75/c6/2702ff375e728e34f56d9a45339a9cf7e4427e917f542225242d63a05afa/lxml-6.1.1-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:88d8cb75b9d82858497a5393e3c63cfbf03035225e4b35a49ed7ccb151e4dc0e", size = 5312511, upload-time = "2026-05-18T19:20:09.308Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/a5807c98f87a86f10ef9ffab35516df7c0f0c4b6d5d33e9f608ab9c04a31/lxml-6.1.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:f64ec5397ea6a41fc1b4af0380d79b44a755b5531dcaccd9940fb260dca93038", size = 4639206, upload-time = "2026-05-18T19:20:11.704Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e1/8a0a2c35734812395f4da4eaf33748a7e5705bfb2a58b128da764339d5ec/lxml-6.1.1-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d34bbf07dbc7ca5970671b1512e928991fb5e9d95365636c9b2d8b4f53af405e", size = 5232404, upload-time = "2026-05-18T19:20:14.064Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e2/0e6a4dd5ad84d01d99aa7bae7cfefd4a760a0e0f8176818241de17d9b6c0/lxml-6.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:17e0e18d4ad8adbd0399291bc44845b69d9dd68439a3cdebdf35ff902ec05072", size = 5083769, upload-time = "2026-05-18T19:19:23.758Z" }, + { url = "https://files.pythonhosted.org/packages/a0/7e/161f33d463f6ffc1c7679104b65086dea120080d49dde4d238f015aaee2f/lxml-6.1.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:3ab541146f1f6968c462d6c2ac495148e8cdba2f8347700b2141b6ec5a75bf52", size = 4758936, upload-time = "2026-05-18T19:19:27.256Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fb/2369825e3f6ca99305bf9f7b7085fda91c8b0922a89e54d900974aa3ef85/lxml-6.1.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2a0217714657e023ef4293500f65aa20fce6164c8fd6b08fa5bd4a859fb14b9b", size = 5620296, upload-time = "2026-05-18T19:19:29.993Z" }, + { url = "https://files.pythonhosted.org/packages/30/90/d61e383146f74c5ab683947ea14dc7b82778838ab9b95ea73a23b60d0191/lxml-6.1.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:05a82eb6e1530a64f26225b55cbd178113bd0b5af1c2b625f25e5296742c26d2", size = 5228598, upload-time = "2026-05-18T19:19:33.523Z" }, + { url = "https://files.pythonhosted.org/packages/76/2d/2dafd8149e94b05bb070690efd5bb2680720681e03ff03fc57d2b70a1105/lxml-6.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9e36f163528fc50cbef305f02a5fd66d404edf7049cdaff211dbc2cba5a7013e", size = 5247845, upload-time = "2026-05-18T19:19:36.649Z" }, + { url = "https://files.pythonhosted.org/packages/ce/68/b30e913340c380ddac9580c6e6230991fc37240ec4f64704833e4f3e2769/lxml-6.1.1-cp314-cp314t-win32.whl", hash = "sha256:649dda677cf3bd6ac9ae14007ba0c824ded8ce5808b53fc7431d9140399118c1", size = 3897345, upload-time = "2026-05-18T19:17:33.562Z" }, + { url = "https://files.pythonhosted.org/packages/3c/4e/9eb2af5335545f9fbcd7af57bcf87c6025d31eaa31b14ec184a6c8675328/lxml-6.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:793033d6c5cdf33a573f910d9bea14ef8f5771820411d118da8e1182edb53d5e", size = 4393350, upload-time = "2026-05-18T19:18:10.076Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2c/0f1e93c636720e8a3eb59af2bfda99d98b55891e1c53bc30c2e0e865f01b/lxml-6.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:58bb955caba94e467d2a96da17660d2d704e0675894cba21ab8a775b8621fd1c", size = 3817223, upload-time = "2026-05-19T19:22:56.823Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b5/0a0f61cc8c6aa61f439d276e62e70cbf4f32205f57b1fbd483b8d0cf514b/lxml-6.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9f79d5325907f13e1be0b3e4dacc1049d1dffc4aeee3c995284bea5fe0fab7d", size = 8553821, upload-time = "2026-05-18T19:18:54.406Z" }, + { url = "https://files.pythonhosted.org/packages/f6/dc/66603d8f755d26f39c41cf29ed30e4a3bc93973d72a825cd12be91c5bd7b/lxml-6.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:83b6b30eb131da7a75b601f28c5d6971e6ed3e887919bf6b6a1ad3c2df289080", size = 4607623, upload-time = "2026-05-18T19:18:58.556Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ad/5ea70128e6b0d34a52d16e2386666f8f9529c17cfac46d5980fd22c35daa/lxml-6.1.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:441dd227fa0690eb9fc81edabc63cdcefc212bba99b906dcf6e32cc1a9d3e533", size = 5005993, upload-time = "2026-05-18T19:20:24.125Z" }, + { url = "https://files.pythonhosted.org/packages/85/c2/13a33e8659f95d59f28a293f31c31d61d858a1bd4294b82a662cfbae126b/lxml-6.1.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e07c65f443c887bbcf31cc1771d932ecc192a5273943589b3c7572b749f1ffb2", size = 5160240, upload-time = "2026-05-18T19:20:26.549Z" }, + { url = "https://files.pythonhosted.org/packages/65/06/e850042d7b33cf47d2f1bc4accb31ab34478f56f46c376b7a67c6b1a84c5/lxml-6.1.1-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5bec7d03d78d853597d6107854c2310ce3f761fd218fe9fe91d5101fcf6c2efe", size = 5062940, upload-time = "2026-05-18T19:20:29.027Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5a/8d7a0b3e42b21a553f01e288e70283f4de37c015c9c2477a0c31dafa0408/lxml-6.1.1-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f76acfb5f68ba982635a53fd985a8044be98a35b43232c2a1ee235ffab3e1dd", size = 5292921, upload-time = "2026-05-18T19:20:31.463Z" }, + { url = "https://files.pythonhosted.org/packages/03/7c/9238d52bc426c8737b427ce57ea48c8a5a91974c5dcc55a34260dd851763/lxml-6.1.1-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:8d43ca737b20e106e4aebc42b2f3ae19f00ba63d7eb731698ee083d72d15646f", size = 5416716, upload-time = "2026-05-18T19:20:34.059Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/be127e1f36410d8ec84964adf76694b72f7705593c16c838dc8b1061b0b8/lxml-6.1.1-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:32ab449a5486f6c758e849bb86710d0e45edc24a04e250c01555f8f5653958f8", size = 4773279, upload-time = "2026-05-18T19:20:36.555Z" }, + { url = "https://files.pythonhosted.org/packages/77/42/5e3ca677b4d56ae189a454764d28d922d343750419548409974d913a9b65/lxml-6.1.1-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53c909b62a0532183542fed00c5a7218258c56292d409bc789886fe1cb04c438", size = 5361618, upload-time = "2026-05-18T19:20:39.044Z" }, + { url = "https://files.pythonhosted.org/packages/cd/20/816979635625f8b8f88b69b5f7d9a4ebdc3c0bab1bf70c824e4ffe239879/lxml-6.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:640f97d43d867bcb9c75b3af013b64850756b746cb6bce8ace83b70da3abba9d", size = 5111217, upload-time = "2026-05-18T19:19:42.123Z" }, + { url = "https://files.pythonhosted.org/packages/25/86/a6ec97064d25959d4932f2e91b547ce6b8380daa27de08b103c7b50be323/lxml-6.1.1-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:469e3618338bd7ab5beb412d2439825479fcf0dab99e394ca563dbc4eaf6c834", size = 4808149, upload-time = "2026-05-18T19:19:45.317Z" }, + { url = "https://files.pythonhosted.org/packages/ac/85/dc6087d1ba06589202ee25cda29abb175443da2da70c9e6bcf92091ad272/lxml-6.1.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:aae97dfdb60715c164419ac2532a76d013c3918a665eb6cb7288098b5f349aaf", size = 5352761, upload-time = "2026-05-18T19:19:48.608Z" }, + { url = "https://files.pythonhosted.org/packages/69/93/e89fcb55d12b8e1473ce9a62b8f6ee215c89532f7a75a7ce55830834373b/lxml-6.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c9a4b821dc7055bf9e05ff5719e18ec501f75c0f0bbfabd573b277559780833d", size = 5315355, upload-time = "2026-05-18T19:19:51.077Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c1/4f07e22d26e2e1ad741666f768df2d3b18ff1ddab3a99e2cb35d5b5df3a3/lxml-6.1.1-cp39-cp39-win32.whl", hash = "sha256:639f6c857d91d9be29bd7502348d6736dab168b54b5158cd899abf11684dc186", size = 3601121, upload-time = "2026-05-18T19:17:58.57Z" }, + { url = "https://files.pythonhosted.org/packages/1e/49/4bcb779b303876f1750eb37f534230ef4e7221341826cbd5e42388087393/lxml-6.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:34c2d737beabfe35baada43941ed519251e9a12e779031496bcd5d539fcfd730", size = 4024637, upload-time = "2026-05-18T19:18:32.806Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e6/0d1b437d0783874ff15fb94be03045bce6dcefbce1ea22e44a2dbd59a902/lxml-6.1.1-cp39-cp39-win_arm64.whl", hash = "sha256:07a4a68e286ee7a1ed7dfb8af83e615757c0ccfe9f18c6b4ea6771388d9ba8c9", size = 3670865, upload-time = "2026-05-19T19:23:01.555Z" }, + { url = "https://files.pythonhosted.org/packages/b5/32/86a3f0f724a3a402d4627937a7fc27b160e45e7012b4adf47f6e1e844511/lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e", size = 3930127, upload-time = "2026-05-18T19:19:02.27Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/d832e82af08723761556d004b1d04d281c09f9a8cecd7d3148548c9941a3/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004", size = 4210769, upload-time = "2026-05-18T19:20:41.427Z" }, + { url = "https://files.pythonhosted.org/packages/6d/39/0dc5949f759ed7d951e0bb8c2f2d9d7aca1908d22352fa84a8afd2ea54af/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e", size = 4318163, upload-time = "2026-05-18T19:20:44.702Z" }, + { url = "https://files.pythonhosted.org/packages/e6/fb/8ab3845fe046ba4cbf74536bcf6801a774b7caf4350de1c5d37f1f0a9e90/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2", size = 4250945, upload-time = "2026-05-18T19:20:47.385Z" }, + { url = "https://files.pythonhosted.org/packages/68/1b/7553ab136894374ffae8851ec06f98f511cd8e66246e41b6be059d0a7289/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf", size = 4401664, upload-time = "2026-05-18T19:20:50.489Z" }, + { url = "https://files.pythonhosted.org/packages/db/a4/441aee36c6f6b249823d20fd91f9be9ab89d7c5a8ae542a4a4ca6d342d56/lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84", size = 3508989, upload-time = "2026-05-18T19:18:38.158Z" }, +] + +[[package]] +name = "map2loop" +version = "3.3.1" +source = { editable = "packages/map2loop" } +dependencies = [ + { name = "beartype", version = "0.22.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "beartype", version = "0.22.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "geopandas", version = "1.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "geopandas", version = "1.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "loopprojectfile" }, + { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "owslib", version = "0.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "owslib", version = "0.35.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "owslib", version = "0.36.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scikit-learn", version = "1.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scikit-learn", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "shapely", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "shapely", version = "2.1.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[package.optional-dependencies] +tests = [ + { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "pytest", version = "9.1.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] + +[package.metadata] +requires-dist = [ + { name = "beartype" }, + { name = "geopandas" }, + { name = "loopprojectfile", specifier = "==0.2.2" }, + { name = "networkx" }, + { name = "numpy" }, + { name = "owslib" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pytest", marker = "extra == 'tests'" }, + { name = "scikit-learn" }, + { name = "scipy" }, + { name = "shapely", specifier = ">=2" }, +] +provides-extras = ["tests"] [[package]] name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] dependencies = [ @@ -3131,11 +3607,14 @@ name = "markdown-it-py" version = "4.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -3313,7 +3792,8 @@ name = "matplotlib" version = "3.10.9" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -3389,11 +3869,14 @@ name = "matplotlib" version = "3.11.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -3491,16 +3974,20 @@ name = "mdit-py-plugins" version = "0.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -3564,16 +4051,20 @@ name = "more-itertools" version = "11.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } wheels = [ @@ -3657,16 +4148,20 @@ name = "msgpack" version = "1.2.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } wheels = [ @@ -3918,7 +4413,8 @@ name = "myst-parser" version = "4.0.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -3938,11 +4434,14 @@ name = "myst-parser" version = "5.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -3994,16 +4493,20 @@ name = "nbclient" version = "0.11.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "jupyter-client", version = "8.9.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -4080,6 +4583,121 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c5/3c/3179b85b0e1c3659f0369940200cd6d0fa900e6cefcc7ea0bc6dd0e29ffb/nest_asyncio2-1.7.2-py3-none-any.whl", hash = "sha256:f5dfa702f3f81f6a03857e9a19e2ba578c0946a4ad417b4c50a24d7ba641fe01", size = 7843, upload-time = "2026-02-13T00:34:02.691Z" }, ] +[[package]] +name = "netcdf4" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.10'" }, + { name = "cftime", version = "1.6.4.post1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/71/ed/4d27fcfa40ebfdad3d2088a3de7ee48dbff7f35163e815ec1870d2a7398c/netcdf4-1.7.2.tar.gz", hash = "sha256:a4c6375540b19989896136943abb6d44850ff6f1fa7d3f063253b1ad3f8b7fce", size = 835064, upload-time = "2024-10-22T19:01:25.521Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/00/2b1fb43e46e3d986e961e420046453796d67200b58639bd29f18657a39b7/netCDF4-1.7.2-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:5e9b485e3bd9294d25ff7dc9addefce42b3d23c1ee7e3627605277d159819392", size = 2977508, upload-time = "2024-10-22T19:00:28.975Z" }, + { url = "https://files.pythonhosted.org/packages/81/c2/a5001f25de53b7312609d2733ac887a5051c1ce196288af4b9777ead5a75/netCDF4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:118b476fd00d7e3ab9aa7771186d547da645ae3b49c0c7bdab866793ebf22f07", size = 2461128, upload-time = "2024-10-22T19:00:31.415Z" }, + { url = "https://files.pythonhosted.org/packages/da/33/ecb4790d053c58ec03f940ab55aacb59a207e356e57792cfd4b4eedbcc4d/netCDF4-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe5b1837ff209185ecfe50bd71884c866b3ee69691051833e410e57f177e059", size = 9210818, upload-time = "2024-10-22T19:00:33.436Z" }, + { url = "https://files.pythonhosted.org/packages/db/a6/54f0f335b28228b89e1598fda950382c83b1d7b1f75d28c5eebbcb7f113e/netCDF4-1.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28021c7e886e5bccf9a8ce504c032d1d7f98d86f67495fb7cf2c9564eba04510", size = 9059470, upload-time = "2024-10-22T19:00:35.394Z" }, + { url = "https://files.pythonhosted.org/packages/a7/ea/80b9feddd36721f92bac056a7dea41cd48bd4fc676f3f248fc48332d0bd2/netCDF4-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:7460b638e41c8ce4179d082a81cb6456f0ce083d4d959f4d9e87a95cd86f64cb", size = 7005418, upload-time = "2024-10-22T19:00:37.774Z" }, + { url = "https://files.pythonhosted.org/packages/a0/d8/b7079ecbab35f7c95ab27e5146fa91daf0e39ba76093f0fc1187fc748749/netCDF4-1.7.2-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:09d61c2ddb6011afb51e77ea0f25cd0bdc28887fb426ffbbc661d920f20c9749", size = 2981078, upload-time = "2024-10-22T19:00:39.93Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c1/ae83fdcc05d1db00a340f5f3e252247d73f11f8eaa890c59e7b5c8e35b56/netCDF4-1.7.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:fd2a16dbddeb8fa7cf48c37bfc1967290332f2862bb82f984eec2007bb120aeb", size = 2462104, upload-time = "2024-10-22T19:00:41.683Z" }, + { url = "https://files.pythonhosted.org/packages/f2/bd/6f76916fae5d375eedd0cb48acd713d8d8db267d0c3cf3d209a4631923a5/netCDF4-1.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f54f5d39ffbcf1726a1e6fd90cb5fa74277ecea739a5fa0f424636d71beafe24", size = 9451498, upload-time = "2024-10-22T19:00:43.822Z" }, + { url = "https://files.pythonhosted.org/packages/18/c1/7e564dbd28228ba4a35a272bf53b9a2e8b0ba9ac06b2c84b57c03c84e87b/netCDF4-1.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:902aa50d70f49d002d896212a171d344c38f7b8ca520837c56c922ac1535c4a3", size = 9283073, upload-time = "2024-10-22T19:00:45.925Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ba/d26e8278ad8a2306580bab076b6d64cd16459a60e632e6c1a9cbb68dd3d9/netCDF4-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:3291f9ad0c98c49a4dd16aefad1a9abd3a1b884171db6c81bdcee94671cfabe3", size = 7010215, upload-time = "2024-10-22T19:00:48.101Z" }, + { url = "https://files.pythonhosted.org/packages/52/7f/3a0f18a39efca0e093b54d634b66573c25ecab5c482d73138ae14aa55c6d/netCDF4-1.7.2-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:e73e3baa0b74afc414e53ff5095748fdbec7fb346eda351e567c23f2f0d247f1", size = 2952127, upload-time = "2024-10-22T19:00:50.613Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c4/8aac0f8ca95a41bdf1364d34ff4e9bcc24494bfe69a1157301d884c2e392/netCDF4-1.7.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a51da09258b31776f474c1d47e484fc7214914cdc59edf4cee789ba632184591", size = 2460781, upload-time = "2024-10-22T19:00:52.383Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1a/32b7427aaf62fed3d4e4456f874b25ce39373dbddf6cfde9edbcfc2417fc/netCDF4-1.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb95b11804fe051897d1f2044b05d82a1847bc2549631cdd2f655dde7de77a9c", size = 9377415, upload-time = "2024-10-22T19:00:54.412Z" }, + { url = "https://files.pythonhosted.org/packages/fd/bf/5e671495c8bdf6b628e091aa8980793579474a10e51bc6ba302a3af6a778/netCDF4-1.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9d8a848373723f41ef662590b4f5e1832227501c9fd4513e8ad8da58c269977", size = 9260579, upload-time = "2024-10-22T19:00:56.594Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/0a0bcdebcfaf72e96e7bcaa512f80ee096bf71945a3318d38253338e9c25/netCDF4-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:568ea369e00b581302d77fc5fd0b8f78e520c7e08d0b5af5219ba51f3f1cd694", size = 6991523, upload-time = "2024-10-22T19:00:58.97Z" }, + { url = "https://files.pythonhosted.org/packages/e6/7a/ce4f9038d8726c9c90e07b2d3a404ae111a27720d712cfcded0c8ef160e8/netCDF4-1.7.2-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:205a5f1de3ddb993c7c97fb204a923a22408cc2e5facf08d75a8eb89b3e7e1a8", size = 2948911, upload-time = "2024-10-22T19:01:00.614Z" }, + { url = "https://files.pythonhosted.org/packages/58/3e/5736880a607edabca4c4fc49f1ccf9a2bb2485f84478e4cd19ba11c3b803/netCDF4-1.7.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:96653fc75057df196010818367c63ba6d7e9af603df0a7fe43fcdad3fe0e9e56", size = 2455078, upload-time = "2024-10-22T19:01:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/71/96/d5d8859a6dac29f8ebc815ff8e75770bd513db9f08d7a711e21ae562a948/netCDF4-1.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30d20e56b9ba2c48884eb89c91b63e6c0612b4927881707e34402719153ef17f", size = 9378149, upload-time = "2024-10-22T19:01:04.924Z" }, + { url = "https://files.pythonhosted.org/packages/d1/80/b9c19f1bb4ac6c5fa6f94a4f278bc68a778473d1814a86a375d7cffa193a/netCDF4-1.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d6bfd38ba0bde04d56f06c1554714a2ea9dab75811c89450dc3ec57a9d36b80", size = 9254471, upload-time = "2024-10-22T19:01:07.041Z" }, + { url = "https://files.pythonhosted.org/packages/66/b5/e04550fd53de57001dbd5a87242da7ff784c80790adc48897977b6ccf891/netCDF4-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:5c5fbee6134ee1246c397e1508e5297d825aa19221fdf3fa8dc9727ad824d7a5", size = 6990521, upload-time = "2024-10-23T15:02:27.549Z" }, + { url = "https://files.pythonhosted.org/packages/3b/8b/38ed2cd39d2e96b4a984bea54499583f2513d1ebc162ffb644a703e26b32/netCDF4-1.7.2-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:eb87c08d1700fe67c301898cf5ba3a3e1f8f2fbb417fcd0e2ac784846b60b058", size = 2977725, upload-time = "2024-10-22T19:01:16.318Z" }, + { url = "https://files.pythonhosted.org/packages/b0/09/448e00398572d5cb7d53a56ee66c51e32314cc0a00dbe3e9887493e0d4b4/netCDF4-1.7.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:59b403032774c723ee749d7f2135be311bad7d00d1db284bebfab58b9d5cdb92", size = 2461600, upload-time = "2024-10-22T19:01:17.743Z" }, + { url = "https://files.pythonhosted.org/packages/df/26/b6ea7c57b160adb818be27f0967b34cf8381b190d5a61344d25746ab1a7f/netCDF4-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:572f71459ef4b30e8554dcc4e1e6f55de515acc82a50968b48fe622244a64548", size = 9208209, upload-time = "2024-10-22T19:01:20.017Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fe/3513828bb4bc48456d0e7971e04ed97632b2c9ebb7713bfdf36e9dfb7770/netCDF4-1.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f77e72281acc5f331f82271e5f7f014d46f5ca9bcaa5aafe3e46d66cee21320", size = 9062374, upload-time = "2024-10-22T19:01:22.053Z" }, + { url = "https://files.pythonhosted.org/packages/16/9c/b6adff49068fd78f72b9f3147ed3485583c573e6a9eea23f3534b8ed8374/netCDF4-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:d0fa7a9674fae8ae4877e813173c3ff7a6beee166b8730bdc847f517b282ed31", size = 7006633, upload-time = "2024-10-22T19:01:23.998Z" }, + { url = "https://files.pythonhosted.org/packages/d6/dd/c713bfe9aa122fe2d1e3c9320fc436b5ad922c93df24d707d9fffb66b0e2/netcdf4-1.7.2-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:16c3ba053930ed990e58827de6ab03184e407549004fb77438b98e5777e8cf3b", size = 2803405, upload-time = "2025-10-13T18:32:13.58Z" }, + { url = "https://files.pythonhosted.org/packages/75/b7/6b66ad69d034dc81ee2a1617ebd892cf25ff415dc7aa003323884c4a77f0/netcdf4-1.7.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:142c9ed2db8a87a15ae0530c8a99f4f045435b0f495df733e9f111995e389d4f", size = 2417569, upload-time = "2025-10-13T18:32:15.698Z" }, + { url = "https://files.pythonhosted.org/packages/50/e4/7238549f0625042f8d94ec2f58977bb186a8e2acf4d65b2ad1de2a58d672/netcdf4-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76cb3bbbbe4cd5fca612578eb105c16217380f7f93af2b549e8f38296bc906bb", size = 9682157, upload-time = "2025-10-13T18:32:17.138Z" }, + { url = "https://files.pythonhosted.org/packages/49/3c/1129ea3943f6f5736be08c2d79ca5965d0a55adbfc38f313a59938a7a62a/netcdf4-1.7.2-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:835ae7bcef666c967241baeeee9bef9376ddb7527297b24735597131f6f628e2", size = 9520752, upload-time = "2025-10-13T18:32:19.493Z" }, + { url = "https://files.pythonhosted.org/packages/0b/eb/144709b60d89eb8995236f49a4e446be87f15b0d63f05dbda55e1315dba3/netcdf4-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:73bd7eda3cefb04c4076e76911f652f5ed56bf434e0a3958e367932953437557", size = 7215191, upload-time = "2025-10-13T18:32:21.112Z" }, + { url = "https://files.pythonhosted.org/packages/84/0a/182bb4fe5639699ba39d558b553b8e6f04fbfea6cf78404c0f21ef149bf7/netcdf4-1.7.2-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:7e81c3c47f2772eab0b93fba8bb05b17b58dce17720e1bed25e9d76551deecd0", size = 2751391, upload-time = "2025-10-13T18:32:22.749Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1f/54ac27c791360f7452ca27ed1cb2917946bbe1ea4337c590a5abcef6332d/netcdf4-1.7.2-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:cb2791dba37fc98fd1ac4e236c97822909f54efbcdf7f1415c9777810e0a28f4", size = 2387513, upload-time = "2025-10-13T18:32:27.499Z" }, + { url = "https://files.pythonhosted.org/packages/5c/5e/9bf3008a9e45c08f4c9fedce4d6f722ef5d970f56a9c5eb375a200dd2b66/netcdf4-1.7.2-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf11480f6b8a5b246818ffff6b4d90481e51f8b9555b41af0c372eb0aaf8b65f", size = 9621674, upload-time = "2025-10-13T18:32:29.193Z" }, + { url = "https://files.pythonhosted.org/packages/a1/75/46871e85f2bbfb1efe229623d25d7c9daa17e2e968d5235572b2c8bb53e8/netcdf4-1.7.2-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ccc05328a8ff31921b539821791aeb20b054879f3fdf6d1d505bf6422824fec", size = 9453759, upload-time = "2025-10-13T18:32:31.136Z" }, + { url = "https://files.pythonhosted.org/packages/cd/10/c52f12297965938d9b9be666ea1f9d8340c2aea31d6909d90aa650847248/netcdf4-1.7.2-cp311-abi3-win_amd64.whl", hash = "sha256:999bfc4acebf400ed724d5e7329e2e768accc7ee1fa1d82d505da782f730301b", size = 7148514, upload-time = "2025-10-13T18:32:33.121Z" }, +] + +[[package]] +name = "netcdf4" +version = "1.7.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'" }, + { name = "cftime", version = "1.6.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/76/7bc801796dee752c1ce9cd6935564a6ee79d5c9d9ef9192f57b156495a35/netcdf4-1.7.3.tar.gz", hash = "sha256:83f122fc3415e92b1d4904fd6a0898468b5404c09432c34beb6b16c533884673", size = 836095, upload-time = "2025-10-13T18:38:00.76Z" } + +[[package]] +name = "netcdf4" +version = "1.7.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", +] +dependencies = [ + { name = "certifi", marker = "(python_full_version >= '3.10' and platform_machine != 'ARM64') or (python_full_version >= '3.11' and platform_machine == 'ARM64' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'win32')" }, + { name = "cftime", version = "1.6.5", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version >= '3.10' and platform_machine != 'ARM64') or (python_full_version >= '3.11' and platform_machine == 'ARM64' and sys_platform == 'win32') or (python_full_version >= '3.10' and sys_platform != 'win32')" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/34/b6/0370bb3af66a12098da06dc5843f3b349b7c83ccbdf7306e7afa6248b533/netcdf4-1.7.4.tar.gz", hash = "sha256:cdbfdc92d6f4d7192ca8506c9b3d4c1d9892969ff28d8e8e1fc97ca08bf12164", size = 838352, upload-time = "2026-01-05T02:27:38.593Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/07/dfdd017641e82fadaf4e043d91fa179d34940c7d69175a3034dea877df9c/netcdf4-1.7.4-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:b1c1a7ea3678db76bf33d14f7e202385d634db38c5e70d8cf4895971023eebb9", size = 23499427, upload-time = "2026-01-05T02:26:54.13Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6c/8cd98d166f30d378488c5235457d6af7df09f9925ab5ad03d6840543f42e/netcdf4-1.7.4-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:d3f9497873454207f9480847d02b1b19a4bc81ad6e9166e1c17d4e2f8f3555d1", size = 22886591, upload-time = "2026-01-05T02:26:57.113Z" }, + { url = "https://files.pythonhosted.org/packages/08/1c/ab31713a95160ebc6b4ec495cd4f03f38b235188a7e955bf33703c5039ca/netcdf4-1.7.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8e18294af803e80f8c0339f791901942e268c334c099bbd5f7ea8325a49801a", size = 10336881, upload-time = "2026-01-05T02:26:59.382Z" }, + { url = "https://files.pythonhosted.org/packages/26/d7/bb16993af267acda23fe3de4ead2528cbe49043e391f732a1a4a15beec20/netcdf4-1.7.4-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0b06c0b93fd0ecc1ec67a582f3ba98b7db9da1fa843c8f83fd75990e3701771e", size = 10182772, upload-time = "2026-01-05T02:27:01.545Z" }, + { url = "https://files.pythonhosted.org/packages/9b/a6/e6fca338488a896c5e1f661ba3007e83f46700e1a59552b05013d501bc45/netcdf4-1.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:889ba77f084504aebaba9c6f9a88ac213431fef0e897f887cd35aef351ff7740", size = 21363337, upload-time = "2026-01-05T02:27:04.21Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/38ed7e1956943d28e8ea74161e97c3a00fb98d6d08943b4fd21bae32c240/netcdf4-1.7.4-cp311-abi3-macosx_13_0_x86_64.whl", hash = "sha256:dec70e809cc65b04ebe95113ee9c85ba46a51c3a37c058d2b2b0cadc4d3052d8", size = 23427499, upload-time = "2026-01-05T02:27:06.568Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/2f73c133b71709c412bc81d8b721e28dc6237ba9d7dad861b7bfbb70408a/netcdf4-1.7.4-cp311-abi3-macosx_14_0_arm64.whl", hash = "sha256:75cf59100f0775bc4d6b9d4aca7cbabd12e2b8cf3b9a4fb16d810b92743a315a", size = 22847667, upload-time = "2026-01-05T02:27:09.421Z" }, + { url = "https://files.pythonhosted.org/packages/77/ce/43a3c0c41a6e2e940d87feea79d29aa88302211ac122604838f8a5a48de6/netcdf4-1.7.4-cp311-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ddfc7e9d261125c74708119440c85ea288b5fee41db676d2ba1ce9be11f96932", size = 10274769, upload-time = "2026-01-05T21:31:19.243Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7a/a8d32501bb95ecff342004a674720164f95ad616f269450b3bc13dc88ae3/netcdf4-1.7.4-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a72c9f58767779ec14cb7451c3b56bdd8fdc027a792fac2062b14e090c5617f3", size = 10123122, upload-time = "2026-01-05T21:31:22.773Z" }, + { url = "https://files.pythonhosted.org/packages/18/68/e89b4fa9242e59326c849c39ce0f49eb68499603c639405a8449900a4f15/netcdf4-1.7.4-cp311-abi3-win_amd64.whl", hash = "sha256:9476e1f23161ae5159cd1548c50c8a37922e77d76583e247133f256ef7b825fc", size = 21299637, upload-time = "2026-01-05T02:27:11.856Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fc/edd41a3607241027aa4533e7f18e0cd647e74dde10a63274c65350f59967/netcdf4-1.7.4-cp311-abi3-win_arm64.whl", hash = "sha256:876ad9d58f09c98741c066c726164c45a098a58fb90e5fac9e74de4bb8a793fd", size = 2386377, upload-time = "2026-01-05T02:27:13.808Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3e/1e83534ba68459bc5ae39df46fa71003984df58aabf31f7dcd6e22ecddb0/netcdf4-1.7.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56688c03444fffe0d0c7512cb45245e650389cd841c955b30e4552fa681c4cd9", size = 10519821, upload-time = "2026-01-05T02:27:15.413Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8c/a15d6fe97f81d6d5202b17838a9a298b5955b3e9971e20609195112829b5/netcdf4-1.7.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ecf471ba8a6ddb2200121949bedfa0095db228822f38227d5da680694a38358", size = 10371133, upload-time = "2026-01-05T02:27:17.224Z" }, + { url = "https://files.pythonhosted.org/packages/d8/2b/684b15dd4791f8be295b2f6fa97377bbc07a768478a63b7d3c4951712e36/netcdf4-1.7.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5841de0735e8e4875b367c668e81d334287858d64dd9f3e3e2261e808c84922", size = 10395635, upload-time = "2026-01-05T02:27:19.655Z" }, + { url = "https://files.pythonhosted.org/packages/37/dc/44d21524cf1b1c64254f92e22395a7a10f70c18f3a13a18ac9db258760f7/netcdf4-1.7.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:86fac03a8c5b250d57866e7d98918a64742e4b0de1681c5c86bac5726bab8aee", size = 10237725, upload-time = "2026-01-05T02:27:22.298Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9d/c3ddf54296ad8f18f02f77f23452bdb0971aece1b87e84bab9d734bf72cc/netcdf4-1.7.4-cp314-cp314t-macosx_13_0_x86_64.whl", hash = "sha256:ad083d260301b5add74b1669c75ab0df03bdf986decfcc092cb45eec2615b5f1", size = 23515258, upload-time = "2026-01-05T02:27:24.837Z" }, + { url = "https://files.pythonhosted.org/packages/dd/44/bc0346e995d436d03fab682b7fbd2a9adcf0db6a05790b8f24853bf08170/netcdf4-1.7.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f22014092cc9da3f056b0368e2e38c42afd5725c87ad4843eb2f467e16dd4f6", size = 22910171, upload-time = "2026-01-05T02:27:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/30/6b/f9bc3f43c55e2dac72ee9f98d77860789bdd5d50c29adf164a6bdb303078/netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:224a15434c165a5e0225e5831f591edf62533044b1ce62fdfee815195bbd077d", size = 10567579, upload-time = "2026-01-05T02:27:29.382Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/e7685c66b7f011c73cd746127f986358a26c642a4e4a1aa5ab51481b6586/netcdf4-1.7.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31a2318305de6831a18df25ad0df9f03b6d68666af0356d4f6057d66c02ffeb6", size = 10255032, upload-time = "2026-01-05T02:27:31.744Z" }, + { url = "https://files.pythonhosted.org/packages/a6/14/7506738bb6c8bc373b01e5af8f3b727f83f4f496c6b108490ea2609dc2cf/netcdf4-1.7.4-cp314-cp314t-win_amd64.whl", hash = "sha256:6c4a0aa9446c3a616ef3be015b629dc6173643f8b09546de26a4e40e272cd1ed", size = 22289653, upload-time = "2026-01-05T02:27:34.294Z" }, + { url = "https://files.pythonhosted.org/packages/af/2e/39d5e9179c543f2e6e149a65908f83afd9b6d64379a90789b323111761db/netcdf4-1.7.4-cp314-cp314t-win_arm64.whl", hash = "sha256:034220887d48da032cb2db5958f69759dbb04eb33e279ec6390571d4aea734fe", size = 2531682, upload-time = "2026-01-05T02:27:37.062Z" }, +] + [[package]] name = "networkx" version = "3.2.1" @@ -4097,7 +4715,8 @@ name = "networkx" version = "3.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } wheels = [ @@ -4109,11 +4728,14 @@ name = "networkx" version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -4184,7 +4806,8 @@ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ @@ -4249,11 +4872,14 @@ name = "numpy" version = "2.4.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -4343,6 +4969,73 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/ab/fc8290c6a4c722e5514d80f62b2dc4c4df1a68a41d1364e625c35990fcf3/overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49", size = 17832, upload-time = "2024-01-27T21:01:31.393Z" }, ] +[[package]] +name = "owslib" +version = "0.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.10'", +] +dependencies = [ + { name = "lxml", marker = "python_full_version < '3.10'" }, + { name = "python-dateutil", marker = "python_full_version < '3.10'" }, + { name = "pytz", marker = "python_full_version < '3.10'" }, + { name = "pyyaml", marker = "python_full_version < '3.10'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/f6/d739b48f3ae0067996fd3c2e11e066c74cd5158e363dc672529385ccca34/OWSLib-0.31.0.tar.gz", hash = "sha256:2ed6540087445cc57d905138a590b6ae58624ec7661b5c1682ed4e3303bcd150", size = 185317, upload-time = "2024-05-11T12:09:00.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/f4/9d931f6cb1dc170c3be41a9e0d7bfd67239e574aaf12ff812f91b4e4151f/OWSLib-0.31.0-py2.py3-none-any.whl", hash = "sha256:ab54d20974bd8ddd24ee5539c46a7829ec9e77ed0976724f635d1a3a321d3a39", size = 233138, upload-time = "2024-05-11T12:08:57.53Z" }, +] + +[[package]] +name = "owslib" +version = "0.35.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'emscripten'", + "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", +] +dependencies = [ + { name = "lxml", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/03/5df0b995a3a6eefc24cc2320e3fe830d95e76ee6b0b1c6c9d0f1d4040bbe/owslib-0.35.0.tar.gz", hash = "sha256:0182f377bb30d25b78284bbaf82a12dece97902ed844cee88791ff38665b9b00", size = 194282, upload-time = "2025-10-28T15:13:42.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/12/74c145b9e273b2b479f1ea578c7778d96d0c34f2d112fd0ec96c905bb792/owslib-0.35.0-py3-none-any.whl", hash = "sha256:01648ea9b2b86502f456ad68a8dd07131d336416c5637f34adb358aafc0ad380", size = 240487, upload-time = "2025-10-28T15:13:41.399Z" }, +] + +[[package]] +name = "owslib" +version = "0.36.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", + "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", +] +dependencies = [ + { name = "lxml", marker = "python_full_version >= '3.12'" }, + { name = "python-dateutil", marker = "python_full_version >= '3.12'" }, + { name = "pyyaml", marker = "python_full_version >= '3.12'" }, + { name = "requests", version = "2.34.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/10/5d/f2b14a61454bc290c48786c1521f7c9e60996cb0d207b544feb722c82dee/owslib-0.36.0.tar.gz", hash = "sha256:b1ea352ee84f37a1a8ae44122b13cbd3b5b7bf9af0f74d84fe9ed7d9613b9543", size = 196090, upload-time = "2026-06-04T07:05:57.616Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/71/c64b65fba54bda45948aec187b5199ccee01c538214e51aff1fc795b5cc0/owslib-0.36.0-py3-none-any.whl", hash = "sha256:ffe9168684fe091b18985e9368ff88b8419634d773c8566f14347c0ff6fc5aff", size = 241300, upload-time = "2026-06-04T07:05:56.194Z" }, +] + [[package]] name = "packaging" version = "26.2" @@ -4357,7 +5050,8 @@ name = "pandas" version = "2.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] dependencies = [ @@ -4430,11 +5124,14 @@ name = "pandas" version = "3.0.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -4513,7 +5210,7 @@ name = "pexpect" version = "4.9.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ptyprocess", marker = "(python_full_version < '3.11' and sys_platform == 'emscripten') or (python_full_version < '3.11' and sys_platform == 'win32') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, + { name = "ptyprocess", marker = "(python_full_version < '3.11' and platform_machine != 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.10' and platform_machine == 'ARM64' and sys_platform == 'win32') or (python_full_version < '3.11' and sys_platform == 'emscripten') or (sys_platform != 'emscripten' and sys_platform != 'win32')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ @@ -4641,16 +5338,20 @@ name = "pillow" version = "12.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } wheels = [ @@ -4763,16 +5464,20 @@ name = "platformdirs" version = "4.11.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953, upload-time = "2026-07-21T13:09:36.565Z" } wheels = [ @@ -4962,16 +5667,20 @@ name = "propcache" version = "0.5.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } wheels = [ @@ -5188,16 +5897,20 @@ name = "pycparser" version = "3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ @@ -5377,7 +6090,8 @@ name = "pydata-sphinx-theme" version = "0.19.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "accessible-pygments", marker = "python_full_version == '3.10.*'" }, @@ -5398,11 +6112,14 @@ name = "pydata-sphinx-theme" version = "0.20.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -5498,16 +6215,20 @@ name = "pyogrio" version = "0.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "certifi", marker = "python_full_version >= '3.10'" }, @@ -5591,7 +6312,8 @@ name = "pyproj" version = "3.7.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "certifi", marker = "python_full_version == '3.10.*'" }, @@ -5637,11 +6359,14 @@ name = "pyproj" version = "3.7.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -5734,16 +6459,20 @@ name = "pytest" version = "9.1.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, @@ -5791,16 +6520,20 @@ name = "python-json-logger" version = "4.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/f7/ff/3cc9165fd44106973cd7ac9facb674a65ed853494592541d339bdc9a30eb/python_json_logger-4.1.0.tar.gz", hash = "sha256:b396b9e3ed782b09ff9d6e4f1683d46c83ad0d35d2e407c09a9ebbf038f88195", size = 17573, upload-time = "2026-03-29T04:39:56.805Z" } wheels = [ @@ -5853,22 +6586,36 @@ all = [ { name = "trame-vtk", marker = "python_full_version < '3.10'" }, { name = "trame-vuetify", marker = "python_full_version < '3.10'" }, ] +jupyter = [ + { name = "ipywidgets", marker = "python_full_version < '3.10'" }, + { name = "jupyter-server-proxy", marker = "python_full_version < '3.10'" }, + { name = "nest-asyncio", marker = "python_full_version < '3.10'" }, + { name = "trame", version = "3.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "trame-client", marker = "python_full_version < '3.10'" }, + { name = "trame-server", version = "3.11.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "trame-vtk", marker = "python_full_version < '3.10'" }, + { name = "trame-vuetify", marker = "python_full_version < '3.10'" }, +] [[package]] name = "pyvista" version = "0.48.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "cyclopts", marker = "python_full_version >= '3.10'" }, @@ -5905,6 +6652,16 @@ all = [ { name = "trame-vtk", marker = "python_full_version >= '3.10'" }, { name = "trame-vuetify", marker = "python_full_version >= '3.10'" }, ] +jupyter = [ + { name = "ipywidgets", marker = "python_full_version >= '3.10'" }, + { name = "jupyter-server-proxy", marker = "python_full_version >= '3.10'" }, + { name = "nest-asyncio2", marker = "python_full_version >= '3.10'" }, + { name = "trame", version = "3.13.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "trame-client", marker = "python_full_version >= '3.10'" }, + { name = "trame-server", version = "3.12.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "trame-vtk", marker = "python_full_version >= '3.10'" }, + { name = "trame-vuetify", marker = "python_full_version >= '3.10'" }, +] [[package]] name = "pyvista-zstd" @@ -5979,16 +6736,20 @@ name = "pywinpty" version = "3.0.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/a9/ef/2d27f30c59a67be7025b2d7858c8c2d282b74d66544b2384730b82de74fd/pywinpty-3.0.5.tar.gz", hash = "sha256:61db0db063de9865adbea66db294628f8577f608d9764a4c7d3384eeacc4e81b", size = 16223484, upload-time = "2026-06-11T00:11:58.93Z" } wheels = [ @@ -6192,16 +6953,20 @@ name = "referencing" version = "0.37.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "attrs", marker = "python_full_version >= '3.10'" }, @@ -6237,16 +7002,20 @@ name = "requests" version = "2.34.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "certifi", marker = "python_full_version >= '3.10'" }, @@ -6498,7 +7267,8 @@ name = "rpds-py" version = "0.30.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } wheels = [ @@ -6623,11 +7393,14 @@ name = "rpds-py" version = "2026.6.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -6823,7 +7596,8 @@ name = "scikit-image" version = "0.25.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "imageio", version = "2.37.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -6865,11 +7639,14 @@ name = "scikit-image" version = "0.26.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -6990,7 +7767,8 @@ name = "scikit-learn" version = "1.7.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "joblib", marker = "python_full_version == '3.10.*'" }, @@ -7037,11 +7815,14 @@ name = "scikit-learn" version = "1.9.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -7132,7 +7913,8 @@ name = "scipy" version = "1.15.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -7191,7 +7973,8 @@ name = "scipy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7267,10 +8050,12 @@ name = "scipy" version = "1.18.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7338,16 +8123,20 @@ name = "scooby" version = "0.11.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/5b/06/9a8600207fd72a29ee965e9a4c61b750cc3fa106768f14a7b3ee3e36cb61/scooby-0.11.2.tar.gz", hash = "sha256:0575c73636ec4c2587bea1f8a038798ddcb249e02067fae897dac3bf4f4e444d", size = 242928, upload-time = "2026-04-22T23:13:12.307Z" } wheels = [ @@ -7412,16 +8201,20 @@ name = "shapely" version = "2.1.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -7531,16 +8324,20 @@ name = "soupsieve" version = "2.9.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/d9/38/e12680bbe6b4f8f3d17adcaf38d26850aa756c85cf4a80e79fc12a018fe8/soupsieve-2.9.1.tar.gz", hash = "sha256:c33e6605bbc71dd628b00c632d58ae607c22bade247e52553928f83bbb75b4ba", size = 122261, upload-time = "2026-07-21T16:57:17.452Z" } wheels = [ @@ -7584,7 +8381,8 @@ name = "sphinx" version = "8.1.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "alabaster", version = "1.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -7615,7 +8413,8 @@ name = "sphinx" version = "9.0.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7648,10 +8447,12 @@ name = "sphinx" version = "9.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7684,7 +8485,8 @@ name = "sphinx-design" version = "0.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", "python_full_version < '3.10'", ] dependencies = [ @@ -7701,11 +8503,14 @@ name = "sphinx-design" version = "0.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", @@ -7741,16 +8546,20 @@ name = "sphinx-gallery" version = "0.21.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "pillow", version = "12.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -7796,16 +8605,20 @@ name = "sphinxcontrib-bibtex" version = "2.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "docutils", version = "0.21.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -7924,7 +8737,8 @@ name = "tifffile" version = "2025.5.10" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -7939,7 +8753,8 @@ name = "tifffile" version = "2026.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7956,10 +8771,12 @@ name = "tifffile" version = "2026.7.14" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] @@ -7991,16 +8808,20 @@ name = "tinycss2" version = "1.5.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "webencodings", marker = "python_full_version >= '3.10'" }, @@ -8126,16 +8947,20 @@ name = "trame" version = "3.13.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "pyyaml", marker = "python_full_version >= '3.10'" }, @@ -8191,16 +9016,20 @@ name = "trame-server" version = "3.12.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "more-itertools", version = "11.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -8292,16 +9121,20 @@ name = "urllib3" version = "2.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ @@ -8351,16 +9184,20 @@ name = "vtk" version = "9.6.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, @@ -8427,16 +9264,20 @@ name = "webcolors" version = "25.10.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] sdist = { url = "https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf", size = 53491, upload-time = "2025-10-31T07:51:03.977Z" } wheels = [ @@ -8491,16 +9332,20 @@ name = "wslink" version = "2.5.7" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "aiohttp", version = "3.14.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -8661,16 +9506,20 @@ name = "yarl" version = "1.24.5" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.14' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.14' and sys_platform == 'emscripten'", "python_full_version >= '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'win32'", - "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version >= '3.12' and python_full_version < '3.14' and platform_machine != 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and platform_machine != 'ARM64' and sys_platform == 'win32'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform == 'emscripten'", "python_full_version == '3.11.*' and sys_platform == 'emscripten'", "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", - "python_full_version == '3.10.*'", + "python_full_version == '3.10.*' and platform_machine == 'ARM64' and sys_platform == 'win32'", + "(python_full_version == '3.10.*' and platform_machine != 'ARM64') or (python_full_version == '3.10.*' and sys_platform != 'win32')", ] dependencies = [ { name = "idna", marker = "python_full_version >= '3.10'" },