From 7c9fa3558cc4b417ff9ca77eeee727e2ad3dcaf0 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 20 May 2024 12:08:46 +1000 Subject: [PATCH 001/187] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From bad96ed7325fa4f0e5c8f546eb50441d9566a6ab Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 22 May 2024 15:28:01 +1000 Subject: [PATCH 002/187] feat: added issue_templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 -------- .github/ISSUE_TEMPLATE/bug_report.yml | 91 +++++++++++++++++++ .../ISSUE_TEMPLATE/documentation_request.yml | 39 ++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ---- .github/ISSUE_TEMPLATE/feature_request.yml | 77 ++++++++++++++++ .github/ISSUE_TEMPLATE/question.yml | 48 ++++++++++ 6 files changed, 255 insertions(+), 58 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/documentation_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/question.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea78..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..8fe9facf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,91 @@ +name: "Bug Report" +description: "Report a bug or an issue in map2loop" +title: "[Bug] - " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + ## Bug Report + Thanks for submitting a bug report to map2loop! + Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. + + - type: input + id: bug_title + attributes: + label: "Bug Title" + description: "Provide a concise and descriptive title for the bug report." + placeholder: "Enter the title of the bug" + validations: + required: true + + - type: textarea + id: bug_description + attributes: + label: "Bug Description" + description: "Describe the bug you encountered. Include details on what you expected to happen and what actually happened." + placeholder: "Enter a detailed description of the bug" + validations: + required: true + + - type: textarea + id: steps_to_reproduce + attributes: + label: "Minimal reproducible example" + description: "Provide a minimal reproducible example with the code and data necessary to reproduce the bug." + placeholder: "Enter the steps to reproduce the bug" + validations: + required: true + + - type: textarea + id: expected_behavior + attributes: + label: "Expected Behavior" + description: "Describe what you expected to happen." + placeholder: "Enter the expected behavior" + validations: + required: true + + - type: textarea + id: actual_behavior + attributes: + label: "Actual Behavior" + description: "Describe what actually happened when you encountered the bug." + placeholder: "Enter the actual behavior" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding and fixing the bug." + placeholder: "Enter any additional context" + validations: + required: false + + - type: input + id: environment + attributes: + label: "Environment" + description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." + placeholder: "Enter the environment details" + validations: + required: true + + - type: checkboxes + id: severity + attributes: + label: "Severity" + description: "Select the severity level of the bug." + options: + - label: "Low" + value: "low" + - label: "Medium" + value: "medium" + - label: "High" + value: "high" + - label: "Critical" + value: "critical" + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml new file mode 100644 index 00000000..6fb074ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_request.yml @@ -0,0 +1,39 @@ +name: "Documentation Request" +description: "Help us improve map2loop documentation!" +title: "[Documentation] - " +labels: ["documentation"] +body: + - type: markdown + attributes: + value: | + ## Documentation Request + + Please use this template to suggest an improvement or addition to map2loop documentation. + Provide as much detail as possible to help us understand and implement your request efficiently. + + - type: input + id: doc_title + attributes: + label: "Documentation Title" + description: "Provide a concise and descriptive title for the documentation request." + placeholder: "Enter the title of the documentation request" + validations: + required: true + + - type: textarea + id: doc_details + attributes: + label: "Documentation Details" + description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." + placeholder: "Enter a detailed description of the documentation" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful." + placeholder: "Enter any additional context" + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..00872c72 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,77 @@ +name: "Feature Request" +description: "Suggest a new feature or enhancement for map2loop" +title: "[Feature Request] - " +labels: ["enhancement", "feature request"] +body: + - type: markdown + attributes: + value: | + ## Feature Request + + Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. + + - type: input + id: feature_title + attributes: + label: "Feature Title" + description: "Provide a concise and descriptive title for the feature request." + placeholder: "Enter the title of the feature" + validations: + required: true + + - type: textarea + id: feature_description + attributes: + label: "Feature Description" + description: "Describe the feature you would like to see. Include details on why it is needed and how it should work." + placeholder: "Enter a detailed description of the feature" + validations: + required: true + + - type: textarea + id: current_situation + attributes: + label: "Current Situation" + description: "Describe the current situation and how the absence of this feature affects you." + placeholder: "Explain the current situation and its drawbacks" + validations: + required: true + + - type: textarea + id: proposed_solution + attributes: + label: "Proposed Solution" + description: "Describe how you envision the feature working. Include any specific requirements or details." + placeholder: "Explain how the feature should work" + validations: + required: true + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding the feature request." + placeholder: "Enter any additional context" + validations: + required: false + + - type: checkboxes + id: affected_areas + attributes: + label: "Affected Areas" + description: "Select the areas of the project that this feature request impacts." + options: + - label: "input data" + value: "input data" + - label: "project creation" + value: "project creation" + - label: "samplers" + value: "samplers" + - label: "sorters" + value: "sorters" + - label: "stratigraphic column" + value: "stratigraphic column" + - label: "data types" + value: "data types" + - label: "Other" + value: "other" diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 00000000..65db9e62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,48 @@ +name: "Question" +description: "Ask a question about map2loop!" +title: "[Question] - " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question + + Please use this template to ask a question about applying map2loop to your data. + Provide as much detail as possible to help us understand and answer your question efficiently. + + - type: input + id: question_title + attributes: + label: "Question Title" + description: "Provide a concise and descriptive title for your question." + placeholder: "Enter the title of your question" + validations: + required: true + + - type: textarea + id: question_details + attributes: + label: "Question Details" + description: "Describe your question in detail. Include any context or background information that might be helpful." + placeholder: "Enter the details of your question" + validations: + required: true + + - type: textarea + id: relevant_code_snippets + attributes: + label: "Relevant code or data" + description: "If applicable, provide any relevant code snippets or examples related to your question." + placeholder: "Enter any relevant code snippets" + validations: + required: false + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in answering your question." + placeholder: "Enter any additional context" + validations: + required: false From 8e2b3865a154b55554669259635e9ac654a5aecb Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 08:51:38 +1000 Subject: [PATCH 003/187] fix: add pull request template --- .../ISSUE_TEMPLATE/pull_request_template.yml | 18 +++++++++++++ .../pull_request_template/bug_fix_template.md | 24 +++++++++++++++++ .../docs_update_template.md | 23 ++++++++++++++++ .../pull_request_template/feature_template.md | 27 +++++++++++++++++++ .../tests_improvement_template.md | 23 ++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml create mode 100644 .github/pull_request_template/bug_fix_template.md create mode 100644 .github/pull_request_template/docs_update_template.md create mode 100644 .github/pull_request_template/feature_template.md create mode 100644 .github/pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml new file mode 100644 index 00000000..f99ce5c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pull_request_template.yml @@ -0,0 +1,18 @@ +version: 2 + +pull_request_templates: + - name: Bug Fix Template + description: Use this template for bug fixes. + file: pull_request_template/bug_fix_template.md + + - name: Feature Template + description: Use this template for new features. + file: pull_request_template/feature_template.md + + - name: Documentation Update Template + description: Use this template for documentation updates. + file: pull_request_template/docs_update_template.md + + - name: Test Improvement Template + description: Use this template for adding a new test. + file: pull_request_template/tests_improvement_template.md \ No newline at end of file diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md new file mode 100644 index 00000000..d6f7f7ad --- /dev/null +++ b/.github/pull_request_template/bug_fix_template.md @@ -0,0 +1,24 @@ +## Description + +Please describe the issue that this pull request addresses and summarize the changes. + +Fixes #(issue) + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md new file mode 100644 index 00000000..247529c3 --- /dev/null +++ b/.github/pull_request_template/docs_update_template.md @@ -0,0 +1,23 @@ +## Description + +Please include a summary of the changes. Include context if relevant. + +Fixes #(issue) + +## Type of change + +- [ ] Documentation update + +## How Has This Been Tested? +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own documentation +- [ ] I have built the documentation locally with make.bat +- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs +- [ ] My documentation follows the style guidelines of this project +- [ ] I have checked my spelling and grammar diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md new file mode 100644 index 00000000..29a43a6e --- /dev/null +++ b/.github/pull_request_template/feature_template.md @@ -0,0 +1,27 @@ +## Description + +Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. +List any new dependencies that are required for this change. + +Fixes #(issue) + +## Type of change + +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md new file mode 100644 index 00000000..78b3bc70 --- /dev/null +++ b/.github/pull_request_template/tests_improvement_template.md @@ -0,0 +1,23 @@ +## Description + +Please include a summary of the added test. List relevant functions tested. + +Fixes #(issue) + +## Type of change + +- [ ] Test improvement + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own tests +- [ ] My tests follow the style guidelines of this project +- [ ] I have commented my tests, particularly in hard-to-understand areas +- [ ] New and existing unit tests pass locally with my changes From 9288594184250b619f80299d4144d42e6bda19f4 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 09:01:09 +1000 Subject: [PATCH 004/187] fix: few typos grammar --- .github/ISSUE_TEMPLATE/pull_request_template.yml | 2 +- .github/pull_request_template/bug_fix_template.md | 4 ++-- .github/pull_request_template/tests_improvement_template.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml index f99ce5c0..2fc5462a 100644 --- a/.github/ISSUE_TEMPLATE/pull_request_template.yml +++ b/.github/ISSUE_TEMPLATE/pull_request_template.yml @@ -6,7 +6,7 @@ pull_request_templates: file: pull_request_template/bug_fix_template.md - name: Feature Template - description: Use this template for new features. + description: Use this template for adding new features. file: pull_request_template/feature_template.md - name: Documentation Update Template diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md index d6f7f7ad..afdc1497 100644 --- a/.github/pull_request_template/bug_fix_template.md +++ b/.github/pull_request_template/bug_fix_template.md @@ -1,6 +1,6 @@ ## Description -Please describe the issue that this pull request addresses and summarize the changes. +Please describe the issue that this pull request addresses and summarize the changes you are implementing. Fixes #(issue) @@ -10,7 +10,7 @@ Fixes #(issue) ## How Has This Been Tested? -Please describe the tests that you ran to verify your changes. +Please describe any tests that you ran to verify your changes. Provide branch name so we can reproduce. ## Checklist: diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md index 78b3bc70..aa56ee86 100644 --- a/.github/pull_request_template/tests_improvement_template.md +++ b/.github/pull_request_template/tests_improvement_template.md @@ -1,6 +1,6 @@ ## Description -Please include a summary of the added test. List relevant functions tested. +Please include a summary of the added or modified test. List relevant functions tested. Fixes #(issue) From 62a4706171ed96c0625626e7709e7ecacf8b9bc4 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 09:40:33 +1000 Subject: [PATCH 005/187] fix: tests should be with pytest --- .github/pull_request_template/tests_improvement_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md index aa56ee86..58fd8b08 100644 --- a/.github/pull_request_template/tests_improvement_template.md +++ b/.github/pull_request_template/tests_improvement_template.md @@ -17,6 +17,7 @@ Provide branch name so we can reproduce. - [ ] This branch is up-to-date with master - [ ] All gh-action checks are passing +- [ ] My tests run with pytest from the map2loop folder - [ ] I have performed a self-review of my own tests - [ ] My tests follow the style guidelines of this project - [ ] I have commented my tests, particularly in hard-to-understand areas From e1ef2a013189a3933d4e3126f54d801921a9b8a1 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 27 May 2024 12:46:12 +1000 Subject: [PATCH 006/187] Revert "Update issue templates" --- .github/ISSUE_TEMPLATE/bug_report.yml | 91 ------------------- .../ISSUE_TEMPLATE/documentation_request.yml | 39 -------- .github/ISSUE_TEMPLATE/feature_request.yml | 77 ---------------- .../ISSUE_TEMPLATE/pull_request_template.yml | 18 ---- .github/ISSUE_TEMPLATE/question.yml | 48 ---------- .../pull_request_template/bug_fix_template.md | 24 ----- .../docs_update_template.md | 23 ----- .../pull_request_template/feature_template.md | 27 ------ .../tests_improvement_template.md | 24 ----- 9 files changed, 371 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/documentation_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml delete mode 100644 .github/ISSUE_TEMPLATE/question.yml delete mode 100644 .github/pull_request_template/bug_fix_template.md delete mode 100644 .github/pull_request_template/docs_update_template.md delete mode 100644 .github/pull_request_template/feature_template.md delete mode 100644 .github/pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index 8fe9facf..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: "Bug Report" -description: "Report a bug or an issue in map2loop" -title: "[Bug] - " -labels: ["bug"] -body: - - type: markdown - attributes: - value: | - ## Bug Report - Thanks for submitting a bug report to map2loop! - Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. - - - type: input - id: bug_title - attributes: - label: "Bug Title" - description: "Provide a concise and descriptive title for the bug report." - placeholder: "Enter the title of the bug" - validations: - required: true - - - type: textarea - id: bug_description - attributes: - label: "Bug Description" - description: "Describe the bug you encountered. Include details on what you expected to happen and what actually happened." - placeholder: "Enter a detailed description of the bug" - validations: - required: true - - - type: textarea - id: steps_to_reproduce - attributes: - label: "Minimal reproducible example" - description: "Provide a minimal reproducible example with the code and data necessary to reproduce the bug." - placeholder: "Enter the steps to reproduce the bug" - validations: - required: true - - - type: textarea - id: expected_behavior - attributes: - label: "Expected Behavior" - description: "Describe what you expected to happen." - placeholder: "Enter the expected behavior" - validations: - required: true - - - type: textarea - id: actual_behavior - attributes: - label: "Actual Behavior" - description: "Describe what actually happened when you encountered the bug." - placeholder: "Enter the actual behavior" - validations: - required: true - - - type: textarea - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in understanding and fixing the bug." - placeholder: "Enter any additional context" - validations: - required: false - - - type: input - id: environment - attributes: - label: "Environment" - description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." - placeholder: "Enter the environment details" - validations: - required: true - - - type: checkboxes - id: severity - attributes: - label: "Severity" - description: "Select the severity level of the bug." - options: - - label: "Low" - value: "low" - - label: "Medium" - value: "medium" - - label: "High" - value: "high" - - label: "Critical" - value: "critical" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml deleted file mode 100644 index 6fb074ad..00000000 --- a/.github/ISSUE_TEMPLATE/documentation_request.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: "Documentation Request" -description: "Help us improve map2loop documentation!" -title: "[Documentation] - " -labels: ["documentation"] -body: - - type: markdown - attributes: - value: | - ## Documentation Request - - Please use this template to suggest an improvement or addition to map2loop documentation. - Provide as much detail as possible to help us understand and implement your request efficiently. - - - type: input - id: doc_title - attributes: - label: "Documentation Title" - description: "Provide a concise and descriptive title for the documentation request." - placeholder: "Enter the title of the documentation request" - validations: - required: true - - - type: textarea - id: doc_details - attributes: - label: "Documentation Details" - description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." - placeholder: "Enter a detailed description of the documentation" - validations: - required: true - - - type: textarea - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful." - placeholder: "Enter any additional context" - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 00872c72..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: "Feature Request" -description: "Suggest a new feature or enhancement for map2loop" -title: "[Feature Request] - " -labels: ["enhancement", "feature request"] -body: - - type: markdown - attributes: - value: | - ## Feature Request - - Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. - - - type: input - id: feature_title - attributes: - label: "Feature Title" - description: "Provide a concise and descriptive title for the feature request." - placeholder: "Enter the title of the feature" - validations: - required: true - - - type: textarea - id: feature_description - attributes: - label: "Feature Description" - description: "Describe the feature you would like to see. Include details on why it is needed and how it should work." - placeholder: "Enter a detailed description of the feature" - validations: - required: true - - - type: textarea - id: current_situation - attributes: - label: "Current Situation" - description: "Describe the current situation and how the absence of this feature affects you." - placeholder: "Explain the current situation and its drawbacks" - validations: - required: true - - - type: textarea - id: proposed_solution - attributes: - label: "Proposed Solution" - description: "Describe how you envision the feature working. Include any specific requirements or details." - placeholder: "Explain how the feature should work" - validations: - required: true - - - type: input - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in understanding the feature request." - placeholder: "Enter any additional context" - validations: - required: false - - - type: checkboxes - id: affected_areas - attributes: - label: "Affected Areas" - description: "Select the areas of the project that this feature request impacts." - options: - - label: "input data" - value: "input data" - - label: "project creation" - value: "project creation" - - label: "samplers" - value: "samplers" - - label: "sorters" - value: "sorters" - - label: "stratigraphic column" - value: "stratigraphic column" - - label: "data types" - value: "data types" - - label: "Other" - value: "other" diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml deleted file mode 100644 index 2fc5462a..00000000 --- a/.github/ISSUE_TEMPLATE/pull_request_template.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 2 - -pull_request_templates: - - name: Bug Fix Template - description: Use this template for bug fixes. - file: pull_request_template/bug_fix_template.md - - - name: Feature Template - description: Use this template for adding new features. - file: pull_request_template/feature_template.md - - - name: Documentation Update Template - description: Use this template for documentation updates. - file: pull_request_template/docs_update_template.md - - - name: Test Improvement Template - description: Use this template for adding a new test. - file: pull_request_template/tests_improvement_template.md \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml deleted file mode 100644 index 65db9e62..00000000 --- a/.github/ISSUE_TEMPLATE/question.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: "Question" -description: "Ask a question about map2loop!" -title: "[Question] - " -labels: ["question"] -body: - - type: markdown - attributes: - value: | - ## Question - - Please use this template to ask a question about applying map2loop to your data. - Provide as much detail as possible to help us understand and answer your question efficiently. - - - type: input - id: question_title - attributes: - label: "Question Title" - description: "Provide a concise and descriptive title for your question." - placeholder: "Enter the title of your question" - validations: - required: true - - - type: textarea - id: question_details - attributes: - label: "Question Details" - description: "Describe your question in detail. Include any context or background information that might be helpful." - placeholder: "Enter the details of your question" - validations: - required: true - - - type: textarea - id: relevant_code_snippets - attributes: - label: "Relevant code or data" - description: "If applicable, provide any relevant code snippets or examples related to your question." - placeholder: "Enter any relevant code snippets" - validations: - required: false - - - type: input - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in answering your question." - placeholder: "Enter any additional context" - validations: - required: false diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md deleted file mode 100644 index afdc1497..00000000 --- a/.github/pull_request_template/bug_fix_template.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please describe the issue that this pull request addresses and summarize the changes you are implementing. - -Fixes #(issue) - -## Type of change - -- [ ] Bug fix (non-breaking change which fixes an issue) - -## How Has This Been Tested? - -Please describe any tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md deleted file mode 100644 index 247529c3..00000000 --- a/.github/pull_request_template/docs_update_template.md +++ /dev/null @@ -1,23 +0,0 @@ -## Description - -Please include a summary of the changes. Include context if relevant. - -Fixes #(issue) - -## Type of change - -- [ ] Documentation update - -## How Has This Been Tested? -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own documentation -- [ ] I have built the documentation locally with make.bat -- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs -- [ ] My documentation follows the style guidelines of this project -- [ ] I have checked my spelling and grammar diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md deleted file mode 100644 index 29a43a6e..00000000 --- a/.github/pull_request_template/feature_template.md +++ /dev/null @@ -1,27 +0,0 @@ -## Description - -Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. -List any new dependencies that are required for this change. - -Fixes #(issue) - -## Type of change - -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] I have added tests that prove my fix is effective or that my feature works -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md deleted file mode 100644 index 58fd8b08..00000000 --- a/.github/pull_request_template/tests_improvement_template.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please include a summary of the added or modified test. List relevant functions tested. - -Fixes #(issue) - -## Type of change - -- [ ] Test improvement - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] My tests run with pytest from the map2loop folder -- [ ] I have performed a self-review of my own tests -- [ ] My tests follow the style guidelines of this project -- [ ] I have commented my tests, particularly in hard-to-understand areas -- [ ] New and existing unit tests pass locally with my changes From 08ce648d5adcbfa15b17000303f277cccdf4534b Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Thu, 9 May 2024 15:02:17 +1000 Subject: [PATCH 007/187] fix: trigger build --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f654acc5..9a85e71f 100644 --- a/setup.py +++ b/setup.py @@ -57,4 +57,4 @@ def get_description(): "Topic :: Scientific/Engineering :: GIS", ], python_requires=">=3.8", -) +) From 3f1b453cc620f26d395ad478f3ebbb035329dd1f Mon Sep 17 00:00:00 2001 From: lachlangrose Date: Thu, 9 May 2024 05:02:37 +0000 Subject: [PATCH 008/187] style: style fixes by ruff and autoformatting by black --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9a85e71f..f654acc5 100644 --- a/setup.py +++ b/setup.py @@ -57,4 +57,4 @@ def get_description(): "Topic :: Scientific/Engineering :: GIS", ], python_requires=">=3.8", -) +) From 33c663d4c4a75757ddc243ea6d1b4a4b0b696549 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 05:10:10 +0000 Subject: [PATCH 009/187] chore(master): release 3.1.1 --- CHANGELOG.md | 7 +++++++ map2loop/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca4c5763..9df75906 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/map2loop/version.py b/map2loop/version.py index f5f41e56..d539d50c 100644 --- a/map2loop/version.py +++ b/map2loop/version.py @@ -1 +1 @@ -__version__ = "3.1.0" +__version__ = "3.1.1" From 111af95b327c69a4b8e7b4d5bf8d74dc61524c76 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 9 May 2024 16:18:47 +1000 Subject: [PATCH 010/187] fix: update doc deploy --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 79612ece..c8ecc1fd 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -147,7 +147,7 @@ jobs: run: | ls -l docs - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@4 + uses: JamesIves/github-pages-deploy-action@v4 with: branch: gh-pages # The branch the action should deploy to. folder: docs # The folder the action should deploy. \ No newline at end of file From 43d2b3d37d6bcf6c2bfaee607260ffc2f3c9bfdb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 06:37:44 +0000 Subject: [PATCH 011/187] chore(master): release 3.1.2 --- CHANGELOG.md | 7 +++++++ map2loop/version.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9df75906..12ac2de7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [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) diff --git a/map2loop/version.py b/map2loop/version.py index d539d50c..911557b8 100644 --- a/map2loop/version.py +++ b/map2loop/version.py @@ -1 +1 @@ -__version__ = "3.1.1" +__version__ = "3.1.2" From 60b551e637d2fe1b898305a186b0afd613896f08 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 14 May 2024 11:09:01 +1000 Subject: [PATCH 012/187] docs: remove lavavu; no need for 3D vis for the examples --- docs/Dockerfile | 5 +---- docs/source/conf.py | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 0fb83117..c3165b30 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -27,12 +27,9 @@ RUN conda install -c conda-forge --file ./docs/requirements.txt -y RUN pip install . -# RUN pip install lavavu-osmesa==1.8.45 -ENV LD_LIBRARY_PATH=/opt/conda/lib/python3.10/site-packages/lavavu_osmesa.libs - ENV TINI_VERSION v0.19.0 ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini RUN chmod +x /tini -# ENTRYPOINT ["/tini", "--"] +ENTRYPOINT ["/tini", "--"] WORKDIR / \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index afc40e0d..ce0bf2d7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -105,19 +105,17 @@ # Sphinx gallery examples -try: - from LoopStructural.visualisation.sphinx_scraper import Scraper as LoopScraper - from sphinx_gallery.sorting import ExampleTitleSortKey - - sphinx_gallery_conf = { - "examples_dirs": ["../examples/"], - "gallery_dirs": ["_auto_examples/"], # path to where to save gallery generated output - "image_scrapers": ("matplotlib", LoopScraper()), - "within_subsection_order": ExampleTitleSortKey, - "reference_url": {"LoopStructural": None}, - } -except ImportError: - pass + +# from LoopStructural.visualisation.sphinx_scraper import Scraper as LoopScraper +from sphinx_gallery.sorting import ExampleTitleSortKey + +sphinx_gallery_conf = { + "examples_dirs": ["../examples/"], + "gallery_dirs": ["_auto_examples/"], # path to where to save gallery generated output + "image_scrapers": ("matplotlib"), + "within_subsection_order": ExampleTitleSortKey, + "reference_url": {"LoopStructural": None}, +} # def setup(app): # app.add_stylesheet('custom.css') From ef446ce86524d633c321e1463204bfc6d29a0f03 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 14 May 2024 01:09:23 +0000 Subject: [PATCH 013/187] style: style fixes by ruff and autoformatting by black --- docs/source/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index ce0bf2d7..e5edd5e6 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -105,7 +105,6 @@ # Sphinx gallery examples - # from LoopStructural.visualisation.sphinx_scraper import Scraper as LoopScraper from sphinx_gallery.sorting import ExampleTitleSortKey From 1809857bfd3e1eae760f91e50dc185e23be7816d Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 14 May 2024 13:14:39 +1000 Subject: [PATCH 014/187] fix: remove tini from docker --- docs/Dockerfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index c3165b30..86879a31 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -27,9 +27,4 @@ RUN conda install -c conda-forge --file ./docs/requirements.txt -y RUN pip install . -ENV TINI_VERSION v0.19.0 -ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini -RUN chmod +x /tini -ENTRYPOINT ["/tini", "--"] - WORKDIR / \ No newline at end of file From a5312bcaabbbf6703be81de0d28ffe68528e78e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 04:48:56 +0000 Subject: [PATCH 015/187] chore(master): release 3.1.3 --- CHANGELOG.md | 12 ++++++++++++ map2loop/version.py | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ac2de7..edd4dba1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## [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) diff --git a/map2loop/version.py b/map2loop/version.py index 911557b8..f7493720 100644 --- a/map2loop/version.py +++ b/map2loop/version.py @@ -1 +1 @@ -__version__ = "3.1.2" +__version__ = "3.1.3" From b7385d2d8e62363e50e4e07e7d048ed1af0f4cc8 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 20 May 2024 12:08:46 +1000 Subject: [PATCH 016/187] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..dd84ea78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..bbcbbe7d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From e956c928b72a765f8cb190800d0ec627bdbeda9c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 22 May 2024 15:28:01 +1000 Subject: [PATCH 017/187] feat: added issue_templates edit dddf70b chore: added issue_templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 -------- .github/ISSUE_TEMPLATE/bug_report.yml | 91 +++++++++++++++++++ .../ISSUE_TEMPLATE/documentation_request.yml | 39 ++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ---- .github/ISSUE_TEMPLATE/feature_request.yml | 77 ++++++++++++++++ .github/ISSUE_TEMPLATE/question.yml | 48 ++++++++++ 6 files changed, 255 insertions(+), 58 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/documentation_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/question.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea78..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..8fe9facf --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,91 @@ +name: "Bug Report" +description: "Report a bug or an issue in map2loop" +title: "[Bug] - " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + ## Bug Report + Thanks for submitting a bug report to map2loop! + Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. + + - type: input + id: bug_title + attributes: + label: "Bug Title" + description: "Provide a concise and descriptive title for the bug report." + placeholder: "Enter the title of the bug" + validations: + required: true + + - type: textarea + id: bug_description + attributes: + label: "Bug Description" + description: "Describe the bug you encountered. Include details on what you expected to happen and what actually happened." + placeholder: "Enter a detailed description of the bug" + validations: + required: true + + - type: textarea + id: steps_to_reproduce + attributes: + label: "Minimal reproducible example" + description: "Provide a minimal reproducible example with the code and data necessary to reproduce the bug." + placeholder: "Enter the steps to reproduce the bug" + validations: + required: true + + - type: textarea + id: expected_behavior + attributes: + label: "Expected Behavior" + description: "Describe what you expected to happen." + placeholder: "Enter the expected behavior" + validations: + required: true + + - type: textarea + id: actual_behavior + attributes: + label: "Actual Behavior" + description: "Describe what actually happened when you encountered the bug." + placeholder: "Enter the actual behavior" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding and fixing the bug." + placeholder: "Enter any additional context" + validations: + required: false + + - type: input + id: environment + attributes: + label: "Environment" + description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." + placeholder: "Enter the environment details" + validations: + required: true + + - type: checkboxes + id: severity + attributes: + label: "Severity" + description: "Select the severity level of the bug." + options: + - label: "Low" + value: "low" + - label: "Medium" + value: "medium" + - label: "High" + value: "high" + - label: "Critical" + value: "critical" + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml new file mode 100644 index 00000000..6fb074ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_request.yml @@ -0,0 +1,39 @@ +name: "Documentation Request" +description: "Help us improve map2loop documentation!" +title: "[Documentation] - " +labels: ["documentation"] +body: + - type: markdown + attributes: + value: | + ## Documentation Request + + Please use this template to suggest an improvement or addition to map2loop documentation. + Provide as much detail as possible to help us understand and implement your request efficiently. + + - type: input + id: doc_title + attributes: + label: "Documentation Title" + description: "Provide a concise and descriptive title for the documentation request." + placeholder: "Enter the title of the documentation request" + validations: + required: true + + - type: textarea + id: doc_details + attributes: + label: "Documentation Details" + description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." + placeholder: "Enter a detailed description of the documentation" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful." + placeholder: "Enter any additional context" + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..00872c72 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,77 @@ +name: "Feature Request" +description: "Suggest a new feature or enhancement for map2loop" +title: "[Feature Request] - " +labels: ["enhancement", "feature request"] +body: + - type: markdown + attributes: + value: | + ## Feature Request + + Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. + + - type: input + id: feature_title + attributes: + label: "Feature Title" + description: "Provide a concise and descriptive title for the feature request." + placeholder: "Enter the title of the feature" + validations: + required: true + + - type: textarea + id: feature_description + attributes: + label: "Feature Description" + description: "Describe the feature you would like to see. Include details on why it is needed and how it should work." + placeholder: "Enter a detailed description of the feature" + validations: + required: true + + - type: textarea + id: current_situation + attributes: + label: "Current Situation" + description: "Describe the current situation and how the absence of this feature affects you." + placeholder: "Explain the current situation and its drawbacks" + validations: + required: true + + - type: textarea + id: proposed_solution + attributes: + label: "Proposed Solution" + description: "Describe how you envision the feature working. Include any specific requirements or details." + placeholder: "Explain how the feature should work" + validations: + required: true + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding the feature request." + placeholder: "Enter any additional context" + validations: + required: false + + - type: checkboxes + id: affected_areas + attributes: + label: "Affected Areas" + description: "Select the areas of the project that this feature request impacts." + options: + - label: "input data" + value: "input data" + - label: "project creation" + value: "project creation" + - label: "samplers" + value: "samplers" + - label: "sorters" + value: "sorters" + - label: "stratigraphic column" + value: "stratigraphic column" + - label: "data types" + value: "data types" + - label: "Other" + value: "other" diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 00000000..65db9e62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,48 @@ +name: "Question" +description: "Ask a question about map2loop!" +title: "[Question] - " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question + + Please use this template to ask a question about applying map2loop to your data. + Provide as much detail as possible to help us understand and answer your question efficiently. + + - type: input + id: question_title + attributes: + label: "Question Title" + description: "Provide a concise and descriptive title for your question." + placeholder: "Enter the title of your question" + validations: + required: true + + - type: textarea + id: question_details + attributes: + label: "Question Details" + description: "Describe your question in detail. Include any context or background information that might be helpful." + placeholder: "Enter the details of your question" + validations: + required: true + + - type: textarea + id: relevant_code_snippets + attributes: + label: "Relevant code or data" + description: "If applicable, provide any relevant code snippets or examples related to your question." + placeholder: "Enter any relevant code snippets" + validations: + required: false + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in answering your question." + placeholder: "Enter any additional context" + validations: + required: false From 9597a977744e4b7fea91b21d2a661f37ea41f67e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 08:51:38 +1000 Subject: [PATCH 018/187] fix: add pull request template --- .../ISSUE_TEMPLATE/pull_request_template.yml | 18 +++++++++++++ .../pull_request_template/bug_fix_template.md | 24 +++++++++++++++++ .../docs_update_template.md | 23 ++++++++++++++++ .../pull_request_template/feature_template.md | 27 +++++++++++++++++++ .../tests_improvement_template.md | 23 ++++++++++++++++ 5 files changed, 115 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml create mode 100644 .github/pull_request_template/bug_fix_template.md create mode 100644 .github/pull_request_template/docs_update_template.md create mode 100644 .github/pull_request_template/feature_template.md create mode 100644 .github/pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml new file mode 100644 index 00000000..f99ce5c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pull_request_template.yml @@ -0,0 +1,18 @@ +version: 2 + +pull_request_templates: + - name: Bug Fix Template + description: Use this template for bug fixes. + file: pull_request_template/bug_fix_template.md + + - name: Feature Template + description: Use this template for new features. + file: pull_request_template/feature_template.md + + - name: Documentation Update Template + description: Use this template for documentation updates. + file: pull_request_template/docs_update_template.md + + - name: Test Improvement Template + description: Use this template for adding a new test. + file: pull_request_template/tests_improvement_template.md \ No newline at end of file diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md new file mode 100644 index 00000000..d6f7f7ad --- /dev/null +++ b/.github/pull_request_template/bug_fix_template.md @@ -0,0 +1,24 @@ +## Description + +Please describe the issue that this pull request addresses and summarize the changes. + +Fixes #(issue) + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md new file mode 100644 index 00000000..247529c3 --- /dev/null +++ b/.github/pull_request_template/docs_update_template.md @@ -0,0 +1,23 @@ +## Description + +Please include a summary of the changes. Include context if relevant. + +Fixes #(issue) + +## Type of change + +- [ ] Documentation update + +## How Has This Been Tested? +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own documentation +- [ ] I have built the documentation locally with make.bat +- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs +- [ ] My documentation follows the style guidelines of this project +- [ ] I have checked my spelling and grammar diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md new file mode 100644 index 00000000..29a43a6e --- /dev/null +++ b/.github/pull_request_template/feature_template.md @@ -0,0 +1,27 @@ +## Description + +Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. +List any new dependencies that are required for this change. + +Fixes #(issue) + +## Type of change + +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md new file mode 100644 index 00000000..78b3bc70 --- /dev/null +++ b/.github/pull_request_template/tests_improvement_template.md @@ -0,0 +1,23 @@ +## Description + +Please include a summary of the added test. List relevant functions tested. + +Fixes #(issue) + +## Type of change + +- [ ] Test improvement + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own tests +- [ ] My tests follow the style guidelines of this project +- [ ] I have commented my tests, particularly in hard-to-understand areas +- [ ] New and existing unit tests pass locally with my changes From d97b78a02920e2067016e10aa89ade3a33cbe311 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 09:01:09 +1000 Subject: [PATCH 019/187] fix: few typos grammar --- .github/ISSUE_TEMPLATE/pull_request_template.yml | 2 +- .github/pull_request_template/bug_fix_template.md | 4 ++-- .github/pull_request_template/tests_improvement_template.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml index f99ce5c0..2fc5462a 100644 --- a/.github/ISSUE_TEMPLATE/pull_request_template.yml +++ b/.github/ISSUE_TEMPLATE/pull_request_template.yml @@ -6,7 +6,7 @@ pull_request_templates: file: pull_request_template/bug_fix_template.md - name: Feature Template - description: Use this template for new features. + description: Use this template for adding new features. file: pull_request_template/feature_template.md - name: Documentation Update Template diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md index d6f7f7ad..afdc1497 100644 --- a/.github/pull_request_template/bug_fix_template.md +++ b/.github/pull_request_template/bug_fix_template.md @@ -1,6 +1,6 @@ ## Description -Please describe the issue that this pull request addresses and summarize the changes. +Please describe the issue that this pull request addresses and summarize the changes you are implementing. Fixes #(issue) @@ -10,7 +10,7 @@ Fixes #(issue) ## How Has This Been Tested? -Please describe the tests that you ran to verify your changes. +Please describe any tests that you ran to verify your changes. Provide branch name so we can reproduce. ## Checklist: diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md index 78b3bc70..aa56ee86 100644 --- a/.github/pull_request_template/tests_improvement_template.md +++ b/.github/pull_request_template/tests_improvement_template.md @@ -1,6 +1,6 @@ ## Description -Please include a summary of the added test. List relevant functions tested. +Please include a summary of the added or modified test. List relevant functions tested. Fixes #(issue) From 7cb3d47bedf25688add1fa0f68ac476eec5ba2c3 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 24 May 2024 09:40:33 +1000 Subject: [PATCH 020/187] fix: tests should be with pytest --- .github/pull_request_template/tests_improvement_template.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md index aa56ee86..58fd8b08 100644 --- a/.github/pull_request_template/tests_improvement_template.md +++ b/.github/pull_request_template/tests_improvement_template.md @@ -17,6 +17,7 @@ Provide branch name so we can reproduce. - [ ] This branch is up-to-date with master - [ ] All gh-action checks are passing +- [ ] My tests run with pytest from the map2loop folder - [ ] I have performed a self-review of my own tests - [ ] My tests follow the style guidelines of this project - [ ] I have commented my tests, particularly in hard-to-understand areas From a126d02bc2a623719b417fbefdf5bdb09eb968f8 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 27 May 2024 12:46:12 +1000 Subject: [PATCH 021/187] Revert "Update issue templates" --- .github/ISSUE_TEMPLATE/bug_report.yml | 91 ------------------- .../ISSUE_TEMPLATE/documentation_request.yml | 39 -------- .github/ISSUE_TEMPLATE/feature_request.yml | 77 ---------------- .../ISSUE_TEMPLATE/pull_request_template.yml | 18 ---- .github/ISSUE_TEMPLATE/question.yml | 48 ---------- .../pull_request_template/bug_fix_template.md | 24 ----- .../docs_update_template.md | 23 ----- .../pull_request_template/feature_template.md | 27 ------ .../tests_improvement_template.md | 24 ----- 9 files changed, 371 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/documentation_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml delete mode 100644 .github/ISSUE_TEMPLATE/question.yml delete mode 100644 .github/pull_request_template/bug_fix_template.md delete mode 100644 .github/pull_request_template/docs_update_template.md delete mode 100644 .github/pull_request_template/feature_template.md delete mode 100644 .github/pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml deleted file mode 100644 index 8fe9facf..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ /dev/null @@ -1,91 +0,0 @@ -name: "Bug Report" -description: "Report a bug or an issue in map2loop" -title: "[Bug] - " -labels: ["bug"] -body: - - type: markdown - attributes: - value: | - ## Bug Report - Thanks for submitting a bug report to map2loop! - Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. - - - type: input - id: bug_title - attributes: - label: "Bug Title" - description: "Provide a concise and descriptive title for the bug report." - placeholder: "Enter the title of the bug" - validations: - required: true - - - type: textarea - id: bug_description - attributes: - label: "Bug Description" - description: "Describe the bug you encountered. Include details on what you expected to happen and what actually happened." - placeholder: "Enter a detailed description of the bug" - validations: - required: true - - - type: textarea - id: steps_to_reproduce - attributes: - label: "Minimal reproducible example" - description: "Provide a minimal reproducible example with the code and data necessary to reproduce the bug." - placeholder: "Enter the steps to reproduce the bug" - validations: - required: true - - - type: textarea - id: expected_behavior - attributes: - label: "Expected Behavior" - description: "Describe what you expected to happen." - placeholder: "Enter the expected behavior" - validations: - required: true - - - type: textarea - id: actual_behavior - attributes: - label: "Actual Behavior" - description: "Describe what actually happened when you encountered the bug." - placeholder: "Enter the actual behavior" - validations: - required: true - - - type: textarea - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in understanding and fixing the bug." - placeholder: "Enter any additional context" - validations: - required: false - - - type: input - id: environment - attributes: - label: "Environment" - description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." - placeholder: "Enter the environment details" - validations: - required: true - - - type: checkboxes - id: severity - attributes: - label: "Severity" - description: "Select the severity level of the bug." - options: - - label: "Low" - value: "low" - - label: "Medium" - value: "medium" - - label: "High" - value: "high" - - label: "Critical" - value: "critical" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml deleted file mode 100644 index 6fb074ad..00000000 --- a/.github/ISSUE_TEMPLATE/documentation_request.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: "Documentation Request" -description: "Help us improve map2loop documentation!" -title: "[Documentation] - " -labels: ["documentation"] -body: - - type: markdown - attributes: - value: | - ## Documentation Request - - Please use this template to suggest an improvement or addition to map2loop documentation. - Provide as much detail as possible to help us understand and implement your request efficiently. - - - type: input - id: doc_title - attributes: - label: "Documentation Title" - description: "Provide a concise and descriptive title for the documentation request." - placeholder: "Enter the title of the documentation request" - validations: - required: true - - - type: textarea - id: doc_details - attributes: - label: "Documentation Details" - description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." - placeholder: "Enter a detailed description of the documentation" - validations: - required: true - - - type: textarea - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful." - placeholder: "Enter any additional context" - validations: - required: false diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml deleted file mode 100644 index 00872c72..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: "Feature Request" -description: "Suggest a new feature or enhancement for map2loop" -title: "[Feature Request] - " -labels: ["enhancement", "feature request"] -body: - - type: markdown - attributes: - value: | - ## Feature Request - - Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. - - - type: input - id: feature_title - attributes: - label: "Feature Title" - description: "Provide a concise and descriptive title for the feature request." - placeholder: "Enter the title of the feature" - validations: - required: true - - - type: textarea - id: feature_description - attributes: - label: "Feature Description" - description: "Describe the feature you would like to see. Include details on why it is needed and how it should work." - placeholder: "Enter a detailed description of the feature" - validations: - required: true - - - type: textarea - id: current_situation - attributes: - label: "Current Situation" - description: "Describe the current situation and how the absence of this feature affects you." - placeholder: "Explain the current situation and its drawbacks" - validations: - required: true - - - type: textarea - id: proposed_solution - attributes: - label: "Proposed Solution" - description: "Describe how you envision the feature working. Include any specific requirements or details." - placeholder: "Explain how the feature should work" - validations: - required: true - - - type: input - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in understanding the feature request." - placeholder: "Enter any additional context" - validations: - required: false - - - type: checkboxes - id: affected_areas - attributes: - label: "Affected Areas" - description: "Select the areas of the project that this feature request impacts." - options: - - label: "input data" - value: "input data" - - label: "project creation" - value: "project creation" - - label: "samplers" - value: "samplers" - - label: "sorters" - value: "sorters" - - label: "stratigraphic column" - value: "stratigraphic column" - - label: "data types" - value: "data types" - - label: "Other" - value: "other" diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml deleted file mode 100644 index 2fc5462a..00000000 --- a/.github/ISSUE_TEMPLATE/pull_request_template.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 2 - -pull_request_templates: - - name: Bug Fix Template - description: Use this template for bug fixes. - file: pull_request_template/bug_fix_template.md - - - name: Feature Template - description: Use this template for adding new features. - file: pull_request_template/feature_template.md - - - name: Documentation Update Template - description: Use this template for documentation updates. - file: pull_request_template/docs_update_template.md - - - name: Test Improvement Template - description: Use this template for adding a new test. - file: pull_request_template/tests_improvement_template.md \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml deleted file mode 100644 index 65db9e62..00000000 --- a/.github/ISSUE_TEMPLATE/question.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: "Question" -description: "Ask a question about map2loop!" -title: "[Question] - " -labels: ["question"] -body: - - type: markdown - attributes: - value: | - ## Question - - Please use this template to ask a question about applying map2loop to your data. - Provide as much detail as possible to help us understand and answer your question efficiently. - - - type: input - id: question_title - attributes: - label: "Question Title" - description: "Provide a concise and descriptive title for your question." - placeholder: "Enter the title of your question" - validations: - required: true - - - type: textarea - id: question_details - attributes: - label: "Question Details" - description: "Describe your question in detail. Include any context or background information that might be helpful." - placeholder: "Enter the details of your question" - validations: - required: true - - - type: textarea - id: relevant_code_snippets - attributes: - label: "Relevant code or data" - description: "If applicable, provide any relevant code snippets or examples related to your question." - placeholder: "Enter any relevant code snippets" - validations: - required: false - - - type: input - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in answering your question." - placeholder: "Enter any additional context" - validations: - required: false diff --git a/.github/pull_request_template/bug_fix_template.md b/.github/pull_request_template/bug_fix_template.md deleted file mode 100644 index afdc1497..00000000 --- a/.github/pull_request_template/bug_fix_template.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please describe the issue that this pull request addresses and summarize the changes you are implementing. - -Fixes #(issue) - -## Type of change - -- [ ] Bug fix (non-breaking change which fixes an issue) - -## How Has This Been Tested? - -Please describe any tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md deleted file mode 100644 index 247529c3..00000000 --- a/.github/pull_request_template/docs_update_template.md +++ /dev/null @@ -1,23 +0,0 @@ -## Description - -Please include a summary of the changes. Include context if relevant. - -Fixes #(issue) - -## Type of change - -- [ ] Documentation update - -## How Has This Been Tested? -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own documentation -- [ ] I have built the documentation locally with make.bat -- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs -- [ ] My documentation follows the style guidelines of this project -- [ ] I have checked my spelling and grammar diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md deleted file mode 100644 index 29a43a6e..00000000 --- a/.github/pull_request_template/feature_template.md +++ /dev/null @@ -1,27 +0,0 @@ -## Description - -Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. -List any new dependencies that are required for this change. - -Fixes #(issue) - -## Type of change - -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] I have added tests that prove my fix is effective or that my feature works -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/tests_improvement_template.md b/.github/pull_request_template/tests_improvement_template.md deleted file mode 100644 index 58fd8b08..00000000 --- a/.github/pull_request_template/tests_improvement_template.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please include a summary of the added or modified test. List relevant functions tested. - -Fixes #(issue) - -## Type of change - -- [ ] Test improvement - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing -- [ ] My tests run with pytest from the map2loop folder -- [ ] I have performed a self-review of my own tests -- [ ] My tests follow the style guidelines of this project -- [ ] I have commented my tests, particularly in hard-to-understand areas -- [ ] New and existing unit tests pass locally with my changes From aef79d6bbc062acd93b7ca718968536be7e5150b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 28 May 2024 11:16:23 +1000 Subject: [PATCH 022/187] fix: add issue templates back --- .github/ISSUE_TEMPLATE/bug_report.yml | 87 +++++++++++++++++++ .../ISSUE_TEMPLATE/documentation_request.yml | 37 ++++++++ .github/ISSUE_TEMPLATE/feature_request.yml | 69 +++++++++++++++ .../ISSUE_TEMPLATE/pull_request_template.yml | 18 ++++ .github/ISSUE_TEMPLATE/question.yml | 46 ++++++++++ .../pull_request_template/bug_fix_remplate.md | 24 +++++ .../docs_update_template.md | 23 +++++ .../pull_request_template/feature_template.md | 27 ++++++ .../test_improvement_template.md | 24 +++++ 9 files changed, 355 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/documentation_request.yml create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml create mode 100644 .github/ISSUE_TEMPLATE/question.yml create mode 100644 .github/pull_request_template/bug_fix_remplate.md create mode 100644 .github/pull_request_template/docs_update_template.md create mode 100644 .github/pull_request_template/feature_template.md create mode 100644 .github/pull_request_template/test_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..b96a5204 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,87 @@ +name: "Bug Report" +description: "Report a bug or an issue in map2loop" +title: "[Bug] - " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + ## Bug Report + Thanks for submitting a bug report to map2loop! + Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. + + - type: input + id: bug_title + attributes: + label: "Bug Title" + description: "Provide a concise and descriptive title for the bug report." + placeholder: "Enter the title of the bug" + validations: + required: true + + - type: textarea + id: bug_description + attributes: + label: "Bug Description" + description: "Describe the bug you encountered. Include details on what you expected to happen and what actually happened." + placeholder: "Enter a detailed description of the bug" + validations: + required: true + + - type: textarea + id: steps_to_reproduce + attributes: + label: "Minimal reproducible example" + description: "Provide a minimal reproducible example with the code and data necessary to reproduce the bug." + placeholder: "Enter the steps to reproduce the bug" + validations: + required: true + + - type: textarea + id: expected_behavior + attributes: + label: "Expected Behavior" + description: "Describe what you expected to happen." + placeholder: "Enter the expected behavior" + validations: + required: true + + - type: textarea + id: actual_behavior + attributes: + label: "Actual Behavior" + description: "Describe what actually happened when you encountered the bug." + placeholder: "Enter the actual behavior" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding and fixing the bug." + placeholder: "Enter any additional context" + validations: + required: false + + - type: input + id: environment + attributes: + label: "Environment" + description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." + placeholder: "Enter the environment details" + validations: + required: true + + - type: checkboxes + id: severity + attributes: + label: "Severity" + description: "Select the severity level of the bug." + options: + - label: "Low" + - label: "Medium" + - label: "High" + - label: "Critical" + validations: + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml new file mode 100644 index 00000000..d275cc6c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_request.yml @@ -0,0 +1,37 @@ +name: "Documentation Request" +description: "Help us improve map2loop documentation!" +title: "[Documentation] - " +labels: ["documentation"] +body: + - type: markdown + attributes: + value: | + ## Documentation Request + Please use this template to suggest an improvement or addition to map2loop documentation. + Provide as much detail as possible to help us understand and implement your request efficiently. + - type: input + id: doc_title + attributes: + label: "Documentation Title" + description: "Provide a concise and descriptive title for the documentation request." + placeholder: "Enter the title of the documentation request" + validations: + required: true + + - type: textarea + id: doc_details + attributes: + label: "Documentation Details" + description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." + placeholder: "Enter a detailed description of the documentation" + validations: + required: true + + - type: textarea + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful." + placeholder: "Enter any additional context" + validations: + required: false \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..c18daa34 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,69 @@ +name: "Feature Request" +description: "Suggest a new feature or enhancement for map2loop" +title: "[Feature Request] - " +labels: ["enhancement", "feature request"] +body: + - type: markdown + attributes: + value: | + ## Feature Request + Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. + - type: input + id: feature_title + attributes: + label: "Feature Title" + description: "Provide a concise and descriptive title for the feature request." + placeholder: "Enter the title of the feature" + validations: + required: true + + - type: textarea + id: feature_description + attributes: + label: "Feature Description" + description: "Describe the feature you would like to see. Include details on why it is needed and how it should work." + placeholder: "Enter a detailed description of the feature" + validations: + required: true + + - type: textarea + id: current_situation + attributes: + label: "Current Situation" + description: "Describe the current situation and how the absence of this feature affects you." + placeholder: "Explain the current situation and its drawbacks" + validations: + required: true + + - type: textarea + id: proposed_solution + attributes: + label: "Proposed Solution" + description: "Describe how you envision the feature working. Include any specific requirements or details." + placeholder: "Explain how the feature should work" + validations: + required: true + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in understanding the feature request." + placeholder: "Enter any additional context" + validations: + required: false + + - type: checkboxes + id: affected_areas + attributes: + label: "Affected Areas" + description: "Select the areas of the project that this feature request impacts." + options: + - label: "input data" + - label: "project creation" + - label: "samplers" + - label: "sorters" + - label: "stratigraphic column" + - label: "data types" + - label: "faults" + - label: "Other" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml new file mode 100644 index 00000000..bba4e8d7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pull_request_template.yml @@ -0,0 +1,18 @@ +version: 2 + +pull_request_templates: + - name: Bug Fix Template + description: Use this template for bug fixes. + file: pull_request_template/bug_fix_template.md + + - name: Feature Template + description: Use this template for adding new features. + file: pull_request_template/feature_template.md + + - name: Documentation Update Template + description: Use this template for documentation updates. + file: pull_request_template/docs_update_template.md + + - name: Test Improvement Template + description: Use this template for adding a new test. + file: pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml new file mode 100644 index 00000000..1348b55c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -0,0 +1,46 @@ +name: "Question" +description: "Ask a question about map2loop!" +title: "[Question] - " +labels: ["question"] +body: + - type: markdown + attributes: + value: | + ## Question + Please use this template to ask a question about applying map2loop to your data. + Provide as much detail as possible to help us understand and answer your question efficiently. + - type: input + id: question_title + attributes: + label: "Question Title" + description: "Provide a concise and descriptive title for your question." + placeholder: "Enter the title of your question" + validations: + required: true + + - type: textarea + id: question_details + attributes: + label: "Question Details" + description: "Describe your question in detail. Include any context or background information that might be helpful." + placeholder: "Enter the details of your question" + validations: + required: true + + - type: textarea + id: relevant_code_snippets + attributes: + label: "Relevant code or data" + description: "If applicable, provide any relevant code snippets or examples related to your question." + placeholder: "Enter any relevant code snippets" + validations: + required: false + + - type: input + id: additional_context + attributes: + label: "Additional Context" + description: "Provide any other context or information that may be helpful in answering your question." + placeholder: "Enter any additional context" + validations: + required: false \ No newline at end of file diff --git a/.github/pull_request_template/bug_fix_remplate.md b/.github/pull_request_template/bug_fix_remplate.md new file mode 100644 index 00000000..afdc1497 --- /dev/null +++ b/.github/pull_request_template/bug_fix_remplate.md @@ -0,0 +1,24 @@ +## Description + +Please describe the issue that this pull request addresses and summarize the changes you are implementing. + +Fixes #(issue) + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) + +## How Has This Been Tested? + +Please describe any tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md new file mode 100644 index 00000000..99c76ba5 --- /dev/null +++ b/.github/pull_request_template/docs_update_template.md @@ -0,0 +1,23 @@ +## Description + +Please include a summary of the changes. Include context if relevant. + +Fixes #(issue) + +## Type of change + +- [ ] Documentation update + +## How Has This Been Tested? +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own documentation +- [ ] I have built the documentation locally with make.bat +- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs +- [ ] My documentation follows the style guidelines of this project +- [ ] I have checked my spelling and grammar \ No newline at end of file diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md new file mode 100644 index 00000000..29a43a6e --- /dev/null +++ b/.github/pull_request_template/feature_template.md @@ -0,0 +1,27 @@ +## Description + +Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. +List any new dependencies that are required for this change. + +Fixes #(issue) + +## Type of change + +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] I have performed a self-review of my own code +- [ ] My code follows the style guidelines of this project +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation +- [ ] I have added tests that prove my fix is effective or that my feature works +- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/test_improvement_template.md b/.github/pull_request_template/test_improvement_template.md new file mode 100644 index 00000000..0be02d03 --- /dev/null +++ b/.github/pull_request_template/test_improvement_template.md @@ -0,0 +1,24 @@ +## Description + +Please include a summary of the added or modified test. List relevant functions tested. + +Fixes #(issue) + +## Type of change + +- [ ] Test improvement + +## How Has This Been Tested? + +Please describe the tests that you ran to verify your changes. +Provide branch name so we can reproduce. + +## Checklist: + +- [ ] This branch is up-to-date with master +- [ ] All gh-action checks are passing +- [ ] My tests run with pytest from the map2loop folder +- [ ] I have performed a self-review of my own tests +- [ ] My tests follow the style guidelines of this project +- [ ] I have commented my tests, particularly in hard-to-understand areas +- [ ] New and existing unit tests pass locally with my changes \ No newline at end of file From 79d4169226bf1a3df5bd8b70bf86717bed52f781 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 28 May 2024 11:40:57 +1000 Subject: [PATCH 023/187] fix: correct grammar for clarity --- .github/pull_request_template/bug_fix_remplate.md | 4 ++-- .github/pull_request_template/docs_update_template.md | 4 ++-- .github/pull_request_template/feature_template.md | 4 ++-- .github/pull_request_template/test_improvement_template.md | 6 +++--- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/pull_request_template/bug_fix_remplate.md b/.github/pull_request_template/bug_fix_remplate.md index afdc1497..f2e4c85b 100644 --- a/.github/pull_request_template/bug_fix_remplate.md +++ b/.github/pull_request_template/bug_fix_remplate.md @@ -15,8 +15,8 @@ Provide branch name so we can reproduce. ## Checklist: -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing +- [ ] This branch is up-to-date with the master branch +- [ ] All github-action checks are passing - [ ] I have performed a self-review of my own code - [ ] My code follows the style guidelines of this project - [ ] I have commented my code, particularly in hard-to-understand areas diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md index 99c76ba5..a1c43359 100644 --- a/.github/pull_request_template/docs_update_template.md +++ b/.github/pull_request_template/docs_update_template.md @@ -14,8 +14,8 @@ Provide branch name so we can reproduce. ## Checklist: -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing +- [ ] This branch is up-to-date with the master branch +- [ ] All github-action checks are passing - [ ] I have performed a self-review of my own documentation - [ ] I have built the documentation locally with make.bat - [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md index 29a43a6e..3b6e6313 100644 --- a/.github/pull_request_template/feature_template.md +++ b/.github/pull_request_template/feature_template.md @@ -17,8 +17,8 @@ Provide branch name so we can reproduce. ## Checklist: -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing +- [ ] This branch is up-to-date with the master branch +- [ ] All github-action checks are passing - [ ] I have performed a self-review of my own code - [ ] My code follows the style guidelines of this project - [ ] I have commented my code, particularly in hard-to-understand areas diff --git a/.github/pull_request_template/test_improvement_template.md b/.github/pull_request_template/test_improvement_template.md index 0be02d03..56e082bc 100644 --- a/.github/pull_request_template/test_improvement_template.md +++ b/.github/pull_request_template/test_improvement_template.md @@ -13,10 +13,10 @@ Fixes #(issue) Please describe the tests that you ran to verify your changes. Provide branch name so we can reproduce. -## Checklist: +## Checklist: -- [ ] This branch is up-to-date with master -- [ ] All gh-action checks are passing +- [ ] This branch is up-to-date with the master branch +- [ ] All github-action checks are passing - [ ] My tests run with pytest from the map2loop folder - [ ] I have performed a self-review of my own tests - [ ] My tests follow the style guidelines of this project From 7d2d6593320aaa4c4cc5bac3965a2961f96a22d5 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 19 Jun 2024 15:05:32 +1000 Subject: [PATCH 024/187] fix: squashed commits of: - fixing the non-use of minimum_fault_length, - use tmpfile to create temporary files, - added random test for mapdata functions:get/set working projection, - added functionality and comments to basal_contacts_build --- a | 16 +++ map2loop/deformation_history.py | 4 +- map2loop/map2model_wrapper.py | 16 +-- map2loop/mapdata.py | 99 ++++++++++++------- map2loop/project.py | 58 +++++------ map2loop/sampler.py | 13 +-- map2loop/thickness_calculator.py | 53 +++++----- map2loop/utils.py | 5 +- .../test_set_get_working_projection.py | 42 ++++++++ 9 files changed, 191 insertions(+), 115 deletions(-) create mode 100644 a create mode 100644 tests/mapdata/test_set_get_working_projection.py diff --git a/a b/a new file mode 100644 index 00000000..c2b48339 --- /dev/null +++ b/a @@ -0,0 +1,16 @@ + add_multiple_thicknesses + fix/lines_polys2 + fix/map_data_bug + fix/multiple_thickness_estimates + fix/needed-fields + fix/needed_fields_2 + fix/numpy_version + fix/random_colors + fix/thickness_calcs +* fix/thicknesses_AR_2 + fix_issue_templates_remove_value + fix_thicknesses_AR + master + sample_storage_3 + testing_plots_sorters + v3.2 diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index fb906e59..e6d80d22 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -30,7 +30,9 @@ def __init__(self): """ The initialiser for the deformation history. All attributes are defaulted """ - self.minimum_fault_length_to_export = 500.0 + # I want to get the minimum fault length to export from the config dictionary in proj + + self.minimum_fault_length_to_export = 0.0 self.history = [] self.fault_fault_relationships = [] diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index dd19601a..d2bc564e 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -133,9 +133,9 @@ def run(self, verbose_level: VerboseLevel = None): } # TODO: Simplify. Note: this is external so have to match fix to map2model module run_log = map2model.run( - os.path.join(self.map_data.tmp_path, "map2model_data"), - os.path.join(self.map_data.tmp_path, "map2model_data", "geology_wkt.csv"), - os.path.join(self.map_data.tmp_path, "map2model_data", "faults_wkt.csv"), + os.path.join(self.map_data.map2model_tmp_path), + os.path.join(self.map_data.map2model_tmp_path, "geology_wkt.csv"), + os.path.join(self.map_data.map2model_tmp_path, "faults_wkt.csv"), "", self.map_data.get_bounding_box(), map2model_code_map, @@ -150,7 +150,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse units sorted units_sorted = pandas.read_csv( - os.path.join(self.map_data.tmp_path, "map2model_data", "units_sorted.txt"), + os.path.join(self.map_data.map2model_tmp_path, "units_sorted.txt"), header=None, sep=' ', ) @@ -162,7 +162,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse fault intersections out = [] fault_fault_intersection_filename = os.path.join( - self.map_data.tmp_path, "map2model_data", "fault-fault-intersection.txt" + self.map_data.map2model_tmp_path, "fault-fault-intersection.txt" ) if ( os.path.isfile(fault_fault_intersection_filename) @@ -189,7 +189,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse unit fault relationships out = [] unit_fault_intersection_filename = os.path.join( - self.map_data.tmp_path, "map2model_data", "unit-fault-intersection.txt" + self.map_data.map2model_tmp_path, "unit-fault-intersection.txt" ) if ( os.path.isfile(unit_fault_intersection_filename) @@ -212,11 +212,11 @@ def run(self, verbose_level: VerboseLevel = None): units = [] links = [] graph_filename = os.path.join( - self.map_data.tmp_path, "map2model_data", "graph_all_None.gml.txt" + self.map_data.map2model_tmp_path, "graph_all_None.gml.txt" ) if os.path.isfile(graph_filename) and os.path.getsize(graph_filename) > 0: with open( - os.path.join(self.map_data.tmp_path, "map2model_data", "graph_all_None.gml.txt") + os.path.join(self.map_data.map2model_tmp_path, "graph_all_None.gml.txt") ) as file: contents = file.read() segments = contents.split("\n\n") diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index b180481e..edabec2b 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -19,6 +19,8 @@ import os from io import BytesIO from typing import Union +import tempfile + class MapData: """ @@ -52,15 +54,13 @@ class MapData: 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) - tmp_path: str - The path to the directory holding the temporary files 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, tmp_path: str = "", verbose_level: VerboseLevel = VerboseLevel.ALL): + def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): """ The initialiser for the map data @@ -76,7 +76,6 @@ def __init__(self, tmp_path: str = "", verbose_level: VerboseLevel = VerboseLeve self.basal_contacts = None self.sampled_contacts = None self.filenames = [None] * len(Datatype) - # self.output_filenames = [None] * len(Datatype) self.dirtyflags = [True] * len(Datatype) self.data_states = [Datastate.UNNAMED] * len(Datatype) self.working_projection = None @@ -85,7 +84,6 @@ def __init__(self, tmp_path: str = "", verbose_level: VerboseLevel = VerboseLeve self.bounding_box_str = None self.config_filename = None self.colour_filename = None - self.tmp_path = tmp_path self.verbose_level = verbose_level self.config = Config() @@ -99,7 +97,7 @@ def set_working_projection(self, projection): The projection to use for map reprojection """ if issubclass(type(projection), int): - projection = "EPSG:" + str(projection) + projection = f"EPSG:{str(projection)}" self.working_projection = projection elif issubclass(type(projection), str): self.working_projection = projection @@ -473,17 +471,8 @@ def open_http_query(url: str): else: return response except urllib.URLError: - return None - - @beartype.beartype - def __check_and_create_tmp_path(self): - """ - Create the temporary files directory if it is not valid - """ - if not os.path.isdir(self.tmp_path): - os.mkdir(self.tmp_path) - - + return None + @beartype.beartype def __retrieve_tif(self, filename: str): @@ -497,13 +486,12 @@ def __retrieve_tif(self, filename: str): Returns: _type_: The open geotiff in a gdal handler """ - self.__check_and_create_tmp_path() - + # 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": + if filename.lower() in {"aus", "au"}: url = "http://services.ga.gov.au/gis/services/DEM_SRTM_1Second_over_Bathymetry_Topography/MapServer/WCSServer?" wcs = WebCoverageService(url, version="1.0.0") @@ -511,24 +499,25 @@ def __retrieve_tif(self, filename: str): 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 - - tmp_file = os.path.join(self.tmp_path, "StupidGDALLocalFile.tif") - + 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(tmp_file) - + elif filename == "hawaii": 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}" f = urllib.request.urlopen(filename) ds = netCDF4.Dataset("in-mem-file", mode="r", memory=f.read()) @@ -909,6 +898,7 @@ def parse_fault_map(self) -> tuple: tuple: A tuple of (bool: success/fail, str: failure message) """ # Check type of loaded fault map + if ( self.raw_data[Datatype.FAULT] is None or type(self.raw_data[Datatype.FAULT]) is not geopandas.GeoDataFrame @@ -917,6 +907,20 @@ def parse_fault_map(self) -> tuple: # Create new geodataframe faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) + + # crop by minimum fault lenght + self.minimum_fault_length = 0.0 + + try: + self.minimum_fault_length = self.config.fault_config["minimum_fault_length"] + except KeyError: ### if argument missing from config dictionary + print("Minimum fault length not defined in config dictionary; including all faults in map2loop project\n") ## TODO: pass this warning to logger + + + # Filter faults based on the minimum fault length + faults = faults.loc[faults.geometry.length > self.minimum_fault_length] + + config = self.config.fault_config if config["structtype_column"] in self.raw_data[Datatype.FAULT]: @@ -1012,6 +1016,7 @@ def parse_fault_map(self) -> tuple: self.data[Datatype.FAULT] = faults return (False, "") + @beartype.beartype def parse_fold_map(self) -> tuple: """ @@ -1241,10 +1246,8 @@ def export_wkt_format_files(self): """ # TODO: - Move away from tab seperators entirely (topology and map2model) - self.__check_and_create_tmp_path() - if not os.path.isdir(os.path.join(self.tmp_path, "map2model_data")): - os.mkdir(os.path.join(self.tmp_path, "map2model_data")) - + 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: @@ -1277,7 +1280,7 @@ def export_wkt_format_files(self): geology["ROCKTYPE1"] = geology["ROCKTYPE1"].replace("", "None") geology["ROCKTYPE2"] = geology["ROCKTYPE2"].replace("", "None") geology.to_csv( - os.path.join(self.tmp_path, "map2model_data", "geology_wkt.csv"), + os.path.join(self.map2model_tmp_path, "geology_wkt.csv"), sep="\t", index=False, ) @@ -1294,7 +1297,7 @@ def export_wkt_format_files(self): faults = self.get_map_data(Datatype.FAULT).copy() faults.rename(columns={"geometry": "WKT"}, inplace=True) faults.to_csv( - os.path.join(self.tmp_path, "map2model_data", "faults_wkt.csv"), + os.path.join(self.map2model_tmp_path, "faults_wkt.csv"), sep="\t", index=False, ) @@ -1428,7 +1431,7 @@ def extract_all_contacts(self, save_contacts=True): if save_contacts: self.contacts = contacts return contacts - + @beartype.beartype def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True): """ @@ -1440,19 +1443,43 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) """ units = stratigraphic_column basal_contacts = self.contacts.copy() + + # check if the units in the strati colum are in the geology dataset, so that basal contacts can be built + # if not, stop the project + 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() + 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." + ) + + # apply minimum lithological id between the two units basal_contacts["ID"] = basal_contacts.apply( lambda row: min(units.index(row["UNITNAME_1"]), units.index(row["UNITNAME_2"])), axis=1 ) + # match the name of the unit with the minimum id basal_contacts["basal_unit"] = basal_contacts.apply(lambda row: units[row["ID"]], axis=1) - basal_contacts["distance"] = basal_contacts.apply( + # how many units apart are the two units? + basal_contacts["stratigraphic_distance"] = basal_contacts.apply( lambda row: abs(units.index(row["UNITNAME_1"]) - units.index(row["UNITNAME_2"])), axis=1 ) + # if the units are more than 1 unit apart, the contact is abnormal (meaning that there is one (or more) unit(s) missing in between the two) basal_contacts["type"] = basal_contacts.apply( - lambda row: "ABNORMAL" if abs(row["distance"]) > 1 else "BASAL", axis=1 + lambda row: "ABNORMAL" if abs(row["stratigraphic_distance"]) > 1 else "BASAL", axis=1 ) + basal_contacts = basal_contacts[["ID", "basal_unit", "type", "geometry"]] + if save_contacts: self.basal_contacts = basal_contacts + + # added code to make sure that multi-line that touch each other are snapped and merged. + # necessary for the reconstruction based on featureId + basal_contacts["geometry"] = [shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"]] + return basal_contacts @beartype.beartype @@ -1484,7 +1511,7 @@ def colour_units( self.colour_filename = None if self.colour_filename is None: - print("No colour configuration file found. Assigning random colors to units") + print("\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) diff --git a/map2loop/project.py b/map2loop/project.py index a8d5faca..9b09fca9 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -14,6 +14,7 @@ # external imports import LoopProjectFile as LPF +import tempfile from typing import Union from osgeo import gdal import geopandas @@ -55,7 +56,7 @@ class Project(object): def __init__( self, verbose_level: VerboseLevel = VerboseLevel.ALL, - tmp_path: str = "m2l_data_tmp", + # tmp_path: str = "m2l_data_tmp", working_projection=None, bounding_box=None, use_australian_state_data: str = "", @@ -128,20 +129,22 @@ def __init__( self.thickness_calculator = ThicknessCalculatorAlpha() self.throw_calculator = ThrowCalculatorAlpha() self.fault_orientation = FaultOrientationNearest() - self.loop_filename = loop_project_filename - self.overwrite_lpf = overwrite_loopprojectfile - - self.map_data = MapData(tmp_path=tmp_path, verbose_level=verbose_level) + self.map_data = MapData(verbose_level=verbose_level) self.map2model = Map2ModelWrapper(self.map_data) self.stratigraphic_column = StratigraphicColumn() self.deformation_history = DeformationHistory() + self.loop_filename = loop_project_filename + self.overwrite_lpf = overwrite_loopprojectfile + # 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"]) + + # Check for alternate config filenames in kwargs if "metadata_filename" in kwargs and config_filename == "": config_filename = kwargs["metadata_filename"] @@ -158,7 +161,6 @@ def __init__( 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) @@ -172,12 +174,22 @@ def __init__( # 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"]: + 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: 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 != "": @@ -190,14 +202,18 @@ def __init__( 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 != "": if clut_file_legacy: print( "DEPRECATION: Legacy files are deprecated and their use will be removed in v3.2" ) self.map_data.set_config_filename(config_filename, legacy_format=clut_file_legacy) + if config_dictionary != {}: self.map_data.config.update_from_dictionary(config_dictionary) + if clut_filename != "": self.map_data.set_colour_filename(clut_filename) @@ -205,20 +221,16 @@ def __init__( self.map_data.load_all_map_data() # If flag to save out data is check do so + tmp_path = pathlib.Path(tempfile.mkdtemp()) + if save_pre_checked_map_data: 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)) - - # Set default minimum fault length to 5% of the longest bounding box dimension - bounding_box = self.map_data.get_bounding_box() - largest_dimension = max( - bounding_box["maxx"] - bounding_box["minx"], bounding_box["maxy"] - bounding_box["miny"] - ) - self.deformation_history.set_minimum_fault_length(largest_dimension * 0.05) - + self.deformation_history.set_minimum_fault_length(self.map_data.minimum_fault_length) + if len(kwargs): print(f"These keywords were not used in initialising the Loop project ({kwargs})") @@ -351,18 +363,6 @@ def get_sampler(self, datatype: Datatype): """ return self.samplers[datatype].sampler_label - @beartype.beartype - def set_minimum_fault_length(self, length: float): - """ - Set the cutoff length for faults to ignore - - Args: - length (float): - The cutoff length - """ - self.deformation_history.set_minimum_fault_length(length) - - @beartype.beartype def get_minimum_fault_length(self) -> float: """ Get the cutoff length for faults @@ -370,8 +370,8 @@ def get_minimum_fault_length(self) -> float: Returns: float: The cutoff length """ - return self.deformation_history.get_minimum_fault_length() - + return self.map_data.minimum_fault_length + # Processing functions def sample_map_data(self): """ diff --git a/map2loop/sampler.py b/map2loop/sampler.py index d369fea5..e14c6cec 100644 --- a/map2loop/sampler.py +++ b/map2loop/sampler.py @@ -166,15 +166,8 @@ def sample( if target.within(t2_polygon): # df2['featureId'] = str(j) - if "ID" in spatial_data.columns: - df2["ID"] = row["ID"] - else: - df2["ID"] = 0 - - if len(df) == 0: - df = df2 - else: - df = pandas.concat([df, df2]) - + 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/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index ad25c934..157b61bf 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -5,7 +5,7 @@ rebuild_sampled_basal_contacts, calculate_endpoints, multiline_to_line, - find_segment_strike_from_pt, + find_segment_strike_from_pt ) from .m2l_enums import Datatype from .interpolators import DipDipDirectionInterpolator @@ -75,7 +75,12 @@ def compute( 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. """ - pass + + if len(stratigraphic_order) < 3: + print( + f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" + ) + return units class ThicknessCalculatorAlpha(ThicknessCalculator): @@ -117,9 +122,17 @@ def compute( no_distance = -1.0 basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"] thicknesses = units.copy() - # Set default value + + # 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=map_data.sampled_contacts) + + if len(stratigraphic_order) < 3: print( f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" @@ -131,11 +144,11 @@ def compute( stratigraphic_order[i] in basal_unit_list and stratigraphic_order[i + 1] in basal_unit_list ): - contact1 = basal_contacts[basal_contacts["basal_unit"] == stratigraphic_order[i]][ + contact1 = sampled_basal_contacts[sampled_basal_contacts["basal_unit"] == stratigraphic_order[i]][ "geometry" ].to_list()[0] - contact2 = basal_contacts[ - basal_contacts["basal_unit"] == stratigraphic_order[i + 1] + 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) @@ -154,26 +167,13 @@ def compute( # 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, "ThicknessMedian"] == -1: + if thicknesses.loc[idx, "ThicknessMean"] == -1: val = distance else: - val = min(distance, thicknesses.at[idx, "ThicknessMedian"]) - thicknesses.loc[idx, "ThicknessMedian"] = val - - # If no thickness calculations can be made with current stratigraphic column set all units - # to a uniform thickness value - if len(thicknesses[thicknesses["ThicknessMedian"] > 0]) < 1: - thicknesses["ThicknessMedian"] = 100.0 - mean_thickness = mean(thicknesses[thicknesses["ThicknessMedian"] > 0]["ThicknessMedian"]) - - # For any unit thickness that still hasn't been calculated (i.e. at -1) set to - # the mean thickness of the other units - thicknesses["ThicknessMedian"] = thicknesses.apply( - lambda row: mean_thickness if row["ThicknessMedian"] == -1 else row["ThicknessMedian"], - axis=1, - ) - return thicknesses + val = min(distance, thicknesses.at[idx, "ThicknessMean"]) + thicknesses.loc[idx, "ThicknessMean"] = val + return thicknesses class InterpolatedStructure(ThicknessCalculator): """ @@ -292,12 +292,6 @@ def compute( ["geometry", "dip", "UNITNAME"] ].copy() - if len(stratigraphic_order) < 3: - print( - f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" - ) - return thicknesses - for i in range(0, len(stratigraphic_order) - 1): if ( stratigraphic_order[i] in basal_unit_list @@ -459,6 +453,7 @@ def compute( sampled_basal_contacts = rebuild_sampled_basal_contacts( basal_contacts, map_data.sampled_contacts ) + sampled_basal_contacts.plot() # calculate map dimensions map_dx = geology.total_bounds[2] - geology.total_bounds[0] diff --git a/map2loop/utils.py b/map2loop/utils.py index b48ba36a..cff711a8 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -262,7 +262,7 @@ def rebuild_sampled_basal_contacts( crs=basal_contacts.crs, ) - basal_contacts['geometry'] = basal_contacts.buffer(1) + basal_contacts.loc[:, 'geometry'] = basal_contacts.buffer(1) sampled_basal_contacts = sampled_geology.sjoin( basal_contacts, how='left', predicate='intersects' ).dropna() @@ -299,6 +299,8 @@ def rebuild_sampled_basal_contacts( crs=basal_contacts.crs, columns=['basal_unit'], ) + + # return sampled_basal_contacts @@ -372,4 +374,3 @@ def hex_to_rgb(hex_color: str) -> tuple: ) from e return (r, g, b, alpha) - diff --git a/tests/mapdata/test_set_get_working_projection.py b/tests/mapdata/test_set_get_working_projection.py new file mode 100644 index 00000000..fc215f05 --- /dev/null +++ b/tests/mapdata/test_set_get_working_projection.py @@ -0,0 +1,42 @@ +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, "Warning: Unknown projection set None. Leaving all map data in original projection\n"), # error case with None + ([], None, None, "Warning: Unknown projection set []. Leaving all map data in original projection\n"), # error case with list + ({}, None, None, "Warning: Unknown projection set {}. Leaving all map data in original projection\n"), # 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, capsys): + # Arrange + map_data = MapData() + map_data.bounding_box = bounding_box + + # Act + map_data.set_working_projection(projection) + + # Assert + assert map_data.working_projection == expected_projection + + if expected_warning: + captured = capsys.readouterr() + assert expected_warning in captured.out + else: + captured = capsys.readouterr() + assert captured.out == "" From 3a480059687c4a9ead8ece8c09ffe70887ebabf9 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 19 Jun 2024 15:23:02 +1000 Subject: [PATCH 025/187] tests: add more functionality --- tests/mapdata/test_set_get_working_projection.py | 2 +- tests/project/test_plot_hamersley.py | 8 ++++++-- .../test_thickness_StructuralPoint_server.py | 8 ++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/tests/mapdata/test_set_get_working_projection.py b/tests/mapdata/test_set_get_working_projection.py index fc215f05..c0c74e3f 100644 --- a/tests/mapdata/test_set_get_working_projection.py +++ b/tests/mapdata/test_set_get_working_projection.py @@ -32,7 +32,7 @@ def test_set_working_projection(projection, expected_projection, bounding_box, e map_data.set_working_projection(projection) # Assert - assert map_data.working_projection == expected_projection + assert map_data.working_projection == expected_projection, "Map.data set_working_projection() not attributing the correct projection" if expected_warning: captured = capsys.readouterr() diff --git a/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py index 027d285a..8ed39f72 100644 --- a/tests/project/test_plot_hamersley.py +++ b/tests/project/test_plot_hamersley.py @@ -39,8 +39,12 @@ def test_project_execution(): loop_project_filename=loop_project_filename, overwrite_loopprojectfile=True, ) - except requests.exceptions.ReadTimeout: - pytest.skip("Connection to the server timed out, skipping test") + + except (requests.exceptions.RequestException, requests.exceptions.ReadTimeout) as e: + if "HTTPConnectionPool" in str(e) or isinstance(e, requests.exceptions.ReadTimeout): + pytest.skip("Connection to the server timed out, skipping test") + else: + raise # Re-raise the exception if it's not server unavailable proj.run_all(take_best=True) assert proj is not None, "Plot Hamersley Basin failed to execute" diff --git a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py b/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py index 3cadeb3d..f727e263 100644 --- a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py +++ b/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py @@ -48,8 +48,12 @@ def test_from_aus_state(): loop_project_filename=loop_project_filename, overwrite_loopprojectfile=True, ) - except requests.exceptions.ReadTimeout: - pytest.skip("Connection to the server timed out, skipping test") + + except (requests.exceptions.RequestException, requests.exceptions.ReadTimeout) as e: + if "HTTPConnectionPool" in str(e) or isinstance(e, requests.exceptions.ReadTimeout): + pytest.skip("Connection to the server timed out, skipping test") + else: + raise # Re-raise the exception if it's not server unavailable proj.set_thickness_calculator(StructuralPoint()) proj.run_all() From 8b3c348d3e7e30add88003a70ef39fe3540c10fd Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 19 Jun 2024 17:45:24 +1000 Subject: [PATCH 026/187] fix: leave as is for now --- map2loop/project.py | 85 ++++++++++++++++++++------------ map2loop/thickness_calculator.py | 18 ++++--- 2 files changed, 64 insertions(+), 39 deletions(-) diff --git a/map2loop/project.py b/map2loop/project.py index 9b09fca9..1762c9b5 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -4,7 +4,7 @@ from .m2l_enums import VerboseLevel, ErrorState, Datatype from .mapdata import MapData from .sampler import Sampler, SamplerDecimator, SamplerSpacing -from .thickness_calculator import ThicknessCalculator, ThicknessCalculatorAlpha +from .thickness_calculator import ThicknessCalculator, ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint from .throw_calculator import ThrowCalculator, ThrowCalculatorAlpha from .fault_orientation import FaultOrientation from .sorter import Sorter, SorterAgeBased, SorterAlpha, SorterUseNetworkX, SorterUseHint @@ -38,8 +38,6 @@ class Project(object): A list of samplers used to extract point samples from polyonal or line segments. Indexed by m2l_enum.Dataype sorter: Sorter The sorting algorithm to use for calculating the stratigraphic column - thickness_calculator: ThicknessCalulator - The algorithm to use for making unit thickness estimations loop_filename: str The name of the loop project file used in this project map_data: MapData @@ -126,7 +124,6 @@ def __init__( self.samplers = [SamplerDecimator()] * len(Datatype) self.set_default_samplers() self.sorter = SorterUseHint() - self.thickness_calculator = ThicknessCalculatorAlpha() self.throw_calculator = ThrowCalculatorAlpha() self.fault_orientation = FaultOrientationNearest() self.map_data = MapData(verbose_level=verbose_level) @@ -267,25 +264,6 @@ def get_sorter(self): """ return self.sorter.sorter_label - @beartype.beartype - def set_thickness_calculator(self, thickness_calculator: ThicknessCalculator): - """ - Set the thickness calculator that estimates unit thickness of all units - - Args: - thickness_calculator (ThicknessCalculator): - The calculator to use. Must be of base class ThicknessCalculator - """ - self.thickness_calculator = thickness_calculator - - def get_thickness_calculator(self): - """ - Get the name of the thickness calculator being used - - Returns: - str: The name of the thickness calculator used - """ - return self.thickness_calculator.thickness_calculator_label @beartype.beartype def set_fault_orientation(self, fault_orientation: FaultOrientation): @@ -446,19 +424,48 @@ def calculate_stratigraphic_order(self, take_best=False): self.map_data.contacts, self.map_data, ) - + + def calculate_unit_thicknesses(self): """ Use the stratigraphic column, and fault and contact data to estimate unit thicknesses """ - self.stratigraphic_column.stratigraphicUnits = self.thickness_calculator.compute( - self.stratigraphic_column.stratigraphicUnits, - self.stratigraphic_column.column, - self.map_data.basal_contacts, - self.structure_samples, - self.map_data, + thickness_calculator_labels = ['ThicknessCalculatorAlpha', 'InterpolatedStructure', 'StructuralPoint', ] + + thickness_calculation_results = [] + + for label in thickness_calculator_labels: + if label == 'InterpolatedStructure': + calculator = InterpolatedStructure() + elif label == 'StructuralPoint': + calculator = StructuralPoint() + elif label == 'ThicknessCalculatorAlpha': + calculator = ThicknessCalculatorAlpha() + + result = calculator.compute( + self.stratigraphic_column.stratigraphicUnits, + self.stratigraphic_column.column, + self.map_data.basal_contacts, + self.structure_samples, + self.map_data, + )[['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev']] + + # Rename the columns + result = result.rename(columns={ + 'ThicknessMean': f'ThicknessMean_{label}', + 'ThicknessMedian': f'ThicknessMedian_{label}', + 'ThicknessStdDev': f'ThicknessStdDev_{label}' + }) + + thickness_calculation_results.append(result) + + thickness_combined_results = pandas.concat(thickness_calculation_results, axis=1) + + self.stratigraphic_column.stratigraphicUnits = pandas.concat( + [self.stratigraphic_column.stratigraphicUnits, thickness_combined_results], axis=1 ) + def calculate_fault_orientations(self): if self.map_data.get_map_data(Datatype.FAULT_ORIENTATION) is not None: self.fault_orientations = self.fault_orientation.calculate( @@ -614,6 +621,7 @@ def save_into_projectfile(self): stratigraphic_data["group"] = self.stratigraphic_column.stratigraphicUnits["group"] stratigraphic_data["enabled"] = 1 + stratigraphic_data["ThicknessMean"] = self.stratigraphic_column.stratigraphicUnits[ 'ThicknessMean' ] @@ -623,7 +631,22 @@ def save_into_projectfile(self): stratigraphic_data["ThicknessStdDev"] = self.stratigraphic_column.stratigraphicUnits[ 'ThicknessStdDev' ] - + + # column_len = len(self.stratigraphic_column.stratigraphicUnits) + # # thickness means by calculator + + # combined_thickness_means = [ + # numpy.array(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_ThicknessCalculatorAlpha'])[0], + # numpy.array(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_InterpolatedStructure'])[0], + # self.stratigraphic_column.stratigraphicUnits['ThicknessMean_StructuralPoint'], + # [0] * column_len, + # [0] * column_len + # ] + # print(combined_thickness_means) + + # Assign to stratigraphic_data DataFrame + # stratigraphic_data["ThicknessMean"] = numpy.array(combined_thickness_means).reshape(1, -1) + stratigraphic_data["colour1Red"] = [ int(a[1:3], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] ] diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 157b61bf..1c96dd9f 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -135,7 +135,7 @@ def compute( if len(stratigraphic_order) < 3: print( - f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" + f"ThicknessCalculatorAlpha: Cannot make any thickness calculations with only {len(stratigraphic_order)} units" ) return thicknesses for i in range(1, len(stratigraphic_order) - 1): @@ -154,12 +154,12 @@ def compute( distance = contact1.distance(contact2) else: print( - f"Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}" + f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" ) distance = no_distance else: print( - f"Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}" + f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" ) distance = no_distance @@ -364,7 +364,7 @@ def compute( else: print( - f"Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}" + f"Thickness Calculator InterpolatedStructure: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}\n" ) return thicknesses @@ -557,6 +557,7 @@ def compute( # find the lenght of the segment L = math.sqrt(((int_pt1.x - int_pt2.x) ** 2) + ((int_pt1.y - int_pt2.y) ** 2)) + # calculate thickness thickness = L * math.sin(math.radians(measurement['DIP'])) @@ -582,6 +583,8 @@ def compute( output_units.loc[idx, 'ThicknessMedian'] = unit['median'] output_units.loc[idx, 'ThicknessMean'] = unit['mean'] output_units.loc[idx, 'ThicknessStdDev'] = unit['std'] + + output_units = output_units.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 @@ -594,11 +597,10 @@ def compute( idx = stratigraphic_order.index(unit) # throw warning to user print( - 'It was not possible to calculate thickness between unit ', + 'Thickness Calculator StructuralPoint: Cannot calculate thickness between', unit, "and ", - stratigraphic_order[idx + 1], - 'Assigning thickness of -1', + stratigraphic_order[idx + 1], "\n" ) # assign -1 as thickness output_units.loc[output_units["name"] == unit, "ThicknessMedian"] = -1 @@ -606,7 +608,7 @@ def compute( output_units.loc[output_units["name"] == unit, "ThicknessStdDev"] = -1 # if top//bottom unit assign -1 - if unit == stratigraphic_order[-1] or unit == stratigraphic_order[0]: + 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 From 44bfa06126e2dfa8db696fa809b497dfc8fc17bd Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 20 Jun 2024 11:42:57 +1000 Subject: [PATCH 027/187] fix: finalise the thickness calculator outputs --- map2loop/project.py | 71 ++++++++++++------- map2loop/stratigraphic_column.py | 14 ++-- map2loop/thickness_calculator.py | 11 ++- .../test_set_get_recreate_bounding_box.py | 62 ++++++++++++++++ 4 files changed, 126 insertions(+), 32 deletions(-) create mode 100644 tests/mapdata/test_set_get_recreate_bounding_box.py diff --git a/map2loop/project.py b/map2loop/project.py index 1762c9b5..568f1f59 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -460,11 +460,18 @@ def calculate_unit_thicknesses(self): thickness_calculation_results.append(result) thickness_combined_results = pandas.concat(thickness_calculation_results, axis=1) - - self.stratigraphic_column.stratigraphicUnits = pandas.concat( - [self.stratigraphic_column.stratigraphicUnits, thickness_combined_results], axis=1 - ) + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessMean_ThicknessCalculatorAlpha'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessMedian_ThicknessCalculatorAlpha'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessStdDev_ThicknessCalculatorAlpha'] + + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_InterpolatedStructure'] = thickness_combined_results['ThicknessMean_InterpolatedStructure'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_InterpolatedStructure'] = thickness_combined_results['ThicknessMedian_InterpolatedStructure'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_InterpolatedStructure'] = thickness_combined_results['ThicknessStdDev_InterpolatedStructure'] + + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_StructuralPoint'] = thickness_combined_results['ThicknessMean_StructuralPoint'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_StructuralPoint'] = thickness_combined_results['ThicknessMedian_StructuralPoint'] + self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_StructuralPoint'] = thickness_combined_results['ThicknessStdDev_StructuralPoint'] def calculate_fault_orientations(self): if self.map_data.get_map_data(Datatype.FAULT_ORIENTATION) is not None: @@ -622,31 +629,43 @@ def save_into_projectfile(self): stratigraphic_data["enabled"] = 1 - stratigraphic_data["ThicknessMean"] = self.stratigraphic_column.stratigraphicUnits[ - 'ThicknessMean' - ] - stratigraphic_data['ThicknessMedian'] = self.stratigraphic_column.stratigraphicUnits[ - 'ThicknessMedian' - ] - stratigraphic_data["ThicknessStdDev"] = self.stratigraphic_column.stratigraphicUnits[ - 'ThicknessStdDev' - ] + # stratigraphic_data["ThicknessMean"] = self.stratigraphic_column.stratigraphicUnits[ + # 'ThicknessMean' + # ] + # stratigraphic_data['ThicknessMedian'] = self.stratigraphic_column.stratigraphicUnits[ + # 'ThicknessMedian' + # ] + # stratigraphic_data["ThicknessStdDev"] = self.stratigraphic_column.stratigraphicUnits[ + # 'ThicknessStdDev' + # ] - # column_len = len(self.stratigraphic_column.stratigraphicUnits) - # # thickness means by calculator + column_len = len(self.stratigraphic_column.stratigraphicUnits) - # combined_thickness_means = [ - # numpy.array(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_ThicknessCalculatorAlpha'])[0], - # numpy.array(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_InterpolatedStructure'])[0], - # self.stratigraphic_column.stratigraphicUnits['ThicknessMean_StructuralPoint'], - # [0] * column_len, - # [0] * column_len - # ] - # print(combined_thickness_means) - - # Assign to stratigraphic_data DataFrame - # stratigraphic_data["ThicknessMean"] = numpy.array(combined_thickness_means).reshape(1, -1) + # thickness means by calculator + stratigraphic_data["ThicknessMean"] = list(zip( + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_ThicknessCalculatorAlpha']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_InterpolatedStructure']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_StructuralPoint']), + [0] * column_len, + [0] * column_len)) + + # thickness medians by calculator + stratigraphic_data["ThicknessMedian"] = list(zip( + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_ThicknessCalculatorAlpha']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_InterpolatedStructure']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_StructuralPoint']), + [0] * column_len, + [0] * column_len)) + + # thickness medians by calculator + stratigraphic_data["ThicknessStdDev"] = list(zip( + list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_ThicknessCalculatorAlpha']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_InterpolatedStructure']), + list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_StructuralPoint']), + [0] * column_len, + [0] * column_len)) + # Assign colours to startigraphic data stratigraphic_data["colour1Red"] = [ int(a[1:3], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] ] diff --git a/map2loop/stratigraphic_column.py b/map2loop/stratigraphic_column.py index 016088c8..ae8da5cf 100644 --- a/map2loop/stratigraphic_column.py +++ b/map2loop/stratigraphic_column.py @@ -40,9 +40,15 @@ def __init__(self): ("maxAge", float), ("group", str), ("supergroup", str), - ("ThicknessMean", float), - ("ThicknessMedian", float), - ("ThicknessStdDev", float), + ("ThicknessMean_ThicknessCalculatorAlpha", float), + ("ThicknessMedian_ThicknessCalculatorAlpha", float), + ("ThicknessStdDev_ThicknessCalculatorAlpha", float), + ("ThicknessMean_InterpolatedStructure", float), + ("ThicknessMedian_InterpolatedStructure", float), + ("ThicknessStdDev_InterpolatedStructure", float), + ("ThicknessMean_StructuralPoint", float), + ("ThicknessMedian_StructuralPoint", float), + ("ThicknessStdDev_StructuralPoint", float), ("colour", str), # ("indexInGroup", int), # ("groupNum", int), @@ -61,7 +67,6 @@ def __init__(self): ("minAge", float), ("maxAge", float), ("group", str), - ("ThicknessMedian", float), ("colour", str), ] ) @@ -164,7 +169,6 @@ def populate(self, geology_map_data: geopandas.GeoDataFrame): self.stratigraphicUnits["maxAge"] = geology_data["MAX_AGE"] self.stratigraphicUnits["group"] = geology_data["GROUP"] self.stratigraphicUnits["supergroup"] = geology_data["SUPERGROUP"] - self.stratigraphicUnits["ThicknessMedian"] = -1.0 self.stratigraphicUnits["colour"] = "#000000" # self.stratigraphicUnits["indexInGroup"] = -1 diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 1c96dd9f..751e1247 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -261,9 +261,18 @@ def compute( contacts = contacts.sjoin(basal_contacts, how="inner", predicate="intersects") contacts = contacts[["X", "Y", "Z", "geometry", "basal_unit"]].copy() bounding_box = map_data.get_bounding_box() + # Interpolate the dip of the contacts interpolator = DipDipDirectionInterpolator(data_type="dip") - dip = interpolator(bounding_box, structure_data, interpolator=scipy.interpolate.Rbf) + + ### TODO: RC - fix the Linalg error at some stage. + # for now, if error is raised, return thicknesses with -1 + try: + dip = interpolator(bounding_box, structure_data, interpolator=scipy.interpolate.Rbf) + except scipy.linalg.LinAlgError: + print("Thickness Calculator InterpolatedStructure: Could not interpolate dip") + return thicknesses + # create a GeoDataFrame of the interpolated orientations interpolated_orientations = geopandas.GeoDataFrame() # add the dip and dip direction to the GeoDataFrame diff --git a/tests/mapdata/test_set_get_recreate_bounding_box.py b/tests/mapdata/test_set_get_recreate_bounding_box.py new file mode 100644 index 00000000..e5cb7076 --- /dev/null +++ b/tests/mapdata/test_set_get_recreate_bounding_box.py @@ -0,0 +1,62 @@ +import pytest +from map2loop import MapData # Replace with the actual module and class name +import geopandas +import shapely + +@pytest.fixture +md = 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 + } + +def test_set_bounding_box_with_dict(your_class_instance): + bounding_box = { + "minx": 0, + "maxx": 10, + "miny": 0, + "maxy": 10, + "top": 5, + "base": 15 + } + your_class_instance.set_bounding_box(bounding_box) + + assert your_class_instance.bounding_box == bounding_box + +def test_set_bounding_box_with_invalid_type(your_class_instance): + with pytest.raises(TypeError): + your_class_instance.set_bounding_box([0, 10, 0, 10]) # List instead of tuple or dict + +def test_bounding_box_keys(your_class_instance): + bounding_box = (0, 10, 0, 10) + your_class_instance.set_bounding_box(bounding_box) + + for key in ["minx", "maxx", "miny", "maxy", "top", "base"]: + assert key in your_class_instance.bounding_box + +def test_bounding_box_polygon(your_class_instance): + bounding_box = (0, 10, 0, 10) + your_class_instance.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=your_class_instance.working_projection, + geometry=[shapely.Polygon(zip(lon_point_list, lat_point_list))] + ) + + assert your_class_instance.bounding_box_polygon.equals(expected_polygon) + +if __name__ == "__main__": + pytest.main() From d6816e31240b69cc957ac9d6ae3327fa7c37ecb4 Mon Sep 17 00:00:00 2001 From: RoyThomsonMonash Date: Thu, 4 Jul 2024 09:27:15 +1000 Subject: [PATCH 028/187] fix: Remove hjson and rely on json only --- conda/meta.yaml | 3 --- dependencies.txt | 1 - map2loop/config.py | 6 +++--- setup.py | 1 - 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/conda/meta.yaml b/conda/meta.yaml index e4d0b39d..26e160f3 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -20,7 +20,6 @@ requirements: - numpy - geopandas - map2model - - hjson - loopprojectfile - beartype - owslib @@ -30,7 +29,6 @@ requirements: - pandas - geopandas - map2model - - hjson - loopprojectfile - beartype - owslib @@ -40,7 +38,6 @@ test: - map2loop - geopandas - map2model - - hjson - loopprojectfile - beartype - owslib diff --git a/dependencies.txt b/dependencies.txt index 4c52daee..4104746f 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -3,6 +3,5 @@ shapely networkx owslib map2model -hjson loopprojectfile>=0.1.3 beartype \ No newline at end of file diff --git a/map2loop/config.py b/map2loop/config.py index 21d9e536..4229c03c 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -1,5 +1,5 @@ import beartype -import hjson +import json import urllib import time import pathlib @@ -205,7 +205,7 @@ def update_from_file( while try_count >= 0 and not success: try: with urllib.request.urlopen(filename) as url_data: - data = hjson.load(url_data) + data = json.load(url_data) func(data, lower) success = True except Exception as e: @@ -217,7 +217,7 @@ def update_from_file( raise e else: with open(filename) as url_data: - data = hjson.load(url_data) + data = json.load(url_data) func(data, lower) except Exception: err_string = f"There is a problem parsing the config file ({filename}).\n" diff --git a/setup.py b/setup.py index f654acc5..884683b8 100644 --- a/setup.py +++ b/setup.py @@ -37,7 +37,6 @@ def get_description(): "tqdm", "networkx", "owslib", - "hjson", "loopprojectfile", "map2model", "beartype", From c60ed2ce7b40361b0cd1ce4fc352907eed2df331 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 8 Jul 2024 15:05:34 +1000 Subject: [PATCH 029/187] fix: update tests/ small fixes --- .../geodata_files/hamersley/dtm_rp.tif | Bin 0 -> 161316 bytes .../geodata_files/hamersley/geology.geojson | 69 ++ .../hamersley/structures.geojson | 125 ++++ .../geodata_files/load_map2loop_data.py | 43 ++ map2loop/project.py | 8 +- map2loop/stratigraphic_column.py | 4 +- map2loop/thickness_calculator.py | 13 +- .../test_set_get_recreate_bounding_box.py | 78 ++- tests/project/test_thickness_calculations.py | 153 +++++ .../test_interpolated_structure.py | 588 +++++++++--------- ..._thickness_StructuralPoint_local_source.py | 470 +++++++------- .../test_thickness_StructuralPoint_server.py | 120 ++-- 12 files changed, 1054 insertions(+), 617 deletions(-) create mode 100644 map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif create mode 100644 map2loop/_datasets/geodata_files/hamersley/geology.geojson create mode 100644 map2loop/_datasets/geodata_files/hamersley/structures.geojson create mode 100644 map2loop/_datasets/geodata_files/load_map2loop_data.py create mode 100644 tests/project/test_thickness_calculations.py diff --git a/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif b/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif new file mode 100644 index 0000000000000000000000000000000000000000..a9ba843ebb8ff37ef232f9f26cbed3d5e2c1cdd4 GIT binary patch literal 161316 zcma&uOVIzxbsqG7|1)|m%d%|8c5D*k%=MkojHHq0rnyPeqZw(eyKPCfY+WqLmM?Lz zU1gg%!Gtz3b`_OkL9xst3zk$7SFwRqQN4gF7O7$Z3t-J6Koaf{AOW7wc~8ImJeFig z9nR^~r*G#xPxtrt{>S>*$DSB(A7gyq7+3d=t62YWW_r?FNzxmEVewF`~UuvAN~LL|9;|~&t}9w zePE3L=+!a))>p>(+`pVz{`MIE^?xwNzw=*?@!S7oj8}f>YTW<))%g3LyBh!2Z(WTq z{hL?gkw3l~|L{M(8vouuz8b&x-S@^D@3}YL`H6euKmXNxAm2|7(5k{y+YsA4t&E+yD5F zuE!6I>x5j5f8*hIz5VYdSNZ?msr?`R`u(Nf{qULZt@_P3UVHJ`2cCN1Q*XZZz+eB3 zU;oAf&%OWm%J+L?y!V;+J^TKrUwHbNXPC9uUGvDqxSFbU} z#kNjqb7XJpLd-wEH~t@tWH0ldi~NPy(fdatfALn&2Qu!#_#cY=^S5z3aVvYBiLv(` z|IRr3UXg9yKNoF{<7<0JQ{}ouh+-=UnBo#WTYK_%*eu_d$F%#2j{ED zt?T&sn@2O;+V~Z0$zgFRxWm8V66~d~>WoA2Z|!LI;c>L0r>(;VD#89c9Wamgh<1cSAQ;C;e- z1RwP8h}@fhslV|gcCBZA^En5G6qKExX5@_UN(veEW=zHqTVY=)n)S?rL`^JO<+nCi(xj@ZtY>J&#HJ;lTKR zULTWZuneqnOxF^`|I0S^Nrqzy@=OOW@C99 zBj@Hx9_4ukLvX3)q|TmtRNcajv!=1^5`Jgz`xYkUN{wq=@>IFX8Z$n3eBo5?_&UGF zP3wxM8;_eEG3Q;Zy}|{ou+3{dcz7^=b3PIc!wrBpFGg|iS}&GK5b_bN6fb_+B>#(tz)f-{SI*# zZGPvUk#(W(;^SjG+ld?TjcyxrgkS7syL=tv>?>ziPjBjoUhX0O>x_lL;I=RZ!;SCt zPr?bj$lX6;5B$jcG5+^kZm_)}_^|$2?DX&OVEx~TiL7vB!1Zp$(w<@sl{eToO8gHHvzWci!Zf@nLGT*5B!tFt_#`hj9unYXX9Zn zGBd|i2X)mKoXMm7&Bmg7SFP+Ta}4o^3(4_R2kZAdcXPpsc{9eD&Y0z$2p80>zJVT1 zf6E9@#>4Tay<+bNBi<8dO>MWmt7{AY&U|=<)9#HOU1zgLXNWHT7#o?{XXV(QoasW& zUPt@t?8e}kJ=k;F+gba}VurJdi>yfPk+#-}yBM?eMZ}Axm$q|7Z+1i<(dIugVw;y= zKYzuZcFtY7#RvO7xe@DbhdZ2T{Nl+7hU@$3e-6HVLnW@hqi`c_Z$|ZpALlJ8zJw#| zj14cmC58L;*SA&X!V$9LKm3@%{SFUmeeZ)caRE==@3E&lp6163{_Gvj2Rm9V)Bt{A zV9J}b%TxT`EBqKoa49ljvoXEoQ=N^Et**xM!zx^D>&UTr;m6qM8Y|~rizz0tGgA1< zJjN{jvH7R@@%LeO8<3)o$sxo4eQay*ZUHF@!`WHI1ua??z5+v@za|?;5Pl* zG`ZslZiE+AFZhIgcR;>FMt?U9xk#?6zKQWZ;0R8@GknT()x=oe9P->XqUCZ#%W=(> zdG6MH8sWsokN9V_IoK;4sP7wm!JEV{e4r!6r?l&?ruD%)jwCmAUie5|3ODes z#>qj|Cov12+a zrgYjnZR?X2yutNsZu`Bl(=NV09Q(mr8zv{th_`?Db>=#o?>l?kG+$)&ew?)=`x!0vx2zw1WF&5f+dcE^hM9<00rzK47Z6-M3l{kvh|g72sQAriZ=A3hWhvl@8f49nf=EfECo^|S5EL0YGyEu=Uq$!(;q8F?5$ySGJlTG?M0Vn5 zbE!Cj5BaWw(E+D<1LSMSLFzcz>KClY1MItZ2MqOnD0d5OKEc?b^yznl=|F__Tvld6Ye`O5L^DVhM z__R+Ljg0oK_(=Jq`7irseA^f?Cr*t0ojhgTlNW1_UUL~I7S_EHco2LQwqYC(U>uhJ z`?UXYbYfTRdNZ0MzN@N@J8WZpYZ>3R_ow*MoT)aS-z3(>i@XOV;l+r(Xm80?bZpvN z!NwWyg8kyd2gP>Pe^0YQN&2(XgWC;>=^-9id0J zCm)XT8;4VwtLB9nZ8$QYd9toG3Uf4WwbcGnw@Fev^&_i=U(8Os1m1%|Jb)=!gvtF_ z+7CtWB6ssle9hVCx3@{MFJeD+PW$Zk(fakR=(4rNwEy%~4q@&soEQ%#KJVJj-teRL zm^~H8od?&QBYo5U#hOE3uvzsI!@iK6{g1SdW;@er`4h3?stLV@ckKg)hFH;0=bG1Mpoo48wxl%E!rXe8$XZ zc!gu}=Gf*jj@CzTuz83R<6tLt&2KE*`jJf#yu*%2C!E z*37(eau?fnapE5ZYyU9#ixd~&|G$g$dr-V^zk35<7^dCr!Dsz$I5_p5@cUMR=YxB9 zJzl|ne025sz3sd0_)om~`Oi03-jG_$oVak6^IW_w-jB_X8`qIw)NhEAw!IrL?VHMP z^U=S<@j(uzyvd^+t9x*-@MhvkF=+?U_NWqI@W^yVEyRgPv+PWcJbt! za6*k&_Hk;hUNEDMtM^%$Q&%`?9H})d6`s^ST$oQpo{Z$(fQf^Japrec>-Bl>^jkPl zdlA!O%%$MajE`)R`C)G3K)+XhPt5Fh!@9ja98I#X!n*S`FT~leH^cenIjgpqp53FGF#3j+JS#_AYx z?1>Zl+4vMWetpB*ElZ!dn}?(EWqtM8Bzt3*bZvL=u_AD@;El!&*a-&LB02Pf*cFRb==Phs4*5zLGCR(KD>lX@F6 zrg-JsC;h&GiVNNvVqEJ9+c2KHe~7aVZEXDB4DE%h%?WP=pZ5Yr2mS<;JNX{T_ex&n z7H$i>88`JO4%enOKHwfc(Atree!Rn*;toDo1LkS%^i`X$*D(KZ*Y^E94))X*1|o&C zwAK9JrS43;2ℜ>~F(~nYh9g>_mohw!n3*@fJVdYJs(3Pb9wGv7sov0GnP(&ts4yconB+oSMyva z7S>@l_w|BlHr&Fz-|E3T+{1ryp})UyLcH-}$w(VN%x6r^$0yDk(X!Idt~VlU?W|pV zXnw5bM%6V~)1L64_QBdW-<#C{+?yf6pJoV$g6+B5cOIlkIUk28LE zzgT_ZPpmz{7OZW1^=>^9JF*^)*waH9quuY@urGUWe6Jo~^IWWJ-}_QBzdY>bmGiC4 zVeOhDvBO;Sg@LQSfcd|FbJ8}HM?>sn%x%15f%Q$ltAKdGU zz_KZ|Azhu4w7lk>x>Pq$x0hHPXDqNN#C?)`fC38tfgioe6#mi}!|Vx23pdoJr)XGcbBKJDpz89&22 zzvrFTT6M0>Wj}ZG*q1TU<&S;l8SUdI@LwG0zoVY^z=`gweq14kH~l-Keh08|!#7ZL zeQ$XKuCm6#Xs`#H8*XE7e)xplV1Kk2!@r|P^ucp|3mJEvc$kKD(sAOKe(S)yZz^qb z@mVh-#%~IJv*-5>rr#R1PPBFSCm(G-??d>212b6O-jaR;3hUYtTo6<50FL27#|^w_ z`&)71?ze^72XnK(ZD#DkLh7~&>_k@T4_CAA-NFTY9KPrmmoe~Cu@6N*9AB^rSLUcU z#`}U(?sxNBQ=h%SOJv1wJ~qACiJ3=RqeWkh&wlWt1Q)V?{oeMD^S$%xp(c)o`Y))%f^B~DDnz<6P_H7-Zop2%hod(fF)XA;R+vOdk=?cs_GvF9 z_6~361GlkfUq_!k(KQygBFkDNJg&K&(b;<6;@3HcGqr!y&Z57yadq$eK7w<9Gxbg6 z&S$&xy$eLU-wEGM)#vxO@A|w61BT%<_%5HZFdj@6=B}e7?&=vm*ax#$X*VD6W2cQ9 za6WJ*BKF+nJGfnNj05__M^4;^b9hh8Ce{kB34BjJZ%NO&63ch6@4E^|CJx|H+spTn zJ3j5gIUK_^etZi~@K=9gybn|CTcmh_8~BuX??myyH`KAuTao&mnhv(wlg4<}w(S8M z5gPV(3;X!t&3r4eTc7s0X!Gem+B&P}^&7#ziOh%M3pVS{4z5@53a8$NS~Kge-h;9G z%+Y(~n_^(wJlUH)91YiO;>`F{?~XCewQY`w{n;y7#5i-c@R_6HTHp1#<9++|?`wP* z2jjkf&hK9K;fwfVh-x`sbG2VckIo$cA_5}Z#W9g4QgL~K=upgXG_MgFt-F&E8 z1@Fd^9l?p&+`)ydKW%ff7oWB`e287|P4mH9am06w+K#U8Y-|)hV4&r)&TIlJg~#ZF zn-f2bi+@Beea7*@j~Hz>>`dBR!K3$JJ{tSM=*Z4HQFnIV--X@84YB5nn0KG~&)m^9 zXT}Zhg>}zb&KkSU-+trGg-7JfJI!NUYjcd)^zNLkv}-;(QtfEt>b{3--#h1ScSpn2 zRr-S~_=8RTa9*)AZoqzXLOdA}_k8(-H+U|*UE~2-)y-J zreS>H#KF71_8%WUjQGgB-~=w1Z?)9C8DE^R-gzsc@uTXSz0g&6wePxDZL_D*^`<90 z(vjVwUA}`;7-RECZ{IlXc{)BKz9jt%7Twoy{9xqa*uI~9)9`29zQAnFneoFK@mHVN zjGc)!uQdia=V`4yTh@iWV{6m1MSDa__k25T!bjIS*#}MdmsnW3PE7Ez;3neRWW#Lm zQ<#ApID^-||3`Q**!}yV{Atg`z%YT;owha3oOKUpUigDeSX|<>{x&9S6{g`IW@&3j zhIR{k;YasXOxoi4vkId|Rfcmvn)2=j28@jLop8BXiFMt|@rb_L@V z6U2X2dNZtr4>UeR&$bt?Hb<)FUHj3PpsVKE z@Z9Zr+HeXZksaUG#sydnehb5m8)L=sRljc?-$@Up9ZvXeTKGT`V?1q6_KXZ#|KUV9 zRQ=Y7%*c3)t-afK`c}7(-+9Ps)1!U#k%|%5eRSC{1q*O`9Uly)y@I2G8w7siA21h; z`@MhUkI)B?cNi6i1IaN=kK}N{Y3f{9Odm{7 zbGXYRQ+#~50RMO(W*gt}`bPIH<6Fe6#E>nv`C(q`k~{nG0!PA&!;gU{_StnW9B03< zSC|YgSGP+yUSamgYP-f5*YVn0UvORDI=+>H@A|z9-|b(~VlHJT)_YR#i*bn`iK#vG ze&tuLVVWLoSKec<_BmhmM{m9hy50Myy}>2u7y6F?fNUy3f=iHBdKq zCZn7LLOMn1;UYMsNYMaLs)xKL_i8v4_&@K&@GfW*_>Sz@6Q-{tN1G?@1-k@}J6=rrza1y^8J9UKUfUV$ zKib^2-)J}-xDNZiU+BbnD~R}=_8mX;nFs#84e%)k5&GDLP1si-*i4_;lKAn$y&{*! zOuGAv3*ytid)yQg8QLw2Rs-`yYMtf+9!%>t7jS|UC$gv2xEZOt+QTu-O%nXUA)M}L zGGoJQVYd6lk-{px_V^K>F%{eR#)oab$TW|4;3i`ph|YHv{EHc}@qr%E_4g|MncE)W z)!u9WeFpYEK4%yYk z+C%1mNih|t-BRDCG?Bjsn(;FAkFJ7EE zhIy@J&wYl~XKv~UBH1dgNOc?RT<^_dZSp zC-#BE&avWS!!zu&3)lGVeB$({57xyk>xs|#rn6hyS@|Ny)cs)1&XaWt?~TpEWOBY> zv-Ohy;L{#qxg_=`S!a>hb%yBCGNTFq<};^yL@)D1?{2f#g;-DB4;E;$BU7z|x7FCL zdmIno_<|3x%(vqk-ACgAPMBlkfO|gvBa0pX7K=;TI05^Q#(pAW=? z2cz@))-EjS3nuG5$UE_8abkNzGJZwi8}8trJzGIeT>XOif_Gldmb&@*<$mR zPJZ?M317GOg&yjlEuP(C9rnKP4?a1HsDqrUgSt=nfz`-{TLNQ|!vA&rk#EL{>0QX1 zFuWJui3q;b{U1KyM2+kDtTSUzI1DE?fo1%3FWXOJcH39@Yk%%pcRFm(#BX~e%_;cS zHzM#oaz=88IrFx7N4E2tKQTDOXWTTub&{V;?82lv!GrqCw;ZZd>GYp^!79JDF+;9< zz6Jm6$d>=eVn@n<@E#5OBjf2wM`{f*`n!GBvZvWKuiC438v~$rr zdY>G&7RN`gw&~ULu+5`g^I7Yx6U|?J?CzWF3*e{jlIJjtG6y2b?8;+<#1 zHEzY$CiNCNC%bVE`-{&w+{ql32m7!-4D!Ql^p-DsNWN$GBZqYDtueCW+p*QL;rX|MFxK6+0pzG3aNADHfUVZv<$ZZ{3D z-Da=0XY1+HMu(jnwAFVy3%f}xPufByBxHz1E(|#j%Z1*tidLLG>?7m;& z0Ko*t8OCRZd*52UO9UW{I z#)H!h$M71NB<+&KEU}UDKa_Ux?#}luG}vll&Xye?S&yWTG#@4|M9j643$nAXvp4&# zJ?9M0;hc1x=|Yd#=d5DbM<0KUIpaHKX?HA}SWkX-M4L?(fsMvL4fn+XIBPDz>WCk% z7Y*CNdI>w&UlCjpQ<65nn3WhZ(pTS3Y~M-dwI)7fz3GmogX6-D{K07M=cN|vC1=5= znBo2w3+wh9P8Vmoe;o{V%<6j{?&SB(ZLaCP@n*Oe4o`5&oHQR!bl%`$ygRY)kA82) zz9)T8Mjngrk+kjAo*#^RR z7YCyCZ|f#z+Oxf9kBemABf8EFm(DLAYI9*%j`$*C2%ng;qt6(6w11kvWyfc|il-xd zyZbAy_cVjY8En#Z?>0^gzj+(H4>;jlAJ*%RXTx=b9~X)fX`5$>i*Mh%jT2iU*4T)# zHLvxu#=wW*&mGO)!Kr+~?aJQ$tzxP}@a%qdU$0K+pG_Z3 zm!0+{H}C<*ix1|4dzg>E_;O!#+Gos8zZh!`9E!m946eNu@Ok#Q`%d4%iJDYi@S^cu z-#{6MJ9tp@;1e4!a{kr1r6=LT3H(Sbyc<_6WrP9+wRGJ8@vzoMg(W@ z3k!uK7{LSemuG9X)cW?{XB+lsU7|L|;gY%FKit^(ku~R!#f~iN@+B`bd0BYVIbt7t zFZfQsJ;Cb4jreBpj~DByNO&Q)-ng0v7qsyK_M`Db%;1Oj`0cOm|6`x|qnGpJKr~sg z>s*b$-58XcIy0T~%fpT=cJiWTggxo_>8;&yVztf1CTHGte9?SIcI-)TBATp7aU>X? z!DsORKCf>DhF1ipt3UQk-+o7=<3`4L4_1pfF+*JJMS70I34MoGD{F7!EeaQKV&G-O zeqnZH&$aK=t9T)|5jl1S_j=*E^8)Mceq(WhEpD4HV|HYyWooO=17>np*Eo2$UVLh9 z-C=CzG2eMt)C4XHH{xKze6RpF!GQXYjIVmBQ|6g!6`_eb?&#{XmNC7@X`k?9udS^K zqxQB)_tlxiw9E_pPx$OFXM^$a$gRxebv>FnlM7OO5d-_UV9n^VqbECS+t;#A@2C7} z?~6Uymvihsmwc|s$!q0DURvZ@e&mFfXE~zFf7<$5#ELPNEthQi$e&v0?4fn-$KEoA z?T&_9SYDCBY_L4|f_3^}UVmYoj==m(|4v-Rq|Hz2cLDyuynbhfqL^{bkxNkmOxdFKvymdcN|Hv)!fB5#?aFr1ne9$**l%%$Hr zxlR3G19pt5HQecVA;#UF_?dBVuV3w9#(exRuus0t9U0omdF`cr+Eq96Lj$O65~wP8_5Tb zuxDiT+I3cYIBo0q-k0^XTUTC_19{l;&}Wx}5;-E;(PX6_C2i|hqtj3GRok5UwR`T( zcVVBkk6!w+AF^BQbKpcU3+sjFgWKrB`Bh@l5Bq~$-^S56LBqMe!g#RlJFLEg@;x$q zcewY{zaz%nt%Wa`A^@BR2*)|DZhMLJNcYq*+hNp zk)%(5?3j% z`-q&a&X;`38$H?T6FGjqiq{tz#3ln z-}qNJvF}C4#*M;%`p0GL+x|a4E-cuF>EN=y^Su}0gRwKRGQPwd-ihXfvGqoT6Ll{K zt93WsBu*{eXR$}>qzzZ_OGffG*E(@EPYnYFi+ZyT|y}EsDan>Hmhw+8`yc;v?;D!4G|8S2UH@C9w zGiw@GYo@Ih^15>lvhc#(q}MKOFUiM(yVeJ%Bl%jVCUO^%*U@=BT5jc7Jm1o8;XC$b zM^%m$A3yM@aDJV31dmGhw~sp> zF5#!X#nWH!15QMC+TJKq??m`8h_@wUH%`H3a(n8qVyhGUZ2Nbf#;*LV*b^@4jD_uy zwzvr+sr67hHBEcOUwJ*_&VGB&X-;{iu5BA2aa?4gg2=+i!N?A5WyuU++3;}&bP`PpRC_J_aGWyAJ$YLsN z(S$EC`rY%mFpu!%4OsY;IlMCm)39poW&ioMnd$dN(AM+L;NJ=-cE;Bm;ho60R&glz zwR?Nrq|Y68YD}jdg}I!eFbVgtNyBLbC$>89!9n;?e9HJ08y>b?W`ENjd(0h=_&cx8 zQTY>ROy-`uI0_> zkKX$Cm(%y9Zod+n|Kkz-2v62~EVOd_~=&AU<$4{q? zf7z$s;Uj(9{E=EGXL7EcaohPKhYu_BE*Oh!0&{AWJkpiR&X>HM+{q&ubmxCx>e$-H zHxoyUIl5|)bvD2CTC7QGeS7IW?fA${d)phiFa43?0j+&6{t*c$c5Lmf?`^ko7oT=v z`Z_vN_x^WfT<&_9v`-k_Y2!fg0R9t;7c+b?#^191j_~)+8U7eke2B)0`n#u^rMB*- zmHf-~aE|0?Mew1d?Va`2M9tN$>UtAf-Ba_SmU1DVcw*kDqqf3KOg<&jLkc-!i)KZ_=5R0pyAaNZ#Sfg|^VaNsBYba-oO3#>eWoUbVYQI=i2B02oQU0xV`GRmY!{9b zv(*j;9!dXWu_J0H4?~{Bh7ZQE<&|HK3ga*nS>)81ZePU(8!%F0ANZ9u%)9J6YvaWT zcHwt_Eb@iO&!qo@@qZ}#lZgu__KRu9S8u~l#`jYCUQYWXk*`Mb9kss_`E=rD`XlSL z*l$MSpXBoqYrGJhJHQ)I_q;v+XxhDZXBs5Fku$jOXWj~YSjiJE_%{*%9&+9aF}%n>rM-^s+^oa)U8=8c2@ z3IB=H7LOP8{e=_ZPT@MdkWY2Qhy8f$s)5k&$?Pg@1TSth?VFOWk3|cz!-(;3K@nx7u&^jt9OyM({O)GuRrz)_Nr| zABoPl5-C2w?uTN#^IwWidxsysr&jFsV%jf9z8ncp)*F#<%h*ZJ_+N|t3z1)r{nhk; zB|5wqS!oIyTc;MaGc|Yp6Mdxp29(9H$QtoSXg+w~k$MBZGk)039S_U%I`X#k(`kE4Ms(f(9qTuS-wECg+TU7N_&{*t z^iT1LDeibrzAtvZpPWhFXKJzBOX{X(YLMJ7=g67VQCmK6;mDK=IZ6y{!@-KEp)q`7 zmKfuj561J?IO`-HP6*7y2<*bGZ~ys`*ssO^;l#v0UykG+U+(gV-^=?;(O*c+C!=49 zd@S;*w0|>wUyL?K<{Q4>U&z?k)BpUfUEf-m*Rx_v^`EJiKx=C!`~Bnby_~V(fct;^mGu7$k&nm5gK%O$6UqED`1jku?}C9JX_xQC_#(Ks#APny z_fNMrPu9Va5gzz98`0OlC$9h*{#{`iyaxsvz+blqJEbo2hLx7iof!S z51B_!)xlv@Q(xg?XBTI zvV(a%@Lm*m=y2e0rTm#^@kRU{c7+p_-{g9xChBD0Gc`H2-054S&se#T^K)kBQ{TjF z-!6G?M()Rv_J9F#@}^!t6kmibuhow?!GXWSjGv1H+w~oX8|DjEcjI-t!#@>YFjv13 z;QfP%|4?+kbLQ6~>92op204n>yf8mbycqw>k#M0n z`O#=&zY+c0>HqoIeBp?1DBK)>Exuok{TtE0mUi}0^CquyJabN*Ad^m8zN-)3Blxi+ zm2dewd1UMRk?7=8zH5%OVQj!;@+qfVextSd#f`)mTjP7oq|FuCblQC7Z(aWMP5qf` zTPL=8t;MI!FQ)pU*+<5iS6uAXQv142+y9;=UW|;%o8WzzSD7n%<4IzCN8wCyBG{k! zknbG78Q>Wo4ku>py8oLKc;TJ!7U0Dqv3JHzzRWSgE#FT&_B5|O-o%c;@pd*^jnq%u zd16;BV$YKccIs2_3{IINbzG_6P;dD#_S|3Yu;zrkj^Lu^e0SnrOkD8gyQjX7o=W@m z_+O2{YVP*>)(^f%uvx#8^~FD68a}@o|7+1R@h`=nSnmn!uEf^256-=r{&2wW4*&ju zcgy@)$2;M>3KzurJzc*a@b4Gn!-+4)_p!7;5&i3tzxu{_;1AON8(Gxi|HCda$|E4h_xad-iLBWsb} zQfu?~IJ)N0ZvTm~mbpgH5Bp?A)bF(KbjKRQXT15(8p~R}pAlU+5B|Lm#f$r5cYCt0 zGY`4{Hg@D4*f0;f-m7{a0r5^0C*rHV@Bt5Ce+Ba+c&DfF#zxFlebG3v660^F z@GJlJ=^XN3Igh{2CI{y%ecl~Cb4E2?YW7&#Pez`~m?sh+Ug#gHA{(g6+c9XJWtH{lV;dJ@!W;pNs#)k=*qJNBo@?CkAXs@2^CDA^qv| zEhQd5HvYXo5qBhff@*lmDOMkoY zw>P=Qi;9)w#B6m?<4DbE9AD2tiy{2xoY6CD?FhTHwzVR6^LKlRi_rQ;#$3uaFP}Bd zPhkB!qVop$J#pR#e&100zVyegetZbV7f!&ld;OiU? zUW5lYf*bXFB3$zZRzB^OeG?r~s~z8p&lz@~w{)Lx8IwG(#MkeD_eKY6{^nC}hnmY- z^I$e7)NN+I4G(JlWbEK`{z~Mpy)pjI9|mK;AOF`PpH1HfBQL}bZsFhGfM6eP{hfap z`?2Wor+)Y5&i7lQesg?0+SuS84;C&M^Hgj;??d#=-0uGQ#YpaWzaP96*21sxx%j@E z*guH=?X-V2@e$ut>$f65b34X2pgqBM<>kTX=qc`@?d`%H*aD;8V$qY z#xzI9jFZdcU;eZ!Mt;2!;RNm8k>ho8j9;05W}V_w@57$#rD|=h-lx3{{ubC)_ZdBC z^B$c&{3&1h)`>C3e(7G19`*qD;lqgdcB=N(ZF__dxG=(*dMkqY8Em`vVST`NMB8r+ zF?cb;2iy@Wj=+4yhePy?;L{ARM*8q;eebR8KNlTwzf|3_?^6?bIp=mh*e-s=cAlNs zO*@;KJrWxiB0Kj!jx2rZs7{fUb=cAqZYyRkr%nfy#TF*~^RJ8C|j zSbUJXNZ~X&(uTddU(`VUwat~h7VgrP?-@>rHFwp<_{@)68}85Ct@+h&*#|K$GSY93 z!ZU1GFJi4b(T?al{l}j1ZTzQ?R>c7t?*mLf7>cga_bwa#GV_wb>}3{ z>QVVrF`yT7ENr$VcWVKKx)}f9Q6Oscv#;OlqJWc(k97|K-Rp#P^pY zzZ>6gM*l?Q#rT6ecwc!J28_Qq@>F~uN;~+iZ>X%lpG-UcHDiAy5)Lh~>6?+d$HTAU z+8fb7pT1At#`6v1em3%r^nE7nH)CfWe`~F8rSM|?OKE>0`eW&fe`Y^JE^cB+eEV!z zOm4PZ=B#g(?fm+a17nS=_aeS29u8qiKVNbtciw?Pllc6%Zk5l(E%WgaW5X}`Rnyu} zVrEONl|929ez0^Ll=S%#WYxaKZX=Q%0vj=Mp(lInSF=g}hoFiwGle=#v_{R$p zo{R_^2fQQRfkj6K8$Vz>7>4h9N8-neLEh1J`os}$$0FgvY}u{r_e6NHGavD96mmL( zS-&m(&B>irxyOm@eZ%#sh1xunxgU!!c`iJQk)z~yrElLvq7Rq6Lp66evD7oMQx4TV z^QlGMjlpewAHi5KIlq*4bp72wyqG^1c`C%hFa+?ub&_sPg_CiWMjKNZP3{$}JifxmD0X3}1Xn;%dASJVFW$YP}0{K7CS=6zTC?5UgeN9MqX!h6U4wnBm62f$&CqT}ZtF z>6`D2KT>=W%l_`jyCQfIPWW%0YBTHWgk`F)YzTxcSpS~YMvPNpWc~pVr32e?)vf3NakL@ll8)p{a4cd7t@a3 zzZA*(^>&0a##y^~a1+~_&hT&q59GkvE+yyN)(-C0qtOu@SlRn}Fzth#j4>9TH%!Mb zk9DWW<*7sRDfdh5B67aco|$WBt;%J_+uI;F>F@Kqe|FlNKY3ZtN95f?BeD1em$0+tQ|{$ZPJg&HJO2IsiPguiF4@bJLwL^`mCq;JmviH>wefO`aj$$J zzU<3gffEC-?72BH?Za7GcJp9Hv(NtRbtQ&WtaHU4mttOLj1(8}A=uv0iw)y%PYhpV z()ZGb8?jgV`B!B07~}Zy!nYNS<4w(zw(q7LUU)aoHxzE*13hrUnDC!b01Irgu_{(9`+iT>@hSLCZ{eQH_1o7|oIWXOGTxa6GHpZto^S8HY;>VbbFVoiC}t~W9{ zS;>`rR1WaumBb|X^0ICs8E?<_Q+rpZ2z(QJ+mQ(`_S&+w(?7)Uwaw3WCvp>UpO47? zj*PpGMDxKjypP}>4<r1+8f%)6|?4lleLM`rkf8#^+? ziQ)y!C$E)vJWx|-kZU|hzwfK!29Bg2JM}Bhq!!!RoSKGx2{i)klPw`n} z!;CxW`N&5j&twe2hhWJ4zu$=dbjAda^}FKpu|FGmIei)D{vWBO_`+SVjT^;}Xf-ZQ zB+mO&m^QEb5$9spzlG1VvxeUk^TV+}8vmPV|5WVoVf}3UuSH<%vGhF>oxK-sQtzqe z@EuI<^y8#;-MKSohS`;KkJxhPPFeC7pD{DJz>P)ApSCXd;Vec%J^l0kAt`=~uf*Phxp z(w;=SrQ&1LyZg+!TMDx|eZuq%a?>@AzOI{zvp;N5s__cE;lZ zUGuSVfn=TiooPq3SJobU(Kz9)7Unkm`}|ja3e=@v+&`O*faJAlUGKnWqrV*a>BN0L@t=sinK)xo z>$>-Pj5^m?^WLQYv9xoy!-x3!M u`9Q?|`E=UPCFX@l`u8i5mu_PcJXSd3UBZ!R zZdlKpaEB9he)V=Pd5qtETf7LaoVl=1JAZOf_`!v=-6h7lCn|@@>y)pqM~zL)5+|?n zo^|x=lj9LRt(|#_Uutp_fq&;C$pJp&L*-dc+y~FcpEJ9M>i$UH%rPQrG}Nhe;W}qs zk%M!Z@aZo*ZDTim`lGeYSAFKajvdUFX2X9pERW!Hwh#XA-hss604{901rLln^Hn?8 z=c~IP?$gE(vT-6j@ZEIyu$vRUpB8RJ7YEc%o|F5+b~rP?=e9kYBQyOtQT0#m)TTI) z{zcT)99>JeQ1=Bl$y;H`9UJ`nHv#{h)BbGiU=)@nT*2E-$NEA?(<-WiVI#&{tT&g`Fz&c6Jf zuYZH^u9)v8I=F$EdLv*V=PKObI3DEemBXALUfmsq{j}?j4Sp-vaGZX*p5ijj9VMS~ zUBCCz<{N2GI|SS%2rj@no8Ul6c;Ia~ z?FHW%C%(o+_vA6+rw!wQCB{`7kztWT49_z@ly-V?u)Z{yUW@~tKj^$=72vDJIJ zubf}ba=-1=W_LVph^ZPi7Tjy%M` ztkXUmproShW`p}hsv3x{L%@dqkquPym^RM*R_~_z;nB?^?zsa@wRE|%r)FdK~O!27? zUA0sbIFG0cAMR{*!x?v$J5i0)D)(q%MXuaMFT@wjt)GnK&R)TN{mu<8VRWfQYT~Vj zPye09csjn9A~*3z2Ho!g+>a*{n|i9N`qrJEy1O4?x!$DrM`wO-!1`S5tT%8hJn(K5 zS3cbS52hX4ch_y-Qn;Y?5&4qWY?(57G9OK1=Q8*563&&}TA!63s zx~>2EHV(#(+xlra%X?rRoS@5}K0H|0xBcfkX{Ud7?9ABmC&zH@UK`Dctv+fMU4FW2 zRI%#PqOMb)7&T9Q>RUo>BF^rc1-|9O9XrDTzn%F;`o?Q%!(ME4+o{7!{;D3ahnlHZ zxZ-|MHzIEEX?LGEf*aPVyAT#0i$5G0PsI)|{5}|;iiDf>_uTAf{ZwLp_EzdQ%Z%^I z#MskK?ChiFv_{w0`gr2rt#1){?|T3iw%p2RaTa8n>QmpoyVPu@Z4Nb( zhq}ujOKfbpulpW8-<@`_vpyX8c^;U zJqM16g$Z}z&N?&e)qVe5{2z?(^U+_3elzlF>`x^o`|^hHt&c>WjW7G2H}Pd2``zYN zV|&VagFoDv-b0wg3wwmk-hBGtF!&`y4%pELx3~bya6QCC#0*&GlOOT${Rl zt;cnI=CyvttA{&lCbx$VYF2lS9IIKh8pu1WtA*HYTxz9ewV%|~J5gis<>~Z)IQsR- zGZ}M}cCbD_5c|Cu^F(x{YVu_CYmw*E-?`sv>P|Yf4Zd)5rM~LSFJ?tX*J;z8XSv3W z$~WCHpLe(?9ql`q`z8H)=?m&%W$KZP|oBF~yzaS+GGB@nO{mT8|ju~<% zS9l@U@SPlv*y>NzhQPqVguGT9PME9nAvcu=xomEZ>`m=p%sHKTitjvDzB&)^z7t1g z?Ae;X#JuevXFhYvoqX~|!JUw(ecKRicOz0kH{u+LEtH8p7JO+FnoE} z$1Yq)7Z<{Z5k9O4UKBUtTaihJ3j|*VE@Zxv*h@W9BXwEs8#s&R=bLnDg#(3u97sK9 zL|yS>MygN!j!)g>CK&g((ed8csaO5YH0R!GleN@UJ>{y__4Y^LX9hp8Uw2?MJeAld zzj2XGn+G-`BejM@HQTM(aKXP40~7kRr+sF9Sl*AM{X+Ds(I1KaaOV4Z>vHRrRIQ5Fp z*`0-q#^|(<$Kp%AeG@vD+&XK;IB&$cM}%K)Rs@#k!K=L=c?&0uxr=XHFZqj1I=+(j zt<1Ayn{RfGSLUoSa^GT%{jcO@bPn9z6HbF!z71cI!dra4ecbaqayYTHgZlyV(f&=( zzxC0@53#s#=1QLD$u%s)yPT(92y_;`{ooJzk2=xfc9C6m49%QIhjH zYhg>R<_4sXD z9R}>G2W%S`DITb?b%KHNoj0TPW&MpkoS=(inRi}dJ$QGY$uq9h+Bjf+d#0Nc>Rk1> ziSMaMFtuNb{@|_lJG*{M{PbL$T#CeMNc*j z<9$XLS5xEYGfpglfAQ=Usd4U$+#B^i;KpMSSjZjXjU8vKb$T2uz#Yui`5Kp7-sJ3H z|2lTwf-SG|5z&E;%goph+ki=**5G9b6@Vk_`?spF-OFl%l#NkPy0G{ z*Glc|x9-iHqiPQWiQnNu@dqa&_~EP@Hq^ve_kZez$Lrm(pN~8pe>mb>%70r@^-QhR z)EFG{evF&MW?uW8a+))#r8}>3)j8M33;0(B9-U&@Xnve{{8b%r;J*yjRg% zULQ;BP3-ta$6t=A`ed%cU+UwWh4-Al?ug_~&S1X2nSyui!t`}wwP7D$?n}GHx6?=; zj*P_BSiERH$bZeFUU(MFRUKi(ed8>T#)liZlM5&EqZaUa_@M55*)ME5$AWEK2`{F( z#W)vy6YZ959`R|{y`UX?s<$yc&YII2a3MGLWIcPOaRAP7AoUn(9h-O$3j2x0gB3lE zW2etpI5AEQ)eh$U_8A{Y?Ca65#UB|Ti~q;sOUzPF>!{z;v7d=N5!;;Bwnvzji=1Pp zmRl_&-hj%FI<(ZC7TZ0he>HD*@}VZqEgxzikL*DwH{MO>bQcs(;qJ-UH_^e~%6Up> zueEP`S7UpRt~022;y0f$&e;7hJLISNv~q4T%@J9VZJvywwI|7V^A&#NG;4TcXKeH9 zuNZSjjPY+&{`&?0?V7)N)H-VGj(Q>bJ-1_>f5Odme8GL;{a$Qx|E;g|)omXh$hG|9 zgLh)HMAT{U%OreFwSfpZdjb{|ankcZfHW_5zKo3x*ZekwZLSgE7Exu19X;Z|+k)y_H6 z9@??%ZH#S9)jVe#1XghXPWs%HtN82u`o)>6<5%a>dNp6>x5lu?%ujFQ%^8{EN%Fj3 zkN-2VKN?oa!^NOb+*RJ<)Q_u`Mt5nsgJ1V`|-Q%9nG;KV*hWWoo$e?oH2V_PqaK6{dC4W75{tE|Guio>H%x86e(QD zWkeloE$!4|5;aXNhgzmiq~?yUy3y9smwM`Fi|1d)W*)k@*YmFE9l;gruy^d@hka+= zX`gIZh}eIfp>=Vj&w(4$8P2(4Z|BIlXUleTkFaj`#R(0QV!n{N#1sHF>oPLI%^eP zteLfE@1eM%jWhP~?yQr&d%OIb(0DfSv3>K^H(t)M!x49FaUkuHbGiq|bMa+-o#!o_ zaL&q4^uci9IrxTgd?@_Fctjpy9uH<@1&_E^d`s+3-xe$1I3bTX;hgr8{mu_$T=r(Y zgHvzWPW?vqIh`%BYK;@?UhI*+Xq@n7)VEb~>7K0mL=TvkTW7l1H_R1AzbiU*sCwmY zQ!^Y=m-^0Z$`x1vDo3nzzdv6ew=qlmUBl&Yj))`d4VOIaPJnzV2z|kARvoOaISYh7oKwDp&Cj%M`ieAM3U6&~Ov=NPz=TEZFp79O=> z_VL6$8y$Stf4`M;%y8SC>Nl!?qxXM9HC|6l_%WmXJ7jU;#k9R2nX`V21j8^5vy~S* zIkHY+IDG>b#F5w|y7-X2jg}S7XHL1@J*Rm`1n$jWZRduIh#b)H!bh)Quj~^8XYmi% zzZc2>&g>2+>Kp2x_5VhB+B1FYzWCpED{Oz8I&~?3=2jQD$ED&^Y;ongPJC=@(Tl!L zTMeTLo2_wb0QhW#}hVwTL;K|!j^8XTcC(oi~**BKgPGQy_;sJlUAmLI9)vyEI(xjd z)nnykB^UeE&o1V$i@Uq$Oa8XU+||80I}XB=D~5|%D_!iV&k9xiOHd~RM$42GHH=E$p@5LZ|7nVf)ac>>P)oB!TU-mRVw zPk1Ya9v`IZpK*;pnn&>Ba-R4&XG^bmIrrhS?mG8mpYG09JxW6#g+ebYy0nDaD#?9Jv|4(ESt><_1t z!B2G<9J^)5m0UmYB!~8+vAFPSNj#Xhlezk8Kf>~5jbtUhF_!+sTr%zX;B1aH<&;~T zWwpjx+w@u2nA#70ugLNEwC<&^vUSOooSmD@`R&E;`TQbqvUxGQhn>xhV{>El#>9~( zgAr|EI~*b@Kw5UzaJ`ToR-!BzUKecrc?pLxY; zZ!T*tSnb?{eS0bY*4n${+IMsBvBhI!vlpAO<*{wU_v~ZN<-TEmwT}5?3+0;=xNhIh zJ@|jWIUgkNCZDhUz1m?m%+0rReegQ2q7T}90p9wyE7ANrH zD0Yg`L>#?y1Rfl}fd{y7!gK=bD<2PTKCJE2%0E{B+m+v{??n=4%$e_x)`CUv7iT-d z>fAxudArlxvGeoUx$l2;=X2YRp7LX3vypKljTxKZ#kSAcI`+Yp5pkegamEXGaPGnR zN0r}9oSFXI*6%d#MPpu1>Qi2gy}nWTM-wsNYt_pglM{cuwr^JM{n~?F{(0psgUKIgER2WO8*hVo7!Hr{dC=Jr z#;@v=6Mi)w{If*PAeBeo{J@dc_04f}2ruvhH;D2rr}D!VdnWdW|CprQiu(@byZr()_-<*KGGg;mbI6z<{!3R8;obbwfNq+Di zA1vQ_Aso#c=*|zXHUC)>cKBS3gb8nq1w-{Od@x^r!3k~l3#+TMy34$2=&*ZszsvpH z*PYxqTd>iwW$gCY*xJdl?K5lbHDB7My1m%IJ8JfFFZs>6!`l4pGQ2G~)D{K@|L-=g z`w`f_-b@-ZIQ?>MU$5M}`MH|Af10f1?ZnvT9LZ_!UEb@d6McmJ&M?kyD^8s4Gx_0z z`o6fuxoVd$hP&;7M{`E=kJ=xr!x)>f3mbU{)i-uyL;XKk|3hUshj%>qmE@l!|8z?{ znKE6!u`hGT=E}5bw+_AY$DE}-@#1o>H0&SkORiVMSLn~#;p*N^GMoo-HC-G}h` zNci}EoPYrsI^pQICE@FikKPmWricq`^WY4ZhxbZyhX46_OnJd~^yG$cJa`WO;t)Tt zXHS|BZXX^mYR^~R8r}>rGQ8Pbm~YxJII)@TEY5Xw#*5E7_ZbH+XUFaCIQfGwA1fzp zLfDBd*=&5xHpXom!2tW5#G2bC*1m9}`(N%aPdJNjYndsz<$ zul6KtJ7;h-;Zn>`U~W}sL-GEAbsR7+9vuHTi5J?Zu3Z0& zGxp9O`f-Hp{4t!6LvZDl{Bhs|d1%k}J%8Y7|5G`cvp84cd~-&1zD{lp3oAcgTYe)a zR{kb1bZl8^a==!2JHs6eEEuE{F;ZUeHd^rj7vzH*BNv>ApYj18=Z6c{^VOLwKF(i! zNroF@+~=x?qv?Mw?Y%BH^hUz5;RC+a?rfLy-FFDT2MlY2Y1%y=8|VIPla1Kqtjw-c z*Jn&}+X@$Et@LG0>$D!5Onm76a@6uo(b-^6UXa(sWcL-5{qAAacDzW~BksT)y!!rF zjgu4c!ryYOA4#h>eq{^u2CHoI>`BI6=G!k@vMFB7x@^g&=Iy>^Y{ItQOjo?KH|{yx z)mUqockcP;KMIrZN?;YH$t!Vu%5W|h{J&{(kE=Xw)o1SAzsC>XaA)r!hs=9xb8gmt zl_S32$wTMPZ}WbN6XV15sf|A?FZzd`WTkH|yws14Px$-zE$M`>#nr{v;c0xHo^txg z|1000$%+p+v5Ji+*?f>ACQfcHT;gRy!|(~meDTuU7acv#zz<4^PDAqjO!Ib@1AG-0$TbyWikEt!*WEz(!*)wyS)y+2hk#`d(u= z#XikH)3=T6Cnn69iU)^tyitGrb(e|1#eUzkgS#+4Z`f!NNuPyii|9E=xL0n~Tc0Ut*89%v4 zay0Mwhhg;ZC+SnUxIa9B@tqHFMtSl84(u_*3w8Y1+?c-2mzQ(yx%hxrn-}uX%{}j@ zk@#@uh~dQ#bpGV#!5I(k@~V8P|4{P7joWgi2Lq3_C4&#;uyMf$Uz6?c+vo5#e*bN0 z67FzeaIpE{og_b;B#h$1V7GY5cYH$l*BRn(#@uIcoFsmig~F;RoO1 zlDCo=-1^tvWAKxx(dH*Oai+Cv+8?FuhsSB{tNvM|b!PqlCw%_BaGJ;$gLnLp zH*Q{}r%cNwcmJz-C9Vt~_So~z8#kBahR@){lf00(g4YR|)7@nDr3&f1)B-b?B0 zv9deR-S==Ium*5oVz@_`jKcqwr|ImkKHAo z!UUhuS8|4Vddgc57aD(7U-i$JG;R#G(l;mM2%MOA6Koa>PkbQZc5*{F_07na!-0Hs zba>fNV#fhm~xAw)3uh?jLKg9_ecjr#s$GP!+ z?*6sfzu3GN)!|w!a9{Z_!Ij~Ln2_zn`HBB;*WMa1KlAkCgZb>*yn}wdF{E)5ThhZF zeXTb}gaPxy_%4ZMsG z(}(ga_*ch^8)K)s*qgrd#P~Ws;K9ky;?&Lou)K;fd~}ieyi2c7(mztW_?Er>F3Pxz zKf||Jzr_32#ElC#;)1@}=jKElG;a9dOz!l!ZQ-t!S6mrPcaPE8M?2i#GB(VX>dNeT zvFjegeg``y?0nnx-0j+q_MZKIYh|%QJ;B9`Xp0xGzAsOFcjvcihqV{!=Sg;AJN&=o z%*~JC29Agg%`;BS#-)ij*?1)f(U(5yWb~f1UaL-?)t9K#H{a;hnXD~N;e#CGj8}3v zt8#tk-wKnsAWz(S=Zw$f1kSvgGvo%}8n5Js`9_x;?r(_rAV<9XmWUg2!T2m+jK3bL z=eOH8+Ae;*_2$L+EWh1;TKNjr2jBVYOjf?+JGj5GKmB+86|H^7H)s3|o3B6F?JA!i zmD!npuS85+*;RSHnf|1d1a4Db~RQ#51iRD zYt$wl;mXu$b$gnVoTPPd;pz;0Il1CR?fGlHUEjOu;@0HyG+s>ovpBKeQS+9nJRI5I z9rriId{4_G`#WNOHg*4;2^VnS=7D$8ogv7fcNC8EH8{!-hG!obG(_ts+cn0e%b33`(IQq*7%tt zjVn`5`+i=ZR{wT7KKQ2g);{D0n1L5%Sm5Vp>Dz~J0w2!NxrX2I0RGR~R`;4aZaWxr zvBwXj*(ZVJMTh<4H|XI+ZN{_VX|D0fNva=dqHXqP&&S%F;V!dp_c+`CaIWmd#%wmZ zD}GGQz-#w}&*I1h?{Z^zgyF$+F+pq~r`+rQ>=3r;YvX?AHh<|$AJ)}x&D}oZn}<(0 zWbV=47kQREZw?(VjyKYA;(B{aK9(~kcf8wtzWy7Z9w+SkmMA~W_l10sO#RLo`&-=i z#Bk((NBOS62X7!4mkSG#^If8xn&$m})HeQV(#-GL~r@61x^=n_+@q=^*emK~_v!1tf zPIp`>WlRuTc1y@Wz(wv9Zb3-7fWP!e%F1YiC1tOOti$#vI$$ za`2R^8_%}ZnYGk+ySdgjM&FqnY`=Xl`#)CioaZf@$L@ByV|H7~!3XRrCS^l$>A(qb zf)r!K3^=C`KH71gJ*Qru@zZ~g+ij;cD$`4!GQTtz7j90h&4rr}!-;40zuwryx4Agy zyXVds=R4Kk?F@HLxV3Kr<@;?D?%9iN=l5;pgq5vMeoC*jGT$!ts%^%`4g46N$Oo;# z)-zW<`;VXa#oESt?bUsj(Iq>*U)wvx6kGbg9YuRcIRi4V~;t_P1x*U zJ9g~8bALG8_A&l!e`_4{w&dFS9&g=?)NXxe znmze6IZ18GM|a`pgS|T6+{-<)1K*6j*nwS>BRjCu#ol62F&qXbM!jA=-@xNhnct3N ziS^<9z!$vWV|j(V!h^MQ!(mNaN>4dG7{z+1t+v*;#yEJ9feQsodIwyL{~I{0!sg z-Cq47_4E1Sd*|7>Hg52~=U(uuZLdB1m`mz2e%6Dr`>x%aJ=w(ljWuTSLwXs@7JD2! zvK1REpUK1>Z&qATXM4Wd`Pw*Kvxa>ydsm+MyG=itGo*2VOq+7&;Nz8yJ=lea8}3Hf zs5^=a?0bn%caGS(ng9IW4DMj@c&D-X>wK+p0=w&3lE38v`FZg zbNAK~6X%T(7UZEzUu#e7X#JV!RF=K0ZRkm*9`QR|GHZo;Tl{kQ^-Pn1vNoyR#lH;gzx ztic8utkgc^s;|n{hZ|=x$Napz68D1f`T0XQU5%X> zgCn?MTxVO&8;+>MxpiP4ww3Yc?xW2Wv+gx&v%fVCoJeN9z4r9gKX-EnciOf-AFC&G z*4nN_ojq4v5Mw45q{S7SSaITv4@3^X;FXrsU$6gp^*48!hF5KGHRfyScp+wc<9JKK zy}4&Xzsiy6+Z?%Yq`fYAB2L`<;GTRiYvNn=;bZteEZSb3ZT!-BF=^)HkFz*U_<4K}18|be88>DIH?VZ$WXD+J%vyOy8{`otwzR^y98|HWZxKZD||I}d}k6y{s z!xLjS7pCvd8Sc2b;Xa4^K6Dm#p`F_qE7Monz2JbK`H-y-{-BeUDD%<5kNlah7Ju=x zT#--sWxgf6nSA?s-{J>s!>;_1c=ycv|I6txIXU8a?P2?9+#x^2skJ#Vb=*kK`iwd8 z#+t->-d-<~a*&^u`!~GDr`116uk^Rl;eLgGf{Xq>-57tL=I=AvgdNW0+BR9)V|DMV zJF~?Fzv2LUZF{iES(#l9bJ?ab?80VjaF%4o7-v0aa3+1Y6es39^ybN|arYUk zuX(5PD|b1qha2hBUHE~G-GwIEov=R+h;tX6(1hPlzSzDRU*kbB?o1#2$VYtDTlCnz z#*M)8`|`*S@p+4$g}M?&;2_ znD9!we)(Yf*uh!xx4St%e$U^n_g0&8Kh}mbY}DPw1vZ$Na&zpVx%m#}Uiz1>Z$H;J z*h>#)b}Ss6z%XpVkvZYQ9p~?M{q2e0G1B)Km^7Ba>y1Oafa%Q%=Yb#CIcWI01qRJ~ zsNEcM_gP=&g}wg#oNwoa>9eQv+*~mZmeZ3rv^(R@A%{EZb1(bggSvV2Z6jx^>^|$^ z>D*UmzdHNa&K=@~ST|B1JPcQAgN5P2jfXUjjO3?F84i;1eb~5?c^~W;hzA!D8{@}? zAKnFtcMiYfz(vFLZaZ-W{&${OmGR@a@f4;G7;D_jgP+%Hd!BwHq2I6mVN!1J|HfQl z|M+hD8_D--`^n@NYx{kTt*;#M>%ab={`%8 z%bia#0VlG-5$})plFo|5V!`~(;oZuQm9zPYOWkp}U0EI8_-wG19|v3f$?ts3@A;We zr!Ra=8=QN4Yz*iVk7u4XbN$Tuj>)wRo?z(4oPK3kvo4HV2i_k#YvNqEVLj&=9^AaN zhjq>0>kiJX3D3^1eDCAT$xA-eHyk$CSabHg8FQDNt@7++KX<|tJaX5qoo#G}H*5;~ zVjvqoRIhFDudP1i5%pyFp}esmFOV}_3?{D5;GXV&&gT0_j&g_9y$|hh z-Z^IPIN*)vXKvnkt8pj0w$IV}W2^3Y*{6N4&ax6d;*%-ktaEn8@jvWuF2K%+ID7xD z1vX(BHsJzJ{4KkmJHrwT!R7sTT7FLno7RQP8`rS4d9m!@x}%lh%-T0+%(3r{M;Nu1 zz3_l`R%K_k=Y3v%_J?`>&PXTsS?QN|-u*Mi9Q<*Pn-9*g&&Rjy<{oURerq}7VCUp~ ztemj>_`mXs3wMmXD#HZ)^B;c^^;ImJw?eVCVSah;#!-E6X z!v@UHIQ3-utpQuF%+ap@OkW9(T=Br$YktP1{ATiYbs{Fq8_8YvzM8*h{!;Uk>*FU* z@G%=*+csl|$J(+1P8`3jvb^U!anYK?!8aXA}Q6p3WN&G@QVC*cz?uZ%}9$fh*YaH!1#haqB7j zd#(L9@3SUc5m<&Ze7ZT|3?y3}$wkAQvF5-cZO)Bp=i8Xazd0-1C-6U5cW!OY>n=E8 zP2-8a^oTRv+`0Shb)VUNoy$3Kb@SDk*F){ub~tNHqJ6l6Bl_4HM~XvY)5`b!a>4*V zDQ_MOA8uaoSH3;v2)-8E#YH}Z85oBNZ=-N}R39ug4nDk<)QyGlBMi+Oss774#8u==fSFZ|rK_))#}||EeyQ$U)vxe1Rw4 zXOoxsF&Uh}9E`yz3=sIZV=;{30*q^eclwT-{$9)9blr0E1_oiS^$u&pIWaG64aQ*S zF5mj0a}o9X4CcTgUO10-SjWlD*}?d$b!BI92K(Rpx}Uk)@d97yEzUgW#tHki@63hu z&cA4Fm9K~Fo51^3J8`d*)J|4>IQ4IS@Wpy;93SOBz9KLot{r$l^rh$Bl-~v`@EA6R zANe0v4|q+q!#pg*i1M-9CZ^)l#y<|=#8v%LZoHU#z9OqKPRttCw^y7PaSr@=EqT^F z_)YE{;^)0&#fu9!UL^1Dx6@G8y$2qNwld!IC zzOudTNALdo+;dOuulyS>Tsm$pDLbEY)AqRUaPMoMeKwdM!HLQ^!M<$D#`40{*}L+& z^>6|1;UT|>krOB3q4I`yq7j7?0s|Lj0+1NXt-_sVSaMa&(g{9{1u5Gy|v~W zdv$N|+WY8mhvr-BH1GAKGac@v?tZxNmC7$_d$)SxY;q;c%L`+>ZChn=MBi}Xard)Z zd!NN5GI=}S@ZlY=@7Oswgnv?O77O{7zT+jV42HuNEDgS3n&5-Kd51;3G4{qkEWtZ$ z!5M*N_}`eG{nh1#&hYX)jUC+E!+Oab%kg0LfNPwPt6-kssJGmn<6JYwdNA*dd##sT zH`clJ?=#-#o%7?Td+b~W|H|F~Y;|mr540_|X2Z%a<*{-;xzcw$!wo4iq-UDceo&J$C|4ddXhbtWI(`#!XnJ<{+(6X%#c_nBaC;{VMB zTAQ=LvNPEK&JA+b%>#dXj}Q9sLm%F>#%Q=#wvMv%@3yJqChXs5P`_oz3};@+nM~PT z+)+-Dx8a$Oypi~UZ^Wg?>T-NCSQpRuFU%hs^TPwU7t?TnY<>(MU_@USAMA_2VXC+K zyt(Ji@@D1NYJ(*b#s+_l9jvL#4`FEX1q{NpHRBD9Kk#?SHOkt}OJ=<=x^RHtM6yVA zf*1BWozK2;A|6ei@Q#9izvno9r1p=KPpUT__V4}Wiq&0TVqIQf4}6e6@qsNXU-3lV z96REJSVQ>Zv35M*hs}w}6SsfzBMid-nU61Jd7<{BGVI-bgTtE_FeH`|dBS@GR>jo6 z`6Sa1lkj9MoCquUI6CaW((nR?h&E%L!(Q+Qr}B%n@eaSpKEq*u`3eu{UG{HMUViW2 z`9mKLneWW|4)8zczd5nFKl^SzOukZn*k{IPcI!R|9@Ks&a|hV3{p6?HUwlAd|1qh| zfAi*nd$BJ+A96vyK9%)v4qS~9&)3F*_y{j>#qkY+Qh;~8hhp&^k8wgf?ioX_*LR+H z_o@9TH~4Q2txu{ucjIvGurGXf_k&HkH!fV+g|N}ZW&}TsYtE{U2e=~EoY`AUI{5}a z@Zm9u3&RQh#=&4%gv~1)j#MB2?l=gW<9m2W&Ko0e1g9HYVmbWIzY*!**bZO3qr#sY zbHF_O>~pBwd+^^mrVoxbA7-z;=F3=)2ljyRjq7;}$pP>#56BCZ=ih1FZzy&0>b%V_ zyugRy9!|K^)|0Pr)4k*8+#?>a*TjmQ`*1&{xOH)n8;#Qyg5t~wg;tT=#AC&4NBPoMZeT3g%dPGUVhc_1Df?`?VF z#nbQXK4~0&8K?huBtMqCNbKbdn-93K*djR+W&O_PjFM*zx{yFJzIX+BJ?A}}$Y>LZO7+lKmC@#wvFnq^)-v&1i_8ZB!j5cp3Z>XCG=1g92)>}5m z=G^W}?1A^BGdRnY%sC!9i*wYj?WjI{U^C}V-0#XSgWdF5EL-{XgykE@mEj(qC)VPF zw*kzBMP;0re8JDHVVwge%rn2a>$L=K?zyo3BKf#6c=0?9quRx9V-pyH_1Q!0O@?#M zN$}CxoCRLP|FQ8;9F;Rp=fZ;hKDVQsJ&CkDU8UF+L_xX^wl zUOcvjv!s=$zcFw&``FjKcW?|bXH_d{o4n}qFfVfe7M_OtdCr`JB`*qa~n+vNG}1F`Mkzx*>ktUkD}?G*2D zWBY%>e`3yzZ;r9!e=%I##+|TxhFjQ$J#UkFpS)lDi^jkH)OU%cxX@f&TyRfdE5QX= zyR_kpvDR$88`o!R4HsTZ+bbR%Urc{B{iSr6maDwah9_wpopZzom><4=*qC>oIB{9O zzTtIy&;GbrnJsW%oWN09KR&PnTPi!hoB{Xp@?c*)BJ7tQpX7&wO&dq!3oKuJ2m8wT zdwd-(5B{uO+`e|-U>;s@W5?>Nar#$cjhPodCcYXAXE6DHC;Lq^?-udZ+=u4kWxP0? zwY>>0+8;NZ@#P-4xA$Akh0Do1cpz`#gm=;X9c^#910S@*e`DtjhZnejS2%!k?nS!8 zVgq-PAL?^X`(4hOJ=y&X>txQ#mgYFGa&kIv9B+qjY+2JHRi+Wwa?#reCw$` zKLhyM6DLmm?5tON!}v-rqV9a1eYoFQhNHC)clBqNIY0Yk!;_8JGGW`bxqt)gXWiif zKN`mmkF{-IjQ<|$+c-TdAKPEbXV?&nCmwqbksV**=xW~i*c_M$2a`vPhdXbUzn=KF z=H5|oD~E{fFlR0tHQyTK!qa3pqFn#6F@}GuF|!YD!7@&G1JU-t1HABF!wYXHb@{FR zjhl1O&VuLoA#dQs&V!SSHYbLc*<`UN--RPKg=st;t~zJuCHOFB)#ki$!QJ#-##DE| zv2*L<)`b^*$xp3)!h`sjto(l2kJNvKYdC=k{FpaQSP_%GRlJkDk&ZBS#s{(f*fMb# zhpe#$9<2v|@M2wauh)`ytG}0gQu+7R{s&v{k5>L(I&5FRkp2@tcD(kVHReC5zcK!Q zV0dx8+{mSTyxL%!k39@+Va8d+nAF-;Fvr#FPw_OCw}l9oWovN8QkE) z#^2-t7*vPx@N+cxGRGR_3Uf|4j2DAN{L|jF}W}nB} zNaZ=Ja_1$^Jbb9_y2oYjwe8RLFh23mcj~`cJ@GD?clsOkdB2P8aDW4R#Be`~Y8T(q}o~PeWKCJvfx_wUThQm3>=c|9a^3NncUpXxMIS_1X z8~t(RPm`ZZ{^R67Z2lilet+^wV?JvCFC^cr{JWB$s{HkIeV1{6vhp`JC$j5c8Gb9f zFRrqOcbm7F9JtubSQ=--_{ApX!FhNWUtW&W=T7D{cKBdSYvY34aPE2RJ2@kK^8J*r4Ji6=M)-#FCX>a%Zca0hEA zEy z&Ufm6qq;Hhkxy^T4z|O$SbxH^JP?Oga>9SP!q0th!CH&p(6cSo?JHK#&!X&8zx5BC ziYtCk;NLl1f2i^wZrt~hFE{^7Pkn>aPilkpKbZXNF8@Sxv>O{IaA5t;q_vjvPd5Me zq{}hKFKkZOmp#Jz;I})u%k^IKKT5l6V-~)I|AjM+7aJzVXIFR@`w83139EIk);w^4 z4RNQrS7VOm;Lq8b=HL|H!x*d$#$Y0WKe&UD5!m*Q@UFlE^<>@|I09?12WPNtU2}IH z84Uhk^%uLXKlpm6UtHceAKkoT;|9KP3ol^MysJ6ZhSPtAr(! zhBuoZHy`F5=nTokc6V;i;WS%`ANar?&OtU8*mG>k4~?C7RDFkjoZi}frp*4g4_bHL z0IxMZ><;GP9u{v6zx8Pox7RCj@o88Xp49GJVK5W^@!@FQ$u%(kyuSCV!{+Czzmtf& z#x`#Lj=FcwQU7oVe!|iGooVCNx02sm{SQ3p`Q66H%`+a4znOfyI{mfUzLLa+^NUaW z+H-wc{X0o|zQKRI@=qqeSp66G_r&X!yVDA{_`bRm{?5AzU&5?BG8};S>XRGj$J*JR zeVsr1;FGc9gnQ!Ia6)_QP24qp`xm~CqxOgT!{of9_uJ>tmcWKsK3r(5af>!iyS3EC zS-Ao(z1u4vz9V2w?toFT+*>AI3~t4DbM@Q*p)#&1hcOr;xG)@p#m0|pP8vIJAaOsL zJ=;T$m_6{(Id-m?vA!YheAfN0)+9Iz#|u`)jBMq8M`N7fsGpq9RsCu#9}N%kfjE6- z=dn3|6rU!h)yEgsobj*>!~8C0nZs`|z*qQy2l();dN`Tb{#v>|IDvh7azkrPTXS$= z^1*p%}`#Vnb}#}b`Wka4 zi@-s6F@71FXun8h@fx0HzBdRi;D&dI`i(^xg(l$q#sdE4cB$Ch|sY^Ud2? zW-WU)f6nM!@LJpDOb?aY!`e8sst^C-oOheGhHu_S_-J1|@vg%mxoW@nPWw2&^T7h# zZfs1PtbS!f{cO1&E3@~;4lE6xD*iZQ zXK;?;tGmMnjkD~~Ipwe6cjJe9&Y8H^fsgWvJVIB$Nar~coO#KSH)>0K6X6MQwgZ2E zH2G%ruRL+WH-_K6TLYF?w&$baMjW6IJ_!Tkm$Wu~nYZLFuX4!Xx4GiH@n<+X9~x^8 zKJB}%a0Ns2*70@`(|4R6jD%-n;Le`QI!EQidYAd_i;L%DVtsA)a(;a<+@AU;=CG|X zFbk93PW%0I{_mCXLcZu+*03)uI{SPt$X$5$&^mF&8JugzTDP;!H?^NF;e>Y@KFAC1 zC|9_nJ$&nEV}tDG9QN6ywS$WYpSz~7WbS)o+x^Xh z{Wykm^D`&8f#9L{75m7Kv^%?BGWdAxY|3JX^JiZo{G&&1bf&B1|i;(o9_KK^|D zUr9cy?c3=uHzzHg!xSD(91eeH^T`z+t$DFg>%gdSgI!ovZ|?(U({O5y8K<7DXN_0- zje+^o+LiIa8n-O{&Q5E$p0&hTcdU;4)2H1Utv7Qzqx;UC@gupa54Yv21V2XOFK)d4 zB)=Ia){Ex8n`Eo&t2)2k_v1Ft~&#KH4JA@vHcG;sYGPMqF6o z7j7=t#S!n2)|vN;cQh<{yU^x{!P=WQaS`Y60!AKNC$8X=^PH`TGtT54G5FydF*h5o z>^=6&7ZbPMs4btHzs&zX+UtKyy!GS6ym$7w=Pa=6O|;Ll@X($Q&GjBjyVum^9cMR3 zt|8XP3H*pBr?(Rxu$MJkdvXMxi5m~C<*tuO_nF)g7jb)uiTMa#7mUH~n~mo$eXmu1 zQQt?ke=Yq})xVQo^?kAOhw0~un4CQp`-C|Hdq-xYeZY=m&y)iH(Zo-P#X$=^`7dp)10-Vo2cnbgFdGNIR#qU+093hUbZEN-s8_w>3 z6+>`+VhQ^`CP#hy`+E4fe>Q}hr?uS`c5$_Ptj0Ufk>JyMXbs$o6F4S6zFY?n@B!Do zn|x2;1-=+(ZEHNX-kpCQY7=92-`Tq2z}!pRd%b@C6uaQMyWxfVEk6B1<&V-|Nw4(J zq<=E`xblb1V+Yvb=WsPxgIySA3EiE;dOYZ2PQo zcJw{n+wbWco88&m+42tzOimBW!wdMX4Q2-)FzWkI+?ONx8=heN{*Lsm>F4utz*}T~ zCJAH4;lnQD!^F$>xWWWsTQ=o?HWN2j_>se4@_<8Hy}rp4Vd~0empM3*O~jI;b;h>l z!*p|w_883K=zX5Q*16=3o12>x!wp!j?(TRo0=J3tj%~b|+|?R*q0TPsVV~|iybuHA z(rkwpE8pYo)j8)b_+st$xx8oiiXXez1slaK_+I(?iU;0BeqQf)PxC%{r?Fp8zLdO| zU1v}G;v;;gk2FkP?8&ypzC*hY~|vBlm?`8VUlWiDGJXZAVW4Srka+;Uj6c6EKHe)dYnZkr=3+u+1{ zme6k{ujC2#cBk_(@qU4g{pKAX!hV>zw!dJLk6#K5h1IJu^YfP858e^;mcS2u5j)L+ z!&^2!#NAWe#JB8!@Y#+FXZE@64KHvA+x&I1A>SnK35c zo1E<@TWCiuDAJPzXKOw*_pl% zC-BMn2;Ys3%u7~s)pqbT?7v#Cin|; z@HMgWp*>-gC~v$wiJN$anH#d1BU3_Kq~)y6U?PFXkTE zbNuXHxZPbBT#@>g`|vUBbe9v>-|tR8m;6HV^U2R7U#ln+pv6(+;Y&^sAH5y?9?W}P%!LO(lN4uRY{%Qd zW%$4F3m(`W&)7G6YCpC;$A_@pJ_*Y#F2@8I2Ig;ImQ?;KPbK>ya zvGdRO3?4Z1|D5*z@pDw%_4acI7!J>;?*eZi-#?x8WC#4dzoUx<^2G2$&R_#PxOpK@ zSl`;+9hOc$hQsa;L*%FqCnu~vtIUt$*?W!skt9C&+qU)Z)%GVU|9s`2OaDari|NK3 z@6=b^JHpFwL44hD79VE)Y&jV047kbObB4~v4_9Xze>hwISjqTH`!27>xyR_ve(USL z%Y7er)Sq0Ncery?w-Uc>})jLZA1t_~>_EZ~4UGw zq1o!vGC@kMGMJ~$PxPO= zu5J45*FG<$`e35At1~#q6*uIHl?|NN+0T4W^C=vhG(IFR?E(b-~$z7YoVY=942zxsAM!_+1A zHuijNb3&}@9%tv9^Wao56(9U8Wy<%r0*wRk0wdvIc;ZctGq478#a>uh$#9}rc-(b- z=zjcrb&f0C&slNaUHGrNtryilOukZE{yi%X-yf@c<9Uzy{*}XUqdTnZ zJF$XI<+uIjgS+{@ab`IX?#255sd9H4j?=iJk3Db&_Sr$+Xzp+Z@4c_&9N53xaY!!0 ziEW#)kMVeMi|?%cwv@|G_J7z?PP-~!;y{>$8~DMC@ppCeb_6Gz~XonTv>d8~Ykn6`Owq@88@;Tp~xPhjcTT6x;6hXeL$UwgqCxoVp}<@U#c z;es=6KH$I^AFeI9fD@A^Xn5J2Sm6gB#^>-3W8NLf87J;IJn=>U&57*U_uJFYor+b? z1y3+{io1Mv<3}vL<0L%%-aDJzl;O!&IV!v+-IBlUihW77$N4v`5hndz&LS&;0x|-{tU0%`#uN0 z4o~kp-TV*(*iz1L_Q&q`S)6#UG4D3^qvQ+C{kZXA#Wr>i=%~XR9~%f_FA!?=U@lgS&8bZLI4Xo^+1!-DCCUjLqW4_@Xi6Pv^;B zlQZO-ztmds;rR3E?uRQUJ9ty!O6|iJWAFwK++9q-A9WlM8`z>4Ke0ug^sd4gyrAU< zd#2|*gucuAjcEpLn8N3yr zU&iUj>iG@t*zRQO^hkVI?5^IpyIriCw%W(0^^N9#YvBVM$A`gJ`z`)}jm-`Ce<`(H z$)fS1GvbB3uwW4LXO1#?8-i3 z2|M4mKE;6>quxe;E`jlQFmVAd-1*O^|7^OqmG{-WvDg3?ypM>Si4(r9Vc&V;=5V7k z&G&S;_j5C{!un@%V)9?(yq(4WcZIPY?~( z&fMSFeiniUVj3U9m{^A+c+q=c@K$cXk(XHTmfn4nBl72P%C~Rx#@F$HjgRcaM&f{P z<#{VPOR;LXXINeM@Y9ulPx^c5A4z{MdC^%vPOAG`ck5kz9q(gYV>n?ttUx|B!_F11IoZj${+<_!92ty(Bh>1MKGA#AfnLnEy;p z;GUS#xy4*}aK^)%qjOID@9c0tytZEB=PjzOzWGLb=-%!`4?5fXmETQXR1d52#PySv$tTt0!u)QwzN7N_c4D8$By7zagl>QM zoSy~s)^LVZEaHc&v%m%Z5wUZ)ERidU z4}*8Heq(v~u(>m_1KuAx+tGQ#(aC0E5pKj>m_HLXy&7liOKgVEu|s`0VJw?m-Fsqo z`f5$2YbUEbQwmsdayI<~x-{JWp`~gqJPCwI!JtC&h8wf|^qWm%b zbT-(R|2BW-F27X$&()szc9?h5f4}RW#R>V+T<;||VIwg?EZ?>m?R;@!)#e<-4gB~Q zPvd7!+>r;)#?DzEyI+{S*vTC6H@l4;YhU%lzkYHWN8=5CB=AbE$Ho%%#?Z!IuhdU# z!zv!;ztw*8cEJ&2*|l@H!^~@pIr>g}5L|0M48ybY;`ZRc+O1`e;YQ^n-jI`y5Ap;K z9B_e);@9TDsVyvN(>Hv8ZTNxp`t+Zh2QULKWZp-xljxsVxX0;(Pu~%6RepH-``G)x zwa=$~`&SZWKX>;Q(dM1KzbU2;4{`;}cyHxTHW>dsw6+-eSe<>`Et`!ky1N{B@d55^ z8?MgiJ?rO8{$Jkm2RqD~#<6$yU(GvO^K8vk``{~o!52Rt1h2h!aE8fEYkse>=x6^+1wRRfE<{c%k!ESgT{1*G?KHrZM?jS$Fw>z2d z-BhkP|GUcGOx{#99<+}8AGjrVD$A?5f)i|KFL6XpVh2B~kh7c@zHp*D45rg#quM8~ zx^r?Fml%I0YvcRs-Y_@z#uekb`v^NE@M=wZ-E)nD{dmA$gkP?No^iYVNSlubr?R=m zus?3r=d8pzCf@UJ=bE!A=VM$rYa6~+o?L(vcpZLMxP-@pz$y&G2)rk74*ypgZs2&) zu)jG0-}*0Hpc8FJYrVw$E4;AhtW!TeoXNF0fe$Cye*-wU;d49?_h2KujNkdTx5x+% zh=cmz&i7|{z1T>8z#nt{{6`L9XI#&(rVL_pS6d>-$P=U#gxs*TfRId3X{( zi<$R1AGhWSBacabJNP<3eHJI?UU=_237&l?-FS8vIq$zs;sZ|L!Tc@`PrRi_yzq@N zvEUUh4WDoTH{>WkU%&-+BYqB{-M35azR~9AyZ;zv)b9(o-_Z~pWev! zgL82oreJYm9IWFjZpa<`T`*jz&;2G>H1F1j{E^5RuztaM`hf9`bNYgr1m3URciLAU zu8_*7y8g!bRv64XV{(wq33KF;={GK3_!+}`z4Fcz;;P>@9O50UsP}FdPQVgh!jo7i zu8N(078AaP3lFUYXWlHv`_9HQo+ZwfT;KcYOG7(tkR^2X~V*-A5fC z?)JX5=Nm*0^0p%OvZt6LSBNj>vYY$=N<#b2VKXtN`n)~eB_4>Mur>Gy8+fs@!O3nL z*O#&Qk-pqtd`RGQzDLB2+O@IKC02_^%{i=5KbxKSL&7;OsIT2V@4ecO+Ar-ye!@rZ zRPA^o#)<3j6_(&_z71+WaDc>%!90F6*8Q&J*!nbo3qD+%4{&|Lbpq$g%RUKx?Y>pt zWncK#Z|prj4qV~=!Ueb&kCV&T1W(9WpL_+ENB4M{CvX9l_!92(`(O$$e1qbHI0)x3 z05f4^uplRh<6_~);=CWsVb90Tk+9Lhu52LA6))VGeemTFciyS}GdOYNlQZ89CYpmQ z6Bor?Sl@4;;exXhdB9nG6UkxSW7=UGuIczNWp~4q`{!%yfe#6u;KuO995%W+XCG_f z2D$AiK6qo@-!eGjocN(E&t|*%HiGAe>=2%D)xwz6C<>#XY1iY z{VzF@jqt&n#u~#T>lmNF`0(P^t-)vPY`s_ej(g9?=HXm?l_Ow|-{xoJ@F$+d0e(IC zG=Gn;Yxfpf>U^G7KdfO6*|8t)k1g;&^&8W$pGmxQh?o6EoJgY_Z(;gZMX`DbJkR|55eu zI=slYhgcwP6^FhbCyw&R5!c6$`TJ=6#IS$fdVep0e|*sX&|2cIHfM)nyo7z{?96j+ z=fz>Tb~pEOesyDTq8u^rCm3$NI6ra1*n1wn+_E`w;)A^EJ$1jS)Y;D&*w(o=C-HLR z&ZWOn{nwIk$c~fC@FlMJUBuk|vAcF>aej&SVhbDK1rGe`p8HU_Iam77p8d!rKN$b` zH0Ma;7cD;V$JnsB6L5Vjb4PTYRHw^o?eJlU14{LiP4Vz(octVTe z;a+{=fVRdMcU8XhnFIH*zA+5PgI)OD7(X@_roP(;@69z|`KeI?E~Z``=!%ES|I zQF-JaB>%9!aLbl=42SzOS+M=jpWZa{`w!)81OH5clt@%rH1n2T&aoSOr9vCKCHzcwde zo*ZKN)<^mbBZHM2({QbQbH$#xaP=?dDrnKtVZZT!H_=9}|(lg*X+ zc8?zu6aI0U{L{wDCq!H*zD(Q?&&tO`_Djyk?1vY%!SqSvLwY4=ZG(F;hs3LC`?bmm zF5t(kRsZ?$H1EJI`5!OtZwT)t_z!>nEywZY^pDgQM+T1{G&dZ=H(VcKR}35sZ#*w; z_j?9rE8`m64$dndME&*pp4XSajQ(Z3we9isCq%C*%=v4c5JFmQUKyK=J#eEj zlRx-IY{|A053<|v%$jT%7lseo;WnI}*%{`?rtJB++m7@@^6SmpW!hNpsL4Y(@T&

J@~-neKlvhm@zs1gyjwY}`PBS(6$ABM$z z7#^?y{_i}`lXzE}R6x2^I+!rqTbx%m)>^5t;KTx-E*dz{v>{+%Ci0nT9>ww)yn z|8m2fAI|@>@|Ib{8>X?tDdWvI*SgLP*LWTWCwAaNT%2zf_jVR%$`=n#yNlgGo1KdW51F- zYfM}_UZhtN7tUX3%)g|x_f1#S&Oa0@A3C{dwsa_vJckbIPAlfxGxt>F8mkiY~al_aXT*f zdAB#!@FP9z)<5qlc_SP8Jie0O`E@zzHz<$o;JE54pK25~wKT+H7N#u{PFUFr=O2c{Y zoJ-se|HFs0xW9_^EA35oGGQ{*+WlOAeh1vz$Lq-_^|kL27fyS^ z{;HnH6|481edUjM@$_>ixbzml3HbHy5%b^%hTsYY*eBmiY;4@id;kkK?!?p^e}AE} zcw67_=Z^Or6<)O3k+uumS)SN904xeDrdd__3iS~r; z!FSl6H&kbuI*$JrTe{z@_m`_1Z;XC?_~iut?c;v-#v3u+e)UhRxb0P&bIsV+n>?T{ zx0qwC?l|}gOUFZgNhTJZ#-8Y+=uhi8u&rj3@5Uc`NI+GDE~?tw!<+l zh~M6(S8`Uzks};W{4p-y^6yAo!l#2DaA3C&e|F!zrMd_I$mfLb&dzE---Lcn;%ANX z?TiBPXKj7tWZh?vHKe01^&3CuF(0=o7 z>x{!GIBdU(?|2+%hqvV@`RTMDUN}P-pPaSvKK;&Gj=+sWely0|jkkum?xk!`d$_B8 ziF0rMjoohh6$7R&uezgg$~eM)Vvn4p91r}g3HIUY3{&Fo;E)~Q{MYLL`@0+mCI_(9 zUr+b|Kk&jB+(?Eq+Hu1g8}DNN0k4nklWnhXyTqVGoS&S~dB*;9T$uAI8BH01u1br5tOkQ1nOJNLxYd8A&5*4j8a8aLCsUYU+Z_y&kK*> zAM06r-uvwR`K-0}Ip5#CNtiga*9SO(kH#OHjho3}^bMuM=iuF#dpT{+jRS-8)^_7i!bfja65m(uE72DjVt3*?T>Nn?JoFn zMRH5hv(EdaFg&rTbAbITPqf%-^6_BjgYOvA-&x?o&WXmvmEno~G^RZa+pugtHeLL* z#0&W4HXS_0c!3k{BgQj6PIzB9?||@vd|GA2 zQSJw8`0f8xT-I+&e@pti60wt5Moe?hdH23kM9WIV{<;Hea=4}=$mU3f5uPmoWPOuIZ>Mhe`9 z)Cc`{VXc_W`&!?$-7AjyjnVjVhw8(-f4lAYlcgV+{<1V*;Lcqm5H-mh$c}OX7~tXHEPhz5l!7c;KAa zFd9DKBpF=6Liljr-u29V_Pym{SQ$(>|8O*%fWci}T)Od2V-&U+2k-|U^lgm6Ph*UY zy&-+3H8;oD&+sn@aNv5ne!%vv^te#sN z<86A@Y0buM{Na**@`*X;Iq(P<>=W%-%<0*1y5}5!LW|w(Gk+XMW*<9)@iF!k7ZN^H z%;^3vZryn^z5-_9A0OUVJt;l9^r;_FA16jWQ2lkKH;m&146osN;ZXNxa;J#2-g z9dqktrQvbsR(kvn8;L{u!BV(!{v(~o+#jq5C(QfW1TK@&UirPU z{HSatxNZ-7*5L*oWS7R~{Kb}LuZTK(|K8-UO4H$Xcp#t5e&IuPw{1F z;zt-CTMy5-m%cW+rt;c~Wv898?9|*V=-Vpi6Vk`{aXgdYS7qWS-(B73m-K;rV);0+ z@)5;N!wvBhj)YG!i@%}terW#oUMy66H2LDC`M1*_THOy;_RZ<loHyU;MNt%cl3Vd50760Vnv28_Sb0~%j@D){+?oda zaLD#H$Bb(X>pg!B__vAmu=~RwZS}WS+}fUX)}>8+m^$l}Hm9`qJ0I#lW5^o|XZZ{1 zcs|c%KVjZ;;{GPH?w)(Ge$U8P*nhn6++^p5XD>Z`Q1+hE?@Pk!VEl@-{Codeh8yoL zU)$l0I((_!+{0lS=C4Z9aE}Xv=`0q-{tO*PQ*5Fd-$Bv-HW|0?Z`6)xbR za~^D)!#d!sxd-zwYc1h=FuIRh8C(u_anf9^0}sqUVqJKtEnZlMxnbRyrEy@&X?6OC z_2J1@HvBZd_Qo-9YaF|P7wyLg4%oB(S?wFKUvXi0L&JSqEH&{~dVFBz{H8c*?iZcQ z#7=l{TLPc&PhXw9r}Vo&RFsXpH@$O0td-3DJ5CHY@FHJvfaP0CUzhM9jf*qmC-A2E zM&i`Gf8t-PBOaad;!L=T7Y9BfzcBafe1zX6OziY2)%}C!DQ;Sl6)*A??iI%iD+`y| z>3QFD%=Y_^F#m>8-}o+gWcf$e|KBG+QoHiUAFjT;wY!A2Vyz`E;lsRVW&8OGe&E6+ z4y^LYs!YB+i~GFy!FaLm_X+0#cXYU%bAq2ReTr+CV%Iy@@e}V#x36Qz;0M;=5KcEf zOy3t(m&{n|2|U3&E`+ri)7*H$9(KNC2dxPvXAL+`>=E2+tFE$nPW(`p?-)+- zAvnR7>|zgaA)m4GAL7QhCx4OLT%N$;l?mGs-X~6aclq~}b|#zbX?j(s4Q?d*iiZRr;tw7jaY$!CCmj9FH0N?x# z+n>gV_4Cq+cevw+d>8R<_H-N(4^2G9PsE4uL#4-8;KFrDnqQgk6lcQF$0pf+_Xd2x6ZdTIVtps{ z&S}Age8sYfcTh_)6uT^rTJja{6^A?3hpi6R?g_rb`G(>DomooHUHji&v|Jo7yr?U+G&>6~uPE>A*)(ThkJ*sFER8eTz#M$mSO0yC!6Zz>A{-{TH#iR)gD2c<+&NPi zfkX4vZm?DVrSWHdo82FN!SFWcXlpQ!GJNP+=?QQupjRE z(&4Z*E8Bd*?l1U~*&AaS2akwnuwVLn&eH74yl0ZP-)sUNz~i59b!<~u9&Fo_@IC%u zhmY!CwFV_ zpZEt{Sf$g4jT7T9N)P_|i}4#jj zT>P`WSNetWKUMzX7VS^? zbMo5`=N_KNmpf-?2S?$FjUQamFy*|RF(2)~VMP{$aUx!v}Nfqs$s` z4)?;o@n%eWk)0T<_uR8K>((A`@I-ri(sIuvM|1LVf@b(mBopvk1N9) zdT&SX5;qpyXq&pZA={klIa;s5Z%<-e!&BjdzlOY;@qoqS93Rkh1M_}1s!hWM!%=;Z&k zj|a<%{Xh9FZt3m}!-L~qPS;M~;}>myqSyz{$B)zOn0RQn^EIa`R87JnK@r@?gw5~e*A+z=Gk~L^UGUL_P3y;H@xFNsF z8}CmO=PRy&nc5FmwJ{zn!J{!6d)5`-(jR}$T+K1Eac0(Tz1kaN=SE|Ve^732d}Fiu zN|=T94c8MNnU`3PXHXyB2mkbreQUFK_HmOvKRkhv790 z!{_`iFu$<=$LfBzd~$qLBpAtJKf>y)Avkw*Y<5(9AzB#ALhkS?i5S@ z1UI@jocxBQd&n^k9n**UAHRINV{d0V{@)pQ{)25X$Hs}l9~_3U)7S%!;1`zdYx^T6 zp4iGbxCFBa44-mgxAVqN2D5mEPuU{am@)p}^04^QH2&c3#@QL$+Kg{J>#{y+J_OWArzPPaah2es6loMkRZH$?$_|Uk--C}&st))A2oS^vvvC`p87{n32BTgt2OC8eQ z$%>l}|5L)I`)&=NpIMrGR{4Cz!hXjW@0Tw4Po@8_ibWv~J}@B-6eWv~X* zn+zwaAAEJD^Zu#+bI#5ZC!BjCmJqA2&q)uj9DIOnc(-O{t$R2k4uoHN=Y(gi z?}&c(NuQk;v^&w86VIUEc9)oPY2#%_#{P%9;R8(f+!HgwGR}B*vT-g z_A?IL-dOsIG>+Ad?;Wj=vT#4V+Vl93O!>xx;ll?j$E`Rqd?=3#BR8a*XX56#ae)2w z#8dHM&4Z6|KxE8>MXe|$&0aF1Sb;1RVIJLMk^539WV z@kirG`t6TOe!8;ns_q_%?-YCmyr+-(2YzFTC-^cxq_SgN!JSp?hC^SOe8t9zaJx9) z&I=C)f9xhaD`$_x^a9&)gRO<1vDwZZr#9@^e;Ap1W4-d+-JYi(fnWBU&yap)0$+_c zwwZ?e?B<*|JmCP`h56Ci;4l1c;|p*CXJ}l|*W8{>pZz(dJ&X0* z3z+s?>A|ypo_*^#8VB%1KkJNJGya>>)(-!P@$kxc%bz4L|CaLb8cxS2D6@a~0psyu zi4UW<^6?4qdu8SN#*vAqa7CXFB-M?-Fs?TGYWJ?BvXL##e-N=4Uf{y;Ax_O$H&tgm zTr>7Ho0h)5G;Z8{BJ<6U--r{q;rq7q@a1FEA6Ne4(|;Rn0C<1}orvBL}P z!zW)en3X3lPPEVd>$k!Zz4IYkG~b4tReonU0?)AfvJ(x{;-?uePK@t?)mJ28dd6n^ zt;L%3OFY*;#^Bd8g!SPiF4T6gt1lee6MF;8tq<;TV7RM2j@l1%cn;5CPJFgU8wb2= z9ge-RauV^?($)g6Ox>f6Q1Z#$ej8`i$f z9y!x+Anur0i5-T!_^>{!^efXamS&d+<8Tij%3xRe<>_Z9`Ibr3aYDS0Bg&?InA~kP z49$By`|cdBP2j5bvzBJsVQSInK1w)YwwPpk9~q8xMf%2{j&6PlQ0g~r&tVkb4P$p<>7w# z@`|+n+CQf>?o>Z*c8Tnk)b{xaH`S}R@0mE=e#|r}EgZJ9lBmQA@V;F0Av2kX2^Tx{c zZM^Xd#)=bgIWduEC+vB8{0S~}2B+z`GkA|XFg~`6hSTekt4lW?pEd&9@2ae|Pd}W% zk;;Z6=HA3Q=3Q&`I5B+M{Z8ZZ4a0@(6Fx|rlfM{0)ftU{$OqsCKLA6+i8JNn$}w4K zyy!f=vvt?zCx#PuC=ZwU1%LO07h(y-VD-hsU0ez{lV; z?9E-^)#)(KSB%eidG(hi_z-WV?&;}dc}DWg(g~anemBkxUiF1V82zIJ-tZ&L%~`|H z4T*DgZu{KEhzH{b_yc^EZw)v&z63w4hrA|fuJL8~{gUeNxOt7ab8&d#dEuG7ev{pX zTVGfme&B_*LI6+D;f1IxW)Oikm7|vn;ttaWzyfM#{;X-{*+nQg0I&Mhg>8b6% zva;;QZ~}M8d&=X4_VpXS;YIyM&gYfAjSFI}{XQ`q!M8XtXK?LF+WU5Xd+rU_mv%lk zCb$6iXVP$=p7`muaHT96TU#Am&HJbB+QW-aO(*R4Du%gJ`F~oQxIvEPSNym~ZSEf@ z9$opv%YRjJuj=B#{QccGRUc1|4=DeT#NDF!=y=cC$Bl#djKmB4SV?mZ54vkF310MW z>aSy`o_Dy-MwIp(6Qerca5Q!v1};tDoIJa7@~qOy`m}Vi{(c%ap0SlbC%t1iysq(R zFnW0!u8sR≪Wk)XsVA+#A!*)V@1w{A-+3PKEK|nlbUB8C&wpTTmA#pCAhH1P7}X{{r#O2>@R1M+iOeM*~*mT3tw^kxFk;aRzZBLI9!+( z--mzSD(2t$_$TQ**5M7!t)nq#E!G3icwt_gh>v2R;e>MdP6m(RcJKw$Fb>E6 zEo}@O`I9XjucuFSbB9pA^FW^s-@}KVZTR51YBOVKPw=C9_JI9g@d4iD;hKhdB5&N% z(@xv!C$GHvJ-uqP^__9#^?!G5#HyRjd#9_jksE&Johu&1kv)Ezy9P`syS};`liNxs z^e*yj?eHXDatKQ!#aO;)_^$1~?Hk46^UCKN@L}zqG5<#3ohrXDVav~@ADq5_a*xvP z8u@~QnCa`%;-)w;e{UhC`k~7BiwCB^zA@v*G2g&fxI>IzXk6bdR^0He>vOjEPWB~x zffL?0TeJAjT9;2vaKqVNRXuFIIQ<97Gn0J5_=S7}Jp!|rmnLumV>s~q#Pr- z*x7$V*g2EFsdCuACLIqZhN6{Kx7*Q)tHKb!!B>#sM0monC2SqxYvY8!O*M~qu}hf5 zgTw!LBJ=MV#F4pQ@D<&akKa|@H&>S3_ikyv)%|eg-&1*YbGP`u%D=btgDU^A${&?{ zXJy?nCPovd+p9H_ac0^hhdqG z+~b|OJ3PJoQ_mCpz>Uk&;tAM!Q4$s>hJjODfPZc1+Rr@&mMa@yjr-7aC)DS^2zIetjB7VHXeJA20X^_z%OgPHRnu58-n#^wu=o5}1W?X=CY& z3yr_%r@y)6|62m<+P*D`4`ctOae+36Hmz;M_{#Jlc+>oNG+Z(UKCoX`r{9@|^TwL7 zcTUJ_Tixib|8P=!b+~aw>16nT6Yo7K8|;f|V7BuYH;hlX=_H;Szi?x1Z%=R_!H3~Q zd=N7YZqB5Wl{C)S+Bh-y?EHkk!&^V8HtcU)@NYu-w*!y)i9`Nk_>iw~uQ()wW%uNK zhIdBCcyYW>=^wmkx%d%%#|ZzIJi2uH`2DqeSp6PZ`mq-+Z+}ef9#B5t;w~|q;(ziH z2YmeO+TCsQ6ZX%!*n4{&hyAX1X$`Y3>rB>9E?+EYkLRrPgS|gUo>7_D=_%>BF===V zf5Qiy*!l3{(wEov`RV#jJoD1>FGz3;moBXwPn;=Ul%96x+qqL4eFpQe{gTp`ZS81t zG}pX4!yEVwr{fRcnTXSN|FG9_<$Sw8^;)7d-m4; z;sTr-&$z}SIH9dMv{%3Lp?w}cz%pT%-kI#a0^YZ=$4}_zY&IU8&MoiklHtS7t!pdm z+~=Ls#)-LCgxTRlHh%oT_4SJrgYBD3-;kWCPCD5+AznJ*ggQPUjUPwje9TGNa<=m9 ztl!J}d!zLqRxT!q5B}cBznAadj%AZqILtmD?piwRx(j%x#BVHLnuKqEk3D~XmtR=p z!2IT8t?Z$F+xQRF|4iwhix-b5UDAG8`5?dH{6jDvUisuHYs^zVXuHpA4xE7D z4c`;*;6kngh`9lj?vy0LUPS#cr^P1$Xg-M+P{-SKRAp_4T}h?~Sv-pQ^w_bF*U;vbZb2P+>D z#{6CC;h$E1$MSbB{h5^|-VYtK>-5-le&U|h(f?cR9*}-W5+ByMuskC9smjy7_g(y- z;>%B$FOE9pgu8|K3EwtOj2(rM;>r>G+Ig_ivv>CDO#SXqpZtrs%e&)4&$RTc^W7h= zFRjnBl6bK^xqPzxPJ%CZa2{@kPtUKe_Iw4uFg$qfiC)BBmEp?7X*7OamcV*Efd9E; z7)QGDg+I_%J8k%n?hodldcGmdjU5hyW1Ha}Z`lL*rqwBjOZb9OQak=&=MEf?@2StO z^_~9O8n^j~@rDc1dzrL$=CnWhp4S#Ph8J-F55{j=lk=hBz4M}n3#F}d%9LBXIy~Aq zp)Xzy_OCn9bEk+S?4k1cUfS7??YpJEH&u3h`o;uDDqE%1(YK!1(IZ=WW)tnshLw15 zNcaXES+cX@5I$l_=C|Yd2{Fm>(<+M#$2+9&SewsC->JHM#PH(6>PmaB>Rpq&#o>oa z|7c|oOn-a&$CIC^Z)N`e;_#TbK;p#Pe?Iw-)jz7X7blG)2E&Qtd7Ky<&hEadXM-90 z_0F`I!r66Z_Wam09^&wFLH+Y(w0qF+S^b zFJ>D5lAqvrhC}%B%h{L>)!Ws()u>u%xAovOUlgC zoN#|CFzsx1Y=`$#PQX6do@?jQXdI}|aDmo8e$APM;o-(^597q#G5CqU*LgeJTWfn` za&2;5!VaFP93PVPrV~APQRD6P@DdmB;P`iwe9qiUKfX46MDd1LWPcYcb`dizxZy5w zhuU12+&KwvI3Yd$;hRe57mnYVE*5(GqtlN_{!R7Wt^HdDemi)<&sF!x@@aYZ4Q-E) zsqEpk{Ro^GJief3dtUMf$)!Cby9#6QxSt(7IurJa@8I{kgB{c3XWvt~vkk`+L*WJa z?ees^2+o^l?g7S!X}0~T=RWnJm#3eWJiBshc-6UkeeWyJJ^Cl&!;C5Zf|D~R^E%_X zCmSRDk8gN&I^VGJ8I_BfhF{A6za&nK-;jnoc!4cxnB8%ythw0JvA@-`@zc(J)ON=( zJ#dy*fh?kB_jPgkC=IE4R?#);$qTAyO4wOGvi;Qc-^-xuKZ(sL(w zgXffHui0-Hc3$@M<)!(KFg@>{oYfWik8Hr&-pzhHOV~C>T=)>-KN9ne4gcMAG8}|i zej^MIA6``Yg{ASPI=*B2z>PUNyRmPu-MS{8+IX?b*KfwMW@8)oH78}W_WHp$thlSf zA&yKLtnN5#uEA6JssAu8OnZ3W@eSkUae)6g<%)7^r>%KwuZ{iP>xL870l(H2PCf7B zodJ7P-Kb)T*kSKu8#h-cDv=a96$+j$o5=Upxz@y^OSOYhz1-MjrQu7PLwgXOy9 zgOyc3oVcNUZM=8dc`&w0{!IN6aT8wf74X4sE^H`n#EFHU=>3xWf&298KGD0JB~Ezn zBtQ3Td~W#8BM`G)mtEBgqXSn?6aeUt;R?EaQa+*zpQ$3 zQ=B_&@14euKdI+SRybzUpPcM={k5fES6!GJo;)`V*F>A}4}W5!Q(OD`bB})bZ=JjQ zH$3UwZ4WoLaf^@Qz$2da!^`-hDW!;zk0)@K~g0<+m(7#)0;HvVAS{NZQaFf|(X%#SNOchZAB z?KiFr#$g^GHa+Xxu}@cS{^5ak#5%00af~_Get&5ku#Ro+sWZR)KEL|&*R+-6)bMJ1 zmf`*??f zwRvC?-o1aCyF_|@bYMP0+1rOdfuU@~&d7K!33%BpCu6c(K%{#oaA3JY0J)E)Ud%3jscwX!`>-KznNSIz= z`HBSocRo}%zSn++W%!+UPG{0LR)-7Pe;6m+uf2D|3I1YYrZ{zs7w#fQKH_W=FWe`F z7x{~0oN!lI@&N}vp*yyF#r*pPAB7XE`0CE}E9RMR6vb3Hvwmgr74`q}#{0JPkE9=5 zo1d!uXVQ;J@Fc#tcVDcm`olfSe`)PMKOH9y`@7il`G6PlVR+&iSdI(3&zQI-Z0~JO zxfFNi-Omea|ANvlJNHYU-ZY4SuG{Fs6;-Bq#m>VDPy3&7?boOvPW%Am+FYVsVkG!lri3=-^;E;5@7@Y3q ze^?%man5{jlOEjfn1cH-Hg$NRoG7Q&rTLn%2QY3dH#=?Vl zB`|#cJg{yavduZ%Y~8aCYq2-lN%Mp6OpIa7YZLqQ-b8sApE=AUzG|=ekns<29iCxa z%rtS6I|g4Ne_f*eP37YQKH#vu7V(Ij0`~=6pR(a##(%jQulxCys-Pz`P zc^Yrx!tm-@>8EehZi_u?2Q}e^ThgR z?R$M#_WokVgk@uzo0!WpOKWGI%EmUpcI(2CoiC%cBq^LHGF{ofUbRha+n1g^vP`ot4iV13WWgGtN7HcZ!N z?jP#HGT$=qJj3GHvi9=$cbfZ}`n;#Im!`FY+2@tMGgo1S-6{Ufzt>ws za@rR!&RhR{r^W$$h99tw4+&mO40=oX?6~{D>32GICea=*#^2cI>ysPH-{Ke{CVUA)ZSoa-bIPv!@|CGv;B|qVQG2&hk7x)K#)(c9<58uoDJ;eHT z$wlS=MdjaFS$sH(rM{&y_wOGqpKtK{kNJDmVyMHvO@5-b_pOW%ieLEFz2)RSVUPZx z=X+)vUc>d=C!Uyw|4S-M=+ks{%daQ-kcnqt58j`Zgtv)pV9&Y2b^CQVo3I_Y!M=qH z{sZm@kH^xROdR&2%Aa3ZGVg}jyvCgGrk#m%9XptwbA=C>Fm`7(JcKuRe{G^KZ0`4y z%IEzfZf#ugPHONR{s-&fZ7_)s$_T#E)?-fCGcQcy5vwJWG6-bb0pcxY>Ff zntR6;>A!^&zEvFRhZhrXHO}~m&fA&e!p@6{p+2E<*zXQ~Jf9PIv5ETqj^WO6=snc3 zal+q3%$*`G_?@i3H}ZF=e&6A{#o^xNzoxqHDIHIa)z7z#A1fapj@>g3>h4jSFRAUF zlGf2T!V^x2U3>01d*}G7ZO#xg$M5!l=LP#e!SZTGZ3yTGmantR2=eGS$Dv&NP- zAHB)!SI;5tcP{(0`HrwZul1gC&%Rm5#*gX0al+bgV)rw%cF%wdp2t2(zoYa=;l%9s z)wTIxZLdwPOKwPROm0eUPHs(ZKaU%HMBF&gxN$c9cat<;tbZ^0TWe@;kq{G52FN__xgQr z`NVrE|K8^E4apalZam*Wmd~he=S0u9*nf5@tQ~Ot6Kd-mpH}&=p2+%y@|Ps%>G2=s zhc|r2laf~_&q$65|B=l3nFEH;Hn%xGt~p5gITQW`hG40)cGt6yOab{kLphIjnK;4Ivo z;t%%Z5SM+?xkh&C$5@l-cK=d!9W`j!y`$Gk5j^wOW%;-MV#2bSMU}3F2!GS z&hdfIaL$XfF72*8?|Zvf;D!71{MHE(0 zowKvW^WlxNOuS>CJ5Br;zX8*vdB%rGvlI9h_C|2TGq?-kT+cAPF$PfwlLV$W%ntV9 zoxu0&s>6ZvI5IrJ6>Y46UB|b59R2>dd@}pD>wOMdTXWm1^l+-@;3r1*b>c(f42BE# z$#Y)4X&A6S*Cy$~0exNa!L3eSn$&LY+Bc6ouLqTV8qGIlW`x2KkNT_o{;hX9Nq*2kycVY>7wry*Zq1z3r1d zIgL|qu6{e`xhGqvxQc#tb+l)2{%mb$=AP$_CZ5{t{0htX4+qtmhg}@I1}AS#V88VZ zCgGCkuTI+9wKaxV%y{(?myhr8JS3b=9S*StH0*iq^Zf$<$!=^M;Wy?Pwl>2pXY$9j zNzUg4t|}Wo)CQ-AllZyuVfLhT&-3&QV;ii$_3{y?ej=N4$fl2<2)l!KJh>)G4^QF+ zu1HV4d@`K4p|o?nxx9V9HMzZX;w%n0fgfj+`~z+*`~)dZKXkX4_p^LMc2fG(SKx+N zqH@2Rbtj+SV}$Mb27Rw|_WzJyIDB{Me_#ENCZ*lA=iO91^0yYgXLyIZ+`0NVu*N}r z^BwSbVfE+zpYikE;2Awf7#n;1%=GV+|E&b}lhLrhi}KRLjV(Ps<%zZVwM}rMG3KnZ z@q=NQfrA}Su+n)s6SjlB;5(LV$#S-}o=HkO*Ew7F4#G#gCb4E?mmiyJe0K|2?2P6P z6JI7Sgw=N?=5*%06Fj!(GZ(w3FTn#i$6I}^wKd|*2;S^@>5b#V8Qip1<;IeR(=a@E z#{)KE(;tl!=kr5)NyeW@;|NX|cjv^$i&H<*8mwt}YrU;!_|P7}^&vdYyB&5qI|R34 zA$v2nN;(cKwLSG6@nX`~S4ZN)$Ssw(-{UWCO()|smc~uye2sse&p3A81UC+yg?p?u z;m9I(NSx21_0dPMl=9-7!L|FqS5|&5oxeETGr4c_)zyD-a@W##tp38}PNnabu8fa3 zY`mB|N?e)0PrA#ApO{$ZH(Nh@{-mDeSJN>5xa60UUn#$*l~=EB%ILlQRyT3f6Dr3I z(%8eVr}k4|ajUvDaae z9vdE3;dN{|443|hoWKuuf`70#1pc@5a6x_-&z=k?%ty>^|Jv8_5B3)y6F%(pIqaR- z5Z+<3=RL5)J^T2HZ2$NJ^~t37vbZrkuvhA|xh=V+bQ<=D3+4HTHK7m6)5ra6be&@x8-NBD@hv8Qxuc!^1d-I0>o_+0`&Dab3)R`=7jW%zteK>#z zHh1i9V-0p+Te&gQ&GFcW!w^1PnY=%NY56}(-~%tx6JOP4xhXl*Je}p7y}I}?_Vz8+ znVZHHm?M>mU*?%`VHdW1$1?1~t@XACvp#9-l(%M@*cWx@^TP8r){JM|oew)F?1%B~ z4{o%s)mnSbu^(c%s}kJy++lmi=GXzaJ`*w9C;d5q1FuFrhO-Z`VLcKRO) z+@DEq-+1A?l0#*Dg!vX+Y>tTo_zC#WH;nCz7YBaBc_+gaT!4e_;y59e@~zu%K$c=3 zb<3w$miX8Diw)bulwXC?6Z{K~@6#07BHnNHl_ zUW-N7Y}qlNIs4I`*fVFxpG<5E<6B&04EA#LTTk@h3r3ayY0`ZF#)k*-L9Dczm#7On z`#YD3BXHsa39h^)fiqhB#yjQ28!K<^6T57D9p1t*48!z>d3sOd0AB1IIpu=3c(HQ> zw>%%cb8hFw#s|LF8paP>OKasPW}j|O8B@`)+Qe@-?U-Ync@fiz63t6 z$$qgJoz*-iyRqAovptJCZL|G@0XCg9#@Ny~l{R*`9886u!3q4kTfF5YKX>Q&HQyty zOgHa`b7Hup&!3*i@WDJgCav8(@DIBie$6}F+={0^Hg}*?--!1&lqYA}FE$zWV7O--i6_H(`x#d4DGkdD+kb2P!3XKeal=@{ z1K7U3{ZctZ=!cV?uX{Ew@F7!HIiKPVjvogx6zs#j zbbjPW)VX(f$1CpI{E2VXe#60EEL$1>fHSzXe%i(f*bmdY?O)(OnY)BEju1T9Wb#}2 z_!hh%znW|@)7&NU5%cZ|CpKP)q2@Q|zhB#DB+uOBSb6qv&J?cLzpy&7jTpz-IT!b? zo?*3TXG=R<{=)vBDGk%b{DW_}*swdk!I&_!+t!c533qd2&HG#$-)cX;A^*S*kH3&s zXRXc0-;8g7SI-j{@N)MPgKgymANU8HpmBt6pttn+h^_syabjuA;oY`R{2xBddOROa zw4M?Eki4(*WbVPZarKD|=dUk)9;W9`#pb|bI2|5^X?kL!(uek)T|aL29AAuqBWvvr z>YPooZf7)HsC=ytZs5qAVP#7)W8z|5Sj0!+f64yI#UY{Exueqz4kZJh8uZ|>X0P!m7>etMUumyRRzt=d^TS3VzZ*jDyY*$2|j z^Gwg+JUWNj&$B&edA4Wb-&-n&f%@q8H*sRH^rqV2+?$iPm5vMU8_RnW{(zrK@L}RJ zypV=}>#OhB~@%6FbrFMn{3`*^jVn1GL9|60dN<3{gW@O8xx z8h7}D>JM>a?%=Q<=H0!?LOyeoI$0$*?kht}HTQ+)UkPAnTAc3#lRh6gx+C+Bfx z(vPbw89qqIhl#;1DNQy`OziZe>hNLb#O5pJ&i#9pC-XboI5EGsdQN3wX?aQdHHot) zf08H7|y`FKKh3fwtj58H0$kGyctL7A&)V}Y*@06Zf*YP07w}9UeLYJu>$YYb zz)zg^yw<$=2x)v6KhgT#n-6Eg1H8fVj`^^R7v4inoWYKUmxK8IY!a3aur3{*SNMg; z+QU7Yv^K7>m)gNPOsktd8}3(aD?g<91{~3M^8CccBXN>x_yXx-EHM{Os5@-_#C;>ba`MgY7u&mJd;}i+Qt4!Pvgs*{8#uy8 z;K3d<4KE&FIZpg)IxZ~9=qHx`jRXgNC;hwWr)=`nGzr3ov;CTAz%CP4cg-tE*L*< zn(uVY#({h5+Wf#8Z{4fst`P6%TkMtPZ)~sNI!w*oa>LJYx4&oGyD+(aW_x+pbnh}J z#(-6OY;QMgAIlHsU~BUi2m5@cd~;~a=HuR?ZTg4@bb=eJv6A5zjW6}#f3%~A7je)1 zzuI;?Db@p`j$TPDQ&Venwy*{@lw!8&ZgoH}JN4)?H_ zeIFYSzi&u(jI-abPxQr^Fu&p&somInSWkv4ab$QB=EvsaR&9+rZE-?d&uT2ZXil-x zXluD5=~*W>6c2fZ8xmN*K7A(54zv$PWpIfD)y=zA82F6#>F(8&yOtMYUr@R|8@p1Q zv^84?Izi z6MGpx5M!IazU=xjJo6Vg0q=uvzNGY&HNH8H>NXx7=*sX37go<1m-&w2Jb$>|vEhBN zPlx&O342<8mtSl@H#*7LpYH%p71o}4_T^wX2Sg%kY6 z@a58UyqLeCfQ?rr>@O`JP6jt`EFEqJtAA3Nc=@{cVc$Hn{ggi2b33au$xXGpA<3>T zaP?OSY$Yp+8*J~qgKE5aH>-^pgpJO(tj#&L-hkwYzOb_YrLyq9#E*%)YjgZ($rqKcY%sRtwXw$5$cLxdXPgjIwZ{{Ku|siW z#fh+vQ?Px2$KL%69^n*EI-f)Je8XyNZPUu9Ut_~OaUZ~w$@eS=V;D0YkImoof;*nI zdOSMij`G?UD@{yw5LZcW?_y8=!+&mX;eW^emfktBmM0TG@e?>f;{`wQ`|0N-FE0Jc z^he_aoQH+6_i)ALI{)xI_A)*G!+6h4o?khCaao#OZv4R#9F-qz!JBc^XRpWh-dLXB zXwRLCJwC8wY}T!{NygsBi{SIuLdT;@* zt`5&GLew^|~n`EBJ`uUcdXjCHHL{y!f&tUigjN@)ecEh55f7O3yo+&nzFF z*qX8T;ry`MeRoutjdSh}r+%XJq5U4bv-9Gc@OZpK(%Ou-)Ng^&aDH@8zy+L0q?NDr zgKKFV7|zz;STjc0r&sG^^EY0s@Lt_;U~9X^DKX)^i}D>0AMQAE^35(T?6H%WiLC$k ziN=q?{&{>j&2N18h@5zGVM>%zGewczI<6CW#!cxs!6)(;@U(;x?<9vGUtBu-?|0Ypw>95d z`8S-D9V+85=HGd_Ph(tEI_~&;G=B>%j>0SU_{iqNX_&*awb+Y49vt%z{6y=ReU2*! ze1Yxyjh%`MgKho7?gFb}eyPp6@n?x62hzA}m_ERA+=Oc}+hDurTI2Cb^FJ^yjWZiJ zj-DSs)K#wkfk>b5;jjPAGq(Si5^>LOCt-cw8$G%7?W_QoIPYO z^A~exHfCe_CNX#H-!IMn<3q8}+zH@29F1Ls_pmis#tZY4mn8fGf5O(Xsp5*tVNPr@ zcKOxi#U<>lxCAfa%h-SO+_=Tro9(gRD|^~`!P0X5N&C4&$Je=o!{Jp4ZZ$7#&buer zto>kCnflf~oU#Yj0{_;B7uEy&%HqoC(mOBIO+C#HXz#f^Yx^_rjjl_(Q}isuLp+Wj z!ynICTs7~it?TB}@j^VcvbSMsu=M$*zbI_pqx{$O?B7`ao74A8SLU~*$NYxa%HOQb zzr!tm_tN$C`_lQHL|lNq`CSp;f*0*8TR-?eTRu)4(rnN0Gk<+(EyJhUveEE-G!9ThB?^cD<&?-AGpl#tZzzM z)BH~7)-+$;zO3z^-;N#I&v}P!&)G7#yE?%k_~W1OkPm}T9C=&mIIyHAj*k=b8&aIm z2A{(7_&)2lH^d&qhw&45A#L6C#+Q{Qc=4LVUjAYAo~d#9%GqP Date: Mon, 8 Jul 2024 15:19:39 +1000 Subject: [PATCH 030/187] fix: make sure dependencies are right --- a | 16 ---------------- dependencies.txt | 2 +- 2 files changed, 1 insertion(+), 17 deletions(-) delete mode 100644 a diff --git a/a b/a deleted file mode 100644 index c2b48339..00000000 --- a/a +++ /dev/null @@ -1,16 +0,0 @@ - add_multiple_thicknesses - fix/lines_polys2 - fix/map_data_bug - fix/multiple_thickness_estimates - fix/needed-fields - fix/needed_fields_2 - fix/numpy_version - fix/random_colors - fix/thickness_calcs -* fix/thicknesses_AR_2 - fix_issue_templates_remove_value - fix_thicknesses_AR - master - sample_storage_3 - testing_plots_sorters - v3.2 diff --git a/dependencies.txt b/dependencies.txt index 4c52daee..97d6c443 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -4,5 +4,5 @@ networkx owslib map2model hjson -loopprojectfile>=0.1.3 +loopprojectfile==0.1.4 beartype \ No newline at end of file From 7deae3c92f01eae127656db3a373295e6021af97 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 8 Jul 2024 15:31:22 +1000 Subject: [PATCH 031/187] fix: linting issue --- .../InterpolatedStructure/test_interpolated_structure.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index 986b57df..76acddb5 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -284,11 +284,11 @@ def test_compute( assert ( 'ThicknessMean' in result.columns ), 'Thickness not being calculated in InterpolatedStructure calculator' - assert result['ThicknessMedian'].dtypes == float, 'ThicknessMedian column is not float' + assert result['ThicknessMedian'].dtypes is float, 'ThicknessMedian column is not float' assert ( 'ThicknessStdDev' in result.columns ), 'Thickness std not being calculated in InterpolatedStructure calculator' - assert result['ThicknessStdDev'].dtypes == float, 'ThicknessStdDev column is not float' + assert result['ThicknessStdDev'].dtypes is float, 'ThicknessStdDev column is not float' # check for nas in thickness assert result['ThicknessMedian'].isna().sum() == 0, 'ThicknessMedian column has NaNs' From ff42327e7f360103b2c677121b3a4974019e4c30 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 8 Jul 2024 16:04:41 +1000 Subject: [PATCH 032/187] fix: try again --- .../InterpolatedStructure/test_interpolated_structure.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index 76acddb5..8388359f 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -18,6 +18,7 @@ from map2loop.sampler import SamplerSpacing, SamplerDecimator from map2loop.m2l_enums import Datatype import map2loop +import numpy def create_raster(output_path, bbox, epsg, pixel_size, value=100): @@ -272,6 +273,8 @@ def test_compute( result = interpolated_structure_thickness.compute( units, stratigraphic_order, basal_contacts, samples, map_data ) + print('HERE', result.dtypes) + assert ( interpolated_structure_thickness.thickness_calculator_label == "InterpolatedStructure" ), 'Thickness_calc interpolated structure not being set properly' @@ -284,11 +287,11 @@ def test_compute( assert ( 'ThicknessMean' in result.columns ), 'Thickness not being calculated in InterpolatedStructure calculator' - assert result['ThicknessMedian'].dtypes is float, 'ThicknessMedian column is not float' + assert result['ThicknessMedian'].dtypes == numpy.float64, 'ThicknessMedian column is not float' assert ( 'ThicknessStdDev' in result.columns ), 'Thickness std not being calculated in InterpolatedStructure calculator' - assert result['ThicknessStdDev'].dtypes is float, 'ThicknessStdDev column is not float' + assert result['ThicknessStdDev'].dtypes == numpy.float64, 'ThicknessStdDev column is not float' # check for nas in thickness assert result['ThicknessMedian'].isna().sum() == 0, 'ThicknessMedian column has NaNs' From f256ca8b1118828a63d9c59ed3c6e8ffeac4796d Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 8 Jul 2024 17:13:31 +1000 Subject: [PATCH 033/187] fix: update thickness tests//fix minor typos --- map2loop/deformation_history.py | 1 - map2loop/mapdata.py | 2 +- map2loop/project.py | 3 +- map2loop/thickness_calculator.py | 1 - map2loop/utils.py | 2 - .../test_thickness_StructuralPoint_server.py | 69 --------- .../test_ThicknessCalculatorAlpha.py | 138 ++++++++++++++++++ 7 files changed, 141 insertions(+), 75 deletions(-) delete mode 100644 tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py create mode 100644 tests/thickness/test_ThicknessCalculatorAlpha.py diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index e6d80d22..2fe36310 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -30,7 +30,6 @@ def __init__(self): """ The initialiser for the deformation history. All attributes are defaulted """ - # I want to get the minimum fault length to export from the config dictionary in proj self.minimum_fault_length_to_export = 0.0 self.history = [] diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index edabec2b..5e95bb6a 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -908,7 +908,7 @@ def parse_fault_map(self) -> tuple: # Create new geodataframe faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) - # crop by minimum fault lenght + # crop by minimum fault length self.minimum_fault_length = 0.0 try: diff --git a/map2loop/project.py b/map2loop/project.py index 855c99b2..49fd54d8 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -226,7 +226,8 @@ def __init__( # 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)) - # only + + # only define the minimum fault length if there are faults if len(self.map_data.get_map_data(Datatype.FAULT))!=0: self.deformation_history.set_minimum_fault_length(self.map_data.minimum_fault_length) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index b1fc9896..001abd5e 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -461,7 +461,6 @@ def compute( sampled_basal_contacts = rebuild_sampled_basal_contacts( basal_contacts, map_data.sampled_contacts ) - sampled_basal_contacts.plot() # calculate map dimensions map_dx = geology.total_bounds[2] - geology.total_bounds[0] diff --git a/map2loop/utils.py b/map2loop/utils.py index cff711a8..cc50663e 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -299,8 +299,6 @@ def rebuild_sampled_basal_contacts( crs=basal_contacts.crs, columns=['basal_unit'], ) - - # return sampled_basal_contacts diff --git a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py b/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py deleted file mode 100644 index 819e6391..00000000 --- a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_server.py +++ /dev/null @@ -1,69 +0,0 @@ -# # This test runs on a portion of the dataset in https://github.com/Loop3D/m2l3_examples/tree/main/Laurent2016_V2_variable_thicknesses (only for lithologies E, F, and G) -# # structures are confined to litho_F, and the test confirms if the StructuralPoint thickness is calculated, for all lithologies, if the thickness is correct for F (~90 m), and top/bottom units are assigned -1 -# # this creates a temp folder in Appdata to store the data to run the proj, checks the thickness, and then deletes the temp folder -# # this was done to avoid overflow of file creation in the tests folder - -# # this tests the thickness calculator Structural Point from a server - -# #internal imports -# from map2loop.thickness_calculator import StructuralPoint -# from map2loop.project import Project -# from map2loop.m2l_enums import VerboseLevel - -# #external imports -# import pathlib -# import pytest -# import requests -# import map2loop - - -# def test_from_aus_state(): - -# bbox_3d = { -# "minx": 515687.31005864, -# "miny": 7493446.76593407, -# "maxx": 562666.860106543, -# "maxy": 7521273.57407786, -# "base": -3200, -# "top": 3000, -# } -# loop_project_filename = "wa_output.loop3d" -# module_path = map2loop.__file__.replace("__init__.py", "") - -# try: -# proj = Project( -# use_australian_state_data="WA", -# working_projection="EPSG:28350", -# bounding_box=bbox_3d, -# config_filename=pathlib.Path(module_path) -# / pathlib.Path('_datasets') -# / pathlib.Path('config_files') -# / pathlib.Path('WA.json'), -# clut_filename=pathlib.Path(module_path) -# / pathlib.Path('_datasets') -# / pathlib.Path('clut_files') -# / pathlib.Path('WA_clut.csv'), -# # clut_file_legacy=False, -# verbose_level=VerboseLevel.NONE, -# loop_project_filename=loop_project_filename, -# overwrite_loopprojectfile=True, -# ) - -# except (requests.exceptions.RequestException, requests.exceptions.ReadTimeout) as e: -# if "HTTPConnectionPool" in str(e) or isinstance(e, requests.exceptions.ReadTimeout): -# pytest.skip("Connection to the server timed out, skipping test") -# else: -# raise # Re-raise the exception if it's not server unavailable - -# proj.set_thickness_calculator(StructuralPoint()) -# proj.run_all() -# print("from the test", proj.stratigraphic_column.stratigraphicUnits.columns) -# assert ( -# proj.thickness_calculator.sorter_label == "StructuralPoint" -# ), 'Thickness_calc structural point not being set properly' -# assert ( -# "ThicknessMedian" in proj.stratigraphic_column.stratigraphicUnits.columns -# ), 'Thickness not being calculated in StructuralPointCalculator' -# assert ( -# "ThicknessStdDev" in proj.stratigraphic_column.stratigraphicUnits.columns -# ), 'Thickness std not being calculated in StructuralPointCalculator' diff --git a/tests/thickness/test_ThicknessCalculatorAlpha.py b/tests/thickness/test_ThicknessCalculatorAlpha.py new file mode 100644 index 00000000..e1af873f --- /dev/null +++ b/tests/thickness/test_ThicknessCalculatorAlpha.py @@ -0,0 +1,138 @@ +import pandas +import geopandas +import pytest +import numpy + +from map2loop.mapdata import MapData +from map2loop.thickness_calculator import ThicknessCalculatorAlpha + +### 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, 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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], + '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] +}) + +md = MapData() + +# 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})" + + +def test_calculate_thickness(): + # Run the calculation + thickness_calculator = ThicknessCalculatorAlpha() + md.sampled_contacts = s_c + result = thickness_calculator.compute( + units=st_units, + stratigraphic_order=st_column, + basal_contacts= bc_gdf, + structure_data=structures, + map_data=md + ) + + # is thickness calc alpha the label? + assert thickness_calculator.thickness_calculator_label == 'ThicknessCalculatorAlpha', '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' \ No newline at end of file From 2451679e56544d19b89bc664019c954d6120d60a Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 9 Jul 2024 09:18:30 +1000 Subject: [PATCH 034/187] fix: correct some typos/update tests --- map2loop/thickness_calculator.py | 4 +- .../test_set_get_recreate_bounding_box.py | 2 +- .../test_set_get_working_projection.py | 6 +- tests/project/test_plot_hamersley.py | 6 - tests/project/test_thickness_calculations.py | 34 +- .../test_interpolated_structure.py | 450 ++++++------------ .../test_ThicknessStructuralPoint.py | 152 ++++++ ..._thickness_StructuralPoint_local_source.py | 261 ---------- .../test_ThicknessCalculatorAlpha.py | 27 +- 9 files changed, 353 insertions(+), 589 deletions(-) create mode 100644 tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py delete mode 100644 tests/thickness/StructurePoint/test_thickness_StructuralPoint_local_source.py rename tests/thickness/{ => ThicknessCalculatorAlpha}/test_ThicknessCalculatorAlpha.py (95%) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 001abd5e..d291b10f 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -237,7 +237,7 @@ def compute( thicknesses["ThicknessMedian"] = -1.0 thicknesses['ThicknessMean'] = -1.0 # thicknesses["ThicknessStdDev"] is the standard deviation of the thickness of the unit - thicknesses["ThicknessStdDev"] = 0 + 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 @@ -393,7 +393,7 @@ class StructuralPoint(ThicknessCalculator): ''' def __init__(self): - self.sorter_label = "StructuralPoint" + self.thickness_calculator_label = "StructuralPoint" self.line_length = 10000 self.strike_allowance = 30 diff --git a/tests/mapdata/test_set_get_recreate_bounding_box.py b/tests/mapdata/test_set_get_recreate_bounding_box.py index a124feaa..51229d49 100644 --- a/tests/mapdata/test_set_get_recreate_bounding_box.py +++ b/tests/mapdata/test_set_get_recreate_bounding_box.py @@ -1,5 +1,5 @@ import pytest -from map2loop.mapdata import MapData # Replace with the actual module and class name +from map2loop.mapdata import MapData import geopandas import shapely diff --git a/tests/mapdata/test_set_get_working_projection.py b/tests/mapdata/test_set_get_working_projection.py index c0c74e3f..85285f01 100644 --- a/tests/mapdata/test_set_get_working_projection.py +++ b/tests/mapdata/test_set_get_working_projection.py @@ -24,14 +24,14 @@ ] ) def test_set_working_projection(projection, expected_projection, bounding_box, expected_warning, capsys): - # Arrange + map_data = MapData() map_data.bounding_box = bounding_box - # Act + map_data.set_working_projection(projection) - # Assert + assert map_data.working_projection == expected_projection, "Map.data set_working_projection() not attributing the correct projection" if expected_warning: diff --git a/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py index 8ed39f72..e4daf800 100644 --- a/tests/project/test_plot_hamersley.py +++ b/tests/project/test_plot_hamersley.py @@ -22,12 +22,6 @@ loop_project_filename = "wa_output.loop3d" -def remove_LPF(): - lpf_exists = os.path.exists(loop_project_filename) - if lpf_exists: - os.remove(loop_project_filename) - - def test_project_execution(): try: proj = Project( diff --git a/tests/project/test_thickness_calculations.py b/tests/project/test_thickness_calculations.py index 876a8179..64772292 100644 --- a/tests/project/test_thickness_calculations.py +++ b/tests/project/test_thickness_calculations.py @@ -1,15 +1,11 @@ # imports import pandas import geopandas -import shapely import pytest - +import numpy from map2loop._datasets.geodata_files import load_map2loop_data from map2loop import Project -from map2loop.thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint -from map2loop.mapdata import MapData -from map2loop.m2l_enums import Datatype, Datastate # 1. self.stratigraphic_column.stratigraphicUnits, @@ -140,14 +136,22 @@ def test_calculate_unit_thicknesses(): project.calculate_unit_thicknesses() # Check if thicknesses have been calculated - assert 'ThicknessMean_ThicknessCalculatorAlpha' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMean_ThicknessCalculatorAlpha not in columns" - assert 'ThicknessMedian_ThicknessCalculatorAlpha' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMedian_ThicknessCalculatorAlpha not in columns" - assert 'ThicknessStdDev_ThicknessCalculatorAlpha' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessStdDev_ThicknessCalculatorAlpha not in columns" - - assert 'ThicknessMean_InterpolatedStructure' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMean_InterpolatedStructure not in columns" - assert 'ThicknessMedian_InterpolatedStructure' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMedian_InterpolatedStructure not in columns" - assert 'ThicknessStdDev_InterpolatedStructure' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessStdDev_InterpolatedStructure not in columns" + columns_to_check = [ + 'ThicknessMean_ThicknessCalculatorAlpha', + 'ThicknessMedian_ThicknessCalculatorAlpha', + 'ThicknessStdDev_ThicknessCalculatorAlpha', + 'ThicknessMean_InterpolatedStructure', + 'ThicknessMedian_InterpolatedStructure', + 'ThicknessStdDev_InterpolatedStructure', + 'ThicknessMean_StructuralPoint', + 'ThicknessMedian_StructuralPoint', + 'ThicknessStdDev_StructuralPoint' + ] - assert 'ThicknessMean_StructuralPoint' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMean_StructuralPoint not in columns" - assert 'ThicknessMedian_StructuralPoint' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessMedian_StructuralPoint not in columns" - assert 'ThicknessStdDev_StructuralPoint' in project.stratigraphic_column.stratigraphicUnits.columns, "ThicknessStdDev_StructuralPoint not in columns" + for column in columns_to_check: + assert column in project.stratigraphic_column.stratigraphicUnits.columns, f"project::calculate_unit_thicknesses: column {column} not in thickness results" + assert project.stratigraphic_column.stratigraphicUnits[column].dtype == numpy.float64, f"project::calculate_unit_thicknesses: column {column} is not of type numpy.float64" + assert not project.stratigraphic_column.stratigraphicUnits[column].isna().any(), f"project::calculate_unit_thicknesses: column {column} contains NaNs" + + 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' \ No newline at end of file diff --git a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index d330153e..f5ae3b47 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -1,294 +1,156 @@ -# # This test runs on a portion of the dataset in https://github.com/Loop3D/m2l3_examples/tree/main/Laurent2016_V2_variable_thicknesses (only for lithologies E, F, and G) -# # structures are confined to litho_F, and the test confirms if the StructuralPoint thickness is calculated, for all lithologies, if the thickness is correct for F (~90 m), and top/bottom units are assigned -1 -# # this creates a temp folder in Appdata to store the data to run the proj, checks the thickness, and then deletes the temp folder -# # this was done to avoid overflow of file creation in the tests folder - -# ### This file tests the function InterpolatedStructure thickness calculator - -# import pytest -# import pandas as pd -# from map2loop.thickness_calculator import InterpolatedStructure -# from map2loop.project import Project -# from osgeo import gdal, osr -# import os -# import shapely -# import geopandas -# import tempfile -# import pathlib -# from map2loop.sampler import SamplerSpacing, SamplerDecimator -# from map2loop.m2l_enums import Datatype -# import map2loop - - -# def create_raster(output_path, bbox, epsg, pixel_size, value=100): -# minx, miny, maxx, maxy = bbox -# cols = int((maxx - minx) / pixel_size) -# rows = int((maxy - miny) / pixel_size) -# driver = gdal.GetDriverByName('GTiff') -# out_raster = driver.Create(output_path, cols, rows, 1, gdal.GDT_Byte) -# out_raster.SetGeoTransform([minx, pixel_size, 0, maxy, 0, -pixel_size]) -# srs = osr.SpatialReference() -# srs.ImportFromEPSG(epsg) -# out_raster.SetProjection(srs.ExportToWkt()) -# out_band = out_raster.GetRasterBand(1) -# out_band.Fill(value) -# out_band.FlushCache() -# out_raster = None - - -# geology = [ -# { -# 'UNITNAME': 'Litho_E', -# 'geometry': 'POLYGON ((9795.91836734694 9931.26849738919, 9860.73785898637 9795.91836734694, 9935.33621028978 9591.836734693878, 9950.618354641661 9387.755102040817, 10000 9210.342095822705, 10000 8757.661313426739, 9957.613263811385 8571.428571428572, 9795.91836734694 8453.228230379065, 9591.836734693878 8459.27180076132, 9387.755102040817 8424.58063242387, 9183.673469387755 8396.186050103635, 8979.591836734695 8375.328219666773, 8775.510204081633 8142.6900746871015, 8533.835897640307 7959.183673469388, 8367.34693877551 7832.006337691327, 8271.702357700893 7755.102040816327, 8163.265306122449 7660.1472192881065, 8074.276982521525 7551.0204081632655, 7959.183673469388 7424.887053820552, 7876.85861392897 7346.938775510204, 7755.102040816327 7225.488935198103, 7672.260829380581 7142.857142857143, 7551.0204081632655 7021.922675930724, 7447.64756183235 6938.775510204082, 7346.938775510204 6858.865387585699, 7149.179419692682 6734.693877551021, 6938.775510204082 6628.052847726005, 6734.693877551021 6533.238936443719, 6530.6122448979595 6522.261950434471, 6326.530612244898 6520.453083271883, 6122.448979591837 6525.756680235571, 5918.367346938776 6543.242785395409, 5714.285714285715 6570.203352947625, 5510.2040816326535 6597.437955895249, 5306.122448979592 6623.455748266104, 5102.040816326531 6558.673625089685, 5021.544086689852 6530.6122448979595, 4897.95918367347 6484.284692881059, 4648.165410878707 6326.530612244898, 4456.931912169165 6122.448979591837, 4285.714285714286 5949.72882952009, 4081.6326530612246 5747.855828732861, 3877.5510204081634 5481.342782779616, 3673.469387755102 5299.687677500199, 3469.387755102041 5113.124847412109, 3233.5997600944675 4897.95918367347, 3061.2244897959185 4761.364995216837, 2978.9564560870735 4693.877551020409, 2857.1428571428573 4509.9974651725925, 2727.7656477324817 4285.714285714286, 2653.061224489796 4194.911256128428, 2620.9440036695833 4081.6326530612246, 2653.061224489796 3834.8668935347578, 2714.296846973653 3673.469387755102, 2767.1924902468313 3469.387755102041, 2857.1428571428573 3316.1486411581236, 2932.2801317487447 3265.3061224489797, 3061.2244897959185 3201.1586792615, 3265.3061224489797 3115.340836194097, 3411.8516104561945 3061.2244897959185, 3469.387755102041 3039.713489766024, 3673.469387755102 2953.3901993109257, 3877.5510204081634 2900.4941667829244, 4081.6326530612246 2919.088869678731, 4285.714285714286 2942.9248887665417, 4489.795918367347 2963.555199759347, 4693.877551020409 2917.314840822804, 4809.648941974251 2857.1428571428573, 4897.95918367347 2811.5255005505624, 5102.040816326531 2712.551039092395, 5243.474220742985 2653.061224489796, 5306.122448979592 2627.6203077666614, 5510.2040816326535 2402.532733216578, 5649.461551588409 2244.8979591836737, 5714.285714285715 2173.8852286825377, 5838.211215272242 2040.8163265306123, 5918.367346938776 1953.0603836993782, 6037.69419144611 1836.734693877551, 6122.448979591837 1756.0881011340084, 6277.958616918448 1632.6530612244899, 6326.530612244898 1595.732338574468, 6532.909626863441 1428.5714285714287, 6734.693877551021 1276.012440117038, 6876.561690349969 1224.4897959183675, 6938.775510204082 1201.8953050885882, 7142.857142857143 1139.765856217365, 7346.938775510204 1082.3855108144332, 7551.0204081632655 1067.0050796197386, 7755.102040816327 1078.0507691052496, 7995.249689841758 1020.4081632653061, 8163.265306122449 949.2362275415538, 8367.34693877551 868.0756238042093, 8499.189882862325 816.3265306122449, 8571.428571428572 789.4330608601473, 8775.510204081633 723.8424554163096, 8902.20797791773 612.2448979591837, 8979.591836734695 360.74278305987923, 8979.591836734695 180.16181430038142, 8858.95553900271 0, 6046.468258728215 0, 5863.85825506431 296.3535950262776, 5435.566874501761 724.6449755888261, 5282.605667157994 908.1984244013456, 4900.202648798577 1122.3441146826208, 4638.256581222377 1168.2324768857502, 4454.703132409856 1154.8483712431703, 4190.845049741858 1118.520084499026, 3988.1714500113685 1181.6165825283297, 3642.0967183960943 1311.6336087705313, 3024.5158437456353 1594.6118423565003, 2573.2802820815227 1816.4055930049626, 2175.581142987729 2107.0318869581197, 1831.4184264642531 2558.267448622232, 1380.1828648001406 2910.078225512896, 531.2481640422343 3177.7603383644882, 0 3187.497507640264, 0 4970.218705429992, 78.1005872863268 5095.511475436967, 303.71836811838307 5355.545527921371, 739.6578090481191 5745.596606647977, 904.0911069426686 5887.085723440961, 1297.9662158528683 6024.750810050351, 1787.4420793529227 6116.527534456612, 2169.8450977123402 6135.647685374583, 2498.711693501439 6185.3600777613065, 3003.4836777358705 6261.84068143319, 3485.311480868737 6430.098009511334, 3798.881955923459 6705.428182730114, 4250.1175175875715 7240.792408433298, 4731.945320720438 7638.491547527093, 5297.901787892375 7982.654264050569, 5802.673772126806 8112.67129029277, 6276.853514892484 8303.87279947248, 6712.79295582222 8609.795214160013, 6896.346404634739 8785.700602605346, 6995.771189408188 8969.254051417865, 6942.234766837869 9206.343922800705, 6766.329378392537 9558.154699691368, 6414.518601501873 9986.446080253916, 6402.234572809949 10000, 9765.614100864956 10000, 9795.91836734694 9931.26849738919))', -# 'GROUP': 'A', -# 'ID': 0, -# }, -# { -# 'UNITNAME': 'Litho_F', -# 'geometry': 'MULTIPOLYGON (((8979.591836734695 360.74278305987923, 8902.20797791773 612.2448979591837, 8775.510204081633 723.8424554163096, 8571.428571428572 789.4330608601473, 8499.189882862325 816.3265306122449, 8367.34693877551 868.0756238042093, 8163.265306122449 949.2362275415538, 7995.249689841758 1020.4081632653061, 7755.102040816327 1078.0507691052496, 7551.0204081632655 1067.0050796197386, 7346.938775510204 1082.3855108144332, 7142.857142857143 1139.765856217365, 6938.775510204082 1201.8953050885882, 6876.561690349969 1224.4897959183675, 6734.693877551021 1276.012440117038, 6532.909626863441 1428.5714285714287, 6326.530612244898 1595.732338574468, 6277.958616918448 1632.6530612244899, 6122.448979591837 1756.0881011340084, 6037.69419144611 1836.734693877551, 5918.367346938776 1953.0603836993782, 5838.211215272242 2040.8163265306123, 5714.285714285715 2173.8852286825377, 5649.461551588409 2244.8979591836737, 5510.2040816326535 2402.532733216578, 5306.122448979592 2627.6203077666614, 5243.474220742985 2653.061224489796, 5102.040816326531 2712.551039092395, 4897.95918367347 2811.5255005505624, 4809.648941974251 2857.1428571428573, 4693.877551020409 2917.314840822804, 4489.795918367347 2963.555199759347, 4285.714285714286 2942.9248887665417, 4081.6326530612246 2919.088869678731, 3877.5510204081634 2900.4941667829244, 3673.469387755102 2953.3901993109257, 3592.122504199657 2987.798639529117, 3469.387755102041 3039.713489766024, 3411.8516104561945 3061.2244897959185, 3265.3061224489797 3115.340836194097, 3061.2244897959185 3201.1586792615, 2932.2801317487447 3265.3061224489797, 2857.1428571428573 3316.1486411581236, 2767.1924902468313 3469.387755102041, 2714.296846973653 3673.469387755102, 2653.061224489796 3834.8668935347578, 2620.9440036695833 4081.6326530612246, 2653.061224489796 4194.911256128428, 2727.7656477324817 4285.714285714286, 2857.1428571428573 4509.9974651725925, 2978.9564560870735 4693.877551020409, 3061.2244897959185 4761.364995216837, 3233.5997600944675 4897.95918367347, 3469.387755102041 5113.124847412109, 3673.469387755102 5299.687677500199, 3877.5510204081634 5481.342782779616, 4081.6326530612246 5747.855828732861, 4285.714285714286 5949.72882952009, 4456.931912169165 6122.448979591837, 4648.165410878707 6326.530612244898, 4897.95918367347 6484.284692881059, 5021.544086689852 6530.6122448979595, 5102.040816326531 6558.673625089685, 5306.122448979592 6623.455748266104, 5510.2040816326535 6597.437955895249, 5714.285714285715 6570.203352947625, 5918.367346938776 6543.242785395409, 6122.448979591837 6525.756680235571, 6326.530612244898 6520.453083271883, 6530.6122448979595 6522.261950434471, 6734.693877551021 6533.238936443719, 6938.775510204082 6628.052847726005, 7149.179419692682 6734.693877551021, 7346.938775510204 6858.865387585699, 7447.64756183235 6938.775510204082, 7551.0204081632655 7021.922675930724, 7672.260829380581 7142.857142857143, 7755.102040816327 7225.488935198103, 7876.85861392897 7346.938775510204, 7959.183673469388 7424.887053820552, 8074.276982521525 7551.0204081632655, 8163.265306122449 7660.1472192881065, 8271.702357700893 7755.102040816327, 8367.34693877551 7832.006337691327, 8533.835897640307 7959.183673469388, 8775.510204081633 8142.6900746871015, 8979.591836734695 8375.328219666773, 9183.673469387755 8396.186050103635, 9387.755102040817 8424.58063242387, 9591.836734693878 8459.27180076132, 9795.91836734694 8453.228230379065, 9957.613263811385 8571.428571428572, 10000 8757.661313426739, 10000 8427.640566256101, 9796.219398903246 8371.275719144232, 9383.517404828015 8331.33681649179, 9143.883988913365 8300.273225539891, 8984.1283783036 8184.894173432836, 8771.120897490577 7976.324348470085, 8398.357806067788 7714.50265330408, 8078.846584848256 7359.490185282376, 7683.89521417411 6951.225847057416, 7209.066038195081 6636.152281688155, 6805.239355820393 6449.77073597676, 6294.908933039194 6432.020112575675, 5984.273023520203 6427.582456725404, 5673.6371140012125 6480.834326928666, 5376.314172033036 6489.709638629209, 5145.556067818929 6445.333080126496, 4910.36030775455 6347.704651420527, 4777.230632246412 6223.450287612931, 4542.034872182033 6063.6946770031645, 4324.58973551874 5824.061261088515, 4129.332878106803 5593.303156874407, 3925.2007089943236 5389.170987761928, 3734.3815074326594 5176.163506948902, 3494.7480915180095 5020.8455521894075, 3263.9899873039026 4830.026350627742, 2993.2929804373534 4554.891687910922, 2846.850337378401 4315.258271996272, 2735.908941121619 4088.937823632436, 2780.285499624332 3840.429096017244, 2842.4126815281297 3560.8567774501525, 2944.4787660843695 3361.162264187944, 3082.0460974427792 3294.5974264338747, 3379.369039410956 3170.343062626279, 3845.322903689442 3028.338075417598, 4013.9538259997507 3037.2133871181404, 4320.15207966847 3032.7757312678687, 4542.034872182035 3028.338075417598, 4684.039859390716 2983.9615169148847, 4897.047340203738 2886.333088208916, 5189.932626321643 2766.5163802515917, 5358.563548631952 2673.3256073958946, 5465.067289038463 2611.198425492096, 5744.639607605554 2273.9365808714774, 6246.09471868621 1776.9191256410927, 6641.046089360355 1435.2196251702035, 6822.989979221478 1324.2782289134211, 6978.307933980974 1275.4640145604371, 7311.13212275132 1195.5862092555535, 7444.261798259459 1168.960274153926, 7666.144590773023 1160.0849624533835, 7870.2767598855025 1155.6473066031122, 8052.220649746626 1093.5201246993138, 8331.792968313717 987.0163842928032, 8460.484987971584 920.4515465387335, 8713.43137143705 845.0113970841217, 8855.43635864573 782.8842151803237, 8975.253066603054 671.9428189235414, 9010.754313405225 565.4390785170299, 9046.255560207395 410.1211237575353, 9068.443839458752 281.4291040996677, 9050.693216057667 179.36301954342798, 9006.316657554953 90.60990253800173, 8972.337944103203 0, 8858.95553900271 0, 8979.591836734695 180.16181430038142, 8979.591836734695 360.74278305987923)), ((9935.33621028978 9591.836734693878, 9860.73785898637 9795.91836734694, 9795.91836734694 9931.26849738919, 9765.614100864956 10000, 9959.7366093588 10000, 10000 9899.990932923472, 10000 9210.342095822705, 9950.618354641661 9387.755102040817, 9935.33621028978 9591.836734693878)))', -# 'GROUP': 'A', -# 'ID': 1, -# }, -# { -# 'UNITNAME': 'Litho_G', -# 'geometry': 'MULTIPOLYGON (((9591.836734693878 7392.409188406808, 9387.755102040817 7366.494159309232, 9183.673469387755 7310.6236360511, 8979.591836734695 7251.495049924267, 8775.510204081633 7185.4665328045285, 8691.716875348773 7142.857142857143, 8571.428571428572 7060.166183783084, 8423.547550123565 6938.775510204082, 8367.34693877551 6891.931806291853, 8163.265306122449 6717.05674151985, 7959.183673469388 6524.418032899195, 7755.102040816327 6316.720222940251, 7530.765922702089 6122.448979591837, 7346.938775510204 5999.901440678811, 7186.986962143256 5918.367346938776, 6938.775510204082 5793.479608029736, 6734.693877551021 5711.484247324418, 6530.6122448979595 5688.577768753987, 6326.530612244898 5674.85692549725, 6122.448979591837 5664.018903459822, 5918.367346938776 5686.95963645468, 5808.41181229572 5714.285714285715, 5714.285714285715 5737.67798287528, 5510.2040816326535 5789.896906638633, 5306.122448979592 5803.500194938816, 5144.4244384765625 5714.285714285715, 4837.004213917013 5510.2040816326535, 4693.877551020409 5412.657990747569, 4564.6032995107225 5306.122448979592, 4489.795918367347 5235.455182133889, 4285.714285714286 4940.409368398238, 4169.117285280811 4693.877551020409, 4290.969225825096 4489.795918367347, 4489.795918367347 4401.180111632056, 4588.951967200454 4285.714285714286, 4693.877551020409 4151.690736108897, 4830.671037946428 3877.5510204081634, 5102.040816326531 3725.3519953513633, 5306.122448979592 3618.5887395119184, 5510.2040816326535 3357.1418450803176, 5714.285714285715 3090.5887058803014, 5921.393024678133 2857.1428571428573, 6122.448979591837 2649.130140032087, 6354.4265591368385 2448.979591836735, 6530.6122448979595 2314.575934896664, 6621.950889120297 2244.8979591836737, 6938.775510204082 2057.7853066580637, 7142.857142857143 1991.364809931541, 7346.938775510204 1953.759679988939, 7551.0204081632655 1939.4851217464525, 7755.102040816327 1938.7210145288584, 7959.183673469388 1951.3825007847379, 8163.265306122449 1964.9159178441885, 8571.428571428572 1920.2366653753788, 8784.97298882932 1836.734693877551, 9174.578141193 1632.6530612244899, 9387.755102040817 1516.645976475307, 9736.033069844148 1224.4897959183675, 10000 887.0183205117985, 10000 0, 8972.337944103203 0, 9006.316657554953 90.60990253800173, 9050.693216057667 179.36301954342798, 9068.443839458752 281.4291040996677, 9046.255560207395 410.1211237575353, 9010.754313405225 565.4390785170299, 8975.253066603054 671.9428189235414, 8855.43635864573 782.8842151803237, 8713.43137143705 845.0113970841217, 8460.484987971584 920.4515465387335, 8331.792968313717 987.0163842928032, 8052.220649746626 1093.5201246993138, 7870.2767598855025 1155.6473066031122, 7666.144590773023 1160.0849624533835, 7444.261798259459 1168.960274153926, 7311.13212275132 1195.5862092555535, 6978.307933980974 1275.4640145604371, 6822.989979221478 1324.2782289134211, 6641.046089360355 1435.2196251702035, 6246.09471868621 1776.9191256410927, 5744.639607605554 2273.9365808714774, 5465.067289038463 2611.198425492096, 5358.563548631952 2673.3256073958946, 5189.932626321643 2766.5163802515917, 4897.047340203738 2886.333088208916, 4684.039859390716 2983.9615169148847, 4542.034872182035 3028.338075417598, 4320.15207966847 3032.7757312678687, 4013.9538259997507 3037.2133871181404, 3845.322903689442 3028.338075417598, 3379.369039410956 3170.343062626279, 3082.0460974427792 3294.5974264338747, 2944.4787660843695 3361.162264187944, 2842.4126815281297 3560.8567774501525, 2780.285499624332 3840.429096017244, 2735.908941121619 4088.937823632436, 2846.850337378401 4315.258271996272, 2993.2929804373534 4554.891687910922, 3263.9899873039026 4830.026350627742, 3494.7480915180095 5020.8455521894075, 3734.3815074326594 5176.163506948902, 3925.2007089943236 5389.170987761928, 4129.332878106803 5593.303156874407, 4324.58973551874 5824.061261088515, 4542.034872182033 6063.6946770031645, 4777.230632246412 6223.450287612931, 4910.36030775455 6347.704651420527, 5145.556067818929 6445.333080126496, 5376.314172033036 6489.709638629209, 5673.6371140012125 6480.834326928666, 5984.273023520203 6427.582456725404, 6294.908933039194 6432.020112575675, 6805.239355820393 6449.77073597676, 7209.066038195081 6636.152281688155, 7683.89521417411 6951.225847057416, 8078.846584848256 7359.490185282376, 8398.357806067788 7714.50265330408, 8771.120897490577 7976.324348470085, 8984.1283783036 8184.894173432836, 9143.883988913365 8300.273225539891, 9383.517404828015 8331.33681649179, 9796.219398903246 8371.275719144232, 10000 8427.640566256101, 10000 7398.084317291527, 9795.91836734694 7385.734246701611, 9591.836734693878 7392.409188406808)), ((10000 10000, 10000 9899.990932923472, 9959.7366093588 10000, 10000 10000)))', -# 'GROUP': 'A', -# 'ID': 2, -# }, -# ] - -# for row in geology: -# row['geometry'] = shapely.wkt.loads(row['geometry']) - -# geology = geopandas.GeoDataFrame(geology, crs='epsg:7854') - -# # build structures file -# structures = [ -# { -# 'x': 2775.287768202244933, -# 'y': 4330.15, -# 'strike2': 45.00, -# 'dip_2': 45.70, -# 'id': 147.00, -# 'sf': 's0', -# }, -# { -# 'x': 3529.794754080061011, -# 'y': 3091.192011237949828, -# 'strike2': 288.50, -# 'dip_2': 41.70, -# 'id': 204.00, -# 'sf': 's0', -# }, -# { -# 'x': 7928.315269200518742, -# 'y': 7234.561058065713951, -# 'strike2': 48.80, -# 'dip_2': 41.10, -# 'id': 229.00, -# 'sf': 's0', -# }, -# { -# 'x': 8003.966104268994968, -# 'y': 7421.634268009857806, -# 'strike2': 48.80, -# 'dip_2': 41.10, -# 'id': 235.00, -# 'sf': 's0', -# }, -# { -# 'x': 6881.165236574942355, -# 'y': 1213.128646564158771, -# 'strike2': 299.10, -# 'dip_2': 44.70, -# 'id': 252.00, -# 'sf': 's0', -# }, -# { -# 'x': 3674.015651128655009, -# 'y': 5266.677487068354822, -# 'strike2': 41.20, -# 'dip_2': 40.10, -# 'id': 347.00, -# 'sf': 's0', -# }, -# { -# 'x': 3970.895076049027921, -# 'y': 2944.223069901633608, -# 'strike2': 273.00, -# 'dip_2': 46.00, -# 'id': 408.00, -# 'sf': 's0', -# }, -# ] -# for row in structures: -# row['geometry'] = shapely.Point(row['x'], row['y']) -# del row['x'], row['y'] - -# structures = geopandas.GeoDataFrame(structures, crs='epsg:7854') - -# faults = geopandas.GeoDataFrame(columns=['geometry'], crs='epsg:7854') - -# f_path = tempfile.mkdtemp() - -# bounding_box = {"minx": 0, "miny": 0, "maxx": 10000, "maxy": 10000, "base": 0, "top": -5000} - -# create_raster( -# os.path.join(f_path, "DEM.tif"), -# (bounding_box['minx'], bounding_box['miny'], bounding_box['maxx'], bounding_box['maxy']), -# 7854, -# 1000, -# ) - -# geology.to_file(os.path.join(f_path, "geology.shp")) -# structures.to_file(os.path.join(f_path, "structures.shp")) -# faults.to_file(os.path.join(f_path, "faults.shp")) -# loop_project_filename = os.path.join(f_path, "local_source.loop3d") - -# config = { -# "structure": { -# "orientation_type": "strike", -# "dipdir_column": "strike2", -# "dip_column": "dip_2", -# "description_column": "DESCRIPTION", -# "bedding_text": "Bed", -# "overturned_column": "structypei", -# "overturned_text": "BEOI", -# "objectid_column": "objectid", -# "desciption_column": "feature", -# }, -# "geology": { -# "unitname_column": "UNITNAME", -# "alt_unitname_column": "UNITNAME", -# "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": "sill", -# "intrusive_text": "intrusive", -# "volcanic_text": "volcanic", -# "objectid_column": "ID", -# "ignore_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", -# }, -# } - -# module_path = os.path.dirname(map2loop.__file__).replace("__init__.py", "") - - -# @pytest.fixture -# def project(): -# proj = Project( -# geology_filename=os.path.join(f_path, "geology.shp"), -# fault_filename=os.path.join(f_path, "faults.shp"), -# fold_filename=os.path.join(f_path, "faults.shp"), -# structure_filename=os.path.join(f_path, "structures.shp"), -# dtm_filename=os.path.join(f_path, 'DEM.tif'), -# clut_filename=pathlib.Path(module_path) -# / pathlib.Path('_datasets') -# / pathlib.Path('clut_files') -# / pathlib.Path('WA_clut.csv'), -# config_dictionary=config, -# clut_file_legacy=False, -# working_projection="EPSG:7854", -# bounding_box=bounding_box, -# loop_project_filename=loop_project_filename, -# overwrite_loopprojectfile=True, -# ) - -# proj.set_thickness_calculator(InterpolatedStructure()) - -# column = ['Litho_G', 'Litho_F', 'Litho_E'] - -# proj.set_sampler(Datatype.GEOLOGY, SamplerSpacing(100.0)) -# proj.set_sampler(Datatype.STRUCTURE, SamplerDecimator(0)) -# proj.run_all(user_defined_stratigraphic_column=column) - -# return proj - - -# @pytest.fixture -# def interpolated_structure_thickness(): -# return InterpolatedStructure() - - -# @pytest.fixture -# def units(project): -# return project.stratigraphic_column.stratigraphicUnits - - -# @pytest.fixture -# def stratigraphic_order(project): -# return project.stratigraphic_column.column - - -# @pytest.fixture -# def basal_contacts(project): -# return project.map_data.basal_contacts - - -# @pytest.fixture -# def samples(project): -# return project.structure_samples - - -# @pytest.fixture -# def map_data(project): -# return project.map_data - - -# def test_compute( -# interpolated_structure_thickness, -# units, -# stratigraphic_order, -# basal_contacts, -# samples, -# map_data, -# project, -# ): -# result = interpolated_structure_thickness.compute( -# units, stratigraphic_order, basal_contacts, samples, map_data -# ) -# assert ( -# interpolated_structure_thickness.thickness_calculator_label == "InterpolatedStructure" -# ), 'Thickness_calc interpolated structure not being set properly' -# assert isinstance( -# result, pd.DataFrame -# ), 'InterpolatedStructure calculator is not returning a DataFrame' -# assert ( -# 'ThicknessMedian' in result.columns -# ), 'Thickness not being calculated in InterpolatedStructure calculator' -# assert ( -# 'ThicknessMean' in result.columns -# ), 'Thickness not being calculated in InterpolatedStructure calculator' -# assert result['ThicknessMedian'].dtypes == float, 'ThicknessMedian column is not float' -# assert ( -# 'ThicknessStdDev' in result.columns -# ), 'Thickness std not being calculated in InterpolatedStructure calculator' -# assert result['ThicknessStdDev'].dtypes == float, 'ThicknessStdDev column is not float' - -# # check for nas in thickness -# assert result['ThicknessMedian'].isna().sum() == 0, 'ThicknessMedian column has NaNs' +import pandas +import geopandas +import pytest +import numpy + +from map2loop.mapdata import MapData +from map2loop.thickness_calculator import InterpolatedStructure +from map2loop._datasets.geodata_files.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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], + '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 + thickness_calculator = InterpolatedStructure() + + 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, } + + result = thickness_calculator.compute( + units=st_units, + stratigraphic_order=st_column, + basal_contacts= bc_gdf, + structure_data=structures, + map_data=md + ) + + # 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' \ No newline at end of file diff --git a/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py new file mode 100644 index 00000000..6caecd6b --- /dev/null +++ b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py @@ -0,0 +1,152 @@ +import pandas +import geopandas +import pytest +import numpy + +from map2loop.mapdata import MapData +from map2loop.thickness_calculator import StructuralPoint +from map2loop._datasets.geodata_files.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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], + '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() + + md = MapData() + md.sampled_contacts = s_c + 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, + map_data=md + ) + + # 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' \ No newline at end of file diff --git a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_local_source.py b/tests/thickness/StructurePoint/test_thickness_StructuralPoint_local_source.py deleted file mode 100644 index 9d47bd03..00000000 --- a/tests/thickness/StructurePoint/test_thickness_StructuralPoint_local_source.py +++ /dev/null @@ -1,261 +0,0 @@ -# # This test runs on a portion of the dataset in https://github.com/Loop3D/m2l3_examples/tree/main/Laurent2016_V2_variable_thicknesses (only for lithologies E, F, and G) -# # structures are confined to litho_F, and the test confirms if the StructuralPoint thickness is calculated, for all lithologies, if the thickness is correct for F (~90 m), and top/bottom units are assigned -1 -# # this creates a temp folder in Appdata to store the data to run the proj, checks the thickness, and then deletes the temp folder -# # this was done to avoid overflow of file creation in the tests folder - -# # this tests the thickness calculator Structural Point from local source - -# from map2loop.thickness_calculator import StructuralPoint -# from osgeo import gdal, osr -# import os -# import shapely -# import geopandas -# import tempfile -# import pathlib -# from map2loop.sampler import SamplerSpacing, SamplerDecimator -# from map2loop.project import Project -# from map2loop.m2l_enums import Datatype -# import map2loop - - -# def create_raster(output_path, bbox, epsg, pixel_size, value=100): -# minx, miny, maxx, maxy = bbox -# cols = int((maxx - minx) / pixel_size) -# rows = int((maxy - miny) / pixel_size) -# driver = gdal.GetDriverByName('GTiff') -# out_raster = driver.Create(output_path, cols, rows, 1, gdal.GDT_Byte) -# out_raster.SetGeoTransform([minx, pixel_size, 0, maxy, 0, -pixel_size]) -# srs = osr.SpatialReference() -# srs.ImportFromEPSG(epsg) -# out_raster.SetProjection(srs.ExportToWkt()) -# out_band = out_raster.GetRasterBand(1) -# out_band.Fill(value) -# out_band.FlushCache() -# out_raster = None - - -# # build geology file - -# geology = [ -# { -# 'UNITNAME': 'Litho_E', -# 'geometry': 'POLYGON ((9795.91836734694 9931.26849738919, 9860.73785898637 9795.91836734694, 9935.33621028978 9591.836734693878, 9950.618354641661 9387.755102040817, 10000 9210.342095822705, 10000 8757.661313426739, 9957.613263811385 8571.428571428572, 9795.91836734694 8453.228230379065, 9591.836734693878 8459.27180076132, 9387.755102040817 8424.58063242387, 9183.673469387755 8396.186050103635, 8979.591836734695 8375.328219666773, 8775.510204081633 8142.6900746871015, 8533.835897640307 7959.183673469388, 8367.34693877551 7832.006337691327, 8271.702357700893 7755.102040816327, 8163.265306122449 7660.1472192881065, 8074.276982521525 7551.0204081632655, 7959.183673469388 7424.887053820552, 7876.85861392897 7346.938775510204, 7755.102040816327 7225.488935198103, 7672.260829380581 7142.857142857143, 7551.0204081632655 7021.922675930724, 7447.64756183235 6938.775510204082, 7346.938775510204 6858.865387585699, 7149.179419692682 6734.693877551021, 6938.775510204082 6628.052847726005, 6734.693877551021 6533.238936443719, 6530.6122448979595 6522.261950434471, 6326.530612244898 6520.453083271883, 6122.448979591837 6525.756680235571, 5918.367346938776 6543.242785395409, 5714.285714285715 6570.203352947625, 5510.2040816326535 6597.437955895249, 5306.122448979592 6623.455748266104, 5102.040816326531 6558.673625089685, 5021.544086689852 6530.6122448979595, 4897.95918367347 6484.284692881059, 4648.165410878707 6326.530612244898, 4456.931912169165 6122.448979591837, 4285.714285714286 5949.72882952009, 4081.6326530612246 5747.855828732861, 3877.5510204081634 5481.342782779616, 3673.469387755102 5299.687677500199, 3469.387755102041 5113.124847412109, 3233.5997600944675 4897.95918367347, 3061.2244897959185 4761.364995216837, 2978.9564560870735 4693.877551020409, 2857.1428571428573 4509.9974651725925, 2727.7656477324817 4285.714285714286, 2653.061224489796 4194.911256128428, 2620.9440036695833 4081.6326530612246, 2653.061224489796 3834.8668935347578, 2714.296846973653 3673.469387755102, 2767.1924902468313 3469.387755102041, 2857.1428571428573 3316.1486411581236, 2932.2801317487447 3265.3061224489797, 3061.2244897959185 3201.1586792615, 3265.3061224489797 3115.340836194097, 3411.8516104561945 3061.2244897959185, 3469.387755102041 3039.713489766024, 3673.469387755102 2953.3901993109257, 3877.5510204081634 2900.4941667829244, 4081.6326530612246 2919.088869678731, 4285.714285714286 2942.9248887665417, 4489.795918367347 2963.555199759347, 4693.877551020409 2917.314840822804, 4809.648941974251 2857.1428571428573, 4897.95918367347 2811.5255005505624, 5102.040816326531 2712.551039092395, 5243.474220742985 2653.061224489796, 5306.122448979592 2627.6203077666614, 5510.2040816326535 2402.532733216578, 5649.461551588409 2244.8979591836737, 5714.285714285715 2173.8852286825377, 5838.211215272242 2040.8163265306123, 5918.367346938776 1953.0603836993782, 6037.69419144611 1836.734693877551, 6122.448979591837 1756.0881011340084, 6277.958616918448 1632.6530612244899, 6326.530612244898 1595.732338574468, 6532.909626863441 1428.5714285714287, 6734.693877551021 1276.012440117038, 6876.561690349969 1224.4897959183675, 6938.775510204082 1201.8953050885882, 7142.857142857143 1139.765856217365, 7346.938775510204 1082.3855108144332, 7551.0204081632655 1067.0050796197386, 7755.102040816327 1078.0507691052496, 7995.249689841758 1020.4081632653061, 8163.265306122449 949.2362275415538, 8367.34693877551 868.0756238042093, 8499.189882862325 816.3265306122449, 8571.428571428572 789.4330608601473, 8775.510204081633 723.8424554163096, 8902.20797791773 612.2448979591837, 8979.591836734695 360.74278305987923, 8979.591836734695 180.16181430038142, 8858.95553900271 0, 6046.468258728215 0, 5863.85825506431 296.3535950262776, 5435.566874501761 724.6449755888261, 5282.605667157994 908.1984244013456, 4900.202648798577 1122.3441146826208, 4638.256581222377 1168.2324768857502, 4454.703132409856 1154.8483712431703, 4190.845049741858 1118.520084499026, 3988.1714500113685 1181.6165825283297, 3642.0967183960943 1311.6336087705313, 3024.5158437456353 1594.6118423565003, 2573.2802820815227 1816.4055930049626, 2175.581142987729 2107.0318869581197, 1831.4184264642531 2558.267448622232, 1380.1828648001406 2910.078225512896, 531.2481640422343 3177.7603383644882, 0 3187.497507640264, 0 4970.218705429992, 78.1005872863268 5095.511475436967, 303.71836811838307 5355.545527921371, 739.6578090481191 5745.596606647977, 904.0911069426686 5887.085723440961, 1297.9662158528683 6024.750810050351, 1787.4420793529227 6116.527534456612, 2169.8450977123402 6135.647685374583, 2498.711693501439 6185.3600777613065, 3003.4836777358705 6261.84068143319, 3485.311480868737 6430.098009511334, 3798.881955923459 6705.428182730114, 4250.1175175875715 7240.792408433298, 4731.945320720438 7638.491547527093, 5297.901787892375 7982.654264050569, 5802.673772126806 8112.67129029277, 6276.853514892484 8303.87279947248, 6712.79295582222 8609.795214160013, 6896.346404634739 8785.700602605346, 6995.771189408188 8969.254051417865, 6942.234766837869 9206.343922800705, 6766.329378392537 9558.154699691368, 6414.518601501873 9986.446080253916, 6402.234572809949 10000, 9765.614100864956 10000, 9795.91836734694 9931.26849738919))', -# 'GROUP': 'A', -# 'ID': 0, -# }, -# { -# 'UNITNAME': 'Litho_F', -# 'geometry': 'MULTIPOLYGON (((8979.591836734695 360.74278305987923, 8902.20797791773 612.2448979591837, 8775.510204081633 723.8424554163096, 8571.428571428572 789.4330608601473, 8499.189882862325 816.3265306122449, 8367.34693877551 868.0756238042093, 8163.265306122449 949.2362275415538, 7995.249689841758 1020.4081632653061, 7755.102040816327 1078.0507691052496, 7551.0204081632655 1067.0050796197386, 7346.938775510204 1082.3855108144332, 7142.857142857143 1139.765856217365, 6938.775510204082 1201.8953050885882, 6876.561690349969 1224.4897959183675, 6734.693877551021 1276.012440117038, 6532.909626863441 1428.5714285714287, 6326.530612244898 1595.732338574468, 6277.958616918448 1632.6530612244899, 6122.448979591837 1756.0881011340084, 6037.69419144611 1836.734693877551, 5918.367346938776 1953.0603836993782, 5838.211215272242 2040.8163265306123, 5714.285714285715 2173.8852286825377, 5649.461551588409 2244.8979591836737, 5510.2040816326535 2402.532733216578, 5306.122448979592 2627.6203077666614, 5243.474220742985 2653.061224489796, 5102.040816326531 2712.551039092395, 4897.95918367347 2811.5255005505624, 4809.648941974251 2857.1428571428573, 4693.877551020409 2917.314840822804, 4489.795918367347 2963.555199759347, 4285.714285714286 2942.9248887665417, 4081.6326530612246 2919.088869678731, 3877.5510204081634 2900.4941667829244, 3673.469387755102 2953.3901993109257, 3592.122504199657 2987.798639529117, 3469.387755102041 3039.713489766024, 3411.8516104561945 3061.2244897959185, 3265.3061224489797 3115.340836194097, 3061.2244897959185 3201.1586792615, 2932.2801317487447 3265.3061224489797, 2857.1428571428573 3316.1486411581236, 2767.1924902468313 3469.387755102041, 2714.296846973653 3673.469387755102, 2653.061224489796 3834.8668935347578, 2620.9440036695833 4081.6326530612246, 2653.061224489796 4194.911256128428, 2727.7656477324817 4285.714285714286, 2857.1428571428573 4509.9974651725925, 2978.9564560870735 4693.877551020409, 3061.2244897959185 4761.364995216837, 3233.5997600944675 4897.95918367347, 3469.387755102041 5113.124847412109, 3673.469387755102 5299.687677500199, 3877.5510204081634 5481.342782779616, 4081.6326530612246 5747.855828732861, 4285.714285714286 5949.72882952009, 4456.931912169165 6122.448979591837, 4648.165410878707 6326.530612244898, 4897.95918367347 6484.284692881059, 5021.544086689852 6530.6122448979595, 5102.040816326531 6558.673625089685, 5306.122448979592 6623.455748266104, 5510.2040816326535 6597.437955895249, 5714.285714285715 6570.203352947625, 5918.367346938776 6543.242785395409, 6122.448979591837 6525.756680235571, 6326.530612244898 6520.453083271883, 6530.6122448979595 6522.261950434471, 6734.693877551021 6533.238936443719, 6938.775510204082 6628.052847726005, 7149.179419692682 6734.693877551021, 7346.938775510204 6858.865387585699, 7447.64756183235 6938.775510204082, 7551.0204081632655 7021.922675930724, 7672.260829380581 7142.857142857143, 7755.102040816327 7225.488935198103, 7876.85861392897 7346.938775510204, 7959.183673469388 7424.887053820552, 8074.276982521525 7551.0204081632655, 8163.265306122449 7660.1472192881065, 8271.702357700893 7755.102040816327, 8367.34693877551 7832.006337691327, 8533.835897640307 7959.183673469388, 8775.510204081633 8142.6900746871015, 8979.591836734695 8375.328219666773, 9183.673469387755 8396.186050103635, 9387.755102040817 8424.58063242387, 9591.836734693878 8459.27180076132, 9795.91836734694 8453.228230379065, 9957.613263811385 8571.428571428572, 10000 8757.661313426739, 10000 8427.640566256101, 9796.219398903246 8371.275719144232, 9383.517404828015 8331.33681649179, 9143.883988913365 8300.273225539891, 8984.1283783036 8184.894173432836, 8771.120897490577 7976.324348470085, 8398.357806067788 7714.50265330408, 8078.846584848256 7359.490185282376, 7683.89521417411 6951.225847057416, 7209.066038195081 6636.152281688155, 6805.239355820393 6449.77073597676, 6294.908933039194 6432.020112575675, 5984.273023520203 6427.582456725404, 5673.6371140012125 6480.834326928666, 5376.314172033036 6489.709638629209, 5145.556067818929 6445.333080126496, 4910.36030775455 6347.704651420527, 4777.230632246412 6223.450287612931, 4542.034872182033 6063.6946770031645, 4324.58973551874 5824.061261088515, 4129.332878106803 5593.303156874407, 3925.2007089943236 5389.170987761928, 3734.3815074326594 5176.163506948902, 3494.7480915180095 5020.8455521894075, 3263.9899873039026 4830.026350627742, 2993.2929804373534 4554.891687910922, 2846.850337378401 4315.258271996272, 2735.908941121619 4088.937823632436, 2780.285499624332 3840.429096017244, 2842.4126815281297 3560.8567774501525, 2944.4787660843695 3361.162264187944, 3082.0460974427792 3294.5974264338747, 3379.369039410956 3170.343062626279, 3845.322903689442 3028.338075417598, 4013.9538259997507 3037.2133871181404, 4320.15207966847 3032.7757312678687, 4542.034872182035 3028.338075417598, 4684.039859390716 2983.9615169148847, 4897.047340203738 2886.333088208916, 5189.932626321643 2766.5163802515917, 5358.563548631952 2673.3256073958946, 5465.067289038463 2611.198425492096, 5744.639607605554 2273.9365808714774, 6246.09471868621 1776.9191256410927, 6641.046089360355 1435.2196251702035, 6822.989979221478 1324.2782289134211, 6978.307933980974 1275.4640145604371, 7311.13212275132 1195.5862092555535, 7444.261798259459 1168.960274153926, 7666.144590773023 1160.0849624533835, 7870.2767598855025 1155.6473066031122, 8052.220649746626 1093.5201246993138, 8331.792968313717 987.0163842928032, 8460.484987971584 920.4515465387335, 8713.43137143705 845.0113970841217, 8855.43635864573 782.8842151803237, 8975.253066603054 671.9428189235414, 9010.754313405225 565.4390785170299, 9046.255560207395 410.1211237575353, 9068.443839458752 281.4291040996677, 9050.693216057667 179.36301954342798, 9006.316657554953 90.60990253800173, 8972.337944103203 0, 8858.95553900271 0, 8979.591836734695 180.16181430038142, 8979.591836734695 360.74278305987923)), ((9935.33621028978 9591.836734693878, 9860.73785898637 9795.91836734694, 9795.91836734694 9931.26849738919, 9765.614100864956 10000, 9959.7366093588 10000, 10000 9899.990932923472, 10000 9210.342095822705, 9950.618354641661 9387.755102040817, 9935.33621028978 9591.836734693878)))', -# 'GROUP': 'A', -# 'ID': 1, -# }, -# { -# 'UNITNAME': 'Litho_G', -# 'geometry': 'MULTIPOLYGON (((9591.836734693878 7392.409188406808, 9387.755102040817 7366.494159309232, 9183.673469387755 7310.6236360511, 8979.591836734695 7251.495049924267, 8775.510204081633 7185.4665328045285, 8691.716875348773 7142.857142857143, 8571.428571428572 7060.166183783084, 8423.547550123565 6938.775510204082, 8367.34693877551 6891.931806291853, 8163.265306122449 6717.05674151985, 7959.183673469388 6524.418032899195, 7755.102040816327 6316.720222940251, 7530.765922702089 6122.448979591837, 7346.938775510204 5999.901440678811, 7186.986962143256 5918.367346938776, 6938.775510204082 5793.479608029736, 6734.693877551021 5711.484247324418, 6530.6122448979595 5688.577768753987, 6326.530612244898 5674.85692549725, 6122.448979591837 5664.018903459822, 5918.367346938776 5686.95963645468, 5808.41181229572 5714.285714285715, 5714.285714285715 5737.67798287528, 5510.2040816326535 5789.896906638633, 5306.122448979592 5803.500194938816, 5144.4244384765625 5714.285714285715, 4837.004213917013 5510.2040816326535, 4693.877551020409 5412.657990747569, 4564.6032995107225 5306.122448979592, 4489.795918367347 5235.455182133889, 4285.714285714286 4940.409368398238, 4169.117285280811 4693.877551020409, 4290.969225825096 4489.795918367347, 4489.795918367347 4401.180111632056, 4588.951967200454 4285.714285714286, 4693.877551020409 4151.690736108897, 4830.671037946428 3877.5510204081634, 5102.040816326531 3725.3519953513633, 5306.122448979592 3618.5887395119184, 5510.2040816326535 3357.1418450803176, 5714.285714285715 3090.5887058803014, 5921.393024678133 2857.1428571428573, 6122.448979591837 2649.130140032087, 6354.4265591368385 2448.979591836735, 6530.6122448979595 2314.575934896664, 6621.950889120297 2244.8979591836737, 6938.775510204082 2057.7853066580637, 7142.857142857143 1991.364809931541, 7346.938775510204 1953.759679988939, 7551.0204081632655 1939.4851217464525, 7755.102040816327 1938.7210145288584, 7959.183673469388 1951.3825007847379, 8163.265306122449 1964.9159178441885, 8571.428571428572 1920.2366653753788, 8784.97298882932 1836.734693877551, 9174.578141193 1632.6530612244899, 9387.755102040817 1516.645976475307, 9736.033069844148 1224.4897959183675, 10000 887.0183205117985, 10000 0, 8972.337944103203 0, 9006.316657554953 90.60990253800173, 9050.693216057667 179.36301954342798, 9068.443839458752 281.4291040996677, 9046.255560207395 410.1211237575353, 9010.754313405225 565.4390785170299, 8975.253066603054 671.9428189235414, 8855.43635864573 782.8842151803237, 8713.43137143705 845.0113970841217, 8460.484987971584 920.4515465387335, 8331.792968313717 987.0163842928032, 8052.220649746626 1093.5201246993138, 7870.2767598855025 1155.6473066031122, 7666.144590773023 1160.0849624533835, 7444.261798259459 1168.960274153926, 7311.13212275132 1195.5862092555535, 6978.307933980974 1275.4640145604371, 6822.989979221478 1324.2782289134211, 6641.046089360355 1435.2196251702035, 6246.09471868621 1776.9191256410927, 5744.639607605554 2273.9365808714774, 5465.067289038463 2611.198425492096, 5358.563548631952 2673.3256073958946, 5189.932626321643 2766.5163802515917, 4897.047340203738 2886.333088208916, 4684.039859390716 2983.9615169148847, 4542.034872182035 3028.338075417598, 4320.15207966847 3032.7757312678687, 4013.9538259997507 3037.2133871181404, 3845.322903689442 3028.338075417598, 3379.369039410956 3170.343062626279, 3082.0460974427792 3294.5974264338747, 2944.4787660843695 3361.162264187944, 2842.4126815281297 3560.8567774501525, 2780.285499624332 3840.429096017244, 2735.908941121619 4088.937823632436, 2846.850337378401 4315.258271996272, 2993.2929804373534 4554.891687910922, 3263.9899873039026 4830.026350627742, 3494.7480915180095 5020.8455521894075, 3734.3815074326594 5176.163506948902, 3925.2007089943236 5389.170987761928, 4129.332878106803 5593.303156874407, 4324.58973551874 5824.061261088515, 4542.034872182033 6063.6946770031645, 4777.230632246412 6223.450287612931, 4910.36030775455 6347.704651420527, 5145.556067818929 6445.333080126496, 5376.314172033036 6489.709638629209, 5673.6371140012125 6480.834326928666, 5984.273023520203 6427.582456725404, 6294.908933039194 6432.020112575675, 6805.239355820393 6449.77073597676, 7209.066038195081 6636.152281688155, 7683.89521417411 6951.225847057416, 8078.846584848256 7359.490185282376, 8398.357806067788 7714.50265330408, 8771.120897490577 7976.324348470085, 8984.1283783036 8184.894173432836, 9143.883988913365 8300.273225539891, 9383.517404828015 8331.33681649179, 9796.219398903246 8371.275719144232, 10000 8427.640566256101, 10000 7398.084317291527, 9795.91836734694 7385.734246701611, 9591.836734693878 7392.409188406808)), ((10000 10000, 10000 9899.990932923472, 9959.7366093588 10000, 10000 10000)))', -# 'GROUP': 'A', -# 'ID': 2, -# }, -# ] -# for row in geology: -# row['geometry'] = shapely.wkt.loads(row['geometry']) - -# geology = geopandas.GeoDataFrame(geology, crs='epsg:7854') - -# # build structures file -# structures = [ -# { -# 'x': 2775.287768202244933, -# 'y': 4330.15, -# 'strike2': 45.00, -# 'dip_2': 45.70, -# 'id': 147.00, -# 'sf': 's0', -# }, -# { -# 'x': 3529.794754080061011, -# 'y': 3091.192011237949828, -# 'strike2': 288.50, -# 'dip_2': 41.70, -# 'id': 204.00, -# 'sf': 's0', -# }, -# { -# 'x': 7928.315269200518742, -# 'y': 7234.561058065713951, -# 'strike2': 48.80, -# 'dip_2': 41.10, -# 'id': 229.00, -# 'sf': 's0', -# }, -# { -# 'x': 8003.966104268994968, -# 'y': 7421.634268009857806, -# 'strike2': 48.80, -# 'dip_2': 41.10, -# 'id': 235.00, -# 'sf': 's0', -# }, -# { -# 'x': 6881.165236574942355, -# 'y': 1213.128646564158771, -# 'strike2': 299.10, -# 'dip_2': 44.70, -# 'id': 252.00, -# 'sf': 's0', -# }, -# { -# 'x': 3674.015651128655009, -# 'y': 5266.677487068354822, -# 'strike2': 41.20, -# 'dip_2': 40.10, -# 'id': 347.00, -# 'sf': 's0', -# }, -# { -# 'x': 3970.895076049027921, -# 'y': 2944.223069901633608, -# 'strike2': 273.00, -# 'dip_2': 46.00, -# 'id': 408.00, -# 'sf': 's0', -# }, -# ] -# for row in structures: -# row['geometry'] = shapely.Point(row['x'], row['y']) -# del row['x'], row['y'] - -# structures = geopandas.GeoDataFrame(structures, crs='epsg:7854') - -# faults = geopandas.GeoDataFrame(columns=['geometry'], crs='epsg:7854') - -# f_path = tempfile.mkdtemp() - -# bounding_box = {"minx": 0, "miny": 0, "maxx": 10000, "maxy": 10000, "base": 0, "top": -5000} - -# create_raster( -# os.path.join(f_path, "DEM.tif"), -# (bounding_box['minx'], bounding_box['miny'], bounding_box['maxx'], bounding_box['maxy']), -# 7854, -# 1000, -# ) - -# geology.to_file(os.path.join(f_path, "geology.shp")) -# structures.to_file(os.path.join(f_path, "structures.shp")) -# faults.to_file(os.path.join(f_path, "faults.shp")) - -# loop_project_filename = os.path.join(f_path, "local_source.loop3d") - -# config = { -# "structure": { -# "orientation_type": "strike", -# "dipdir_column": "strike2", -# "dip_column": "dip_2", -# "description_column": "DESCRIPTION", -# "bedding_text": "Bed", -# "overturned_column": "structypei", -# "overturned_text": "BEOI", -# "objectid_column": "objectid", -# "desciption_column": "feature", -# }, -# "geology": { -# "unitname_column": "UNITNAME", -# "alt_unitname_column": "UNITNAME", -# "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": "sill", -# "intrusive_text": "intrusive", -# "volcanic_text": "volcanic", -# "objectid_column": "ID", -# "ignore_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", -# }, -# } - - -# proj = Project( -# geology_filename=os.path.join(f_path, "geology.shp"), -# fault_filename=os.path.join(f_path, "faults.shp"), -# fold_filename=os.path.join(f_path, "faults.shp"), -# structure_filename=os.path.join(f_path, "structures.shp"), -# dtm_filename=os.path.join(f_path, 'DEM.tif'), -# clut_filename=pathlib.Path( -# os.path.join(os.path.dirname(map2loop.__file__), "_datasets/clut_files/WA_clut.csv") -# ), -# config_dictionary=config, -# clut_file_legacy=False, -# working_projection="EPSG:7854", -# bounding_box=bounding_box, -# loop_project_filename=loop_project_filename, -# overwrite_loopprojectfile=True, -# ) - -# proj.set_thickness_calculator(StructuralPoint()) - -# column = ['Litho_G', 'Litho_F', 'Litho_E'] -# proj.set_sampler(Datatype.GEOLOGY, SamplerSpacing(100.0)) -# proj.set_sampler(Datatype.STRUCTURE, SamplerDecimator(0)) -# proj.run_all(user_defined_stratigraphic_column=column) - - -# def test_thickness_structuralPoint(proj=proj): -# # 1. are all lithologies in the geology returned? -# assert all( -# element in geology['UNITNAME'].unique().tolist() -# for element in proj.stratigraphic_column.stratigraphicUnits['name'].to_list() -# ), " thickness calculator not calculating for all lithologies in geology" - -# # 2. is ThicknessMedian a column in the stratigraphicUnits? -# assert ( -# 'ThicknessMedian' in proj.stratigraphic_column.stratigraphicUnits.columns.to_list() -# ), "ThicknessMedian not in resulting stratigraphicUnits" - -# # 2. are bottom and top units assigned as -1? -# assert ( -# proj.stratigraphic_column.stratigraphicUnits[ -# proj.stratigraphic_column.stratigraphicUnits['Order'] -# == min(proj.stratigraphic_column.stratigraphicUnits['Order']) -# ]['ThicknessMedian'].values -# == -1 -# ), "StructuralPoint thickness calculator: top unit not assigned as -1" -# assert ( -# proj.stratigraphic_column.stratigraphicUnits[ -# proj.stratigraphic_column.stratigraphicUnits['Order'] -# == max(proj.stratigraphic_column.stratigraphicUnits['Order']) -# ]['ThicknessMedian'].values -# == -1 -# ), "thickness calculator StructuralPoint: bottom unit not assigned as -1" - -# # 3. Is the thickness being calculated correctly? Should be ~ 89 -# assert ( -# round( -# proj.stratigraphic_column.stratigraphicUnits[ -# proj.stratigraphic_column.stratigraphicUnits['name'] == 'Litho_F' -# ]['ThicknessMedian'] -# ).values -# == 89.0 -# ), "thickness calculator StructuralPoint not calculating thickness correctly" diff --git a/tests/thickness/test_ThicknessCalculatorAlpha.py b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py similarity index 95% rename from tests/thickness/test_ThicknessCalculatorAlpha.py rename to tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py index e1af873f..9ef2a7dc 100644 --- a/tests/thickness/test_ThicknessCalculatorAlpha.py +++ b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py @@ -4,9 +4,12 @@ import numpy from map2loop.mapdata import MapData +from map2loop.m2l_enums import Datatype from map2loop.thickness_calculator import ThicknessCalculatorAlpha -### Define the test data for ThicknessCalculatorAlpha +######################################################### +### Define the test data for ThicknessCalculatorAlpha ### +######################################################### # Sample stratigraphic units data st_units = pandas.DataFrame({ @@ -48,7 +51,7 @@ 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 ((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))', @@ -73,7 +76,7 @@ 'layerID': [3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2] }) -md = MapData() + # sampled contacts @@ -96,12 +99,20 @@ def check_thickness_values(result, column, description): assert ( result[result['stratigraphic_Order'] == order][column].values == -1 ), f"ThicknessCalculatorAlpha: {position} unit not assigned as -1 ({description})" - -def test_calculate_thickness(): +geology = geopandas.read_file(r"C:\Users\angel\Documents\GitHub\map2loop\map2loop\_datasets\geodata_files\hamersley\geology.geojson") + +from map2loop._datasets.geodata_files.load_map2loop_data import load_hamersley_geology +from map2loop.m2l_enums import Datastate#, datatype +def test_calculate_thickness_thickness_calculator_alpha(): # Run the calculation - thickness_calculator = ThicknessCalculatorAlpha() + md = MapData() md.sampled_contacts = s_c + md.data[Datatype.GEOLOGY] = geology + + print('GERE', md.get_map_data(Datatype.GEOLOGY)) + + thickness_calculator = ThicknessCalculatorAlpha() result = thickness_calculator.compute( units=st_units, stratigraphic_order=st_column, @@ -110,8 +121,10 @@ def test_calculate_thickness(): map_data=md ) + + # is thickness calc alpha the label? - assert thickness_calculator.thickness_calculator_label == 'ThicknessCalculatorAlpha', 'name not set correctly' + 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' From 31073dca340001a4fce257b36607e966afe594ff Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 9 Jul 2024 09:24:17 +1000 Subject: [PATCH 035/187] fix: typo in tests --- .../test_ThicknessCalculatorAlpha.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py index 9ef2a7dc..2c59b5c7 100644 --- a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py +++ b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py @@ -6,6 +6,8 @@ from map2loop.mapdata import MapData from map2loop.m2l_enums import Datatype from map2loop.thickness_calculator import ThicknessCalculatorAlpha +from map2loop._datasets.geodata_files.load_map2loop_data import load_hamersley_geology + ######################################################### ### Define the test data for ThicknessCalculatorAlpha ### @@ -100,10 +102,7 @@ def check_thickness_values(result, column, description): result[result['stratigraphic_Order'] == order][column].values == -1 ), f"ThicknessCalculatorAlpha: {position} unit not assigned as -1 ({description})" -geology = geopandas.read_file(r"C:\Users\angel\Documents\GitHub\map2loop\map2loop\_datasets\geodata_files\hamersley\geology.geojson") - -from map2loop._datasets.geodata_files.load_map2loop_data import load_hamersley_geology -from map2loop.m2l_enums import Datastate#, datatype +geology = load_hamersley_geology() def test_calculate_thickness_thickness_calculator_alpha(): # Run the calculation md = MapData() From de35af58420d283da7242b11b3fcacaf8b60ed56 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 9 Jul 2024 09:29:42 +1000 Subject: [PATCH 036/187] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f99a3985..29b58f22 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Map2Loop 3.0 +# Map2Loop 3.1 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: From 3f426920f26c629528c4aa628adee0fe50fa7bc3 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 9 Jul 2024 09:53:09 +1000 Subject: [PATCH 037/187] fix: add the basal_contacts_abnormal_check --- map2loop/mapdata.py | 24 +++++++++++++----------- map2loop/project.py | 3 +-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 5e95bb6a..bd83f0eb 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -21,7 +21,6 @@ from typing import Union import tempfile - class MapData: """ A data structure containing all the map data loaded from map files @@ -1126,15 +1125,15 @@ def save_raw_map_data(self, output_dir: str, datatype: Datatype, extension: str The extension to use for the data. Defaults to ".csv". """ try: - filename = os.path.join(output_dir, datatype.name + extension) + filename = pathlib.Path(output_dir) / f"{datatype.name}{extension}" + if extension == ".csv": - # TODO: Add geopandas to pandas converter and then write csv - # self.raw_data[datatype].write_csv(filename) - print("GeoDataFrame to CSV conversion not implimented") + df = self.raw_data[datatype] + df.to_csv(filename, index=False) else: self.raw_data[datatype].to_file(filename) - except Exception: - print(f"Failed to save {datatype.name} to file named {filename}\n") + except Exception as 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): @@ -1473,13 +1472,16 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) basal_contacts = basal_contacts[["ID", "basal_unit", "type", "geometry"]] - if save_contacts: - self.basal_contacts = basal_contacts - # added code to make sure that multi-line that touch each other are snapped and merged. # necessary for the reconstruction based on featureId basal_contacts["geometry"] = [shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"]] - + + if save_contacts: + #keep abnormal contacts as all_basal_contacts + self.all_basal_contacts = basal_contacts + #remove the abnormal contacts from basal contacts + self.basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"] + return basal_contacts @beartype.beartype diff --git a/map2loop/project.py b/map2loop/project.py index 49fd54d8..2d68f116 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -378,12 +378,11 @@ def extract_geology_contacts(self): # Use stratigraphic column to determine basal contacts self.map_data.extract_basal_contacts(self.stratigraphic_column.column) - ##### TODO - AR - add check here for basal contacts 'abnormal' - # sample the contacts self.map_data.sampled_contacts = self.samplers[Datatype.GEOLOGY].sample( self.map_data.basal_contacts ) + self.map_data.get_value_from_raster_df(Datatype.DTM, self.map_data.sampled_contacts) def calculate_stratigraphic_order(self, take_best=False): From 35b90979a195cc5a8a60d4370e85c76160f40286 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 10 Jul 2024 11:30:27 +1000 Subject: [PATCH 038/187] fix: add error handles for json, url, filenotfound --- map2loop/config.py | 51 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index 4229c03c..a40b2e88 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -1,3 +1,4 @@ +import urllib.error import beartype import json import urllib @@ -188,8 +189,9 @@ def update_from_file( Update the config dictionary from the provided json filename or url Args: - filename (str): Filename or URL of the JSON config file + filename (Union[pathlib.Path, str]): Filename or URL of the JSON config file legacy_format (bool, optional): Whether the JSON is an old version. Defaults to False. + lower (bool, optional): convert keys to lowercase. Defaults to False. """ if legacy_format: func = self.update_from_legacy_file @@ -199,26 +201,49 @@ def update_from_file( try: filename = str(filename) + #if url, open the url if filename.startswith("http") or filename.startswith("ftp"): - try_count = 10 + try_count = 5 success = False - while try_count >= 0 and not success: + # 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 - except Exception as e: - # Catch a failed online access or file load, re-attempt - # a few times before throwing further + + #case 1. handle url error + except urllib.error.URLError as e: + # wait 0.25 seconds before trying again time.sleep(0.25) - try_count = try_count - 1 - if try_count < 0: - raise e + # 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: - with open(filename) as url_data: - data = json.load(url_data) - func(data, lower) + 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"): @@ -228,4 +253,4 @@ def update_from_file( if not legacy_format: err_string += "Also check if this is a legacy config file and add clut_file_legacy=True to the Project function\n" err_string += "Check the contents for mismatched quotes or brackets!" - raise Exception(err_string) + raise Exception(err_string) \ No newline at end of file From ae22adc28cd7cce465be3158b79bee23414f016b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 10 Jul 2024 11:31:27 +1000 Subject: [PATCH 039/187] fix: remove typo --- .../InterpolatedStructure/test_interpolated_structure.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index 8388359f..56d7f992 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -273,7 +273,6 @@ def test_compute( result = interpolated_structure_thickness.compute( units, stratigraphic_order, basal_contacts, samples, map_data ) - print('HERE', result.dtypes) assert ( interpolated_structure_thickness.thickness_calculator_label == "InterpolatedStructure" From 72aa32dff5c3ff3c0cdc4a987e92455bacb5b062 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 10 Jul 2024 11:33:16 +1000 Subject: [PATCH 040/187] fix: remove tqdm --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 884683b8..00bec5a0 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,6 @@ def get_description(): "pandas", "geopandas", "shapely", - "tqdm", "networkx", "owslib", "loopprojectfile", From 5983ca217fee17e1fe754f2f2a25b55fdc97b6ae Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 7 Aug 2024 15:04:44 +0930 Subject: [PATCH 041/187] fix: added check for collocated points --- map2loop/interpolators.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index 90cfcc81..08cf59cf 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -331,6 +331,8 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): Args: structure_data (pandas.DataFrame): sampled structural data """ + # Check for collocated points and remove them + structure_data = structure_data.drop_duplicates(subset=['X', 'Y']) self.x = structure_data["X"].to_numpy() self.y = structure_data["Y"].to_numpy() From 7a483ef6ebc4afca53efa20841f5c13539c7cd7a Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 9 Aug 2024 11:30:17 +1000 Subject: [PATCH 042/187] fix: upd gdal as per master --- dependencies.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dependencies.txt b/dependencies.txt index 97d6c443..e298f372 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -5,4 +5,5 @@ owslib map2model hjson loopprojectfile==0.1.4 -beartype \ No newline at end of file +beartype +gdal<=3.7 \ No newline at end of file From 6887ae33825dc72d76178f243e103b0143a948a3 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 9 Aug 2024 11:39:18 +1000 Subject: [PATCH 043/187] fix: remove test from server --- tests/project/test_plot_hamersley.py | 101 --------------------------- 1 file changed, 101 deletions(-) delete mode 100644 tests/project/test_plot_hamersley.py diff --git a/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py deleted file mode 100644 index e4daf800..00000000 --- a/tests/project/test_plot_hamersley.py +++ /dev/null @@ -1,101 +0,0 @@ -### This file tests the overall behavior of project.py. Runs from LoopServer. - -#internal imports -from map2loop.project import Project -from map2loop.m2l_enums import VerboseLevel - -#external imports -import pytest -from pyproj.exceptions import CRSError -import os -import requests - -bbox_3d = { - "minx": 515687.31005864, - "miny": 7493446.76593407, - "maxx": 562666.860106543, - "maxy": 7521273.57407786, - "base": -3200, - "top": 3000, -} - -loop_project_filename = "wa_output.loop3d" - - -def test_project_execution(): - try: - proj = Project( - use_australian_state_data="WA", - working_projection="EPSG:28350", - bounding_box=bbox_3d, - clut_file_legacy=False, - verbose_level=VerboseLevel.NONE, - loop_project_filename=loop_project_filename, - overwrite_loopprojectfile=True, - ) - - except (requests.exceptions.RequestException, requests.exceptions.ReadTimeout) as e: - if "HTTPConnectionPool" in str(e) or isinstance(e, requests.exceptions.ReadTimeout): - pytest.skip("Connection to the server timed out, skipping test") - else: - raise # Re-raise the exception if it's not server unavailable - - proj.run_all(take_best=True) - assert proj is not None, "Plot Hamersley Basin failed to execute" - - assert os.path.exists(loop_project_filename), f"Expected file {loop_project_filename} was not created" - - -################################################################### -## test if wrong crs will throw a crs error - - -def test_expect_crs_error(): - with pytest.raises(CRSError): - Project( - use_australian_state_data="WA", - working_projection="NittyGrittyCRS", - bounding_box=bbox_3d, - clut_file_legacy=False, - verbose_level=VerboseLevel.NONE, - loop_project_filename=loop_project_filename, - overwrite_loopprojectfile=True, - ) - print("CRSError was raised as expected.") - - -################################################################### -## test if wrong state throws an error - - -def test_expect_state_error(): - - with pytest.raises(ValueError): - Project( - use_australian_state_data="NittyGrittyState", - working_projection="EPSG:28350", - bounding_box=bbox_3d, - clut_file_legacy=False, - verbose_level=VerboseLevel.NONE, - loop_project_filename=loop_project_filename, - overwrite_loopprojectfile=True, - ) - - print("ValueError was raised as expected.") - - -################################################################### -# test if it catches wrong config file -def test_expect_config_error(): - with pytest.raises(Exception): - Project( - use_australian_state_data="WA", - working_projection="EPSG:28350", - bounding_box=bbox_3d, - clut_file_legacy=False, - config_filename='NittyGrittyConfig.csv', - verbose_level=VerboseLevel.NONE, - loop_project_filename=loop_project_filename, - overwrite_loopprojectfile=True, - ) - print("FileNotFoundError//Exception by catchall in project.py was raised as expected.") From 31255ea5a1eebbe89a2c4ca9ebbd117e2d6bed1e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 8 Aug 2024 10:06:07 +1000 Subject: [PATCH 044/187] fix: issue 122 --- map2loop/thickness_calculator.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index ad25c934..be47a3bd 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -454,7 +454,13 @@ def compute( ) # add unitname to the sampled structures sampled_structures['unit_name'] = geopandas.sjoin(sampled_structures, geology)['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 + print('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, map_data.sampled_contacts @@ -482,8 +488,15 @@ def compute( # find bounding box of the lithology bbox_poly = geology[geology['UNITNAME'] == litho_in][['minx', 'miny', 'maxx', 'maxy']] - # make a subset of the geology polygon & find neighbour units - GEO_SUB = geology[geology['UNITNAME'] == litho_in]['geometry'].values[0] + # 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: + print('There are structural measurements in unit - ', litho_in, ' - that is 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'] ) From d7b09e086d44257fcdc3c35e1867a3f2c0eb4102 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 9 Aug 2024 11:56:36 +1000 Subject: [PATCH 045/187] fix: update str format --- map2loop/thickness_calculator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index be47a3bd..8ce9e61c 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -457,7 +457,7 @@ def compute( # 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 - print('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') + print(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']) @@ -491,7 +491,7 @@ def compute( # 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: - print('There are structural measurements in unit - ', litho_in, ' - that is not in the geology shapefile. Skipping this structural measurement') + print(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 From bdfd9aa2e4be4ff3622155dcef54117c7a3894f1 Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Fri, 9 Aug 2024 14:09:05 +0930 Subject: [PATCH 046/187] fix: now use DBSCAN to aggregate collocated poins --- map2loop/interpolators.py | 36 +++++++++++++++++++++++++----------- map2loop/utils.py | 2 +- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index 08cf59cf..b428ee61 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -1,10 +1,14 @@ from abc import ABC, abstractmethod from typing import Any, Union + +from .utils import strike_dip_vector, generate_grid + import beartype import numpy from numpy import ndarray from scipy.interpolate import Rbf, LinearNDInterpolator -from .utils import strike_dip_vector, generate_grid +from sklearn.cluster import DBSCAN + import pandas @@ -312,6 +316,7 @@ def __init__(self, data_type=None): self.yi = None self.dip = None self.dipdir = None + self.cell_size = None self.interpolator_label = "DipDipDirectionInterpolator" def type(self): @@ -331,15 +336,25 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): Args: structure_data (pandas.DataFrame): sampled structural data """ - # Check for collocated points and remove them - structure_data = structure_data.drop_duplicates(subset=['X', 'Y']) - - self.x = structure_data["X"].to_numpy() - self.y = structure_data["Y"].to_numpy() + # Check for collocated point clusters and average them + coords = structure_data[["X", "Y"]].values + db = DBSCAN(eps=self.cell_size+0.02, min_samples=1).fit(coords) + structure_data["cluster"] = db.labels_ + + # 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 = structure_data["DIP"].to_numpy() + self.dip = aggregated_data["DIP"].to_numpy() if "dipdir" in self.data_type: - self.dipdir = structure_data["DIPDIR"].to_numpy() + self.dipdir = aggregated_data["DIPDIR"].to_numpy() @beartype.beartype def setup_grid(self, bounding_box: dict): @@ -355,7 +370,7 @@ def setup_grid(self, bounding_box: dict): "maxy": value, } """ - self.xi, self.yi = generate_grid(bounding_box) + self.xi, self.yi, self.cell_size = generate_grid(bounding_box) @beartype.beartype def interpolate(self, ni: Union[ndarray, list], interpolator: Any = Rbf): @@ -394,9 +409,8 @@ def __call__( numpy.ndarray: interpolated dip and dip direction values """ - - self.setup_interpolation(structure_data) 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: diff --git a/map2loop/utils.py b/map2loop/utils.py index 8cfef675..e54554f8 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -41,7 +41,7 @@ def generate_grid(bounding_box: dict, grid_resolution: Optional[int] = None) -> xi = xi.flatten() yi = yi.flatten() - return xi, yi + return xi, yi, cell_size def strike_dip_vector( From 45c17987091e2b339154abc6974f96dcca890255 Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Fri, 9 Aug 2024 14:11:19 +0930 Subject: [PATCH 047/187] fix: removed addition --- map2loop/interpolators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index b428ee61..451e748d 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -338,7 +338,7 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): """ # Check for collocated point clusters and average them coords = structure_data[["X", "Y"]].values - db = DBSCAN(eps=self.cell_size+0.02, min_samples=1).fit(coords) + db = DBSCAN(eps=self.cell_size, min_samples=1).fit(coords) structure_data["cluster"] = db.labels_ # Aggregate data for collocated points by taking the mean of X, Y, DIP, and DIPDIR within each cluster From 8b406eaf19a1fe37c2cdbfa1806d871b9d9c5dfc Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Fri, 9 Aug 2024 14:20:46 +0930 Subject: [PATCH 048/187] fix: added warning when collocated points detected --- map2loop/interpolators.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index 451e748d..4cd9a681 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -1,6 +1,6 @@ from abc import ABC, abstractmethod from typing import Any, Union - +import logging from .utils import strike_dip_vector, generate_grid import beartype @@ -336,10 +336,19 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): 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 + logging.warning(f"Detected {len(collocated_clusters)} collocated point clusters. Aggregating these points.") # Aggregate data for collocated points by taking the mean of X, Y, DIP, and DIPDIR within each cluster aggregated_data = ( From c10c2e33fadcf770c33bb236fa695023e715d027 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 12 Aug 2024 11:22:14 +1000 Subject: [PATCH 049/187] fix: add str for paths - gdal does not accept pathlibs --- map2loop/mapdata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index bd83f0eb..467946bb 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -508,7 +508,7 @@ def __retrieve_tif(self, filename: str): with open(tmp_file, "wb") as fh: fh.write(coverage.read()) - tif = gdal.Open(tmp_file) + tif = gdal.Open(str(tmp_file)) elif filename == "hawaii": import netCDF4 @@ -547,7 +547,7 @@ def __retrieve_tif(self, filename: str): gdal.FileFromMemBuffer(mmap_name, image_data.read()) tif = gdal.Open(mmap_name) else: - tif = gdal.Open(filename, gdal.GA_ReadOnly) + tif = gdal.Open(str(filename), gdal.GA_ReadOnly) # except Exception: # print( # f"Failed to open geoTIFF file from '{filename}'\n" From e78ea7e5d2136348457dddff1c4b26e834c28d91 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 14:16:22 +1000 Subject: [PATCH 050/187] fix: update minimum_fault_length as per code review --- map2loop/config.py | 1 + map2loop/deformation_history.py | 4 +++- map2loop/mapdata.py | 17 ++++++++--------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index 21d9e536..fd55de3a 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -61,6 +61,7 @@ def __init__(self): "dipestimate_text": "'NORTH_EAST','NORTH',,'NOT ACCESSED'", "name_column": "NAME", "objectid_column": "ID", + "minimum_fault_length": None, } self.fold_config = { "structtype_column": "FEATURE", diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index 2fe36310..d313c903 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -4,6 +4,8 @@ import geopandas import math +from .config import Config as config + class DeformationHistory: """ @@ -31,7 +33,7 @@ def __init__(self): The initialiser for the deformation history. All attributes are defaulted """ - self.minimum_fault_length_to_export = 0.0 + self.minimum_fault_length_to_export = config().fault_config["minimum_fault_length"] self.history = [] self.fault_fault_relationships = [] diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 467946bb..27b8d19a 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -907,20 +907,19 @@ def parse_fault_map(self) -> tuple: # Create new geodataframe faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) + # Get fault configuration + config = self.config.fault_config + # crop by minimum fault length - self.minimum_fault_length = 0.0 - - try: - self.minimum_fault_length = self.config.fault_config["minimum_fault_length"] - except KeyError: ### if argument missing from config dictionary - print("Minimum fault length not defined in config dictionary; including all faults in map2loop project\n") ## TODO: pass this warning to logger + if config['minimum_fault_length'] is None: + self.minimum_fault_length = round(min(faults.geometry.length), 3) + else: + self.minimum_fault_length = config['minimum_fault_length'] # Filter faults based on the minimum fault length - faults = faults.loc[faults.geometry.length > self.minimum_fault_length] - + faults = faults.loc[faults.geometry.length >= self.minimum_fault_length] - config = self.config.fault_config if config["structtype_column"] in self.raw_data[Datatype.FAULT]: faults["FEATURE"] = self.raw_data[Datatype.FAULT][config["structtype_column"]] From fb5efaefb1709b5e006c61820c3582342c74908b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 14:28:22 +1000 Subject: [PATCH 051/187] fix: add pathlibs where possible in m2model_wrapper --- map2loop/map2model_wrapper.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index d2bc564e..fbf76481 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -1,9 +1,13 @@ +# internal imports +from .m2l_enums import VerboseLevel + +# external imports import map2model import pandas import numpy import os -from .m2l_enums import VerboseLevel import re +import pathlib class Map2ModelWrapper: @@ -133,9 +137,9 @@ def run(self, verbose_level: VerboseLevel = None): } # TODO: Simplify. Note: this is external so have to match fix to map2model module run_log = map2model.run( - os.path.join(self.map_data.map2model_tmp_path), - os.path.join(self.map_data.map2model_tmp_path, "geology_wkt.csv"), - os.path.join(self.map_data.map2model_tmp_path, "faults_wkt.csv"), + pathlib.Path(self.map_data.map2model_tmp_path), + pathlib.Path(self.map_data.map2model_tmp_path) / "geology_wkt.csv", + pathlib.Path(self.map_data.map2model_tmp_path) / "faults_wkt.csv", "", self.map_data.get_bounding_box(), map2model_code_map, @@ -150,7 +154,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse units sorted units_sorted = pandas.read_csv( - os.path.join(self.map_data.map2model_tmp_path, "units_sorted.txt"), + pathlib.Path(self.map_data.map2model_tmp_path) / "units_sorted.txt", header=None, sep=' ', ) @@ -161,9 +165,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse fault intersections out = [] - fault_fault_intersection_filename = os.path.join( - self.map_data.map2model_tmp_path, "fault-fault-intersection.txt" - ) + fault_fault_intersection_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "fault-fault-intersection.txt" if ( os.path.isfile(fault_fault_intersection_filename) and os.path.getsize(fault_fault_intersection_filename) > 0 @@ -188,9 +190,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse unit fault relationships out = [] - unit_fault_intersection_filename = os.path.join( - self.map_data.map2model_tmp_path, "unit-fault-intersection.txt" - ) + unit_fault_intersection_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "unit-fault-intersection.txt" if ( os.path.isfile(unit_fault_intersection_filename) and os.path.getsize(unit_fault_intersection_filename) > 0 @@ -211,12 +211,11 @@ def run(self, verbose_level: VerboseLevel = None): # Parse unit unit relationships units = [] links = [] - graph_filename = os.path.join( - self.map_data.map2model_tmp_path, "graph_all_None.gml.txt" - ) + graph_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "graph_all_None.gml.txt" + if os.path.isfile(graph_filename) and os.path.getsize(graph_filename) > 0: with open( - os.path.join(self.map_data.map2model_tmp_path, "graph_all_None.gml.txt") + pathlib.Path(self.map_data.map2model_tmp_path) / "graph_all_None.gml.txt" ) as file: contents = file.read() segments = contents.split("\n\n") From 8892241829be9c59230d2d213c94dafa93ecdbfd Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 14:30:42 +1000 Subject: [PATCH 052/187] fix: add pathlib in mapdata.py --- map2loop/mapdata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 27b8d19a..8f55f9ca 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -1278,7 +1278,7 @@ def export_wkt_format_files(self): geology["ROCKTYPE1"] = geology["ROCKTYPE1"].replace("", "None") geology["ROCKTYPE2"] = geology["ROCKTYPE2"].replace("", "None") geology.to_csv( - os.path.join(self.map2model_tmp_path, "geology_wkt.csv"), + pathlib.Path(self.map2model_tmp_path) / "geology_wkt.csv", sep="\t", index=False, ) @@ -1295,7 +1295,7 @@ def export_wkt_format_files(self): faults = self.get_map_data(Datatype.FAULT).copy() faults.rename(columns={"geometry": "WKT"}, inplace=True) faults.to_csv( - os.path.join(self.map2model_tmp_path, "faults_wkt.csv"), + pathlib.Path(self.map2model_tmp_path) / "faults_wkt.csv", sep="\t", index=False, ) From 5a5e0d74008ec22f64d18fdbf0eb1550cb14c55c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 15:37:55 +1000 Subject: [PATCH 053/187] fix: revert pathlib in map2model.run --- map2loop/map2model_wrapper.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index fbf76481..29e9cfb2 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -137,9 +137,9 @@ def run(self, verbose_level: VerboseLevel = None): } # TODO: Simplify. Note: this is external so have to match fix to map2model module run_log = map2model.run( - pathlib.Path(self.map_data.map2model_tmp_path), - pathlib.Path(self.map_data.map2model_tmp_path) / "geology_wkt.csv", - pathlib.Path(self.map_data.map2model_tmp_path) / "faults_wkt.csv", + os.path.join(self.map_data.map2model_tmp_path), + os.path.join(self.map_data.map2model_tmp_path, "geology_wkt.csv"), + os.path.join(self.map_data.map2model_tmp_path, "faults_wkt.csv"), "", self.map_data.get_bounding_box(), map2model_code_map, @@ -154,7 +154,7 @@ def run(self, verbose_level: VerboseLevel = None): # Parse units sorted units_sorted = pandas.read_csv( - pathlib.Path(self.map_data.map2model_tmp_path) / "units_sorted.txt", + os.path.join(self.map_data.map2model_tmp_path, "units_sorted.txt"), header=None, sep=' ', ) @@ -165,7 +165,9 @@ def run(self, verbose_level: VerboseLevel = None): # Parse fault intersections out = [] - fault_fault_intersection_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "fault-fault-intersection.txt" + fault_fault_intersection_filename = os.path.join( + self.map_data.map2model_tmp_path, "fault-fault-intersection.txt" + ) if ( os.path.isfile(fault_fault_intersection_filename) and os.path.getsize(fault_fault_intersection_filename) > 0 @@ -190,7 +192,9 @@ def run(self, verbose_level: VerboseLevel = None): # Parse unit fault relationships out = [] - unit_fault_intersection_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "unit-fault-intersection.txt" + unit_fault_intersection_filename = os.path.join( + self.map_data.map2model_tmp_path, "unit-fault-intersection.txt" + ) if ( os.path.isfile(unit_fault_intersection_filename) and os.path.getsize(unit_fault_intersection_filename) > 0 @@ -211,11 +215,12 @@ def run(self, verbose_level: VerboseLevel = None): # Parse unit unit relationships units = [] links = [] - graph_filename = pathlib.Path(self.map_data.map2model_tmp_path) / "graph_all_None.gml.txt" - + graph_filename = os.path.join( + self.map_data.map2model_tmp_path, "graph_all_None.gml.txt" + ) if os.path.isfile(graph_filename) and os.path.getsize(graph_filename) > 0: with open( - pathlib.Path(self.map_data.map2model_tmp_path) / "graph_all_None.gml.txt" + os.path.join(self.map_data.map2model_tmp_path, "graph_all_None.gml.txt") ) as file: contents = file.read() segments = contents.split("\n\n") From 6b954663e6601503d80bcce4564a2fe535254a36 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 15:49:54 +1000 Subject: [PATCH 054/187] fix: proj should not have temp files --- map2loop/mapdata.py | 4 ++-- map2loop/project.py | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 8f55f9ca..b673caae 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -1097,7 +1097,7 @@ def set_working_projection_on_map_data(self, datatype: Datatype): ) @beartype.beartype - def save_all_map_data(self, output_dir: str, extension: str = ".csv"): + def save_all_map_data(self, output_dir: pathlib.Path, extension: str = ".csv"): """ Save all the map data to file @@ -1111,7 +1111,7 @@ def save_all_map_data(self, output_dir: str, extension: str = ".csv"): self.save_raw_map_data(output_dir, i, extension) @beartype.beartype - def save_raw_map_data(self, output_dir: str, datatype: Datatype, extension: str = ".shp.zip"): + def save_raw_map_data(self, output_dir: pathlib.Path, datatype: Datatype, extension: str = ".shp.zip"): """ Save the map data from datatype to file diff --git a/map2loop/project.py b/map2loop/project.py index 2d68f116..a02b3b60 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -54,7 +54,7 @@ class Project(object): def __init__( self, verbose_level: VerboseLevel = VerboseLevel.ALL, - # tmp_path: str = "m2l_data_tmp", + tmp_path: str = "m2l_data_tmp", working_projection=None, bounding_box=None, use_australian_state_data: str = "", @@ -218,9 +218,12 @@ def __init__( self.map_data.load_all_map_data() # If flag to save out data is check do so - tmp_path = pathlib.Path(tempfile.mkdtemp()) + 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 From 23873fa16c5d9a7d41fdfff22d1ecc9461c31fb4 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 18:51:23 +1000 Subject: [PATCH 055/187] fix: update the minimum_fault_length --- map2loop/mapdata.py | 48 +++++++++++++++++++++++++++++++-------------- map2loop/project.py | 16 +++++---------- 2 files changed, 38 insertions(+), 26 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index b673caae..23b78903 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -84,7 +84,6 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): self.config_filename = None self.colour_filename = None self.verbose_level = verbose_level - self.config = Config() def set_working_projection(self, projection): @@ -648,8 +647,9 @@ def parse_fault_orientations(self) -> tuple: fault_orientations = geopandas.GeoDataFrame( self.raw_data[Datatype.FAULT_ORIENTATION]["geometry"] ) - config = self.config.fault_config - + + 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": @@ -887,7 +887,30 @@ def parse_geology_map(self) -> tuple: # Note: alt_rocktype_column and volcanic_text columns not used self.data[Datatype.GEOLOGY] = geology return (False, "") + + @beartype.beartype + def update_minimum_fault_length(self, map_mfl: float) -> None: + """ + Update the minimum fault length in the conf dictionary from map data. + length calculated from the map data in meters, rounded to 3 decimal places. + Args: + map_mfl (float): The minimum fault length calculated from the map data. + """ + + if self.config.fault_config['minimum_fault_length'] is None: + self.config.fault_config['minimum_fault_length'] = round(map_mfl, 3) + + @beartype.beartype + def get_minimum_fault_length(self) -> float: + """ + Retrieve the minimum fault length from the config. + + Returns: + float: The minimum fault length from the config dictionary. + """ + return self.config.fault_config['minimum_fault_length'] + @beartype.beartype def parse_fault_map(self) -> tuple: """ @@ -907,19 +930,13 @@ def parse_fault_map(self) -> tuple: # Create new geodataframe faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) - # Get fault configuration - config = self.config.fault_config + # update the minimum fault length in the config dictionary before cropping the faults + self.update_minimum_fault_length(map_mfl=faults.geometry.length.min()) - # crop by minimum fault length - if config['minimum_fault_length'] is None: - self.minimum_fault_length = round(min(faults.geometry.length), 3) - else: - self.minimum_fault_length = config['minimum_fault_length'] - - + # Get fault configuration + config = self.config.fault_config # Filter faults based on the minimum fault length - faults = faults.loc[faults.geometry.length >= self.minimum_fault_length] - + faults = faults.loc[faults.geometry.length >= config['minimum_fault_length']] if config["structtype_column"] in self.raw_data[Datatype.FAULT]: faults["FEATURE"] = self.raw_data[Datatype.FAULT][config["structtype_column"]] @@ -1010,8 +1027,9 @@ def parse_fault_map(self) -> tuple: axis=1, ) faults["NAME"] = faults["NAME"].str.replace(" -/?", "_", regex=True) - + print(f"Faults: {faults}") self.data[Datatype.FAULT] = faults + return (False, "") diff --git a/map2loop/project.py b/map2loop/project.py index a02b3b60..3223c7ba 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -11,6 +11,7 @@ from .stratigraphic_column import StratigraphicColumn from .deformation_history import DeformationHistory from .map2model_wrapper import Map2ModelWrapper +from .config import Config # external imports import LoopProjectFile as LPF @@ -132,7 +133,8 @@ def __init__( self.deformation_history = DeformationHistory() self.loop_filename = loop_project_filename self.overwrite_lpf = overwrite_loopprojectfile - + self.Config = Config() + # initialise the dataframes to store data in self.fault_orientations = pandas.DataFrame( columns=["ID", "DIPDIR", "DIP", "X", "Y", "Z", "featureId"] @@ -231,8 +233,8 @@ def __init__( self.deformation_history.populate(self.map_data.get_map_data(Datatype.FAULT)) # only define the minimum fault length if there are faults - if len(self.map_data.get_map_data(Datatype.FAULT))!=0: - self.deformation_history.set_minimum_fault_length(self.map_data.minimum_fault_length) + # if len(self.map_data.get_map_data(Datatype.FAULT))!=0: + # self.deformation_history.set_minimum_fault_length(self.map_data.minimum_fault_length) if len(kwargs): print(f"These keywords were not used in initialising the Loop project ({kwargs})") @@ -347,14 +349,6 @@ def get_sampler(self, datatype: Datatype): """ return self.samplers[datatype].sampler_label - def get_minimum_fault_length(self) -> float: - """ - Get the cutoff length for faults - - Returns: - float: The cutoff length - """ - return self.map_data.minimum_fault_length # Processing functions def sample_map_data(self): From e491b295f2bc82562bcbf6094bc52025eee12db5 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 18:51:40 +1000 Subject: [PATCH 056/187] tests: add tests for minimum_fault_length --- tests/mapdata/test_minimum_fault_length.py | 73 ++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 tests/mapdata/test_minimum_fault_length.py diff --git a/tests/mapdata/test_minimum_fault_length.py b/tests/mapdata/test_minimum_fault_length.py new file mode 100644 index 00000000..1dddd998 --- /dev/null +++ b/tests/mapdata/test_minimum_fault_length.py @@ -0,0 +1,73 @@ +import pytest +import geopandas as gpd +from shapely.geometry import LineString + +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'] = None + + 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 + + # Create a faults dataset with different fault lengths + faults = gpd.GeoDataFrame({ + 'geometry': [ + LineString([(0, 0), (1, 1)]), # Length ~1.41 + LineString([(0, 0), (2, 2)]), # Length ~2.83 + ] + }) + + # Set the raw data in the map_data object to simulate loaded fault data + map_data.raw_data[Datatype.FAULT] = faults + + # Run the parsing logic which includes updating the minimum fault length + map_data.parse_fault_map() + + # Assert that the minimum fault length was updated from the data + assert map_data.config.fault_config['minimum_fault_length'] == pytest.approx(1.414, 0.001), \ + f"Expected minimum_fault_length to be 1.414, but got {map_data.config.fault_config['minimum_fault_length']}" + +# 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': [ + LineString([(0, 0), (2, 2)]), # Length ~2.83 (should be cropped) + LineString([(0, 0), (5, 5)]), # Length ~7.07 (should be cropped) + 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}" \ No newline at end of file From 94ea056c7fcef6732c4e4513ffb3faeedbbeb2fa Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 26 Sep 2024 19:39:13 +1000 Subject: [PATCH 057/187] fix: remove redundancy from project.py --- map2loop/deformation_history.py | 26 +++----------------------- map2loop/project.py | 6 ------ 2 files changed, 3 insertions(+), 29 deletions(-) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index d313c903..40c3cb06 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -4,7 +4,7 @@ import geopandas import math -from .config import Config as config +from .config import Config class DeformationHistory: @@ -32,8 +32,6 @@ def __init__(self): """ The initialiser for the deformation history. All attributes are defaulted """ - - self.minimum_fault_length_to_export = config().fault_config["minimum_fault_length"] self.history = [] self.fault_fault_relationships = [] @@ -85,25 +83,6 @@ def __init__(self): self.folds = pandas.DataFrame(numpy.empty(0, dtype=self.foldColumns)) # self.folds = self.folds.set_index("name") - def set_minimum_fault_length(self, length): - """ - Sets the minimum fault length to export - - Args: - length (float or int): - The fault length cutoff - """ - self.minimum_fault_length_to_export = length - - def get_minimum_fault_length(self): - """ - Getter for the fault length cutoff - - Returns: - float: The fault length cutoff - """ - return self.minimum_fault_length_to_export - def findfault(self, id): """ Find the fault in the summary based on its eventId @@ -275,7 +254,8 @@ def get_faults_for_export(self): Returns: pandas.DataFrame: The filtered fault summary """ - return self.faults[self.faults["length"] >= self.minimum_fault_length_to_export].copy() + mfl = Config().fault_config["minimum_fault_length"] + return self.faults[self.faults["length"] >= mfl].copy() @beartype.beartype def get_fault_relationships_with_ids(self, fault_fault_relationships: pandas.DataFrame): diff --git a/map2loop/project.py b/map2loop/project.py index 3223c7ba..d9f61ccf 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -11,7 +11,6 @@ from .stratigraphic_column import StratigraphicColumn from .deformation_history import DeformationHistory from .map2model_wrapper import Map2ModelWrapper -from .config import Config # external imports import LoopProjectFile as LPF @@ -133,7 +132,6 @@ def __init__( self.deformation_history = DeformationHistory() self.loop_filename = loop_project_filename self.overwrite_lpf = overwrite_loopprojectfile - self.Config = Config() # initialise the dataframes to store data in self.fault_orientations = pandas.DataFrame( @@ -232,10 +230,6 @@ def __init__( self.stratigraphic_column.populate(self.map_data.get_map_data(Datatype.GEOLOGY)) self.deformation_history.populate(self.map_data.get_map_data(Datatype.FAULT)) - # only define the minimum fault length if there are faults - # if len(self.map_data.get_map_data(Datatype.FAULT))!=0: - # self.deformation_history.set_minimum_fault_length(self.map_data.minimum_fault_length) - if len(kwargs): print(f"These keywords were not used in initialising the Loop project ({kwargs})") From 0857f2395af55f9aaa29b11479a04851e932e248 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 1 Oct 2024 10:40:19 +1000 Subject: [PATCH 058/187] fix: update calculate minimum_fault_length for 5% of the map area --- map2loop/mapdata.py | 68 ++++++++++------------ map2loop/project.py | 8 +-- map2loop/utils.py | 30 +++++++++- tests/mapdata/test_minimum_fault_length.py | 63 +++++++++++++++----- 4 files changed, 109 insertions(+), 60 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 23b78903..6d551e2d 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -2,7 +2,7 @@ from .m2l_enums import Datatype, Datastate, VerboseLevel from .config import Config from .aus_state_urls import AustraliaStateUrls -from .utils import generate_random_hex_colors +from .utils import generate_random_hex_colors, calculate_minimum_fault_length # external imports import geopandas @@ -85,6 +85,7 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): self.colour_filename = None self.verbose_level = verbose_level self.config = Config() + self.minimum_fault_length = None def set_working_projection(self, projection): """ @@ -162,7 +163,7 @@ def set_bounding_box(self, bounding_box): geometry=[shapely.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 @@ -887,57 +888,46 @@ def parse_geology_map(self) -> tuple: # Note: alt_rocktype_column and volcanic_text columns not used self.data[Datatype.GEOLOGY] = geology return (False, "") - - @beartype.beartype - def update_minimum_fault_length(self, map_mfl: float) -> None: - """ - Update the minimum fault length in the conf dictionary from map data. - length calculated from the map data in meters, rounded to 3 decimal places. - Args: - map_mfl (float): The minimum fault length calculated from the map data. - """ - - if self.config.fault_config['minimum_fault_length'] is None: - self.config.fault_config['minimum_fault_length'] = round(map_mfl, 3) - @beartype.beartype - def get_minimum_fault_length(self) -> float: + def get_minimum_fault_length(self) -> Union[float, int, None]: """ - Retrieve the minimum fault length from the config. - - Returns: - float: The minimum fault length from the config dictionary. + Get the minimum fault length """ - return self.config.fault_config['minimum_fault_length'] + + return self.minimum_fault_length @beartype.beartype def parse_fault_map(self) -> tuple: """ - Parse the fault shapefile data into a consistent format + Parse the fault shapefile data into a consistent format. Returns: tuple: A tuple of (bool: success/fail, str: failure message) """ # Check type of loaded fault map - if ( self.raw_data[Datatype.FAULT] is None or type(self.raw_data[Datatype.FAULT]) is not geopandas.GeoDataFrame ): return (True, "Fault map is not loaded or valid") - # Create new geodataframe + # Create a new geodataframe faults = geopandas.GeoDataFrame(self.raw_data[Datatype.FAULT]["geometry"]) - - # update the minimum fault length in the config dictionary before cropping the faults - self.update_minimum_fault_length(map_mfl=faults.geometry.length.min()) - + # Get fault configuration - config = self.config.fault_config - # Filter faults based on the minimum fault length - faults = faults.loc[faults.geometry.length >= config['minimum_fault_length']] - + config = self.config.fault_config + + # update minimum fault length either with the value from the config or calculate it + if config["minimum_fault_length"] is None: + self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, + area_percentage = 0.05) + else: + self.minimum_fault_length = config["minimum_fault_length"] + print(f'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"]] faults = faults[faults["FEATURE"].astype(str).str.contains(config["fault_text"])] @@ -1027,11 +1017,9 @@ def parse_fault_map(self) -> tuple: axis=1, ) faults["NAME"] = faults["NAME"].str.replace(" -/?", "_", regex=True) - print(f"Faults: {faults}") self.data[Datatype.FAULT] = faults return (False, "") - @beartype.beartype def parse_fold_map(self) -> tuple: @@ -1134,7 +1122,7 @@ def save_raw_map_data(self, output_dir: pathlib.Path, datatype: Datatype, extens Save the map data from datatype to file Args: - output_dir (str): + output_dir (pathlib.Path): The directory to save to datatype (Datatype): The datatype of the geopanda to save @@ -1143,12 +1131,18 @@ def save_raw_map_data(self, output_dir: pathlib.Path, datatype: Datatype, extens """ try: filename = pathlib.Path(output_dir) / f"{datatype.name}{extension}" + raw_data = self.raw_data[datatype] + + if raw_data is None: + ## Leaving this print statement in for now, as it will be useful for logging, but repetitive as a warning message + # print(f"No data available for {datatype.name}. Skipping saving to file {filename}.") + return if extension == ".csv": - df = self.raw_data[datatype] - df.to_csv(filename, index=False) + raw_data.to_csv(filename, index=False) # Save as CSV else: self.raw_data[datatype].to_file(filename) + except Exception as e: print(f"Failed to save {datatype.name} to file named {filename}\nError: {str(e)}") diff --git a/map2loop/project.py b/map2loop/project.py index d9f61ccf..be50ee85 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -4,7 +4,7 @@ from .m2l_enums import VerboseLevel, ErrorState, Datatype from .mapdata import MapData from .sampler import Sampler, SamplerDecimator, SamplerSpacing -from .thickness_calculator import ThicknessCalculator, ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint +from .thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint from .throw_calculator import ThrowCalculator, ThrowCalculatorAlpha from .fault_orientation import FaultOrientation from .sorter import Sorter, SorterAgeBased, SorterAlpha, SorterUseNetworkX, SorterUseHint @@ -14,7 +14,6 @@ # external imports import LoopProjectFile as LPF -import tempfile from typing import Union from osgeo import gdal import geopandas @@ -210,10 +209,8 @@ def __init__( if config_dictionary != {}: self.map_data.config.update_from_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() @@ -265,8 +262,7 @@ def get_sorter(self): str: The name of the sorter used """ return self.sorter.sorter_label - - + @beartype.beartype def set_fault_orientation(self, fault_orientation: FaultOrientation): """ diff --git a/map2loop/utils.py b/map2loop/utils.py index 44bd0bcb..f8e98054 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -3,7 +3,7 @@ import shapely import geopandas import beartype -from typing import Union, Optional +from typing import Union, Optional, Dict import pandas @@ -371,3 +371,31 @@ def hex_to_rgb(hex_color: str) -> tuple: raise ValueError("Invalid hex color code. Contains non-hexadecimal characters.") from e return (r, g, b, alpha) + + +@beartype.beartype +def calculate_minimum_fault_length(self, 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) \ No newline at end of file diff --git a/tests/mapdata/test_minimum_fault_length.py b/tests/mapdata/test_minimum_fault_length.py index 1dddd998..123673ca 100644 --- a/tests/mapdata/test_minimum_fault_length.py +++ b/tests/mapdata/test_minimum_fault_length.py @@ -1,6 +1,7 @@ import pytest import geopandas as gpd -from shapely.geometry import LineString +import shapely +import numpy from map2loop.mapdata import MapData from map2loop.m2l_enums import VerboseLevel, Datatype @@ -19,23 +20,53 @@ def setup_map_data(): def test_update_minimum_fault_length_from_faults(setup_map_data): map_data = setup_map_data - # Create a faults dataset with different fault lengths + # 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': [ - LineString([(0, 0), (1, 1)]), # Length ~1.41 - LineString([(0, 0), (2, 2)]), # Length ~2.83 - ] - }) + '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], + }) - # Set the raw data in the map_data object to simulate loaded fault data + faults.crs = "EPSG: 7850" + + # get the cropped fault dataset from parse_fault_map map_data.raw_data[Datatype.FAULT] = faults - - # Run the parsing logic which includes updating the minimum fault length map_data.parse_fault_map() + cropped_faults = map_data.data[Datatype.FAULT] - # Assert that the minimum fault length was updated from the data - assert map_data.config.fault_config['minimum_fault_length'] == pytest.approx(1.414, 0.001), \ - f"Expected minimum_fault_length to be 1.414, but got {map_data.config.fault_config['minimum_fault_length']}" + #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): @@ -50,9 +81,9 @@ def test_cropping_faults_by_minimum_fault_length(setup_map_data): # Create a mock faults dataset with lengths < 10 and > 10 faults = gpd.GeoDataFrame({ 'geometry': [ - LineString([(0, 0), (2, 2)]), # Length ~2.83 (should be cropped) - LineString([(0, 0), (5, 5)]), # Length ~7.07 (should be cropped) - LineString([(0, 0), (10, 10)]) # Length ~14.14 (should remain) + 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], From d73b7480e85ae8cea4de76ba5e46a072982f5c2d Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 1 Oct 2024 10:41:25 +1000 Subject: [PATCH 059/187] fix: linting --- docs/source/_static/m2l_code_template.ipynb | 2 +- map2loop/map2model_wrapper.py | 1 - map2loop/thickness_calculator.py | 1 - tests/project/test_thickness_calculations.py | 1 - .../InterpolatedStructure/test_interpolated_structure.py | 1 - tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py | 1 - .../ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py | 1 - 7 files changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/source/_static/m2l_code_template.ipynb b/docs/source/_static/m2l_code_template.ipynb index 66e4a773..f305f370 100644 --- a/docs/source/_static/m2l_code_template.ipynb +++ b/docs/source/_static/m2l_code_template.ipynb @@ -46,7 +46,7 @@ "from map2loop.m2l_enums import VerboseLevel\n", "from map2loop.m2l_enums import Datatype\n", "from map2loop.sampler import SamplerSpacing, SamplerDecimator\n", - "from map2loop.sorter import SorterUseHint, SorterUseNetworkX, SorterAgeBased, SorterAlpha\n", + "from map2loop.sorter import SorterAlpha\n", "import time" ] }, diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index 29e9cfb2..e8e784b3 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -7,7 +7,6 @@ import numpy import os import re -import pathlib class Map2ModelWrapper: diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 7bdf3344..fce4f001 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -18,7 +18,6 @@ import scipy import pandas import geopandas -from statistics import mean import shapely import math diff --git a/tests/project/test_thickness_calculations.py b/tests/project/test_thickness_calculations.py index 64772292..dd2d93db 100644 --- a/tests/project/test_thickness_calculations.py +++ b/tests/project/test_thickness_calculations.py @@ -1,7 +1,6 @@ # imports import pandas import geopandas -import pytest import numpy from map2loop._datasets.geodata_files import load_map2loop_data diff --git a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index cf88d615..4590d364 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -1,6 +1,5 @@ import pandas import geopandas -import pytest import numpy from map2loop.mapdata import MapData diff --git a/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py index 6caecd6b..b7249eaf 100644 --- a/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py +++ b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py @@ -1,6 +1,5 @@ import pandas import geopandas -import pytest import numpy from map2loop.mapdata import MapData diff --git a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py index 2c59b5c7..d0427629 100644 --- a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py +++ b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py @@ -1,6 +1,5 @@ import pandas import geopandas -import pytest import numpy from map2loop.mapdata import MapData From dbc8495a7799f24e4b77f62b01ec7bf1bcfc08e7 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 1 Oct 2024 10:45:46 +1000 Subject: [PATCH 060/187] fix: typo --- map2loop/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/utils.py b/map2loop/utils.py index f8e98054..a562cf95 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -374,7 +374,7 @@ def hex_to_rgb(hex_color: str) -> tuple: @beartype.beartype -def calculate_minimum_fault_length(self, bbox: Dict[str, Union[int, float]], area_percentage: float) -> float: +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. From a5a29e4746780e130cddc21d8f38b61ef304d03e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 22 Oct 2024 12:39:39 +1100 Subject: [PATCH 061/187] fix: remove repetitive print stat --- map2loop/mapdata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 6d551e2d..a91b01da 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -924,7 +924,7 @@ def parse_fault_map(self) -> tuple: area_percentage = 0.05) else: self.minimum_fault_length = config["minimum_fault_length"] - print(f'Minimum fault length: {self.minimum_fault_length}') + # crop faults = faults.loc[faults.geometry.length >= self.minimum_fault_length] From f8e855c4029e4e780a28df5a9e4b8634407bcdf7 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 22 Oct 2024 12:53:36 +1100 Subject: [PATCH 062/187] fix: adjust thickness_calc workflow for modularity --- map2loop/project.py | 211 +++++++++++++++++++++++++++++--------------- 1 file changed, 141 insertions(+), 70 deletions(-) diff --git a/map2loop/project.py b/map2loop/project.py index be50ee85..0a7b6880 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -4,7 +4,7 @@ from .m2l_enums import VerboseLevel, ErrorState, Datatype from .mapdata import MapData from .sampler import Sampler, SamplerDecimator, SamplerSpacing -from .thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint +from .thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint, ThicknessCalculator from .throw_calculator import ThrowCalculator, ThrowCalculatorAlpha from .fault_orientation import FaultOrientation from .sorter import Sorter, SorterAgeBased, SorterAlpha, SorterUseNetworkX, SorterUseHint @@ -14,7 +14,7 @@ # external imports import LoopProjectFile as LPF -from typing import Union +from typing import Union, List from osgeo import gdal import geopandas import beartype @@ -123,6 +123,7 @@ def __init__( self.samplers = [SamplerDecimator()] * len(Datatype) self.set_default_samplers() self.sorter = SorterUseHint() + self.thickness_calculator = [InterpolatedStructure()] self.throw_calculator = ThrowCalculatorAlpha() self.fault_orientation = FaultOrientationNearest() self.map_data = MapData(verbose_level=verbose_level) @@ -418,53 +419,115 @@ def calculate_stratigraphic_order(self, take_best=False): self.map_data, ) + @beartype.beartype + def set_thickness_calculator(self, thickness_calculator: Union['ThicknessCalculator', List['ThicknessCalculator']]) -> 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 = [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 + 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): """ - Use the stratigraphic column, and fault and contact data to estimate unit thicknesses - """ - thickness_calculator_labels = ['ThicknessCalculatorAlpha', 'InterpolatedStructure', 'StructuralPoint', ] + 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 - thickness_calculation_results = [] + Raises: + None + """ - for label in thickness_calculator_labels: - if label == 'InterpolatedStructure': - calculator = InterpolatedStructure() - elif label == 'StructuralPoint': - calculator = StructuralPoint() - elif label == 'ThicknessCalculatorAlpha': - calculator = ThicknessCalculatorAlpha() - + labels = [] + + for calculator in self.thickness_calculator: + result = calculator.compute( self.stratigraphic_column.stratigraphicUnits, self.stratigraphic_column.column, self.map_data.basal_contacts, self.structure_samples, self.map_data, - )[['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev']] + )[['ThicknessMean', 'ThicknessMedian', 'ThicknessStdDev']].to_numpy() + + label = calculator.thickness_calculator_label + labels.append(label) - # Rename the columns - result = result.rename(columns={ - 'ThicknessMean': f'ThicknessMean_{label}', - 'ThicknessMedian': f'ThicknessMedian_{label}', - 'ThicknessStdDev': f'ThicknessStdDev_{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)) - thickness_calculation_results.append(result) + # 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" - thickness_combined_results = pandas.concat(thickness_calculation_results, axis=1) + # 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.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessMean_ThicknessCalculatorAlpha'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessMedian_ThicknessCalculatorAlpha'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_ThicknessCalculatorAlpha'] = thickness_combined_results['ThicknessStdDev_ThicknessCalculatorAlpha'] - - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_InterpolatedStructure'] = thickness_combined_results['ThicknessMean_InterpolatedStructure'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_InterpolatedStructure'] = thickness_combined_results['ThicknessMedian_InterpolatedStructure'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_InterpolatedStructure'] = thickness_combined_results['ThicknessStdDev_InterpolatedStructure'] + self.thickness_calculator_labels = labels - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMean_StructuralPoint'] = thickness_combined_results['ThicknessMean_StructuralPoint'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessMedian_StructuralPoint'] = thickness_combined_results['ThicknessMedian_StructuralPoint'] - self.stratigraphic_column.stratigraphicUnits.loc[:, 'ThicknessStdDev_StructuralPoint'] = thickness_combined_results['ThicknessStdDev_StructuralPoint'] def calculate_fault_orientations(self): if self.map_data.get_map_data(Datatype.FAULT_ORIENTATION) is not None: @@ -621,43 +684,43 @@ def save_into_projectfile(self): stratigraphic_data["group"] = self.stratigraphic_column.stratigraphicUnits["group"] stratigraphic_data["enabled"] = 1 - - # stratigraphic_data["ThicknessMean"] = self.stratigraphic_column.stratigraphicUnits[ - # 'ThicknessMean' - # ] - # stratigraphic_data['ThicknessMedian'] = self.stratigraphic_column.stratigraphicUnits[ - # 'ThicknessMedian' - # ] - # stratigraphic_data["ThicknessStdDev"] = self.stratigraphic_column.stratigraphicUnits[ - # 'ThicknessStdDev' - # ] - + + # Length of the column (number of rows in stratigraphicUnits) column_len = len(self.stratigraphic_column.stratigraphicUnits) - - # thickness means by calculator - stratigraphic_data["ThicknessMean"] = list(zip( - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_ThicknessCalculatorAlpha']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_InterpolatedStructure']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMean_StructuralPoint']), - [0] * column_len, - [0] * column_len)) - - # thickness medians by calculator - stratigraphic_data["ThicknessMedian"] = list(zip( - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_ThicknessCalculatorAlpha']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_InterpolatedStructure']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessMedian_StructuralPoint']), - [0] * column_len, - [0] * column_len)) - - # thickness medians by calculator - stratigraphic_data["ThicknessStdDev"] = list(zip( - list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_ThicknessCalculatorAlpha']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_InterpolatedStructure']), - list(self.stratigraphic_column.stratigraphicUnits['ThicknessStdDev_StructuralPoint']), - [0] * column_len, - [0] * column_len)) - + + # Function to retrieve a column if it exists, otherwise return a list of default values + def get_column_or_default(column_name, default_value, length): + return list(self.stratigraphic_column.stratigraphicUnits.get(column_name, [default_value] * length)) + + # Get the current list of thickness calculator labels dynamically + thickness_labels = self.thickness_calculator_labels + + # Define a constant for the maximum number of calculators (5 as per your requirement) + MAX_CALCULATORS = 5 + + # Create lists for mean, median, and stddev values for each calculator dynamically + thickness_mean_list = [ + get_column_or_default(f'{label}_mean', 0, column_len) for label in thickness_labels + ] + thickness_median_list = [ + get_column_or_default(f'{label}_median', 0, column_len) for label in thickness_labels + ] + thickness_stddev_list = [ + get_column_or_default(f'{label}_stddev', 0, column_len) for label in thickness_labels + ] + + # Pad with zeros if the number of calculators is less than MAX_CALCULATORS + for _ in range(MAX_CALCULATORS - len(thickness_mean_list)): + thickness_mean_list.append([0] * column_len) + thickness_median_list.append([0] * column_len) + thickness_stddev_list.append([0] * column_len) + + # Zip these lists into tuples for each stratigraphic row dynamically, ensuring each tuple has exactly 5 elements + stratigraphic_data["ThicknessMean"] = list(zip(*thickness_mean_list[:MAX_CALCULATORS])) + stratigraphic_data["ThicknessMedian"] = list(zip(*thickness_median_list[:MAX_CALCULATORS])) + stratigraphic_data["ThicknessStdDev"] = list(zip(*thickness_stddev_list[:MAX_CALCULATORS])) + + # Assign colours to startigraphic data stratigraphic_data["colour1Red"] = [ int(a[1:3], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] @@ -676,7 +739,15 @@ def save_into_projectfile(self): stratigraphic_data["colour2Blue"] = [ int(a * 0.95) for a in stratigraphic_data["colour1Blue"] ] - LPF.Set(self.loop_filename, "stratigraphicLog", data=stratigraphic_data) + + # 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") + + thickness_calculator_labels = [tuple(self.thickness_calculator_labels[:5])] + + #save into LPF + LPF.Set(self.loop_filename, "stratigraphicLog", data=stratigraphic_data, thickness_calculator_data = thickness_calculator_labels, verbose=True) # Save contacts contacts_data = numpy.zeros(len(self.map_data.sampled_contacts), LPF.contactObservationType) From da9d5adcd87d9df13f7ac2810ef2e1e2230258f3 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 22 Oct 2024 12:53:52 +1100 Subject: [PATCH 063/187] fix: remove unnecessary fields --- map2loop/stratigraphic_column.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/map2loop/stratigraphic_column.py b/map2loop/stratigraphic_column.py index d580adae..cdd8e9f0 100644 --- a/map2loop/stratigraphic_column.py +++ b/map2loop/stratigraphic_column.py @@ -40,15 +40,15 @@ def __init__(self): ("maxAge", float), ("group", str), ("supergroup", str), - ("ThicknessMean_ThicknessCalculatorAlpha", float), - ("ThicknessMedian_ThicknessCalculatorAlpha", float), - ("ThicknessStdDev_ThicknessCalculatorAlpha", float), - ("ThicknessMean_InterpolatedStructure", float), - ("ThicknessMedian_InterpolatedStructure", float), - ("ThicknessStdDev_InterpolatedStructure", float), - ("ThicknessMean_StructuralPoint", float), - ("ThicknessMedian_StructuralPoint", float), - ("ThicknessStdDev_StructuralPoint", float), + # ("1_Thickness_Mean", float), + # ("1_Thickness_Median", float), + # ("1_ThicknessStdDev", float), + # ("2_ThicknessMean", float), + # ("2_ThicknessMedian", float), + # ("2_ThicknessStdDev", float), + # ("3_ThicknessMean_", float), + # ("3_ThicknessMedian_StructuralPoint", float), + # ("3_ThicknessStdDev_StructuralPoint", float), ("colour", str), # ("indexInGroup", int), # ("groupNum", int), From 4096603792a9b79f608f346b8d797df0d193ab0a Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 22 Oct 2024 12:54:04 +1100 Subject: [PATCH 064/187] fix: update thickness tests --- tests/project/test_thickness_calculations.py | 50 +++++++++++--------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/tests/project/test_thickness_calculations.py b/tests/project/test_thickness_calculations.py index dd2d93db..df3ce5d2 100644 --- a/tests/project/test_thickness_calculations.py +++ b/tests/project/test_thickness_calculations.py @@ -4,6 +4,7 @@ import numpy from map2loop._datasets.geodata_files import load_map2loop_data +from map2loop.thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint from map2loop import Project @@ -16,15 +17,6 @@ '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, - 'ThicknessMean_InterpolatedStructure': [0.0] * 11, - 'ThicknessMedian_InterpolatedStructure': [0.0] * 11, - 'ThicknessStdDev_InterpolatedStructure': [0.0] * 11, - 'ThicknessMean_StructuralPoint': [0.0] * 11, - 'ThicknessMedian_StructuralPoint': [0.0] * 11, - 'ThicknessStdDev_StructuralPoint': [0.0] * 11, 'stratigraphic_Order': list(range(11)), 'colour': [ '#5d7e60', '#387866', '#628304', '#a2f290', '#0c2562', @@ -104,6 +96,8 @@ import map2loop import pathlib + + def test_calculate_unit_thicknesses(): units = st_units @@ -131,26 +125,38 @@ def test_calculate_unit_thicknesses(): project.stratigraphic_column.stratigraphicUnits = units project.stratigraphic_column.column = stratigraphic_order - # Run the calculate_unit_thicknesses method + ## 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 + + project.set_thickness_calculator([StructuralPoint(), InterpolatedStructure()]) + 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() - # Check if thicknesses have been calculated + # # Check if all thicknesses have been calculated columns_to_check = [ - 'ThicknessMean_ThicknessCalculatorAlpha', - 'ThicknessMedian_ThicknessCalculatorAlpha', - 'ThicknessStdDev_ThicknessCalculatorAlpha', - 'ThicknessMean_InterpolatedStructure', - 'ThicknessMedian_InterpolatedStructure', - 'ThicknessStdDev_InterpolatedStructure', - 'ThicknessMean_StructuralPoint', - 'ThicknessMedian_StructuralPoint', - 'ThicknessStdDev_StructuralPoint' + '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' \ No newline at end of file + 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' + + \ No newline at end of file From 58edbbfdc4d34fd6a40732b29311c41a89831222 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 22 Oct 2024 15:56:36 +1100 Subject: [PATCH 065/187] fix: add ignore_fault_codes and tests for ignore_lithology_code and ignore_fault_code --- map2loop/_datasets/config_files/NSW.json | 4 +- map2loop/_datasets/config_files/QLD.json | 2 +- map2loop/_datasets/config_files/SA.json | 2 +- map2loop/_datasets/config_files/TAS.json | 2 +- map2loop/_datasets/config_files/VIC.json | 2 +- map2loop/_datasets/config_files/WA.json | 2 +- .../geodata_files/hamersley/faults.geojson | 42 +++++++++ map2loop/config.py | 3 +- map2loop/mapdata.py | 87 ++++++++++++++++--- map2loop/project.py | 31 ++++++- .../test_ignore_codes_setters_getters.py | 64 ++++++++++++++ 11 files changed, 217 insertions(+), 24 deletions(-) create mode 100644 map2loop/_datasets/geodata_files/hamersley/faults.geojson create mode 100644 tests/project/test_ignore_codes_setters_getters.py diff --git a/map2loop/_datasets/config_files/NSW.json b/map2loop/_datasets/config_files/NSW.json index 9261fc2d..88675381 100644 --- a/map2loop/_datasets/config_files/NSW.json +++ b/map2loop/_datasets/config_files/NSW.json @@ -24,7 +24,7 @@ "intrusive_text": "intrusive", "volcanic_text": "volcanic", "objectid_column": "ID", - "ignore_codes": ["cover"]}, + "ignore_lithology_codes": ["cover"]}, "fault": { "structtype_column": "boundaryty", "fault_text": "Fault", @@ -36,7 +36,7 @@ "dipestimate_column": "faultdipan", "dipestimate_text": "Moderate,Listric,Steep,Vertical", "name_column": "name", - "objectid_column": "unique_id" + "objectid_column": "unique_id", }, "fold": { "structtype_column": "codedescpt", diff --git a/map2loop/_datasets/config_files/QLD.json b/map2loop/_datasets/config_files/QLD.json index 7d93454e..d4a3b35e 100644 --- a/map2loop/_datasets/config_files/QLD.json +++ b/map2loop/_datasets/config_files/QLD.json @@ -24,7 +24,7 @@ "intrusive_text": "Y", "volcanic_text": "VOLCANIC", "objectid_column": "ID", - "ignore_codes": ["cover"] + "ignore_lithology_codes": ["cover"] }, "fault": { "structtype_column": "type", diff --git a/map2loop/_datasets/config_files/SA.json b/map2loop/_datasets/config_files/SA.json index f32022f4..daf2806e 100644 --- a/map2loop/_datasets/config_files/SA.json +++ b/map2loop/_datasets/config_files/SA.json @@ -24,7 +24,7 @@ "intrusive_text": "intrusive", "volcanic_text": "volc", "objectid_column": "ID", - "ignore_codes": ["cover"] + "ignore_lithology_codes": ["cover"] }, "fault": { "structtype_column": "descriptio", diff --git a/map2loop/_datasets/config_files/TAS.json b/map2loop/_datasets/config_files/TAS.json index a25adf23..d795f8d2 100644 --- a/map2loop/_datasets/config_files/TAS.json +++ b/map2loop/_datasets/config_files/TAS.json @@ -24,7 +24,7 @@ "intrusive_text": "granit", "volcanic_text": "volc", "objectid_column": "ID", - "ignore_codes": ["cover"] + "ignore_lithology_codes": ["cover"] }, "fault": { "structtype_column": "TYPE", diff --git a/map2loop/_datasets/config_files/VIC.json b/map2loop/_datasets/config_files/VIC.json index 16bb899f..b2762530 100644 --- a/map2loop/_datasets/config_files/VIC.json +++ b/map2loop/_datasets/config_files/VIC.json @@ -24,7 +24,7 @@ "intrusive_text": "intrusion", "volcanic_text": "volc", "objectid_column": "ID", - "ignore_codes": ["cover"] + "ignore_lithology_codes": ["cover"] }, "fault": { "structtype_column": "featuretyp", diff --git a/map2loop/_datasets/config_files/WA.json b/map2loop/_datasets/config_files/WA.json index d85e4f21..14e70c0e 100644 --- a/map2loop/_datasets/config_files/WA.json +++ b/map2loop/_datasets/config_files/WA.json @@ -24,7 +24,7 @@ "intrusive_text": "intrusive", "volcanic_text": "volcanic", "objectid_column": "ID", - "ignore_codes": ["cover"] + "ignore_lithology_codes": ["cover"] }, "fault": { "structtype_column": "feature", diff --git a/map2loop/_datasets/geodata_files/hamersley/faults.geojson b/map2loop/_datasets/geodata_files/hamersley/faults.geojson new file mode 100644 index 00000000..bfc9d5dd --- /dev/null +++ b/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/map2loop/config.py b/map2loop/config.py index fd55de3a..1736bc49 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -47,7 +47,7 @@ def __init__(self): "intrusive_text": "intrusive", "volcanic_text": "volcanic", "objectid_column": "ID", - "ignore_codes": ["cover"], + "ignore_lithology_codes": ["cover"], } self.fault_config = { "structtype_column": "FEATURE", @@ -62,6 +62,7 @@ def __init__(self): "name_column": "NAME", "objectid_column": "ID", "minimum_fault_length": None, + "ignore_fault_codes": [None], } self.fold_config = { "structtype_column": "FEATURE", diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index a91b01da..2b684593 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -273,27 +273,66 @@ def get_colour_filename(self): return self.colour_filename @beartype.beartype - def set_ignore_codes(self, codes: list): + def set_ignore_lithology_codes(self, codes: list): """ - Set the codes to ignore in the geology shapefile + 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): - The list of codes to ignore + 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_codes"] = codes + 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_codes(self) -> list: + def get_ignore_lithology_codes(self) -> list: """ - Get the list of codes to ignore + 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: The list of strings to ignore + 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. """ - return self.config.geology_config["ignore_codes"] + 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): @@ -879,7 +918,7 @@ def parse_geology_map(self) -> tuple: 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_codes"]: + 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)] @@ -920,14 +959,14 @@ def parse_fault_map(self) -> tuple: # update minimum fault length either with the value from the config or calculate it if config["minimum_fault_length"] is None: - self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, - area_percentage = 0.05) + self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, area_percentage = 0.05) else: self.minimum_fault_length = config["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"]] faults = faults[faults["FEATURE"].astype(str).str.contains(config["fault_text"])] @@ -941,6 +980,30 @@ def parse_fault_map(self) -> tuple: 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: + # print(f"Warning: {non_existing_codes} set to fault ignore codes are not in the provided data. Skipping") + # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + + # Filter the DataFrame to remove rows where 'NAME' is in the existing_codes + if existing_codes: + faults = faults[~faults["NAME"].isin(existing_codes)] + # print(f"The following codes were found and removed: {existing_codes}") + # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + else: + pass + # print("None of the fault ignore codes exist in the original fault data.") + + #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 diff --git a/map2loop/project.py b/map2loop/project.py index 0a7b6880..de2dff3c 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -233,16 +233,39 @@ def __init__( # Getters and Setters @beartype.beartype - def set_ignore_codes(self, codes: list): + def set_ignore_lithology_codes(self, codes: list): """ - Set the ignore codes (a list of unit names to ignore in the geology shapefile) + 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): The list of strings to ignore + codes (list): + A list of strings representing the lithology unit names to be ignored + in the geological shapefile. """ - self.map_data.set_ignore_codes(codes) + 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): diff --git a/tests/project/test_ignore_codes_setters_getters.py b/tests/project/test_ignore_codes_setters_getters.py new file mode 100644 index 00000000..26eaf672 --- /dev/null +++ b/tests/project/test_ignore_codes_setters_getters.py @@ -0,0 +1,64 @@ +import pathlib +import pytest +from map2loop.project import Project +from map2loop.m2l_enums import Datatype +import map2loop + + + + + +# 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", + }, + } + + 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 + ) + + # 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() \ No newline at end of file From 0c236b8f8ac85a85c281757a5502fb1dd9470743 Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 08:48:32 +0930 Subject: [PATCH 066/187] fix: try relative path ../_datasets --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index c67ad436..cc9e8321 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -13,7 +13,7 @@ def load_hamersley_geology(): Returns: geopandas.GeoDataFrame: The geology data """ - stream = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/geology.geojson") + stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") return geopandas.read_file(stream) @@ -29,7 +29,7 @@ def load_hamersley_structure(): geopandas.GeoDataFrame: The structure data """ - path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/structure.geojson") + path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") return geopandas.read_file(path) def load_hamersley_dtm(): @@ -39,5 +39,5 @@ def load_hamersley_dtm(): Returns: gdal.Dataset: The DTM data """ - path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/dtm_rp.tif") + path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") return gdal.Open(path) From a797855f3acf834193f10f003148cdb8a387d00d Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 08:52:31 +0930 Subject: [PATCH 067/187] fix: use only path instead of pkg_resources --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index cc9e8321..5126dddd 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -13,7 +13,8 @@ def load_hamersley_geology(): Returns: geopandas.GeoDataFrame: The geology data """ - stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") + # stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") + stream = "../_datasets/geodata_files/hamersley/geology.geojson" return geopandas.read_file(stream) @@ -29,7 +30,8 @@ def load_hamersley_structure(): geopandas.GeoDataFrame: The structure data """ - path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") + # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") + path = "../_datasets/geodata_files/hamersley/structure.geojson" return geopandas.read_file(path) def load_hamersley_dtm(): @@ -39,5 +41,6 @@ def load_hamersley_dtm(): Returns: gdal.Dataset: The DTM data """ - path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") + # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") + path = "../_datasets/geodata_files/hamersley/dtm_rp.tif" return gdal.Open(path) From b2ea63f24083efefab317c47d0092d53782b3421 Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 08:55:33 +0930 Subject: [PATCH 068/187] fix: try full path --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index 5126dddd..c6dc5abb 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -14,7 +14,7 @@ def load_hamersley_geology(): geopandas.GeoDataFrame: The geology data """ # stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") - stream = "../_datasets/geodata_files/hamersley/geology.geojson" + stream = "map2loop/map2loop/_datasets/geodata_files/hamersley/geology.geojson" return geopandas.read_file(stream) @@ -31,7 +31,7 @@ def load_hamersley_structure(): """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") - path = "../_datasets/geodata_files/hamersley/structure.geojson" + path = "map2loop/map2loop/_datasets/geodata_files/hamersley/structure.geojson" return geopandas.read_file(path) def load_hamersley_dtm(): @@ -42,5 +42,5 @@ def load_hamersley_dtm(): gdal.Dataset: The DTM data """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") - path = "../_datasets/geodata_files/hamersley/dtm_rp.tif" + path = "map2loop/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif" return gdal.Open(path) From dd1234df829da83e8c44c3668d3dfb158cd74f4e Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 09:05:13 +0930 Subject: [PATCH 069/187] fix: load only using path /hamersley --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index c6dc5abb..afd19141 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -14,7 +14,7 @@ def load_hamersley_geology(): geopandas.GeoDataFrame: The geology data """ # stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") - stream = "map2loop/map2loop/_datasets/geodata_files/hamersley/geology.geojson" + stream = "/hamersley/geology.geojson" return geopandas.read_file(stream) @@ -31,7 +31,7 @@ def load_hamersley_structure(): """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") - path = "map2loop/map2loop/_datasets/geodata_files/hamersley/structure.geojson" + path = "/hamersley/structure.geojson" return geopandas.read_file(path) def load_hamersley_dtm(): @@ -42,5 +42,5 @@ def load_hamersley_dtm(): gdal.Dataset: The DTM data """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") - path = "map2loop/map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif" + path = "/hamersley/dtm_rp.tif" return gdal.Open(path) From ab6468371306e24aa816e81034fdaef0852e608b Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 09:13:22 +0930 Subject: [PATCH 070/187] fix: try ./map2loop/_datasets/geodata_files/ --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index afd19141..46f05ed0 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -14,7 +14,7 @@ def load_hamersley_geology(): geopandas.GeoDataFrame: The geology data """ # stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") - stream = "/hamersley/geology.geojson" + stream = "./map2loop/_datasets/geodata_files/hamersley/geology.geojson" return geopandas.read_file(stream) @@ -31,7 +31,7 @@ def load_hamersley_structure(): """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") - path = "/hamersley/structure.geojson" + path = "./map2loop/_datasets/geodata_files/structures.geojson" return geopandas.read_file(path) def load_hamersley_dtm(): @@ -42,5 +42,5 @@ def load_hamersley_dtm(): gdal.Dataset: The DTM data """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") - path = "/hamersley/dtm_rp.tif" + path = "./map2loop/_datasets/geodata_files/dtm_rp.tif" return gdal.Open(path) From bcf114b6f3938c28181ccdc9772e298dbe712ece Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 09:17:27 +0930 Subject: [PATCH 071/187] fix: use correct path --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index 46f05ed0..bfe64462 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -31,7 +31,7 @@ def load_hamersley_structure(): """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") - path = "./map2loop/_datasets/geodata_files/structures.geojson" + path = "./map2loop/_datasets/geodata_files/hamersley/structures.geojson" return geopandas.read_file(path) def load_hamersley_dtm(): @@ -42,5 +42,5 @@ def load_hamersley_dtm(): gdal.Dataset: The DTM data """ # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") - path = "./map2loop/_datasets/geodata_files/dtm_rp.tif" + path = "./map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif" return gdal.Open(path) From ac61527181ce3a00fcfdf759b41f56c31ac452fe Mon Sep 17 00:00:00 2001 From: rabii-chaarani Date: Wed, 23 Oct 2024 09:40:11 +0930 Subject: [PATCH 072/187] refactor: back to original code --- map2loop/_datasets/geodata_files/load_map2loop_data.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index bfe64462..c67ad436 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -13,8 +13,7 @@ def load_hamersley_geology(): Returns: geopandas.GeoDataFrame: The geology data """ - # stream = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/geology.geojson") - stream = "./map2loop/_datasets/geodata_files/hamersley/geology.geojson" + stream = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/geology.geojson") return geopandas.read_file(stream) @@ -30,8 +29,7 @@ def load_hamersley_structure(): geopandas.GeoDataFrame: The structure data """ - # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/structure.geojson") - path = "./map2loop/_datasets/geodata_files/hamersley/structures.geojson" + path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/structure.geojson") return geopandas.read_file(path) def load_hamersley_dtm(): @@ -41,6 +39,5 @@ def load_hamersley_dtm(): Returns: gdal.Dataset: The DTM data """ - # path = pkg_resources.resource_filename("../_datasets/geodata_files/hamersley/dtm_rp.tif") - path = "./map2loop/_datasets/geodata_files/hamersley/dtm_rp.tif" + path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/dtm_rp.tif") return gdal.Open(path) From d4942960f33148fd86a304c7afbe8abbb8b791e7 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 09:42:48 +1100 Subject: [PATCH 073/187] fix: add the whole hamersley folder --- MANIFEST.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index fee2a8aa..02b24a35 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,2 +1,3 @@ include map2loop/_datasets/clut_files/*.csv -include map2loop/_datasets/config_files/*.json \ No newline at end of file +include map2loop/_datasets/config_files/*.json +include map2loop/_datasets/geodata_files/hamersley/* \ No newline at end of file From 52c67242d9b74c483fe4a0953fd1879c0d6082bb Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 12:47:14 +1100 Subject: [PATCH 074/187] fix: update docker for docs --- docs/Dockerfile | 4 ++-- docs/docker-compose.yml | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index edd0bd90..2ef3c0cf 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -12,8 +12,8 @@ RUN apt-get update -qq && \ libgl1\ libtinfo5\ libtiff6\ - libgl1-mesa-glx - + libgl1-mesa-glx\ + libarchive13 COPY . /map2loop diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml index 2481428b..8e96b82d 100644 --- a/docs/docker-compose.yml +++ b/docs/docker-compose.yml @@ -1,5 +1,3 @@ -version: "3" - services: map2loop: build: From ff27e8be06c33250d5c9e9c9314c6659631b8282 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 14:10:55 +1100 Subject: [PATCH 075/187] fix: update the docs-deploy for master branch only --- .github/workflows/CD.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 4419873a..6614a72d 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -225,6 +225,7 @@ jobs: documentation-test: runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 - run: | @@ -240,7 +241,8 @@ jobs: documentation-deploy: runs-on: ubuntu-latest needs: [release-please, documentation-test] - if: ${{ needs.release-please.outputs.release_created }} + if: ${{ needs.release-please.outputs.release_created }} && github.ref == 'refs/heads/master' + steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 From ef9289ec5ff3d926fd0ee2621fbc061d26f982e4 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 14:16:48 +1100 Subject: [PATCH 076/187] fix: update CI to build on master only --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 6614a72d..83f6a56f 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -162,6 +162,7 @@ jobs: conda-build: name: Conda Build and Deploy ${{ matrix.os }} - Python Version-${{ matrix.python-version }} runs-on: ${{ matrix.os }} + if : github.ref == 'refs/heads/master' strategy: fail-fast: false matrix: From e412c1761c48a15f57158ae553d797d4a6727f6c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 14:47:27 +1100 Subject: [PATCH 077/187] fix: remove redundancy --- map2loop/stratigraphic_column.py | 12 ------------ tests/project/test_ignore_codes_setters_getters.py | 3 --- 2 files changed, 15 deletions(-) diff --git a/map2loop/stratigraphic_column.py b/map2loop/stratigraphic_column.py index cdd8e9f0..8fa6eedf 100644 --- a/map2loop/stratigraphic_column.py +++ b/map2loop/stratigraphic_column.py @@ -40,19 +40,7 @@ def __init__(self): ("maxAge", float), ("group", str), ("supergroup", str), - # ("1_Thickness_Mean", float), - # ("1_Thickness_Median", float), - # ("1_ThicknessStdDev", float), - # ("2_ThicknessMean", float), - # ("2_ThicknessMedian", float), - # ("2_ThicknessStdDev", float), - # ("3_ThicknessMean_", float), - # ("3_ThicknessMedian_StructuralPoint", float), - # ("3_ThicknessStdDev_StructuralPoint", float), ("colour", str), - # ("indexInGroup", int), - # ("groupNum", int), - # ("numInGroup", int), ] ) self.stratigraphicUnits = pandas.DataFrame( diff --git a/tests/project/test_ignore_codes_setters_getters.py b/tests/project/test_ignore_codes_setters_getters.py index 26eaf672..40fb9e19 100644 --- a/tests/project/test_ignore_codes_setters_getters.py +++ b/tests/project/test_ignore_codes_setters_getters.py @@ -5,9 +5,6 @@ import map2loop - - - # 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 From 53e9e917ba101b3b2ecbdc93a2cc1683a58180b5 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 16:03:48 +1100 Subject: [PATCH 078/187] fix: update the server test and handle timeout properly --- tests/project/test_plot_hamersley.py | 86 ++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 tests/project/test_plot_hamersley.py diff --git a/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py new file mode 100644 index 00000000..cd3d075e --- /dev/null +++ b/tests/project/test_plot_hamersley.py @@ -0,0 +1,86 @@ +import pytest +from map2loop.project import Project +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, + clut_file_legacy=False, + verbose_level=VerboseLevel.NONE, + loop_project_filename=loop_project_filename, + overwrite_loopprojectfile=True, + ) + +# is the project running? +def test_project_execution(): + + proj = create_project() + try: + proj.run_all(take_best=True) + # if there's a timeout: + except requests.exceptions.ReadTimeout: + print("Timeout occurred, skipping the test.") # Debugging line + 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.") From 084774c45cabadfe1c83dc57adb9f7e5810bd3c2 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 31 Oct 2024 16:10:22 +1100 Subject: [PATCH 079/187] fix: updated ReadMe to have the right install steps (temporary measure) --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 29b58f22..c8f3baa9 100644 --- a/README.md +++ b/README.md @@ -23,12 +23,20 @@ conda config --add channels conda-forge ### Run -To just use map2loop, issue the following +To just use map2loop, issue the following. * ```bash -conda install -c conda-forge -c loop3d map2loop -y +git clone https://github.com/Loop3D/map2loop.git + +cd map2loop + +conda install -c loop3d --file dependencies.txt + +pip install . ``` +

* We're actively working towards a better approach - stay tuned!

+ ### Documentation If you can call it that, is available here From 9296a9c9980b8017f5852fd8164c9f72f13a54cc Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:24:06 +1100 Subject: [PATCH 080/187] fix: update CI - test wheels on master only --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 83f6a56f..ba0fa81c 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -112,6 +112,7 @@ jobs: name: Test wheels on ${{ matrix.os }} needs: pypi-build-wheels runs-on: ${{ matrix.os }} + if : github.ref == 'refs/heads/master' strategy: fail-fast: false matrix: From 6359c1c9f001f10c687a3d05498dcb8795108fdd Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:30:06 +1100 Subject: [PATCH 081/187] fix: add test to sdist build in CI to ensure tests are run in the non-master branches --- .github/workflows/CD.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index ba0fa81c..d68fbb94 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -47,6 +47,11 @@ jobs: pip install build python -m build + - name: Testing + shell: bash -l {0} + run: | + pytest + - uses: actions/upload-artifact@v4 with: name: map2loop-dist From db7068415d7eebf23eb4c8ae7699842d046ddb27 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:32:35 +1100 Subject: [PATCH 082/187] fix: update pytest in ci --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index d68fbb94..4e5ab3c5 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -44,7 +44,7 @@ jobs: - name: Build SDist run: | - pip install build + pip install build pytest python -m build - name: Testing From 334822feab160c6fdbabb8d167a9365e1fcdc8fb Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:34:50 +1100 Subject: [PATCH 083/187] fix: revert ci --- .github/workflows/CD.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 4e5ab3c5..989bacf6 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -44,14 +44,9 @@ jobs: - name: Build SDist run: | - pip install build pytest + pip install build python -m build - - name: Testing - shell: bash -l {0} - run: | - pytest - - uses: actions/upload-artifact@v4 with: name: map2loop-dist From 2be26cc610257fc7256a596cb8ccdd10402aa06b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:37:25 +1100 Subject: [PATCH 084/187] fix: add pytest in the right place --- .github/workflows/CD.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 989bacf6..de7d959f 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -79,6 +79,11 @@ jobs: pip install geopandas shapely networkx owslib map2model loopprojectfile beartype gdal==3.8.4 hjson pytest scikit-learn pip install --no-cache dist/*.tar.gz pip list + + - name: Testing + shell: bash -l {0} + run: | + pytest pypi-build-wheels: needs: pypi-test-sdist From 23a5092950b4262e94bb28a7af21a521f0f22674 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 12:40:06 +1100 Subject: [PATCH 085/187] fix: update pytest location --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index de7d959f..75f0ceb4 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -83,6 +83,7 @@ jobs: - name: Testing shell: bash -l {0} run: | + cd .. pytest pypi-build-wheels: From 900a73fd835d42eed85f46fcf00d4b77480c1cb0 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:04:43 +1100 Subject: [PATCH 086/187] fix: manifest update --- MANIFEST.in | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 02b24a35..9207f5a0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,6 @@ include map2loop/_datasets/clut_files/*.csv include map2loop/_datasets/config_files/*.json -include map2loop/_datasets/geodata_files/hamersley/* \ No newline at end of file +include map2loop/_datasets/geodata_files/hamersley/* +include README.md +include LICENSE +recursive-include tests *.py \ No newline at end of file From da8d88a15a75391b5576eaa2415e4cc64034d453 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:13:13 +1100 Subject: [PATCH 087/187] fix: update ci again --- .github/workflows/CD.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 75f0ceb4..a9f53285 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -80,11 +80,10 @@ jobs: pip install --no-cache dist/*.tar.gz pip list - - name: Testing - shell: bash -l {0} + - name: Check installation + shell: bash run: | - cd .. - pytest + python -c "import map2loop; print(map2loop.__file__)" pypi-build-wheels: needs: pypi-test-sdist From 4b76f5a43d3a11146ba2157070ee4ac6b01d912b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:21:45 +1100 Subject: [PATCH 088/187] investigate --- .github/workflows/CD.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index a9f53285..56d18503 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -80,10 +80,10 @@ jobs: pip install --no-cache dist/*.tar.gz pip list - - name: Check installation + - name: pytest shell: bash run: | - python -c "import map2loop; print(map2loop.__file__)" + ls pypi-build-wheels: needs: pypi-test-sdist From f825700f9ff4e74f6554855ff15a92d77d451145 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:28:12 +1100 Subject: [PATCH 089/187] find the install folder --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 56d18503..06786da3 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -83,6 +83,7 @@ jobs: - name: pytest shell: bash run: | + cd dist ls pypi-build-wheels: From 2eb263010d80309caf782e80d356ea43fa776ecf Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:31:15 +1100 Subject: [PATCH 090/187] try again --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 06786da3..1f5e9d64 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -83,7 +83,7 @@ jobs: - name: pytest shell: bash run: | - cd dist + cd .. ls pypi-build-wheels: From 074a3d74573349b8320c345539a6c6c24b723cf2 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:40:23 +1100 Subject: [PATCH 091/187] update ci --- .github/workflows/CD.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 1f5e9d64..0ea7d34e 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -83,8 +83,7 @@ jobs: - name: pytest shell: bash run: | - cd .. - ls + pwd pypi-build-wheels: needs: pypi-test-sdist From 86ba08b179129fc7480c5af9a33e17ec7a595d69 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:47:24 +1100 Subject: [PATCH 092/187] fix: add checkout step to build sdist --- .github/workflows/CD.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 0ea7d34e..a1472aa0 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -58,6 +58,8 @@ jobs: needs: pypi-build-sdist runs-on: ubuntu-latest steps: + - name: Checkout code + uses: actions/checkout@v4 - name : Install GDAL run: | @@ -83,7 +85,7 @@ jobs: - name: pytest shell: bash run: | - pwd + ls pypi-build-wheels: needs: pypi-test-sdist From cf21ab54380feb600064090590da694d26ad93e5 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 14:55:30 +1100 Subject: [PATCH 093/187] fix: run pytest with test sdist action --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index a1472aa0..00c1448a 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -85,7 +85,7 @@ jobs: - name: pytest shell: bash run: | - ls + pytest pypi-build-wheels: needs: pypi-test-sdist From ec24c84be3eb0a430d667a994e95d7f8c219d118 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 15:00:26 +1100 Subject: [PATCH 094/187] fix: revert CI and let tests only run on main branch --- .github/workflows/CD.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 00c1448a..989bacf6 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -58,8 +58,6 @@ jobs: needs: pypi-build-sdist runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v4 - name : Install GDAL run: | @@ -81,11 +79,6 @@ jobs: pip install geopandas shapely networkx owslib map2model loopprojectfile beartype gdal==3.8.4 hjson pytest scikit-learn pip install --no-cache dist/*.tar.gz pip list - - - name: pytest - shell: bash - run: | - pytest pypi-build-wheels: needs: pypi-test-sdist From af637311d5414779a491b54d7efb2025aa2e48a1 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 15:07:53 +1100 Subject: [PATCH 095/187] fix: add version check new class to check install of dependencies.txt; includes version number check --- map2loop/__init__.py | 116 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/map2loop/__init__.py b/map2loop/__init__.py index 582398d6..0c0bcba2 100644 --- a/map2loop/__init__.py +++ b/map2loop/__init__.py @@ -1,2 +1,118 @@ 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 +import pkg_resources #import get_distribution, DistributionNotFound # Use pkg_resources for version checking + +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() + + ## 1) get required version of each dependency from dependencies.txt + 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: + # search for the dependency line in dependencies.txt + 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) # get the version if found + elif line.strip() == self.package_name: + # dependency listed without a version + return None + # if dependency line not found in dependencies.txt (shouldn't happen, but just in case) + print(f"{self.package_name} version not found in {self.dependency_file}.") + except FileNotFoundError: # in case dependencies.txt is not found (shouldn't happen) + warnings.warn( + f"{self.dependency_file} not found. Unable to check {self.package_name} version compatibility.", + UserWarning + ) + return None + + ## 2) Check the installed version of the dependency and compare with required version + def get_installed_version(self): + ''' + Get the installed version of the package. + + Returns: + str: The installed version of the package. + ''' + try: + # Get installed version of the package using pkg_resources + return pkg_resources.get_distribution(self.package_name).version + except pkg_resources.DistributionNotFound: + # Raise ImportError if package is not installed + raise ImportError(f"{self.package_name} is not installed. Please install {self.package_name}.") + + ## 3) Compare the installed version of the dependency with the required version, if applicable + def check_version(self): + ''' + Checks if the installed version of the package matches the required version uin the dependencies.txt file. + + ''' + if self.required_version is None: + # No required version specified, only check if installed + if self.installed_version is None: + raise ImportError(f"{self.package_name} is not installed. Please install {self.package_name} before using map2loop.") + # else: + # print(f"{self.package_name} is installed.") + else: + # Compare versions if required version is specified + 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}." + ) + + # else: + # print(f"{self.package_name} version is compatible.") + +# check all dependencies & versions in dependencies.txt +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() + # skip the gdal line + if line.startswith("gdal"): + continue + if line: + # separate package name and version (if available) + if "==" in line: + package_name, _ = line.split("==") + else: + package_name = line + + # check version for each package + checker = DependencyChecker(package_name, dependency_file=dependency_file) + checker.check_version() + except FileNotFoundError: + ImportError(f"{dependency_file} not found. No dependencies checked for map2loop", UserWarning) + +# Run check for all dependencies listed in dependencies.txt +check_all_dependencies() From 4aa4a3df906d7ef60559abb274e14e70f4e9a0ec Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 1 Nov 2024 15:08:05 +1100 Subject: [PATCH 096/187] fix: organise manifest --- MANIFEST.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index 9207f5a0..67577e81 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,8 @@ +include LICENSE +include README.md + include map2loop/_datasets/clut_files/*.csv include map2loop/_datasets/config_files/*.json include map2loop/_datasets/geodata_files/hamersley/* -include README.md -include LICENSE + recursive-include tests *.py \ No newline at end of file From 593b17f1cf23d148b5935c7c4f8269790a13fac8 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 15:33:45 +1100 Subject: [PATCH 097/187] fix: linting fixes from merges --- map2loop/project.py | 23 +------------------ .../test_ignore_codes_setters_getters.py | 1 - tests/project/test_thickness_calculations.py | 2 +- 3 files changed, 2 insertions(+), 24 deletions(-) diff --git a/map2loop/project.py b/map2loop/project.py index 29684127..4ecf75d9 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -4,7 +4,7 @@ from .m2l_enums import VerboseLevel, ErrorState, Datatype from .mapdata import MapData from .sampler import Sampler, SamplerDecimator, SamplerSpacing -from .thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint, ThicknessCalculator +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 @@ -298,27 +298,6 @@ def get_sorter(self): """ return self.sorter.sorter_label - @beartype.beartype - def set_thickness_calculator(self, thickness_calculator: ThicknessCalculator): - """ - Set the thickness calculator that estimates unit thickness of all units - - Args: - thickness_calculator (ThicknessCalculator): - The calculator to use. Must be of base class ThicknessCalculator - """ - logger.info(f"Setting thickness calculator to {thickness_calculator.thickness_calculator_label}") - self.thickness_calculator = thickness_calculator - - def get_thickness_calculator(self): - """ - Get the name of the thickness calculator being used - - Returns: - str: The name of the thickness calculator used - """ - return self.thickness_calculator.thickness_calculator_label - @beartype.beartype def set_fault_orientation(self, fault_orientation: FaultOrientation): """ diff --git a/tests/project/test_ignore_codes_setters_getters.py b/tests/project/test_ignore_codes_setters_getters.py index 40fb9e19..471fcbe4 100644 --- a/tests/project/test_ignore_codes_setters_getters.py +++ b/tests/project/test_ignore_codes_setters_getters.py @@ -1,5 +1,4 @@ import pathlib -import pytest from map2loop.project import Project from map2loop.m2l_enums import Datatype import map2loop diff --git a/tests/project/test_thickness_calculations.py b/tests/project/test_thickness_calculations.py index df3ce5d2..385a1dc1 100644 --- a/tests/project/test_thickness_calculations.py +++ b/tests/project/test_thickness_calculations.py @@ -4,7 +4,7 @@ import numpy from map2loop._datasets.geodata_files import load_map2loop_data -from map2loop.thickness_calculator import ThicknessCalculatorAlpha, InterpolatedStructure, StructuralPoint +from map2loop.thickness_calculator import InterpolatedStructure, StructuralPoint from map2loop import Project From 6b0a9d745aa731f65e7be524f90212c12635b596 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 15:39:47 +1100 Subject: [PATCH 098/187] fix: update CI to run all jobs on branch --- .github/workflows/CD.yml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 271a035d..f647fb73 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -111,7 +111,6 @@ jobs: name: Test wheels on ${{ matrix.os }} needs: pypi-build-wheels runs-on: ${{ matrix.os }} - if : github.ref == 'refs/heads/master' strategy: fail-fast: false matrix: @@ -162,7 +161,6 @@ jobs: conda-build: name: Conda Build and Deploy ${{ matrix.os }} - Python Version-${{ matrix.python-version }} runs-on: ${{ matrix.os }} - if : github.ref == 'refs/heads/master' strategy: fail-fast: false matrix: @@ -209,21 +207,21 @@ jobs: name: map2loop-conda-${{ matrix.os }}-${{ matrix.python-version }} path: conda - # release-please: - # needs: [pypi-test-wheels, conda-build] - # runs-on: ubuntu-latest - # if: github.ref == 'refs/heads/master' - # steps: - # - uses: actions/checkout@v4 - # - uses: googleapis/release-please-action@v4 - # id: release - # with: - # release-type: "python" - # config-file: "release-please-config.json" - # manifest-file: ".release-please-manifest.json" - # outputs: - # release_created: ${{ steps.release.outputs.release_created }} - # #if a release is created then run the deploy scripts for github.io, conda, pypi and docker + release-please: + needs: [pypi-test-wheels, conda-build] + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v4 + - uses: googleapis/release-please-action@v4 + id: release + with: + release-type: "python" + config-file: "release-please-config.json" + manifest-file: ".release-please-manifest.json" + outputs: + release_created: ${{ steps.release.outputs.release_created }} + #if a release is created then run the deploy scripts for github.io, conda, pypi and docker documentation-test: runs-on: ubuntu-latest From c42c4254a39624969b1c9961f7a26af07483f9b2 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 15:54:25 +1100 Subject: [PATCH 099/187] fix: update map2model paths --- map2loop/map2model_wrapper.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index e36f3f24..beb022e5 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -141,9 +141,9 @@ def run(self, verbose_level: VerboseLevel = None): } logger.info(f"map2model params: {map2model_code_map}") # TODO: Simplify. Note: this is external so have to match fix to map2model module - logger.info(os.path.join(self.map_data.tmp_path, "map2model_data")) - logger.info(os.path.join(self.map_data.tmp_path, "map2model_data", "geology_wkt.csv")) - logger.info(os.path.join(self.map_data.tmp_path, "map2model_data", "faults_wkt.csv")) + logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data")) + logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "geology_wkt.csv")) + logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "faults_wkt.csv")) logger.info(self.map_data.get_bounding_box()) logger.info(map2model_code_map) logger.info(verbose_level == VerboseLevel.NONE) From 042ce9d5507d527b4e88a360635a7d1db227fa32 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:06:45 +1100 Subject: [PATCH 100/187] fix: update LPF to install from branch --- .github/workflows/CD.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index f647fb73..0ce7bfde 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -75,7 +75,8 @@ jobs: run: | pip install --upgrade pip pip install numpy==1.26.4 - pip install geopandas shapely networkx owslib map2model loopprojectfile beartype gdal==3.8.4 hjson pytest scikit-learn + pip install geopandas shapely networkx owslib map2model beartype gdal==3.8.4 hjson pytest scikit-learn + pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache dist/*.tar.gz pip list @@ -150,6 +151,7 @@ jobs: pip install --upgrade pip pip install numpy==1.26.4 pip install -r dependencies.txt + pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache --pre --no-index --find-links dist map2loop pip list @@ -181,6 +183,7 @@ jobs: run: | conda install -c conda-forge conda-build anaconda-client conda-verify -y conda install -c loop3d -c conda-forge --file dependencies.txt -y + pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses conda install pytest -y - name: Building and install From 07d326e1182d4fb70544e9ba0b3e40463a5cfc52 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:11:54 +1100 Subject: [PATCH 101/187] fix: update install from branch --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 0ce7bfde..5a3392bf 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -183,6 +183,7 @@ jobs: run: | conda install -c conda-forge conda-build anaconda-client conda-verify -y conda install -c loop3d -c conda-forge --file dependencies.txt -y + pip uninstall loopprojectfile -y pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses conda install pytest -y From 6c81ada8f5d658c7e500287657f914eaed014b63 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:16:38 +1100 Subject: [PATCH 102/187] fix: update the lpf to branch in wheel testing --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 5a3392bf..da224672 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -151,6 +151,7 @@ jobs: pip install --upgrade pip pip install numpy==1.26.4 pip install -r dependencies.txt + pip uninstall loopprojectfile -y pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache --pre --no-index --find-links dist map2loop pip list From 51445f2fb2d79b9d20abc6cffeb144625214c678 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:20:34 +1100 Subject: [PATCH 103/187] fix: build the docs on this branch --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 0c1ca3bc..e1464006 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,7 +1,7 @@ name: Build and Deploy Documentation on: - workflow_dispatch: + push From 98fe1636b2d54d923c330d029a155f1192dcfd79 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:24:53 +1100 Subject: [PATCH 104/187] fix: keep docs separate --- .github/workflows/documentation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index e1464006..0c1ca3bc 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -1,7 +1,7 @@ name: Build and Deploy Documentation on: - push + workflow_dispatch: From eca95650680ed606840027f7491dabb2ef0f4c99 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:29:54 +1100 Subject: [PATCH 105/187] fix: pypi and conda upld runs only on master --- .github/workflows/CD.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index da224672..96c38e67 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -265,6 +265,7 @@ jobs: conda-upload: needs: [conda-build] + if: github.ref == 'refs/heads/master' runs-on: ${{matrix.os}} strategy: fail-fast: false @@ -294,6 +295,7 @@ jobs: pypi-upload: needs: [pypi-test-wheels] + if: github.ref == 'refs/heads/master' runs-on: - ubuntu-latest # if: ${{ needs.release-please.outputs.release_created }} From 873d76868ce1c64979db30cc5a640a37e2493806 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:45:01 +1100 Subject: [PATCH 106/187] fix: test the docs on the branch too --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 96c38e67..a3c20da5 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -230,7 +230,7 @@ jobs: documentation-test: runs-on: ubuntu-latest - if: github.ref == 'refs/heads/master' + steps: - uses: actions/checkout@v4 - run: | From 77f1e6185412791149cb2075c64271b36dad3289 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:45:31 +1100 Subject: [PATCH 107/187] fix: update docs docker to build lpf from branch --- docs/Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Dockerfile b/docs/Dockerfile index 4866e6f4..d5890052 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -24,6 +24,8 @@ COPY dependencies.txt dependenciesdocs.txt RUN cat ./docs/requirements.txt >> dependenciesdocs.txt RUN conda install -c conda-forge -c loop3d --file dependencies.txt -y +RUN pip uninstall looprojectfile -y +RUN pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses RUN pip install . From d5415a4feff900ae38cafc8a35993c413cda9ba0 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 20 Nov 2024 16:51:08 +1100 Subject: [PATCH 108/187] fix: install sphinx with apt-get? --- docs/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Dockerfile b/docs/Dockerfile index d5890052..d1a7a239 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,6 +10,7 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ + python3-sphinx\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From b37ee773322feb9448fca5579a19ab8820c904e0 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 08:43:46 +1100 Subject: [PATCH 109/187] docs: change sphinx build path --- docs/source/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index e5edd5e6..a18a9407 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -13,7 +13,7 @@ import os import sys -sys.path.insert(0, os.path.abspath(".")) +sys.path.insert(0, os.path.abspath("../..")) # -- Project information ----------------------------------------------------- From 0b7322681bd6fd84a0c01c9791d30bb9b75fe3a6 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 08:52:59 +1100 Subject: [PATCH 110/187] fix: update build path docs --- .github/workflows/CD.yml | 2 ++ docs/source/conf.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index a3c20da5..01dc9ec2 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -162,7 +162,9 @@ jobs: pytest conda-build: + name: Conda Build and Deploy ${{ matrix.os }} - Python Version-${{ matrix.python-version }} + if: github.ref == 'refs/heads/master' runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/docs/source/conf.py b/docs/source/conf.py index a18a9407..6175247f 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -13,7 +13,7 @@ import os import sys -sys.path.insert(0, os.path.abspath("../..")) +sys.path.insert(0, os.path.abspath("../../")) # -- Project information ----------------------------------------------------- From 24b50fa076b44c848048d4986ba0e3a1627b71f1 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 08:57:05 +1100 Subject: [PATCH 111/187] docs: update build requirements --- docs/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/requirements.txt b/docs/requirements.txt index 24754e30..df8fe4cc 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,6 +3,7 @@ sphinx sphinx-gallery pydata-sphinx-theme myst-parser +beartype sphinxcontrib-bibtex conda-forge::poppler LoopStructural \ No newline at end of file From 3469f5378b70d8aded29b5a65d55c1ce8da504b9 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 09:08:24 +1100 Subject: [PATCH 112/187] fix: add beartype --- docs/Dockerfile | 3 +++ docs/requirements.txt | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index d1a7a239..ebe3764d 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -25,8 +25,11 @@ COPY dependencies.txt dependenciesdocs.txt RUN cat ./docs/requirements.txt >> dependenciesdocs.txt RUN conda install -c conda-forge -c loop3d --file dependencies.txt -y + +#temporary to align with fix_thicknesses branch RUN pip uninstall looprojectfile -y RUN pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses +RUN conda install beartype -y RUN pip install . diff --git a/docs/requirements.txt b/docs/requirements.txt index df8fe4cc..24754e30 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -3,7 +3,6 @@ sphinx sphinx-gallery pydata-sphinx-theme myst-parser -beartype sphinxcontrib-bibtex conda-forge::poppler LoopStructural \ No newline at end of file From c378e62b6d90c8cc00821a4e3e25deb128025271 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 09:16:08 +1100 Subject: [PATCH 113/187] docs: typo in docker? --- docs/Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index ebe3764d..b31cd207 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -24,12 +24,13 @@ COPY dependencies.txt dependencies.txt COPY dependencies.txt dependenciesdocs.txt RUN cat ./docs/requirements.txt >> dependenciesdocs.txt -RUN conda install -c conda-forge -c loop3d --file dependencies.txt -y +RUN conda install -c conda-forge -c loop3d --file dependenciesdocs.txt -y -#temporary to align with fix_thicknesses branch -RUN pip uninstall looprojectfile -y +#temporary code to align with fix_thicknesses branch +RUN pip uninstall loopprojectfile -y RUN pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses RUN conda install beartype -y +#### RUN pip install . From ee82e309d1cb2a341ed527988f6d6c47596b2886 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 21 Nov 2024 09:24:17 +1100 Subject: [PATCH 114/187] fix: remove redundant beartpe install --- .github/workflows/CD.yml | 1 - docs/Dockerfile | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 01dc9ec2..12cc63ad 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -164,7 +164,6 @@ jobs: conda-build: name: Conda Build and Deploy ${{ matrix.os }} - Python Version-${{ matrix.python-version }} - if: github.ref == 'refs/heads/master' runs-on: ${{ matrix.os }} strategy: fail-fast: false diff --git a/docs/Dockerfile b/docs/Dockerfile index b31cd207..a6b287b9 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -29,7 +29,6 @@ RUN conda install -c conda-forge -c loop3d --file dependenciesdocs.txt -y #temporary code to align with fix_thicknesses branch RUN pip uninstall loopprojectfile -y RUN pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses -RUN conda install beartype -y #### RUN pip install . From eaf7c893e33d060e9c2d3be1e4dfd55d41c3f6ca Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 11:48:32 +1100 Subject: [PATCH 115/187] chore: typo --- map2loop/deformation_history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index c3788b57..ed057765 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -16,7 +16,7 @@ class DeformationHistory: Attributes ---------- - minimum_fault_length_to_export: float + minimum_fault_length: float The cutoff for ignoring faults. Any fault shorter than this is not exported history: list The time ordered list of deformation events From 2585adfb2260059ff1b300c3bb38a3959ecd5299 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 12:17:47 +1100 Subject: [PATCH 116/187] fix: simplify issue templates --- .github/ISSUE_TEMPLATE/bug_report.yml | 41 +++--------------- .../ISSUE_TEMPLATE/documentation_request.yml | 15 ++----- .github/ISSUE_TEMPLATE/feature_request.yml | 43 +------------------ .../ISSUE_TEMPLATE/pull_request_template.yml | 18 -------- .github/ISSUE_TEMPLATE/question.yml | 6 +-- .../pull_request_template/bug_fix_remplate.md | 24 ----------- .../docs_update_template.md | 23 ---------- .../pull_request_template/feature_template.md | 27 ------------ .../test_improvement_template.md | 24 ----------- 9 files changed, 15 insertions(+), 206 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/pull_request_template.yml delete mode 100644 .github/pull_request_template/bug_fix_remplate.md delete mode 100644 .github/pull_request_template/docs_update_template.md delete mode 100644 .github/pull_request_template/feature_template.md delete mode 100644 .github/pull_request_template/test_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 1909ba79..ac67de34 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,4 @@ -name: "Bug Report" +name: "🐛 Bug Report" description: "Report a bug or an issue in map2loop" title: "[Bug] - " labels: ["bug"] @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - ## Bug Report + ## 🐛 Bug Report Thanks for submitting a bug report to map2loop! Please use this template to report a bug. Please provide as much detail as possible to help us reproduce and fix the issue efficiently. @@ -16,6 +16,8 @@ body: label: Version description: What version of map2loop and LoopProjectFile are you running? You can find this information by running `import map2loop` and `map2loop.__version__` in your python terminal or jupyter notebook. placeholder: "Enter map2loop and LoopProjectFile versions" + validations: + required: true - type: textarea id: bug_description @@ -33,25 +35,7 @@ body: description: "Provide a minimal reproducible example with the code necessary to reproduce the bug. For more guidance, visit: [How to create a minimal complete reproducible example](https://forum.access-hive.org.au/t/how-to-create-a-minimal-complete-reproducible-example/843)" placeholder: "Enter the steps to reproduce the bug" validations: - required: true - - - type: textarea - id: expected_behavior - attributes: - label: "Expected Behavior" - description: "Describe what you expected to happen." - placeholder: "Enter the expected behavior" - validations: - required: true - - - type: textarea - id: actual_behavior - attributes: - label: "Actual Behavior" - description: "Describe what actually happened when you encountered the bug." - placeholder: "Enter the actual behavior" - validations: - required: true + required: false - type: textarea id: additional_context @@ -69,18 +53,7 @@ body: description: "Specify the environment in which the bug occurred (e.g., operating system, browser, application version)." placeholder: "Enter the environment details" validations: - required: true + required: false + - - type: checkboxes - id: severity - attributes: - label: "Severity" - description: "Select the severity level of the bug." - options: - - label: "Low" - - label: "Medium" - - label: "High" - - label: "Critical" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/documentation_request.yml b/.github/ISSUE_TEMPLATE/documentation_request.yml index f202e2a5..253d9219 100644 --- a/.github/ISSUE_TEMPLATE/documentation_request.yml +++ b/.github/ISSUE_TEMPLATE/documentation_request.yml @@ -1,4 +1,4 @@ -name: "Documentation Request" +name: "📓 Documentation Request" description: "Help us improve map2loop documentation!" title: "[Documentation] - " labels: ["documentation"] @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - ## Documentation Request + ## 📓 Documentation Request Please use this template to suggest an improvement or addition to map2loop documentation. Provide as much detail as possible to help us understand and implement your request efficiently @@ -17,13 +17,4 @@ body: description: "Describe the documentation you would like to see. Include details on why it is needed and how it should be structured." placeholder: "Enter a detailed description of the documentation" validations: - required: true - - - type: textarea - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful." - placeholder: "Enter any additional context" - validations: - required: false \ No newline at end of file + required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 1fd8719a..f8fedbdc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,4 +1,4 @@ -name: "Feature Request" +name: "🚀 Feature Request" description: "Suggest a new feature or enhancement for map2loop" title: "[Feature Request] - " labels: ["enhancement", "feature request"] @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - ## Feature Request + ## 🚀 Feature Request Please use this template to submit your feature request. Provide as much detail as possible to help us understand and implement your request efficiently. - type: checkboxes @@ -28,51 +28,12 @@ body: validations: required: true - - type: textarea - id: current_situation - attributes: - label: "Current Situation" - description: "Describe the current situation and how the absence of this feature affects you." - placeholder: "Explain the current situation and its drawbacks" - validations: - required: true - - type: textarea id: version attributes: label: Version description: What version of map2loop and LoopProjectFile are you running that doesn't have this feature? You can find this information by running `import map2loop` and `map2loop.__version__` in your python terminal or jupyter notebook. placeholder: "Enter map2loop and LoopProjectFile versions" - - - type: textarea - id: proposed_solution - attributes: - label: "Proposed Solution" - description: "Describe how you envision the feature working. Include any specific requirements or details." - placeholder: "Explain how the feature should work" validations: required: true - - type: input - id: additional_context - attributes: - label: "Additional Context" - description: "Provide any other context or information that may be helpful in understanding the feature request." - placeholder: "Enter any additional context" - validations: - required: false - - - type: checkboxes - id: affected_areas - attributes: - label: "Affected Areas" - description: "Select the areas of the project that this feature request impacts." - options: - - label: "input data" - - label: "project creation" - - label: "samplers" - - label: "sorters" - - label: "stratigraphic column" - - label: "data types" - - label: "faults" - - label: "Other" \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/pull_request_template.yml b/.github/ISSUE_TEMPLATE/pull_request_template.yml deleted file mode 100644 index bba4e8d7..00000000 --- a/.github/ISSUE_TEMPLATE/pull_request_template.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: 2 - -pull_request_templates: - - name: Bug Fix Template - description: Use this template for bug fixes. - file: pull_request_template/bug_fix_template.md - - - name: Feature Template - description: Use this template for adding new features. - file: pull_request_template/feature_template.md - - - name: Documentation Update Template - description: Use this template for documentation updates. - file: pull_request_template/docs_update_template.md - - - name: Test Improvement Template - description: Use this template for adding a new test. - file: pull_request_template/tests_improvement_template.md diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml index 6e17cc06..871f7252 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -1,4 +1,4 @@ -name: "Question" +name: "💬 Question" description: "Ask a question about map2loop!" title: "[Question] - " labels: ["question"] @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - ## Question + ## 💬 Question Please use this template to ask a question about applying map2loop to your data. Provide as much detail as possible to help us understand and answer your question efficiently. @@ -28,7 +28,7 @@ body: validations: required: false - - type: input + - type: textarea id: additional_context attributes: label: "Additional Context" diff --git a/.github/pull_request_template/bug_fix_remplate.md b/.github/pull_request_template/bug_fix_remplate.md deleted file mode 100644 index f2e4c85b..00000000 --- a/.github/pull_request_template/bug_fix_remplate.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please describe the issue that this pull request addresses and summarize the changes you are implementing. - -Fixes #(issue) - -## Type of change - -- [ ] Bug fix (non-breaking change which fixes an issue) - -## How Has This Been Tested? - -Please describe any tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with the master branch -- [ ] All github-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/docs_update_template.md b/.github/pull_request_template/docs_update_template.md deleted file mode 100644 index a1c43359..00000000 --- a/.github/pull_request_template/docs_update_template.md +++ /dev/null @@ -1,23 +0,0 @@ -## Description - -Please include a summary of the changes. Include context if relevant. - -Fixes #(issue) - -## Type of change - -- [ ] Documentation update - -## How Has This Been Tested? -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with the master branch -- [ ] All github-action checks are passing -- [ ] I have performed a self-review of my own documentation -- [ ] I have built the documentation locally with make.bat -- [ ] I have built this documentation in docker, following the docker configuration in map2loop/docs -- [ ] My documentation follows the style guidelines of this project -- [ ] I have checked my spelling and grammar \ No newline at end of file diff --git a/.github/pull_request_template/feature_template.md b/.github/pull_request_template/feature_template.md deleted file mode 100644 index 3b6e6313..00000000 --- a/.github/pull_request_template/feature_template.md +++ /dev/null @@ -1,27 +0,0 @@ -## Description - -Please include a summary of the changes and the related issue. Include relevant motivation and context, if appropriate. -List any new dependencies that are required for this change. - -Fixes #(issue) - -## Type of change - -- [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with the master branch -- [ ] All github-action checks are passing -- [ ] I have performed a self-review of my own code -- [ ] My code follows the style guidelines of this project -- [ ] I have commented my code, particularly in hard-to-understand areas -- [ ] I have made corresponding changes to the documentation -- [ ] I have added tests that prove my fix is effective or that my feature works -- [ ] New and existing unit tests pass locally with my changes diff --git a/.github/pull_request_template/test_improvement_template.md b/.github/pull_request_template/test_improvement_template.md deleted file mode 100644 index 56e082bc..00000000 --- a/.github/pull_request_template/test_improvement_template.md +++ /dev/null @@ -1,24 +0,0 @@ -## Description - -Please include a summary of the added or modified test. List relevant functions tested. - -Fixes #(issue) - -## Type of change - -- [ ] Test improvement - -## How Has This Been Tested? - -Please describe the tests that you ran to verify your changes. -Provide branch name so we can reproduce. - -## Checklist: - -- [ ] This branch is up-to-date with the master branch -- [ ] All github-action checks are passing -- [ ] My tests run with pytest from the map2loop folder -- [ ] I have performed a self-review of my own tests -- [ ] My tests follow the style guidelines of this project -- [ ] I have commented my tests, particularly in hard-to-understand areas -- [ ] New and existing unit tests pass locally with my changes \ No newline at end of file From 93cbbaad72b9ddc041b20f1280d2c8ae9aa22a1c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 12:19:41 +1100 Subject: [PATCH 117/187] chore: hjson not in 3.2 --- dependencies.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/dependencies.txt b/dependencies.txt index ff3f801a..4b36eb66 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -5,10 +5,8 @@ shapely networkx owslib map2model -hjson loopprojectfile==0.1.4 beartype gdal==3.8.4 -hjson pytest scikit-learn From ba394f1940de0461c5ef330b3af3ac748d007b06 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 12:24:27 +1100 Subject: [PATCH 118/187] fix: remove hjson from dependencies as not in 3.2 --- .github/workflows/CD.yml | 4 ++-- conda/meta.yaml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 12cc63ad..2929db37 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -1,4 +1,4 @@ -# for this workflow to work, need to release LPF=1.0.5, map2model=1.0.1, use json instead of hjson +# for this workflow to work, need to release LPF=1.0.5, map2model=1.0.1, name: release-please @@ -75,7 +75,7 @@ jobs: run: | pip install --upgrade pip pip install numpy==1.26.4 - pip install geopandas shapely networkx owslib map2model beartype gdal==3.8.4 hjson pytest scikit-learn + pip install geopandas shapely networkx owslib map2model beartype gdal==3.8.4 pytest scikit-learn pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache dist/*.tar.gz pip list diff --git a/conda/meta.yaml b/conda/meta.yaml index b7571e6b..892f23a4 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -25,7 +25,6 @@ requirements: - tqdm - networkx - owslib - - hjson - loopprojectfile=0.1.3 - map2model - beartype From be3a3e79eb297e2e74c4c5a20601748d9e286104 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 25 Nov 2024 17:45:34 +1100 Subject: [PATCH 119/187] doc: removing min fault length attribute docstring --- map2loop/deformation_history.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index ed057765..d7d0d8dd 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -16,8 +16,6 @@ class DeformationHistory: Attributes ---------- - minimum_fault_length: float - The cutoff for ignoring faults. Any fault shorter than this is not exported history: list The time ordered list of deformation events faultColumns: numpy.dtype From d77afc3a94da18aa297fdc9fd1721d84d1a66e18 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 25 Nov 2024 17:46:51 +1100 Subject: [PATCH 120/187] fix: adding min fault length setter back to project. Linking to config attribute --- map2loop/project.py | 84 ++++++++++++++++++++++++++------------------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/map2loop/project.py b/map2loop/project.py index 4ecf75d9..427f0f8b 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -135,7 +135,7 @@ def __init__( self.deformation_history = DeformationHistory() self.loop_filename = loop_project_filename self.overwrite_lpf = overwrite_loopprojectfile - + # initialise the dataframes to store data in self.fault_orientations = pandas.DataFrame( columns=["ID", "DIPDIR", "DIP", "X", "Y", "Z", "featureId"] @@ -144,7 +144,6 @@ def __init__( self.fold_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) self.geology_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) - # Check for alternate config filenames in kwargs if "metadata_filename" in kwargs and config_filename == "": config_filename = kwargs["metadata_filename"] @@ -210,14 +209,13 @@ def __init__( 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 != "": if clut_file_legacy: logger.warning("DEPRECATION: Legacy files are deprecated and their use will be removed in v3.2") self.map_data.set_config_filename(config_filename, legacy_format=clut_file_legacy) - + if config_dictionary != {}: self.map_data.config.update_from_dictionary(config_dictionary) if clut_filename != "": @@ -237,7 +235,7 @@ def __init__( # 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)) - + if len(kwargs): logger.warning(f"Unused keyword arguments: {kwargs}") @@ -259,7 +257,7 @@ def set_ignore_lithology_codes(self, codes: list): 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): """ @@ -379,7 +377,28 @@ def get_sampler(self, datatype: Datatype): """ return self.samplers[datatype].sampler_label - + @beartype.beartype + def set_minimum_fault_length(self, length: float): + """ + 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 + + @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']) + # Processing functions def sample_map_data(self): """ @@ -408,12 +427,12 @@ def extract_geology_contacts(self): """ # Use stratigraphic column to determine basal contacts self.map_data.extract_basal_contacts(self.stratigraphic_column.column) - + # sample the contacts self.map_data.sampled_contacts = self.samplers[Datatype.GEOLOGY].sample( self.map_data.basal_contacts ) - + self.map_data.get_value_from_raster_df(Datatype.DTM, self.map_data.sampled_contacts) def calculate_stratigraphic_order(self, take_best=False): @@ -463,7 +482,7 @@ def calculate_stratigraphic_order(self, take_best=False): self.map_data.contacts, self.map_data, ) - + @beartype.beartype def set_thickness_calculator(self, thickness_calculator: Union['ThicknessCalculator', List['ThicknessCalculator']]) -> None: """ @@ -483,15 +502,14 @@ def set_thickness_calculator(self, thickness_calculator: Union['ThicknessCalcula """ if isinstance(thickness_calculator, ThicknessCalculator): 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 self.thickness_calculator = thickness_calculator - - + def get_thickness_calculator(self) -> List[str]: """ Retrieves the thickness_calculator_label from the thickness_calculator attribute. @@ -508,16 +526,16 @@ def get_thickness_calculator(self) -> List[str]: 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 + # 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 + # 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): """ Calculates the unit thickness statistics (mean, median, standard deviation) for each stratigraphic unit @@ -541,11 +559,11 @@ def calculate_unit_thicknesses(self): Raises: None """ - + labels = [] - + for calculator in self.thickness_calculator: - + result = calculator.compute( self.stratigraphic_column.stratigraphicUnits, self.stratigraphic_column.column, @@ -553,26 +571,25 @@ def calculate_unit_thicknesses(self): self.structure_samples, self.map_data, )[['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 + + # 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 - def calculate_fault_orientations(self): if self.map_data.get_map_data(Datatype.FAULT_ORIENTATION) is not None: @@ -615,7 +632,6 @@ def summarise_fault_data(self): ) 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 @@ -745,7 +761,6 @@ def save_into_projectfile(self): stratigraphic_data["group"] = self.stratigraphic_column.stratigraphicUnits["group"] stratigraphic_data["enabled"] = 1 - # Length of the column (number of rows in stratigraphicUnits) column_len = len(self.stratigraphic_column.stratigraphicUnits) @@ -781,7 +796,6 @@ def get_column_or_default(column_name, default_value, length): stratigraphic_data["ThicknessMedian"] = list(zip(*thickness_median_list[:MAX_CALCULATORS])) stratigraphic_data["ThicknessStdDev"] = list(zip(*thickness_stddev_list[:MAX_CALCULATORS])) - # Assign colours to startigraphic data stratigraphic_data["colour1Red"] = [ int(a[1:3], 16) for a in self.stratigraphic_column.stratigraphicUnits["colour"] @@ -800,14 +814,14 @@ def get_column_or_default(column_name, default_value, length): stratigraphic_data["colour2Blue"] = [ int(a * 0.95) for a in stratigraphic_data["colour1Blue"] ] - + # 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") - + thickness_calculator_labels = [tuple(self.thickness_calculator_labels[:5])] - - #save into LPF + + # save into LPF LPF.Set(self.loop_filename, "stratigraphicLog", data=stratigraphic_data, thickness_calculator_data = thickness_calculator_labels, verbose=True) # Save contacts From ebf2983999ef43a2e5eb0bb54c060dced2104035 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 25 Nov 2024 17:47:14 +1100 Subject: [PATCH 121/187] fix: min fault length setter/getter for mapdata uses config attribute --- map2loop/mapdata.py | 89 ++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 42 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index e9b02c8f..8fad41e0 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -91,8 +91,16 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): self.colour_filename = None self.verbose_level = verbose_level self.config = Config() - self.minimum_fault_length = None + @property + @beartype.beartype + def minimum_fault_length(self) -> float: + return self.config.fault_config["minimum_fault_length"] + @minimum_fault_length.setter + @beartype.beartype + def set_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 @@ -177,7 +185,7 @@ def set_bounding_box(self, bounding_box): geometry=[shapely.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 @@ -535,8 +543,7 @@ def open_http_query(url: str): return response except urllib.URLError: return None - - + @beartype.beartype def __retrieve_tif(self, filename: str): """ @@ -558,7 +565,7 @@ def __retrieve_tif(self, filename: str): ) if filename.lower() == "aus" or filename.lower() == "au": - logger.info('Using Geoscience australia DEM') + logger.info('Using Geoscience Australia DEM') url = "http://services.ga.gov.au/gis/services/DEM_SRTM_1Second_over_Bathymetry_Topography/MapServer/WCSServer?" wcs = WebCoverageService(url, version="1.0.0") @@ -571,10 +578,10 @@ def __retrieve_tif(self, filename: str): # 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": @@ -714,9 +721,9 @@ def parse_fault_orientations(self) -> tuple: 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": @@ -962,7 +969,7 @@ def get_minimum_fault_length(self) -> Union[float, int, None]: """ return self.minimum_fault_length - + @beartype.beartype def parse_fault_map(self) -> tuple: """ @@ -980,20 +987,18 @@ def parse_fault_map(self) -> tuple: # 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 config["minimum_fault_length"] is None: + if self.minimum_fault_length is None: self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, area_percentage = 0.05) - else: - self.minimum_fault_length = config["minimum_fault_length"] - # crop + + # 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"]] faults = faults[faults["FEATURE"].astype(str).str.contains(config["fault_text"])] @@ -1018,19 +1023,19 @@ def parse_fault_map(self) -> tuple: # Issue a warning if there are any non-existing codes # if non_existing_codes: - # print(f"Warning: {non_existing_codes} set to fault ignore codes are not in the provided data. Skipping") - # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + # print(f"Warning: {non_existing_codes} set to fault ignore codes are not in the provided data. Skipping") + # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. # Filter the DataFrame to remove rows where 'NAME' is in the existing_codes if existing_codes: faults = faults[~faults["NAME"].isin(existing_codes)] - # print(f"The following codes were found and removed: {existing_codes}") - # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + # print(f"The following codes were found and removed: {existing_codes}") + # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. else: pass # print("None of the fault ignore codes exist in the original fault data.") - - #parse dip column + + # 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 @@ -1108,9 +1113,9 @@ def parse_fault_map(self) -> tuple: ) faults["NAME"] = faults["NAME"].str.replace(" -/?", "_", regex=True) self.data[Datatype.FAULT] = faults - + return (False, "") - + @beartype.beartype def parse_fold_map(self) -> tuple: """ @@ -1222,17 +1227,17 @@ def save_raw_map_data(self, output_dir: pathlib.Path, datatype: Datatype, extens try: filename = pathlib.Path(output_dir) / f"{datatype.name}{extension}" raw_data = self.raw_data[datatype] - + if raw_data is None: ## Leaving this print statement in for now, as it will be useful for logging, but repetitive as a warning message # print(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: print(f"Failed to save {datatype.name} to file named {filename}\nError: {str(e)}") @@ -1347,7 +1352,7 @@ def export_wkt_format_files(self): # 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: @@ -1534,7 +1539,7 @@ def extract_all_contacts(self, save_contacts=True): if save_contacts: self.contacts = contacts return contacts - + @beartype.beartype def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True): """ @@ -1546,7 +1551,7 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) """ units = stratigraphic_column basal_contacts = self.contacts.copy() - + # check if the units in the strati colum are in the geology dataset, so that basal contacts can be built # if not, stop the project if any( @@ -1558,14 +1563,14 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) ", ".join(missing_units) + ". Please readjust the stratigraphic column if this is a user defined column." ) - - # apply minimum lithological id between the two units + + # apply minimum lithological id between the two units basal_contacts["ID"] = basal_contacts.apply( lambda row: min(units.index(row["UNITNAME_1"]), units.index(row["UNITNAME_2"])), axis=1 ) # match the name of the unit with the minimum id basal_contacts["basal_unit"] = basal_contacts.apply(lambda row: units[row["ID"]], axis=1) - # how many units apart are the two units? + # how many units apart are the two units? basal_contacts["stratigraphic_distance"] = basal_contacts.apply( lambda row: abs(units.index(row["UNITNAME_1"]) - units.index(row["UNITNAME_2"])), axis=1 ) @@ -1573,19 +1578,19 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) 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"]] - - # added code to make sure that multi-line that touch each other are snapped and merged. + + # added code to make sure that multi-line that touch each other are snapped and merged. # necessary for the reconstruction based on featureId basal_contacts["geometry"] = [shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"]] - + if save_contacts: - #keep abnormal contacts as all_basal_contacts + # keep abnormal contacts as all_basal_contacts self.all_basal_contacts = basal_contacts - #remove the abnormal contacts from basal contacts + # remove the abnormal contacts from basal contacts self.basal_contacts = basal_contacts[basal_contacts["type"] == "BASAL"] - + return basal_contacts @beartype.beartype From d97afd0e29b1983fd397747a9f00ef331d6dfdda Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Mon, 25 Nov 2024 18:10:48 +1100 Subject: [PATCH 122/187] No data min fault length is -1 --- map2loop/config.py | 2 +- map2loop/mapdata.py | 6 ++++-- tests/mapdata/test_minimum_fault_length.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index 29afb0c9..a7aed4c3 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -65,7 +65,7 @@ def __init__(self): "dipestimate_text": "'NORTH_EAST','NORTH',,'NOT ACCESSED'", "name_column": "NAME", "objectid_column": "ID", - "minimum_fault_length": None, + "minimum_fault_length": -1., #negative -1 means not set "ignore_fault_codes": [None], } self.fold_config = { diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 8fad41e0..bc46a33d 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -92,13 +92,15 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): self.verbose_level = verbose_level self.config = Config() + @property @beartype.beartype def minimum_fault_length(self) -> float: return self.config.fault_config["minimum_fault_length"] + @minimum_fault_length.setter @beartype.beartype - def set_minimum_fault_length(self, length: float): + def minimum_fault_length(self, length: float): self.config.fault_config["minimum_fault_length"] = length def set_working_projection(self, projection): @@ -992,7 +994,7 @@ def parse_fault_map(self) -> tuple: config = self.config.fault_config # update minimum fault length either with the value from the config or calculate it - if self.minimum_fault_length is None: + if self.minimum_fault_length < 0: self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, area_percentage = 0.05) diff --git a/tests/mapdata/test_minimum_fault_length.py b/tests/mapdata/test_minimum_fault_length.py index 123673ca..a75ba237 100644 --- a/tests/mapdata/test_minimum_fault_length.py +++ b/tests/mapdata/test_minimum_fault_length.py @@ -12,7 +12,7 @@ def setup_map_data(): map_data = MapData(verbose_level=VerboseLevel.ALL) # Simulate config with no minimum_fault_length set - map_data.config.fault_config['minimum_fault_length'] = None + map_data.config.fault_config['minimum_fault_length'] = -1. return map_data From fc4fe7553ef8fdff32a56c5aefc47007ec9e3b46 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 19:42:53 +1100 Subject: [PATCH 123/187] chore: test unpin gdal from ci --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 2929db37..6418cedf 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -75,7 +75,7 @@ jobs: run: | pip install --upgrade pip pip install numpy==1.26.4 - pip install geopandas shapely networkx owslib map2model beartype gdal==3.8.4 pytest scikit-learn + pip install geopandas shapely networkx owslib map2model beartype gdal pytest scikit-learn pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache dist/*.tar.gz pip list From 1652a5d5c11e16cb2342888a47c756f8321d3048 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 19:56:12 +1100 Subject: [PATCH 124/187] fix: remove sphinx from docs docker build --- docs/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index a6b287b9..d550cac5 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,7 +10,6 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ - python3-sphinx\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From 8dca8867bbb960515542bf05eaa5fb0698232c39 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 25 Nov 2024 20:23:25 +1100 Subject: [PATCH 125/187] chore: try again --- .github/workflows/CD.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 6418cedf..b29296b4 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -4,6 +4,8 @@ name: release-please on: [push, pull_request] + + permissions: contents: write pull-requests: write From 56166f602f528257acb46e5bcbe94caf97733d46 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Wed, 27 Nov 2024 10:52:17 +1100 Subject: [PATCH 126/187] fix: map2model fault fault relationships (#140) * fix: fault topology merge was using incorrect lookups * fix: run map2model for user defined stratigraphic column * removing logger from this pr * fix: use fault id not Fault_{id} --- map2loop/deformation_history.py | 2 ++ map2loop/map2model_wrapper.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index d7d0d8dd..41bec958 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -4,6 +4,7 @@ import geopandas import math + from .logging import getLogger logger = getLogger(__name__) @@ -280,6 +281,7 @@ def get_fault_relationships_with_ids(self, fault_fault_relationships: pandas.Dat 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['Fault1'] = rel['Fault1'].astype(str) diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index beb022e5..c40ee123 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -189,6 +189,7 @@ def run(self, verbose_level: VerboseLevel = None): df[1] = [re.findall("\(.*?\)", i) for i in df[1]] # Valid escape for regex df[0] = list(df[0].str.replace("^[0-9]*, ", "", regex=True)) df[0] = list(df[0].str.replace(", ", "", regex=False)) + # df[0] = "Fault_" + df[0] #removed 7/10/24 as it seems to break the merge in relations = df[1] for j in range(len(relations)): @@ -197,6 +198,7 @@ def run(self, verbose_level: VerboseLevel = None): for _, row in df.iterrows(): for i in numpy.arange(len(row[1])): + out += [[row[0], row[1][i][0], row[1][i][1], float(row[1][i][2])]] else: From ceff9b1c7e5eeb70fe9f840c4d2a0a12adfd18c4 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Wed, 27 Nov 2024 12:16:46 +1100 Subject: [PATCH 127/187] feat: make map2model optional using geopandas spatial joins as a replacement (#154) * fix: stratigraphic alpha sorter was inverted, reverse sorter * ignore units without contact for max contact length sorter * updated orientation sorter to use correct trigonometry for strike/dip lines. also change to using all intersections along line not only the first intersection. perhaps this should be a different sorter? * revert back to original orientation sorter * style: black * updating WA json to work * remove unused argument documentation * only run doc build on master * use geopandas to produce topology graphs instead of map2model. Basically just using sjoins and buffers. Returns the same for faults and contacts but we have some differences for fault-unit intersections. * update sorter to not use stratigraphic order hint and deprecate hint sorter * update deformation history to use eventId not name for merging * bipass old map2model run * use property accessor to make sure that variables are up to date * remove sorted units from sorter call * removing comment and condaforge channel * fix: remove map2model call from map2loop this is a quick fix, and needs to be cleaned up as the tmp files for map2model are still being created and the old code is just commented * update networkx sorter to have a name2index map * fix: add mode to choose betweeen m2m and geopandas * remove gdal fix * linting * style: black formatting --- dependencies.txt | 2 +- docs/requirements.txt | 3 +- map2loop/__init__.py | 43 +- .../geodata_files/load_map2loop_data.py | 16 +- map2loop/config.py | 38 +- map2loop/deformation_history.py | 3 - map2loop/fault_orientation.py | 4 +- map2loop/interpolators.py | 6 +- map2loop/logging.py | 15 +- map2loop/map2model_wrapper.py | 377 ++-- map2loop/mapdata.py | 75 +- map2loop/project.py | 109 +- map2loop/sampler.py | 2 +- map2loop/sorter.py | 91 +- map2loop/thickness_calculator.py | 59 +- map2loop/utils.py | 10 +- tests/mapdata/test_mapdata_dipdir.py | 38 +- tests/mapdata/test_minimum_fault_length.py | 94 +- .../test_set_get_recreate_bounding_box.py | 74 +- .../test_set_get_working_projection.py | 34 +- .../test_ignore_codes_setters_getters.py | 64 +- tests/project/test_plot_hamersley.py | 28 +- tests/project/test_thickness_calculations.py | 1745 ++++++++++++++++- .../test_interpolated_structure.py | 1737 +++++++++++++++- .../test_ThicknessStructuralPoint.py | 1715 +++++++++++++++- .../test_ThicknessCalculatorAlpha.py | 1714 +++++++++++++++- tests/utils/test_rgb_and_hex_functions.py | 25 +- 27 files changed, 7327 insertions(+), 794 deletions(-) diff --git a/dependencies.txt b/dependencies.txt index 4b36eb66..e75001e7 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -7,6 +7,6 @@ owslib map2model loopprojectfile==0.1.4 beartype -gdal==3.8.4 +gdal pytest scikit-learn diff --git a/docs/requirements.txt b/docs/requirements.txt index 24754e30..8c10ee6e 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,8 +1,7 @@ -# all on conda forge sphinx sphinx-gallery pydata-sphinx-theme myst-parser sphinxcontrib-bibtex -conda-forge::poppler +poppler LoopStructural \ No newline at end of file diff --git a/map2loop/__init__.py b/map2loop/__init__.py index d7c5764b..944ee7e1 100644 --- a/map2loop/__init__.py +++ b/map2loop/__init__.py @@ -1,5 +1,5 @@ - import logging + loggers = {} ch = logging.StreamHandler() formatter = logging.Formatter("%(levelname)s: %(asctime)s: %(filename)s:%(lineno)d -- %(message)s") @@ -9,22 +9,25 @@ 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 +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 -import pkg_resources #import get_distribution, DistributionNotFound # Use pkg_resources for version checking +import pkg_resources # import get_distribution, DistributionNotFound # Use pkg_resources for version checking + 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 @@ -35,7 +38,7 @@ def __init__(self, package_name, dependency_file="dependencies.txt"): ## 1) get required version of each dependency from dependencies.txt def get_required_version(self): ''' - Get the required package version for each package from dependencies.txt; + 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. @@ -56,7 +59,7 @@ def get_required_version(self): except FileNotFoundError: # in case dependencies.txt is not found (shouldn't happen) warnings.warn( f"{self.dependency_file} not found. Unable to check {self.package_name} version compatibility.", - UserWarning + UserWarning, ) return None @@ -64,7 +67,7 @@ def get_required_version(self): def get_installed_version(self): ''' Get the installed version of the package. - + Returns: str: The installed version of the package. ''' @@ -73,31 +76,38 @@ def get_installed_version(self): return pkg_resources.get_distribution(self.package_name).version except pkg_resources.DistributionNotFound: # Raise ImportError if package is not installed - raise ImportError(f"{self.package_name} is not installed. Please install {self.package_name}.") + raise ImportError( + f"{self.package_name} is not installed. Please install {self.package_name}." + ) ## 3) Compare the installed version of the dependency with the required version, if applicable def check_version(self): ''' Checks if the installed version of the package matches the required version uin the dependencies.txt file. - + ''' if self.required_version is None: # No required version specified, only check if installed if self.installed_version is None: - raise ImportError(f"{self.package_name} is not installed. Please install {self.package_name} before using map2loop.") + raise ImportError( + f"{self.package_name} is not installed. Please install {self.package_name} before using map2loop." + ) # else: # print(f"{self.package_name} is installed.") else: # Compare versions if required version is specified - if self.installed_version is None or pkg_version.parse(self.installed_version) != pkg_version.parse(self.required_version): + 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}." ) - + # else: # print(f"{self.package_name} version is compatible.") + # check all dependencies & versions in dependencies.txt def check_all_dependencies(dependency_file="dependencies.txt"): dependencies_path = pathlib.Path(__file__).parent.parent / dependency_file @@ -114,12 +124,15 @@ def check_all_dependencies(dependency_file="dependencies.txt"): package_name, _ = line.split("==") else: package_name = line - + # check version for each package checker = DependencyChecker(package_name, dependency_file=dependency_file) checker.check_version() except FileNotFoundError: - ImportError(f"{dependency_file} not found. No dependencies checked for map2loop", UserWarning) + ImportError( + 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/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index c67ad436..2e1d1f51 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -2,6 +2,7 @@ import pkg_resources from osgeo import gdal + def load_hamersley_geology(): """ Loads Hamersley geology data from a shapefile @@ -13,7 +14,9 @@ def load_hamersley_geology(): Returns: geopandas.GeoDataFrame: The geology data """ - stream = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/geology.geojson") + stream = pkg_resources.resource_filename( + "map2loop", "/_datasets/geodata_files/hamersley/geology.geojson" + ) return geopandas.read_file(stream) @@ -28,10 +31,13 @@ def load_hamersley_structure(): Returns: geopandas.GeoDataFrame: The structure data """ - - path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/structure.geojson") + + path = pkg_resources.resource_filename( + "map2loop", "/_datasets/geodata_files/hamersley/structure.geojson" + ) return geopandas.read_file(path) + def load_hamersley_dtm(): """ Load DTM data from a raster file @@ -39,5 +45,7 @@ def load_hamersley_dtm(): Returns: gdal.Dataset: The DTM data """ - path = pkg_resources.resource_filename("map2loop", "/_datasets/geodata_files/hamersley/dtm_rp.tif") + path = pkg_resources.resource_filename( + "map2loop", "/_datasets/geodata_files/hamersley/dtm_rp.tif" + ) return gdal.Open(path) diff --git a/map2loop/config.py b/map2loop/config.py index a7aed4c3..d4811d97 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -10,6 +10,7 @@ logger = getLogger(__name__) + class Config: """ A data structure containing column name mappings for files and keywords @@ -65,7 +66,7 @@ def __init__(self): "dipestimate_text": "'NORTH_EAST','NORTH',,'NOT ACCESSED'", "name_column": "NAME", "objectid_column": "ID", - "minimum_fault_length": -1., #negative -1 means not set + "minimum_fault_length": -1.0, # negative -1 means not set "ignore_fault_codes": [None], } self.fold_config = { @@ -103,25 +104,33 @@ def update_from_dictionary(self, dictionary: dict, lower: bool = False): 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") + 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") + 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") + 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") + 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())}") @@ -206,7 +215,7 @@ def update_from_file( try: filename = str(filename) - #if url, open the url + # if url, open the url if filename.startswith("http") or filename.startswith("ftp"): try_count = 5 success = False @@ -218,7 +227,7 @@ def update_from_file( func(data, lower) success = True - #case 1. handle url error + # case 1. handle url error except urllib.error.URLError as e: # wait 0.25 seconds before trying again time.sleep(0.25) @@ -226,12 +235,15 @@ def update_from_file( 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 + 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 + f"Error decoding JSON data from URL: {filename}" + ) from e else: try: with open(filename) as file_data: @@ -239,7 +251,9 @@ def update_from_file( 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" + 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( @@ -247,7 +261,7 @@ def update_from_file( ) from e except FileNotFoundError: - raise + raise except Exception: err_string = f"There is a problem parsing the config file ({filename}).\n" @@ -258,4 +272,4 @@ def update_from_file( if not legacy_format: err_string += "Also check if this is a legacy config file and add clut_file_legacy=True to the Project function\n" err_string += "Check the contents for mismatched quotes or brackets!" - raise Exception(err_string) \ No newline at end of file + raise Exception(err_string) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index 41bec958..4073bc85 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -284,9 +284,6 @@ def get_fault_relationships_with_ids(self, fault_fault_relationships: pandas.Dat faultIds = self.get_faults_for_export()[["eventId", "name"]].copy() rel = fault_fault_relationships.copy() - rel['Fault1'] = rel['Fault1'].astype(str) - rel['Fault2'] = rel['Fault2'].astype(str) - faultIds['eventId'] = faultIds['eventId'].astype(str) rel = rel.merge(faultIds, left_on="Fault1", right_on="eventId") rel.rename(columns={"eventId": "eventId1"}, inplace=True) rel.drop(columns=["name"], inplace=True) diff --git a/map2loop/fault_orientation.py b/map2loop/fault_orientation.py index 3a3ef9db..33c790b5 100644 --- a/map2loop/fault_orientation.py +++ b/map2loop/fault_orientation.py @@ -8,6 +8,8 @@ from .logging import getLogger logger = getLogger(__name__) + + class FaultOrientation(ABC): """ Base Class of Fault Orientation assigner to force structure of FaultOrientation @@ -85,7 +87,7 @@ def calculate( 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: diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index 4cd9a681..68e87786 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -345,10 +345,12 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): # 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 - logging.warning(f"Detected {len(collocated_clusters)} collocated point clusters. Aggregating these points.") + logging.warning( + f"Detected {len(collocated_clusters)} collocated point clusters. Aggregating these points." + ) # Aggregate data for collocated points by taking the mean of X, Y, DIP, and DIPDIR within each cluster aggregated_data = ( diff --git a/map2loop/logging.py b/map2loop/logging.py index 486de019..2daaa0c2 100644 --- a/map2loop/logging.py +++ b/map2loop/logging.py @@ -1,5 +1,7 @@ import logging import map2loop + + def get_levels(): """dict for converting to logger levels from string @@ -16,7 +18,8 @@ def get_levels(): "debug": logging.DEBUG, } -def getLogger(name:str): + +def getLogger(name: str): """Get a logger object with a specific name @@ -32,13 +35,17 @@ def getLogger(name:str): """ if name in map2loop.loggers: return map2loop.loggers[name] - logger = logging.getLogger(name) + logger = logging.getLogger(name) logger.addHandler(map2loop.ch) logger.propagate = False map2loop.loggers[name] = logger return logger + + logger = getLogger(__name__) -def set_level(level:str): + + +def set_level(level: str): """Set the level of the logging object @@ -54,4 +61,4 @@ def set_level(level:str): for name in map2loop.loggers: logger = logging.getLogger(name) logger.setLevel(level) - logger.info(f"Logging level set to {level}") \ No newline at end of file + logger.info(f"Logging level set to {level}") diff --git a/map2loop/map2model_wrapper.py b/map2loop/map2model_wrapper.py index c40ee123..08738e60 100644 --- a/map2loop/map2model_wrapper.py +++ b/map2loop/map2model_wrapper.py @@ -5,6 +5,9 @@ import map2model import pandas import numpy +import geopandas as gpd +import pandas as pd +import numpy as np import os import re @@ -33,7 +36,9 @@ class Map2ModelWrapper: A selection that defines how much console logging is output """ - def __init__(self, map_data, verbose_level: VerboseLevel = VerboseLevel.NONE): + def __init__( + self, map_data, mode: str = 'geopandas', verbose_level: VerboseLevel = VerboseLevel.NONE + ): """ The initialiser for the map2model wrapper @@ -43,13 +48,41 @@ def __init__(self, map_data, verbose_level: VerboseLevel = VerboseLevel.NONE): verbose_level (VerboseLevel, optional): How much console output is sent. Defaults to VerboseLevel.ALL. """ - logger + self.mode = mode self.sorted_units = None - self.fault_fault_relationships = None - self.unit_fault_relationships = None - self.unit_unit_relationships = None + self._fault_fault_relationships = None + self._unit_fault_relationships = None + self._unit_unit_relationships = None self.map_data = map_data self.verbose_level = verbose_level + self.buffer_radius = 500 + + @property + def fault_fault_relationships(self): + if self._fault_fault_relationships is None: + if self.mode == 'geopandas': + self._calculate_fault_fault_relationships() + else: + self.run() + return self._fault_fault_relationships + + @property + def unit_fault_relationships(self): + if self._unit_fault_relationships is None: + if self.mode == 'geopandas': + self._calculate_fault_unit_relationships() + else: + self.run() + return self._unit_fault_relationships + + @property + def unit_unit_relationships(self): + if self._unit_unit_relationships is None: + if self.mode == 'geopandas': + self._calculate_unit_unit_relationships() + else: + self.run() + return self._unit_unit_relationships def reset(self): """ @@ -68,8 +101,11 @@ def get_sorted_units(self): Returns: list: The map2model stratigraphic column estimate """ - if self.sorted_units is None: - self.run() + if self.mode == 'geopandas': + raise NotImplementedError("This method is not implemented") + else: + if self.sorted_units is None: + self.run() return self.sorted_units def get_fault_fault_relationships(self): @@ -79,8 +115,7 @@ def get_fault_fault_relationships(self): Returns: pandas.DataFrame: The fault fault relationships """ - if self.fault_fault_relationships is None: - self.run() + return self.fault_fault_relationships def get_unit_fault_relationships(self): @@ -90,8 +125,7 @@ def get_unit_fault_relationships(self): Returns: pandas.DataFrame: The unit fault relationships """ - if self.unit_fault_relationships is None: - self.run() + return self.unit_fault_relationships def get_unit_unit_relationships(self): @@ -101,10 +135,62 @@ def get_unit_unit_relationships(self): Returns: pandas.DataFrame: The unit unit relationships """ - if self.unit_unit_relationships is None: - self.run() + return self.unit_unit_relationships + def _calculate_fault_fault_relationships(self): + + faults = self.map_data.FAULT.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 = gpd.sjoin( + gpd.GeoDataFrame(geometry=buffers), gpd.GeoDataFrame(geometry=faults["geometry"]) + ) + intersection["index_left"] = intersection.index + intersection.reset_index(inplace=True) + + adjacency_matrix = np.zeros((faults.shape[0], faults.shape[0]), dtype=bool) + adjacency_matrix[ + intersection.loc[:, "index_left"], intersection.loc[:, "index_right"] + ] = True + f1, f2 = np.where(np.tril(adjacency_matrix, k=-1)) + df = pd.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.map_data.GEOLOGY["UNITNAME"].unique() + faults = self.map_data.FAULT.copy().reset_index().drop(columns=['index']) + adjacency_matrix = np.zeros((len(units), faults.shape[0]), dtype=bool) + for i, u in enumerate(units): + unit = self.map_data.GEOLOGY[self.map_data.GEOLOGY["UNITNAME"] == u] + intersection = gpd.sjoin( + gpd.GeoDataFrame(geometry=faults["geometry"]), + gpd.GeoDataFrame(geometry=unit["geometry"]), + ) + intersection["index_left"] = intersection.index + intersection.reset_index(inplace=True) + adjacency_matrix[i, intersection.loc[:, "index_left"]] = True + u, f = np.where(adjacency_matrix) + df = pd.DataFrame({"Unit": units[u].tolist(), "Fault": faults.loc[f, "ID"].to_list()}) + self._unit_fault_relationships = df + + def _calculate_unit_unit_relationships(self): + if self.map_data.contacts is None: + self.map_data.extract_all_contacts() + self._unit_unit_relationships = self.map_data.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 @@ -113,71 +199,69 @@ def run(self, verbose_level: VerboseLevel = None): verbose_level (VerboseLevel, optional): How much console output is sent. Defaults to None (which uses the wrapper attribute). """ - if verbose_level is None: - verbose_level = self.verbose_level - logger.info("Exporting map data for map2model") - self.map_data.export_wkt_format_files() - logger.info("Running map2model...") - - map2model_code_map = { - "o": "ID", # FIELD_COORDINATES - "f": "FEATURE", # FIELD_FAULT_ID - "u": "CODE", # FIELD_POLYGON_LEVEL1_NAME - "g": "GROUP", # FIELD_POLYGON_LEVEL2_NAME - "min": "MIN_AGE", # FIELD_POLYGON_MIN_AGE - "max": "MAX_AGE", # FIELD_POLYGON_MAX_AGE - "c": "UNITNAME", # FIELD_POLYGON_CODE - "ds": "DESCRIPTION", # FIELD_POLYGON_DESCRIPTION - "r1": "ROCKTYPE1", # FIELD_POLYGON_ROCKTYPE1 - "r2": "ROCKTYPE2", # FIELD_POLYGON_ROCKTYPE2 - "msc": "", # FIELD_SITE_CODE - "mst": "", # FIELD_SITE_TYPE - "mscm": "", # FIELD_SITE_COMMO - "fold": self.map_data.config.fold_config["fold_text"], # FAULT_AXIAL_FEATURE_NAME - "sill": self.map_data.config.geology_config["sill_text"], # SILL_STRING - "intrusive": self.map_data.config.geology_config["intrusive_text"], # IGNEOUS_STRING - "volcanic": self.map_data.config.geology_config["volcanic_text"], # VOLCANIC_STRING - "deposit_dist": 100, # deposit_dist - } - logger.info(f"map2model params: {map2model_code_map}") - # TODO: Simplify. Note: this is external so have to match fix to map2model module - logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data")) - logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "geology_wkt.csv")) - logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "faults_wkt.csv")) - logger.info(self.map_data.get_bounding_box()) - logger.info(map2model_code_map) - logger.info(verbose_level == VerboseLevel.NONE) - - run_log = map2model.run( - os.path.join(self.map_data.map2model_tmp_path), - os.path.join(self.map_data.map2model_tmp_path, "geology_wkt.csv"), - os.path.join(self.map_data.map2model_tmp_path, "faults_wkt.csv"), - "", - self.map_data.get_bounding_box(), - map2model_code_map, - verbose_level == VerboseLevel.NONE, - "None", - ) - logger.info("Parsing map2model output") - logger.info(run_log) + if self.mode == 'geopandas': - logger.info("map2model complete") - - # Parse units sorted - units_sorted = pandas.read_csv( - os.path.join(self.map_data.map2model_tmp_path, "units_sorted.txt"), - header=None, - sep=' ', - ) - if units_sorted.shape == 0: - self.sorted_units = [] + self.get_fault_fault_relationships() + self.get_unit_fault_relationships() + self.get_unit_unit_relationships() + return else: - self.sorted_units = list(units_sorted[5]) + if verbose_level is None: + verbose_level = self.verbose_level + logger.info("Exporting map data for map2model") + self.map_data.export_wkt_format_files() + logger.info("Running map2model...") + + map2model_code_map = { + "o": "ID", # FIELD_COORDINATES + "f": "FEATURE", # FIELD_FAULT_ID + "u": "CODE", # FIELD_POLYGON_LEVEL1_NAME + "g": "GROUP", # FIELD_POLYGON_LEVEL2_NAME + "min": "MIN_AGE", # FIELD_POLYGON_MIN_AGE + "max": "MAX_AGE", # FIELD_POLYGON_MAX_AGE + "c": "UNITNAME", # FIELD_POLYGON_CODE + "ds": "DESCRIPTION", # FIELD_POLYGON_DESCRIPTION + "r1": "ROCKTYPE1", # FIELD_POLYGON_ROCKTYPE1 + "r2": "ROCKTYPE2", # FIELD_POLYGON_ROCKTYPE2 + "msc": "", # FIELD_SITE_CODE + "mst": "", # FIELD_SITE_TYPE + "mscm": "", # FIELD_SITE_COMMO + "fold": self.map_data.config.fold_config["fold_text"], # FAULT_AXIAL_FEATURE_NAME + "sill": self.map_data.config.geology_config["sill_text"], # SILL_STRING + "intrusive": self.map_data.config.geology_config[ + "intrusive_text" + ], # IGNEOUS_STRING + "volcanic": self.map_data.config.geology_config["volcanic_text"], # VOLCANIC_STRING + "deposit_dist": 100, # deposit_dist + } + logger.info(f"map2model params: {map2model_code_map}") + # TODO: Simplify. Note: this is external so have to match fix to map2model module + logger.info(os.path.join(self.map_data.map2model_tmp_path, "map2model_data")) + logger.info( + os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "geology_wkt.csv") + ) + logger.info( + os.path.join(self.map_data.map2model_tmp_path, "map2model_data", "faults_wkt.csv") + ) + logger.info(self.map_data.get_bounding_box()) + logger.info(map2model_code_map) + logger.info(verbose_level == VerboseLevel.NONE) + + run_log = map2model.run( + os.path.join(self.map_data.map2model_tmp_path), + os.path.join(self.map_data.map2model_tmp_path, "geology_wkt.csv"), + os.path.join(self.map_data.map2model_tmp_path, "faults_wkt.csv"), + "", + self.map_data.get_bounding_box(), + map2model_code_map, + verbose_level == VerboseLevel.NONE, + "None", + ) # Parse fault intersections out = [] fault_fault_intersection_filename = os.path.join( - self.map_data.map2model_tmp_path, "fault-fault-intersection.txt" + self.map_data.map2model_tmp_path, 'fault-fault-intersection.txt' ) logger.info(f"Reading fault-fault intersections from {fault_fault_intersection_filename}") if ( @@ -205,55 +289,104 @@ def run(self, verbose_level: VerboseLevel = None): logger.warning( f"Fault-fault intersections file {fault_fault_intersection_filename} not found" ) + logger.info("Parsing map2model output") + logger.info(run_log) - df_out = pandas.DataFrame(columns=["Fault1", "Fault2", "Type", "Angle"], data=out) - logger.info('Fault intersections') - logger.info(df_out.to_string()) - self.fault_fault_relationships = df_out + logger.info("map2model complete") - # Parse unit fault relationships - out = [] - unit_fault_intersection_filename = os.path.join( - self.map_data.map2model_tmp_path, "unit-fault-intersection.txt" - ) - if ( - os.path.isfile(unit_fault_intersection_filename) - and os.path.getsize(unit_fault_intersection_filename) > 0 - ): - df = pandas.read_csv(unit_fault_intersection_filename, header=None, sep='{') - df[1] = list(df[1].str.replace("}", "", regex=False)) - df[1] = df[1].astype(str).str.split(", ") - df[0] = list(df[0].str.replace("^[0-9]*, ", "", regex=True)) - df[0] = list(df[0].str.replace(", ", "", regex=False)) - - for _, row in df.iterrows(): - for i in numpy.arange(len(row[1])): - out += [[row[0], "Fault_" + row[1][i]]] - - df_out = pandas.DataFrame(columns=["Unit", "Fault"], data=out) - self.unit_fault_relationships = df_out - - # Parse unit unit relationships - units = [] - links = [] - graph_filename = os.path.join( - self.map_data.map2model_tmp_path, "graph_all_None.gml.txt" - ) - if os.path.isfile(graph_filename) and os.path.getsize(graph_filename) > 0: - with open( - os.path.join(self.map_data.map2model_tmp_path, "graph_all_None.gml.txt") - ) as file: - contents = file.read() - segments = contents.split("\n\n") - for line in segments[0].split("\n"): - units += [line.split(" ")] - for line in segments[1].split("\n")[:-1]: - links += [line.split(" ")] - - df = pandas.DataFrame(columns=["index", "unit"], data=units) - df.set_index("index", inplace=True) - out = [] - for row in links: - out += [[int(row[0]), df["unit"][row[0]], int(row[1]), df["unit"][row[1]]]] - df_out = pandas.DataFrame(columns=["Index1", "UnitName1", "Index2", "UnitName2"], data=out) - self.unit_unit_relationships = df_out + # Parse units sorted + units_sorted = pandas.read_csv( + os.path.join(self.map_data.map2model_tmp_path, "units_sorted.txt"), + header=None, + sep=' ', + ) + if units_sorted.shape == 0: + self.sorted_units = [] + else: + self.sorted_units = list(units_sorted[5]) + + # Parse fault intersections + out = [] + fault_fault_intersection_filename = os.path.join( + self.map_data.map2model_tmp_path, "fault-fault-intersection.txt" + ) + logger.info( + f"Reading fault-fault intersections from {fault_fault_intersection_filename}" + ) + if ( + os.path.isfile(fault_fault_intersection_filename) + and os.path.getsize(fault_fault_intersection_filename) > 0 + ): + df = pandas.read_csv(fault_fault_intersection_filename, delimiter="{", header=None) + df[1] = list(df[1].str.replace("}", "", regex=False)) + df[1] = [re.findall("\(.*?\)", i) for i in df[1]] # Valid escape for regex + df[0] = list(df[0].str.replace("^[0-9]*, ", "", regex=True)) + df[0] = list(df[0].str.replace(", ", "", regex=False)) + # df[0] = "Fault_" + df[0] #removed 7/10/24 as it seems to break the merge in + relations = df[1] + for j in range(len(relations)): + relations[j] = [i.strip("()").replace(" ", "").split(",") for i in relations[j]] + df[1] = relations + + for _, row in df.iterrows(): + for i in numpy.arange(len(row[1])): + out += [[row[0], row[1][i][0], row[1][i][1], float(row[1][i][2])]] + + else: + logger.warning( + f"Fault-fault intersections file {fault_fault_intersection_filename} not found" + ) + + df_out = pandas.DataFrame(columns=["Fault1", "Fault2", "Type", "Angle"], data=out) + logger.info('Fault intersections') + logger.info(df_out.to_string()) + self.fault_fault_relationships = df_out + + # Parse unit fault relationships + out = [] + unit_fault_intersection_filename = os.path.join( + self.map_data.map2model_tmp_path, "unit-fault-intersection.txt" + ) + if ( + os.path.isfile(unit_fault_intersection_filename) + and os.path.getsize(unit_fault_intersection_filename) > 0 + ): + df = pandas.read_csv(unit_fault_intersection_filename, header=None, sep='{') + df[1] = list(df[1].str.replace("}", "", regex=False)) + df[1] = df[1].astype(str).str.split(", ") + df[0] = list(df[0].str.replace("^[0-9]*, ", "", regex=True)) + df[0] = list(df[0].str.replace(", ", "", regex=False)) + + for _, row in df.iterrows(): + for i in numpy.arange(len(row[1])): + out += [[row[0], "Fault_" + row[1][i]]] + + df_out = pandas.DataFrame(columns=["Unit", "Fault"], data=out) + self.unit_fault_relationships = df_out + + # Parse unit unit relationships + units = [] + links = [] + graph_filename = os.path.join( + self.map_data.map2model_tmp_path, "graph_all_None.gml.txt" + ) + if os.path.isfile(graph_filename) and os.path.getsize(graph_filename) > 0: + with open( + os.path.join(self.map_data.map2model_tmp_path, "graph_all_None.gml.txt") + ) as file: + contents = file.read() + segments = contents.split("\n\n") + for line in segments[0].split("\n"): + units += [line.split(" ")] + for line in segments[1].split("\n")[:-1]: + links += [line.split(" ")] + + df = pandas.DataFrame(columns=["index", "unit"], data=units) + df.set_index("index", inplace=True) + out = [] + for row in links: + out += [[int(row[0]), df["unit"][row[0]], int(row[1]), df["unit"][row[1]]]] + df_out = pandas.DataFrame( + columns=["Index1", "UnitName1", "Index2", "UnitName2"], data=out + ) + self.unit_unit_relationships = df_out diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index bc46a33d..0323f16b 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -92,17 +92,16 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): self.verbose_level = verbose_level self.config = Config() - @property @beartype.beartype def minimum_fault_length(self) -> 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 @@ -309,14 +308,14 @@ 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 + 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 + 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 @@ -328,11 +327,11 @@ 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 + 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 + list: A list of lithology names currently set to be ignored in the geology shapefile. """ return self.config.geology_config["ignore_lithology_codes"] @@ -544,7 +543,7 @@ def open_http_query(url: str): else: return response except urllib.URLError: - return None + return None @beartype.beartype def __retrieve_tif(self, filename: str): @@ -579,6 +578,7 @@ def __retrieve_tif(self, filename: str): # 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: @@ -724,7 +724,7 @@ def parse_fault_orientations(self) -> tuple: self.raw_data[Datatype.FAULT_ORIENTATION]["geometry"] ) - config = self.config.fault_config + config = self.config.fault_config # Parse dip direction and dip columns if config["dipdir_column"] in self.raw_data[Datatype.FAULT_ORIENTATION]: @@ -995,8 +995,9 @@ def parse_fault_map(self) -> tuple: # update minimum fault length either with the value from the config or calculate it if self.minimum_fault_length < 0: - self.minimum_fault_length = calculate_minimum_fault_length(bbox = self.bounding_box, area_percentage = 0.05) - + self.minimum_fault_length = calculate_minimum_fault_length( + bbox=self.bounding_box, area_percentage=0.05 + ) # crop faults = faults.loc[faults.geometry.length >= self.minimum_fault_length] @@ -1214,7 +1215,9 @@ def save_all_map_data(self, output_dir: pathlib.Path, extension: str = ".csv"): 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"): + def save_raw_map_data( + self, output_dir: pathlib.Path, datatype: Datatype, extension: str = ".shp.zip" + ): """ Save the map data from datatype to file @@ -1353,7 +1356,7 @@ def export_wkt_format_files(self): """ # TODO: - Move away from tab seperators entirely (topology and map2model) - self.map2model_tmp_path = pathlib.Path(tempfile.mkdtemp()) + 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) @@ -1387,9 +1390,7 @@ def export_wkt_format_files(self): 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, + pathlib.Path(self.map2model_tmp_path) / "geology_wkt.csv", sep="\t", index=False ) # Check faults data status and export to a WKT format file @@ -1404,9 +1405,7 @@ def export_wkt_format_files(self): 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, + pathlib.Path(self.map2model_tmp_path) / "faults_wkt.csv", sep="\t", index=False ) @beartype.beartype @@ -1556,14 +1555,16 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) # check if the units in the strati colum are in the geology dataset, so that basal contacts can be built # if not, stop the project - 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() + 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() + ) 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." + "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." ) # apply minimum lithological id between the two units @@ -1585,7 +1586,9 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) # added code to make sure that multi-line that touch each other are snapped and merged. # necessary for the reconstruction based on featureId - basal_contacts["geometry"] = [shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"]] + basal_contacts["geometry"] = [ + shapely.line_merge(shapely.snap(geo, geo, 1)) for geo in basal_contacts["geometry"] + ] if save_contacts: # keep abnormal contacts as all_basal_contacts @@ -1626,9 +1629,9 @@ def colour_units( if self.colour_filename is None: print("\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) - ) + 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. @@ -1642,9 +1645,9 @@ def colour_units( suffixes=("_old", ""), how="left", ) - stratigraphic_units.loc[stratigraphic_units["colour"].isna(), "colour"] = ( - generate_random_hex_colors(int(stratigraphic_units["colour"].isna().sum())) - ) + 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: print( diff --git a/map2loop/project.py b/map2loop/project.py index 427f0f8b..5e60fece 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -28,6 +28,7 @@ logger = getLogger(__name__) + class Project(object): """ The main entry point into using map2loop @@ -178,16 +179,7 @@ def __init__( # 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", - }: + 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( @@ -212,7 +204,9 @@ def __init__( if config_filename != "": if clut_file_legacy: - logger.warning("DEPRECATION: Legacy files are deprecated and their use will be removed in v3.2") + logger.warning( + "DEPRECATION: Legacy files are deprecated and their use will be removed in v3.2" + ) self.map_data.set_config_filename(config_filename, legacy_format=clut_file_legacy) @@ -245,13 +239,13 @@ 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 + 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 + 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) @@ -263,17 +257,17 @@ 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 + 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 + 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 + self.map_data.parse_fault_map() # remove the ignored faults @beartype.beartype def set_sorter(self, sorter: Sorter): @@ -386,7 +380,7 @@ def set_minimum_fault_length(self, length: float): length (float): The cutoff length """ - logger.info(f"Setting minimum fault length to {length}") + logger.info(f"Setting minimum fault length to {length}") self.map_data.config.fault_config['minimum_fault_length'] = length @beartype.beartype @@ -404,11 +398,15 @@ def sample_map_data(self): """ Use the samplers to extract points along polylines or unit boundaries """ - logger.info(f"Sampling geology map data using {self.samplers[Datatype.GEOLOGY].sampler_label}") + logger.info( + f"Sampling geology map data using {self.samplers[Datatype.GEOLOGY].sampler_label}" + ) self.geology_samples = self.samplers[Datatype.GEOLOGY].sample( self.map_data.get_map_data(Datatype.GEOLOGY), self.map_data ) - logger.info(f"Sampling structure map data using {self.samplers[Datatype.STRUCTURE].sampler_label}") + logger.info( + f"Sampling structure map data using {self.samplers[Datatype.STRUCTURE].sampler_label}" + ) self.structure_samples = self.samplers[Datatype.STRUCTURE].sample( self.map_data.get_map_data(Datatype.STRUCTURE), self.map_data ) @@ -441,13 +439,14 @@ def calculate_stratigraphic_order(self, take_best=False): """ if take_best: sorters = [SorterUseHint(), SorterAgeBased(), SorterAlpha(), SorterUseNetworkX()] - logger.info(f"Calculating best stratigraphic column from {[sorter.sorter_label for sorter in sorters]}") + logger.info( + f"Calculating best stratigraphic column from {[sorter.sorter_label for sorter in sorters]}" + ) columns = [ sorter.sort( self.stratigraphic_column.stratigraphicUnits, self.map2model.get_unit_unit_relationships(), - self.map2model.get_sorted_units(), self.map_data.contacts, self.map_data, ) @@ -478,34 +477,39 @@ def calculate_stratigraphic_order(self, take_best=False): self.stratigraphic_column.column = self.sorter.sort( self.stratigraphic_column.stratigraphicUnits, self.map2model.get_unit_unit_relationships(), - self.map2model.get_sorted_units(), self.map_data.contacts, self.map_data, ) @beartype.beartype - def set_thickness_calculator(self, thickness_calculator: Union['ThicknessCalculator', List['ThicknessCalculator']]) -> None: + def set_thickness_calculator( + self, thickness_calculator: Union['ThicknessCalculator', List['ThicknessCalculator']] + ) -> None: """ - Sets the thickness_calculator attribute for the object. + 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 + 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): + 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 + 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 = [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.") + 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 self.thickness_calculator = thickness_calculator @@ -529,12 +533,16 @@ def get_thickness_calculator(self) -> List[str]: 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] + 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") + 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): """ @@ -601,7 +609,10 @@ def calculate_fault_orientations(self): ) self.map_data.get_value_from_raster_df(Datatype.DTM, self.fault_orientations) else: - logger.warning("No fault orientation data found, skipping fault orientation calculation") + 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 @@ -630,7 +641,7 @@ def summarise_fault_data(self): self.map_data.basal_contacts, self.map_data, ) - logger.info(f'There are {self.deformation_history.faults.shape[0]} faults in the dataset') + 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): """ @@ -650,12 +661,12 @@ def run_all(self, user_defined_stratigraphic_column=None, take_best=False): # Calculate the stratigraphic column if issubclass(type(user_defined_stratigraphic_column), list): self.stratigraphic_column.column = user_defined_stratigraphic_column - self.map2model.run() # if we use a user defined stratigraphic column, we still need to calculate the results of map2model + self.map2model.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? + ) # why not try casting to a list? self.calculate_stratigraphic_order(take_best) self.sort_stratigraphic_column() @@ -766,7 +777,11 @@ def save_into_projectfile(self): # Function to retrieve a column if it exists, otherwise return a list of default values def get_column_or_default(column_name, default_value, length): - return list(self.stratigraphic_column.stratigraphicUnits.get(column_name, [default_value] * length)) + return list( + self.stratigraphic_column.stratigraphicUnits.get( + column_name, [default_value] * length + ) + ) # Get the current list of thickness calculator labels dynamically thickness_labels = self.thickness_calculator_labels @@ -822,7 +837,13 @@ def get_column_or_default(column_name, default_value, length): thickness_calculator_labels = [tuple(self.thickness_calculator_labels[:5])] # save into LPF - LPF.Set(self.loop_filename, "stratigraphicLog", data=stratigraphic_data, thickness_calculator_data = thickness_calculator_labels, verbose=True) + LPF.Set( + self.loop_filename, + "stratigraphicLog", + data=stratigraphic_data, + thickness_calculator_data=thickness_calculator_labels, + verbose=True, + ) # Save contacts contacts_data = numpy.zeros(len(self.map_data.sampled_contacts), LPF.contactObservationType) @@ -846,9 +867,9 @@ def get_column_or_default(column_name, default_value, length): 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[ + "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"] @@ -911,7 +932,7 @@ def get_column_or_default(column_name, default_value, length): 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}") + logger.info(f"Fault relationships: {relationships}") LPF.Set(self.loop_filename, "eventRelationships", data=relationships) @beartype.beartype diff --git a/map2loop/sampler.py b/map2loop/sampler.py index e14c6cec..01600566 100644 --- a/map2loop/sampler.py +++ b/map2loop/sampler.py @@ -168,6 +168,6 @@ def sample( 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/map2loop/sorter.py b/map2loop/sorter.py index 72d69d58..cf444de6 100644 --- a/map2loop/sorter.py +++ b/map2loop/sorter.py @@ -40,7 +40,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -50,7 +49,6 @@ def sort( Args: units (pandas.DataFrame): the data frame to sort (columns must contain ["layerId", "name", "minAge", "maxAge", "group"]) units_relationships (pandas.DataFrame): the relationships between units (columns must contain ["Index1", "Unitname1", "Index2", "Unitname2"]) - stratigraphic_order_hint (list): a list of unit names to be used as a hint to sorting the units contacts (pandas.DataFrame): unit contacts with length of the contacts in metres map_data (map2loop.MapData): a catchall so that access to all map data is available @@ -60,45 +58,6 @@ def sort( pass -class SorterUseHint(Sorter): - """ - Sorter class which only returns the hint (no algorithm for sorting is done in this class) - """ - - def __init__(self): - """ - Initialiser for use hint sorter - """ - self.sorter_label = "SorterUseHint" - - @beartype.beartype - def sort( - self, - units: pandas.DataFrame, - unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, - contacts: pandas.DataFrame, - map_data: MapData, - ) -> list: - """ - Execute sorter method takes unit data, relationships and a hint and returns the sorted unit names based on this algorithm. - In this case it purely returns the hint list - - Args: - units (pandas.DataFrame): the data frame to sort - units_relationships (pandas.DataFrame): the relationships between units - stratigraphic_order_hint (list): a list of unit names to use as a hint to sorting the units - contacts (pandas.DataFrame): unit contacts with length of the contacts in metres - map_data (map2loop.MapData): a catchall so that access to all map data is available - - Returns: - list: the sorted unit names - """ - logger.info('Stratigraphic order calculated using provided hint') - logger.info(','.join(stratigraphic_order_hint)) - return stratigraphic_order_hint - - class SorterUseNetworkX(Sorter): """ Sorter class which returns a sorted list of units based on the unit relationships using a topological graph sorting algorithm @@ -115,7 +74,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -125,24 +83,21 @@ def sort( Args: units (pandas.DataFrame): the data frame to sort units_relationships (pandas.DataFrame): the relationships between units - stratigraphic_order_hint (list): a list of unit names to use as a hint to sorting the units contacts (pandas.DataFrame): unit contacts with length of the contacts in metres map_data (map2loop.MapData): a catchall so that access to all map data is available Returns: list: the sorted unit names """ - try: - import networkx as nx - except Exception: - logger.error("Cannot import networkx module, defaulting to SorterUseHint") - return stratigraphic_order_hint + import networkx as nx 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 unit_relationships.iterrows(): - graph.add_edge(row[1]["Index1"], row[1]["Index2"]) + 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)): @@ -161,6 +116,14 @@ def sort( return order +class SorterUseHint(SorterUseNetworkX): + def __init__(self): + print( + "SorterUseHint is deprecated and will be removed in map2loop v3.2. Use SorterUseNetworkX instead" + ) + super().__init__() + + class SorterAgeBased(Sorter): """ Sorter class which returns a sorted list of units based on the min and max ages of the units @@ -176,7 +139,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -229,7 +191,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -246,11 +207,7 @@ def sort( Returns: list: the sorted unit names """ - try: - import networkx as nx - except Exception: - logger.warning("Cannot import networkx module, defaulting to SorterUseHint") - return stratigraphic_order_hint + import networkx as nx contacts = contacts.sort_values(by="length", ascending=False)[ ["UNITNAME_1", "UNITNAME_2", "length"] @@ -322,7 +279,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -339,12 +295,8 @@ def sort( Returns: list: the sorted unit names """ - try: - import networkx as nx - import networkx.algorithms.approximation as nx_app - except Exception: - logger.warning("Cannot import networkx module, defaulting to SorterUseHint") - return stratigraphic_order_hint + import networkx as nx + import networkx.algorithms.approximation as nx_app sorted_contacts = contacts.sort_values(by="length", ascending=False) self.graph = nx.Graph() @@ -409,7 +361,6 @@ def sort( self, units: pandas.DataFrame, unit_relationships: pandas.DataFrame, - stratigraphic_order_hint: list, contacts: pandas.DataFrame, map_data: MapData, ) -> list: @@ -426,14 +377,10 @@ def sort( Returns: list: the sorted unit names """ - try: - import networkx as nx - import networkx.algorithms.approximation as nx_app - from shapely.geometry import LineString, Point - from map2loop.m2l_enums import Datatype - except Exception: - logger.warning("Cannot import networkx module, defaulting to SorterUseHint") - return stratigraphic_order_hint + import networkx as nx + import networkx.algorithms.approximation as nx_app + from shapely.geometry import LineString, Point + from map2loop.m2l_enums import Datatype geol = map_data.get_map_data(Datatype.GEOLOGY).copy() geol = geol.drop(geol.index[np.logical_or(geol["INTRUSIVE"], geol["SILL"])]) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index fce4f001..b3abcdd2 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -5,7 +5,7 @@ rebuild_sampled_basal_contacts, calculate_endpoints, multiline_to_line, - find_segment_strike_from_pt + find_segment_strike_from_pt, ) from .m2l_enums import Datatype from .interpolators import DipDipDirectionInterpolator @@ -74,7 +74,7 @@ def compute( 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: print( f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" @@ -121,30 +121,32 @@ def compute( 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=map_data.sampled_contacts) + + basal_unit_list = basal_contacts["basal_unit"].to_list() + sampled_basal_contacts = rebuild_sampled_basal_contacts( + basal_contacts=basal_contacts, sampled_contacts=map_data.sampled_contacts + ) if len(stratigraphic_order) < 3: print( 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] + 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] @@ -173,6 +175,7 @@ def compute( return thicknesses + class InterpolatedStructure(ThicknessCalculator): """ This class is a subclass of the ThicknessCalculator abstract base class. It implements the thickness calculation @@ -259,7 +262,7 @@ def compute( contacts = contacts.sjoin(basal_contacts, how="inner", predicate="intersects") contacts = contacts[["X", "Y", "Z", "geometry", "basal_unit"]].copy() bounding_box = map_data.get_bounding_box() - + # Interpolate the dip of the contacts interpolator = DipDipDirectionInterpolator(data_type="dip") # Interpolate the dip of the contacts @@ -448,13 +451,14 @@ def compute( ) # add unitname to the sampled structures sampled_structures['unit_name'] = geopandas.sjoin(sampled_structures, geology)['UNITNAME'] - - # remove nans from sampled structures + + # 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 - print(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") + print( + 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, map_data.sampled_contacts @@ -484,17 +488,19 @@ def compute( # 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: - print(f"There are structural measurements in unit - {litho_in} - that are not in the geology shapefile. Skipping this structural measurement") + if len(geology[geology['UNITNAME'] == litho_in]) == 0: + print( + f"There are structural measurements in unit - {litho_in} - that are not in the geology shapefile. Skipping this structural measurement" + ) continue - else: + 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 B = calculate_endpoints(measurement_pt, strike, self.line_length, bbox_poly) b = geopandas.GeoDataFrame({'geometry': [B]}).set_crs(basal_contacts.crs) @@ -570,7 +576,7 @@ def compute( # find the lenght of the segment L = math.sqrt(((int_pt1.x - int_pt2.x) ** 2) + ((int_pt1.y - int_pt2.y) ** 2)) - + # calculate thickness thickness = L * math.sin(math.radians(measurement['DIP'])) @@ -596,10 +602,10 @@ def compute( 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) + + 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 @@ -615,7 +621,8 @@ def compute( 'Thickness Calculator StructuralPoint: Cannot calculate thickness between', unit, "and ", - stratigraphic_order[idx + 1], "\n" + stratigraphic_order[idx + 1], + "\n", ) # assign -1 as thickness output_units.loc[output_units["name"] == unit, "ThicknessMedian"] = -1 diff --git a/map2loop/utils.py b/map2loop/utils.py index a562cf95..e00c0f91 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -374,8 +374,10 @@ def hex_to_rgb(hex_color: str) -> tuple: @beartype.beartype -def calculate_minimum_fault_length(bbox: Dict[str, Union[int, float]], area_percentage: float) -> float: - +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. @@ -386,7 +388,7 @@ def calculate_minimum_fault_length(bbox: Dict[str, Union[int, float]], area_perc 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'] @@ -398,4 +400,4 @@ def calculate_minimum_fault_length(bbox: Dict[str, Union[int, float]], area_perc threshold_area = area_percentage * bbox_area # Return the square root of the threshold area as the minimum fault length - return (threshold_area ** 0.5) \ No newline at end of file + return threshold_area**0.5 diff --git a/tests/mapdata/test_mapdata_dipdir.py b/tests/mapdata/test_mapdata_dipdir.py index 68f45b47..cc156253 100644 --- a/tests/mapdata/test_mapdata_dipdir.py +++ b/tests/mapdata/test_mapdata_dipdir.py @@ -5,9 +5,10 @@ import pytest import geopandas import shapely -from map2loop.mapdata import MapData +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 @@ -15,27 +16,27 @@ def test_if_m2l_returns_all_sampled_structures_with_DIPDIR_lower_than_360(): # 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" - } + "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.Point(1, 1), shapely.Point(2, 2), shapely.Point(3, 3),], - 'DIPDIR': [45.0, 370.0, 420.0], + 'geometry': [shapely.Point(1, 1), shapely.Point(2, 2), shapely.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] + 'ID': [1, 2, 3], } - #build geodataframe to hold the data + # build geodataframe to hold the data data = geopandas.GeoDataFrame(data) # set it as the raw_data @@ -49,6 +50,9 @@ def test_if_m2l_returns_all_sampled_structures_with_DIPDIR_lower_than_360(): 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" - -# + assert ( + md.data[Datatype.STRUCTURE]['DIPDIR'].all() < 360 + ), "MapData.STRUCTURE is producing DIPDIRs > 360 degrees" + + +# diff --git a/tests/mapdata/test_minimum_fault_length.py b/tests/mapdata/test_minimum_fault_length.py index a75ba237..ce78bcc1 100644 --- a/tests/mapdata/test_minimum_fault_length.py +++ b/tests/mapdata/test_minimum_fault_length.py @@ -6,16 +6,18 @@ 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. + 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 @@ -27,48 +29,62 @@ def test_update_minimum_fault_length_from_faults(setup_map_data): "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 + + # 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({ + 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" - + 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] + 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']) + ) - #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 + 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? + +# 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 @@ -79,26 +95,30 @@ def test_cropping_faults_by_minimum_fault_length(setup_map_data): map_data.config.fault_config['dip_column'] = 'DIP' # Create a mock faults dataset with lengths < 10 and > 10 - faults = gpd.GeoDataFrame({ + 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) + 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] - }) - + '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] - + 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)}" + 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}" \ No newline at end of file + 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/tests/mapdata/test_set_get_recreate_bounding_box.py b/tests/mapdata/test_set_get_recreate_bounding_box.py index 51229d49..5a6e9368 100644 --- a/tests/mapdata/test_set_get_recreate_bounding_box.py +++ b/tests/mapdata/test_set_get_recreate_bounding_box.py @@ -1,38 +1,35 @@ import pytest -from map2loop.mapdata import MapData +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 + "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 - } + 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) @@ -40,51 +37,59 @@ def test_bounding_box_keys(md): 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.Polygon(zip(lon_point_list, lat_point_list))] + geometry=[shapely.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" + + 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 - } + 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" + + 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" + + 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" + 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 = { @@ -94,5 +99,6 @@ def test_set_bounding_box_with_missing_keys(md): # 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" - + md.set_bounding_box( + bounding_box + ), "MapData.set_bounding_box accepting wrong argument, but should raise KeyError" diff --git a/tests/mapdata/test_set_get_working_projection.py b/tests/mapdata/test_set_get_working_projection.py index 85285f01..47a078d5 100644 --- a/tests/mapdata/test_set_get_working_projection.py +++ b/tests/mapdata/test_set_get_working_projection.py @@ -2,6 +2,7 @@ from map2loop.mapdata import MapData + @pytest.mark.parametrize( "projection, expected_projection, bounding_box, expected_warning", [ @@ -9,9 +10,24 @@ ("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, "Warning: Unknown projection set None. Leaving all map data in original projection\n"), # error case with None - ([], None, None, "Warning: Unknown projection set []. Leaving all map data in original projection\n"), # error case with list - ({}, None, None, "Warning: Unknown projection set {}. Leaving all map data in original projection\n"), # error case with dict + ( + None, + None, + None, + "Warning: Unknown projection set None. Leaving all map data in original projection\n", + ), # error case with None + ( + [], + None, + None, + "Warning: Unknown projection set []. Leaving all map data in original projection\n", + ), # error case with list + ( + {}, + None, + None, + "Warning: Unknown projection set {}. Leaving all map data in original projection\n", + ), # error case with dict ], ids=[ "int_projection", @@ -21,18 +37,20 @@ "none_projection", "list_projection", "dict_projection", - ] + ], ) -def test_set_working_projection(projection, expected_projection, bounding_box, expected_warning, capsys): +def test_set_working_projection( + projection, expected_projection, bounding_box, expected_warning, capsys +): map_data = MapData() map_data.bounding_box = bounding_box - map_data.set_working_projection(projection) - - assert map_data.working_projection == expected_projection, "Map.data set_working_projection() not attributing the correct projection" + assert ( + map_data.working_projection == expected_projection + ), "Map.data set_working_projection() not attributing the correct projection" if expected_warning: captured = capsys.readouterr() diff --git a/tests/project/test_ignore_codes_setters_getters.py b/tests/project/test_ignore_codes_setters_getters.py index 471fcbe4..4cebdba7 100644 --- a/tests/project/test_ignore_codes_setters_getters.py +++ b/tests/project/test_ignore_codes_setters_getters.py @@ -1,5 +1,5 @@ import pathlib -from map2loop.project import Project +from map2loop.project import Project from map2loop.m2l_enums import Datatype import map2loop @@ -15,46 +15,56 @@ def test_set_get_ignore_codes(): "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", - }, + "structure": {"dipdir_column": "azimuth2", "dip_column": "dip"}, + "geology": {"unitname_column": "unitname", "alt_unitname_column": "code"}, } - 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 - ) - - # Define test ignore codes for lithology and faults + 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, + ) + + # 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" - + 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() \ No newline at end of file + 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/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py index cd3d075e..7be0bb55 100644 --- a/tests/project/test_plot_hamersley.py +++ b/tests/project/test_plot_hamersley.py @@ -29,32 +29,42 @@ def create_project(state_data="WA", projection="EPSG:28350"): overwrite_loopprojectfile=True, ) + # is the project running? def test_project_execution(): - + proj = create_project() try: proj.run_all(take_best=True) - # if there's a timeout: + # if there's a timeout: except requests.exceptions.ReadTimeout: print("Timeout occurred, skipping the test.") # Debugging line - pytest.skip("Skipping the project test from server data due to timeout while attempting to run proj.run_all") + 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" + 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? +# 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." + 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: @@ -65,6 +75,7 @@ def test_expect_crs_error(): 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: @@ -75,6 +86,7 @@ def test_expect_state_error(): 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: diff --git a/tests/project/test_thickness_calculations.py b/tests/project/test_thickness_calculations.py index 385a1dc1..9cf5464d 100644 --- a/tests/project/test_thickness_calculations.py +++ b/tests/project/test_thickness_calculations.py @@ -9,24 +9,59 @@ # 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' - ] -}) +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'] +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 = [ @@ -41,51 +76,1569 @@ {'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'} + {'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_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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], - '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] -}) +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 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'] +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}) @@ -97,46 +1650,71 @@ 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 - ) - + 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 - + + assert project.get_thickness_calculator() == [ + 'InterpolatedStructure' + ], "Default for thickness calculator not set" ## default is InterpolatedStructure + # check set - + project.set_thickness_calculator([StructuralPoint(), InterpolatedStructure()]) - assert project.get_thickness_calculator() == ['StructuralPoint', 'InterpolatedStructure'], "Setter method for thickness calculator not working" ## default is InterpolatedStructure - + 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() - + # # Check if all thicknesses have been calculated columns_to_check = [ 'StructuralPoint_mean', @@ -146,17 +1724,26 @@ def test_calculate_unit_thicknesses(): '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" + 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" + 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' - - \ No newline at end of file + 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/tests/thickness/InterpolatedStructure/test_interpolated_structure.py b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py index 4590d364..9bc28431 100644 --- a/tests/thickness/InterpolatedStructure/test_interpolated_structure.py +++ b/tests/thickness/InterpolatedStructure/test_interpolated_structure.py @@ -4,7 +4,10 @@ from map2loop.mapdata import MapData from map2loop.thickness_calculator import InterpolatedStructure -from map2loop._datasets.geodata_files.load_map2loop_data import load_hamersley_geology, load_hamersley_dtm +from map2loop._datasets.geodata_files.load_map2loop_data import ( + load_hamersley_geology, + load_hamersley_dtm, +) from map2loop.m2l_enums import Datatype ########################################################################## @@ -12,26 +15,61 @@ ########################################################################## # 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_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'] +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 = [ @@ -46,43 +84,1561 @@ {'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'} + {'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_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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], - '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] -}) +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'] +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}) @@ -96,60 +1652,83 @@ def check_thickness_values(result, column, description): - for order, position in [(max(st_units['stratigraphic_Order']), 'bottom'), - (min(st_units['stratigraphic_Order']), 'top')]: + 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 thickness_calculator = InterpolatedStructure() - + 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, } - + + md.bounding_box = { + "minx": 515687.31005864, + "miny": 7493446.76593407, + "maxx": 562666.860106543, + "maxy": 7521273.57407786, + "base": -3200, + "top": 3000, + } + result = thickness_calculator.compute( - units=st_units, - stratigraphic_order=st_column, - basal_contacts= bc_gdf, - structure_data=structures, - map_data=md + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + map_data=md, ) - + # 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 + 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' - + 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')]: + 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' - + 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' + assert ( + not result[column].isnull().values.any() + ), f'InterpolatedStructure: result column {column} has NaN values' diff --git a/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py index b7249eaf..a71ebb7b 100644 --- a/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py +++ b/tests/thickness/StructurePoint/test_ThicknessStructuralPoint.py @@ -12,26 +12,61 @@ #################################################################### # 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_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'] +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 = [ @@ -46,43 +81,1561 @@ {'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'} + {'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_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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], - '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] -}) +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'] +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}) @@ -96,17 +1649,19 @@ def check_thickness_values(result, column, description): - for order, position in [(max(st_units['stratigraphic_Order']), 'bottom'), - (min(st_units['stratigraphic_Order']), 'top')]: + 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() - + md = MapData() md.sampled_contacts = s_c md.sampled_contacts = s_c @@ -114,38 +1669,50 @@ def test_calculate_thickness_structural_point(): 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, - map_data=md + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + map_data=md, ) - + # 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 ( + 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 + + # 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' - + 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')]: + 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' - + 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' \ No newline at end of file + assert ( + not result[column].isnull().values.any() + ), f'StructuralPoint: result column {column} has NaN values' diff --git a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py index d0427629..a169b3ce 100644 --- a/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py +++ b/tests/thickness/ThicknessCalculatorAlpha/test_ThicknessCalculatorAlpha.py @@ -13,26 +13,61 @@ ######################################################### # 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_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'] +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 = [ @@ -47,45 +82,1562 @@ {'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'} + {'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_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.493304e+06, 7.493512e+06, 7.494607e+06, 7.504599e+06, 7.497506e+06, 7.497806e+06, 7.498506e+06, 7.499506e+06, 7.500506e+06, 7.501506e+06, 7.502506e+06], - '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] -}) - +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'] +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}) @@ -94,56 +1646,68 @@ ### 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')]: + 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() + + def test_calculate_thickness_thickness_calculator_alpha(): # Run the calculation md = MapData() md.sampled_contacts = s_c md.data[Datatype.GEOLOGY] = geology - + print('GERE', md.get_map_data(Datatype.GEOLOGY)) - + thickness_calculator = ThicknessCalculatorAlpha() result = thickness_calculator.compute( - units=st_units, - stratigraphic_order=st_column, - basal_contacts= bc_gdf, - structure_data=structures, - map_data=md + units=st_units, + stratigraphic_order=st_column, + basal_contacts=bc_gdf, + structure_data=structures, + map_data=md, ) - - - + # 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 ( + 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 + + # 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' - + 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')]: + 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' \ No newline at end of file + assert not result[column].isnull().values.any(), f'{column} has NaN values' diff --git a/tests/utils/test_rgb_and_hex_functions.py b/tests/utils/test_rgb_and_hex_functions.py index cce2059b..a4d82fd9 100644 --- a/tests/utils/test_rgb_and_hex_functions.py +++ b/tests/utils/test_rgb_and_hex_functions.py @@ -4,11 +4,14 @@ import re from map2loop.utils import generate_random_hex_colors, hex_to_rgb -#does it return the right number of colors? +# 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)}" + 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(): @@ -16,21 +19,29 @@ def test_generate_random_hex_colors_format(): 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." + 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 + 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)}" + 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 + 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." \ No newline at end of file + 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." From b7c9c049393ba7eb0878be20f046413de5e18801 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 11:30:23 +1100 Subject: [PATCH 128/187] fix: make the minimum_fault_length updatable through project --- map2loop/deformation_history.py | 26 ++++++++++++++++++-------- map2loop/mapdata.py | 2 +- map2loop/project.py | 4 +++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index 4073bc85..05cea62e 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -4,11 +4,12 @@ import geopandas import math +from .utils import calculate_minimum_fault_length + from .logging import getLogger logger = getLogger(__name__) -from .config import Config class DeformationHistory: @@ -30,13 +31,15 @@ class DeformationHistory: """ - def __init__(self): + def __init__(self, project): """ The initialiser for the deformation history. All attributes are defaulted """ self.history = [] self.fault_fault_relationships = [] - + self.minimum_fault_length = project.get_minimum_fault_length() + self.bounding_box = project.bounding_box + # Create empty fault and fold dataframes self.faultColumns = numpy.dtype( [ @@ -66,7 +69,7 @@ def __init__(self): ) self.faults = pandas.DataFrame(numpy.empty(0, dtype=self.faultColumns)) # self.faults = self.faults.set_index("name") - + self.foldColumns = numpy.dtype( [ ("eventId", int), @@ -84,7 +87,9 @@ def __init__(self): ) 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 @@ -258,7 +263,8 @@ def summarise_data(self, fault_observations: pandas.DataFrame): 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) @@ -266,8 +272,12 @@ def get_faults_for_export(self): Returns: pandas.DataFrame: The filtered fault summary """ - mfl = Config().fault_config["minimum_fault_length"] - return self.faults[self.faults["length"] >= mfl].copy() + # if no minimum fault length is set, calculate it + if self.minimum_fault_length < 0: + self.minimum_fault_length = calculate_minimum_fault_length( + bbox=self.bounding_box, area_percentage=0.05 + ) + return self.faults[self.faults["length"] >= self.minimum_fault_length].copy() @beartype.beartype def get_fault_relationships_with_ids(self, fault_fault_relationships: pandas.DataFrame): diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 0323f16b..83584587 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -94,7 +94,7 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): @property @beartype.beartype - def minimum_fault_length(self) -> float: + def minimum_fault_length(self) -> Union[int,float]: return self.config.fault_config["minimum_fault_length"] @minimum_fault_length.setter diff --git a/map2loop/project.py b/map2loop/project.py index 5e60fece..54926372 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -126,6 +126,7 @@ def __init__( self.verbose_level = verbose_level self.samplers = [SamplerDecimator()] * len(Datatype) self.set_default_samplers() + self.bounding_box = bounding_box self.sorter = SorterUseHint() self.thickness_calculator = [InterpolatedStructure()] self.throw_calculator = ThrowCalculatorAlpha() @@ -133,7 +134,7 @@ def __init__( self.map_data = MapData(verbose_level=verbose_level) self.map2model = Map2ModelWrapper(self.map_data) self.stratigraphic_column = StratigraphicColumn() - self.deformation_history = DeformationHistory() + self.deformation_history = DeformationHistory(project=self) self.loop_filename = loop_project_filename self.overwrite_lpf = overwrite_loopprojectfile @@ -382,6 +383,7 @@ def set_minimum_fault_length(self, length: float): """ 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: From cde6a11d86679dce1dfda988391b35d23a3c221a Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 11:46:36 +1100 Subject: [PATCH 129/187] fix: add libgdal to docs docker --- docs/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Dockerfile b/docs/Dockerfile index d550cac5..814493f5 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,6 +10,7 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ + libgdal\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From 7c09a807cd91ce3325ebc7012eb25dcb0224ab15 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 11:48:47 +1100 Subject: [PATCH 130/187] typo --- docs/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 814493f5..0b0baab4 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,7 +10,7 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ - libgdal\ + libgdal-dev\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From 1791acbc1744110b9a8675fe1ca31a54fbdb0a70 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 12:47:03 +1100 Subject: [PATCH 131/187] fix: try other gdal on docs --- docs/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index 0b0baab4..294a692d 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,7 +10,8 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ - libgdal-dev\ + gdal-bin\ + python3-gdal\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From a94e67cd181c9a1024c90da53f995dcaa7814619 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 12:51:35 +1100 Subject: [PATCH 132/187] more gdal issues --- docs/Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/Dockerfile b/docs/Dockerfile index 294a692d..5b12fd42 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -11,6 +11,7 @@ RUN apt-get update -qq && \ make\ libgl1\ gdal-bin\ + libgdal-dev\ python3-gdal\ libtinfo5\ libtiff6\ From 32d3683b54c070270e025962e1bc1da284ff9ebd Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 28 Nov 2024 13:00:34 +1100 Subject: [PATCH 133/187] fix: revert the gdal pin removal to see if that's the issue --- dependencies.txt | 2 +- docs/Dockerfile | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/dependencies.txt b/dependencies.txt index e75001e7..4b36eb66 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -7,6 +7,6 @@ owslib map2model loopprojectfile==0.1.4 beartype -gdal +gdal==3.8.4 pytest scikit-learn diff --git a/docs/Dockerfile b/docs/Dockerfile index 5b12fd42..d550cac5 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -10,9 +10,6 @@ RUN apt-get update -qq && \ libc-dev \ make\ libgl1\ - gdal-bin\ - libgdal-dev\ - python3-gdal\ libtinfo5\ libtiff6\ libgl1-mesa-glx\ From 0d6c5eda9b5279d52f8cac045f121a23896a3c5b Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Fri, 29 Nov 2024 17:32:07 +1100 Subject: [PATCH 134/187] fix: use minimum fault length from project --- map2loop/deformation_history.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/map2loop/deformation_history.py b/map2loop/deformation_history.py index 05cea62e..1bf47a61 100644 --- a/map2loop/deformation_history.py +++ b/map2loop/deformation_history.py @@ -37,8 +37,7 @@ def __init__(self, project): """ self.history = [] self.fault_fault_relationships = [] - self.minimum_fault_length = project.get_minimum_fault_length() - self.bounding_box = project.bounding_box + self.project = project # Create empty fault and fold dataframes self.faultColumns = numpy.dtype( @@ -273,11 +272,11 @@ def get_faults_for_export(self): pandas.DataFrame: The filtered fault summary """ # if no minimum fault length is set, calculate it - if self.minimum_fault_length < 0: - self.minimum_fault_length = calculate_minimum_fault_length( - bbox=self.bounding_box, area_percentage=0.05 - ) - return self.faults[self.faults["length"] >= self.minimum_fault_length].copy() + 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): From 2dad8e7901152b2c8599f8de1366cb2777597fb6 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Tue, 3 Dec 2024 15:21:28 +1100 Subject: [PATCH 135/187] fix: use separate thickness table in LPF & add active thickness to project (#157) * fix: use separate thickness table in LPF * docs: remove unused docstring * fix: min fault length can be int * fix: bug in output of StructuralPoint * fix: add the active_thickness_flag --------- Co-authored-by: AngRodrigues --- map2loop/mapdata.py | 2 - map2loop/project.py | 108 ++++++++++++++++++------------- map2loop/thickness_calculator.py | 14 ++-- 3 files changed, 70 insertions(+), 54 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 83584587..47562dcc 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -70,8 +70,6 @@ def __init__(self, verbose_level: VerboseLevel = VerboseLevel.ALL): The initialiser for the map data Args: - tmp_path (str, optional): - The directory for storing temporary files. Defaults to "". verbose_level (VerboseLevel, optional): How much console output is sent. Defaults to VerboseLevel.ALL. """ diff --git a/map2loop/project.py b/map2loop/project.py index 54926372..34359059 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -137,7 +137,8 @@ def __init__( 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"] @@ -373,7 +374,7 @@ def get_sampler(self, datatype: Datatype): return self.samplers[datatype].sampler_label @beartype.beartype - def set_minimum_fault_length(self, length: float): + def set_minimum_fault_length(self, length: Union[float, int]): """ Set the cutoff length for faults to ignore @@ -395,6 +396,35 @@ def get_minimum_fault_length(self) -> float: """ 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): """ @@ -600,7 +630,9 @@ def calculate_unit_thicknesses(self): 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}") @@ -703,7 +735,7 @@ def save_into_projectfile(self): file_exists = False logger.info(f"\nExisting file '{self.loop_filename}' was successfully deleted.") except Exception as e: - logger.errow(f"\nFailed to delete existing file '{self.loop_filename}': {e}") + logger.error(f"\nFailed to delete existing file '{self.loop_filename}': {e}") raise e else: logger.error( @@ -767,6 +799,9 @@ def save_into_projectfile(self): 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"] @@ -774,44 +809,18 @@ def save_into_projectfile(self): stratigraphic_data["group"] = self.stratigraphic_column.stratigraphicUnits["group"] stratigraphic_data["enabled"] = 1 - # Length of the column (number of rows in stratigraphicUnits) - column_len = len(self.stratigraphic_column.stratigraphicUnits) - - # Function to retrieve a column if it exists, otherwise return a list of default values - def get_column_or_default(column_name, default_value, length): - return list( - self.stratigraphic_column.stratigraphicUnits.get( - column_name, [default_value] * length - ) - ) - - # Get the current list of thickness calculator labels dynamically - thickness_labels = self.thickness_calculator_labels - - # Define a constant for the maximum number of calculators (5 as per your requirement) - MAX_CALCULATORS = 5 - - # Create lists for mean, median, and stddev values for each calculator dynamically - thickness_mean_list = [ - get_column_or_default(f'{label}_mean', 0, column_len) for label in thickness_labels - ] - thickness_median_list = [ - get_column_or_default(f'{label}_median', 0, column_len) for label in thickness_labels - ] - thickness_stddev_list = [ - get_column_or_default(f'{label}_stddev', 0, column_len) for label in thickness_labels - ] - - # Pad with zeros if the number of calculators is less than MAX_CALCULATORS - for _ in range(MAX_CALCULATORS - len(thickness_mean_list)): - thickness_mean_list.append([0] * column_len) - thickness_median_list.append([0] * column_len) - thickness_stddev_list.append([0] * column_len) - - # Zip these lists into tuples for each stratigraphic row dynamically, ensuring each tuple has exactly 5 elements - stratigraphic_data["ThicknessMean"] = list(zip(*thickness_mean_list[:MAX_CALCULATORS])) - stratigraphic_data["ThicknessMedian"] = list(zip(*thickness_median_list[:MAX_CALCULATORS])) - stratigraphic_data["ThicknessStdDev"] = list(zip(*thickness_stddev_list[:MAX_CALCULATORS])) + 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"] = [ @@ -831,21 +840,28 @@ def get_column_or_default(column_name, default_value, length): 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") - thickness_calculator_labels = [tuple(self.thickness_calculator_labels[:5])] + 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, - thickness_calculator_data=thickness_calculator_labels, - verbose=True, + 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) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index b3abcdd2..4d383f21 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -1,5 +1,4 @@ # internal imports -import scipy.interpolate from .utils import ( create_points, rebuild_sampled_basal_contacts, @@ -13,6 +12,7 @@ # external imports from abc import ABC, abstractmethod +import scipy.interpolate import beartype import numpy import scipy @@ -590,10 +590,10 @@ def compute( output_units = units.copy() # remove the old thickness column - output_units['ThicknessMedian'] = numpy.empty((len(output_units))) - output_units['ThicknessMean'] = numpy.empty((len(output_units))) - output_units['ThicknessStdDev'] = numpy.empty((len(output_units))) - + 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 @@ -602,10 +602,12 @@ def compute( 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 From 8218a3ae6a4ef8954f030eac7e406c7350b564ef Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 3 Dec 2024 16:46:25 +1100 Subject: [PATCH 136/187] feat: do not accept any legacy files --- map2loop/config.py | 64 +----------------------- map2loop/mapdata.py | 2 +- map2loop/project.py | 25 +++++----- map2loop/sorter.py | 4 +- map2loop/utils.py | 117 ++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 132 insertions(+), 80 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index d4811d97..7a19ddfa 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -135,65 +135,6 @@ def update_from_dictionary(self, dictionary: dict, lower: bool = False): if len(dictionary): logger.warning(f"Unused keys from config format {list(dictionary.keys())}") - @beartype.beartype - def update_from_legacy_file(self, file_map: dict, lower: bool = False): - """ - Update the config dictionary from the provided old version dictionary - - Args: - file_map (dict): The old version dictionary to update from - """ - - code_mapping = { - "otype": (self.structure_config, "orientation_type"), - "dd": (self.structure_config, "dipdir_column"), - "d": (self.structure_config, "dip_column"), - "sf": (self.structure_config, "description_column"), - "bedding": (self.structure_config, "bedding_text"), - "bo": (self.structure_config, "overturned_column"), - "btype": (self.structure_config, "overturned_text"), - "gi": (self.structure_config, "objectid_column"), - "c": (self.geology_config, "unitname_column"), - "u": (self.geology_config, "alt_unitname_column"), - "g": (self.geology_config, "group_column"), - "g2": (self.geology_config, "supergroup_column"), - "ds": (self.geology_config, "description_column"), - "min": (self.geology_config, "minage_column"), - "max": (self.geology_config, "maxage_column"), - "r1": (self.geology_config, "rocktype_column"), - "r2": (self.geology_config, "alt_rocktype_column"), - "sill": (self.geology_config, "sill_text"), - "intrusive": (self.geology_config, "intrusive_text"), - "volcanic": (self.geology_config, "volcanic_text"), - "f": (self.fault_config, "structtype_column"), - "fault": (self.fault_config, "fault_text"), - "fdipnull": (self.fault_config, "dip_null_value"), - "fdipdip_flag": (self.fault_config, "dipdir_flag"), - "fdipdir": (self.fault_config, "dipdir_column"), - "fdip": (self.fault_config, "dip_column"), - "fdipest": (self.fault_config, "dipestimate_column"), - "fdipest_vals": (self.fault_config, "dipestimate_text"), - "n": (self.fault_config, "name_column"), - "ff": (self.fold_config, "structtype_column"), - "fold": (self.fold_config, "fold_text"), - "t": (self.fold_config, "description_column"), - "syn": (self.fold_config, "synform_text"), - } - for code in code_mapping: - if code in file_map: - if lower is True: - file_map[code] = str(file_map[code]).lower() - code_mapping[code][0][code_mapping[code][1]] = file_map[code] - file_map.pop(code) - - if "o" in file_map: - self.structure_config["objectid_column"] = file_map["o"] - self.fault_config["objectid_column"] = file_map["o"] - self.fold_config["objectid_column"] = file_map["o"] - file_map.pop("o") - - if len(file_map) > 0: - logger.warning(f"Unused keys from legacy format {list(file_map.keys())}") @beartype.beartype def update_from_file( @@ -207,10 +148,7 @@ def update_from_file( legacy_format (bool, optional): Whether the JSON is an old version. Defaults to False. lower (bool, optional): convert keys to lowercase. Defaults to False. """ - if legacy_format: - func = self.update_from_legacy_file - else: - func = self.update_from_dictionary + func = self.update_from_dictionary try: filename = str(filename) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 83584587..e7d258d2 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -269,7 +269,7 @@ def set_config_filename( Whether the file is in m2lv2 form. Defaults to False. """ logger.info('Setting config filename to {filename}') - self.config_filename = filename + self.config.update_from_file(filename, legacy_format=legacy_format, lower=lower) logger.info(f"Config is: {self.config.to_dict()}") diff --git a/map2loop/project.py b/map2loop/project.py index 54926372..71b95c3a 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -70,7 +70,7 @@ def __init__( config_filename: Union[pathlib.Path, str] = "", config_dictionary: dict = {}, clut_filename: Union[pathlib.Path, str] = "", - clut_file_legacy: bool = False, + # clut_file_legacy: bool = False, save_pre_checked_map_data: bool = False, loop_project_filename: str = "", overwrite_loopprojectfile: bool = False, @@ -106,10 +106,8 @@ def __init__( 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): + clut_filename (str, deprecated): The filename of the colour look up table to use. Defaults to "". - clut_file_legacy (bool, optional): - A flag to indicate if the clut file is in the legacy format. Defaults to False. 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): @@ -146,6 +144,11 @@ def __init__( self.fold_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) self.geology_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) + # check if user is using a config file or dictionary, if file, break the project. + if config_filename != "": + logger.error("Config legacy files have been deprecated in v3.2. Please use a dictionary instead.") + raise ValueError("Config legacy files have been deprecated in v3.2. Please use a dictionary instead.You can use the utils function update_from_legacy_file") + # Check for alternate config filenames in kwargs if "metadata_filename" in kwargs and config_filename == "": config_filename = kwargs["metadata_filename"] @@ -203,18 +206,12 @@ def __init__( if fault_orientation_filename != "": self.map_data.set_filename(Datatype.FAULT_ORIENTATION, fault_orientation_filename) - if config_filename != "": - if clut_file_legacy: - logger.warning( - "DEPRECATION: Legacy files are deprecated and their use will be removed in v3.2" - ) - - self.map_data.set_config_filename(config_filename, legacy_format=clut_file_legacy) - - if config_dictionary != {}: - self.map_data.config.update_from_dictionary(config_dictionary) if clut_filename != "": self.map_data.set_colour_filename(clut_filename) + + #set config dict + self.map_data.config.update_from_dictionary(config_dictionary) + # Load all data (both shape and raster) self.map_data.load_all_map_data() diff --git a/map2loop/sorter.py b/map2loop/sorter.py index cf444de6..42da4617 100644 --- a/map2loop/sorter.py +++ b/map2loop/sorter.py @@ -118,8 +118,8 @@ def sort( class SorterUseHint(SorterUseNetworkX): def __init__(self): - print( - "SorterUseHint is deprecated and will be removed in map2loop v3.2. Use SorterUseNetworkX instead" + logger.info( + "SorterUseHint is deprecated in v3.2. Use SorterUseNetworkX instead" ) super().__init__() diff --git a/map2loop/utils.py b/map2loop/utils.py index e00c0f91..a94f29d4 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -5,6 +5,11 @@ import beartype from typing import Union, Optional, Dict import pandas +import re +import json + +from .logging import getLogger +logger = getLogger(__name__) @beartype.beartype @@ -401,3 +406,115 @@ def calculate_minimum_fault_length( # 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 + + +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: + file_map (dict): The old version dictionary to update from + """ + # 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 \ No newline at end of file From 8d926ef6a9bbefc43a4797b1167d2d0560192889 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Wed, 4 Dec 2024 09:58:29 +1100 Subject: [PATCH 137/187] chore: small typo --- map2loop/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/project.py b/map2loop/project.py index 8302c9cb..027bd019 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -148,7 +148,7 @@ def __init__( # check if user is using a config file or dictionary, if file, break the project. if config_filename != "": logger.error("Config legacy files have been deprecated in v3.2. Please use a dictionary instead.") - raise ValueError("Config legacy files have been deprecated in v3.2. Please use a dictionary instead.You can use the utils function update_from_legacy_file") + raise ValueError("Config legacy files have been deprecated in v3.2. Please use a config dictionary instead. You can use the utils function update_from_legacy_file") # Check for alternate config filenames in kwargs if "metadata_filename" in kwargs and config_filename == "": From 5830ef70f9209ce8591a85b6b3dc9a6f1b5ed803 Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Wed, 4 Dec 2024 10:22:26 +1100 Subject: [PATCH 138/187] remove legacy format arguments --- map2loop/config.py | 5 +---- map2loop/mapdata.py | 10 +++++----- tests/project/test_plot_hamersley.py | 1 - 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index 7a19ddfa..5755957c 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -138,14 +138,13 @@ def update_from_dictionary(self, dictionary: dict, lower: bool = False): @beartype.beartype def update_from_file( - self, filename: Union[pathlib.Path, str], legacy_format: bool = False, lower: bool = False + 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 - legacy_format (bool, optional): Whether the JSON is an old version. Defaults to False. lower (bool, optional): convert keys to lowercase. Defaults to False. """ func = self.update_from_dictionary @@ -207,7 +206,5 @@ def update_from_file( 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" - if not legacy_format: - err_string += "Also check if this is a legacy config file and add clut_file_legacy=True to the Project function\n" err_string += "Check the contents for mismatched quotes or brackets!" raise Exception(err_string) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index fabb3727..59fcd3b3 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -255,7 +255,7 @@ def get_filename(self, datatype: Datatype): @beartype.beartype def set_config_filename( - self, filename: Union[pathlib.Path, str], legacy_format: bool = False, lower: bool = False + self, filename: Union[pathlib.Path, str], lower: bool = False ): """ Set the config filename and update the config structure @@ -263,12 +263,12 @@ def set_config_filename( Args: filename (str): The filename of the config file - legacy_format (bool, optional): - Whether the file is in m2lv2 form. Defaults to False. + 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, legacy_format=legacy_format, lower=lower) + self.config.update_from_file(filename, lower=lower) logger.info(f"Config is: {self.config.to_dict()}") def get_config_filename(self): @@ -399,7 +399,7 @@ def set_filenames_from_australian_state(self, state: str): else: self.set_config_filename( - AustraliaStateUrls.aus_config_urls[state], legacy_format=False, lower=lower + AustraliaStateUrls.aus_config_urls[state], lower=lower ) self.set_colour_filename(AustraliaStateUrls.aus_clut_urls[state]) else: diff --git a/tests/project/test_plot_hamersley.py b/tests/project/test_plot_hamersley.py index 7be0bb55..07393f27 100644 --- a/tests/project/test_plot_hamersley.py +++ b/tests/project/test_plot_hamersley.py @@ -23,7 +23,6 @@ def create_project(state_data="WA", projection="EPSG:28350"): use_australian_state_data=state_data, working_projection=projection, bounding_box=bbox_3d, - clut_file_legacy=False, verbose_level=VerboseLevel.NONE, loop_project_filename=loop_project_filename, overwrite_loopprojectfile=True, From b265b3b6efbfd784937667e3c6764daf006af50a Mon Sep 17 00:00:00 2001 From: Lachlan Grose Date: Wed, 4 Dec 2024 10:26:03 +1100 Subject: [PATCH 139/187] add config file path back --- map2loop/project.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/map2loop/project.py b/map2loop/project.py index 027bd019..1dd832b6 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -70,7 +70,6 @@ def __init__( config_filename: Union[pathlib.Path, str] = "", config_dictionary: dict = {}, clut_filename: Union[pathlib.Path, str] = "", - # clut_file_legacy: bool = False, save_pre_checked_map_data: bool = False, loop_project_filename: str = "", overwrite_loopprojectfile: bool = False, @@ -145,11 +144,7 @@ def __init__( self.fold_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) self.geology_samples = pandas.DataFrame(columns=["ID", "X", "Y", "Z", "featureId"]) - # check if user is using a config file or dictionary, if file, break the project. - if config_filename != "": - logger.error("Config legacy files have been deprecated in v3.2. Please use a dictionary instead.") - raise ValueError("Config legacy files have been deprecated in v3.2. Please use a config dictionary instead. You can use the utils function update_from_legacy_file") - + # Check for alternate config filenames in kwargs if "metadata_filename" in kwargs and config_filename == "": config_filename = kwargs["metadata_filename"] @@ -207,11 +202,17 @@ def __init__( 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 != {}: + self.map_data.config.update_from_dictionary(config_dictionary) if clut_filename != "": self.map_data.set_colour_filename(clut_filename) - #set config dict - self.map_data.config.update_from_dictionary(config_dictionary) + # Load all data (both shape and raster) self.map_data.load_all_map_data() From bc2f2ff1ca14645f935eab810c40da7d11ea21e7 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 13:27:16 +1100 Subject: [PATCH 140/187] fix: allow json files, check for old keys --- map2loop/config.py | 64 ++++++++++++++++++++++++++++++++++++++++++++- map2loop/mapdata.py | 3 ++- map2loop/project.py | 7 +++-- 3 files changed, 68 insertions(+), 6 deletions(-) diff --git a/map2loop/config.py b/map2loop/config.py index 5755957c..48d017d3 100644 --- a/map2loop/config.py +++ b/map2loop/config.py @@ -93,13 +93,19 @@ def to_dict(self): } @beartype.beartype - def update_from_dictionary(self, dictionary: dict, lower: bool = False): + 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 """ + # make sure dictionary doesn't contain legacy keys + self.check_for_legacy_keys(dictionary) + + # make sure it has the minimum requirements + self.validate_config_dictionary(dictionary) + if "structure" in dictionary: self.structure_config.update(dictionary["structure"]) for key in dictionary["structure"].keys(): @@ -108,6 +114,7 @@ def update_from_dictionary(self, dictionary: dict, lower: bool = False): 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(): @@ -208,3 +215,58 @@ def update_from_file( 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) + + @beartype.beartype + def validate_config_dictionary(self, config_dict: dict) -> None: + """ + Validate the structure and keys of the configuration dictionary. + + Args: + config_dict (dict): The config dictionary to validate. + + Raises: + ValueError: If the dictionary does not meet the minimum requirements for ma2p2loop. + """ + required_keys = { + "structure": {"dipdir_column", "dip_column"}, + "geology": {"unitname_column", "alt_unitname_column"}, + } + + for section, keys in required_keys.items(): + 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.") + + 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." + ) + + @beartype.beartype + def check_for_legacy_keys(self, config_dict: dict) -> None: + + 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" + } + + # Recursively search for keys in the dictionary + 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 + 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 + 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) \ No newline at end of file diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 59fcd3b3..c1c8b653 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -267,8 +267,9 @@ def set_config_filename( 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): diff --git a/map2loop/project.py b/map2loop/project.py index 1dd832b6..39aac197 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -105,7 +105,7 @@ def __init__( 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, deprecated): + 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. @@ -201,14 +201,13 @@ def __init__( 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 != {}: self.map_data.config.update_from_dictionary(config_dictionary) + if clut_filename != "": self.map_data.set_colour_filename(clut_filename) From 7b33698bb2432eece0023ecbfd4370fade007015 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 14:07:39 +1100 Subject: [PATCH 141/187] chore: add/fix/update logger outputs --- map2loop/interpolators.py | 13 +++--- map2loop/mapdata.py | 70 ++++++++++++++++++++------------ map2loop/thickness_calculator.py | 19 +++++---- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/map2loop/interpolators.py b/map2loop/interpolators.py index 68e87786..9648348e 100644 --- a/map2loop/interpolators.py +++ b/map2loop/interpolators.py @@ -1,17 +1,18 @@ from abc import ABC, abstractmethod from typing import Any, Union -import logging -from .utils import strike_dip_vector, generate_grid - 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 @@ -348,8 +349,8 @@ def setup_interpolation(self, structure_data: pandas.DataFrame): if not collocated_clusters.empty: # Log a warning if collocated points are detected - logging.warning( - f"Detected {len(collocated_clusters)} collocated point clusters. Aggregating these points." + 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 diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 47562dcc..f00a4f57 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -23,8 +23,8 @@ from .logging import getLogger +logger = getLogger(__name__) -logger = getLogger(__name__) class MapData: @@ -115,7 +115,7 @@ def set_working_projection(self, projection): elif issubclass(type(projection), str): self.working_projection = projection else: - print( + logger.warning( f"Warning: Unknown projection set {projection}. Leaving all map data in original projection\n" ) if self.bounding_box is not None: @@ -418,7 +418,7 @@ def check_filename(self, datatype: Datatype) -> bool: bool: true if the filename is set, false otherwise """ if self.filenames[datatype] is None or self.filenames[datatype] == "": - print(f"Warning: Filename for {str(datatype)} is not set") + logger.warning(f"Warning: Filename for {str(datatype)} is not set") return False return True @@ -715,6 +715,7 @@ def parse_fault_orientations(self) -> tuple: 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 @@ -775,10 +776,11 @@ def parse_structure_map(self) -> tuple: self.raw_data[Datatype.STRUCTURE] is None or type(self.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(self.raw_data[Datatype.STRUCTURE]) < 2: - print( + logger.warning( "Stucture map does not enough orientations to complete calculations (need at least 2), projection may be inconsistent" ) @@ -846,6 +848,7 @@ def parse_geology_map(self) -> tuple: self.raw_data[Datatype.GEOLOGY] is None or type(self.raw_data[Datatype.GEOLOGY]) is not geopandas.GeoDataFrame ): + logger.warning("Geology map is not loaded or valid") return (True, "Geology map is not loaded or valid") # Create new geodataframe @@ -860,6 +863,7 @@ def parse_geology_map(self) -> tuple: else: msg = f"Geology map does not contain unitname_column {config['unitname_column']}" print(msg) + logger.warning(msg) return (True, msg) if config["alt_unitname_column"] in self.raw_data[Datatype.GEOLOGY]: geology["CODE"] = self.raw_data[Datatype.GEOLOGY][config["alt_unitname_column"]].astype( @@ -870,6 +874,7 @@ def parse_geology_map(self) -> tuple: f"Geology map does not contain alt_unitname_column {config['alt_unitname_column']}" ) print(msg) + logger.warning(msg) return (True, msg) # Parse group and supergroup columns @@ -983,6 +988,7 @@ def parse_fault_map(self) -> tuple: self.raw_data[Datatype.FAULT] is None or type(self.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") # Create a new geodataframe @@ -1007,6 +1013,7 @@ def parse_fault_map(self) -> tuple: 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) @@ -1020,21 +1027,20 @@ def parse_fault_map(self) -> tuple: 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 + non_existing_codes = set(ignore_codes) - existing_codes # Issue a warning if there are any non-existing codes - # if non_existing_codes: - # print(f"Warning: {non_existing_codes} set to fault ignore codes are not in the provided data. Skipping") - # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + 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)] - # print(f"The following codes were found and removed: {existing_codes}") - # TODO: these print statements could be in the logger internal statement, pass into the logger file when implemented. + logger.info(f"The following codes were found and removed: {existing_codes}") else: + logger.info("None of the fault ignore codes exist in the original fault data.") pass - # print("None of the fault ignore codes exist in the original fault data.") + # parse dip column if config["dip_column"] in self.raw_data[Datatype.FAULT]: @@ -1146,6 +1152,7 @@ def parse_fold_map(self) -> tuple: 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]: @@ -1187,14 +1194,14 @@ def set_working_projection_on_map_data(self, datatype: Datatype): elif type(self.raw_data[datatype]) is geopandas.GeoDataFrame: if self.data_states[datatype] >= Datastate.LOADED: if self.raw_data[datatype].crs is None: - print( + 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: - print( + logger.warning( f"Type of {datatype.name} map not a GeoDataFrame so cannot change map crs projection" ) @@ -1232,8 +1239,7 @@ def save_raw_map_data( raw_data = self.raw_data[datatype] if raw_data is None: - ## Leaving this print statement in for now, as it will be useful for logging, but repetitive as a warning message - # print(f"No data available for {datatype.name}. Skipping saving to file {filename}.") + logger.info(f"No data available for {datatype.name}. Skipping saving to file {filename}.") return if extension == ".csv": @@ -1242,6 +1248,7 @@ def save_raw_map_data( 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 @@ -1293,6 +1300,7 @@ def update_filename_with_bounding_box(self, filename: str): 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) @@ -1313,6 +1321,7 @@ def update_filename_with_projection(self, filename: str): 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) @@ -1324,7 +1333,7 @@ def calculate_bounding_box_and_projection(self): dict, str: The bounding box and projection of the geology shapefile """ if self.filenames[Datatype.GEOLOGY] is None: - print( + logger.info( "Could not open geology file as none set, no bounding box or projection available" ) return None, None @@ -1341,7 +1350,7 @@ def calculate_bounding_box_and_projection(self): "maxy": bounds[3], }, geology_data.crs except Exception: - print( + logger.error( f"Could not open geology file {temp_geology_filename} so no bounding box or projection found" ) return None, None @@ -1359,9 +1368,9 @@ def export_wkt_format_files(self): # 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: - print("Cannot export geology data as it is not a GeoDataFrame") + logger.warning("Cannot export geology data as it is not a GeoDataFrame") elif self.data_states[Datatype.GEOLOGY] != Datastate.COMPLETE: - print( + logger.warning( f"Cannot export geology data as it only loaded to {self.data_states[Datatype.GEOLOGY].name} status" ) else: @@ -1394,9 +1403,9 @@ def export_wkt_format_files(self): # 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: - print("Cannot export fault data as it is not a GeoDataFrame") + logger.warning("Cannot export fault data as it is not a GeoDataFrame") elif self.data_states[Datatype.FAULT] != Datastate.COMPLETE: - print( + logger.warning( f"Cannot export fault data as it only loaded to {self.data_states[Datatype.FAULT].name} status" ) else: @@ -1424,7 +1433,7 @@ def get_value_from_raster(self, datatype: Datatype, x, y): """ data = self.get_map_data(datatype) if data is None: - print(f"Cannot get value from {datatype.name} data as data is not loaded") + logger.warning(f"Cannot get value from {datatype.name} data as data is not loaded") return None inv_geotransform = gdal.InvGeoTransform(data.GetGeoTransform()) @@ -1484,7 +1493,7 @@ def get_value_from_raster_df(self, datatype: Datatype, df: pandas.DataFrame): return df data = self.get_map_data(datatype) if data is None: - print("Cannot get value from data as data is not loaded") + logger.warning("Cannot get value from data as data is not loaded") return None inv_geotransform = gdal.InvGeoTransform(data.GetGeoTransform()) @@ -1501,7 +1510,7 @@ def extract_all_contacts(self, save_contacts=True): """ Extract the contacts between units in the geology GeoDataFrame """ - # print('extracting contacts') + logger.info("Extracting contacts") geology = self.get_map_data(Datatype.GEOLOGY).copy() geology = geology.dissolve(by="UNITNAME", as_index=False) # Remove intrusions @@ -1548,6 +1557,8 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) stratigraphic_column (list): The stratigraphic column to use """ + logger.info("Extracting basal contacts") + units = stratigraphic_column basal_contacts = self.contacts.copy() @@ -1559,6 +1570,11 @@ def extract_basal_contacts(self, stratigraphic_column: list, save_contacts=True) .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) @@ -1619,13 +1635,13 @@ def colour_units( try: colour_lookup = pandas.read_csv(self.colour_filename, sep=",") except FileNotFoundError: - print( + 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: - print("\nNo colour configuration file found. Assigning random colors to units") + 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" @@ -1648,7 +1664,7 @@ def colour_units( ] = generate_random_hex_colors(int(stratigraphic_units["colour"].isna().sum())) stratigraphic_units.drop(columns=["UNITNAME", "colour_old"], inplace=True) else: - print( + logger.warning( f"Colour Lookup file {self.colour_filename} does not contain 'UNITNAME' or 'colour' field" ) return stratigraphic_units diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 4d383f21..3c32495a 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -10,6 +10,9 @@ from .interpolators import DipDipDirectionInterpolator from .mapdata import MapData +from .logging import getLogger +logger = getLogger(__name__) + # external imports from abc import ABC, abstractmethod import scipy.interpolate @@ -76,7 +79,7 @@ def compute( """ if len(stratigraphic_order) < 3: - print( + logger.warning( f"Cannot make any thickness calculations with only {len(stratigraphic_order)} units" ) return units @@ -133,7 +136,7 @@ def compute( ) if len(stratigraphic_order) < 3: - print( + logger.warning( f"ThicknessCalculatorAlpha: Cannot make any thickness calculations with only {len(stratigraphic_order)} units" ) return thicknesses @@ -153,12 +156,12 @@ def compute( if contact1 is not None and contact2 is not None: distance = contact1.distance(contact2) else: - print( + logger.warning( f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" ) distance = no_distance else: - print( + logger.warning( f"ThicknessCalculatorAlpha: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]} \n" ) @@ -366,7 +369,7 @@ def compute( thicknesses.loc[idx, "ThicknessStdDev"] = std_dev else: - print( + logger.warning( f"Thickness Calculator InterpolatedStructure: Cannot calculate thickness between {stratigraphic_order[i]} and {stratigraphic_order[i + 1]}\n" ) @@ -454,7 +457,7 @@ def compute( # 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 - print( + 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']) @@ -489,7 +492,7 @@ def compute( # 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: - print( + logger.info( f"There are structural measurements in unit - {litho_in} - that are not in the geology shapefile. Skipping this structural measurement" ) continue @@ -619,7 +622,7 @@ def compute( ): idx = stratigraphic_order.index(unit) # throw warning to user - print( + logger.warning( 'Thickness Calculator StructuralPoint: Cannot calculate thickness between', unit, "and ", From 1c55458e9951751480f3329121aaaa44546df326 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 14:11:57 +1100 Subject: [PATCH 142/187] chore: more logging --- map2loop/mapdata.py | 1 + 1 file changed, 1 insertion(+) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index f00a4f57..cfdd61e2 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -999,6 +999,7 @@ def parse_fault_map(self) -> tuple: # 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 ) From 02e3003fc4804db2850ef5ac0ace26f19810aba8 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 14:49:24 +1100 Subject: [PATCH 143/187] chore: update tests to not rely on warnings --- .../test_set_get_working_projection.py | 45 ++++++------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/tests/mapdata/test_set_get_working_projection.py b/tests/mapdata/test_set_get_working_projection.py index 47a078d5..a0c937cb 100644 --- a/tests/mapdata/test_set_get_working_projection.py +++ b/tests/mapdata/test_set_get_working_projection.py @@ -1,5 +1,4 @@ import pytest - from map2loop.mapdata import MapData @@ -10,24 +9,9 @@ ("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, - "Warning: Unknown projection set None. Leaving all map data in original projection\n", - ), # error case with None - ( - [], - None, - None, - "Warning: Unknown projection set []. Leaving all map data in original projection\n", - ), # error case with list - ( - {}, - None, - None, - "Warning: Unknown projection set {}. Leaving all map data in original projection\n", - ), # error case with dict + (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", @@ -39,22 +23,21 @@ "dict_projection", ], ) -def test_set_working_projection( - projection, expected_projection, bounding_box, expected_warning, capsys -): - +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 ( - map_data.working_projection == expected_projection - ), "Map.data set_working_projection() not attributing the correct 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: - captured = capsys.readouterr() - assert expected_warning in captured.out - else: - captured = capsys.readouterr() - assert captured.out == "" + assert map_data.working_projection is None, ( + "Expected working_projection to remain None when an invalid projection is provided" + ) From f2576ff10bca91844d6bfd72a391542ae6d8c630 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 14:50:09 +1100 Subject: [PATCH 144/187] chore: proper string formatting --- map2loop/mapdata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index cfdd61e2..69d44615 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -120,8 +120,8 @@ def set_working_projection(self, projection): ) if self.bounding_box is not None: self.recreate_bounding_box_str() - logger.info("Setting working projection to {self.working_projection}") - + logger.info(f"Setting working projection to {self.working_projection}") + def get_working_projection(self): """ Get the working projection From 4ce6d7d064218c9ac60ee4c4504aeb3bf5a0429f Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 15:11:07 +1100 Subject: [PATCH 145/187] fix: small fixes for deprecation/linting warnings in test sessions --- map2loop/__init__.py | 39 +++++-------------- .../geodata_files/load_map2loop_data.py | 16 +++----- map2loop/mapdata.py | 1 + map2loop/project.py | 3 +- map2loop/utils.py | 2 +- 5 files changed, 19 insertions(+), 42 deletions(-) diff --git a/map2loop/__init__.py b/map2loop/__init__.py index 944ee7e1..17428522 100644 --- a/map2loop/__init__.py +++ b/map2loop/__init__.py @@ -14,7 +14,7 @@ ) # used instead of importlib.version because adheres to PEP 440 using pkg_version.parse import pathlib import re -import pkg_resources # import get_distribution, DistributionNotFound # Use pkg_resources for version checking +from importlib.metadata import version as get_installed_version, PackageNotFoundError class DependencyChecker: @@ -29,13 +29,11 @@ class DependencyChecker: ''' 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() - ## 1) get required version of each dependency from dependencies.txt def get_required_version(self): ''' Get the required package version for each package from dependencies.txt; @@ -45,25 +43,21 @@ def get_required_version(self): ''' try: with self.dependency_file.open("r") as file: - # search for the dependency line in dependencies.txt 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) # get the version if found + return match.group(1) elif line.strip() == self.package_name: - # dependency listed without a version return None - # if dependency line not found in dependencies.txt (shouldn't happen, but just in case) print(f"{self.package_name} version not found in {self.dependency_file}.") - except FileNotFoundError: # in case dependencies.txt is not found (shouldn't happen) + except FileNotFoundError: warnings.warn( f"{self.dependency_file} not found. Unable to check {self.package_name} version compatibility.", UserWarning, ) return None - ## 2) Check the installed version of the dependency and compare with required version def get_installed_version(self): ''' Get the installed version of the package. @@ -72,30 +66,23 @@ def get_installed_version(self): str: The installed version of the package. ''' try: - # Get installed version of the package using pkg_resources - return pkg_resources.get_distribution(self.package_name).version - except pkg_resources.DistributionNotFound: - # Raise ImportError if package is not installed + # 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}." ) - ## 3) Compare the installed version of the dependency with the required version, if applicable def check_version(self): ''' - Checks if the installed version of the package matches the required version uin the dependencies.txt file. - + Checks if the installed version of the package matches the required version in the dependencies.txt file. ''' if self.required_version is None: - # No required version specified, only check if installed if self.installed_version is None: raise ImportError( f"{self.package_name} is not installed. Please install {self.package_name} before using map2loop." ) - # else: - # print(f"{self.package_name} is installed.") else: - # Compare versions if required version is specified if self.installed_version is None or pkg_version.parse( self.installed_version ) != pkg_version.parse(self.required_version): @@ -104,33 +91,27 @@ def check_version(self): f"Please install the correct version of {self.package_name}." ) - # else: - # print(f"{self.package_name} version is compatible.") - -# check all dependencies & versions in dependencies.txt 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() - # skip the gdal line if line.startswith("gdal"): continue if line: - # separate package name and version (if available) if "==" in line: package_name, _ = line.split("==") else: package_name = line - # check version for each package checker = DependencyChecker(package_name, dependency_file=dependency_file) checker.check_version() except FileNotFoundError: - ImportError( - f"{dependency_file} not found. No dependencies checked for map2loop", UserWarning + warnings.warn( + f"{dependency_file} not found. No dependencies checked for map2loop.", + UserWarning ) diff --git a/map2loop/_datasets/geodata_files/load_map2loop_data.py b/map2loop/_datasets/geodata_files/load_map2loop_data.py index 2e1d1f51..d625af9b 100644 --- a/map2loop/_datasets/geodata_files/load_map2loop_data.py +++ b/map2loop/_datasets/geodata_files/load_map2loop_data.py @@ -1,7 +1,7 @@ import geopandas -import pkg_resources +from importlib.resources import files from osgeo import gdal - +gdal.UseExceptions() def load_hamersley_geology(): """ @@ -14,9 +14,7 @@ def load_hamersley_geology(): Returns: geopandas.GeoDataFrame: The geology data """ - stream = pkg_resources.resource_filename( - "map2loop", "/_datasets/geodata_files/hamersley/geology.geojson" - ) + stream = files("map2loop._datasets.geodata_files.hamersley").joinpath("geology.geojson") return geopandas.read_file(stream) @@ -32,9 +30,7 @@ def load_hamersley_structure(): geopandas.GeoDataFrame: The structure data """ - path = pkg_resources.resource_filename( - "map2loop", "/_datasets/geodata_files/hamersley/structure.geojson" - ) + path = files("map2loop._datasets.geodata_files.hamersley").joinpath("structure.geojson") return geopandas.read_file(path) @@ -45,7 +41,5 @@ def load_hamersley_dtm(): Returns: gdal.Dataset: The DTM data """ - path = pkg_resources.resource_filename( - "map2loop", "/_datasets/geodata_files/hamersley/dtm_rp.tif" - ) + path = files("map2loop._datasets.geodata_files.hamersley").joinpath("dtm_rp.tif") return gdal.Open(path) diff --git a/map2loop/mapdata.py b/map2loop/mapdata.py index 69d44615..df5933ac 100644 --- a/map2loop/mapdata.py +++ b/map2loop/mapdata.py @@ -11,6 +11,7 @@ import pathlib import shapely from osgeo import gdal, osr +gdal.UseExceptions() from owslib.wcs import WebCoverageService import urllib from gzip import GzipFile diff --git a/map2loop/project.py b/map2loop/project.py index 34359059..58f6b5af 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -14,10 +14,11 @@ # external imports import LoopProjectFile as LPF -from typing import Union, List from osgeo import gdal +gdal.UseExceptions() import geopandas import beartype +from beartype.typing import Union, List import pathlib import numpy import pandas diff --git a/map2loop/utils.py b/map2loop/utils.py index e00c0f91..f997a738 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -375,7 +375,7 @@ def hex_to_rgb(hex_color: str) -> tuple: @beartype.beartype def calculate_minimum_fault_length( - bbox: Dict[str, Union[int, float]], area_percentage: float + bbox: dict[str, int | float], area_percentage: float ) -> float: """ From add4692fdb3658fbb11d1f3083ec78e76d8982da Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 5 Dec 2024 15:30:01 +1100 Subject: [PATCH 146/187] chore: update actions from deprecation --- .github/workflows/CD.yml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index b29296b4..9f4a731a 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -40,7 +40,7 @@ jobs: pypi-build-sdist: name: Build SDist - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -58,7 +58,7 @@ jobs: pypi-test-sdist: name: Test sdist needs: pypi-build-sdist - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - name: Install GDAL run: | @@ -90,7 +90,7 @@ jobs: fail-fast: false matrix: os: - - ubuntu-latest + - ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -118,10 +118,10 @@ jobs: fail-fast: false matrix: os: - - ubuntu-latest + - ubuntu-24.04 include: - - os: "ubuntu-latest" - artifact: map2loop-wheels-ubuntu-latest + - os: "ubuntu-24.04" + artifact: map2loop-wheels-ubuntu-24.04 steps: - name: Checkout @@ -171,7 +171,7 @@ jobs: fail-fast: false matrix: os: - - ubuntu-latest + - ubuntu-24.04 # - macos-latest # currently not supported because needs libgcc>= 14 and not available for macos-latest (version available is 4.x.x) - windows-latest python-version: ["3.9", "3.10", "3.11", "3.12"] @@ -217,7 +217,7 @@ jobs: release-please: needs: [pypi-test-wheels, conda-build] - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: github.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 @@ -232,7 +232,7 @@ jobs: #if a release is created then run the deploy scripts for github.io, conda, pypi and docker documentation-test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 @@ -247,7 +247,7 @@ jobs: path: docs/build/html documentation-deploy: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 needs: [release-please, documentation-test] if: ${{ needs.release-please.outputs.release_created }} && github.ref == 'refs/heads/master' @@ -274,7 +274,7 @@ jobs: fail-fast: false matrix: os: - - ubuntu-latest + - ubuntu-24.04 # - macos-latest - windows-latest python-version: ["3.9", "3.10", "3.11", "3.12"] @@ -300,7 +300,7 @@ jobs: needs: [pypi-test-wheels] if: github.ref == 'refs/heads/master' runs-on: - - ubuntu-latest + - ubuntu-24.04 # https://github.com/actions/runner-images/issues/10636 # if: ${{ needs.release-please.outputs.release_created }} permissions: # IMPORTANT: this permission is mandatory for trusted publishing From 227e59a5f51360bdef54b0f001aae69df5428497 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 9 Dec 2024 16:41:26 +1100 Subject: [PATCH 147/187] fix: issue 155 (#158) * fix: simple fix for #155 * fix: decimation factor allows floats * fix: decimation int --- map2loop/project.py | 15 +++++++++++++++ map2loop/sampler.py | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/map2loop/project.py b/map2loop/project.py index 58f6b5af..c7a1f2db 100644 --- a/map2loop/project.py +++ b/map2loop/project.py @@ -357,6 +357,21 @@ def set_sampler(self, datatype: Datatype, sampler: Sampler): 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 diff --git a/map2loop/sampler.py b/map2loop/sampler.py index 01600566..77950b13 100644 --- a/map2loop/sampler.py +++ b/map2loop/sampler.py @@ -9,7 +9,7 @@ import pandas import shapely import numpy -from typing import Optional +from typing import Optional, Union class Sampler(ABC): From 685aa00e1bddda0121ab74dd6a02f59c06a17826 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 09:23:37 +1100 Subject: [PATCH 148/187] fix: remove print statement left behind --- map2loop/sorter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/sorter.py b/map2loop/sorter.py index 42da4617..da4dab76 100644 --- a/map2loop/sorter.py +++ b/map2loop/sorter.py @@ -158,7 +158,7 @@ def sort( logger.info("Calling age based sorter") sorted_units = units.copy() if "minAge" in units.columns and "maxAge" in units.columns: - print(sorted_units["minAge"], sorted_units["maxAge"]) + # print(sorted_units["minAge"], sorted_units["maxAge"]) sorted_units["meanAge"] = sorted_units.apply( lambda row: (row["minAge"] + row["maxAge"]) / 2.0, axis=1 ) From 636a140da7433229cd51c1bb5c19a49de1f78963 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 09:28:14 +1100 Subject: [PATCH 149/187] chore: update docstrings --- map2loop/utils.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/map2loop/utils.py b/map2loop/utils.py index 62dfc05c..fadeeeaf 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -422,6 +422,7 @@ def preprocess_hjson_to_json(hjson_content): hjson_content = re.sub(r'\s+', ' ', hjson_content.strip()) return hjson_content + @beartype.beartype def read_hjson_with_json(file_path: str) -> dict: try: @@ -439,7 +440,7 @@ def read_hjson_with_json(file_path: str) -> dict: 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, @@ -448,7 +449,16 @@ def update_from_legacy_file( """ Update the config dictionary from the provided old version dictionary Args: - file_map (dict): The old version dictionary to update from + 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 From e64cc773a982c1b11c719402c4d5dc7057f7f098 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 09:41:58 +1100 Subject: [PATCH 150/187] fix: gdal: test if conda issue --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 9f4a731a..abcb2b26 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -185,6 +185,7 @@ jobs: - name: Installing dependencies shell: bash -l {0} run: | + conda update conda -y conda install -c conda-forge conda-build anaconda-client conda-verify -y conda install -c loop3d -c conda-forge --file dependencies.txt -y pip uninstall loopprojectfile -y From 99162cdf23c469fd077eaec0850e5dd53f89c2d4 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 09:44:17 +1100 Subject: [PATCH 151/187] fix: revert --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index abcb2b26..9d31d919 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -185,7 +185,7 @@ jobs: - name: Installing dependencies shell: bash -l {0} run: | - conda update conda -y + conda install -c conda-forge conda-build anaconda-client conda-verify -y conda install -c loop3d -c conda-forge --file dependencies.txt -y pip uninstall loopprojectfile -y From cd2985606530930fa74e371003efe6d44bf4f446 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 10:14:10 +1100 Subject: [PATCH 152/187] remove gdal pin?? --- dependencies.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.txt b/dependencies.txt index 4b36eb66..e75001e7 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -7,6 +7,6 @@ owslib map2model loopprojectfile==0.1.4 beartype -gdal==3.8.4 +gdal pytest scikit-learn From 7bf14b18abb38278544b9677f8f620fefaabee3d Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 13:30:04 +1100 Subject: [PATCH 153/187] fix: keep gdal pin for now --- dependencies.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.txt b/dependencies.txt index e75001e7..4b36eb66 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -7,6 +7,6 @@ owslib map2model loopprojectfile==0.1.4 beartype -gdal +gdal==3.8.4 pytest scikit-learn From 95e94c612085008bae0b621f4aac20dd3fe66a8d Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Thu, 12 Dec 2024 15:45:17 +1100 Subject: [PATCH 154/187] fix: add debug info to thickness calculators (#161) * fix: initial commit * fix: add debug info and warning for bad calculations * fix: add line length control to thickness calculators * fix: refactor to avoid repetitive code * fix: typo * fix: remove list comprehension - wky * fix list to df * fix: revert to lst comprehension * fix: make line length attribute of the TC class * fix: typos * fix: syntax * fix: add location tracking * fix: init commit to remove lst comprehension --- map2loop/thickness_calculator.py | 100 ++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 16 deletions(-) diff --git a/map2loop/thickness_calculator.py b/map2loop/thickness_calculator.py index 3c32495a..eb8a2a67 100644 --- a/map2loop/thickness_calculator.py +++ b/map2loop/thickness_calculator.py @@ -33,11 +33,12 @@ class ThicknessCalculator(ABC): ABC (ABC): Derived from Abstract Base Class """ - def __init__(self): + def __init__(self, max_line_length: float = None): """ Initialiser of for ThicknessCalculator """ self.thickness_calculator_label = "ThicknessCalculatorBaseClass" + self.max_line_length = max_line_length def type(self): """ @@ -84,7 +85,17 @@ def compute( ) 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." + ) + class ThicknessCalculatorAlpha(ThicknessCalculator): """ ThicknessCalculator class which estimates unit thickness based on units, basal_contacts and stratigraphic order @@ -176,6 +187,8 @@ def compute( val = min(distance, thicknesses.at[idx, "ThicknessMean"]) thicknesses.loc[idx, "ThicknessMean"] = val + self._check_thickness_percentage_calculations(thicknesses) + return thicknesses @@ -193,12 +206,14 @@ class InterpolatedStructure(ThicknessCalculator): -> pandas.DataFrame: Calculates a thickness map for the overall map area. """ - def __init__(self): + def __init__(self, max_line_length: float = None): """ Initialiser for interpolated structure version of the thickness calculator """ + super().__init__(max_line_length) self.thickness_calculator_label = "InterpolatedStructure" - self.lines = [] + self.lines = None + @beartype.beartype def compute( @@ -297,7 +312,11 @@ def compute( 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 @@ -319,11 +338,18 @@ def compute( 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) - self.lines.append(short_line) + _lines.append(short_line[0]) + + # check if the short line is + if self.max_line_length is not None and short_line.length > self.max_line_length: + continue + # extract the end points of the shortest line p1 = numpy.zeros(3) p1[0] = numpy.asarray(short_line[0].coords[0][0]) @@ -336,18 +362,27 @@ def compute( p2[1] = numpy.asarray(short_line[0].coords[-1][1]) # get the elevation Z of the end point p2 p2[2] = map_data.get_value_from_raster(Datatype.DTM, p2[0], p2[1]) - # get the elevation Z of the end point p2 - p2[2] = map_data.get_value_from_raster(Datatype.DTM, 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 indices = shapely.dwithin(short_line, interp_points, line_length * 0.25) # get the dip of the points that are within - # 10% of the length of the shortest line _dip = numpy.deg2rad(dip[indices]) - # get the end points of the shortest line - # calculate the true thickness t = L . sin dip + _dips.append(_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 @@ -372,10 +407,22 @@ def compute( 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 + combined_location_tracking = pandas.concat(_location_tracking, ignore_index=True) + + # Save the combined DataFrame as an attribute of the class + self.location_tracking = combined_location_tracking + + # 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. @@ -390,10 +437,12 @@ class StructuralPoint(ThicknessCalculator): ''' - def __init__(self): + def __init__(self, max_line_length: float = None): + super().__init__(max_line_length) self.thickness_calculator_label = "StructuralPoint" - self.line_length = 10000 self.strike_allowance = 30 + self.lines = None + @beartype.beartype def compute( @@ -474,6 +523,8 @@ def compute( # 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)): @@ -505,7 +556,9 @@ def compute( ) # draw orthogonal line to the strike (default value 10Km), and clip it by the bounding box of the lithology - B = calculate_endpoints(measurement_pt, strike, self.line_length, bbox_poly) + if self.max_line_length is None: + self.max_line_length = 10000 + B = calculate_endpoints(measurement_pt, strike, self.max_line_length, bbox_poly) b = geopandas.GeoDataFrame({'geometry': [B]}).set_crs(basal_contacts.crs) # find all intersections @@ -577,15 +630,28 @@ def compute( 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() @@ -640,4 +706,6 @@ def compute( 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 From 8401aee2a911e4d290d7acf2226a13bbbc0e4c57 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 13 Dec 2024 08:14:12 +1100 Subject: [PATCH 155/187] chore: empty commit to trigger ci run --- docs/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml index 8e96b82d..3ec795a5 100644 --- a/docs/docker-compose.yml +++ b/docs/docker-compose.yml @@ -7,4 +7,5 @@ services: - ../:/map2loop - ../../LoopStructural:/LoopStructural tty: true + # command: sh map2loop/docs/build_docs.sh \ No newline at end of file From af7bdf2823a93e8bb31a054246161770c1c40006 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 13 Dec 2024 08:28:43 +1100 Subject: [PATCH 156/187] chore: update typing to avoid deprecation --- map2loop/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/utils.py b/map2loop/utils.py index fadeeeaf..00e8fa57 100644 --- a/map2loop/utils.py +++ b/map2loop/utils.py @@ -3,7 +3,7 @@ import shapely import geopandas import beartype -from typing import Union, Optional, Dict +from beartype.typing import Union, Optional, Dict import pandas import re import json From 7ab55ffc436c568e7d7ad7700fb1c944dd9894fe Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 13 Dec 2024 08:34:19 +1100 Subject: [PATCH 157/187] fix: update ubuntu --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 9d31d919..972cd72c 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -13,7 +13,7 @@ permissions: jobs: linting: name: Linting - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - name: Install dependencies From 6a3b081b30ebb93f552ad454cffb7c2da3daa39f Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Fri, 13 Dec 2024 08:44:41 +1100 Subject: [PATCH 158/187] ci: small updates --- .github/workflows/CD.yml | 76 +++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 972cd72c..8d8dd00c 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -232,44 +232,11 @@ jobs: release_created: ${{ steps.release.outputs.release_created }} #if a release is created then run the deploy scripts for github.io, conda, pypi and docker - documentation-test: - runs-on: ubuntu-24.04 - - steps: - - uses: actions/checkout@v4 - - run: | - cp CHANGELOG.md docs/source/CHANGELOG.md - docker build . -t=docs -f docs/Dockerfile - docker run -v $(pwd):/map2loop docs bash map2loop/docs/build_docs.sh - - name: upload artifacts - uses: actions/upload-artifact@v4 - with: - name: docs - path: docs/build/html - documentation-deploy: - runs-on: ubuntu-24.04 - needs: [release-please, documentation-test] - if: ${{ needs.release-please.outputs.release_created }} && github.ref == 'refs/heads/master' - - steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - with: - name: docs - path: docs - - name: ls - run: | - ls -l docs - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages # The branch the action should deploy to. - folder: docs # The folder the action should deploy. conda-upload: - needs: [conda-build] - if: github.ref == 'refs/heads/master' + needs: [release-please, conda-build] + runs-on: ${{matrix.os}} strategy: fail-fast: false @@ -279,7 +246,7 @@ jobs: # - macos-latest - windows-latest python-version: ["3.9", "3.10", "3.11", "3.12"] - # if: ${{ needs.release-please.outputs.release_created }} + if: ${{ needs.release-please.outputs.release_created }} steps: - uses: actions/download-artifact@v4 with: @@ -301,7 +268,7 @@ jobs: needs: [pypi-test-wheels] if: github.ref == 'refs/heads/master' runs-on: - - ubuntu-24.04 # https://github.com/actions/runner-images/issues/10636 + - ubuntu-24.04 # if: ${{ needs.release-please.outputs.release_created }} permissions: # IMPORTANT: this permission is mandatory for trusted publishing @@ -315,3 +282,38 @@ jobs: with: skip-existing: true verbose: true + + documentation-test: + runs-on: ubuntu-24.04 + + steps: + - uses: actions/checkout@v4 + - run: | + cp CHANGELOG.md docs/source/CHANGELOG.md + docker build . -t=docs -f docs/Dockerfile + docker run -v $(pwd):/map2loop docs bash map2loop/docs/build_docs.sh + - name: upload artifacts + uses: actions/upload-artifact@v4 + with: + name: docs + path: docs/build/html + + documentation-deploy: + runs-on: ubuntu-24.04 + needs: [release-please, documentation-test] + if: ${{ needs.release-please.outputs.release_created }} && github.ref == 'refs/heads/master' + + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: docs + path: docs + - name: ls + run: | + ls -l docs + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages # The branch the action should deploy to. + folder: docs # The folder the action should deploy. \ No newline at end of file From 0423eada8dad692a2fdc3ae6146e1c672b006978 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:03:07 +1100 Subject: [PATCH 159/187] fix: dependencies updated --- dependencies.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.txt b/dependencies.txt index 4b36eb66..6648153e 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -5,7 +5,7 @@ shapely networkx owslib map2model -loopprojectfile==0.1.4 +loopprojectfile==0.2.1 beartype gdal==3.8.4 pytest From 783a0e8e67bb4140f2d2ba9d168dee19cc7bf42b Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:13:41 +1100 Subject: [PATCH 160/187] fix: update LPF dependency --- .github/workflows/CD.yml | 5 ----- dependencies.txt | 2 +- docs/Dockerfile | 5 ----- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 8d8dd00c..dd75ab22 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -78,7 +78,6 @@ jobs: pip install --upgrade pip pip install numpy==1.26.4 pip install geopandas shapely networkx owslib map2model beartype gdal pytest scikit-learn - pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache dist/*.tar.gz pip list @@ -153,8 +152,6 @@ jobs: pip install --upgrade pip pip install numpy==1.26.4 pip install -r dependencies.txt - pip uninstall loopprojectfile -y - pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses pip install --no-cache --pre --no-index --find-links dist map2loop pip list @@ -188,8 +185,6 @@ jobs: conda install -c conda-forge conda-build anaconda-client conda-verify -y conda install -c loop3d -c conda-forge --file dependencies.txt -y - pip uninstall loopprojectfile -y - pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses conda install pytest -y - name: Building and install diff --git a/dependencies.txt b/dependencies.txt index 6648153e..2c281806 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -5,7 +5,7 @@ shapely networkx owslib map2model -loopprojectfile==0.2.1 +loopprojectfile==v0.2.1 beartype gdal==3.8.4 pytest diff --git a/docs/Dockerfile b/docs/Dockerfile index d550cac5..ad79afa9 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -25,11 +25,6 @@ COPY dependencies.txt dependenciesdocs.txt RUN cat ./docs/requirements.txt >> dependenciesdocs.txt RUN conda install -c conda-forge -c loop3d --file dependenciesdocs.txt -y -#temporary code to align with fix_thicknesses branch -RUN pip uninstall loopprojectfile -y -RUN pip install git+https://github.com/loop3d/loopprojectfile.git@fix_thicknesses -#### - RUN pip install . WORKDIR / From 972905c92b6fe64c5de1a1ee742a52f128eca3c2 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:23:27 +1100 Subject: [PATCH 161/187] fix: update linting and release-please --- .github/workflows/CD.yml | 314 ---------------------------- .github/workflows/documentation.yml | 38 ---- .github/workflows/publish_conda.yml | 65 ++++++ 3 files changed, 65 insertions(+), 352 deletions(-) delete mode 100644 .github/workflows/CD.yml delete mode 100644 .github/workflows/documentation.yml create mode 100644 .github/workflows/publish_conda.yml diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml deleted file mode 100644 index dd75ab22..00000000 --- a/.github/workflows/CD.yml +++ /dev/null @@ -1,314 +0,0 @@ -# for this workflow to work, need to release LPF=1.0.5, map2model=1.0.1, - -name: release-please - -on: [push, pull_request] - - - -permissions: - contents: write - pull-requests: write - -jobs: - linting: - name: Linting - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install black ruff - - name: Autoformat with black - run: | - black . - - name: Lint with ruff - run: | - ruff check . --fix - - name: Check for local changes - run: | - if [ -n "$(git status --porcelain)" ]; then - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add . - git commit -m "style: style fixes by ruff and autoformatting by black" - fi - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "style: style fixes by ruff and autoformatting by black" - - pypi-build-sdist: - name: Build SDist - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Build SDist - run: | - pip install build - python -m build - - - uses: actions/upload-artifact@v4 - with: - name: map2loop-dist - path: dist/*.tar.gz - compression-level: 0 - - pypi-test-sdist: - name: Test sdist - needs: pypi-build-sdist - runs-on: ubuntu-24.04 - steps: - - name: Install GDAL - run: | - sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable - sudo apt-get update - sudo apt-get install -y libgdal-dev gdal-bin - - - name: Download sdist from artifacts - uses: actions/download-artifact@v4 - with: - name: map2loop-dist - path: dist - - - name: Build Map2Loop from sdist and install test dependencies - shell: bash - run: | - pip install --upgrade pip - pip install numpy==1.26.4 - pip install geopandas shapely networkx owslib map2model beartype gdal pytest scikit-learn - pip install --no-cache dist/*.tar.gz - pip list - - pypi-build-wheels: - needs: pypi-test-sdist - name: Build Wheels - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: 3.x - - - name: Build Wheels - run: | - pip install build - python -m build --wheel - - - uses: actions/upload-artifact@v4 - with: - name: map2loop-wheels-${{ matrix.os }} - path: dist/*.whl - compression-level: 0 - - pypi-test-wheels: - name: Test wheels on ${{ matrix.os }} - needs: pypi-build-wheels - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-24.04 - include: - - os: "ubuntu-24.04" - artifact: map2loop-wheels-ubuntu-24.04 - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - - - name: Install GDAL - Linux - if: runner.os == 'Linux' - run: | - sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable - sudo apt-get update - sudo apt-get install -y libgdal-dev gdal-bin - - - name: Upgrade pip - run: | - python -m pip install --upgrade pip - - - name: Download wheels from artifacts - uses: actions/download-artifact@v4 - with: - name: ${{ matrix.artifact }} - path: dist - - - name: Install dependencies and Map2Loop wheel - shell: bash - run: | - pip install --upgrade pip - pip install numpy==1.26.4 - pip install -r dependencies.txt - pip install --no-cache --pre --no-index --find-links dist map2loop - pip list - - - name: Testing - shell: bash -l {0} - run: | - pytest - - conda-build: - - name: Conda Build and Deploy ${{ matrix.os }} - Python Version-${{ matrix.python-version }} - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-24.04 - # - macos-latest # currently not supported because needs libgcc>= 14 and not available for macos-latest (version available is 4.x.x) - - windows-latest - python-version: ["3.9", "3.10", "3.11", "3.12"] - steps: - - uses: actions/checkout@v4 - - uses: conda-incubator/setup-miniconda@v3 - with: - miniforge-version: latest - activate-environment: anaconda-client-env. - - - name: Installing dependencies - shell: bash -l {0} - run: | - - conda install -c conda-forge conda-build anaconda-client conda-verify -y - conda install -c loop3d -c conda-forge --file dependencies.txt -y - conda install pytest -y - - - name: Building and install - shell: bash -l {0} - run: | - pip install . - - - name: Testing - shell: bash -l {0} - run: | - pytest - - - name: Conda Build - env: - ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_TOKEN }} - path: ~/conda_pkgs_dir - shell: bash -l {0} - run: | - conda build -c anaconda -c conda-forge -c loop3d --output-folder conda conda --python ${{ matrix.python-version }} - - - name: upload artifacts - uses: actions/upload-artifact@v4 - with: - name: map2loop-conda-${{ matrix.os }}-${{ matrix.python-version }} - path: conda - - release-please: - needs: [pypi-test-wheels, conda-build] - runs-on: ubuntu-24.04 - if: github.ref == 'refs/heads/master' - steps: - - uses: actions/checkout@v4 - - uses: googleapis/release-please-action@v4 - id: release - with: - release-type: "python" - config-file: "release-please-config.json" - manifest-file: ".release-please-manifest.json" - outputs: - release_created: ${{ steps.release.outputs.release_created }} - #if a release is created then run the deploy scripts for github.io, conda, pypi and docker - - - - conda-upload: - needs: [release-please, conda-build] - - runs-on: ${{matrix.os}} - strategy: - fail-fast: false - matrix: - os: - - ubuntu-24.04 - # - macos-latest - - windows-latest - python-version: ["3.9", "3.10", "3.11", "3.12"] - if: ${{ needs.release-please.outputs.release_created }} - steps: - - uses: actions/download-artifact@v4 - with: - name: map2loop-conda-${{ matrix.os }}-${{ matrix.python-version }} - path: conda - - uses: conda-incubator/setup-miniconda@v3 - - name: upload all files to conda-forge - shell: bash -l {0} - env: - ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_TOKEN }} - with: - skip-existing: true - verbose: true - run: | - conda install -c anaconda anaconda-client -y - anaconda upload --label main conda/*/*.tar.bz2 - - pypi-upload: - needs: [pypi-test-wheels] - if: github.ref == 'refs/heads/master' - runs-on: - - ubuntu-24.04 - # if: ${{ needs.release-please.outputs.release_created }} - permissions: - # IMPORTANT: this permission is mandatory for trusted publishing - id-token: write - steps: - - uses: actions/download-artifact@v4 - with: - name: map2loop-dist - path: dist/ - - uses: pypa/gh-action-pypi-publish@release/v1 - with: - skip-existing: true - verbose: true - - documentation-test: - runs-on: ubuntu-24.04 - - steps: - - uses: actions/checkout@v4 - - run: | - cp CHANGELOG.md docs/source/CHANGELOG.md - docker build . -t=docs -f docs/Dockerfile - docker run -v $(pwd):/map2loop docs bash map2loop/docs/build_docs.sh - - name: upload artifacts - uses: actions/upload-artifact@v4 - with: - name: docs - path: docs/build/html - - documentation-deploy: - runs-on: ubuntu-24.04 - needs: [release-please, documentation-test] - if: ${{ needs.release-please.outputs.release_created }} && github.ref == 'refs/heads/master' - - steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - with: - name: docs - path: docs - - name: ls - run: | - ls -l docs - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages # The branch the action should deploy to. - folder: docs # The folder the action should deploy. \ No newline at end of file diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml deleted file mode 100644 index 0c1ca3bc..00000000 --- a/.github/workflows/documentation.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Build and Deploy Documentation - -on: - workflow_dispatch: - - - -jobs: - documentation-test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - run: | - cp CHANGELOG.md docs/source/CHANGELOG.md - docker build . -t=docs -f docs/Dockerfile - docker run -v $(pwd):/map2loop docs bash map2loop/docs/build_docs.sh - - name: upload artifacts - uses: actions/upload-artifact@v4 - with: - name: docs - path: docs/build/html - documentation-deploy: - runs-on: ubuntu-latest - if: GitHub.ref == 'refs/heads/master' - steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 - with: - name: docs - path: docs - - name: ls - run: | - ls -l docs - - name: Deploy 🚀 - uses: JamesIves/github-pages-deploy-action@v4 - with: - branch: gh-pages # The branch the action should deploy to. - folder: docs # The folder the action should deploy. diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml new file mode 100644 index 00000000..247a74d0 --- /dev/null +++ b/.github/workflows/publish_conda.yml @@ -0,0 +1,65 @@ +on: + push: + branches: + - master + workflow_dispatch: + + jobs: + + linting: + name: Linting + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Install dependencies and run linting + run: | + python -m pip install --upgrade pip + pip install black ruff + black . + ruff check . --fix + - name: Check for local changes + run: | + if [ -n "$(git status --porcelain)" ]; then + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "style: style fixes by ruff and autoformatting by black" + fi + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "style: style fixes by ruff and autoformatting by black" + + release-please: + runs-on: ubuntu-latest + steps: + - uses: GoogleCloudPlatform/release-please-action@v4 + id: release + with: + release-type: python + package-name: LoopProjectFile + - name: Debug release_created output + run: | + echo "Release created: ${{ steps.release.outputs.release_created }}" + outputs: + release_created: ${{ steps.release.outputs.release_created }} + + pypi: + runs-on: ubuntu-24.04 + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + steps: + - name: Trigger build for pypi and upload + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/Loop3d/loopprojectfile/actions/workflows/pypi.yml/dispatches \ + -d '{"ref":"master"}' + - name: Trigger build for conda and upload + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/Loop3d/loopprojectfile/actions/workflows/conda.yml/dispatches \ + -d '{"ref":"master"}' + \ No newline at end of file From 022a676a41ad2742a3194b6928498b27284dfc52 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:26:57 +1100 Subject: [PATCH 162/187] ci: typos --- .github/workflows/publish_conda.yml | 110 ++++++++++++++-------------- 1 file changed, 54 insertions(+), 56 deletions(-) diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml index 247a74d0..c8d60b0f 100644 --- a/.github/workflows/publish_conda.yml +++ b/.github/workflows/publish_conda.yml @@ -4,62 +4,60 @@ on: - master workflow_dispatch: - jobs: - - linting: - name: Linting - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - name: Install dependencies and run linting - run: | - python -m pip install --upgrade pip - pip install black ruff - black . - ruff check . --fix - - name: Check for local changes - run: | - if [ -n "$(git status --porcelain)" ]; then - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add . - git commit -m "style: style fixes by ruff and autoformatting by black" - fi - - uses: stefanzweifel/git-auto-commit-action@v5 +jobs: + linting: + name: Linting + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Install dependencies and run linting + run: | + python -m pip install --upgrade pip + pip install black ruff + black . + ruff check . --fix + - name: Check for local changes + run: | + if [ -n "$(git status --porcelain)" ]; then + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "style: style fixes by ruff and autoformatting by black" + fi + - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "style: style fixes by ruff and autoformatting by black" - release-please: - runs-on: ubuntu-latest - steps: - - uses: GoogleCloudPlatform/release-please-action@v4 - id: release - with: - release-type: python - package-name: LoopProjectFile - - name: Debug release_created output - run: | - echo "Release created: ${{ steps.release.outputs.release_created }}" - outputs: - release_created: ${{ steps.release.outputs.release_created }} - - pypi: - runs-on: ubuntu-24.04 - needs: release-please - if: ${{ needs.release-please.outputs.release_created }} - steps: - - name: Trigger build for pypi and upload - run: | - curl -X POST \ - -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/Loop3d/loopprojectfile/actions/workflows/pypi.yml/dispatches \ - -d '{"ref":"master"}' - - name: Trigger build for conda and upload - run: | - curl -X POST \ - -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ - -H "Accept: application/vnd.github.v3+json" \ - https://api.github.com/repos/Loop3d/loopprojectfile/actions/workflows/conda.yml/dispatches \ - -d '{"ref":"master"}' - \ No newline at end of file + release-please: + runs-on: ubuntu-latest + steps: + - uses: GoogleCloudPlatform/release-please-action@v4 + id: release + with: + release-type: python + package-name: map2loop + - name: Debug release_created output + run: | + echo "Release created: ${{ steps.release.outputs.release_created }}" + outputs: + release_created: ${{ steps.release.outputs.release_created }} + + pypi: + runs-on: ubuntu-24.04 + needs: release-please + if: ${{ needs.release-please.outputs.release_created }} + steps: + - name: Trigger build for pypi and upload + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/Loop3d/map2loop/actions/workflows/pypi.yml/dispatches \ + -d '{"ref":"master"}' + - name: Trigger build for conda and upload + run: | + curl -X POST \ + -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ + -H "Accept: application/vnd.github.v3+json" \ + https://api.github.com/repos/Loop3d/map2loop/actions/workflows/conda.yml/dispatches \ + -d '{"ref":"master"}' From e722105d72e7ffc15e56f705e428bc702ef88d86 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:34:15 +1100 Subject: [PATCH 163/187] ci: keep release-please separate from linting --- .github/workflows/linting_and_testing.yml | 29 +++++++++++++++++++++++ .github/workflows/publish_conda.yml | 24 +------------------ 2 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 .github/workflows/linting_and_testing.yml diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml new file mode 100644 index 00000000..901dd3cd --- /dev/null +++ b/.github/workflows/linting_and_testing.yml @@ -0,0 +1,29 @@ +name: Linting and Testing + +on: + [push] + +jobs: + linting: + name: Linting + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install black ruff + ruff check . --fix + - name: Check for local changes + run: | + if [ -n "$(git status --porcelain)" ]; then + git config --global user.name "github-actions[bot]" + git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add . + git commit -m "style: style fixes by ruff and autoformatting by black" + fi + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "style: style fixes by ruff and autoformatting by black" + + \ No newline at end of file diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml index c8d60b0f..df25344f 100644 --- a/.github/workflows/publish_conda.yml +++ b/.github/workflows/publish_conda.yml @@ -5,31 +5,9 @@ on: workflow_dispatch: jobs: - linting: - name: Linting - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - name: Install dependencies and run linting - run: | - python -m pip install --upgrade pip - pip install black ruff - black . - ruff check . --fix - - name: Check for local changes - run: | - if [ -n "$(git status --porcelain)" ]; then - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add . - git commit -m "style: style fixes by ruff and autoformatting by black" - fi - - uses: stefanzweifel/git-auto-commit-action@v5 - with: - commit_message: "style: style fixes by ruff and autoformatting by black" release-please: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: GoogleCloudPlatform/release-please-action@v4 id: release From 94d0deccf194fbbe8de8ba493cc727c17d16b713 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:40:18 +1100 Subject: [PATCH 164/187] ci: update testing --- .github/workflows/linting_and_testing.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 901dd3cd..b9524274 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -26,4 +26,18 @@ jobs: with: commit_message: "style: style fixes by ruff and autoformatting by black" - \ No newline at end of file + testing: + name: Testing + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + - name: Install GDAL + run: | + sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable + sudo apt-get update + sudo apt-get install -y libgdal-dev gdal-bin + + - name: Install dependencies + run: | + conda install -c conda-forge -c loop3d --file dependencies.txt + From b10e64f1fd1fa80296acba1b1290f0eb94eaee30 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:42:45 +1100 Subject: [PATCH 165/187] ci: add pytest --- .github/workflows/linting_and_testing.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index b9524274..1ca2bb20 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -39,5 +39,9 @@ jobs: - name: Install dependencies run: | - conda install -c conda-forge -c loop3d --file dependencies.txt + conda install -c conda-forge -c loop3d --file dependencies.txt -y + conda install pytest -y + - name: Run tests + run: | + pytest From 5260bd8691f1445b556a7b69b86fb49f3ae68c36 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:48:03 +1100 Subject: [PATCH 166/187] ci: update testing workflow --- .github/workflows/linting_and_testing.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 1ca2bb20..187b7681 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -41,6 +41,11 @@ jobs: run: | conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install pytest -y + + - name: Install map2loop + run: | + python -m pip install . + - name: Run tests run: | pytest From 7fdf798ee37ebf390956ffeadc0df9cf1a24f7d0 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:54:38 +1100 Subject: [PATCH 167/187] ci: update linting action --- .github/workflows/linting_and_testing.yml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 187b7681..e00c544a 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -14,14 +14,7 @@ jobs: python -m pip install --upgrade pip pip install black ruff ruff check . --fix - - name: Check for local changes - run: | - if [ -n "$(git status --porcelain)" ]; then - git config --global user.name "github-actions[bot]" - git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com" - git add . - git commit -m "style: style fixes by ruff and autoformatting by black" - fi + - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "style: style fixes by ruff and autoformatting by black" @@ -41,7 +34,7 @@ jobs: run: | conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install pytest -y - + - name: Install map2loop run: | python -m pip install . From 1e7aa5898a8372a41eb8c8d44475e9b0d6db21ec Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 09:55:26 +1100 Subject: [PATCH 168/187] chore: upd conda meta --- conda/meta.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conda/meta.yaml b/conda/meta.yaml index 892f23a4..dad69b27 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -25,7 +25,7 @@ requirements: - tqdm - networkx - owslib - - loopprojectfile=0.1.3 + - loopprojectfile==v0.2.1 - map2model - beartype - gdal=3.8.4 From 01b9b222ccb9cd7e808575347754f1763aa2fcc8 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Sun, 15 Dec 2024 22:55:54 +0000 Subject: [PATCH 169/187] style: style fixes by ruff and autoformatting by black --- map2loop/sampler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/map2loop/sampler.py b/map2loop/sampler.py index 77950b13..01600566 100644 --- a/map2loop/sampler.py +++ b/map2loop/sampler.py @@ -9,7 +9,7 @@ import pandas import shapely import numpy -from typing import Optional, Union +from typing import Optional class Sampler(ABC): From 849388a18b383eb15028de8b727ea199fa35dc0e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 10:06:48 +1100 Subject: [PATCH 170/187] ci: add conda & pypi --- .github/workflows/conda.yml | 38 ++++++++++++++++++++++++++++++++ .github/workflows/pypi.yml | 43 +++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 .github/workflows/conda.yml create mode 100644 .github/workflows/pypi.yml diff --git a/.github/workflows/conda.yml b/.github/workflows/conda.yml new file mode 100644 index 00000000..1a9949f1 --- /dev/null +++ b/.github/workflows/conda.yml @@ -0,0 +1,38 @@ +name: Build conda packages + +on: + workflow_dispatch: + +jobs: + build_wheels: + name: Build wheels on + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: ${{ fromJSON(vars.BUILD_OS)}} + python-version: ${{ fromJSON(vars.PYTHON_VERSIONS)}} + steps: + - uses: conda-incubator/setup-miniconda@v3 + with: + auto-update-conda: true + python-version: ${{ matrix.python-version }} + + - uses: actions/checkout@v4 + - name: update submodules + run: | + git submodule update --init --recursive + - name: Conda build + env: + ANACONDA_API_TOKEN: ${{ secrets.ANACONDA_TOKEN }} + shell: bash -l {0} + run: | + conda install -c conda-forge conda-build scikit-build-core numpy anaconda-client conda-libmamba-solver -y + conda build -c conda-forge -c loop3d --output-folder conda conda --python ${{matrix.python-version}} + anaconda upload --label main conda/*/*.tar.bz2 + + - name: upload artifacts + uses: actions/upload-artifact@v4 + with: + name: conda-build-${{matrix.os}}-${{ matrix.python-version }} + path: conda \ No newline at end of file diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml new file mode 100644 index 00000000..a2f47d5c --- /dev/null +++ b/.github/workflows/pypi.yml @@ -0,0 +1,43 @@ +name: Deploy to PYPI + +on: + workflow_dispatch: +jobs: + + sdist: + name: Build sdist + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build + - name: Build sdist + run: python -m build --sdist + - uses: actions/upload-artifact@v4 + with: + name: dist + path: ./dist/*.tar.gz + + publish: + name: Publish wheels to pypi + runs-on: ubuntu-latest + permissions: + # IMPORTANT: this permission is mandatory for trusted publishing + id-token: write + needs: sdist + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist + - name: copy to wheelhouse + run: | + # cp -r wheelhouse/*/*.whl dist + - uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip-existing: true + verbose: true + packages-dir: dist/ \ No newline at end of file From 96fcbe8b188eea9ef924d99f829d72b119e05e79 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 10:09:26 +1100 Subject: [PATCH 171/187] ci: add docs --- .github/workflows/documentation.yml | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/workflows/documentation.yml diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml new file mode 100644 index 00000000..275971bd --- /dev/null +++ b/.github/workflows/documentation.yml @@ -0,0 +1,37 @@ +name: Build and Deploy Documentation + +on: + workflow_dispatch: + +jobs: + documentation-test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - run: | + cp CHANGELOG.md docs/source/CHANGELOG.md + docker build . -t=docs -f docs/Dockerfile + docker run -v $(pwd):/map2loop docs bash map2loop/docs/build_docs.sh + - name: upload artifacts + uses: actions/upload-artifact@v4 + with: + name: docs + path: docs/build/html + + documentation-deploy: + runs-on: ubuntu-latest + if: GitHub.ref == 'refs/heads/master' + steps: + - uses: actions/checkout@v4 + - uses: actions/download-artifact@v4 + with: + name: docs + path: docs + - name: ls + run: | + ls -l docs + - name: Deploy 🚀 + uses: JamesIves/github-pages-deploy-action@v4 + with: + branch: gh-pages # The branch the action should deploy to. + folder: docs # The folder the action should deploy. From f2823e15756a7d09f721b645dc2db197681e7757 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 10:10:54 +1100 Subject: [PATCH 172/187] ci: update to ubuntu24.04 --- .github/workflows/documentation.yml | 6 +++--- .github/workflows/pypi.yml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index 275971bd..c0db3325 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -2,10 +2,10 @@ name: Build and Deploy Documentation on: workflow_dispatch: - + jobs: documentation-test: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - run: | @@ -19,7 +19,7 @@ jobs: path: docs/build/html documentation-deploy: - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 if: GitHub.ref == 'refs/heads/master' steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pypi.yml b/.github/workflows/pypi.yml index a2f47d5c..50e8d505 100644 --- a/.github/workflows/pypi.yml +++ b/.github/workflows/pypi.yml @@ -6,7 +6,7 @@ jobs: sdist: name: Build sdist - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 @@ -23,7 +23,7 @@ jobs: publish: name: Publish wheels to pypi - runs-on: ubuntu-latest + runs-on: ubuntu-24.04 permissions: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write From 0dd3883317dab2204fabfa2af00adb7b0c382b3e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 10:41:26 +1100 Subject: [PATCH 173/187] ci: force docs to branch gh ref --- .github/workflows/documentation.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index c0db3325..a7c722a3 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -8,6 +8,9 @@ jobs: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + - run: | cp CHANGELOG.md docs/source/CHANGELOG.md docker build . -t=docs -f docs/Dockerfile From 1a70ecfce7579603763866000603d95512f06350 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 10:55:17 +1100 Subject: [PATCH 174/187] chore: add testing badge to readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index c8f3baa9..e54a520b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![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) + # Map2Loop 3.1 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: From 2432b6eb1fe468335535f1fb51303583711cc796 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 11:01:14 +1100 Subject: [PATCH 175/187] chore: add release badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e54a520b..2aeb2664 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +![GitHub Release](https://img.shields.io/github/v/release/loop3d/map2loop) [![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) # Map2Loop 3.1 From 7e27c9b5907e71ec9c5fb77cb0f6d22eb94e816f Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 11:04:28 +1100 Subject: [PATCH 176/187] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2aeb2664..ad56c6ba 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ ![GitHub Release](https://img.shields.io/github/v/release/loop3d/map2loop) +![License](https://img.shields.io/github/license/loop3d/map2loop) [![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) # Map2Loop 3.1 From 6fa0705d918ecd3a3fb81bf378aa362ad32973ef Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 12:09:13 +1100 Subject: [PATCH 177/187] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ad56c6ba..144bc856 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ ![GitHub Release](https://img.shields.io/github/v/release/loop3d/map2loop) ![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.1 From 96399fefb009cceac5959d5bfb7fd40ebc0ee278 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:29:19 +1100 Subject: [PATCH 178/187] fix: update conda and pip builds --- .github/workflows/linting_and_testing.yml | 2 +- conda/conda_build_config.yaml | 1 + conda/meta.yaml | 17 ++++++++++------- dependencies.txt | 8 +++++--- docs/Dockerfile | 1 + pyproject.toml | 5 ++--- setup.py | 19 +++++++++++++++++-- 7 files changed, 37 insertions(+), 16 deletions(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index e00c544a..5db5532e 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -33,7 +33,7 @@ jobs: - name: Install dependencies run: | conda install -c conda-forge -c loop3d --file dependencies.txt -y - conda install pytest -y + conda install gdal pytest -y - name: Install map2loop run: | diff --git a/conda/conda_build_config.yaml b/conda/conda_build_config.yaml index cbfd2b0e..d7d85008 100644 --- a/conda/conda_build_config.yaml +++ b/conda/conda_build_config.yaml @@ -1,4 +1,5 @@ python: + - 3.8 - 3.9 - 3.10 - 3.11 diff --git a/conda/meta.yaml b/conda/meta.yaml index dad69b27..54bf081c 100644 --- a/conda/meta.yaml +++ b/conda/meta.yaml @@ -1,6 +1,5 @@ {% set name = "map2loop" %} - package: name: "{{ name|lower }}" version: "{{ environ.get('GIT_DESCRIBE_TAG', '') }}" @@ -8,15 +7,20 @@ package: source: git_url: https://github.com/Loop3D/map2loop + build: number: 0 - script: "{{ PYTHON }} -m pip install ." + script: "{{ PYTHON }} -m pip install . --no-deps" requirements: host: - pip - python run: + - loopprojectfile ==0.2.2 + - gdal + - map2model + - beartype - python - numpy - pandas @@ -25,11 +29,6 @@ requirements: - tqdm - networkx - owslib - - loopprojectfile==v0.2.1 - - map2model - - beartype - - gdal=3.8.4 - about: @@ -42,3 +41,7 @@ about: extra: recipe-maintainers: - lachlangrose + +channels: + - loop3d + - conda-forge \ No newline at end of file diff --git a/dependencies.txt b/dependencies.txt index 2c281806..aef744aa 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -1,3 +1,4 @@ + numpy scipy geopandas @@ -5,8 +6,9 @@ shapely networkx owslib map2model -loopprojectfile==v0.2.1 +loopprojectfile==0.2.2 beartype -gdal==3.8.4 pytest -scikit-learn + + +scikit-learn \ No newline at end of file diff --git a/docs/Dockerfile b/docs/Dockerfile index ad79afa9..37c8cc89 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -24,6 +24,7 @@ COPY dependencies.txt dependenciesdocs.txt RUN cat ./docs/requirements.txt >> dependenciesdocs.txt RUN conda install -c conda-forge -c loop3d --file dependenciesdocs.txt -y +RUN conda install gdal -y RUN pip install . diff --git a/pyproject.toml b/pyproject.toml index 411d846a..c5d1b68a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,15 +32,14 @@ Documentation = 'https://Loop3d.org/map2loop/' "Source Code" = 'https://github.com/Loop3D/map2loop' [tool.setuptools.dynamic] -dependencies = {file = ["dependencies.txt"]} -version = { attr = 'map2loop.version.__version__' } +dependencies = { file = ["dependencies.txt"]} +version = { attr = "map2loop.version.__version__" } [tool.setuptools.packages.find] include = ['map2loop', 'map2loop.*'] - [tool.black] line-length = 100 skip-string-normalization = true diff --git a/setup.py b/setup.py index 56ce64c1..7cea5025 100644 --- a/setup.py +++ b/setup.py @@ -1,13 +1,28 @@ """See pyproject.toml for project metadata.""" -from setuptools import setup import os +from setuptools import setup package_root = os.path.abspath(os.path.dirname(__file__)) +# Get the version from the version.py file version = {} with open(os.path.join(package_root, "map2loop/version.py")) as fp: exec(fp.read(), version) version = version["__version__"] -setup() +# Read dependencies from dependencies.txt +requirements_file = os.path.join(package_root, "dependencies.txt") +with open(requirements_file, 'r') as f: + install_requires = [line.strip() for line in f if line.strip()] + +setup( + name="map2loop", + install_requires=install_requires, + version=version, + license="MIT", + package_data={ + # Include test files: + '': ['tests/*.py'], + }, +) \ No newline at end of file From d775072b4a1de76a03b03ecad031e5285dd8c81e Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:34:57 +1100 Subject: [PATCH 179/187] ci: add classic solver --- .github/workflows/linting_and_testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 5db5532e..261a414a 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -32,6 +32,7 @@ jobs: - name: Install dependencies run: | + conda config --set solver classic conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install gdal pytest -y From fc392a7830bcb66c51b19e2649cff9867618f7e5 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:37:27 +1100 Subject: [PATCH 180/187] ci: add extra action to test conda build and install --- .../workflows/test_conda_build_install.yml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/test_conda_build_install.yml diff --git a/.github/workflows/test_conda_build_install.yml b/.github/workflows/test_conda_build_install.yml new file mode 100644 index 00000000..2099ecd0 --- /dev/null +++ b/.github/workflows/test_conda_build_install.yml @@ -0,0 +1,24 @@ +name: Test Conda Build and Import + +on: + workflow_dispatch: + +jobs: + test-conda-build: + runs-on: ubuntu-24.04 + + steps: + # Step 1: Checkout the branch + - name: Checkout code + uses: actions/checkout@v4 + + # Step 2: Set up Conda + - name: Set up Miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + python-version: 3.10 # Specify the Python version + + # Step 3: Install conda-build + - name: Install conda-build + run: conda install -y conda-build + From af44663ed3a0688a4d700b0916bb0881ad524c35 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:40:59 +1100 Subject: [PATCH 181/187] ci update --- .github/workflows/linting_and_testing.yml | 1 + .github/workflows/test_conda_build_install.yml | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 261a414a..00342c43 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -32,6 +32,7 @@ jobs: - name: Install dependencies run: | + conda update -n base -c defaults conda -y conda config --set solver classic conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install gdal pytest -y diff --git a/.github/workflows/test_conda_build_install.yml b/.github/workflows/test_conda_build_install.yml index 2099ecd0..c210263c 100644 --- a/.github/workflows/test_conda_build_install.yml +++ b/.github/workflows/test_conda_build_install.yml @@ -6,7 +6,6 @@ on: jobs: test-conda-build: runs-on: ubuntu-24.04 - steps: # Step 1: Checkout the branch - name: Checkout code @@ -22,3 +21,19 @@ jobs: - name: Install conda-build run: conda install -y conda-build + # Step 4: Build the Conda package + - name: Build Conda package + run: conda-build . + + # Step 5: Create a Conda environment and install the built package + - name: Create environment and install package + run: | + conda create -y -n test-env python=3.10 + source activate test-env + conda install -y --use-local $(conda build . --output) + + # Step 6: Test the package import + - name: Test import + run: | + source activate test-env + python -c "import your_package_name" From 024a12971d0de0cdf95e556a7f7150c930ba9690 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:52:39 +1100 Subject: [PATCH 182/187] ci: update --- .github/workflows/linting_and_testing.yml | 3 +-- .github/workflows/test_conda_build_install.yml | 17 ----------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 00342c43..ddfcd5c1 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -32,8 +32,7 @@ jobs: - name: Install dependencies run: | - conda update -n base -c defaults conda -y - conda config --set solver classic + conda update -n base -c defaults conda -y conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install gdal pytest -y diff --git a/.github/workflows/test_conda_build_install.yml b/.github/workflows/test_conda_build_install.yml index c210263c..ca0a019f 100644 --- a/.github/workflows/test_conda_build_install.yml +++ b/.github/workflows/test_conda_build_install.yml @@ -20,20 +20,3 @@ jobs: # Step 3: Install conda-build - name: Install conda-build run: conda install -y conda-build - - # Step 4: Build the Conda package - - name: Build Conda package - run: conda-build . - - # Step 5: Create a Conda environment and install the built package - - name: Create environment and install package - run: | - conda create -y -n test-env python=3.10 - source activate test-env - conda install -y --use-local $(conda build . --output) - - # Step 6: Test the package import - - name: Test import - run: | - source activate test-env - python -c "import your_package_name" From d74d70c472ba65712d49e4f128a7b15f5cf45383 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 17:56:39 +1100 Subject: [PATCH 183/187] gdal pin? --- .github/workflows/linting_and_testing.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index ddfcd5c1..b893ca36 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -34,7 +34,7 @@ jobs: run: | conda update -n base -c defaults conda -y conda install -c conda-forge -c loop3d --file dependencies.txt -y - conda install gdal pytest -y + conda install gdal==3.8.4 pytest -y - name: Install map2loop run: | From c44e6a0771dbec1b018035a55927afd02908cb1c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 18:02:54 +1100 Subject: [PATCH 184/187] add libmamba --- .github/workflows/linting_and_testing.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index b893ca36..e408373e 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -33,6 +33,7 @@ jobs: - name: Install dependencies run: | conda update -n base -c defaults conda -y + conda install -n base conda-libmamba-solver -c conda-forge -y conda install -c conda-forge -c loop3d --file dependencies.txt -y conda install gdal==3.8.4 pytest -y From f1888ec4b4d403b81c4994c60fa904e73f36993a Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 18:07:17 +1100 Subject: [PATCH 185/187] chore: typos --- .github/workflows/linting_and_testing.yml | 2 +- dependencies.txt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index e408373e..10c651aa 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -35,7 +35,7 @@ jobs: conda update -n base -c defaults conda -y conda install -n base conda-libmamba-solver -c conda-forge -y conda install -c conda-forge -c loop3d --file dependencies.txt -y - conda install gdal==3.8.4 pytest -y + conda install gdal=3.8.4 pytest -y - name: Install map2loop run: | diff --git a/dependencies.txt b/dependencies.txt index aef744aa..57a2f246 100644 --- a/dependencies.txt +++ b/dependencies.txt @@ -9,6 +9,4 @@ map2model loopprojectfile==0.2.2 beartype pytest - - scikit-learn \ No newline at end of file From 275ed3330cb0b7ad39c59c7e3b938974284d365c Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Mon, 16 Dec 2024 18:46:06 +1100 Subject: [PATCH 186/187] Fix: update gdal install in actions (#163) --- .github/workflows/linting_and_testing.yml | 3 ++- .github/workflows/publish_conda.yml | 11 +++++----- .../workflows/test_conda_build_install.yml | 22 ++++++++++++++----- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/.github/workflows/linting_and_testing.yml b/.github/workflows/linting_and_testing.yml index 10c651aa..a7ea3a0c 100644 --- a/.github/workflows/linting_and_testing.yml +++ b/.github/workflows/linting_and_testing.yml @@ -34,8 +34,9 @@ jobs: run: | conda update -n base -c defaults conda -y conda install -n base conda-libmamba-solver -c conda-forge -y + conda install -c conda-forge gdal -y conda install -c conda-forge -c loop3d --file dependencies.txt -y - conda install gdal=3.8.4 pytest -y + conda install pytest -y - name: Install map2loop run: | diff --git a/.github/workflows/publish_conda.yml b/.github/workflows/publish_conda.yml index df25344f..89ab5c00 100644 --- a/.github/workflows/publish_conda.yml +++ b/.github/workflows/publish_conda.yml @@ -1,11 +1,10 @@ on: - push: - branches: - - master - workflow_dispatch: - + push: + branches: + - master + workflow_dispatch: + jobs: - release-please: runs-on: ubuntu-24.04 steps: diff --git a/.github/workflows/test_conda_build_install.yml b/.github/workflows/test_conda_build_install.yml index ca0a019f..7c994c86 100644 --- a/.github/workflows/test_conda_build_install.yml +++ b/.github/workflows/test_conda_build_install.yml @@ -1,22 +1,34 @@ name: Test Conda Build and Import on: - workflow_dispatch: + workflow_dispatch: jobs: test-conda-build: + name: Test Conda Build and Import runs-on: ubuntu-24.04 steps: - # Step 1: Checkout the branch - name: Checkout code uses: actions/checkout@v4 - # Step 2: Set up Conda - name: Set up Miniconda uses: conda-incubator/setup-miniconda@v2 with: - python-version: 3.10 # Specify the Python version + python-version: 3.10 - # Step 3: Install conda-build - name: Install conda-build run: conda install -y conda-build + + - name: Build Conda package + run: conda-build . + + - name: Create environment and install package + run: | + conda create -y -n test-env python=3.10 + source activate test-env + conda install -y --use-local $(conda build . --output) + + - name: Test import + run: | + source activate test-env + python -c "import map2loop" From 97cf7d31ea6ed51624ef0589832d6d6ec1f4b8f9 Mon Sep 17 00:00:00 2001 From: AngRodrigues Date: Tue, 17 Dec 2024 08:49:33 +1100 Subject: [PATCH 187/187] ci: remove the build test for now --- .../workflows/test_conda_build_install.yml | 22 ------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/test_conda_build_install.yml diff --git a/.github/workflows/test_conda_build_install.yml b/.github/workflows/test_conda_build_install.yml deleted file mode 100644 index ca0a019f..00000000 --- a/.github/workflows/test_conda_build_install.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Test Conda Build and Import - -on: - workflow_dispatch: - -jobs: - test-conda-build: - runs-on: ubuntu-24.04 - steps: - # Step 1: Checkout the branch - - name: Checkout code - uses: actions/checkout@v4 - - # Step 2: Set up Conda - - name: Set up Miniconda - uses: conda-incubator/setup-miniconda@v2 - with: - python-version: 3.10 # Specify the Python version - - # Step 3: Install conda-build - - name: Install conda-build - run: conda install -y conda-build