diff --git a/.all-contributorsrc b/.all-contributorsrc index afa75f11f..c8bfd017a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -81,6 +81,329 @@ "maintenance", "test" ] + }, + { + "login": "RomiP", + "name": "Romina Piunno", + "avatar_url": "https://avatars.githubusercontent.com/u/17185856?v=4", + "profile": "https://github.com/RomiP", + "contributions": [ + "code", + "ideas", + "mentoring", + "review", + "tutorial" + ] + }, + { + "login": "trevorskaggs", + "name": "trevorskaggs", + "avatar_url": "https://avatars.githubusercontent.com/u/1276123?v=4", + "profile": "https://github.com/trevorskaggs", + "contributions": [ + "bug", + "code" + ] + }, + { + "login": "nabib", + "name": "Nicole Abib", + "avatar_url": "https://avatars.githubusercontent.com/u/16991294?v=4", + "profile": "https://github.com/nabib", + "contributions": [ + "code", + "ideas" + ] + }, + { + "login": "aaarendt", + "name": "Anthony Arendt", + "avatar_url": "https://avatars.githubusercontent.com/u/4993098?v=4", + "profile": "http://psc.apl.uw.edu/people/investigators/anthony-arendt/", + "contributions": [ + "bug", + "business", + "eventOrganizing", + "fundingFinding" + ] + }, + { + "login": "ShashankBice", + "name": "Shashank Bhushan", + "avatar_url": "https://avatars.githubusercontent.com/u/29011666?v=4", + "profile": "https://github.com/ShashankBice", + "contributions": [ + "example" + ] + }, + { + "login": "alexdibella", + "name": "alexdibella", + "avatar_url": "https://avatars.githubusercontent.com/u/66279468?v=4", + "profile": "https://github.com/alexdibella", + "contributions": [ + "bug", + "ideas", + "code" + ] + }, + { + "login": "norlandrhagen", + "name": "Raphael Hagen", + "avatar_url": "https://avatars.githubusercontent.com/u/22455466?v=4", + "profile": "https://github.com/norlandrhagen", + "contributions": [ + "doc", + "design", + "code", + "infra", + "review" + ] + }, + { + "login": "scottyhq", + "name": "Scott Henderson", + "avatar_url": "https://avatars.githubusercontent.com/u/3924836?v=4", + "profile": "http://scottyhq.github.io", + "contributions": [ + "maintenance" + ] + }, + { + "login": "loudTom", + "name": "Tom Johnson", + "avatar_url": "https://avatars.githubusercontent.com/u/33604148?v=4", + "profile": "https://github.com/loudTom", + "contributions": [ + "doc", + "infra" + ] + }, + { + "login": "liuzheng-arctic", + "name": "liuzheng-arctic", + "avatar_url": "https://avatars.githubusercontent.com/u/51420076?v=4", + "profile": "https://github.com/liuzheng-arctic", + "contributions": [ + "doc", + "bug", + "code", + "ideas", + "review", + "tool", + "example" + ] + }, + { + "login": "fperez", + "name": "Fernando Perez", + "avatar_url": "https://avatars.githubusercontent.com/u/57394?v=4", + "profile": "http://fperez.org", + "contributions": [ + "design", + "business", + "ideas" + ] + }, + { + "login": "tedmaksym", + "name": "tedmaksym", + "avatar_url": "https://avatars.githubusercontent.com/u/13255911?v=4", + "profile": "https://github.com/tedmaksym", + "contributions": [ + "ideas" + ] + }, + { + "login": "jomey", + "name": "Joachim Meyer", + "avatar_url": "https://avatars.githubusercontent.com/u/178649?v=4", + "profile": "https://github.com/jomey", + "contributions": [ + "mentoring", + "maintenance" + ] + }, + { + "login": "lsetiawan", + "name": "Don Setiawan", + "avatar_url": "https://avatars.githubusercontent.com/u/17802172?v=4", + "profile": "https://www.linkedin.com/in/landungsetiawan/", + "contributions": [ + "infra", + "platform" + ] + }, + { + "login": "facusapienza21", + "name": "Facundo Sapienza", + "avatar_url": "https://avatars.githubusercontent.com/u/39526081?v=4", + "profile": "http://facusapienza.com", + "contributions": [ + "example", + "bug" + ] + }, + { + "login": "dshean", + "name": "David Shean", + "avatar_url": "https://avatars.githubusercontent.com/u/1103530?v=4", + "profile": "http://dshean.github.io", + "contributions": [ + "bug", + "mentoring" + ] + }, + { + "login": "smithb", + "name": "smithb", + "avatar_url": "https://avatars.githubusercontent.com/u/2279144?v=4", + "profile": "https://github.com/SmithB", + "contributions": [ + "ideas" + ] + }, + { + "login": "trey-stafford", + "name": "trey-stafford", + "avatar_url": "https://avatars.githubusercontent.com/u/19692879?v=4", + "profile": "https://github.com/trey-stafford", + "contributions": [ + "code", + "ideas", + "maintenance", + "review", + "question" + ] + }, + { + "login": "asteiker", + "name": "Amy Steiker", + "avatar_url": "https://avatars.githubusercontent.com/u/47193922?v=4", + "profile": "https://nsidc.org", + "contributions": [ + "example", + "doc", + "mentoring" + ] + }, + { + "login": "tsutterley", + "name": "Tyler Sutterley", + "avatar_url": "https://avatars.githubusercontent.com/u/5384907?v=4", + "profile": "https://tsutterley.github.io/", + "contributions": [ + "doc", + "code", + "ideas", + "question", + "security", + "test" + ] + }, + { + "login": "icetianli", + "name": "Tian Li", + "avatar_url": "https://avatars.githubusercontent.com/u/45267156?v=4", + "profile": "https://icetianli.github.io/", + "contributions": [ + "bug", + "code", + "doc", + "example", + "ideas", + "review", + "test", + "tool" + ] + }, + { + "login": "annavalentine", + "name": "Anna Valentine", + "avatar_url": "https://avatars.githubusercontent.com/u/65192768?v=4", + "profile": "https://github.com/annavalentine", + "contributions": [ + "example" + ] + }, + { + "login": "wallinb", + "name": "Bruce Wallin", + "avatar_url": "https://avatars.githubusercontent.com/u/35819999?v=4", + "profile": "https://github.com/wallinb", + "contributions": [ + "code", + "doc", + "ideas", + "review", + "question" + ] + }, + { + "login": "mollymwieringa", + "name": "Molly Wieringa", + "avatar_url": "https://avatars.githubusercontent.com/u/40209354?v=4", + "profile": "https://github.com/mollymwieringa", + "contributions": [ + "ideas" + ] + }, + { + "login": "bidhya", + "name": "bidhya", + "avatar_url": "https://avatars.githubusercontent.com/u/6469101?v=4", + "profile": "https://byrd.osu.edu/", + "contributions": [ + "example" + ] + }, + { + "login": "salvis2", + "name": "Sebastian Alvis", + "avatar_url": "https://avatars.githubusercontent.com/u/27738742?v=4", + "profile": "https://github.com/salvis2", + "contributions": [ + "doc", + "infra" + ] + }, + { + "login": "learn2phoenix", + "name": "learn2phoenix", + "avatar_url": "https://avatars.githubusercontent.com/u/74139166?v=4", + "profile": "https://learn2phoenix.github.io", + "contributions": [ + "code" + ] + }, + { + "login": "jpswinski", + "name": "JP Swinski", + "avatar_url": "https://avatars.githubusercontent.com/u/54070345?v=4", + "profile": "https://github.com/jpswinski", + "contributions": [ + "code" + ] + }, + { + "login": "weiji14", + "name": "Wei Ji", + "avatar_url": "https://avatars.githubusercontent.com/u/23487320?v=4", + "profile": "http://weiji14.github.io", + "contributions": [ + "bug", + "code", + "doc", + "example", + "ideas", + "infra", + "maintenance", + "mentoring", + "question", + "review", + "test", + "talk" + ] } ], "contributorsPerLine": 7, diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 777350a71..74a6e3028 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,5 +1,5 @@ repos: - repo: https://github.com/psf/black - rev: stable + rev: 22.6.0 hooks: - id: black \ No newline at end of file diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst index 8120f088e..5a0b5ca50 100644 --- a/CONTRIBUTORS.rst +++ b/CONTRIBUTORS.rst @@ -5,48 +5,61 @@ The following people have made contributions to the project (in alphabetical order by last name) and are considered "The icepyx Developers". Thanks goes to these wonderful people (`emoji key `_): -* `Nicole Abib `_ - University of Oregon -* `Anthony Arendt `_ - University of Washington -* `Shashank Bhushan `_ - University of Washington -* `Alessandro Di Bella `_ - Technical University of Denmark -* `Raphael Hagen `_ - University of Washington -* `Scott Henderson `_ - University of Washington -* `Thomas Johnson `_ - University College London -* `Zheng Liu `_ - University of Washington -* `Ted Maksym `_ - Woods Hole Oceanographic Institution -* `Joachim Meyer `_ - University of Utah -* `Fernando Perez `_ - University of California, Berkeley -* `Romina Piunno `_ - University of Toronto -* `Facundo Sapienza `_ - University of California, Berkeley -* `David Shean `_ - University of Washington -* `Ben Smith `_ - University of Washington -* `Trey Stafford `_ - NSIDC, University of Colorado -* `Amy Steiker `_ - NSIDC, University of Colorado -* `Tyler Sutterley `_ - University of Washington -* `Anna Valentine `_ - Colorado School of Mines -* `Bruce Wallin `_ - NSIDC, University of Colorado -* `Molly Wieringa `_ - University of Washington -* `Bidhyananda Yadav `_ - Ohio State University - - .. raw:: html - - - - - - - - - - -

Jessica

πŸ› πŸ’» πŸ–‹ πŸ“– 🎨 πŸ’‘ πŸ€” 🚧 πŸ§‘β€πŸ« πŸ“† πŸ’¬ πŸ‘€

Kelsey Bisson

πŸ› πŸ’» πŸ“– πŸ€” πŸ’‘ πŸ€” πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ βœ…

Sarah Hall

πŸ› πŸ’» πŸ“– 🚧 ⚠️

Zach Fair

πŸ› πŸ’» πŸ“– πŸ€” πŸ’¬ πŸ‘€ βœ…

nitin-ravinder

πŸ› πŸ‘€
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Amy Steiker

πŸ’‘ πŸ“– πŸ§‘β€πŸ«

Anna Valentine

πŸ’‘

Anthony Arendt

πŸ› πŸ’Ό πŸ“‹ πŸ”

Bruce Wallin

πŸ’» πŸ“– πŸ€” πŸ‘€ πŸ’¬

David Shean

πŸ› πŸ§‘β€πŸ«

Don Setiawan

πŸš‡ πŸ“¦

Facundo Sapienza

πŸ’‘ πŸ›

Fernando Perez

🎨 πŸ’Ό πŸ€”

JP Swinski

πŸ’»

Jessica

πŸ› πŸ’» πŸ–‹ πŸ“– 🎨 πŸ’‘ πŸ€” 🚧 πŸ§‘β€πŸ« πŸ“† πŸ’¬ πŸ‘€

Joachim Meyer

πŸ§‘β€πŸ« 🚧

Kelsey Bisson

πŸ› πŸ’» πŸ“– πŸ€” πŸ’‘ πŸ€” πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ βœ…

Molly Wieringa

πŸ€”

Nicole Abib

πŸ’» πŸ€”

Raphael Hagen

πŸ“– 🎨 πŸ’» πŸš‡ πŸ‘€

Romina Piunno

πŸ’» πŸ€” πŸ§‘β€πŸ« πŸ‘€ βœ…

Sarah Hall

πŸ› πŸ’» πŸ“– 🚧 ⚠️

Scott Henderson

🚧

Sebastian Alvis

πŸ“– πŸš‡

Shashank Bhushan

πŸ’‘

Tian Li

πŸ› πŸ’» πŸ“– πŸ’‘ πŸ€” πŸ‘€ ⚠️ πŸ”§

Tom Johnson

πŸ“– πŸš‡

Tyler Sutterley

πŸ“– πŸ’» πŸ€” πŸ’¬ πŸ›‘οΈ ⚠️

Wei Ji

πŸ› πŸ’» πŸ“– πŸ’‘ πŸ€” πŸš‡ 🚧 πŸ§‘β€πŸ« πŸ’¬ πŸ‘€ ⚠️ πŸ“’

Zach Fair

πŸ› πŸ’» πŸ“– πŸ€” πŸ’¬ πŸ‘€ βœ…

alexdibella

πŸ› πŸ€” πŸ’»

bidhya

πŸ’‘

learn2phoenix

πŸ’»

liuzheng-arctic

πŸ“– πŸ› πŸ’» πŸ€” πŸ‘€ πŸ”§ πŸ’‘

nitin-ravinder

πŸ› πŸ‘€

smithb

πŸ€”

tedmaksym

πŸ€”

trevorskaggs

πŸ› πŸ’»

trey-stafford

πŸ’» πŸ€” 🚧 πŸ‘€ πŸ’¬
- - + + - + This project follows the `all-contributors `_ specification. Contributions of any kind welcome! diff --git a/README.rst b/README.rst index 52b1778e0..9cefa4668 100644 --- a/README.rst +++ b/README.rst @@ -18,7 +18,7 @@ Current development version (development branch): |Docs Status dev| |Travis dev .. |Pypi install| image:: https://badge.fury.io/py/icepyx.svg :target: https://pypi.org/project/icepyx -.. |Contributors| image:: https://img.shields.io/badge/all_contributors-27-orange.svg?style=flat-square +.. |Contributors| image:: https://img.shields.io/badge/all_contributors-34-orange.svg?style=flat-square :alt: All Contributors :target: https://github.com/icesat2py/icepyx/blob/main/CONTRIBUTORS.rst @@ -131,4 +131,4 @@ taken to close/merge these PRs, and issues closed. For more information, please visit `the informational page `__ or download the `participant information -sheet `__. \ No newline at end of file +sheet `__. diff --git a/doc/source/example_notebooks/IS2_cloud_data_access.ipynb b/doc/source/example_notebooks/IS2_cloud_data_access.ipynb index 999abf23a..fdf24146e 100644 --- a/doc/source/example_notebooks/IS2_cloud_data_access.ipynb +++ b/doc/source/example_notebooks/IS2_cloud_data_access.ipynb @@ -4,14 +4,14 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# ICESat-2 AWS cloud data access (BETA ONLY)\n", + "# ICESat-2 AWS cloud data access\n", "This notebook ({nb-download}`download `) illustrates the use of icepyx for accessing ICESat-2 data currently available through the AWS (Amazon Web Services) us-west2 hub s3 data bucket.\n", "\n", - "## Critical Caveats\n", - "***Please do not contact us saying this does not work until you have read this section in detail***\n", - "1. ICESat-2 data is not currently publicly available on the cloud (and will not likely be until at least the end of 2021). A limited subset is currently available in an s3 bucket to developers and beta testers who have been registered with NSIDC.\n", + "## Notes\n", + "1. ICESat-2 data became publicly available on the cloud on 29 September 2022. Thus, access methods and example workflows are still being developed by NSIDC, and the underlying code in icepyx will need to be updated now that these data (and the associated metadata) are available. We appreciate your patience and contributions (e.g. reporting bugs, sharing your code, etc.) during this transition!\n", "2. This example and the code it describes are part of ongoing development. Current limitations to using these features are described throughout the example, as appropriate.\n", - "3. You **MUST** be working within an AWS instance. Otherwise, you will get a permissions error." + "3. You **MUST** be working within an AWS instance. Otherwise, you will get a permissions error.\n", + "4. Authentication is still more steps than we'd like. We're working to address this - let us know if you'd like to join the conversation!" ] }, { @@ -27,9 +27,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Create an icepyx Query object\n", - "\n", - "In order to develop and test cloud data access functionality, here we search for an arbitrary granule over Greenland that was previously determined to be available on s3 using [Earthdata Search](https://search.earthdata.nasa.gov/). s3 availability is not yet included in CMR metadata, so it cannot be determined programmatically." + "Create an icepyx Query object" ] }, { @@ -58,8 +56,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Construct the granule s3 urls\n", - "Since cloud data available is not yet included as part of the standard granule metadata, there is no way for us to check whether or not these s3 bucket urls are valid, since they are constructed from other granule metadata. Thus, you may get FileNotFound Errors when trying to use these urls." + "## Get the granule s3 urls\n", + "You must specify `cloud=True` to get the needed s3 urls.\n", + "This function returns a list containing the list of the granule IDs and a list of the corresponding urls." ] }, { @@ -68,7 +67,7 @@ "metadata": {}, "outputs": [], "source": [ - "gran_ids = reg.avail_granules(ids=True, s3urls=True)\n", + "gran_ids = reg.avail_granules(ids=True, cloud=True)\n", "gran_ids" ] }, @@ -77,7 +76,9 @@ "metadata": {}, "source": [ "## Log in to Earthdata and generate an s3 token\n", - "You can use icepyx's existing login functionality to generate your s3 data access token, which should be good for five hours. We currently do not have this set up to automatically renew, but if you're interested in adding this functionality please get in touch or submit a PR!" + "You can use icepyx's existing login functionality to generate your s3 data access token, which will be valid for *one* hour.\n", + "\n", + "We currently do not have this set up to automatically renew, but [earthaccess](), which icepyx will soon be adopting for authentication, is working on handling the limits imposed by expiring s3 tokens. If you're interested in working on helping icepyx and NSIDC (and DAACs more broadly) address these challenges, please get in touch or submit a PR. Documentation/example testers are always appreciated (so you don't have to understand the code)!" ] }, { @@ -88,7 +89,7 @@ }, "outputs": [], "source": [ - "reg.earthdata_login(\"icepyx_dev\",\"icepyx_dev@gmail.com\", s3token=True)" + "reg.earthdata_login(\"icepyx_devteam\",\"icepyx_dev@gmail.com\", s3token=True)" ] }, { @@ -132,7 +133,7 @@ "metadata": {}, "source": [ "## Select an s3 url and access the data\n", - "Development is underway for data read in capabilities, which will include options for cloud data access. Stay tuned and we'd love for you to join us and contribute!\n", + "Data read in capabilities for cloud data are coming soon in icepyx (targeted Winter 2022-2023). Stay tuned and we'd love for you to join us and contribute!\n", "\n", "**Note: If you get a PermissionDenied Error when trying to read in the data, you may not be sending your request from an AWS hub in us-west2. We're currently working on how to alert users if they will not be able to access ICESat-2 data in the cloud for this reason**" ] @@ -143,6 +144,8 @@ "metadata": {}, "outputs": [], "source": [ + "# the first index, [1], gets us into the list of s3 urls\n", + "# the second index, [0], gets us the first entry in that list.\n", "s3url = gran_ids[1][0]\n", "# s3url = 's3://nsidc-cumulus-prod-protected/ATLAS/ATL03/004/2019/11/30/ATL03_20191130221008_09930503_004_01.h5'" ] @@ -178,9 +181,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "Python [conda env:notebook] *", "language": "python", - "name": "python3" + "name": "conda-env-notebook-py" }, "language_info": { "codemirror_mode": { @@ -192,7 +195,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.4" + "version": "3.8.6" } }, "nbformat": 4, diff --git a/doc/source/example_notebooks/IS2_data_access.ipynb b/doc/source/example_notebooks/IS2_data_access.ipynb index a8941eca3..fbac1b664 100644 --- a/doc/source/example_notebooks/IS2_data_access.ipynb +++ b/doc/source/example_notebooks/IS2_data_access.ipynb @@ -83,6 +83,9 @@ "*NOTE: The input keyword for `short_name` was updated in the code from `dataset` to `product` to match common usage.\n", "This should not affect users providing positional inputs as demonstrated in this tutorial.*\n", "\n", + "*NOTE: You can submit at most one bounding box or a list of lonlat polygon coordinates per object instance.\n", + "Per NSIDC requirements, geospatial polygon files may only contain one feature (polygon).*\n", + "\n", "Then, for all non-gridded products (ATL<=13), you must include AT LEAST one of the following inputs (temporal or orbital constraints):\n", "- `date_range` = the date range for which you would like to search for results. Must be formatted as a set of 'YYYY-MM-DD' strings separated by a comma.\n", "- `cycles` = Which orbital cycle to use, input as a numerical string or a list of strings. If no input is given, this value defaults to all available cycles within the search parameters. An orbital cycle refers to the 91-day repeat period of the ICESat-2 orbit.\n", @@ -443,15 +446,6 @@ "region_a.subsetparams()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "region_a._geom_filepath" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -525,7 +519,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.4" + "version": "3.9.13" } }, "nbformat": 4, diff --git a/doc/source/tracking/icepyx_pubs.bib b/doc/source/tracking/icepyx_pubs.bib index b44d9d54a..fcc5dddea 100644 --- a/doc/source/tracking/icepyx_pubs.bib +++ b/doc/source/tracking/icepyx_pubs.bib @@ -1,4 +1,56 @@ % ######### materials about icepyx ################ +@misc{2022_IS2-HW-tutorials, + author = {Scheick, Jessica and + Arendt, Anthony and + Haley, Charley and + Henderson, Scott and + Koh, Jane and + Setiawan, Don and + Alterman, Naomi and + Meyer, Joachim and + Cristea, Nicoleta and + Schweiger, Axel and + Barciauskas, Aimee and + Smith, Ben and + Piunno, Romina and + Shapero, Daniel and + Fair, Zachary and + Arndt, Philipp and + Leong, Wei Ji and + Sutterley, Tyler and + Snow, Tasha and + Beig, Mikala and + Besso, Hannah and + Liu, Zheng and + Joughin, Ian and + Bisson, Kelsey and + Sauthoff, Wilson}, + title = {ICESat-2 Hackweek Website}, + month = apr, + year = 2022, + note = {If you use this book, please cite it as below.}, + publisher = {Zenodo}, + version = {2022.04.15}, + doi = {10.5281/zenodo.6462479}, + url = {https://doi.org/10.5281/zenodo.6462479} +} + +@misc{js2021agu, +author = {Scheick, J and Bisson, K and Li, T and Leong, WJ and Arendt, A}, +note = {Abstract and poster (presented by Wei Ji Leong). American Geophysical Union Fall Meeting, New Orleans, LA, USA. 13-17 December 2021.}, +title = {Collaborative Computational Resource Development around {ICESat-2} Data: the {icepyx} Community and Library}, +year = {2021}, +comment = {abstract, poster}, +} + +@misc{js2020agu, +author = {Scheick, J and Arendt, A and Heagy, L and Paolo, F and Perez, F and Steiker, A}, +note = {Abstract and eLightning (poster + presentation). American Geophysical Union Fall Meeting, virtual, USA. 1-17 December 2020.}, +title = {{\texttt{icepyx}: Developing Community and Software Around ICESat-2 Data}}, +year = {2020}, +comment = {abstract, poster, talk}, +} + @misc{2020_IS2-HW-tutorials, author = {Arendt, Anthony and Scheick, Jessica and @@ -44,7 +96,9 @@ @misc{js2019agu % ######### Articles citing icepyx ################ -@article{https://doi.org/10.1029/2021GL095051, + + +@article{Bisson:2021, author = {Bisson, K. M. and Cael, B. B.}, title = {How Are Under Ice Phytoplankton Related to Sea Ice in the Southern Ocean?}, journal = {Geophysical Research Letters}, @@ -56,7 +110,7 @@ @article{https://doi.org/10.1029/2021GL095051 year = {2021} } -@inProceedings{FernandoMappingDiversityAgricultural2021, +@inProceedings{Fernando:2021, title = {Mapping the {{Diversity}} of {{Agricultural Systems}} in the {{Cuellaje Sector}}, {{Cotacachi}}, {{Ecuador Using ATL08}} for the {{ICESat-2 Mission}} and {{Machine Learning Techniques}}}, booktitle = {Computational {{Science}} and {{Its Applications}} \textendash{} {{ICCSA}} 2021}, author = {Fernando, Garrido}, @@ -71,7 +125,7 @@ @inProceedings{FernandoMappingDiversityAgricultural2021 langid = {english} } -@Article{tc-14-3629-2020, +@Article{Li:2020, AUTHOR = {Li, T. and Dawson, G. J. and Chuter, S. J. and Bamber, J. L.}, TITLE = {Mapping the grounding zone of Larsen~C Ice Shelf, Antarctica, from ICESat-2 laser altimetry}, JOURNAL = {The Cryosphere}, @@ -82,3 +136,23 @@ @Article{tc-14-3629-2020 URL = {https://tc.copernicus.org/articles/14/3629/2020/}, DOI = {10.5194/tc-14-3629-2020} } + + +% ######### Research/Articles using (but not citing) icepyx ################ + + +@article{Sothe:2022, +title={Spatially Continuous Mapping of Forest Canopy Height in Canada by Combining GEDI and ICESat-2 with PALSAR and Sentinel}, +volume={14}, +ISSN={2072-4292}, +url={http://dx.doi.org/10.3390/rs14205158}, +DOI={10.3390/rs14205158}, +number={20}, +journal={Remote Sensing}, +publisher={MDPI AG}, +author={Sothe, Camile and Gonsamo, Alemu and Lourenço, Ricardo B. and Kurz, Werner A. and Snider, James}, +year={2022}, +month={Oct}, +pages={5158}, +note={Attribution to icepyx from 15 Oct 2022 Twitter post, https://twitter.com/rblourenco/status/1581320878511382528} +} diff --git a/doc/source/tracking/pypistats/downloads.svg b/doc/source/tracking/pypistats/downloads.svg index ccc029a76..5e7f74863 100644 --- a/doc/source/tracking/pypistats/downloads.svg +++ b/doc/source/tracking/pypistats/downloads.svg @@ -6,11 +6,11 @@ - 2022-03-17T21:02:01.353153 + 2022-10-01T20:58:40.653395 image/svg+xml - Matplotlib v3.5.1, https://matplotlib.org/ + Matplotlib v3.6.0, https://matplotlib.org/ @@ -41,17 +41,17 @@ z - - + - + - + - + - + - + @@ -283,12 +283,12 @@ z - + - + - + - + @@ -339,12 +339,12 @@ z - + - + @@ -358,9 +358,80 @@ z - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + - - + + - + - + - + + diff --git a/doc/source/tracking/pypistats/downloads_data.csv b/doc/source/tracking/pypistats/downloads_data.csv index 5b3974e4b..c795fd46d 100644 --- a/doc/source/tracking/pypistats/downloads_data.csv +++ b/doc/source/tracking/pypistats/downloads_data.csv @@ -1,352 +1,736 @@ category,date,downloads +with_mirrors,2022-08-26,123 +with_mirrors,2022-08-23,104 +with_mirrors,2022-05-17,92 +with_mirrors,2022-05-06,85 +with_mirrors,2022-06-11,85 +with_mirrors,2022-06-06,83 +with_mirrors,2022-08-21,82 +with_mirrors,2022-09-27,81 +with_mirrors,2022-09-19,80 +with_mirrors,2022-04-08,76 +with_mirrors,2022-04-14,71 +with_mirrors,2022-04-07,65 +with_mirrors,2022-08-16,65 +with_mirrors,2022-09-04,65 +with_mirrors,2022-09-01,63 +with_mirrors,2022-08-12,62 +with_mirrors,2022-04-23,60 +with_mirrors,2022-09-05,60 +with_mirrors,2022-09-16,60 +with_mirrors,2022-04-17,58 +with_mirrors,2022-07-14,58 +with_mirrors,2022-07-25,58 +with_mirrors,2022-07-29,58 +with_mirrors,2022-04-11,57 +with_mirrors,2022-06-14,56 +with_mirrors,2022-07-10,56 +with_mirrors,2022-08-13,56 +with_mirrors,2022-07-05,55 +with_mirrors,2022-04-15,54 +with_mirrors,2022-07-21,54 +with_mirrors,2022-04-24,53 +with_mirrors,2022-09-08,53 +with_mirrors,2022-04-21,52 +with_mirrors,2022-09-09,51 +with_mirrors,2022-08-20,50 +with_mirrors,2022-04-26,49 +with_mirrors,2022-04-19,48 +with_mirrors,2022-08-09,48 +with_mirrors,2022-09-22,48 +with_mirrors,2022-09-26,48 +with_mirrors,2022-04-09,45 +with_mirrors,2022-08-03,44 +with_mirrors,2022-04-13,43 +with_mirrors,2022-08-30,43 +with_mirrors,2022-09-15,43 +with_mirrors,2022-06-24,42 +with_mirrors,2022-08-15,42 +with_mirrors,2022-08-22,42 +with_mirrors,2022-09-30,42 +without_mirrors,2022-07-29,42 +with_mirrors,2022-04-16,41 +with_mirrors,2022-05-07,41 +with_mirrors,2022-06-08,41 +with_mirrors,2022-08-18,41 +with_mirrors,2022-07-30,40 +with_mirrors,2022-09-18,40 +with_mirrors,2022-05-19,39 +with_mirrors,2022-05-31,39 +with_mirrors,2022-09-14,39 +with_mirrors,2022-04-27,38 +with_mirrors,2022-04-28,38 +with_mirrors,2022-04-06,37 +with_mirrors,2022-05-25,37 +with_mirrors,2022-06-25,37 +with_mirrors,2022-07-26,37 +with_mirrors,2022-08-24,37 +with_mirrors,2022-09-13,36 +with_mirrors,2022-05-10,35 +with_mirrors,2022-06-17,35 +with_mirrors,2022-07-09,35 +with_mirrors,2022-08-19,35 +without_mirrors,2022-05-10,35 +with_mirrors,2022-06-01,34 +with_mirrors,2022-06-03,34 +with_mirrors,2022-06-18,34 +with_mirrors,2022-07-19,34 +with_mirrors,2022-07-20,34 +with_mirrors,2022-05-30,33 +with_mirrors,2022-06-23,33 +without_mirrors,2022-08-03,33 +with_mirrors,2022-08-05,32 +with_mirrors,2022-06-10,31 +with_mirrors,2022-06-16,31 +without_mirrors,2022-06-14,31 +without_mirrors,2022-07-10,31 +with_mirrors,2022-04-03,30 +with_mirrors,2022-06-15,30 +with_mirrors,2022-06-28,30 +with_mirrors,2022-06-29,30 +with_mirrors,2022-05-22,29 +with_mirrors,2022-06-19,29 +with_mirrors,2022-07-27,29 +with_mirrors,2022-09-03,29 +without_mirrors,2022-09-14,29 +with_mirrors,2022-05-20,28 +with_mirrors,2022-05-27,28 +with_mirrors,2022-07-01,28 +with_mirrors,2022-04-10,27 +with_mirrors,2022-05-11,27 +with_mirrors,2022-07-08,27 +with_mirrors,2022-07-17,27 +with_mirrors,2022-06-21,26 +with_mirrors,2022-09-12,26 +with_mirrors,2022-09-06,24 +without_mirrors,2022-09-06,24 +with_mirrors,2022-04-12,23 +with_mirrors,2022-08-01,21 +with_mirrors,2022-09-02,21 +without_mirrors,2022-08-21,21 +with_mirrors,2022-07-23,20 +without_mirrors,2022-07-23,20 +with_mirrors,2022-08-07,19 +without_mirrors,2022-09-27,19 +with_mirrors,2022-05-28,18 +with_mirrors,2022-06-22,18 +with_mirrors,2022-09-20,18 +without_mirrors,2022-09-04,18 +without_mirrors,2022-09-09,18 +without_mirrors,2022-04-14,17 +without_mirrors,2022-05-17,17 +without_mirrors,2022-07-30,17 +without_mirrors,2022-08-23,17 +without_mirrors,2022-09-02,17 +with_mirrors,2022-05-26,16 +with_mirrors,2022-06-04,16 +with_mirrors,2022-07-31,16 +with_mirrors,2022-09-07,16 +with_mirrors,2022-09-24,16 +without_mirrors,2022-06-08,16 +without_mirrors,2022-08-26,16 +without_mirrors,2022-09-07,16 +with_mirrors,2022-06-13,15 +without_mirrors,2022-06-13,15 +with_mirrors,2022-05-14,14 +with_mirrors,2022-08-02,14 +with_mirrors,2022-08-29,14 +without_mirrors,2022-09-24,14 +with_mirrors,2022-05-21,13 +with_mirrors,2022-07-22,13 +with_mirrors,2022-09-21,13 +with_mirrors,2022-09-28,13 +without_mirrors,2022-07-22,13 +without_mirrors,2022-09-16,13 +without_mirrors,2022-09-18,13 +with_mirrors,2022-05-12,12 +with_mirrors,2022-08-04,12 +without_mirrors,2022-08-30,12 +without_mirrors,2022-09-12,12 +without_mirrors,2022-09-15,12 +with_mirrors,2022-04-04,11 +with_mirrors,2022-08-10,11 +with_mirrors,2022-08-28,11 +without_mirrors,2022-04-12,11 +without_mirrors,2022-09-19,11 +without_mirrors,2022-09-26,11 +without_mirrors,2022-09-28,11 +without_mirrors,2022-09-30,11 +with_mirrors,2022-04-05,10 +with_mirrors,2022-04-20,10 +with_mirrors,2022-09-17,10 +with_mirrors,2022-09-29,10 +without_mirrors,2022-04-15,10 +without_mirrors,2022-07-09,10 +without_mirrors,2022-09-29,10 +with_mirrors,2022-04-22,9 +with_mirrors,2022-04-29,9 +with_mirrors,2022-04-30,9 +with_mirrors,2022-05-02,9 +with_mirrors,2022-05-24,9 +with_mirrors,2022-05-29,9 +with_mirrors,2022-07-07,9 +without_mirrors,2022-04-19,9 +without_mirrors,2022-06-03,9 +without_mirrors,2022-07-07,9 +without_mirrors,2022-07-19,9 +without_mirrors,2022-09-01,9 +without_mirrors,2022-09-13,9 +with_mirrors,2022-07-28,8 +with_mirrors,2022-08-06,8 +with_mirrors,2022-08-17,8 +without_mirrors,2022-04-13,8 +without_mirrors,2022-05-19,8 +without_mirrors,2022-05-25,8 +without_mirrors,2022-06-17,8 +without_mirrors,2022-07-14,8 +without_mirrors,2022-07-28,8 +without_mirrors,2022-07-31,8 +without_mirrors,2022-08-17,8 +without_mirrors,2022-08-18,8 +without_mirrors,2022-08-24,8 +without_mirrors,2022-08-29,8 +without_mirrors,2022-09-22,8 +with_mirrors,2022-05-08,7 +with_mirrors,2022-05-15,7 +with_mirrors,2022-06-26,7 +with_mirrors,2022-06-30,7 +with_mirrors,2022-09-23,7 +without_mirrors,2022-05-15,7 +without_mirrors,2022-05-30,7 +without_mirrors,2022-06-04,7 +without_mirrors,2022-07-25,7 +without_mirrors,2022-08-15,7 +with_mirrors,2022-05-16,6 +with_mirrors,2022-05-18,6 +with_mirrors,2022-06-20,6 +with_mirrors,2022-08-11,6 +with_mirrors,2022-08-25,6 +without_mirrors,2022-04-06,6 +without_mirrors,2022-04-11,6 +without_mirrors,2022-04-21,6 +without_mirrors,2022-04-24,6 +without_mirrors,2022-04-26,6 +without_mirrors,2022-05-16,6 +without_mirrors,2022-05-26,6 +without_mirrors,2022-06-01,6 +without_mirrors,2022-06-06,6 +without_mirrors,2022-06-10,6 +without_mirrors,2022-06-11,6 +without_mirrors,2022-08-11,6 +without_mirrors,2022-08-19,6 +without_mirrors,2022-08-25,6 +without_mirrors,2022-09-05,6 +without_mirrors,2022-09-20,6 +without_mirrors,2022-09-23,6 +with_mirrors,2022-05-04,5 +with_mirrors,2022-05-05,5 +with_mirrors,2022-06-07,5 +with_mirrors,2022-06-12,5 +with_mirrors,2022-07-03,5 +with_mirrors,2022-08-14,5 +with_mirrors,2022-08-31,5 +with_mirrors,2022-09-25,5 +without_mirrors,2022-05-04,5 +without_mirrors,2022-05-05,5 +without_mirrors,2022-05-31,5 +without_mirrors,2022-06-07,5 +without_mirrors,2022-06-12,5 +without_mirrors,2022-06-15,5 +without_mirrors,2022-06-24,5 +without_mirrors,2022-06-26,5 +without_mirrors,2022-06-28,5 +without_mirrors,2022-06-30,5 +without_mirrors,2022-07-03,5 +without_mirrors,2022-07-05,5 +without_mirrors,2022-08-04,5 +without_mirrors,2022-08-09,5 +without_mirrors,2022-08-22,5 +without_mirrors,2022-08-31,5 +without_mirrors,2022-09-21,5 +without_mirrors,2022-09-25,5 +with_mirrors,2022-05-03,4 +with_mirrors,2022-05-23,4 +with_mirrors,2022-06-02,4 +with_mirrors,2022-06-09,4 +with_mirrors,2022-08-08,4 +without_mirrors,2022-04-05,4 +without_mirrors,2022-04-08,4 +without_mirrors,2022-05-03,4 +without_mirrors,2022-05-06,4 +without_mirrors,2022-05-07,4 +without_mirrors,2022-05-11,4 +without_mirrors,2022-05-23,4 +without_mirrors,2022-06-02,4 +without_mirrors,2022-06-19,4 +without_mirrors,2022-06-20,4 +without_mirrors,2022-07-21,4 +without_mirrors,2022-08-01,4 +without_mirrors,2022-08-02,4 +without_mirrors,2022-08-08,4 +without_mirrors,2022-08-12,4 +without_mirrors,2022-09-08,4 +with_mirrors,2022-05-09,3 +with_mirrors,2022-07-02,3 +with_mirrors,2022-07-06,3 +with_mirrors,2022-07-13,3 +with_mirrors,2022-07-15,3 +with_mirrors,2022-09-10,3 +with_mirrors,2022-09-11,3 +without_mirrors,2022-04-04,3 +without_mirrors,2022-04-07,3 +without_mirrors,2022-04-22,3 +without_mirrors,2022-04-29,3 +without_mirrors,2022-05-02,3 +without_mirrors,2022-05-09,3 +without_mirrors,2022-05-18,3 +without_mirrors,2022-05-24,3 +without_mirrors,2022-05-27,3 +without_mirrors,2022-05-29,3 +without_mirrors,2022-06-18,3 +without_mirrors,2022-06-23,3 +without_mirrors,2022-07-01,3 +without_mirrors,2022-07-02,3 +without_mirrors,2022-07-06,3 +without_mirrors,2022-07-13,3 +without_mirrors,2022-07-15,3 +without_mirrors,2022-07-20,3 +without_mirrors,2022-07-26,3 +without_mirrors,2022-07-27,3 +without_mirrors,2022-08-10,3 +without_mirrors,2022-08-14,3 +without_mirrors,2022-08-16,3 +without_mirrors,2022-08-20,3 +without_mirrors,2022-08-28,3 +without_mirrors,2022-09-11,3 +with_mirrors,2022-04-25,2 +with_mirrors,2022-05-13,2 +with_mirrors,2022-06-27,2 +with_mirrors,2022-07-11,2 +with_mirrors,2022-08-27,2 +without_mirrors,2022-04-17,2 +without_mirrors,2022-04-25,2 +without_mirrors,2022-04-28,2 +without_mirrors,2022-05-12,2 +without_mirrors,2022-05-13,2 +without_mirrors,2022-05-14,2 +without_mirrors,2022-05-20,2 +without_mirrors,2022-05-28,2 +without_mirrors,2022-06-09,2 +without_mirrors,2022-06-16,2 +without_mirrors,2022-06-22,2 +without_mirrors,2022-06-25,2 +without_mirrors,2022-06-27,2 +without_mirrors,2022-07-08,2 +without_mirrors,2022-07-11,2 +without_mirrors,2022-07-17,2 +without_mirrors,2022-08-05,2 +without_mirrors,2022-08-06,2 +without_mirrors,2022-08-07,2 +without_mirrors,2022-09-10,2 +with_mirrors,2022-04-18,1 +with_mirrors,2022-05-01,1 +with_mirrors,2022-06-05,1 +with_mirrors,2022-07-04,1 +with_mirrors,2022-07-12,1 +with_mirrors,2022-07-18,1 +without_mirrors,2022-04-03,1 +without_mirrors,2022-04-18,1 +without_mirrors,2022-04-23,1 +without_mirrors,2022-04-27,1 +without_mirrors,2022-04-30,1 +without_mirrors,2022-05-01,1 +without_mirrors,2022-05-08,1 +without_mirrors,2022-05-21,1 +without_mirrors,2022-06-05,1 +without_mirrors,2022-06-21,1 +without_mirrors,2022-06-29,1 +without_mirrors,2022-07-04,1 +without_mirrors,2022-07-12,1 +without_mirrors,2022-07-18,1 +without_mirrors,2022-08-13,1 with_mirrors,2022-03-05,259 +with_mirrors,2022-03-18,255 with_mirrors,2022-03-07,246 with_mirrors,2022-03-04,203 with_mirrors,2022-03-08,150 -with_mirrors,2021-12-02,146 -with_mirrors,2021-12-09,136 -with_mirrors,2021-12-01,120 with_mirrors,2022-03-09,114 with_mirrors,2022-03-10,114 -with_mirrors,2021-12-08,106 with_mirrors,2022-03-11,98 with_mirrors,2022-03-06,96 -with_mirrors,2021-12-10,88 -with_mirrors,2022-02-21,88 -with_mirrors,2021-12-18,84 -with_mirrors,2021-12-16,75 -with_mirrors,2021-12-24,73 -with_mirrors,2021-09-20,72 +with_mirrors,2022-03-22,91 +with_mirrors,2022-04-02,87 +without_mirrors,2022-03-18,87 +with_mirrors,2022-03-25,86 +with_mirrors,2022-04-01,86 +with_mirrors,2022-03-30,84 +with_mirrors,2022-03-24,79 +with_mirrors,2022-03-21,76 +with_mirrors,2022-03-20,75 with_mirrors,2022-03-12,71 -with_mirrors,2021-10-04,67 -with_mirrors,2022-01-12,67 -with_mirrors,2022-02-03,67 -with_mirrors,2021-12-06,66 +with_mirrors,2022-03-29,66 without_mirrors,2022-03-10,65 -with_mirrors,2021-12-17,63 -with_mirrors,2022-01-19,63 -with_mirrors,2021-12-23,62 +with_mirrors,2022-03-19,64 +with_mirrors,2022-03-28,62 +with_mirrors,2022-03-26,60 +without_mirrors,2022-03-07,59 +with_mirrors,2022-03-14,47 +with_mirrors,2022-03-31,47 +without_mirrors,2022-03-04,47 +with_mirrors,2022-03-17,36 +with_mirrors,2022-03-15,35 +with_mirrors,2022-03-13,34 +without_mirrors,2022-03-15,31 +without_mirrors,2022-03-30,30 +without_mirrors,2022-03-13,28 +with_mirrors,2022-03-27,27 +without_mirrors,2022-03-08,27 +without_mirrors,2022-03-27,27 +without_mirrors,2022-03-28,27 +without_mirrors,2022-04-02,27 +with_mirrors,2022-03-23,26 +with_mirrors,2022-03-16,24 +without_mirrors,2022-03-24,21 +without_mirrors,2022-03-09,16 +without_mirrors,2022-03-14,14 +without_mirrors,2022-03-16,14 +without_mirrors,2022-03-05,13 +without_mirrors,2022-03-22,12 +without_mirrors,2022-03-29,12 +without_mirrors,2022-03-23,7 +without_mirrors,2022-03-25,7 +without_mirrors,2022-03-11,6 +without_mirrors,2022-03-19,6 +without_mirrors,2022-03-31,6 +without_mirrors,2022-03-12,5 +without_mirrors,2022-03-20,5 +without_mirrors,2022-03-21,5 +without_mirrors,2022-04-01,5 +without_mirrors,2022-03-17,4 +without_mirrors,2022-03-26,4 +without_mirrors,2022-03-06,2 +with_mirrors,2022-02-21,88 +with_mirrors,2022-02-03,67 without_mirrors,2022-02-21,62 with_mirrors,2022-02-22,61 -without_mirrors,2022-03-07,59 with_mirrors,2022-02-27,57 -with_mirrors,2022-01-21,53 -with_mirrors,2022-01-22,52 -with_mirrors,2021-09-21,50 -with_mirrors,2021-12-03,50 with_mirrors,2022-02-10,49 -with_mirrors,2021-12-22,48 -with_mirrors,2022-01-03,48 -with_mirrors,2022-01-08,48 with_mirrors,2022-02-06,48 with_mirrors,2022-02-04,47 with_mirrors,2022-02-24,47 -with_mirrors,2022-03-14,47 -without_mirrors,2022-03-04,47 -with_mirrors,2021-11-04,46 with_mirrors,2022-03-02,46 without_mirrors,2022-03-02,46 -with_mirrors,2022-01-24,44 -with_mirrors,2021-11-17,43 without_mirrors,2022-02-22,42 -with_mirrors,2021-11-20,41 -with_mirrors,2021-12-04,41 -with_mirrors,2022-01-01,40 -with_mirrors,2021-11-22,39 with_mirrors,2022-02-20,39 -with_mirrors,2021-11-14,37 -with_mirrors,2021-12-11,37 -without_mirrors,2021-12-04,37 -with_mirrors,2021-12-19,36 -without_mirrors,2021-09-20,36 -with_mirrors,2021-10-03,35 -with_mirrors,2021-10-22,35 -with_mirrors,2021-10-25,35 -with_mirrors,2021-12-20,35 -with_mirrors,2022-03-15,35 -with_mirrors,2021-11-24,34 -with_mirrors,2022-03-13,34 -with_mirrors,2021-11-01,33 -with_mirrors,2021-11-02,33 -with_mirrors,2021-09-28,32 -with_mirrors,2021-10-17,32 -with_mirrors,2021-11-27,32 +with_mirrors,2022-02-09,31 +with_mirrors,2022-02-14,31 +with_mirrors,2022-02-25,30 +with_mirrors,2022-02-19,25 +with_mirrors,2022-02-07,24 +with_mirrors,2022-03-01,24 +with_mirrors,2022-03-03,24 +without_mirrors,2022-03-01,24 +with_mirrors,2022-02-02,20 +with_mirrors,2022-02-08,20 +without_mirrors,2022-02-20,20 +without_mirrors,2022-02-27,19 +with_mirrors,2022-02-05,18 +with_mirrors,2022-02-28,17 +with_mirrors,2022-02-15,16 +with_mirrors,2022-02-23,14 +with_mirrors,2022-02-16,13 +with_mirrors,2022-02-26,12 +without_mirrors,2022-02-26,12 +with_mirrors,2022-02-01,11 +without_mirrors,2022-02-07,10 +without_mirrors,2022-02-06,8 +without_mirrors,2022-02-14,8 +without_mirrors,2022-02-15,8 +with_mirrors,2022-02-13,7 +without_mirrors,2022-02-28,7 +without_mirrors,2022-02-16,6 +without_mirrors,2022-02-23,6 +without_mirrors,2022-02-01,5 +without_mirrors,2022-02-03,5 +without_mirrors,2022-02-04,5 +without_mirrors,2022-02-05,5 +without_mirrors,2022-02-10,5 +without_mirrors,2022-02-13,5 +without_mirrors,2022-02-25,5 +without_mirrors,2022-03-03,5 +with_mirrors,2022-02-11,4 +without_mirrors,2022-02-08,4 +without_mirrors,2022-02-09,4 +with_mirrors,2022-02-12,3 +without_mirrors,2022-02-11,3 +without_mirrors,2022-02-12,3 +without_mirrors,2022-02-24,3 +with_mirrors,2022-02-17,2 +with_mirrors,2022-02-18,2 +without_mirrors,2022-02-17,2 +without_mirrors,2022-02-18,2 +without_mirrors,2022-02-19,2 +without_mirrors,2022-02-02,1 +with_mirrors,2022-01-12,67 +with_mirrors,2022-01-19,63 +with_mirrors,2022-01-21,53 +with_mirrors,2022-01-22,52 +with_mirrors,2022-01-03,48 +with_mirrors,2022-01-08,48 +with_mirrors,2022-01-24,44 +with_mirrors,2022-01-01,40 with_mirrors,2022-01-29,32 -with_mirrors,2021-11-29,31 with_mirrors,2022-01-16,31 with_mirrors,2022-01-28,31 -with_mirrors,2022-02-09,31 -with_mirrors,2022-02-14,31 -without_mirrors,2022-03-15,31 -with_mirrors,2021-09-23,30 with_mirrors,2022-01-06,30 -with_mirrors,2022-02-25,30 -with_mirrors,2021-09-30,29 with_mirrors,2022-01-04,29 +with_mirrors,2022-01-10,28 +with_mirrors,2022-01-14,28 +with_mirrors,2022-01-20,27 +with_mirrors,2022-01-11,26 +with_mirrors,2022-01-05,24 +without_mirrors,2022-01-21,24 +without_mirrors,2022-01-10,23 +with_mirrors,2022-01-02,21 +with_mirrors,2022-01-17,16 +with_mirrors,2022-01-15,14 +with_mirrors,2022-01-13,13 +without_mirrors,2022-01-08,9 +without_mirrors,2022-01-29,9 +with_mirrors,2022-01-23,8 +with_mirrors,2022-01-31,8 +without_mirrors,2022-01-17,8 +without_mirrors,2022-01-31,8 +with_mirrors,2022-01-07,7 +without_mirrors,2022-01-04,6 +without_mirrors,2022-01-24,6 +without_mirrors,2022-01-13,5 +without_mirrors,2022-01-14,5 +without_mirrors,2022-01-19,5 +without_mirrors,2022-01-01,4 +without_mirrors,2022-01-03,4 +without_mirrors,2022-01-15,4 +without_mirrors,2022-01-20,4 +with_mirrors,2022-01-18,3 +with_mirrors,2022-01-25,3 +without_mirrors,2022-01-05,3 +without_mirrors,2022-01-11,3 +without_mirrors,2022-01-18,3 +without_mirrors,2022-01-22,3 +with_mirrors,2022-01-27,2 +with_mirrors,2022-01-30,2 +without_mirrors,2022-01-06,2 +without_mirrors,2022-01-07,2 +without_mirrors,2022-01-12,2 +without_mirrors,2022-01-16,2 +without_mirrors,2022-01-27,2 +without_mirrors,2022-01-30,2 +with_mirrors,2022-01-09,1 +with_mirrors,2022-01-26,1 +without_mirrors,2022-01-02,1 +without_mirrors,2022-01-09,1 +without_mirrors,2022-01-25,1 +without_mirrors,2022-01-26,1 +with_mirrors,2021-12-02,146 +with_mirrors,2021-12-09,136 +with_mirrors,2021-12-08,106 +with_mirrors,2021-12-10,88 +with_mirrors,2021-12-18,84 +with_mirrors,2021-12-16,75 +with_mirrors,2021-12-24,73 +with_mirrors,2021-12-06,66 +with_mirrors,2021-12-17,63 +with_mirrors,2021-12-23,62 +with_mirrors,2021-12-03,50 +with_mirrors,2021-12-22,48 +with_mirrors,2021-12-04,41 +with_mirrors,2021-12-11,37 +without_mirrors,2021-12-04,37 +with_mirrors,2021-12-19,36 +with_mirrors,2021-12-20,35 without_mirrors,2021-12-08,29 -with_mirrors,2021-10-15,28 with_mirrors,2021-12-13,28 with_mirrors,2021-12-15,28 -with_mirrors,2022-01-10,28 -with_mirrors,2022-01-14,28 without_mirrors,2021-12-02,28 without_mirrors,2021-12-09,28 without_mirrors,2021-12-16,28 -without_mirrors,2022-03-13,28 -with_mirrors,2021-09-25,27 -with_mirrors,2022-01-20,27 -without_mirrors,2022-03-08,27 +with_mirrors,2021-12-07,24 +with_mirrors,2021-12-12,23 +with_mirrors,2021-12-29,21 +without_mirrors,2021-12-10,15 +with_mirrors,2021-12-27,13 +with_mirrors,2021-12-31,13 +without_mirrors,2021-12-13,13 +with_mirrors,2021-12-25,12 +with_mirrors,2021-12-21,11 +without_mirrors,2021-12-17,11 +without_mirrors,2021-12-03,10 +with_mirrors,2021-12-05,9 +without_mirrors,2021-12-27,9 +without_mirrors,2021-12-18,8 +without_mirrors,2021-12-22,8 +with_mirrors,2021-12-14,7 +without_mirrors,2021-12-19,7 +without_mirrors,2021-12-20,6 +without_mirrors,2021-12-21,6 +without_mirrors,2021-12-23,6 +without_mirrors,2021-12-06,5 +without_mirrors,2021-12-12,5 +without_mirrors,2021-12-14,5 +without_mirrors,2021-12-15,5 +without_mirrors,2021-12-24,4 +without_mirrors,2021-12-05,3 +without_mirrors,2021-12-07,3 +without_mirrors,2021-12-31,3 +with_mirrors,2021-12-28,2 +without_mirrors,2021-12-11,2 +without_mirrors,2021-12-25,2 +without_mirrors,2021-12-28,2 +without_mirrors,2021-12-29,2 +with_mirrors,2021-12-01,120 +with_mirrors,2021-11-04,46 +with_mirrors,2021-11-17,43 +with_mirrors,2021-11-20,41 +with_mirrors,2021-11-22,39 +with_mirrors,2021-11-14,37 +with_mirrors,2021-11-24,34 +with_mirrors,2021-11-01,33 +with_mirrors,2021-11-02,33 +with_mirrors,2021-11-27,32 +with_mirrors,2021-11-29,31 with_mirrors,2021-11-18,26 -with_mirrors,2022-01-11,26 -with_mirrors,2021-10-29,25 with_mirrors,2021-11-08,25 -with_mirrors,2022-02-19,25 without_mirrors,2021-12-01,25 -with_mirrors,2021-10-28,24 -with_mirrors,2021-10-31,24 -with_mirrors,2021-12-07,24 -with_mirrors,2022-01-05,24 -with_mirrors,2022-02-07,24 -with_mirrors,2022-03-01,24 -with_mirrors,2022-03-03,24 -with_mirrors,2022-03-16,24 -without_mirrors,2022-01-21,24 -without_mirrors,2022-03-01,24 -with_mirrors,2021-10-02,23 with_mirrors,2021-11-13,23 -with_mirrors,2021-12-12,23 -without_mirrors,2022-01-10,23 with_mirrors,2021-11-15,22 -with_mirrors,2021-09-29,21 -with_mirrors,2021-12-29,21 -with_mirrors,2022-01-02,21 -with_mirrors,2021-10-27,20 with_mirrors,2021-11-05,20 with_mirrors,2021-11-16,20 with_mirrors,2021-11-25,20 -with_mirrors,2022-02-02,20 -with_mirrors,2022-02-08,20 -without_mirrors,2021-10-03,20 -without_mirrors,2021-10-04,20 -without_mirrors,2021-10-27,20 without_mirrors,2021-11-16,20 -without_mirrors,2022-02-20,20 -with_mirrors,2021-10-06,19 with_mirrors,2021-11-12,19 with_mirrors,2021-11-30,19 -without_mirrors,2022-02-27,19 -with_mirrors,2021-09-22,18 -with_mirrors,2021-10-21,18 -with_mirrors,2022-02-05,18 -with_mirrors,2021-09-19,17 -with_mirrors,2021-10-08,17 -with_mirrors,2021-10-11,17 -with_mirrors,2021-10-16,17 -with_mirrors,2022-02-28,17 -without_mirrors,2021-10-08,17 without_mirrors,2021-11-04,17 -with_mirrors,2021-09-26,16 -with_mirrors,2021-10-20,16 -with_mirrors,2021-10-30,16 -with_mirrors,2022-01-17,16 -with_mirrors,2022-02-15,16 -without_mirrors,2021-10-30,16 -without_mirrors,2022-03-09,16 -with_mirrors,2021-10-18,15 with_mirrors,2021-11-19,15 -without_mirrors,2021-12-10,15 -with_mirrors,2021-10-26,14 -with_mirrors,2022-01-15,14 -with_mirrors,2022-02-23,14 without_mirrors,2021-11-05,14 without_mirrors,2021-11-22,14 without_mirrors,2021-11-25,14 -without_mirrors,2022-03-14,14 -without_mirrors,2022-03-16,14 -with_mirrors,2021-10-01,13 -with_mirrors,2021-10-09,13 with_mirrors,2021-11-11,13 with_mirrors,2021-11-23,13 -with_mirrors,2021-12-27,13 -with_mirrors,2021-12-31,13 -with_mirrors,2022-01-13,13 -with_mirrors,2022-02-16,13 without_mirrors,2021-11-12,13 -without_mirrors,2021-12-13,13 -without_mirrors,2022-03-05,13 -with_mirrors,2021-12-25,12 -with_mirrors,2022-02-26,12 -without_mirrors,2021-10-26,12 -without_mirrors,2021-10-31,12 -without_mirrors,2022-02-26,12 with_mirrors,2021-11-03,11 -with_mirrors,2021-12-21,11 -with_mirrors,2022-02-01,11 without_mirrors,2021-11-01,11 without_mirrors,2021-11-03,11 without_mirrors,2021-11-15,11 without_mirrors,2021-11-17,11 without_mirrors,2021-11-20,11 -without_mirrors,2021-12-17,11 with_mirrors,2021-11-28,10 -without_mirrors,2021-10-29,10 without_mirrors,2021-11-02,10 -without_mirrors,2021-12-03,10 -without_mirrors,2022-02-07,10 -with_mirrors,2021-10-13,9 with_mirrors,2021-11-10,9 -with_mirrors,2021-12-05,9 -without_mirrors,2021-10-28,9 without_mirrors,2021-11-10,9 without_mirrors,2021-11-19,9 without_mirrors,2021-11-30,9 -without_mirrors,2021-12-27,9 -without_mirrors,2022-01-08,9 -without_mirrors,2022-01-29,9 -with_mirrors,2021-09-27,8 -with_mirrors,2021-10-05,8 -with_mirrors,2022-01-23,8 -with_mirrors,2022-01-31,8 -without_mirrors,2021-10-02,8 without_mirrors,2021-11-13,8 without_mirrors,2021-11-29,8 -without_mirrors,2021-12-18,8 -without_mirrors,2021-12-22,8 -without_mirrors,2022-01-17,8 -without_mirrors,2022-01-31,8 -without_mirrors,2022-02-06,8 -without_mirrors,2022-02-14,8 -without_mirrors,2022-02-15,8 with_mirrors,2021-11-21,7 -with_mirrors,2021-12-14,7 -with_mirrors,2022-01-07,7 -with_mirrors,2022-02-13,7 -without_mirrors,2021-09-30,7 -without_mirrors,2021-10-01,7 -without_mirrors,2021-10-05,7 without_mirrors,2021-11-11,7 without_mirrors,2021-11-14,7 without_mirrors,2021-11-18,7 without_mirrors,2021-11-21,7 without_mirrors,2021-11-23,7 without_mirrors,2021-11-24,7 -without_mirrors,2021-12-19,7 -without_mirrors,2022-02-28,7 with_mirrors,2021-11-09,6 -without_mirrors,2021-09-29,6 without_mirrors,2021-11-08,6 without_mirrors,2021-11-09,6 -without_mirrors,2021-12-20,6 -without_mirrors,2021-12-21,6 -without_mirrors,2021-12-23,6 -without_mirrors,2022-01-04,6 -without_mirrors,2022-01-24,6 -without_mirrors,2022-02-16,6 -without_mirrors,2022-02-23,6 -without_mirrors,2022-03-11,6 -with_mirrors,2021-10-19,5 -with_mirrors,2021-10-23,5 with_mirrors,2021-11-06,5 -without_mirrors,2021-09-21,5 -without_mirrors,2021-09-27,5 -without_mirrors,2021-10-09,5 -without_mirrors,2021-10-19,5 -without_mirrors,2021-10-22,5 -without_mirrors,2021-10-23,5 without_mirrors,2021-11-06,5 without_mirrors,2021-11-27,5 -without_mirrors,2021-12-06,5 -without_mirrors,2021-12-12,5 -without_mirrors,2021-12-14,5 -without_mirrors,2021-12-15,5 -without_mirrors,2022-01-13,5 -without_mirrors,2022-01-14,5 -without_mirrors,2022-01-19,5 -without_mirrors,2022-02-01,5 -without_mirrors,2022-02-03,5 -without_mirrors,2022-02-04,5 -without_mirrors,2022-02-05,5 -without_mirrors,2022-02-10,5 -without_mirrors,2022-02-13,5 -without_mirrors,2022-02-25,5 -without_mirrors,2022-03-03,5 -without_mirrors,2022-03-12,5 with_mirrors,2021-11-07,4 -with_mirrors,2022-02-11,4 -without_mirrors,2021-09-25,4 -without_mirrors,2021-10-06,4 without_mirrors,2021-11-07,4 without_mirrors,2021-11-28,4 -without_mirrors,2021-12-24,4 -without_mirrors,2022-01-01,4 -without_mirrors,2022-01-03,4 -without_mirrors,2022-01-15,4 -without_mirrors,2022-01-20,4 -without_mirrors,2022-02-08,4 -without_mirrors,2022-02-09,4 with_mirrors,2021-11-26,3 -with_mirrors,2022-01-18,3 -with_mirrors,2022-01-25,3 -with_mirrors,2022-02-12,3 +without_mirrors,2021-11-26,3 +with_mirrors,2021-10-04,67 +with_mirrors,2021-10-03,35 +with_mirrors,2021-10-22,35 +with_mirrors,2021-10-25,35 +with_mirrors,2021-10-17,32 +with_mirrors,2021-10-15,28 +with_mirrors,2021-10-29,25 +with_mirrors,2021-10-28,24 +with_mirrors,2021-10-31,24 +with_mirrors,2021-10-02,23 +with_mirrors,2021-10-27,20 +without_mirrors,2021-10-03,20 +without_mirrors,2021-10-04,20 +without_mirrors,2021-10-27,20 +with_mirrors,2021-10-06,19 +with_mirrors,2021-10-21,18 +with_mirrors,2021-10-08,17 +with_mirrors,2021-10-11,17 +with_mirrors,2021-10-16,17 +without_mirrors,2021-10-08,17 +with_mirrors,2021-10-20,16 +with_mirrors,2021-10-30,16 +without_mirrors,2021-10-30,16 +with_mirrors,2021-10-18,15 +with_mirrors,2021-10-26,14 +with_mirrors,2021-10-09,13 +without_mirrors,2021-10-26,12 +without_mirrors,2021-10-31,12 +without_mirrors,2021-10-29,10 +with_mirrors,2021-10-13,9 +without_mirrors,2021-10-28,9 +with_mirrors,2021-10-05,8 +without_mirrors,2021-10-02,8 +without_mirrors,2021-10-05,7 +with_mirrors,2021-10-19,5 +with_mirrors,2021-10-23,5 +without_mirrors,2021-10-09,5 +without_mirrors,2021-10-19,5 +without_mirrors,2021-10-22,5 +without_mirrors,2021-10-23,5 +without_mirrors,2021-10-06,4 without_mirrors,2021-10-13,3 without_mirrors,2021-10-15,3 without_mirrors,2021-10-25,3 -without_mirrors,2021-11-26,3 -without_mirrors,2021-12-05,3 -without_mirrors,2021-12-07,3 -without_mirrors,2021-12-31,3 -without_mirrors,2022-01-05,3 -without_mirrors,2022-01-11,3 -without_mirrors,2022-01-18,3 -without_mirrors,2022-01-22,3 -without_mirrors,2022-02-11,3 -without_mirrors,2022-02-12,3 -without_mirrors,2022-02-24,3 -with_mirrors,2021-09-17,2 -with_mirrors,2021-09-18,2 -with_mirrors,2021-09-24,2 with_mirrors,2021-10-07,2 with_mirrors,2021-10-10,2 -with_mirrors,2021-12-28,2 -with_mirrors,2022-01-27,2 -with_mirrors,2022-01-30,2 -with_mirrors,2022-02-17,2 -with_mirrors,2022-02-18,2 -without_mirrors,2021-09-17,2 -without_mirrors,2021-09-18,2 -without_mirrors,2021-09-19,2 -without_mirrors,2021-09-24,2 -without_mirrors,2021-09-28,2 without_mirrors,2021-10-07,2 without_mirrors,2021-10-10,2 without_mirrors,2021-10-11,2 without_mirrors,2021-10-16,2 without_mirrors,2021-10-17,2 without_mirrors,2021-10-21,2 -without_mirrors,2021-12-11,2 -without_mirrors,2021-12-25,2 -without_mirrors,2021-12-28,2 -without_mirrors,2021-12-29,2 -without_mirrors,2022-01-06,2 -without_mirrors,2022-01-07,2 -without_mirrors,2022-01-12,2 -without_mirrors,2022-01-16,2 -without_mirrors,2022-01-27,2 -without_mirrors,2022-01-30,2 -without_mirrors,2022-02-17,2 -without_mirrors,2022-02-18,2 -without_mirrors,2022-02-19,2 -without_mirrors,2022-03-06,2 -with_mirrors,2022-01-09,1 -with_mirrors,2022-01-26,1 +without_mirrors,2021-10-20,1 +with_mirrors,2021-09-20,72 +with_mirrors,2021-09-21,50 +without_mirrors,2021-09-20,36 +with_mirrors,2021-09-28,32 +with_mirrors,2021-09-23,30 +with_mirrors,2021-09-30,29 +with_mirrors,2021-09-25,27 +with_mirrors,2021-09-29,21 +with_mirrors,2021-09-22,18 +with_mirrors,2021-09-19,17 +with_mirrors,2021-09-26,16 +with_mirrors,2021-10-01,13 +with_mirrors,2021-09-27,8 +without_mirrors,2021-09-30,7 +without_mirrors,2021-10-01,7 +without_mirrors,2021-09-29,6 +without_mirrors,2021-09-21,5 +without_mirrors,2021-09-27,5 +without_mirrors,2021-09-25,4 +with_mirrors,2021-09-17,2 +with_mirrors,2021-09-18,2 +with_mirrors,2021-09-24,2 +without_mirrors,2021-09-17,2 +without_mirrors,2021-09-18,2 +without_mirrors,2021-09-19,2 +without_mirrors,2021-09-24,2 +without_mirrors,2021-09-28,2 without_mirrors,2021-09-22,1 without_mirrors,2021-09-26,1 -without_mirrors,2021-10-20,1 -without_mirrors,2022-01-02,1 -without_mirrors,2022-01-09,1 -without_mirrors,2022-01-25,1 -without_mirrors,2022-01-26,1 -without_mirrors,2022-02-02,1 with_mirrors,2021-07-06,63 with_mirrors,2021-08-16,62 with_mirrors,2021-07-20,57 diff --git a/doc/source/tracking/pypistats/get_pypi_stats.py b/doc/source/tracking/pypistats/get_pypi_stats.py index c5340e448..d137b99c3 100644 --- a/doc/source/tracking/pypistats/get_pypi_stats.py +++ b/doc/source/tracking/pypistats/get_pypi_stats.py @@ -18,11 +18,13 @@ # exist_downloads = exist_downloads[exist_downloads.category != "Total"] dl_data = downloads.merge( exist_downloads, how="outer", on=["category", "date", "downloads"] -).reindex() +) # except: # dl_data = downloads -dl_data.to_csv(trackpath + downloadfn, index=False) +dl_data.sort_values(["category", "date"], ignore_index=True).to_csv( + trackpath + downloadfn, index=False +) sysdownloads = pypistats.system("icepyx", total=True, format="pandas").drop( columns=["percent"] @@ -36,11 +38,13 @@ exist_sysdownloads["category"] = exist_sysdownloads["category"].fillna("null") sysdl_data = sysdownloads.merge( exist_sysdownloads, how="outer", on=["category", "date", "downloads"] -).reindex() +) # except: # dl_data = sysdownloads -sysdl_data.to_csv(trackpath + sysdownloadfn, index=False) +sysdl_data.sort_values(["category", "date"], ignore_index=True).to_csv( + trackpath + sysdownloadfn, index=False +) dl_data = dl_data.groupby("category").get_group("without_mirrors").sort_values("date") diff --git a/doc/source/tracking/pypistats/sys_downloads_data.csv b/doc/source/tracking/pypistats/sys_downloads_data.csv index 95ebd07ae..710550ea5 100644 --- a/doc/source/tracking/pypistats/sys_downloads_data.csv +++ b/doc/source/tracking/pypistats/sys_downloads_data.csv @@ -1,204 +1,474 @@ category,date,downloads +null,2022-07-29,35 +null,2022-08-03,31 +null,2022-05-10,29 +null,2022-07-10,27 +null,2022-06-14,25 +Linux,2022-09-06,21 +null,2022-08-21,20 +Linux,2022-09-02,17 +Linux,2022-09-04,17 +Linux,2022-08-26,16 +null,2022-05-17,16 +null,2022-07-30,16 +Linux,2022-09-09,14 +Linux,2022-09-14,14 +null,2022-07-23,14 +Windows,2022-04-14,14 +null,2022-06-13,13 +null,2022-09-18,13 +Windows,2022-06-08,13 +Windows,2022-09-14,13 +null,2022-09-24,12 +Linux,2022-09-07,11 +Linux,2022-09-12,11 +Linux,2022-09-15,11 +Linux,2022-09-16,11 +null,2022-07-22,11 +null,2022-09-27,11 +Linux,2022-09-30,10 +Windows,2022-07-09,10 +Windows,2022-09-19,10 +Linux,2022-07-07,8 +Linux,2022-08-30,8 +Linux,2022-05-25,7 +Linux,2022-08-15,7 +Linux,2022-08-23,7 +Linux,2022-08-29,7 +Linux,2022-09-01,7 +Linux,2022-09-13,7 +Linux,2022-09-29,7 +null,2022-04-15,7 +null,2022-04-19,7 +Linux,2022-06-11,6 +Linux,2022-08-17,6 +Linux,2022-08-19,6 +Linux,2022-09-05,6 +Linux,2022-09-28,6 +null,2022-04-12,6 +null,2022-04-13,6 +null,2022-06-04,6 +null,2022-07-31,6 +null,2022-09-26,6 +Windows,2022-04-11,6 +Linux,2022-06-03,5 +Linux,2022-07-25,5 +Linux,2022-07-29,5 +Linux,2022-08-25,5 +Linux,2022-09-27,5 +null,2022-05-15,5 +null,2022-05-16,5 +null,2022-05-19,5 +null,2022-07-19,5 +null,2022-08-23,5 +Windows,2022-04-06,5 +Windows,2022-05-04,5 +Windows,2022-07-14,5 +Windows,2022-07-23,5 +Windows,2022-09-23,5 +Linux,2022-05-23,4 +Linux,2022-06-06,4 +Linux,2022-06-07,4 +Linux,2022-06-12,4 +Linux,2022-06-14,4 +Linux,2022-06-15,4 +Linux,2022-06-17,4 +Linux,2022-08-31,4 +Linux,2022-09-22,4 +Linux,2022-09-26,4 +null,2022-04-24,4 +null,2022-04-26,4 +null,2022-06-01,4 +null,2022-07-28,4 +null,2022-08-01,4 +null,2022-08-18,4 +Windows,2022-05-10,4 +Windows,2022-05-11,4 +Windows,2022-08-23,4 +Windows,2022-08-24,4 +Windows,2022-09-20,4 +Linux,2022-05-03,3 +Linux,2022-05-07,3 +Linux,2022-05-26,3 +Linux,2022-05-31,3 +Linux,2022-06-19,3 +Linux,2022-06-20,3 +Linux,2022-06-26,3 +Linux,2022-06-28,3 +Linux,2022-07-19,3 +Linux,2022-07-20,3 +Linux,2022-07-28,3 +Linux,2022-08-10,3 +Linux,2022-08-11,3 +Linux,2022-08-16,3 +Linux,2022-08-18,3 +Linux,2022-08-20,3 +Linux,2022-08-22,3 +Linux,2022-08-24,3 +null,2022-04-08,3 +null,2022-05-26,3 +null,2022-06-03,3 +null,2022-06-17,3 +null,2022-08-04,3 +null,2022-08-28,3 +null,2022-09-11,3 +null,2022-09-25,3 +Windows,2022-04-12,3 +Windows,2022-04-15,3 +Windows,2022-04-21,3 +Windows,2022-04-29,3 +Windows,2022-05-06,3 +Windows,2022-05-19,3 +Windows,2022-06-24,3 +Windows,2022-07-21,3 +Windows,2022-08-11,3 +Windows,2022-08-30,3 +Windows,2022-09-07,3 +Windows,2022-09-09,3 +Windows,2022-09-27,3 +Windows,2022-09-28,3 +Darwin,2022-05-30,2 +Darwin,2022-06-10,2 +Darwin,2022-09-20,2 +Linux,2022-04-04,2 +Linux,2022-04-12,2 +Linux,2022-04-26,2 +Linux,2022-06-16,2 +Linux,2022-06-24,2 +Linux,2022-06-30,2 +Linux,2022-07-02,2 +Linux,2022-07-05,2 +Linux,2022-07-06,2 +Linux,2022-07-10,2 +Linux,2022-07-26,2 +Linux,2022-08-02,2 +Linux,2022-08-08,2 +Linux,2022-08-09,2 +Linux,2022-08-14,2 +Linux,2022-09-08,2 +Linux,2022-09-21,2 +Linux,2022-09-25,2 +null,2022-04-14,2 +null,2022-04-21,2 +null,2022-05-05,2 +null,2022-05-14,2 +null,2022-05-18,2 +null,2022-05-29,2 +null,2022-05-30,2 +null,2022-06-02,2 +null,2022-06-08,2 +null,2022-06-26,2 +null,2022-06-30,2 +null,2022-07-03,2 +null,2022-07-05,2 +null,2022-07-14,2 +null,2022-07-17,2 +null,2022-07-27,2 +null,2022-08-02,2 +null,2022-08-07,2 +null,2022-08-08,2 +null,2022-08-09,2 +null,2022-08-12,2 +null,2022-09-01,2 +null,2022-09-07,2 +null,2022-09-10,2 +null,2022-09-14,2 +null,2022-09-28,2 +Windows,2022-04-05,2 +Windows,2022-04-07,2 +Windows,2022-04-13,2 +Windows,2022-04-22,2 +Windows,2022-05-05,2 +Windows,2022-05-27,2 +Windows,2022-05-30,2 +Windows,2022-06-01,2 +Windows,2022-06-02,2 +Windows,2022-06-06,2 +Windows,2022-06-09,2 +Windows,2022-06-10,2 +Windows,2022-06-14,2 +Windows,2022-06-22,2 +Windows,2022-06-23,2 +Windows,2022-06-25,2 +Windows,2022-06-28,2 +Windows,2022-07-01,2 +Windows,2022-07-03,2 +Windows,2022-07-10,2 +Windows,2022-07-15,2 +Windows,2022-07-25,2 +Windows,2022-07-31,2 +Windows,2022-09-06,2 +Windows,2022-09-21,2 +Windows,2022-09-22,2 +Windows,2022-09-29,2 +Darwin,2022-04-05,1 +Darwin,2022-04-14,1 +Darwin,2022-05-02,1 +Darwin,2022-05-09,1 +Darwin,2022-05-10,1 +Darwin,2022-05-12,1 +Darwin,2022-05-13,1 +Darwin,2022-05-24,1 +Darwin,2022-07-04,1 +Darwin,2022-07-05,1 +Darwin,2022-07-29,1 +Darwin,2022-08-12,1 +Darwin,2022-08-18,1 +Darwin,2022-08-23,1 +Darwin,2022-08-31,1 +Darwin,2022-09-08,1 +Darwin,2022-09-13,1 +Darwin,2022-09-21,1 +Darwin,2022-09-22,1 +Darwin,2022-09-23,1 +Darwin,2022-09-29,1 +Darwin,2022-09-30,1 +Linux,2022-04-19,1 +Linux,2022-04-21,1 +Linux,2022-04-24,1 +Linux,2022-05-02,1 +Linux,2022-05-05,1 +Linux,2022-05-06,1 +Linux,2022-05-08,1 +Linux,2022-05-09,1 +Linux,2022-05-10,1 +Linux,2022-05-15,1 +Linux,2022-05-16,1 +Linux,2022-05-24,1 +Linux,2022-05-27,1 +Linux,2022-05-28,1 +Linux,2022-05-29,1 +Linux,2022-05-30,1 +Linux,2022-06-08,1 +Linux,2022-06-10,1 +Linux,2022-06-13,1 +Linux,2022-06-18,1 +Linux,2022-06-27,1 +Linux,2022-07-03,1 +Linux,2022-07-08,1 +Linux,2022-07-11,1 +Linux,2022-07-13,1 +Linux,2022-07-14,1 +Linux,2022-07-15,1 +Linux,2022-07-21,1 +Linux,2022-07-22,1 +Linux,2022-07-23,1 +Linux,2022-07-30,1 +Linux,2022-08-03,1 +Linux,2022-08-04,1 +Linux,2022-08-06,1 +Linux,2022-08-12,1 +Linux,2022-09-24,1 +null,2022-04-05,1 +null,2022-04-06,1 +null,2022-04-07,1 +null,2022-04-17,1 +null,2022-04-18,1 +null,2022-04-22,1 +null,2022-04-25,1 +null,2022-04-28,1 +null,2022-04-30,1 +null,2022-05-01,1 +null,2022-05-07,1 +null,2022-05-20,1 +null,2022-05-31,1 +null,2022-06-05,1 +null,2022-06-07,1 +null,2022-06-10,1 +null,2022-06-18,1 +null,2022-06-19,1 +null,2022-06-20,1 +null,2022-06-21,1 +null,2022-06-23,1 +null,2022-06-27,1 +null,2022-07-01,1 +null,2022-07-07,1 +null,2022-07-11,1 +null,2022-07-12,1 +null,2022-07-13,1 +null,2022-07-26,1 +null,2022-08-05,1 +null,2022-08-13,1 +null,2022-08-14,1 +null,2022-08-17,1 +null,2022-08-22,1 +null,2022-08-24,1 +null,2022-08-25,1 +null,2022-08-30,1 +null,2022-09-06,1 +null,2022-09-08,1 +null,2022-09-09,1 +null,2022-09-12,1 +null,2022-09-16,1 +null,2022-09-19,1 +null,2022-09-22,1 +Windows,2022-04-03,1 +Windows,2022-04-04,1 +Windows,2022-04-08,1 +Windows,2022-04-17,1 +Windows,2022-04-19,1 +Windows,2022-04-23,1 +Windows,2022-04-24,1 +Windows,2022-04-25,1 +Windows,2022-04-27,1 +Windows,2022-04-28,1 +Windows,2022-05-02,1 +Windows,2022-05-03,1 +Windows,2022-05-09,1 +Windows,2022-05-12,1 +Windows,2022-05-13,1 +Windows,2022-05-15,1 +Windows,2022-05-17,1 +Windows,2022-05-18,1 +Windows,2022-05-20,1 +Windows,2022-05-21,1 +Windows,2022-05-24,1 +Windows,2022-05-25,1 +Windows,2022-05-28,1 +Windows,2022-05-31,1 +Windows,2022-06-03,1 +Windows,2022-06-04,1 +Windows,2022-06-12,1 +Windows,2022-06-13,1 +Windows,2022-06-15,1 +Windows,2022-06-17,1 +Windows,2022-06-18,1 +Windows,2022-06-29,1 +Windows,2022-06-30,1 +Windows,2022-07-02,1 +Windows,2022-07-06,1 +Windows,2022-07-08,1 +Windows,2022-07-13,1 +Windows,2022-07-18,1 +Windows,2022-07-19,1 +Windows,2022-07-22,1 +Windows,2022-07-27,1 +Windows,2022-07-28,1 +Windows,2022-07-29,1 +Windows,2022-08-03,1 +Windows,2022-08-04,1 +Windows,2022-08-05,1 +Windows,2022-08-06,1 +Windows,2022-08-09,1 +Windows,2022-08-17,1 +Windows,2022-08-21,1 +Windows,2022-08-22,1 +Windows,2022-08-29,1 +Windows,2022-09-04,1 +Windows,2022-09-13,1 +Windows,2022-09-15,1 +Windows,2022-09-16,1 +Windows,2022-09-24,1 +Windows,2022-09-26,1 +null,2022-03-18,77 null,2022-03-10,64 -null,2022-02-21,60 null,2022-03-07,47 -null,2022-02-22,40 -null,2022-03-02,38 -null,2021-12-04,37 null,2022-03-04,37 -null,2021-09-20,32 +null,2022-03-30,28 null,2022-03-15,26 -null,2021-12-02,25 -null,2021-12-08,24 -null,2021-12-09,24 +null,2022-03-27,25 +null,2022-04-02,25 +Linux,2022-03-28,24 null,2022-03-13,24 -null,2022-03-01,23 -null,2021-12-16,21 -null,2022-01-10,20 -null,2022-02-20,20 -Linux,2021-10-03,19 -null,2021-12-01,19 -null,2022-02-27,19 null,2022-03-08,19 -Linux,2021-10-04,18 -null,2021-10-08,16 -null,2021-10-27,16 -null,2021-11-16,15 -null,2022-01-21,13 null,2022-03-05,13 -Linux,2021-10-31,11 -Linux,2021-11-03,11 -Linux,2021-11-04,11 -Linux,2021-11-05,11 -Linux,2021-11-15,11 -Linux,2021-11-25,11 -null,2022-02-26,11 -Linux,2021-10-30,10 -Linux,2022-01-21,10 -Linux,2021-10-29,9 +null,2022-03-24,12 +Linux,2022-03-18,10 Linux,2022-03-07,9 -null,2021-12-10,9 -null,2022-01-08,9 null,2022-03-09,9 -Windows,2022-02-07,9 -Linux,2021-11-10,8 -Linux,2021-11-13,8 -Linux,2021-11-17,8 -Linux,2021-11-22,8 Linux,2022-03-04,8 -null,2021-12-13,8 -null,2022-01-29,8 -Linux,2021-10-02,7 -Linux,2021-11-12,7 -Linux,2021-11-14,7 -Linux,2021-11-19,7 -Linux,2021-11-20,7 -null,2021-12-03,7 -null,2022-02-06,7 -Linux,2021-10-01,6 -Linux,2021-10-05,6 -Linux,2021-11-02,6 -Linux,2021-11-09,6 -Linux,2021-11-29,6 -Linux,2021-12-01,6 -Linux,2021-12-18,6 -Linux,2021-12-22,6 -Linux,2022-03-02,6 -null,2021-11-01,6 -null,2022-02-16,6 +Windows,2022-03-29,8 +Linux,2022-03-22,6 null,2022-03-16,6 -Linux,2021-10-26,5 -Linux,2021-11-11,5 -Linux,2021-11-21,5 -Linux,2021-11-23,5 -Linux,2021-11-30,5 -Linux,2021-12-16,5 -Linux,2021-12-17,5 -Linux,2022-01-17,5 Linux,2022-03-16,5 -null,2021-11-12,5 -null,2021-12-19,5 -null,2021-12-27,5 -null,2022-01-14,5 -null,2022-02-14,5 null,2022-03-14,5 -Windows,2021-11-22,5 -Linux,2021-09-27,4 -Linux,2021-10-23,4 -Linux,2021-10-27,4 -Linux,2021-10-28,4 -Linux,2021-11-01,4 -Linux,2021-11-08,4 -Linux,2021-11-18,4 -Linux,2021-11-28,4 -Linux,2021-12-08,4 -Linux,2021-12-10,4 -Linux,2021-12-20,4 -Linux,2021-12-21,4 -Linux,2022-01-04,4 -Linux,2022-01-19,4 -Linux,2022-02-23,4 +Windows,2022-03-24,5 Linux,2022-03-08,4 Linux,2022-03-09,4 -null,2021-10-26,4 -null,2021-10-30,4 -null,2021-11-24,4 -null,2021-12-12,4 -null,2022-01-01,4 -null,2022-01-31,4 -null,2022-02-13,4 -null,2022-02-15,4 +Linux,2022-03-23,4 +Linux,2022-03-24,4 null,2022-03-11,4 -Windows,2021-09-30,4 -Windows,2021-12-27,4 -Windows,2022-02-15,4 Windows,2022-03-08,4 Windows,2022-03-12,4 Windows,2022-03-14,4 -Linux,2021-09-21,3 -Linux,2021-09-29,3 -Linux,2021-10-06,3 -Linux,2021-11-06,3 -Linux,2021-11-07,3 -Linux,2021-11-16,3 -Linux,2021-11-24,3 -Linux,2021-11-26,3 -Linux,2021-11-27,3 -Linux,2021-12-14,3 -Linux,2022-01-31,3 -Linux,2022-02-28,3 +Windows,2022-03-19,4 +Windows,2022-03-22,4 +Windows,2022-03-31,4 Linux,2022-03-13,3 Linux,2022-03-14,3 -null,2021-10-09,3 -null,2021-10-22,3 -null,2021-10-28,3 -null,2021-11-04,3 -null,2021-11-30,3 -null,2021-12-05,3 -null,2021-12-06,3 -null,2021-12-17,3 -null,2021-12-23,3 -null,2022-01-13,3 -null,2022-01-17,3 -null,2022-01-22,3 -null,2022-01-24,3 +Linux,2022-03-17,3 +Linux,2022-03-25,3 +Linux,2022-03-26,3 +Linux,2022-03-29,3 +null,2022-03-20,3 +null,2022-03-21,3 +Windows,2022-03-09,3 +Windows,2022-03-15,3 +Windows,2022-03-16,3 +Windows,2022-03-28,3 +Darwin,2022-03-14,2 +Linux,2022-03-15,2 +Linux,2022-03-20,2 +Linux,2022-03-21,2 +Windows,2022-03-07,2 +Windows,2022-03-11,2 +Windows,2022-03-23,2 +Windows,2022-03-25,2 +Windows,2022-03-27,2 +Windows,2022-04-01,2 +Windows,2022-04-02,2 +Darwin,2022-03-04,1 +Darwin,2022-03-07,1 +Darwin,2022-03-22,1 +Darwin,2022-03-25,1 +Darwin,2022-03-29,1 +Darwin,2022-03-30,1 +Darwin,2022-03-31,1 +Darwin,2022-04-01,1 +Linux,2022-03-06,1 +Linux,2022-03-10,1 +Linux,2022-03-12,1 +Linux,2022-03-19,1 +Linux,2022-03-31,1 +Linux,2022-04-01,1 +null,2022-03-06,1 +null,2022-03-17,1 +null,2022-03-19,1 +null,2022-03-22,1 +null,2022-03-23,1 +null,2022-03-25,1 +null,2022-03-26,1 +null,2022-04-01,1 +Windows,2022-03-04,1 +Windows,2022-03-13,1 +Windows,2022-03-30,1 +null,2022-02-21,60 +null,2022-02-22,40 +null,2022-03-02,38 +null,2022-03-01,23 +null,2022-02-20,20 +null,2022-02-27,19 +null,2022-02-26,11 +Windows,2022-02-07,9 +null,2022-02-06,7 +Linux,2022-03-02,6 +null,2022-02-16,6 +null,2022-02-14,5 +Linux,2022-02-23,4 +null,2022-02-13,4 +null,2022-02-15,4 +Windows,2022-02-15,4 +Linux,2022-02-28,3 null,2022-02-12,3 null,2022-02-25,3 null,2022-03-03,3 -Windows,2021-09-20,3 -Windows,2021-11-04,3 -Windows,2021-11-17,3 -Windows,2021-12-09,3 -Windows,2021-12-13,3 -Windows,2021-12-17,3 Windows,2022-02-03,3 Windows,2022-02-10,3 -Windows,2022-03-09,3 -Windows,2022-03-15,3 -Windows,2022-03-16,3 Darwin,2022-02-01,2 -Darwin,2022-03-14,2 -Linux,2021-09-25,2 -Linux,2021-10-10,2 -Linux,2021-10-11,2 -Linux,2021-10-15,2 -Linux,2021-10-19,2 -Linux,2021-10-22,2 -Linux,2021-12-06,2 -Linux,2021-12-07,2 -Linux,2021-12-13,2 -Linux,2021-12-15,2 -Linux,2021-12-19,2 -Linux,2021-12-23,2 -Linux,2021-12-28,2 -Linux,2021-12-31,2 -Linux,2022-01-05,2 -Linux,2022-01-13,2 -Linux,2022-01-15,2 -Linux,2022-01-24,2 Linux,2022-02-03,2 Linux,2022-02-05,2 Linux,2022-02-08,2 Linux,2022-02-14,2 -Linux,2022-03-15,2 -null,2021-09-18,2 -null,2021-09-25,2 -null,2021-09-30,2 -null,2021-10-13,2 -null,2021-10-19,2 -null,2021-11-02,2 -null,2021-11-19,2 -null,2021-11-25,2 -null,2021-11-29,2 -null,2021-12-11,2 -null,2021-12-14,2 -null,2021-12-24,2 -null,2021-12-29,2 -null,2022-01-03,2 -null,2022-01-04,2 -null,2022-01-11,2 -null,2022-01-15,2 -null,2022-01-20,2 null,2022-02-01,2 null,2022-02-04,2 null,2022-02-09,2 @@ -206,70 +476,13 @@ null,2022-02-11,2 null,2022-02-17,2 null,2022-02-19,2 null,2022-02-28,2 -Windows,2021-09-29,2 -Windows,2021-10-25,2 -Windows,2021-10-26,2 -Windows,2021-10-28,2 -Windows,2021-10-30,2 -Windows,2021-11-02,2 -Windows,2021-11-05,2 -Windows,2021-11-11,2 -Windows,2021-11-16,2 -Windows,2021-11-20,2 -Windows,2021-11-21,2 -Windows,2021-12-02,2 -Windows,2021-12-03,2 -Windows,2021-12-10,2 -Windows,2021-12-15,2 -Windows,2021-12-16,2 -Windows,2021-12-25,2 -Windows,2022-01-10,2 -Windows,2022-01-20,2 Windows,2022-02-04,2 Windows,2022-02-05,2 Windows,2022-02-28,2 Windows,2022-03-02,2 -Windows,2022-03-07,2 -Windows,2022-03-11,2 -Darwin,2021-09-21,1 -Darwin,2021-10-04,1 -Darwin,2021-10-26,1 -Darwin,2021-11-07,1 -Darwin,2021-11-10,1 -Darwin,2021-11-18,1 -Darwin,2021-11-20,1 -Darwin,2022-01-07,1 -Darwin,2022-01-30,1 Darwin,2022-02-07,1 Darwin,2022-02-18,1 Darwin,2022-02-21,1 -Darwin,2022-03-04,1 -Darwin,2022-03-07,1 -Linux,2021-09-19,1 -Linux,2021-09-20,1 -Linux,2021-09-22,1 -Linux,2021-09-24,1 -Linux,2021-09-26,1 -Linux,2021-09-28,1 -Linux,2021-09-30,1 -Linux,2021-10-07,1 -Linux,2021-10-08,1 -Linux,2021-10-09,1 -Linux,2021-10-13,1 -Linux,2021-10-17,1 -Linux,2021-10-25,1 -Linux,2021-12-02,1 -Linux,2021-12-03,1 -Linux,2021-12-09,1 -Linux,2021-12-24,1 -Linux,2022-01-02,1 -Linux,2022-01-03,1 -Linux,2022-01-06,1 -Linux,2022-01-10,1 -Linux,2022-01-18,1 -Linux,2022-01-26,1 -Linux,2022-01-27,1 -Linux,2022-01-29,1 Linux,2022-02-01,1 Linux,2022-02-04,1 Linux,2022-02-06,1 @@ -282,39 +495,60 @@ Linux,2022-02-22,1 Linux,2022-02-24,1 Linux,2022-02-25,1 Linux,2022-03-03,1 -Linux,2022-03-06,1 -Linux,2022-03-10,1 -Linux,2022-03-12,1 -null,2021-09-17,1 -null,2021-09-19,1 -null,2021-09-24,1 -null,2021-09-27,1 -null,2021-09-29,1 -null,2021-10-01,1 -null,2021-10-03,1 -null,2021-10-05,1 -null,2021-10-07,1 -null,2021-10-15,1 -null,2021-10-16,1 -null,2021-10-17,1 -null,2021-10-20,1 -null,2021-10-21,1 -null,2021-10-23,1 -null,2021-10-31,1 -null,2021-11-05,1 -null,2021-11-06,1 -null,2021-11-08,1 -null,2021-11-18,1 -null,2021-11-20,1 -null,2021-11-22,1 -null,2021-11-23,1 -null,2021-11-27,1 -null,2021-12-07,1 -null,2021-12-15,1 -null,2021-12-18,1 -null,2021-12-20,1 -null,2021-12-21,1 -null,2021-12-22,1 +null,2022-02-05,1 +null,2022-02-08,1 +null,2022-02-10,1 +null,2022-02-23,1 +null,2022-02-24,1 +Windows,2022-02-02,1 +Windows,2022-02-08,1 +Windows,2022-02-09,1 +Windows,2022-02-11,1 +Windows,2022-02-14,1 +Windows,2022-02-22,1 +Windows,2022-02-23,1 +Windows,2022-02-24,1 +Windows,2022-02-25,1 +Windows,2022-02-26,1 +Windows,2022-03-01,1 +Windows,2022-03-03,1 +null,2022-01-10,20 +null,2022-01-21,13 +Linux,2022-01-21,10 +null,2022-01-08,9 +null,2022-01-29,8 +Linux,2022-01-17,5 +null,2022-01-14,5 +Linux,2022-01-04,4 +Linux,2022-01-19,4 +null,2022-01-01,4 +null,2022-01-31,4 +Linux,2022-01-31,3 +null,2022-01-13,3 +null,2022-01-17,3 +null,2022-01-22,3 +null,2022-01-24,3 +Linux,2022-01-05,2 +Linux,2022-01-13,2 +Linux,2022-01-15,2 +Linux,2022-01-24,2 +null,2022-01-03,2 +null,2022-01-04,2 +null,2022-01-11,2 +null,2022-01-15,2 +null,2022-01-20,2 +Windows,2022-01-10,2 +Windows,2022-01-20,2 +Darwin,2022-01-07,1 +Darwin,2022-01-30,1 +Linux,2022-01-02,1 +Linux,2022-01-03,1 +Linux,2022-01-06,1 +Linux,2022-01-10,1 +Linux,2022-01-18,1 +Linux,2022-01-26,1 +Linux,2022-01-27,1 +Linux,2022-01-29,1 null,2022-01-06,1 null,2022-01-09,1 null,2022-01-12,1 @@ -323,41 +557,6 @@ null,2022-01-18,1 null,2022-01-19,1 null,2022-01-25,1 null,2022-01-30,1 -null,2022-02-05,1 -null,2022-02-08,1 -null,2022-02-10,1 -null,2022-02-23,1 -null,2022-02-24,1 -null,2022-03-06,1 -Windows,2021-09-17,1 -Windows,2021-09-21,1 -Windows,2021-09-28,1 -Windows,2021-10-02,1 -Windows,2021-10-04,1 -Windows,2021-10-06,1 -Windows,2021-10-09,1 -Windows,2021-10-16,1 -Windows,2021-10-19,1 -Windows,2021-10-21,1 -Windows,2021-10-29,1 -Windows,2021-11-01,1 -Windows,2021-11-06,1 -Windows,2021-11-08,1 -Windows,2021-11-12,1 -Windows,2021-11-18,1 -Windows,2021-11-23,1 -Windows,2021-11-25,1 -Windows,2021-11-27,1 -Windows,2021-11-30,1 -Windows,2021-12-08,1 -Windows,2021-12-12,1 -Windows,2021-12-18,1 -Windows,2021-12-20,1 -Windows,2021-12-21,1 -Windows,2021-12-22,1 -Windows,2021-12-23,1 -Windows,2021-12-24,1 -Windows,2021-12-31,1 Windows,2022-01-03,1 Windows,2022-01-05,1 Windows,2022-01-07,1 @@ -369,20 +568,228 @@ Windows,2022-01-21,1 Windows,2022-01-24,1 Windows,2022-01-27,1 Windows,2022-01-31,1 -Windows,2022-02-02,1 -Windows,2022-02-08,1 -Windows,2022-02-09,1 -Windows,2022-02-11,1 -Windows,2022-02-14,1 -Windows,2022-02-22,1 -Windows,2022-02-23,1 -Windows,2022-02-24,1 -Windows,2022-02-25,1 -Windows,2022-02-26,1 -Windows,2022-03-01,1 -Windows,2022-03-03,1 -Windows,2022-03-04,1 -Windows,2022-03-13,1 +null,2021-12-04,37 +null,2021-12-02,25 +null,2021-12-08,24 +null,2021-12-09,24 +null,2021-12-16,21 +null,2021-12-10,9 +null,2021-12-13,8 +null,2021-12-03,7 +Linux,2021-12-18,6 +Linux,2021-12-22,6 +Linux,2021-12-16,5 +Linux,2021-12-17,5 +null,2021-12-19,5 +null,2021-12-27,5 +Linux,2021-12-08,4 +Linux,2021-12-10,4 +Linux,2021-12-20,4 +Linux,2021-12-21,4 +null,2021-12-12,4 +Windows,2021-12-27,4 +Linux,2021-12-14,3 +null,2021-12-05,3 +null,2021-12-06,3 +null,2021-12-17,3 +null,2021-12-23,3 +Windows,2021-12-09,3 +Windows,2021-12-13,3 +Windows,2021-12-17,3 +Linux,2021-12-06,2 +Linux,2021-12-07,2 +Linux,2021-12-13,2 +Linux,2021-12-15,2 +Linux,2021-12-19,2 +Linux,2021-12-23,2 +Linux,2021-12-28,2 +Linux,2021-12-31,2 +null,2021-12-11,2 +null,2021-12-14,2 +null,2021-12-24,2 +null,2021-12-29,2 +Windows,2021-12-02,2 +Windows,2021-12-03,2 +Windows,2021-12-10,2 +Windows,2021-12-15,2 +Windows,2021-12-16,2 +Windows,2021-12-25,2 +Linux,2021-12-02,1 +Linux,2021-12-03,1 +Linux,2021-12-09,1 +Linux,2021-12-24,1 +null,2021-12-07,1 +null,2021-12-15,1 +null,2021-12-18,1 +null,2021-12-20,1 +null,2021-12-21,1 +null,2021-12-22,1 +Windows,2021-12-08,1 +Windows,2021-12-12,1 +Windows,2021-12-18,1 +Windows,2021-12-20,1 +Windows,2021-12-21,1 +Windows,2021-12-22,1 +Windows,2021-12-23,1 +Windows,2021-12-24,1 +Windows,2021-12-31,1 +null,2021-12-01,19 +null,2021-11-16,15 +Linux,2021-11-03,11 +Linux,2021-11-04,11 +Linux,2021-11-05,11 +Linux,2021-11-15,11 +Linux,2021-11-25,11 +Linux,2021-11-10,8 +Linux,2021-11-13,8 +Linux,2021-11-17,8 +Linux,2021-11-22,8 +Linux,2021-11-12,7 +Linux,2021-11-14,7 +Linux,2021-11-19,7 +Linux,2021-11-20,7 +Linux,2021-11-02,6 +Linux,2021-11-09,6 +Linux,2021-11-29,6 +Linux,2021-12-01,6 +null,2021-11-01,6 +Linux,2021-11-11,5 +Linux,2021-11-21,5 +Linux,2021-11-23,5 +Linux,2021-11-30,5 +null,2021-11-12,5 +Windows,2021-11-22,5 +Linux,2021-11-01,4 +Linux,2021-11-08,4 +Linux,2021-11-18,4 +Linux,2021-11-28,4 +null,2021-11-24,4 +Linux,2021-11-06,3 +Linux,2021-11-07,3 +Linux,2021-11-16,3 +Linux,2021-11-24,3 +Linux,2021-11-26,3 +Linux,2021-11-27,3 +null,2021-11-04,3 +null,2021-11-30,3 +Windows,2021-11-04,3 +Windows,2021-11-17,3 +null,2021-11-02,2 +null,2021-11-19,2 +null,2021-11-25,2 +null,2021-11-29,2 +Windows,2021-11-02,2 +Windows,2021-11-05,2 +Windows,2021-11-11,2 +Windows,2021-11-16,2 +Windows,2021-11-20,2 +Windows,2021-11-21,2 +Darwin,2021-11-07,1 +Darwin,2021-11-10,1 +Darwin,2021-11-18,1 +Darwin,2021-11-20,1 +null,2021-11-05,1 +null,2021-11-06,1 +null,2021-11-08,1 +null,2021-11-18,1 +null,2021-11-20,1 +null,2021-11-22,1 +null,2021-11-23,1 +null,2021-11-27,1 +Windows,2021-11-01,1 +Windows,2021-11-06,1 +Windows,2021-11-08,1 +Windows,2021-11-12,1 +Windows,2021-11-18,1 +Windows,2021-11-23,1 +Windows,2021-11-25,1 +Windows,2021-11-27,1 +Windows,2021-11-30,1 +Linux,2021-10-03,19 +Linux,2021-10-04,18 +null,2021-10-08,16 +null,2021-10-27,16 +Linux,2021-10-31,11 +Linux,2021-10-30,10 +Linux,2021-10-29,9 +Linux,2021-10-02,7 +Linux,2021-10-05,6 +Linux,2021-10-26,5 +Linux,2021-10-23,4 +Linux,2021-10-27,4 +Linux,2021-10-28,4 +null,2021-10-26,4 +null,2021-10-30,4 +Linux,2021-10-06,3 +null,2021-10-09,3 +null,2021-10-22,3 +null,2021-10-28,3 +Linux,2021-10-10,2 +Linux,2021-10-11,2 +Linux,2021-10-15,2 +Linux,2021-10-19,2 +Linux,2021-10-22,2 +null,2021-10-13,2 +null,2021-10-19,2 +Windows,2021-10-25,2 +Windows,2021-10-26,2 +Windows,2021-10-28,2 +Windows,2021-10-30,2 +Darwin,2021-10-04,1 +Darwin,2021-10-26,1 +Linux,2021-10-07,1 +Linux,2021-10-08,1 +Linux,2021-10-09,1 +Linux,2021-10-13,1 +Linux,2021-10-17,1 +Linux,2021-10-25,1 +null,2021-10-03,1 +null,2021-10-05,1 +null,2021-10-07,1 +null,2021-10-15,1 +null,2021-10-16,1 +null,2021-10-17,1 +null,2021-10-20,1 +null,2021-10-21,1 +null,2021-10-23,1 +null,2021-10-31,1 +Windows,2021-10-02,1 +Windows,2021-10-04,1 +Windows,2021-10-06,1 +Windows,2021-10-09,1 +Windows,2021-10-16,1 +Windows,2021-10-19,1 +Windows,2021-10-21,1 +Windows,2021-10-29,1 +null,2021-09-20,32 +Linux,2021-10-01,6 +Linux,2021-09-27,4 +Windows,2021-09-30,4 +Linux,2021-09-21,3 +Linux,2021-09-29,3 +Windows,2021-09-20,3 +Linux,2021-09-25,2 +null,2021-09-18,2 +null,2021-09-25,2 +null,2021-09-30,2 +Windows,2021-09-29,2 +Darwin,2021-09-21,1 +Linux,2021-09-19,1 +Linux,2021-09-20,1 +Linux,2021-09-22,1 +Linux,2021-09-24,1 +Linux,2021-09-26,1 +Linux,2021-09-28,1 +Linux,2021-09-30,1 +null,2021-09-17,1 +null,2021-09-19,1 +null,2021-09-24,1 +null,2021-09-27,1 +null,2021-09-29,1 +null,2021-10-01,1 +Windows,2021-09-17,1 +Windows,2021-09-21,1 +Windows,2021-09-28,1 null,2021-06-30,21 null,2021-07-26,20 null,2021-07-25,17 diff --git a/doc/source/tracking/traffic/clones.csv b/doc/source/tracking/traffic/clones.csv index 819c41e43..a160bc751 100644 --- a/doc/source/tracking/traffic/clones.csv +++ b/doc/source/tracking/traffic/clones.csv @@ -324,7 +324,6 @@ _date,total_clones,unique_clones 2021-12-17,1,1 2021-12-18,1,1 2021-12-20,49,18 -2021-12-20,1,1 2021-12-21,52,24 2021-12-22,2,2 2021-12-23,17,9 @@ -391,3 +390,168 @@ _date,total_clones,unique_clones 2022-03-10,2,1 2022-03-11,6,4 2022-03-12,2,1 +2022-03-14,11,5 +2022-03-16,90,21 +2022-03-17,129,43 +2022-03-18,34,15 +2022-03-19,2,2 +2022-03-20,17,1 +2022-03-21,4,4 +2022-03-22,3,3 +2022-03-23,1,1 +2022-03-24,1,1 +2022-03-25,2,2 +2022-03-27,2,1 +2022-03-28,2,2 +2022-04-01,1,1 +2022-04-02,1,1 +2022-04-04,3,3 +2022-04-05,3,2 +2022-04-06,1,1 +2022-04-08,1,1 +2022-04-09,2,2 +2022-04-11,2,2 +2022-04-15,1,1 +2022-04-16,2,2 +2022-04-17,4,2 +2022-04-18,2,2 +2022-04-24,1,1 +2022-04-25,3,3 +2022-04-26,3,2 +2022-04-28,5,4 +2022-04-29,13,7 +2022-04-30,5,3 +2022-05-01,2,2 +2022-05-02,3,3 +2022-05-04,9,5 +2022-05-05,18,7 +2022-05-06,1,1 +2022-05-09,2,2 +2022-05-11,1,1 +2022-05-12,1,1 +2022-05-13,13,5 +2022-05-14,1,1 +2022-05-16,13,8 +2022-05-17,1,1 +2022-05-18,2,1 +2022-05-20,29,12 +2022-05-21,2,1 +2022-05-23,43,19 +2022-05-24,12,8 +2022-05-25,99,29 +2022-05-26,42,17 +2022-05-27,5,3 +2022-05-30,2,2 +2022-05-31,3,2 +2022-06-01,2,2 +2022-06-03,46,2 +2022-06-04,4,2 +2022-06-05,1,1 +2022-06-06,2,2 +2022-06-07,18,2 +2022-06-09,1,1 +2022-06-10,1,1 +2022-06-11,1,1 +2022-06-13,8,6 +2022-06-14,36,19 +2022-06-16,1,1 +2022-06-17,4,3 +2022-06-20,25,6 +2022-06-21,29,13 +2022-06-22,1,1 +2022-06-25,4,3 +2022-06-26,3,2 +2022-06-27,11,6 +2022-06-29,3,2 +2022-06-30,6,3 +2022-07-01,2,2 +2022-07-03,1,1 +2022-07-04,5,4 +2022-07-05,7,4 +2022-07-06,4,2 +2022-07-07,41,19 +2022-07-08,3,3 +2022-07-11,31,15 +2022-07-12,1,1 +2022-07-13,7,4 +2022-07-15,18,9 +2022-07-17,1,1 +2022-07-18,3,3 +2022-07-20,2,2 +2022-07-21,69,24 +2022-07-22,7,5 +2022-07-24,1,1 +2022-07-25,2,2 +2022-07-26,28,11 +2022-07-27,17,10 +2022-07-28,2,2 +2022-07-29,23,13 +2022-07-30,1,1 +2022-07-31,1,1 +2022-08-01,5,4 +2022-08-02,1,1 +2022-08-03,13,6 +2022-08-05,3,3 +2022-08-06,2,1 +2022-08-08,2,2 +2022-08-09,4,2 +2022-08-10,13,7 +2022-08-11,17,2 +2022-08-12,16,1 +2022-08-13,2,1 +2022-08-14,2,1 +2022-08-15,32,15 +2022-08-16,60,25 +2022-08-17,1,1 +2022-08-18,34,16 +2022-08-19,4,2 +2022-08-20,1,1 +2022-08-22,6,3 +2022-08-24,5,3 +2022-08-25,1,1 +2022-08-26,315,44 +2022-08-28,7,4 +2022-08-29,14,7 +2022-08-30,104,37 +2022-08-31,18,9 +2022-09-01,2,2 +2022-09-03,9,5 +2022-09-04,1,1 +2022-09-05,3,3 +2022-09-06,11,7 +2022-09-07,2,2 +2022-09-08,23,9 +2022-09-09,12,4 +2022-09-10,4,2 +2022-09-12,6,3 +2022-09-13,32,8 +2022-09-14,1,1 +2022-09-15,2,1 +2022-09-16,5,1 +2022-09-18,16,3 +2022-09-19,3,3 +2022-09-21,1,1 +2022-09-22,19,8 +2022-09-23,6,3 +2022-09-24,1,1 +2022-09-25,3,3 +2022-09-26,40,10 +2022-09-28,1,1 +2022-09-29,2,1 +2022-09-30,2,1 +2022-10-01,2,2 +2022-10-03,1,1 +2022-10-04,3,2 +2022-10-05,1,1 +2022-10-06,17,8 +2022-10-07,16,9 +2022-10-10,3,3 +2022-10-12,1,1 +2022-10-14,20,10 +2022-10-15,7,2 +2022-10-16,5,2 +2022-10-17,33,17 +2022-10-18,17,9 +2022-10-19,21,12 +2022-10-20,1,1 +2022-10-21,6,3 diff --git a/doc/source/tracking/traffic/plots.svg b/doc/source/tracking/traffic/plots.svg index 07ae1ebf0..a888f5c39 100644 --- a/doc/source/tracking/traffic/plots.svg +++ b/doc/source/tracking/traffic/plots.svg @@ -6,11 +6,11 @@ - 2022-03-14T00:39:32.763785 + 2022-10-24T01:14:16.697151 image/svg+xml - Matplotlib v3.5.1, https://matplotlib.org/ + Matplotlib v3.6.1, https://matplotlib.org/ @@ -41,17 +41,17 @@ z - - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - + + - + - + - + @@ -292,74 +221,53 @@ z - - + + - + - - - + + + - - @@ -368,115 +276,82 @@ z - - + + - + - - + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - + + - + - - - + + + - + - - + + - + - + - + - - + - + - + - + - + - - - - + + + + + - + - + - - - - + + + + - + - + - - - - - + + + + + - - + + - - + + - + - + - + - + - + - + - - + + - + - + - + @@ -1803,15 +1967,15 @@ z - - + + - + - + - + @@ -1825,15 +1989,42 @@ z - - + + - + - + - + + + + @@ -1847,53 +2038,44 @@ z - - + + - + - + - + - @@ -1910,15 +2092,15 @@ z - - + + - + - - - + + + @@ -1928,19 +2110,19 @@ z - + - - + + - + - - - + + + @@ -1949,14 +2131,90 @@ z - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -1967,27 +2225,27 @@ z - + - + - + - + - + - + - + - + @@ -1995,14 +2253,14 @@ z - + - + - + - + @@ -2010,14 +2268,14 @@ z - + - + - + - + @@ -2025,1005 +2283,1411 @@ z - + +L 116.064289 231.910431 +L 116.764942 229.498947 +L 117.465595 244.771675 +L 118.166248 251.470239 +L 118.866901 239.412823 +L 119.567554 239.14488 +L 120.268207 235.393684 +L 120.96886 239.14488 +L 121.669513 239.948708 +L 122.370166 250.666411 +L 123.070819 248.522871 +L 123.771472 247.719043 +L 124.472125 239.948708 +L 125.172777 213.690335 +L 125.87343 227.355407 +L 126.574083 244.235789 +L 127.274736 247.4511 +L 127.975389 251.202297 +L 129.376695 225.747751 +L 130.077348 246.111388 +L 130.778001 243.699904 +L 131.478654 237.537225 +L 132.179307 237.537225 +L 132.87996 249.862584 +L 133.580613 237.805167 +L 134.281266 234.321914 +L 134.981919 243.967847 +L 135.682572 243.967847 +L 136.383225 239.412823 +L 137.083877 247.183158 +L 137.78453 249.326699 +L 138.485183 227.623349 +L 139.185836 249.058756 +L 139.886489 248.254928 +L 140.587142 249.862584 +L 141.287795 247.986986 +L 141.988448 251.470239 +L 142.689101 251.470239 +L 143.389754 229.231005 +L 144.090407 217.173589 +L 144.79106 244.235789 +L 145.491713 245.575502 +L 146.192366 227.891292 +L 146.893019 250.934354 +L 147.593672 245.30756 +L 148.294324 242.092249 +L 148.994977 246.37933 +L 149.69563 237.00134 +L 150.396283 247.183158 +L 151.096936 250.934354 +L 151.797589 251.738182 +L 152.498242 244.235789 +L 153.198895 242.628134 +L 153.899548 242.896077 +L 154.600201 241.556364 +L 155.300854 249.058756 +L 156.001507 250.934354 +L 156.70216 250.666411 +L 157.402813 247.4511 +L 158.103466 247.986986 +L 158.804119 243.164019 +L 159.504771 250.130526 +L 160.205424 251.202297 +L 160.906077 251.470239 +L 161.60673 248.522871 +L 162.307383 249.594641 +L 163.008036 250.398469 +L 163.708689 251.738182 +L 164.409342 247.4511 +L 165.109995 247.719043 +L 165.810648 250.934354 +L 166.511301 246.647273 +L 167.211954 243.164019 +L 167.912607 240.752536 +L 168.61326 247.986986 +L 169.313913 249.058756 +L 170.014566 233.518086 +L 170.715218 250.398469 +L 171.415871 235.125742 +L 172.116524 236.733397 +L 172.817177 240.752536 +L 173.51783 234.589856 +L 174.218483 247.183158 +L 174.919136 235.929569 +L 175.619789 251.202297 +L 176.320442 234.857799 +L 177.021095 236.197512 +L 177.721748 228.159234 +L 178.422401 233.786029 +L 179.123054 240.752536 +L 179.823707 243.431962 +L 180.52436 248.522871 +L 181.225013 230.302775 +L 181.925665 226.015694 +L 182.626318 237.269282 +L 183.326971 235.929569 +L 184.027624 233.518086 +L 184.728277 247.719043 +L 185.42893 248.790813 +L 186.129583 231.374545 +L 186.830236 247.183158 +L 188.231542 234.321914 +L 189.632848 250.934354 +L 190.333501 247.986986 +L 191.034154 236.465455 +L 191.734807 235.929569 +L 192.43546 226.819522 +L 193.136113 242.628134 +L 193.836765 250.398469 +L 194.537418 250.666411 +L 195.238071 249.326699 +L 195.938724 243.164019 +L 196.639377 243.431962 +L 197.34003 247.183158 +L 198.040683 232.178373 +L 198.741336 248.522871 +L 199.441989 242.628134 +L 200.142642 239.948708 +L 200.843295 241.556364 +L 201.543948 227.087464 +L 202.244601 236.733397 +L 202.945254 235.929569 +L 203.645907 240.752536 +L 204.34656 239.14488 +L 205.047212 240.216651 +L 205.747865 187.431962 +L 206.448518 246.111388 +L 207.149171 232.178373 +L 207.849824 235.661627 +L 208.550477 228.427177 +L 209.25113 242.360191 +L 209.951783 202.972632 +L 210.652436 201.364976 +L 211.353089 206.99177 +L 212.053742 230.570718 +L 212.754395 178.321914 +L 213.455048 225.211866 +L 214.155701 246.37933 +L 214.856354 245.575502 +L 215.557007 238.341053 +L 216.257659 232.446316 +L 216.958312 229.231005 +L 217.658965 235.661627 +L 218.359618 225.479809 +L 219.060271 244.235789 +L 219.760924 246.111388 +L 220.461577 208.063541 +L 221.16223 233.786029 +L 221.862883 235.393684 +L 222.563536 246.647273 +L 223.264189 248.790813 +L 223.964842 248.254928 +L 224.665495 234.053971 +L 225.366148 187.967847 +L 226.066801 231.106603 +L 226.767454 235.393684 +L 227.468106 216.369761 +L 228.168759 244.771675 +L 228.869412 248.522871 +L 229.570065 245.30756 +L 230.270718 223.604211 +L 230.971371 239.412823 +L 231.672024 224.943923 +L 232.372677 203.240574 +L 233.07333 234.857799 +L 233.773983 241.824306 +L 234.474636 246.37933 +L 235.175289 180.465455 +L 235.875942 228.963062 +L 236.576595 243.967847 +L 237.277248 236.197512 +L 237.977901 237.537225 +L 238.678553 249.058756 +L 239.379206 247.183158 +L 240.079859 191.183158 +L 240.780512 184.752536 +L 241.481165 201.364976 +L 242.181818 243.431962 +L 242.882471 249.326699 +L 243.583124 237.537225 +L 244.283777 247.719043 +L 245.685083 226.015694 +L 246.385736 167.336268 +L 247.086389 223.872153 +L 247.787042 223.068325 +L 248.487695 227.623349 +L 249.188348 245.843445 +L 249.889001 246.647273 +L 250.589653 221.996555 +L 251.290306 237.00134 +L 251.990959 236.733397 +L 252.691612 227.891292 +L 253.392265 243.699904 +L 254.092918 249.326699 +L 254.793571 201.097033 +L 255.494224 238.07311 +L 256.194877 215.030048 +L 256.89553 209.135311 +L 257.596183 215.565933 +L 258.296836 249.862584 +L 258.997489 249.862584 +L 259.698142 224.140096 +L 260.398795 234.053971 +L 261.099448 233.518086 +L 261.8001 239.680766 +L 262.500753 243.164019 +L 263.201406 248.522871 +L 263.902059 246.37933 +L 264.602712 227.355407 +L 265.303365 244.503732 +L 266.004018 241.020478 +L 266.704671 233.250144 +L 267.405324 239.412823 +L 268.105977 249.862584 +L 268.80663 249.862584 +L 269.507283 243.431962 +L 270.207936 240.752536 +L 270.908589 246.647273 +L 271.609242 241.824306 +L 272.309895 243.967847 +L 273.010547 249.326699 +L 273.7112 247.719043 +L 274.411853 232.178373 +L 275.112506 237.269282 +L 275.813159 172.69512 +L 276.513812 215.833876 +L 277.214465 244.503732 +L 277.915118 242.628134 +L 278.615771 250.130526 +L 279.316424 233.250144 +L 280.017077 235.125742 +L 280.71773 242.360191 +L 281.418383 241.556364 +L 282.119036 236.465455 +L 282.819689 249.862584 +L 283.520342 250.398469 +L 284.220994 196.274067 +L 284.921647 239.948708 +L 285.6223 245.30756 +L 286.322953 247.4511 +L 287.023606 204.312344 +L 287.724259 247.4511 +L 288.424912 248.254928 +L 289.826218 242.360191 +L 290.526871 242.628134 +L 291.227524 225.479809 +L 291.928177 244.771675 +L 292.62883 249.862584 +L 293.329483 243.967847 +L 294.030136 245.575502 +L 294.730789 183.948708 +L 295.431441 200.293206 +L 296.132094 241.020478 +L 297.5334 245.039617 +L 298.234053 244.503732 +L 298.934706 232.714258 +L 299.635359 242.628134 +L 300.336012 243.699904 +L 301.036665 223.872153 +L 301.737318 239.948708 +L 302.437971 250.398469 +L 303.138624 251.738182 +L 303.839277 245.039617 +L 304.53993 245.575502 +L 305.240583 246.915215 +L 305.941236 243.967847 +L 306.641888 246.37933 +L 307.342541 249.594641 +L 308.043194 251.202297 +L 308.743847 243.967847 +L 309.4445 243.699904 +L 310.145153 231.910431 +L 310.845806 230.302775 +L 311.546459 250.666411 +L 312.247112 246.37933 +L 312.947765 251.738182 +L 313.648418 239.680766 +L 314.349071 240.752536 +L 315.049724 243.164019 +L 315.750377 240.484593 +L 316.45103 248.522871 +L 317.151683 245.843445 +L 317.852336 250.130526 +L 318.552988 237.537225 +L 319.253641 239.412823 +L 319.954294 244.235789 +L 320.654947 241.288421 +L 321.3556 232.446316 +L 322.056253 242.360191 +L 322.756906 248.522871 +L 323.457559 233.518086 +L 324.158212 250.398469 +L 324.858865 246.111388 +L 325.559518 244.503732 +L 326.260171 251.202297 +L 326.960824 250.934354 +L 327.661477 245.039617 +L 328.36213 245.575502 +L 329.062783 233.250144 +L 329.763435 231.642488 +L 330.464088 249.058756 +L 331.164741 249.862584 +L 331.865394 250.398469 +L 332.566047 242.628134 +L 333.2667 228.159234 +L 333.967353 236.465455 +L 334.668006 236.197512 +L 335.368659 245.30756 +L 336.069312 249.862584 +L 336.769965 245.843445 +L 337.470618 246.647273 +L 338.171271 249.862584 +L 338.871924 237.269282 +L 339.572577 247.719043 +L 340.27323 242.628134 +L 340.973882 226.015694 +L 341.674535 250.934354 +L 342.375188 248.254928 +L 343.075841 233.786029 +L 343.776494 216.905646 +L 344.477147 236.733397 +L 345.1778 248.254928 +L 345.878453 247.719043 +L 346.579106 250.398469 +L 347.279759 246.647273 +L 347.980412 232.178373 +L 348.681065 230.570718 +L 349.381718 221.46067 +L 350.082371 233.786029 +L 350.783024 248.522871 +L 351.483677 251.470239 +L 352.184329 248.522871 +L 352.884982 249.862584 +L 353.585635 239.948708 +L 354.286288 189.575502 +L 354.986941 229.498947 +L 355.687594 242.628134 +L 356.388247 241.020478 +L 357.0889 230.83866 +L 357.789553 230.83866 +L 358.490206 220.924785 +L 359.190859 198.417608 +L 359.891512 217.441531 +L 360.592165 246.37933 +L 361.292818 250.666411 +L 361.993471 224.675981 +L 362.694124 228.159234 +L 363.394776 212.618565 +L 364.095429 240.216651 +L 364.796082 236.197512 +L 365.496735 246.111388 +L 366.197388 248.254928 +L 366.898041 215.565933 +L 367.598694 238.608995 +L 368.299347 249.594641 +L 369 223.604211 +L 369.700653 164.924785 +L 370.401306 240.484593 +L 371.101959 235.929569 +L 371.802612 227.891292 +L 372.503265 228.963062 +L 373.203918 242.896077 +L 373.904571 232.446316 +L 374.605224 238.876938 +L 375.305876 246.915215 +L 376.006529 245.843445 +L 376.707182 235.929569 +L 377.407835 249.058756 +L 378.108488 243.431962 +L 378.809141 229.498947 +L 380.210447 250.934354 +L 380.9111 250.130526 +L 381.611753 245.039617 +L 382.312406 231.642488 +L 383.013059 240.752536 +L 383.713712 247.183158 +L 384.414365 247.986986 +L 385.115018 247.986986 +L 385.815671 248.790813 +L 386.516323 239.412823 +L 387.216976 235.661627 +L 387.917629 243.967847 +L 389.318935 237.537225 +L 390.019588 250.130526 +L 390.720241 249.862584 +L 391.420894 234.589856 +L 392.121547 232.982201 +L 392.8222 245.575502 +L 394.223506 250.934354 +L 394.924159 248.522871 +L 395.624812 247.719043 +L 396.325465 244.503732 +L 397.026118 228.69512 +L 397.72677 238.341053 +L 398.427423 238.876938 +L 399.128076 226.819522 +L 399.828729 249.862584 +L 400.529382 228.159234 +L 401.230035 237.269282 +L 401.930688 202.972632 +L 402.631341 239.948708 +L 403.331994 221.996555 +L 404.032647 247.4511 +L 404.7333 248.254928 +L 405.433953 230.034833 +L 406.134606 208.599426 +L 406.835259 234.589856 +L 407.535912 237.269282 +L 408.236565 243.431962 +L 408.937217 233.250144 +L 409.63787 249.058756 +L 410.338523 217.173589 +L 411.039176 235.929569 +L 411.739829 239.948708 +L 412.440482 242.628134 +L 413.141135 242.896077 +L 413.841788 246.915215 +L 414.542441 249.058756 +L 415.243094 245.843445 +L 415.943747 248.790813 +L 416.6444 250.934354 +L 417.345053 249.594641 +L 418.045706 249.326699 +L 418.746359 246.915215 +L 419.447012 217.709474 +L 420.848317 242.092249 +L 421.54897 243.164019 +L 422.249623 249.862584 +L 422.950276 250.934354 +L 423.650929 251.738182 +L 425.052235 236.733397 +L 425.752888 241.288421 +L 426.453541 219.585072 +L 427.154194 246.915215 +L 427.854847 246.111388 +L 428.5555 250.934354 +L 429.256153 247.719043 +L 429.956806 239.412823 +L 430.657459 244.771675 +L 431.358112 242.092249 +L 432.058764 245.843445 +L 432.759417 250.666411 +L 433.46007 250.130526 +L 434.160723 219.585072 +L 434.861376 220.120957 +L 435.562029 235.929569 +L 436.262682 247.719043 +L 436.963335 217.441531 +L 437.663988 246.915215 +L 438.364641 235.929569 +L 439.065294 212.886507 +L 439.765947 238.07311 +L 440.4666 209.939139 +L 441.167253 198.68555 +L 441.867906 232.714258 +L 442.568559 250.666411 +L 443.269211 249.862584 +L 443.969864 196.809952 +L 444.670517 208.867368 +L 445.37117 223.872153 +L 446.071823 224.675981 +L 446.772476 179.125742 +L 447.473129 243.967847 +L 448.173782 245.575502 +L 448.874435 217.441531 +L 449.575088 226.015694 +L 450.275741 242.628134 +L 450.976394 240.752536 +L 451.677047 226.283636 +L 452.3777 247.719043 +L 453.078353 249.862584 +L 453.779006 225.747751 +L 454.479658 235.929569 +L 455.180311 223.336268 +L 455.880964 232.178373 +L 456.581617 216.369761 +L 457.28227 239.680766 +L 457.982923 248.254928 +L 458.683576 222.264498 +L 459.384229 228.427177 +L 460.084882 231.910431 +L 460.785535 227.623349 +L 461.486188 185.824306 +L 462.186841 223.872153 +L 462.887494 241.288421 +L 463.588147 160.101818 +L 464.2888 200.829091 +L 464.989453 224.943923 +L 465.690105 241.288421 +L 466.390758 239.680766 +L 467.091411 243.967847 +L 467.792064 247.4511 +L 468.492717 211.814737 +L 469.19337 223.068325 +L 469.894023 209.671196 +L 470.594676 213.15445 +L 471.295329 225.211866 +L 471.995982 250.130526 +L 472.696635 249.594641 +L 473.397288 213.422392 +L 474.097941 235.661627 +L 474.798594 222.53244 +L 475.499247 230.570718 +L 476.1999 235.393684 +L 476.900552 242.896077 +L 477.601205 247.719043 +L 478.301858 229.76689 +L 479.002511 236.197512 +L 479.703164 216.637703 +L 480.403817 214.22622 +L 481.10447 242.896077 +L 481.805123 249.058756 +L 482.505776 251.738182 +L 483.206429 239.680766 +L 483.907082 237.805167 +L 484.607735 243.699904 +L 485.308388 235.661627 +L 486.009041 244.235789 +L 486.709694 249.326699 +L 487.410347 250.130526 +L 488.811652 234.589856 +L 489.512305 247.986986 +L 490.212958 247.986986 +L 490.913611 243.967847 +L 491.614264 240.752536 +L 492.314917 229.498947 +L 493.01557 239.14488 +L 493.716223 238.608995 +L 494.416876 246.37933 +L 495.818182 247.4511 +L 496.518835 250.398469 +L 497.219488 248.790813 +L 498.620794 232.178373 +L 499.321447 234.857799 +L 500.022099 242.896077 +L 500.722752 235.661627 +L 501.423405 249.862584 +L 502.124058 251.470239 +L 502.824711 243.699904 +L 503.525364 246.37933 +L 504.226017 233.786029 +L 504.92667 213.15445 +L 505.627323 244.235789 +L 506.327976 250.666411 +L 507.028629 249.326699 +L 507.729282 240.484593 +L 508.429935 236.733397 +L 509.130588 239.412823 +L 509.831241 238.341053 +L 510.531894 234.857799 +L 511.232546 250.934354 +L 511.933199 241.288421 +L 512.633852 228.159234 +L 513.334505 226.819522 +L 514.035158 245.575502 +L 514.735811 248.254928 +L 515.436464 211.278852 +L 516.137117 247.986986 +L 516.83777 250.666411 +L 517.538423 227.891292 +L 518.239076 246.111388 +L 518.939729 221.192727 +L 519.640382 229.498947 +L 520.341035 246.111388 +L 521.041688 251.470239 +L 521.742341 251.470239 +L 522.442993 249.862584 +L 523.143646 244.503732 +L 523.844299 245.843445 +L 524.544952 243.431962 +L 525.245605 251.470239 +L 525.946258 249.862584 +L 526.646911 251.738182 +L 527.347564 245.575502 +L 528.048217 247.986986 +L 528.74887 244.771675 +L 529.449523 243.164019 +L 530.150176 250.666411 +L 530.850829 251.202297 +L 531.551482 241.020478 +L 532.252135 220.656842 +L 532.952788 245.843445 +L 533.65344 246.111388 +L 534.354093 240.484593 +L 535.054746 248.254928 +L 535.755399 251.470239 +L 536.456052 247.4511 +L 537.156705 241.556364 +L 537.857358 243.699904 +L 538.558011 244.235789 +L 539.258664 249.326699 +L 539.959317 251.470239 +L 540.65997 251.202297 +L 541.360623 243.164019 +L 542.061276 243.967847 +L 542.761929 247.4511 +L 543.462582 237.537225 +L 544.163235 249.058756 +L 544.863887 250.934354 +L 545.56454 248.790813 +L 546.265193 250.934354 +L 546.965846 239.14488 +L 548.367152 227.623349 +L 549.067805 228.427177 +L 549.768458 247.719043 +L 550.469111 249.594641 +L 551.169764 221.728612 +L 551.870417 238.07311 +L 552.57107 246.647273 +L 553.271723 243.699904 +L 553.972376 234.589856 +L 554.673029 251.202297 +L 555.373682 246.111388 +L 556.074335 238.876938 +L 556.774987 247.4511 +L 557.47564 228.159234 +L 558.176293 234.321914 +L 558.876946 250.934354 +L 559.577599 251.470239 +L 560.278252 250.130526 +L 560.978905 239.948708 +L 561.679558 241.556364 +L 562.380211 248.790813 +L 563.080864 231.106603 +L 563.781517 249.594641 +L 564.48217 251.470239 +L 565.182823 249.058756 +L 565.883476 249.058756 +L 566.584129 241.020478 +L 567.284782 247.183158 +L 567.985434 241.288421 +L 568.686087 249.326699 +L 569.38674 251.738182 +L 570.087393 248.254928 +L 570.788046 227.087464 +L 571.488699 246.915215 +L 572.189352 241.824306 +L 572.890005 247.719043 +L 573.590658 249.862584 +L 574.291311 251.470239 +L 574.991964 244.771675 +L 575.692617 215.833876 +L 576.39327 249.862584 +L 577.093923 226.551579 +L 577.794576 243.164019 +L 578.495229 251.738182 +L 579.195881 251.470239 +L 579.896534 250.130526 +L 580.597187 248.254928 +L 581.29784 238.876938 +L 581.998493 242.092249 +L 582.699146 203.240574 +L 583.399799 249.862584 +L 584.100452 249.326699 +L 585.501758 212.082679 +L 586.202411 237.805167 +L 586.903064 246.647273 +L 587.603717 247.4511 +L 588.30437 250.666411 +L 589.005023 250.934354 +L 589.705676 249.594641 +L 590.406328 237.00134 +L 591.106981 245.575502 +L 591.807634 219.317129 +L 592.508287 237.00134 +L 593.20894 240.216651 +L 593.909593 251.202297 +L 594.610246 216.905646 +L 595.310899 211.010909 +L 596.011552 238.07311 +L 596.712205 248.522871 +L 597.412858 249.058756 +L 598.113511 250.398469 +L 598.814164 243.164019 +L 599.514817 234.053971 +L 600.21547 238.876938 +L 600.916123 235.661627 +L 601.616775 235.929569 +L 602.317428 242.360191 +L 603.018081 251.470239 +L 603.718734 234.321914 +L 604.419387 247.719043 +L 605.12004 249.594641 +L 605.820693 234.857799 +L 606.521346 244.503732 +L 607.221999 249.594641 +L 607.922652 251.202297 +L 608.623305 242.360191 +L 609.323958 241.288421 +L 610.024611 243.164019 +L 610.725264 243.699904 +L 611.425917 239.412823 +L 612.12657 251.202297 +L 612.827223 249.326699 +L 613.527875 244.503732 +L 614.228528 247.719043 +L 614.929181 244.771675 +L 615.629834 249.594641 +L 616.330487 233.518086 +L 617.03114 243.699904 +L 617.731793 250.666411 +L 618.432446 235.929569 +L 619.133099 241.020478 +L 619.833752 234.589856 +L 620.534405 229.498947 +L 621.235058 232.178373 +L 622.636364 247.986986 +L 622.636364 247.986986 +" clip-path="url(#pa9a0c28457)" style="fill: none; stroke: #1f77b4; stroke-width: 1.5; stroke-linecap: square"/> - + +L 116.064289 249.594641 +L 116.764942 248.522871 +L 117.465595 249.594641 +L 118.166248 251.738182 +L 118.866901 250.130526 +L 119.567554 249.326699 +L 120.268207 249.326699 +L 120.96886 249.058756 +L 121.669513 249.594641 +L 122.370166 251.470239 +L 125.172777 249.326699 +L 125.87343 249.058756 +L 126.574083 250.130526 +L 127.975389 251.738182 +L 128.676042 249.058756 +L 129.376695 249.594641 +L 130.077348 250.666411 +L 130.778001 250.934354 +L 131.478654 250.666411 +L 132.179307 251.470239 +L 132.87996 251.202297 +L 133.580613 250.130526 +L 134.281266 251.202297 +L 134.981919 249.058756 +L 135.682572 249.862584 +L 136.383225 250.398469 +L 137.083877 251.202297 +L 137.78453 251.202297 +L 138.485183 247.719043 +L 139.185836 251.470239 +L 139.886489 251.470239 +L 140.587142 251.202297 +L 141.988448 251.738182 +L 142.689101 251.470239 +L 143.389754 249.594641 +L 144.090407 247.183158 +L 145.491713 250.130526 +L 146.192366 250.130526 +L 146.893019 251.470239 +L 147.593672 250.398469 +L 148.294324 250.130526 +L 148.994977 250.934354 +L 149.69563 247.986986 +L 151.096936 251.470239 +L 151.797589 251.738182 +L 152.498242 249.326699 +L 153.899548 249.326699 +L 154.600201 250.130526 +L 155.300854 250.398469 +L 156.001507 251.202297 +L 156.70216 251.470239 +L 157.402813 250.934354 +L 158.103466 250.666411 +L 158.804119 251.202297 +L 160.205424 251.202297 +L 160.906077 251.470239 +L 161.60673 250.934354 +L 163.008036 250.934354 +L 163.708689 251.738182 +L 164.409342 251.202297 +L 165.109995 251.202297 +L 165.810648 250.934354 +L 166.511301 249.862584 +L 167.211954 248.254928 +L 167.912607 250.130526 +L 168.61326 251.202297 +L 169.313913 250.934354 +L 170.014566 250.934354 +L 170.715218 251.202297 +L 171.415871 249.594641 +L 172.116524 248.790813 +L 172.817177 249.862584 +L 173.51783 247.183158 +L 174.218483 249.862584 +L 174.919136 250.398469 +L 175.619789 251.202297 +L 176.320442 250.666411 +L 177.021095 250.666411 +L 177.721748 248.522871 +L 178.422401 249.594641 +L 179.123054 249.326699 +L 179.823707 249.326699 +L 180.52436 250.398469 +L 181.225013 246.37933 +L 182.626318 249.326699 +L 183.326971 247.719043 +L 184.027624 246.647273 +L 184.728277 250.934354 +L 185.42893 250.666411 +L 186.129583 248.790813 +L 186.830236 250.130526 +L 187.530889 248.254928 +L 188.231542 249.594641 +L 188.932195 249.594641 +L 189.632848 250.934354 +L 190.333501 251.202297 +L 191.034154 249.058756 +L 191.734807 248.254928 +L 192.43546 248.522871 +L 193.136113 250.934354 +L 193.836765 251.470239 +L 195.238071 250.934354 +L 195.938724 250.934354 +L 196.639377 249.594641 +L 197.34003 250.398469 +L 198.040683 249.058756 +L 198.741336 250.934354 +L 199.441989 250.398469 +L 200.142642 250.934354 +L 200.843295 249.326699 +L 201.543948 249.058756 +L 202.244601 249.058756 +L 202.945254 248.254928 +L 203.645907 250.398469 +L 204.34656 250.934354 +L 205.047212 250.934354 +L 205.747865 242.896077 +L 206.448518 249.058756 +L 207.149171 249.058756 +L 207.849824 247.719043 +L 209.25113 250.666411 +L 209.951783 250.666411 +L 210.652436 246.647273 +L 211.353089 246.915215 +L 212.053742 248.522871 +L 212.754395 246.915215 +L 213.455048 247.719043 +L 214.155701 250.130526 +L 214.856354 250.934354 +L 215.557007 247.719043 +L 216.257659 246.37933 +L 216.958312 247.4511 +L 217.658965 247.719043 +L 219.060271 251.202297 +L 219.760924 250.130526 +L 220.461577 247.986986 +L 221.16223 247.986986 +L 221.862883 248.790813 +L 222.563536 250.666411 +L 223.964842 251.202297 +L 224.665495 250.130526 +L 225.366148 246.647273 +L 226.066801 247.4511 +L 226.767454 248.790813 +L 227.468106 247.183158 +L 228.168759 249.862584 +L 228.869412 251.202297 +L 230.270718 249.594641 +L 230.971371 248.522871 +L 231.672024 248.790813 +L 232.372677 247.719043 +L 233.07333 249.326699 +L 233.773983 249.594641 +L 234.474636 250.934354 +L 235.175289 245.843445 +L 235.875942 248.254928 +L 236.576595 249.058756 +L 237.277248 249.326699 +L 237.977901 249.326699 +L 238.678553 250.934354 +L 239.379206 250.398469 +L 240.079859 246.111388 +L 240.780512 244.771675 +L 241.481165 247.183158 +L 242.181818 249.058756 +L 242.882471 250.398469 +L 243.583124 249.326699 +L 244.283777 250.398469 +L 244.98443 246.647273 +L 245.685083 246.915215 +L 246.385736 230.302775 +L 247.086389 248.254928 +L 247.787042 246.915215 +L 248.487695 250.666411 +L 249.188348 251.738182 +L 249.889001 249.862584 +L 250.589653 248.522871 +L 251.290306 248.522871 +L 251.990959 248.790813 +L 252.691612 247.986986 +L 254.092918 251.202297 +L 254.793571 249.326699 +L 255.494224 248.522871 +L 256.194877 247.183158 +L 256.89553 247.4511 +L 257.596183 246.111388 +L 258.296836 250.666411 +L 258.997489 251.738182 +L 259.698142 246.111388 +L 260.398795 247.4511 +L 261.099448 249.594641 +L 261.8001 247.719043 +L 262.500753 248.522871 +L 263.201406 251.470239 +L 263.902059 250.398469 +L 264.602712 248.522871 +L 265.303365 249.594641 +L 266.004018 248.254928 +L 266.704671 246.647273 +L 268.105977 250.934354 +L 268.80663 251.202297 +L 269.507283 249.326699 +L 270.207936 247.986986 +L 270.908589 250.130526 +L 271.609242 249.594641 +L 272.309895 249.594641 +L 273.7112 250.130526 +L 274.411853 247.183158 +L 275.112506 249.058756 +L 275.813159 249.058756 +L 276.513812 250.130526 +L 277.214465 249.326699 +L 277.915118 251.202297 +L 278.615771 250.398469 +L 279.316424 248.522871 +L 280.017077 249.326699 +L 280.71773 249.058756 +L 281.418383 248.522871 +L 282.119036 249.326699 +L 282.819689 251.202297 +L 283.520342 250.934354 +L 284.220994 247.719043 +L 284.921647 250.666411 +L 285.6223 249.862584 +L 286.322953 249.326699 +L 287.023606 246.111388 +L 287.724259 251.202297 +L 288.424912 250.666411 +L 289.125565 249.862584 +L 289.826218 250.398469 +L 290.526871 249.058756 +L 291.227524 248.254928 +L 291.928177 249.326699 +L 292.62883 250.934354 +L 293.329483 250.934354 +L 294.030136 249.594641 +L 294.730789 247.4511 +L 295.431441 247.4511 +L 296.132094 250.398469 +L 296.832747 248.790813 +L 297.5334 250.666411 +L 298.234053 249.594641 +L 298.934706 247.986986 +L 299.635359 248.790813 +L 300.336012 248.790813 +L 301.036665 247.986986 +L 301.737318 248.254928 +L 302.437971 251.202297 +L 303.138624 251.738182 +L 303.839277 250.130526 +L 304.53993 250.130526 +L 305.240583 250.398469 +L 305.941236 250.398469 +L 306.641888 250.666411 +L 308.043194 251.738182 +L 308.743847 250.398469 +L 309.4445 249.594641 +L 310.145153 249.862584 +L 310.845806 248.790813 +L 311.546459 251.202297 +L 312.247112 250.398469 +L 312.947765 251.738182 +L 313.648418 250.398469 +L 314.349071 250.398469 +L 315.049724 248.522871 +L 315.750377 247.986986 +L 316.45103 249.594641 +L 317.151683 250.666411 +L 317.852336 250.666411 +L 318.552988 248.790813 +L 319.253641 249.594641 +L 319.954294 249.862584 +L 320.654947 249.862584 +L 321.3556 249.058756 +L 322.056253 249.326699 +L 322.756906 250.666411 +L 323.457559 248.522871 +L 324.158212 251.470239 +L 324.858865 249.862584 +L 325.559518 249.862584 +L 326.260171 251.202297 +L 326.960824 250.934354 +L 327.661477 250.130526 +L 328.36213 250.130526 +L 329.062783 249.326699 +L 329.763435 249.594641 +L 330.464088 251.202297 +L 331.164741 250.934354 +L 331.865394 251.470239 +L 332.566047 250.398469 +L 333.2667 250.130526 +L 333.967353 248.790813 +L 334.668006 249.326699 +L 335.368659 250.398469 +L 336.069312 250.934354 +L 336.769965 250.398469 +L 337.470618 251.470239 +L 338.171271 250.934354 +L 338.871924 249.326699 +L 339.572577 250.130526 +L 340.27323 251.202297 +L 340.973882 248.522871 +L 341.674535 251.470239 +L 342.375188 251.202297 +L 343.075841 248.254928 +L 344.477147 249.326699 +L 345.1778 250.398469 +L 345.878453 249.862584 +L 346.579106 251.202297 +L 347.279759 250.666411 +L 347.980412 247.986986 +L 348.681065 249.862584 +L 349.381718 249.326699 +L 350.082371 249.862584 +L 350.783024 249.862584 +L 351.483677 251.470239 +L 352.184329 251.470239 +L 352.884982 250.934354 +L 353.585635 248.522871 +L 354.986941 248.522871 +L 355.687594 249.862584 +L 356.388247 249.862584 +L 357.0889 249.058756 +L 357.789553 248.790813 +L 358.490206 247.4511 +L 359.190859 249.594641 +L 359.891512 247.719043 +L 360.592165 250.130526 +L 361.292818 251.202297 +L 361.993471 250.398469 +L 362.694124 249.862584 +L 363.394776 248.254928 +L 364.095429 248.522871 +L 364.796082 249.326699 +L 365.496735 249.862584 +L 366.197388 250.130526 +L 366.898041 247.719043 +L 367.598694 248.522871 +L 368.299347 250.666411 +L 369 249.594641 +L 370.401306 249.058756 +L 371.101959 249.594641 +L 371.802612 247.719043 +L 372.503265 250.130526 +L 373.203918 250.398469 +L 373.904571 248.522871 +L 374.605224 249.058756 +L 375.305876 250.934354 +L 376.006529 250.398469 +L 376.707182 249.594641 +L 377.407835 250.934354 +L 378.108488 249.326699 +L 378.809141 248.790813 +L 379.509794 249.058756 +L 380.210447 251.202297 +L 380.9111 251.202297 +L 381.611753 249.326699 +L 382.312406 250.398469 +L 383.013059 247.986986 +L 384.414365 250.130526 +L 385.115018 250.666411 +L 385.815671 250.130526 +L 386.516323 249.058756 +L 387.216976 247.4511 +L 387.917629 248.522871 +L 388.618282 247.986986 +L 389.318935 249.058756 +L 390.019588 250.666411 +L 390.720241 250.934354 +L 391.420894 249.326699 +L 392.121547 250.666411 +L 392.8222 249.862584 +L 393.522853 250.130526 +L 394.223506 251.470239 +L 394.924159 250.934354 +L 395.624812 250.934354 +L 396.325465 251.470239 +L 397.026118 249.594641 +L 397.72677 250.398469 +L 398.427423 249.058756 +L 399.128076 250.666411 +L 399.828729 251.202297 +L 400.529382 249.058756 +L 401.230035 249.594641 +L 401.930688 249.594641 +L 402.631341 246.915215 +L 403.331994 246.647273 +L 404.032647 250.398469 +L 404.7333 250.398469 +L 405.433953 248.790813 +L 406.134606 248.790813 +L 406.835259 249.862584 +L 407.535912 249.326699 +L 408.236565 250.398469 +L 408.937217 250.666411 +L 409.63787 250.666411 +L 410.338523 248.254928 +L 411.039176 249.862584 +L 411.739829 250.666411 +L 412.440482 250.934354 +L 413.141135 249.594641 +L 413.841788 251.738182 +L 414.542441 251.470239 +L 415.243094 250.934354 +L 415.943747 250.934354 +L 416.6444 251.202297 +L 417.345053 250.666411 +L 418.045706 251.202297 +L 418.746359 250.398469 +L 419.447012 244.771675 +L 420.147664 247.4511 +L 420.848317 249.326699 +L 422.950276 250.934354 +L 423.650929 251.738182 +L 424.351582 249.594641 +L 425.052235 249.594641 +L 425.752888 249.058756 +L 426.453541 246.111388 +L 427.154194 250.666411 +L 427.854847 251.738182 +L 428.5555 251.470239 +L 429.256153 250.666411 +L 429.956806 248.254928 +L 430.657459 250.934354 +L 431.358112 250.130526 +L 432.058764 248.522871 +L 432.759417 251.202297 +L 433.46007 251.202297 +L 434.160723 250.130526 +L 434.861376 247.986986 +L 435.562029 248.790813 +L 436.262682 249.862584 +L 436.963335 249.326699 +L 437.663988 250.934354 +L 438.364641 250.666411 +L 439.065294 248.254928 +L 439.765947 249.326699 +L 440.4666 247.183158 +L 441.167253 246.647273 +L 441.867906 247.183158 +L 442.568559 251.202297 +L 443.269211 251.738182 +L 443.969864 247.986986 +L 444.670517 246.111388 +L 445.37117 247.986986 +L 446.071823 246.647273 +L 446.772476 243.431962 +L 447.473129 249.594641 +L 448.173782 249.326699 +L 448.874435 247.4511 +L 449.575088 247.183158 +L 450.275741 248.254928 +L 450.976394 248.790813 +L 451.677047 247.986986 +L 452.3777 249.862584 +L 453.078353 250.934354 +L 453.779006 247.719043 +L 455.180311 248.254928 +L 455.880964 246.915215 +L 456.581617 247.4511 +L 457.28227 247.719043 +L 457.982923 250.666411 +L 458.683576 245.843445 +L 459.384229 245.843445 +L 460.084882 243.967847 +L 460.785535 247.183158 +L 461.486188 247.183158 +L 462.186841 249.862584 +L 462.887494 249.058756 +L 463.588147 247.986986 +L 464.2888 245.843445 +L 464.989453 248.522871 +L 465.690105 249.058756 +L 466.390758 249.326699 +L 467.091411 249.326699 +L 467.792064 249.862584 +L 468.492717 246.647273 +L 469.19337 247.183158 +L 469.894023 245.039617 +L 470.594676 247.986986 +L 471.295329 247.183158 +L 471.995982 250.934354 +L 472.696635 251.202297 +L 473.397288 243.967847 +L 474.097941 247.4511 +L 474.798594 245.575502 +L 475.499247 246.37933 +L 476.1999 249.594641 +L 476.900552 250.398469 +L 477.601205 250.398469 +L 478.301858 248.522871 +L 479.002511 249.326699 +L 479.703164 247.183158 +L 480.403817 246.915215 +L 481.10447 249.594641 +L 481.805123 249.862584 +L 482.505776 251.738182 +L 483.206429 248.522871 +L 483.907082 248.254928 +L 484.607735 249.058756 +L 485.308388 244.771675 +L 486.009041 249.326699 +L 486.709694 251.470239 +L 487.410347 250.934354 +L 488.110999 249.058756 +L 488.811652 249.594641 +L 489.512305 249.594641 +L 490.212958 250.666411 +L 490.913611 250.666411 +L 491.614264 251.202297 +L 492.314917 250.666411 +L 493.01557 249.326699 +L 493.716223 249.058756 +L 494.416876 249.326699 +L 495.117529 250.130526 +L 495.818182 249.594641 +L 496.518835 250.666411 +L 497.219488 249.594641 +L 497.920141 248.790813 +L 498.620794 248.522871 +L 499.321447 248.522871 +L 500.022099 249.862584 +L 500.722752 246.915215 +L 501.423405 251.470239 +L 502.124058 251.470239 +L 502.824711 249.058756 +L 503.525364 250.398469 +L 504.226017 250.398469 +L 504.92667 248.254928 +L 506.327976 251.202297 +L 507.028629 250.398469 +L 507.729282 249.326699 +L 508.429935 248.522871 +L 509.130588 249.058756 +L 509.831241 247.4511 +L 510.531894 249.594641 +L 511.232546 250.934354 +L 511.933199 250.130526 +L 512.633852 246.647273 +L 513.334505 247.986986 +L 514.035158 250.666411 +L 514.735811 250.130526 +L 515.436464 248.522871 +L 516.83777 251.470239 +L 517.538423 249.594641 +L 518.239076 250.130526 +L 518.939729 249.594641 +L 519.640382 248.790813 +L 520.341035 250.398469 +L 521.041688 251.470239 +L 521.742341 251.470239 +L 522.442993 250.666411 +L 523.143646 250.130526 +L 523.844299 250.130526 +L 524.544952 249.058756 +L 525.245605 251.470239 +L 525.946258 250.934354 +L 526.646911 251.738182 +L 527.347564 250.398469 +L 528.048217 249.862584 +L 528.74887 249.594641 +L 529.449523 248.522871 +L 530.150176 251.202297 +L 530.850829 251.470239 +L 531.551482 249.326699 +L 532.252135 249.594641 +L 532.952788 250.130526 +L 533.65344 250.398469 +L 534.354093 249.862584 +L 535.054746 251.470239 +L 535.755399 251.738182 +L 536.456052 250.934354 +L 537.156705 250.398469 +L 537.857358 249.058756 +L 538.558011 251.202297 +L 539.258664 250.666411 +L 539.959317 251.470239 +L 540.65997 251.202297 +L 541.360623 250.130526 +L 542.061276 249.594641 +L 542.761929 250.130526 +L 543.462582 249.058756 +L 544.163235 250.666411 +L 544.863887 251.470239 +L 545.56454 250.130526 +L 546.265193 251.202297 +L 546.965846 250.666411 +L 547.666499 250.666411 +L 548.367152 248.522871 +L 549.067805 249.594641 +L 549.768458 250.934354 +L 550.469111 251.202297 +L 551.169764 249.594641 +L 551.870417 249.594641 +L 552.57107 250.666411 +L 553.271723 249.594641 +L 553.972376 249.594641 +L 554.673029 251.470239 +L 555.373682 249.594641 +L 556.074335 249.326699 +L 556.774987 250.666411 +L 557.47564 249.594641 +L 558.176293 249.326699 +L 558.876946 251.202297 +L 559.577599 251.738182 +L 560.278252 250.130526 +L 560.978905 249.594641 +L 561.679558 250.666411 +L 563.080864 250.130526 +L 563.781517 250.666411 +L 564.48217 251.470239 +L 565.182823 250.130526 +L 565.883476 250.130526 +L 566.584129 249.326699 +L 567.284782 249.862584 +L 567.985434 249.862584 +L 568.686087 250.934354 +L 569.38674 251.738182 +L 570.087393 251.202297 +L 570.788046 250.398469 +L 571.488699 250.398469 +L 572.189352 250.934354 +L 572.890005 250.130526 +L 573.590658 250.934354 +L 574.291311 251.470239 +L 574.991964 250.398469 +L 575.692617 249.862584 +L 576.39327 250.130526 +L 577.093923 249.058756 +L 577.794576 249.594641 +L 578.495229 251.738182 +L 579.195881 251.470239 +L 579.896534 250.398469 +L 580.597187 249.862584 +L 581.29784 249.058756 +L 581.998493 249.594641 +L 582.699146 245.039617 +L 583.399799 251.202297 +L 584.100452 250.666411 +L 585.501758 247.183158 +L 586.202411 248.790813 +L 586.903064 249.862584 +L 587.603717 250.398469 +L 588.30437 251.202297 +L 589.005023 251.202297 +L 589.705676 250.130526 +L 590.406328 248.254928 +L 591.106981 249.862584 +L 591.807634 246.915215 +L 592.508287 246.915215 +L 593.20894 251.202297 +L 593.909593 251.470239 +L 594.610246 246.37933 +L 595.310899 246.915215 +L 596.011552 247.183158 +L 596.712205 249.594641 +L 597.412858 250.130526 +L 598.113511 251.202297 +L 598.814164 249.594641 +L 599.514817 248.522871 +L 600.21547 249.862584 +L 600.916123 246.111388 +L 602.317428 250.666411 +L 603.018081 251.470239 +L 603.718734 247.986986 +L 605.12004 250.666411 +L 605.820693 248.254928 +L 606.521346 249.862584 +L 607.221999 250.934354 +L 607.922652 251.202297 +L 608.623305 249.862584 +L 609.323958 248.790813 +L 610.725264 249.862584 +L 611.425917 249.594641 +L 612.12657 251.202297 +L 612.827223 251.202297 +L 613.527875 249.058756 +L 614.228528 249.058756 +L 614.929181 249.326699 +L 615.629834 250.398469 +L 616.330487 248.790813 +L 617.731793 251.470239 +L 618.432446 243.431962 +L 619.133099 247.986986 +L 619.833752 247.719043 +L 620.534405 248.790813 +L 621.235058 248.522871 +L 621.935711 250.934354 +L 622.636364 250.130526 +L 622.636364 250.130526 +" clip-path="url(#pa9a0c28457)" style="fill: none; stroke: #ff7f0e; stroke-width: 1.5; stroke-linecap: square"/> - - - + - + - + - - + - + - + @@ -3150,10 +3814,10 @@ L 119 183.296562 - + - + diff --git a/doc/source/tracking/traffic/traffic_data_mgmt.py b/doc/source/tracking/traffic/traffic_data_mgmt.py index 397490f4b..457646a05 100644 --- a/doc/source/tracking/traffic/traffic_data_mgmt.py +++ b/doc/source/tracking/traffic/traffic_data_mgmt.py @@ -19,6 +19,11 @@ def update_csv(string): except FileNotFoundError: updated = pd.read_csv(defaultpath + string) + # remove duplicate dates; sort default is ascending + updated = updated.sort_values(f"total_{string}", ignore_index=True).drop_duplicates( + subset="_date", keep="last" + ) + updated.sort_values("_date", ignore_index=True).to_csv( trafficpath + f"{string}.csv", index=False ) @@ -48,4 +53,4 @@ def update_csv(string): fig.savefig(trafficpath + "plots.svg") # removing the files should not be necessary here since they're not included in the git commit -#subprocess.run(["rm -rf " + defaultpath[:-1]], shell=True) +# subprocess.run(["rm -rf " + defaultpath[:-1]], shell=True) diff --git a/doc/source/tracking/traffic/views.csv b/doc/source/tracking/traffic/views.csv index d1ea92ece..aba9e76cd 100644 --- a/doc/source/tracking/traffic/views.csv +++ b/doc/source/tracking/traffic/views.csv @@ -503,3 +503,224 @@ _date,total_views,unique_views 2022-03-11,46,10 2022-03-12,30,10 2022-03-13,17,8 +2022-03-14,150,20 +2022-03-15,108,18 +2022-03-16,158,26 +2022-03-17,145,15 +2022-03-18,100,18 +2022-03-19,7,4 +2022-03-20,9,3 +2022-03-21,144,30 +2022-03-22,61,17 +2022-03-23,110,24 +2022-03-24,80,21 +2022-03-25,62,9 +2022-03-26,34,6 +2022-03-27,16,6 +2022-03-28,83,13 +2022-03-29,59,10 +2022-03-30,132,18 +2022-03-31,141,19 +2022-04-01,34,9 +2022-04-02,11,8 +2022-04-03,1,1 +2022-04-04,46,13 +2022-04-05,53,14 +2022-04-06,31,11 +2022-04-07,61,27 +2022-04-08,29,10 +2022-04-09,10,2 +2022-04-10,7,4 +2022-04-11,34,11 +2022-04-12,65,9 +2022-04-13,15,9 +2022-04-14,15,5 +2022-04-15,30,5 +2022-04-16,42,3 +2022-04-17,84,5 +2022-04-18,48,10 +2022-04-19,50,11 +2022-04-20,21,10 +2022-04-21,19,7 +2022-04-22,17,9 +2022-04-23,6,5 +2022-04-24,12,9 +2022-04-25,44,12 +2022-04-26,74,13 +2022-04-27,64,13 +2022-04-28,34,8 +2022-04-29,61,19 +2022-04-30,8,2 +2022-05-01,2,2 +2022-05-02,31,11 +2022-05-03,21,6 +2022-05-04,68,6 +2022-05-05,145,14 +2022-05-06,29,8 +2022-05-07,5,3 +2022-05-08,10,6 +2022-05-09,43,10 +2022-05-10,57,13 +2022-05-11,47,11 +2022-05-12,51,17 +2022-05-13,64,9 +2022-05-14,4,4 +2022-05-15,40,7 +2022-05-16,89,20 +2022-05-17,94,15 +2022-05-18,24,5 +2022-05-19,14,7 +2022-05-20,152,13 +2022-05-21,15,7 +2022-05-22,5,2 +2022-05-23,90,9 +2022-05-24,22,7 +2022-05-25,115,9 +2022-05-26,84,12 +2022-05-27,22,6 +2022-05-28,2,2 +2022-05-29,2,2 +2022-05-30,8,5 +2022-05-31,28,7 +2022-06-01,23,7 +2022-06-02,32,11 +2022-06-03,2,2 +2022-06-04,8,4 +2022-06-05,1,1 +2022-06-06,24,6 +2022-06-07,15,8 +2022-06-08,27,9 +2022-06-09,33,13 +2022-06-10,5,3 +2022-06-11,3,2 +2022-06-13,41,10 +2022-06-14,117,9 +2022-06-15,23,7 +2022-06-16,22,6 +2022-06-17,43,8 +2022-06-18,14,2 +2022-06-19,2,1 +2022-06-20,17,4 +2022-06-21,39,6 +2022-06-22,31,11 +2022-06-23,29,3 +2022-06-24,10,5 +2022-06-25,2,2 +2022-06-26,3,3 +2022-06-27,33,7 +2022-06-28,30,9 +2022-06-29,17,7 +2022-06-30,54,11 +2022-07-01,11,5 +2022-07-02,4,2 +2022-07-03,12,7 +2022-07-04,4,3 +2022-07-05,48,5 +2022-07-06,71,5 +2022-07-07,91,13 +2022-07-08,88,9 +2022-07-09,16,4 +2022-07-10,9,3 +2022-07-11,113,9 +2022-07-12,52,9 +2022-07-13,20,5 +2022-07-14,31,9 +2022-07-15,65,9 +2022-07-16,3,2 +2022-07-18,22,9 +2022-07-19,49,10 +2022-07-20,17,5 +2022-07-21,89,9 +2022-07-22,66,10 +2022-07-23,4,3 +2022-07-24,2,1 +2022-07-25,7,7 +2022-07-26,45,9 +2022-07-27,39,5 +2022-07-28,12,6 +2022-07-29,78,7 +2022-07-30,9,5 +2022-07-31,2,2 +2022-08-01,11,7 +2022-08-02,11,7 +2022-08-03,41,10 +2022-08-04,18,8 +2022-08-05,40,8 +2022-08-06,10,4 +2022-08-07,1,1 +2022-08-08,14,3 +2022-08-09,93,6 +2022-08-10,19,6 +2022-08-11,38,4 +2022-08-12,16,7 +2022-08-13,8,4 +2022-08-14,2,2 +2022-08-15,27,6 +2022-08-16,135,8 +2022-08-17,8,7 +2022-08-18,95,11 +2022-08-19,33,9 +2022-08-20,1,1 +2022-08-21,2,2 +2022-08-22,7,6 +2022-08-23,14,8 +2022-08-24,49,11 +2022-08-25,37,9 +2022-08-26,182,26 +2022-08-27,8,3 +2022-08-28,10,5 +2022-08-29,78,11 +2022-08-30,149,18 +2022-08-31,53,12 +2022-09-01,20,8 +2022-09-02,17,6 +2022-09-03,5,3 +2022-09-04,4,3 +2022-09-05,9,7 +2022-09-06,56,14 +2022-09-07,24,8 +2022-09-08,122,19 +2022-09-09,56,19 +2022-09-10,44,3 +2022-09-11,3,2 +2022-09-12,131,21 +2022-09-13,153,19 +2022-09-14,52,18 +2022-09-15,13,9 +2022-09-16,11,7 +2022-09-17,6,3 +2022-09-19,33,9 +2022-09-20,67,13 +2022-09-21,49,8 +2022-09-22,61,22 +2022-09-23,60,13 +2022-09-24,36,5 +2022-09-25,2,2 +2022-09-26,66,15 +2022-09-27,16,10 +2022-09-28,9,5 +2022-09-29,64,14 +2022-09-30,28,8 +2022-10-01,9,4 +2022-10-02,3,3 +2022-10-03,36,8 +2022-10-04,40,12 +2022-10-05,33,10 +2022-10-06,31,8 +2022-10-07,47,9 +2022-10-08,3,3 +2022-10-09,10,3 +2022-10-10,28,11 +2022-10-11,16,11 +2022-10-12,27,10 +2022-10-13,9,6 +2022-10-14,69,12 +2022-10-15,31,7 +2022-10-16,5,2 +2022-10-17,60,32 +2022-10-18,41,15 +2022-10-19,65,16 +2022-10-20,84,12 +2022-10-21,74,13 +2022-10-22,42,4 +2022-10-23,15,7 diff --git a/doc/source/user_guide/changelog/index.rst b/doc/source/user_guide/changelog/index.rst index 34110e5fc..117e08651 100644 --- a/doc/source/user_guide/changelog/index.rst +++ b/doc/source/user_guide/changelog/index.rst @@ -6,9 +6,17 @@ icepyx ChangeLog This is the list of changes made to icepyx in between each release. Full details can be found in the `commit logs `_. -Latest Release (Version 0.6.3) +Latest Release (Version 0.6.4) ------------------------------ +.. toctree:: + :maxdepth: 2 + + v0.6.4 + +Version 0.6.3 +------------- + .. toctree:: :maxdepth: 2 diff --git a/doc/source/user_guide/changelog/v0.6.4.rst b/doc/source/user_guide/changelog/v0.6.4.rst new file mode 100644 index 000000000..2f0adf132 --- /dev/null +++ b/doc/source/user_guide/changelog/v0.6.4.rst @@ -0,0 +1,53 @@ +.. _whatsnew_064: + +What's new in 0.6.4 (28 October 2022) +----------------------------------- + +These are the changes in icepyx 0.6.4 See :ref:`release` for a full changelog +including other versions of icepyx. + + +New Features +~~~~~~~~~~~~ + +- create spatial class, automatic polygon closure functionality (#322) +- add cross-date line flag and handling (including in function to create geodataframe) (#331) + + +Bug fixes +~~~~~~~~~ + +- fixed several geospatial/cross-date line issues (see New Features) + + +Deprecations +~~~~~~~~~~~~ + +- in `ipx.Query.avail_granules` and `ipx.core.granules.gran_IDs`, + the `s3urls` keyword has been changed to `cloud`. + + +Maintenance +^^^^^^^^^^^ + +- add existing contributors using the AllContributors bot (#332-333, #335-360, #365-368, #370-371) +- clean up after adding all contribs via bot (#334) +- add provider flag to CMR request (needed with new cloud availability) (#380) +- update traffic data and scripts (#363, #369, #383) +- enable support for Python 3.10 and 3.11 (#372) +- update json file with subsetting options to v005 of ATL06 (#387) + + +Documentation +^^^^^^^^^^^^^ + +- update bib file and contribs formatting (#364) +- update cloud tutorial to work with publicly accessible cloud data (#381) + + + + +Contributors +~~~~~~~~~~~~ + +.. contributors:: v0.6.3..v0.6.4|HEAD \ No newline at end of file diff --git a/doc/source/user_guide/documentation/classes_dev_uml.svg b/doc/source/user_guide/documentation/classes_dev_uml.svg index 62d1a3c01..54a9daa7f 100644 --- a/doc/source/user_guide/documentation/classes_dev_uml.svg +++ b/doc/source/user_guide/documentation/classes_dev_uml.svg @@ -4,11 +4,11 @@ - - + + classes_dev_uml - + icepyx.core.Earthdata.Earthdata @@ -29,17 +29,15 @@ icepyx.core.query.GenQuery - -GenQuery - -_end : datetime -_geom_filepath : NoneType -_spat_extent -_start : datetime -extent_type : str - -__init__(spatial_extent, date_range, start_time, end_time) -__str__() + +GenQuery + +_end : datetime +_spatial +_start : datetime + +__init__(spatial_extent, date_range, start_time, end_time) +__str__() @@ -52,110 +50,111 @@ __init__() download(verbose, path, session, restart) -get_avail(CMRparams, reqparams) +get_avail(CMRparams, reqparams, cloud) place_order(CMRparams, reqparams, subsetparams, verbose, subset, session, geom_filepath) icepyx.core.query.Query - -Query - -CMRparams -_CMRparams -_about_product -_cust_options : dict -_cycles : list -_email -_file_vars -_granules -_order_vars -_prod : NoneType, str -_readable_granule_name : list -_reqparams -_s3login_credentials -_session : Session -_source : str -_subsetparams : NoneType -_tracks : list -_version -cycles -dataset -dates -end_time -file_vars -granules -order_vars -product -product_version -reqparams -spatial_extent -start_time -tracks - -__init__(product, spatial_extent, date_range, start_time, end_time, version, cycles, tracks, files) -__str__() -avail_granules(ids, cycles, tracks, s3urls) -download_granules(path, verbose, subset, restart) -earthdata_login(uid, email, s3token) -latest_version() -order_granules(verbose, subset, email) -product_all_info() -product_summary_info() -show_custom_options(dictview) -subsetparams() -visualize_elevation() -visualize_spatial_extent() + +Query + +CMRparams +_CMRparams +_about_product +_cust_options : dict +_cycles : list +_email +_file_vars +_granules +_order_vars +_prod : str, NoneType +_readable_granule_name : list +_reqparams +_s3login_credentials +_session : Session +_source : str +_subsetparams : NoneType +_tracks : list +_version +cycles +dataset +dates +end_time +file_vars +granules +order_vars +product +product_version +reqparams +spatial +spatial_extent +start_time +tracks + +__init__(product, spatial_extent, date_range, start_time, end_time, version, cycles, tracks, files) +__str__() +avail_granules(ids, cycles, tracks, s3urls) +download_granules(path, verbose, subset, restart) +earthdata_login(uid, email, s3token) +latest_version() +order_granules(verbose, subset, email) +product_all_info() +product_summary_info() +show_custom_options(dictview) +subsetparams() +visualize_elevation() +visualize_spatial_extent() icepyx.core.granules.Granules->icepyx.core.query.Query - - -_granules + + +_granules icepyx.core.granules.Granules->icepyx.core.query.Query - - -_granules + + +_granules icepyx.core.icesat2data.Icesat2Data - -Icesat2Data - - -__init__() + +Icesat2Data + + +__init__() icepyx.core.exceptions.NsidcQueryError - -NsidcQueryError - -errmsg -msgtxt : str - -__init__(errmsg, msgtxt) -__str__() + +NsidcQueryError + +errmsg +msgtxt : str + +__init__(errmsg, msgtxt) +__str__() icepyx.core.exceptions.QueryError - -QueryError - - - + +QueryError + + + icepyx.core.exceptions.NsidcQueryError->icepyx.core.exceptions.QueryError - - + + @@ -165,7 +164,7 @@ _fmted_keys : dict, NoneType _poss_keys : dict -_reqtype : NoneType, str +_reqtype : str, NoneType fmted_keys partype poss_keys @@ -180,137 +179,172 @@ icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_CMRparams + + +_CMRparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_reqparams + + +_reqparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_subsetparams + + +_subsetparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_subsetparams + + +_subsetparams icepyx.core.query.Query->icepyx.core.query.GenQuery - - + + icepyx.core.read.Read - -Read - -_catalog_path : NoneType -_filelist : NoneType, list -_is2catalog : Catalog -_out_obj : Dataset -_pattern : str -_prod : NoneType, str -_read_vars -_source_type : str -data_source : NoneType -is2catalog -vars - -__init__(data_source, product, filename_pattern, catalog, out_obj_type) -_add_vars_to_ds(is2ds, ds, grp_path, wanted_groups_tiered, wanted_dict) -_build_dataset_template(file) -_build_single_file_dataset(file, groups_list) -_check_source_for_pattern(source, filename_pattern) -_combine_nested_vars(is2ds, ds, grp_path, wanted_dict) -_read_single_grp(file, grp_path) -load() + +Read + +_catalog_path : NoneType +_filelist : list, NoneType +_is2catalog : Catalog +_out_obj : Dataset +_pattern : str +_prod : NoneType, str +_read_vars +_source_type : str +data_source : NoneType +is2catalog +vars + +__init__(data_source, product, filename_pattern, catalog, out_obj_type) +_add_vars_to_ds(is2ds, ds, grp_path, wanted_groups_tiered, wanted_dict) +_build_dataset_template(file) +_build_single_file_dataset(file, groups_list) +_check_source_for_pattern(source, filename_pattern) +_combine_nested_vars(is2ds, ds, grp_path, wanted_dict) +_read_single_grp(file, grp_path) +load() - + +icepyx.core.spatial.Spatial + +Spatial + +_ext_type : str +_gdf_spat : GeoDataFrame, DataFrame +_geom_file : NoneType +_spatial_ext +_xdateln +extent +extent_as_gdf +extent_file +extent_type + +__init__(spatial_extent) +__str__() +fmt_for_CMR() +fmt_for_EGI() + + + +icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery + + +_spatial + + + +icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery + + +_spatial + + + icepyx.core.variables.Variables - -Variables - -_avail : NoneType, list -_session : NoneType -_vartype -_version : NoneType -path : NoneType -product : NoneType -wanted : NoneType, dict - -__init__(vartype, avail, wanted, session, product, version, path) -_check_valid_lists(vgrp, allpaths, var_list, beam_list, keyword_list) -_get_combined_list(beam_list, keyword_list) -_get_sum_varlist(var_list, all_vars, defaults) -_iter_paths(sum_varlist, req_vars, vgrp, beam_list, keyword_list) -_iter_vars(sum_varlist, req_vars, vgrp) -append(defaults, var_list, beam_list, keyword_list) -avail(options, internal) -parse_var_list(varlist, tiered, tiered_vars) -remove(all, var_list, beam_list, keyword_list) + +Variables + +_avail : NoneType, list +_session : NoneType +_vartype +_version : NoneType +path : NoneType +product : NoneType +wanted : NoneType, dict + +__init__(vartype, avail, wanted, session, product, version, path) +_check_valid_lists(vgrp, allpaths, var_list, beam_list, keyword_list) +_get_combined_list(beam_list, keyword_list) +_get_sum_varlist(var_list, all_vars, defaults) +_iter_paths(sum_varlist, req_vars, vgrp, beam_list, keyword_list) +_iter_vars(sum_varlist, req_vars, vgrp) +append(defaults, var_list, beam_list, keyword_list) +avail(options, internal) +parse_var_list(varlist, tiered, tiered_vars) +remove(all, var_list, beam_list, keyword_list) - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_order_vars + + +_order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_order_vars + + +_order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_file_vars + + +_file_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read - - -_read_vars + + +_read_vars - + icepyx.core.visualization.Visualize - -Visualize - -bbox : list -cycles : NoneType -date_range : NoneType -product : NoneType, str -tracks : NoneType - -__init__(query_obj, product, spatial_extent, date_range, cycles, tracks) -generate_OA_parameters(): list -grid_bbox(binsize): list -make_request(base_url, payload) -parallel_request_OA(): da.array -query_icesat2_filelist(): tuple -request_OA_data(paras): da.array -viz_elevation(): (hv.DynamicMap, hv.Layout) + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : str, NoneType +tracks : NoneType + +__init__(query_obj, product, spatial_extent, date_range, cycles, tracks) +generate_OA_parameters(): list +grid_bbox(binsize): list +make_request(base_url, payload) +parallel_request_OA(): da.array +query_icesat2_filelist(): tuple +request_OA_data(paras): da.array +viz_elevation(): (hv.DynamicMap, hv.Layout) diff --git a/doc/source/user_guide/documentation/classes_user_uml.svg b/doc/source/user_guide/documentation/classes_user_uml.svg index 22206d703..2498f2cfe 100644 --- a/doc/source/user_guide/documentation/classes_user_uml.svg +++ b/doc/source/user_guide/documentation/classes_user_uml.svg @@ -4,95 +4,95 @@ - - + + classes_user_uml - + icepyx.core.Earthdata.Earthdata - -Earthdata - + +Earthdata + capability_url email netrc : NoneType -pswd : str, NoneType +pswd : NoneType, str session : Session uid - + login(attempts) icepyx.core.query.GenQuery - -GenQuery - -extent_type : str - - + +GenQuery + + + icepyx.core.granules.Granules - -Granules - -avail : list -orderIDs : list - -download(verbose, path, session, restart) -get_avail(CMRparams, reqparams) -place_order(CMRparams, reqparams, subsetparams, verbose, subset, session, geom_filepath) + +Granules + +avail : list +orderIDs : list + +download(verbose, path, session, restart) +get_avail(CMRparams, reqparams, cloud) +place_order(CMRparams, reqparams, subsetparams, verbose, subset, session, geom_filepath) icepyx.core.query.Query - -Query - -CMRparams -cycles -dataset -dates -end_time -file_vars -granules -order_vars -product -product_version -reqparams -spatial_extent -start_time -tracks - -avail_granules(ids, cycles, tracks, s3urls) -download_granules(path, verbose, subset, restart) -earthdata_login(uid, email, s3token) -latest_version() -order_granules(verbose, subset, email) -product_all_info() -product_summary_info() -show_custom_options(dictview) -subsetparams() -visualize_elevation() -visualize_spatial_extent() + +Query + +CMRparams +cycles +dataset +dates +end_time +file_vars +granules +order_vars +product +product_version +reqparams +spatial +spatial_extent +start_time +tracks + +avail_granules(ids, cycles, tracks, s3urls) +download_granules(path, verbose, subset, restart) +earthdata_login(uid, email, s3token) +latest_version() +order_granules(verbose, subset, email) +product_all_info() +product_summary_info() +show_custom_options(dictview) +subsetparams() +visualize_elevation() +visualize_spatial_extent() icepyx.core.granules.Granules->icepyx.core.query.Query - - -_granules + + +_granules icepyx.core.granules.Granules->icepyx.core.query.Query - - -_granules + + +_granules @@ -106,151 +106,179 @@ icepyx.core.exceptions.NsidcQueryError - -NsidcQueryError - -errmsg -msgtxt : str - - + +NsidcQueryError + +errmsg +msgtxt : str + + icepyx.core.exceptions.QueryError - -QueryError - - - + +QueryError + + + icepyx.core.exceptions.NsidcQueryError->icepyx.core.exceptions.QueryError - - + + icepyx.core.APIformatting.Parameters - -Parameters - -fmted_keys -partype -poss_keys - -build_params() -check_req_values() -check_values() + +Parameters + +fmted_keys +partype +poss_keys + +build_params() +check_req_values() +check_values() icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_CMRparams + + +_CMRparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_reqparams + + +_reqparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_subsetparams + + +_subsetparams icepyx.core.APIformatting.Parameters->icepyx.core.query.Query - - -_subsetparams + + +_subsetparams icepyx.core.query.Query->icepyx.core.query.GenQuery - - + + icepyx.core.read.Read - -Read - -data_source : NoneType -is2catalog -vars - -load() + +Read + +data_source : NoneType +is2catalog +vars + +load() - + +icepyx.core.spatial.Spatial + +Spatial + +extent +extent_as_gdf +extent_file +extent_type + +fmt_for_CMR() +fmt_for_EGI() + + + +icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery + + +_spatial + + + +icepyx.core.spatial.Spatial->icepyx.core.query.GenQuery + + +_spatial + + + icepyx.core.variables.Variables - -Variables - -path : NoneType -product : NoneType -wanted : dict, NoneType - -append(defaults, var_list, beam_list, keyword_list) -avail(options, internal) -parse_var_list(varlist, tiered, tiered_vars) -remove(all, var_list, beam_list, keyword_list) + +Variables + +path : NoneType +product : NoneType +wanted : NoneType, dict + +append(defaults, var_list, beam_list, keyword_list) +avail(options, internal) +parse_var_list(varlist, tiered, tiered_vars) +remove(all, var_list, beam_list, keyword_list) - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_order_vars + + +_order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_order_vars + + +_order_vars - + icepyx.core.variables.Variables->icepyx.core.query.Query - - -_file_vars + + +_file_vars - + icepyx.core.variables.Variables->icepyx.core.read.Read - - -_read_vars + + +_read_vars - + icepyx.core.visualization.Visualize - -Visualize - -bbox : list -cycles : NoneType -date_range : NoneType -product : str, NoneType -tracks : NoneType - -generate_OA_parameters(): list -grid_bbox(binsize): list -make_request(base_url, payload) -parallel_request_OA(): da.array -query_icesat2_filelist(): tuple -request_OA_data(paras): da.array -viz_elevation(): (hv.DynamicMap, hv.Layout) + +Visualize + +bbox : list +cycles : NoneType +date_range : NoneType +product : str, NoneType +tracks : NoneType + +generate_OA_parameters(): list +grid_bbox(binsize): list +make_request(base_url, payload) +parallel_request_OA(): da.array +query_icesat2_filelist(): tuple +request_OA_data(paras): da.array +viz_elevation(): (hv.DynamicMap, hv.Layout) diff --git a/doc/source/user_guide/documentation/components.rst b/doc/source/user_guide/documentation/components.rst index 5a72d6c8c..cfe07b39a 100644 --- a/doc/source/user_guide/documentation/components.rst +++ b/doc/source/user_guide/documentation/components.rst @@ -19,10 +19,10 @@ Earthdata :undoc-members: :show-inheritance: -geospatial +spatial ---------- -.. automodule:: icepyx.core.geospatial +.. automodule:: icepyx.core.spatial :members: :undoc-members: :show-inheritance: diff --git a/doc/source/user_guide/documentation/packages_user_uml.svg b/doc/source/user_guide/documentation/packages_user_uml.svg index d2a2370b1..e622bfb2f 100644 --- a/doc/source/user_guide/documentation/packages_user_uml.svg +++ b/doc/source/user_guide/documentation/packages_user_uml.svg @@ -4,11 +4,11 @@ - + packages_user_uml - + icepyx.core @@ -33,38 +33,32 @@ icepyx.core.exceptions - - -icepyx.core.geospatial - -icepyx.core.geospatial - - + icepyx.core.granules icepyx.core.granules - + icepyx.core.icesat2data - -icepyx.core.icesat2data + +icepyx.core.icesat2data - + icepyx.core.is2cat - -icepyx.core.is2cat + +icepyx.core.is2cat - + icepyx.core.is2ref - -icepyx.core.is2ref + +icepyx.core.is2ref - + icepyx.core.query icepyx.core.query @@ -106,7 +100,7 @@ - + icepyx.core.read icepyx.core.read @@ -117,11 +111,17 @@ + + +icepyx.core.spatial + +icepyx.core.spatial + icepyx.core.validate_inputs - -icepyx.core.validate_inputs + +icepyx.core.validate_inputs diff --git a/doc/source/user_guide/documentation/query.rst b/doc/source/user_guide/documentation/query.rst index fc499b08d..f27e3e6fd 100644 --- a/doc/source/user_guide/documentation/query.rst +++ b/doc/source/user_guide/documentation/query.rst @@ -29,6 +29,7 @@ Attributes Query.granules Query.order_vars Query.reqparams + Query.spatial Query.spatial_extent Query.subsetparams Query.start_time diff --git a/icepyx/core/APIformatting.py b/icepyx/core/APIformatting.py index d7aaf5613..55d49f84c 100644 --- a/icepyx/core/APIformatting.py +++ b/icepyx/core/APIformatting.py @@ -1,13 +1,8 @@ # Generate and format information for submitting to API (CMR and NSIDC) import datetime as dt -import geopandas as gpd import pprint -from shapely.geometry import Polygon -from shapely.geometry.polygon import orient -import fiona -fiona.drvsupport.supported_drivers["LIBKML"] = "rw" # ---------------------------------------------------------------------- # parameter-specific formatting for display @@ -57,59 +52,6 @@ def _fmt_temporal(start, end, key): return {key: fmt_timerange} -def _fmt_spatial(ext_type, extent): - """ - Format the spatial extent input into a spatial CMR search or subsetting key value. - - Parameters - ---------- - ext_type : string - Spatial extent type. Must be one of ['bounding_box', 'polygon'] for data searching - or one of ['bbox, 'Boundingshape'] for subsetting. - extent : list - Spatial extent, with input format dependent on the extent type and search. - Bounding box (bounding_box, bbox) coordinates should be provided in decimal degrees as - [lower-left-longitude, lower-left-latitute, upper-right-longitude, upper-right-latitude]. - Polygon (polygon, Boundingshape) coordinates should be provided in decimal degrees as - [longitude, latitude, longitude2, latitude2... longituden, latituden]. - - Returns - ------- - dictionary with properly formatted spatial parameter for CMR search or subsetting - - """ - - # CMR keywords: ['bounding_box', 'polygon'] - # subsetting keywords: ['bbox','Boundingshape'] - assert ext_type in ["bounding_box", "polygon"] or ext_type in [ - "bbox", - "Boundingshape", - ], "Invalid spatial extent type." - - if ext_type in ["bounding_box", "bbox"]: - fmt_extent = ",".join(map(str, extent)) - - elif ext_type == "polygon": - # Simplify polygon. The larger the tolerance value, the more simplified the polygon. See Bruce Wallin's function to do this - poly = extent.simplify(0.05, preserve_topology=False) - poly = orient(poly, sign=1.0) - - # Format dictionary to polygon coordinate pairs for API submission - polygon = ( - ",".join([str(c) for xy in zip(*poly.exterior.coords.xy) for c in xy]) - ).split(",") - extent = [float(i) for i in polygon] - fmt_extent = ",".join(map(str, extent)) - - # DevNote: this elif currently does not have a test (seems like it would just be testing geopandas?) - elif ext_type == "Boundingshape": - poly = orient(extent, sign=1.0) - fmt_extent = gpd.GeoSeries(poly).to_json() - fmt_extent = fmt_extent.replace(" ", "") # remove spaces for API call - - return {ext_type: fmt_extent} - - def _fmt_readable_granules(dset, **kwds): """ Create list of readable granule names for CMR queries @@ -500,4 +442,4 @@ def build_params(self, **kwargs): elif kwargs["extent_type"] == "polygon": k = "Boundingshape" - self._fmted_keys.update(_fmt_spatial(k, kwargs["spatial_extent"])) + self._fmted_keys.update({k: kwargs["spatial_extent"]}) diff --git a/icepyx/core/geospatial.py b/icepyx/core/geospatial.py deleted file mode 100644 index 3afba875a..000000000 --- a/icepyx/core/geospatial.py +++ /dev/null @@ -1,87 +0,0 @@ -import geopandas as gpd -from shapely.geometry import Polygon - -# DevGoal: need to update the spatial_extent docstring to describe coordinate order for input -def geodataframe(extent_type, spatial_extent, file=False): - """ - Return a geodataframe of the spatial extent - - Parameters - ---------- - extent_type : string - One of 'bounding_box' or 'polygon', indicating what type of input the spatial extent is - - spatial_extent : string - A string of the spatial extent. If file is False, the string should be a - list of coordinates in decimal degrees of [lower-left-longitude, - lower-left-latitute, upper-right-longitude, upper-right-latitude] or - [longitude1, latitude1, longitude2, latitude2, ... longitude_n,latitude_n, longitude1,latitude1]. - If file is True, the string is the full file path and filename to the - file containing the desired spatial extent. - - file : boolean, default False - Indication for whether the spatial_extent string is a filename or coordinate list - - See Also - -------- - icepyx.Query - - Examples - -------- - >>> reg_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) - >>> gdf = geodataframe(reg_a.extent_type, reg_a._spat_extent) - >>> gdf.geometry - 0 POLYGON ((-55.00000 68.00000, -55.00000 71.000... - Name: geometry, dtype: geometry - """ - - if extent_type == "bounding_box": - boxx = [ - spatial_extent[0], - spatial_extent[0], - spatial_extent[2], - spatial_extent[2], - spatial_extent[0], - ] - boxy = [ - spatial_extent[1], - spatial_extent[3], - spatial_extent[3], - spatial_extent[1], - spatial_extent[1], - ] - # DevGoal: check to see that the box is actually correctly constructed; have not checked actual location of test coordinates - gdf = gpd.GeoDataFrame(geometry=[Polygon(list(zip(boxx, boxy)))]) - - # DevGoal: Currently this if/else within this elif are not tested... - # DevGoal: the crs setting and management needs to be improved - elif extent_type == "polygon" and file == False: - # DevGoal: look into when/if this if is even called. I think all the incoming spatial_extents without a file will be floats... - # DEL: I don't think this if is ever used, so long as the spatial extent always comes in as a list of floats - # if isinstance(spatial_extent,str): - # print('this string instance is needed') - # spat_extent = spatial_extent.split(',') - # spatial_extent_geom = Polygon(zip(spat_extent[0::2], spat_extent[1::2])) - if isinstance(spatial_extent, Polygon): - spatial_extent_geom = spatial_extent - else: - spatial_extent_geom = Polygon( - zip(spatial_extent[0::2], spatial_extent[1::2]) - ) # spatial_extent - - gdf = gpd.GeoDataFrame( - index=[0], crs="epsg:4326", geometry=[spatial_extent_geom] - ) - - # DevGoal: Currently this elif isn't tested... - elif extent_type == "polygon" and file == True: - gdf = gpd.read_file(spatial_extent) - - else: - raise TypeError( - "Your spatial extent type is not an accepted input and a geodataframe cannot be constructed" - ) - # DevNote: can't get test for this else to pass if print the extent_type in the string... - # raise TypeError("Your spatial extent type (" + extent_type + ") is not an accepted input and a geodataframe cannot be constructed") - - return gdf diff --git a/icepyx/core/granules.py b/icepyx/core/granules.py index d3a9adac0..5a7972963 100644 --- a/icepyx/core/granules.py +++ b/icepyx/core/granules.py @@ -35,7 +35,7 @@ def info(grans): # DevNote: currently this fn is not tested # DevNote: could add flag to separate ascending and descending orbits based on ATL03 granule region -def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, s3urls=False): +def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, cloud=False): """ Returns a list of granule information for each granule dictionary in the input list of granule dictionaries. Granule info may be from a list of those available from NSIDC (for ordering/download) @@ -53,7 +53,7 @@ def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, s3urls=Fa Return a list of the available Reference Ground Tracks (RGTs) for the granule dictionary dates : boolean, default False Return a list of the available dates for the granule dictionary. - s3urls : boolean, default False + cloud : boolean, default False Return a a list of AWS s3 urls for the available granules in the granule dictionary. Note: currently, NSIDC does not provide metadata on which granules are available on s3. Thus, all of the urls may not be valid and may return FileNotFoundErrors. @@ -76,8 +76,6 @@ def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, s3urls=Fa if int(gran["producer_granule_id"][3:5]) > 13: continue - # ultimately use this to get the s3urls from the metadata - # gran_s3urls.append(gran["links"][]) else: # PRD: ICESat-2 product @@ -112,9 +110,14 @@ def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, s3urls=Fa gran_dates.append( str(datetime.datetime(year=int(YY), month=int(MM), day=int(DD)).date()) ) - gran_s3urls.append( - f"s3://nsidc-cumulus-prod-protected/ATLAS/{PRD}/{RL}/{YY}/{MM}/{DD}/{producer_granule_id}" - ) + + try: + for link in gran["links"]: + if link["href"].startswith("s3") and link["href"].endswith(".h5"): + gran_s3urls.append(link["href"]) + except KeyError: + pass + # list of granule parameters gran_list = [] # granule IDs @@ -130,12 +133,7 @@ def gran_IDs(grans, ids=True, cycles=False, tracks=False, dates=False, s3urls=Fa if dates: gran_list.append(gran_dates) # AWS s3 url - if s3urls: - warnings.filterwarnings("always") - warnings.warn( - "You MUST be pre-authenticated by NSIDC as a beta tester to have cloud access to ICESat-2 data", - UserWarning, - ) + if cloud: gran_list.append(gran_s3urls) # return the list of granule parameters return gran_list @@ -171,7 +169,7 @@ def __init__( # ---------------------------------------------------------------------- # Methods - def get_avail(self, CMRparams, reqparams): + def get_avail(self, CMRparams, reqparams, cloud=False): """ Get a list of available granules for the query object's parameters. Generates the `avail` attribute of the granules object. @@ -183,6 +181,8 @@ def get_avail(self, CMRparams, reqparams): reqparams : dictionary Dictionary of properly formatted parameters required for searching, ordering, or downloading from NSIDC. + cloud : boolean, default False + Whether or not you want data available in the cloud (versus on premises). Notes ----- @@ -207,8 +207,13 @@ def get_avail(self, CMRparams, reqparams): headers = {"Accept": "application/json", "Client-Id": "icepyx"} # note we should also check for errors whenever we ping NSIDC-API - make a function to check for errors + if cloud: + prov_flag = "NSIDC_CPRD" + else: + prov_flag = "NSIDC_ECS" + params = apifmt.combine_params( - CMRparams, {k: reqparams[k] for k in ["page_size"]} + CMRparams, {k: reqparams[k] for k in ["page_size"]}, {"provider": prov_flag} ) cmr_search_after = None diff --git a/icepyx/core/query.py b/icepyx/core/query.py index 7a1f74a13..a13c61345 100644 --- a/icepyx/core/query.py +++ b/icepyx/core/query.py @@ -19,8 +19,8 @@ # QUESTION: why doesn't from granules import Granules as Granules work, since granules=icepyx.core.granules? # from icepyx.core.granules import Granules from icepyx.core.variables import Variables as Variables -import icepyx.core.geospatial as geospatial import icepyx.core.validate_inputs as val +import icepyx.core.spatial as spat from icepyx.core.visualization import Visualize @@ -37,6 +37,10 @@ class GenQuery: spatial_extent : list of coordinates or string (i.e. file name) Spatial extent of interest, provided as a bounding box, list of polygon coordinates, or geospatial polygon file. + NOTE: Longitude values are assumed to be in the range -180 to +180, + with 0 being the Prime Meridian (Greenwich). See xdateline for regions crossing the date line. + You can submit at most one bounding box or list of polygon coordinates. + Per NSIDC requirements, geospatial polygon files may only contain one feature (polygon). Bounding box coordinates should be provided in decimal degrees as [lower-left-longitude, lower-left-latitute, upper-right-longitude, upper-right-latitude]. Polygon coordinates should be provided as coordinate pairs in decimal degrees as @@ -44,7 +48,6 @@ class GenQuery: or [longitude1, latitude1, longitude2, latitude2, ... longitude_n,latitude_n, longitude1,latitude1]. Your list must contain at least four points, where the first and last are identical. - DevGoal: adapt code so the polygon is automatically closed if need be Geospatial polygon files are entered as strings with the full file path and must contain only one polygon with the area of interest. Currently supported formats are: kml, shp, and gpkg @@ -53,18 +56,25 @@ class GenQuery: The required date format is 'YYYY-MM-DD' strings, where YYYY = 4 digit year, MM = 2 digit month, DD = 2 digit day. Currently, a list of specific dates (rather than a range) is not accepted. - DevGoal: accept date-time objects, dicts (with 'start_date' and 'end_date' keys, and DOY inputs). - DevGoal: allow searches with a list of dates, rather than a range. + TODO: accept date-time objects, dicts (with 'start_date' and 'end_date' keys, and DOY inputs). + TODO: allow searches with a list of dates, rather than a range. start_time : HH:mm:ss, default 00:00:00 Start time in UTC/Zulu (24 hour clock). If None, use default. - DevGoal: check for time in date-range date-time object, if that's used for input. + TODO: check for time in date-range date-time object, if that's used for input. end_time : HH:mm:ss, default 23:59:59 End time in UTC/Zulu (24 hour clock). If None, use default. - DevGoal: check for time in date-range date-time object, if that's used for input. + TODO: check for time in date-range date-time object, if that's used for input. + xdateline : boolean, default None + Keyword argument to enforce spatial inputs that cross the International Date Line. + Internally, this will translate your longitudes to 0 to 360 to construct the + correct, valid Shapely geometry. + + WARNING: This will allow your request to be properly submitted and visualized. + However, this flag WILL NOT automatically correct for incorrectly ordered spatial inputs. Examples -------- - Init with bounding box + Initializing Query with a bounding box >>> reg_a_bbox = [-55, 68, -48, 71] >>> reg_a_dates = ['2019-02-20','2019-02-28'] @@ -81,7 +91,7 @@ class GenQuery: >>> reg_a = GenQuery(reg_a_poly, reg_a_dates) >>> print(reg_a) Extent type: polygon - Coordinates: POLYGON ((-55 68, -55 71, -48 71, -48 68, -55 68)) + Coordinates: [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0] Date range: (2019-02-20 00:00:00, 2019-02-28 23:59:59) Initializing Query with a geospatial polygon file. @@ -91,7 +101,7 @@ class GenQuery: >>> reg_a = GenQuery(aoi, reg_a_dates) >>> print(reg_a) Extent type: polygon - Coordinates: POLYGON ((-55 68, -55 71, -48 71, -48 68, -55 68)) + Coordinates: [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0] Date range: (2019-02-22 00:00:00, 2019-02-28 23:59:59) See Also @@ -101,20 +111,30 @@ class GenQuery: """ def __init__( - self, spatial_extent=None, date_range=None, start_time=None, end_time=None + self, + spatial_extent=None, + date_range=None, + start_time=None, + end_time=None, + **kwargs, ): # validate & init spatial extent - self.extent_type, self._spat_extent, self._geom_filepath = val.spatial( - spatial_extent - ) + if "xdateline" in kwargs.keys(): + self._spatial = spat.Spatial(spatial_extent, xdateline=kwargs["xdateline"]) + else: + self._spatial = spat.Spatial(spatial_extent) # valiidate and init temporal constraints + # TODO: Update this to use Temporal class when completed if date_range: self._start, self._end = val.temporal(date_range, start_time, end_time) def __str__(self): str = "Extent type: {0} \nCoordinates: {1}\nDate range: ({2}, {3})".format( - self.extent_type, self._spat_extent, self._start, self._end + self._spatial._ext_type, + self._spatial._spatial_ext, + self._start, + self._end, ) return str @@ -123,7 +143,7 @@ def __str__(self): # Note: add files to docstring once implemented # DevNote: currently this class is not tested class Query(GenQuery): - r""" + """ Query and get ICESat-2 data ICESat-2 Data object to query, obtain, and perform basic operations on @@ -164,7 +184,7 @@ class Query(GenQuery): >>> reg_a = Query('ATL06', reg_a_bbox, reg_a_dates) >>> print(reg_a) Product ATL06 v005 - ('bounding box', [-55.0, 68.0, -48.0, 71.0]) + ('bounding_box', [-55.0, 68.0, -48.0, 71.0]) Date range ['2019-02-20', '2019-02-28'] Initializing Query with a list of polygon vertex coordinate pairs. @@ -173,9 +193,7 @@ class Query(GenQuery): >>> reg_a_dates = ['2019-02-20','2019-02-28'] >>> reg_a = Query('ATL06', reg_a_poly, reg_a_dates) >>> reg_a.spatial_extent - ('polygon', - (array('d', [-55.0, -55.0, -48.0, -48.0, -55.0]), - array('d', [68.0, 71.0, 71.0, 68.0, 68.0]))) + ('polygon', [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0]) Initializing Query with a geospatial polygon file. @@ -184,7 +202,7 @@ class Query(GenQuery): >>> reg_a = Query('ATL06', aoi, reg_a_dates) >>> print(reg_a) Product ATL06 v005 - ('polygon', (array('d', [-55.0, -55.0, -48.0, -48.0, -55.0]), array('d', [68.0, 71.0, 71.0, 68.0, 68.0]))) + ('polygon', [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0]) Date range ['2019-02-22', '2019-02-28'] See Also @@ -206,9 +224,8 @@ def __init__( cycles=None, tracks=None, files=None, # NOTE: if you end up implemeting this feature here, use a better variable name than "files" + **kwargs, ): - # warnings.filterwarnings("always") - # warnings.warn("Please note: as of 2020-05-05, a major reorganization of the core icepyx.query code may result in errors produced by now depricated functions. Please see our documentation pages or example notebooks for updates.") # Check necessary combination of input has been specified if ( @@ -233,7 +250,7 @@ def __init__( self._prod = is2ref._validate_product(product) - super().__init__(spatial_extent, date_range, start_time, end_time) + super().__init__(spatial_extent, date_range, start_time, end_time, **kwargs) self._version = val.prod_version(self.latest_version(), version) @@ -303,6 +320,33 @@ def product_version(self): """ return self._version + @property + def spatial(self): + """ + Return the spatial object, which provides the underlying functionality for validating + and formatting geospatial objects. The spatial object has several properties to enable + user access to the stored spatial extent in multiple formats. + + See Also + -------- + spatial.Spatial.spatial_extent + spatial.Spatial.extent_type + spatial.Spatial.extent_file + spatial.Spatial + + Examples + -------- + >>> reg_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) + >>> reg_a.spatial # doctest: +SKIP + + + >>> print(reg_a.spatial) + Extent type: bounding_box + Coordinates: [-55.0, 68.0, -48.0, 71.0] + + """ + return self._spatial + @property def spatial_extent(self): """ @@ -310,7 +354,14 @@ def spatial_extent(self): Spatial extent is returned as an input type (which depends on how you initially entered your spatial data) followed by the geometry data. Bounding box data is [lower-left-longitude, lower-left-latitute, upper-right-longitude, upper-right-latitude]. - Polygon data is [[array of longitudes],[array of corresponding latitudes]]. + Polygon data is [longitude1, latitude1, longitude2, latitude2, + ... longitude_n,latitude_n, longitude1,latitude1]. + + Returns + ------- + tuple of length 2 + First tuple element is the spatial type ("bounding box" or "polygon"). + Second tuple element is the spatial extent as a list of coordinates. Examples -------- @@ -318,25 +369,24 @@ def spatial_extent(self): # Note: coordinates returned as float, not int >>> reg_a = Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) >>> reg_a.spatial_extent - ('bounding box', [-55.0, 68.0, -48.0, 71.0]) + ('bounding_box', [-55.0, 68.0, -48.0, 71.0]) >>> reg_a = Query('ATL06',[(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)],['2019-02-20','2019-02-28']) >>> reg_a.spatial_extent - ('polygon', (array('d', [-55.0, -55.0, -48.0, -48.0, -55.0]), array('d', [68.0, 71.0, 71.0, 68.0, 68.0]))) + ('polygon', [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0]) # NOTE Is this where we wanted to put the file-based test/example? # The test file path is: examples/supporting_files/simple_test_poly.gpkg + See Also + -------- + Spatial.extent + Spatial.extent_type + Spatial.extent_as_gdf + """ - if self.extent_type == "bounding_box": - return ("bounding box", self._spat_extent) - elif self.extent_type == "polygon": - # return ['polygon', self._spat_extent] - # Note: self._spat_extent is a shapely geometry object - return ("polygon", self._spat_extent.exterior.coords.xy) - else: - return ("unknown spatial type", None) + return (self._spatial._ext_type, self._spatial._spatial_ext) @property def dates(self): @@ -475,8 +525,8 @@ def CMRparams(self): self._CMRparams.build_params( product=self.product, version=self._version, - extent_type=self.extent_type, - spatial_extent=self._spat_extent, + extent_type=self._spatial._ext_type, + spatial_extent=self._spatial.fmt_for_CMR(), **kwargs, ) @@ -546,17 +596,17 @@ def subsetparams(self, **kwargs): else: if self._subsetparams == None: self._subsetparams = apifmt.Parameters("subset") - if self._geom_filepath is not None: + if self._spatial._geom_file is not None: self._subsetparams.build_params( - geom_filepath=self._geom_filepath, - extent_type=self.extent_type, - spatial_extent=self._spat_extent, + geom_filepath=self._spatial._geom_file, + extent_type=self._spatial._ext_type, + spatial_extent=self._spatial.fmt_for_EGI(), **kwargs, ) else: self._subsetparams.build_params( - extent_type=self.extent_type, - spatial_extent=self._spat_extent, + extent_type=self._spatial._ext_type, + spatial_extent=self._spatial.fmt_for_EGI(), **kwargs, ) @@ -858,7 +908,7 @@ def is_ec2(): self._email = email # DevGoal: check to make sure the see also bits of the docstrings work properly in RTD - def avail_granules(self, ids=False, cycles=False, tracks=False, s3urls=False): + def avail_granules(self, ids=False, cycles=False, tracks=False, cloud=False): """ Obtain information about the available granules for the query object's parameters. By default, a complete list of available granules is @@ -876,8 +926,10 @@ def avail_granules(self, ids=False, cycles=False, tracks=False, s3urls=False): tracks : boolean, default False Indicates whether the function should return a list of RGTs. - s3urls : boolean, default False - Indicates whether the function should return a list of potential AWS s3 urls. + cloud : boolean, default False + Indicates whether the function should return data available in the cloud. + Note: except in rare cases while data is in the process of being appended to, + data available in the cloud and for download via on-premesis will be identical. Examples -------- @@ -902,22 +954,23 @@ def avail_granules(self, ids=False, cycles=False, tracks=False, s3urls=False): try: self.granules.avail except AttributeError: - self.granules.get_avail(self.CMRparams, self.reqparams) + self.granules.get_avail(self.CMRparams, self.reqparams, cloud=cloud) - if ids or cycles or tracks or s3urls: - # list of outputs in order of ids, cycles, tracks, s3urls + if ids or cycles or tracks or cloud: + # list of outputs in order of ids, cycles, tracks, cloud return granules.gran_IDs( self.granules.avail, ids=ids, cycles=cycles, tracks=tracks, - s3urls=s3urls, + cloud=cloud, ) else: return granules.info(self.granules.avail) # DevGoal: display output to indicate number of granules successfully ordered (and number of errors) - # DevGoal: deal with subset=True for variables now, and make sure that if a variable subset Coverage kwarg is input it's successfully passed through all other functions even if this is the only one run. + # DevGoal: deal with subset=True for variables now, and make sure that if a variable subset + # Coverage kwarg is input it's successfully passed through all other functions even if this is the only one run. def order_granules(self, verbose=False, subset=True, email=False, **kwargs): """ Place an order for the available granules for the query object. @@ -984,7 +1037,8 @@ def order_granules(self, verbose=False, subset=True, email=False, **kwargs): ): del self._subsetparams - # REFACTOR: add checks here to see if the granules object has been created, and also if it already has a list of avail granules (if not, need to create one and add session) + # REFACTOR: add checks here to see if the granules object has been created, + # and also if it already has a list of avail granules (if not, need to create one and add session) if not hasattr(self, "_granules"): self.granules @@ -1005,7 +1059,7 @@ def order_granules(self, verbose=False, subset=True, email=False, **kwargs): verbose, subset, session=self._session, - geom_filepath=self._geom_filepath, + geom_filepath=self._spatial._geom_file, ) else: @@ -1016,7 +1070,7 @@ def order_granules(self, verbose=False, subset=True, email=False, **kwargs): verbose, subset, session=self._session, - geom_filepath=self._geom_filepath, + geom_filepath=self._spatial._geom_file, ) # DevGoal: put back in the kwargs here so that people can just call download granules with subset=False! @@ -1100,7 +1154,8 @@ def visualize_spatial_extent( >>> reg_a.visualize_spatial_extent # doctest: +SKIP [visual map output] """ - gdf = geospatial.geodataframe(self.extent_type, self._spat_extent) + + gdf = self._spatial.extent_as_gdf try: from shapely.geometry import Polygon @@ -1108,8 +1163,7 @@ def visualize_spatial_extent( gv.extension("bokeh") - line_geoms = Polygon(gdf["geometry"][0]).boundary - bbox_poly = gv.Path(line_geoms).opts(color="red", line_color="red") + bbox_poly = gv.Path(gdf["geometry"]).opts(color="red", line_color="red") tile = gv.tile_sources.EsriImagery.opts(width=500, height=500) return tile * bbox_poly diff --git a/icepyx/core/spatial.py b/icepyx/core/spatial.py new file mode 100644 index 000000000..a0c09fd95 --- /dev/null +++ b/icepyx/core/spatial.py @@ -0,0 +1,683 @@ +import geopandas as gpd +import numpy as np +import os +from pathlib import Path +from shapely.geometry import box, Polygon +from shapely.geometry.polygon import orient +import warnings + +import icepyx.core.APIformatting as apifmt + +# DevGoal: need to update the spatial_extent docstring to describe coordinate order for input + + +def geodataframe(extent_type, spatial_extent, file=False, xdateline=None): + """ + Return a geodataframe of the spatial extent + + Parameters + ---------- + extent_type : string + One of 'bounding_box' or 'polygon', indicating what type of input the spatial extent is + + spatial_extent : string or list + A list containing the spatial extent OR a string containing a filename. + If file is False, spatial_extent should be a + list of coordinates in decimal degrees of [lower-left-longitude, + lower-left-latitute, upper-right-longitude, upper-right-latitude] or + [longitude1, latitude1, longitude2, latitude2, ... longitude_n,latitude_n, longitude1,latitude1]. + + If file is True, spatial_extent is a string containing the full file path and filename to the + file containing the desired spatial extent. + + file : boolean, default False + Indication for whether the spatial_extent string is a filename or coordinate list + + Returns + ------- + gdf : GeoDataFrame + Returns a GeoPandas GeoDataFrame containing the spatial extent. + The GeoDataFrame will have only one entry unless a geospatial file + was submitted. + + See Also + -------- + icepyx.Query + + Examples + -------- + >>> reg_a = ipx.Query('ATL06',[-55, 68, -48, 71],['2019-02-20','2019-02-28']) + >>> gdf = geodataframe(reg_a.spatial.extent_type, reg_a.spatial.extent) + >>> gdf.geometry + 0 POLYGON ((-48.00000 68.00000, -48.00000 71.000... + Name: geometry, dtype: geometry + """ + + if xdateline is not None: + xdateline = xdateline + elif file: + pass + else: + xdateline = check_dateline(extent_type, spatial_extent) + # print("this should cross the dateline:" + str(xdateline)) + + if extent_type == "bounding_box": + if xdateline == True: + cartesian_lons = [i if i > 0 else i + 360 for i in spatial_extent[0:-1:2]] + cartesian_spatial_extent = [ + item + for pair in zip(cartesian_lons, spatial_extent[1::2]) + for item in pair + ] + bbox = box(*cartesian_spatial_extent) + else: + bbox = box(*spatial_extent) + + # TODO: test case that ensures gdf is constructed as expected (correct coords, order, etc.) + gdf = gpd.GeoDataFrame(geometry=[bbox], crs="epsg:4326") + + # DevGoal: Currently this if/else within this elif are not tested... + # DevGoal: the crs setting and management needs to be improved + + elif extent_type == "polygon" and file == False: + + # if spatial_extent is already a Polygon + if isinstance(spatial_extent, Polygon): + spatial_extent_geom = spatial_extent + + # else, spatial_extent must be a list of floats (or list of tuples of floats) + else: + if xdateline == True: + cartesian_lons = [ + i if i > 0 else i + 360 for i in spatial_extent[0:-1:2] + ] + spatial_extent = [ + item + for pair in zip(cartesian_lons, spatial_extent[1::2]) + for item in pair + ] + + spatial_extent_geom = Polygon( + # syntax of dbl colon is- "start:stop:steps" + # 0::2 = start at 0, grab every other coord after + # 1::2 = start at 1, grab every other coord after + zip(spatial_extent[0::2], spatial_extent[1::2]) + ) # spatial_extent + # TODO: check if the crs param should always just be epsg:4326 for everything OR if it should be a parameter + gdf = gpd.GeoDataFrame( + index=[0], crs="epsg:4326", geometry=[spatial_extent_geom] + ) + + # If extent_type is a polygon AND from a file, create a geopandas geodataframe from it + # DevGoal: Currently this elif isn't tested... + elif extent_type == "polygon" and file == True: + gdf = gpd.read_file(spatial_extent) + + else: + raise TypeError( + f"Your spatial extent type ({extent_type}) is not an accepted " + "input and a geodataframe cannot be constructed" + ) + + return gdf + + +def check_dateline(extent_type, spatial_extent): + """ + Check if a bounding box or polygon input cross the dateline. + + Parameters + ---------- + extent_type : string + One of 'bounding_box' or 'polygon', indicating what type of input the spatial extent is + + spatial_extent : list + A list containing the spatial extent as + coordinates in decimal degrees of + [longitude1, latitude1, longitude2, latitude2, ... longitude_n,latitude_n, longitude1,latitude1]. + + + Returns + ------- + boolean + indicating whether or not the spatial extent crosses the dateline. + """ + + if extent_type == "bounding_box": + if spatial_extent[0] > spatial_extent[2]: + # if lower left lon is larger then upper right lon, verify the values are crossing the dateline + assert spatial_extent[0] - 360 <= spatial_extent[2] + + warnings.warn( + "Your bounding box was identified as crossing the dateline." + "If this is not correct, please add `xdateline=False` to your `ipx.Query`" + ) + return True + + else: + return False + + # this works properly, but limits the user to at most 270 deg longitude... + elif extent_type == "polygon": + assert not isinstance( + spatial_extent[0], (list, tuple) + ), "Your polygon list is the wrong format for this function." + lonlist = spatial_extent[0:-1:2] + if np.any( + [abs(lonlist[i] - lonlist[i + 1]) > 270 for i in range(len(lonlist) - 1)] + ): + warnings.warn( + "Your polygon was identified as crossing the dateline." + "If this is not correct, please add `xdateline=False` to your `ipx.Query`" + ) + return True + else: + return False + + +def validate_bounding_box(spatial_extent): + """ + Validates the spatial_extent parameter as a bounding box. + + If the spatial_extent is a valid bounding box, returns a tuple containing the Spatial object parameters + for the bounding box; otherwise, throw an error containing the reason the bounding box is invalid. + + Parameters + ---------- + spatial_extent: list or np.ndarray + A list or np.ndarray of strings, numerics, or tuples + representing bounding box coordinates in decimal degrees. + + Must be provided in the order: + [lower-left-longitude, lower-left-latitude, + upper-right-longitude, upper-right-latitude]) + """ + + # Latitude must be between -90 and 90 (inclusive); check for this here + assert ( + -90 <= spatial_extent[1] <= 90 + ), "Invalid latitude value (must be between -90 and 90, inclusive)" + assert ( + -90 <= spatial_extent[3] <= 90 + ), "Invalid latitude value (must be between -90 and 90, inclusive)" + + assert ( + -180 <= spatial_extent[0] <= 180 + ), "Invalid longitude value (must be between -180 and 180, inclusive)" + assert ( + -180 <= spatial_extent[2] <= 180 + ), "Invalid longitude value (must be between -180 and 180, inclusive)" + + # If the lower left latitude is greater than the upper right latitude, throw an error + assert spatial_extent[1] <= spatial_extent[3], "Invalid bounding box latitudes" + + spatial_extent = [float(x) for x in spatial_extent] + + return "bounding_box", spatial_extent, None + + +def validate_polygon_pairs(spatial_extent): + """ + Validates the spatial_extent parameter as a polygon from coordinate pairs. + + If the spatial_extent is a valid polygon, returns a tuple containing the Spatial object parameters + for the polygon; + + otherwise, throw an error containing the reason the polygon is invalid. + + Parameters + ---------- + spatial_extent: list or np.ndarray + + A list or np.ndarray of tuples representing polygon coordinate pairs in decimal degrees in the order: + [(longitude1, latitude1), (longitude2, latitude2), ... + ... (longitude_n,latitude_n), (longitude1,latitude1)] + + If the first and last coordinate pairs are NOT equal, + the polygon will be closed automatically (last point will be connected to the first point). + """ + # Check to make sure all elements of spatial_extent are coordinate pairs; if not, raise an error + if any(len(i) != 2 for i in spatial_extent): + raise ValueError( + "Each element in spatial_extent should be a list or tuple of length 2" + ) + + # If there are less than 4 vertices, raise an error + assert len(spatial_extent) >= 4, "Your spatial extent polygon has too few vertices" + + if (spatial_extent[0][0] != spatial_extent[-1][0]) or ( + spatial_extent[0][1] != spatial_extent[-1][1] + ): + + # Throw a warning + warnings.warn( + "WARNING: Polygon's first and last point's coordinates differ," + " closing the polygon automatically." + ) + # Add starting long/lat to end + if isinstance(spatial_extent, list): + # use list.append() method + spatial_extent.append(spatial_extent[0]) + + elif isinstance(spatial_extent, np.ndarray): + # use np.insert() method + spatial_extent = np.insert( + spatial_extent, len(spatial_extent), spatial_extent[0] + ) + + polygon = (",".join([str(c) for xy in spatial_extent for c in xy])).split(",") + + # make all elements of polygon floats + polygon = [float(i) for i in polygon] + + return "polygon", polygon, None + + +def validate_polygon_list(spatial_extent): + """ + Validates the spatial_extent parameter as a polygon from a list of coordinates. + + If the spatial_extent is a valid polygon, returns a tuple containing the Spatial object parameters + for the polygon; + + otherwise, throw an error containing the reason the polygon is invalid. + + Parameters + ---------- + spatial_extent: list or np.ndarray + A list or np.ndarray of strings, numerics, or tuples representing polygon coordinates, + provided as coordinate pairs in decimal degrees in the order: + [longitude1, latitude1, longitude2, latitude2, ... + ... longitude_n,latitude_n, longitude1,latitude1] + + If the first and last coordinate pairs are NOT equal, + the polygon will be closed automatically (last point will be connected to the first point). + """ + + # user-entered polygon as a single list of lon and lat coordinates + assert len(spatial_extent) >= 8, "Your spatial extent polygon has too few vertices" + assert ( + len(spatial_extent) % 2 == 0 + ), "Your spatial extent polygon list should have an even number of entries" + + if (spatial_extent[0] != spatial_extent[-2]) or ( + spatial_extent[1] != spatial_extent[-1] + ): + warnings.warn( + "WARNING: Polygon's first and last point's coordinates differ," + " closing the polygon automatically." + ) + + # Add starting long/lat to end + if isinstance(spatial_extent, list): + # use list.append() method + spatial_extent.append(spatial_extent[0]) + spatial_extent.append(spatial_extent[1]) + + elif isinstance(spatial_extent, np.ndarray): + # use np.insert() method + spatial_extent = np.insert( + spatial_extent, len(spatial_extent), spatial_extent[0] + ) + spatial_extent = np.insert( + spatial_extent, len(spatial_extent), spatial_extent[1] + ) + + polygon = [float(i) for i in spatial_extent] + + return "polygon", polygon, None + + +def validate_polygon_file(spatial_extent): + """ + Validates the spatial_extent parameter as a polygon from a file. + + If the spatial_extent parameter contains a valid polygon, + returns a tuple containing the Spatial object parameters for the polygon; + + otherwise, throw an error containing the reason the polygon/polygon file is invalid. + + Parameters + ---------- + spatial_extent: string + A string representing a geospatial polygon file (kml, shp, gpkg) + * must provide full file path + * recommended for file to only contain 1 polygon. + * if multiple polygons, only the first polygon is selected at this time. + + """ + + # Check if the filename path exists; if not, throw an error + # print("print statements work \n") + # print("SPATIAL EXTENT: " + spatial_extent + "\n") + assert os.path.exists( + spatial_extent + ), "Check that the path and filename of your geometry file are correct" + + # DevGoal: more robust polygon inputting (see Bruce's code): + # correct for clockwise/counterclockwise coordinates, deal with simplification, etc. + + if spatial_extent.split(".")[-1] in ["kml", "shp", "gpkg"]: + extent_type = "polygon" + gdf = geodataframe(extent_type, spatial_extent, file=True) + + return "polygon", gdf, spatial_extent + + else: + raise TypeError("Input spatial extent file must be a kml, shp, or gpkg") + + +class Spatial: + def __init__(self, spatial_extent, **kwarg): + """ + Validates input from "spatial_extent" argument, then creates a Spatial object with validated inputs + as properties of the object. + + Spatial objects are to be used by icepyx.Query to store validated geospatial information required by the Query. + + Parameters + ---------- + spatial_extent : list or string + * list of coordinates + (stored in a list of strings, list of numerics, list of tuples, OR np.ndarray) as one of: + * bounding box + * provided in the order: [lower-left-longitude, lower-left-latitude, + upper-right-longitude, upper-right-latitude].) + * polygon + * provided as coordinate pairs in decimal degrees as one of: + * [(longitude1, latitude1), (longitude2, latitude2), ... + ... (longitude_n,latitude_n), (longitude1,latitude1)] + * [longitude1, latitude1, longitude2, latitude2, + ... longitude_n,latitude_n, longitude1,latitude1]. + * NOTE: If the first and last coordinate pairs are NOT equal, + the polygon will be closed automatically (last point will be connected to the first point). + * string representing a geospatial polygon file (kml, shp, gpkg) + * full file path + * recommended for file to only contain 1 polygon; if multiple, only selects first polygon rn + + xdateline : boolean, default None + Optional keyword argument to let user specify whether the spatial input crosses the dateline or not. + + + See Also + -------- + icepyx.Query + + + Examples + -------- + Initializing Spatial with a bounding box. + + >>> reg_a_bbox = [-55, 68, -48, 71] + >>> reg_a = Spatial(reg_a_bbox) + >>> print(reg_a) + Extent type: bounding_box + Coordinates: [-55.0, 68.0, -48.0, 71.0] + + Initializing Query with a list of polygon vertex coordinate pairs. + + >>> reg_a_poly = [(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)] + >>> reg_a = Spatial(reg_a_poly) + >>> print(reg_a) + Extent type: polygon + Coordinates: [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0] + + Initializing Query with a geospatial polygon file. + + >>> aoi = str(Path('./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg').resolve()) + >>> reg_a = Spatial(aoi) + >>> print(reg_a) # doctest: +SKIP + Extent Type: polygon + Source file: ./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg + Coordinates: [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0] + """ + + scalar_types = (int, float, np.int64) + + # Check if spatial_extent is a list of coordinates (bounding box or polygon) + if isinstance(spatial_extent, (list, np.ndarray)): + + # bounding box + if len(spatial_extent) == 4 and all( + isinstance(i, scalar_types) for i in spatial_extent + ): + ( + self._ext_type, + self._spatial_ext, + self._geom_file, + ) = validate_bounding_box(spatial_extent) + + # polygon (as list of lon, lat coordinate pairs, in tuples) + elif all( + type(i) in [list, tuple, np.ndarray] for i in spatial_extent + ) and all( + all(isinstance(i[j], scalar_types) for j in range(len(i))) + for i in spatial_extent + ): + ( + self._ext_type, + self._spatial_ext, + self._geom_file, + ) = validate_polygon_pairs(spatial_extent) + + # polygon (as list of lon, lat coordinate pairs, single "flat" list) + elif all(isinstance(i, scalar_types) for i in spatial_extent): + ( + self._ext_type, + self._spatial_ext, + self._geom_file, + ) = validate_polygon_list(spatial_extent) + else: + # TODO: Change this warning to be like "usage", tell user possible accepted input types + raise ValueError( + "Your spatial extent does not meet minimum input criteria or the input format is not correct" + ) + + # Check if spatial_extent is a string (i.e. a (potential) filename) + elif isinstance(spatial_extent, str): + self._ext_type, self._gdf_spat, self._geom_file = validate_polygon_file( + spatial_extent + ) + + # TODO: assess if it's necessary to have a value for _spatial_extent if the input is a file (since it can be plotted from the gdf) + extpoly = self._gdf_spat.geometry.unary_union.boundary + + try: + arrpoly = ( + ",".join([str(c) for xy in zip(*extpoly.coords.xy) for c in xy]) + ).split(",") + except NotImplementedError: + arrpoly = ( + ",".join( + [ + str(c) + for xy in zip(*extpoly.envelope.boundary.coords.xy) + for c in xy + ] + ) + ).split(",") + + self._spatial_ext = [float(i) for i in arrpoly] + + # check for cross dateline keyword submission + if "xdateline" in kwarg.keys(): + self._xdateln = kwarg["xdateline"] + assert self._xdateln in [ + True, + False, + ], "Your 'xdateline' value is invalid. It must be boolean." + + def __str__(self): + if self._geom_file is not None: + return "Extent type: {0}\nSource file: {1}\nCoordinates: {2}".format( + self._ext_type, self._geom_file, self._spatial_ext + ) + else: + return "Extent type: {0}\nCoordinates: {1}".format( + self._ext_type, self._spatial_ext + ) + + @property + def extent(self): + """ + Return the coordinates of the spatial extent of the Spatial object. + + The result will be returned as an array. + For input geometry files with multiple features, the boundary of the + the unary union of all features is returned. + + Returns + ------- + spatial extent : array + An array of bounding coordinates. + """ + + return self._spatial_ext + + @property + def extent_as_gdf(self): + """ + Return the spatial extent of the query object as a GeoPandas GeoDataframe. + + Returns + ------- + extent_gdf : GeoDataframe + A GeoDataframe containing the spatial region of interest. + """ + + # TODO: test this + if hasattr(self, "_xdateln"): + xdateln = self._xdateln + else: + xdateln = None + + if not hasattr(self, "_gdf_spat"): + if self._geom_file is not None: + self._gdf_spat = geodataframe( + self._ext_type, self._spatial_ext, file=True, xdateline=xdateln + ) + else: + self._gdf_spat = geodataframe( + self._ext_type, self._spatial_ext, xdateline=xdateln + ) + + return self._gdf_spat + + @property + def extent_type(self): + """ + Return the extent type of the Spatial object as a string. + + Examples + -------- + >>> reg_a = Spatial([-55, 68, -48, 71]) + >>> reg_a.extent_type + 'bounding_box' + + >>> reg_a = Spatial([(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)]) + >>> reg_a.extent_type + 'polygon' + """ + + return self._ext_type + + @property + def extent_file(self): + """ + Return the path to the geospatial polygon file containing the Spatial object's spatial extent. + If the spatial extent did not come from a file (i.e. user entered list of coordinates), this will return None. + + Examples + -------- + >>> reg_a = Spatial([-55, 68, -48, 71]) + >>> reg_a.extent_file + + + >>> reg_a = Spatial(str(Path('./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg').resolve())) + >>> reg_a.extent_file # doctest: +SKIP + ./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg + """ + return self._geom_file + + # ---------------------------------------------------------------------- + # Methods + + # TODO: can use this docstring as a todo list + def fmt_for_CMR(self): + """ + Format the spatial extent for NASA's Common Metadata Repository (CMR) API. + + CMR spatial inputs must be formatted a specific way. + This method formats the given spatial extent to be a valid submission. + For large/complex polygons, this includes simplifying the polygon (NOTE: currently not all polygons are simplified enough). + Coordinates will be properly ordered, and the required string formatting applied. + For small regions, a buffer may be added. + + Returns + ------- + string + Properly formatted string of spatial data for submission to CMR API. + + + """ + # CMR keywords: ['bounding_box', 'polygon'] + if self._ext_type == "bounding_box": + cmr_extent = ",".join(map(str, self._spatial_ext)) + + elif self._ext_type == "polygon": + poly = self.extent_as_gdf.geometry + + if any( + geomtype in ["MultiPoint", "MultiLineString", "MultiPolygon"] + for geomtype in poly.geom_type + ): + poly = poly.convex_hull + + poly = poly.unary_union + + # Simplify polygon. The larger the tolerance value, the more simplified the polygon. See Bruce Wallin's function to do this + poly = poly.simplify(0.05, preserve_topology=False) + poly = orient(poly, sign=1.0) + + # Format dictionary to polygon coordinate pairs for API submission + polygon = ( + ",".join([str(c) for xy in zip(*poly.exterior.coords.xy) for c in xy]) + ).split(",") + extent = [float(i) for i in polygon] + + # TODO: explore how this will be impacted if the polygon is read in from a shapefile and crosses the dateline + if hasattr(self, "_xdateln") and self._xdateln == True: + neg_lons = [i if i < 181.0 else i - 360 for i in extent[0:-1:2]] + extent = [item for pair in zip(neg_lons, extent[1::2]) for item in pair] + + cmr_extent = ",".join(map(str, extent)) + + return cmr_extent + + def fmt_for_EGI(self): + """ + Format the spatial extent input into a subsetting key value for submission to EGI (the NSIDC DAAC API). + + EGI spatial inputs must be formatted a specific way. + This method formats the given spatial extent to be a valid submission. + DevGoal: For large/complex polygons, this includes simplifying the polygon. + Coordinates will be properly ordered, and the required string formatting applied. + + Returns + ------- + string + Properly formatted json string for submission to EGI (NSIDC API). + """ + + # subsetting keywords: ['bbox','Boundingshape'] - these are set in APIformatting + if self._ext_type == "bounding_box": + egi_extent = ",".join(map(str, self._spatial_ext)) + + # TODO: add handling for polygons that cross the dateline + elif self._ext_type == "polygon": + poly = self.extent_as_gdf.geometry[0] + poly = orient(poly, sign=1.0) + egi_extent = gpd.GeoSeries(poly).to_json() + egi_extent = egi_extent.replace(" ", "") # remove spaces for API call + + return egi_extent diff --git a/icepyx/core/validate_inputs.py b/icepyx/core/validate_inputs.py index 3e5aad827..f74ffc209 100644 --- a/icepyx/core/validate_inputs.py +++ b/icepyx/core/validate_inputs.py @@ -1,11 +1,9 @@ import datetime as dt import os import warnings -import geopandas as gpd import numpy as np import icepyx.core.APIformatting as apifmt -import icepyx.core.geospatial as geospatial def prod_version(latest_vers, version): @@ -108,132 +106,6 @@ def tracks(track): return track_list -# DevGoal: clean up; turn into classes (see validate_inputs_classes.py) -def spatial(spatial_extent): - """ - Validate the input spatial extent and return the needed parameters to the query object. - """ - - scalar_types = (int, float, np.int64) - - if isinstance(spatial_extent, (list, np.ndarray)): - - # bounding box - if len(spatial_extent) == 4 and all( - isinstance(i, scalar_types) for i in spatial_extent - ): - assert -90 <= spatial_extent[1] <= 90, "Invalid latitude value" - assert -90 <= spatial_extent[3] <= 90, "Invalid latitude value" - assert ( - -180 <= spatial_extent[0] <= 180 - ), "Invalid longitude value" # tighten these ranges depending on actual allowed inputs - assert -180 <= spatial_extent[2] <= 180, "Invalid longitude value" - if np.sign(spatial_extent[0]) != np.sign(spatial_extent[2]): - assert ( - spatial_extent[0] >= spatial_extent[2] - ), "Invalid bounding box longitudes" - else: - assert ( - spatial_extent[0] <= spatial_extent[2] - ), "Invalid bounding box longitudes" - assert ( - spatial_extent[1] <= spatial_extent[3] - ), "Invalid bounding box latitudes" - _spat_extent = [float(x) for x in spatial_extent] - extent_type = "bounding_box" - - # user-entered polygon as list of lon, lat coordinate pairs - elif all(type(i) in [list, tuple, np.ndarray] for i in spatial_extent) and all( - all(isinstance(i[j], scalar_types) for j in range(len(i))) - for i in spatial_extent - ): - if any(len(i) != 2 for i in spatial_extent): - raise ValueError( - "Each element in spatial_extent should be a list or tuple of length 2" - ) - assert ( - len(spatial_extent) >= 4 - ), "Your spatial extent polygon has too few vertices" - assert ( - spatial_extent[0][0] == spatial_extent[-1][0] - ), "Starting longitude doesn't match ending longitude" - assert ( - spatial_extent[0][1] == spatial_extent[-1][1] - ), "Starting latitude doesn't match ending latitude" - polygon = (",".join([str(c) for xy in spatial_extent for c in xy])).split( - "," - ) - - extent_type = "polygon" - polygon = [float(i) for i in polygon] - - gdf = geospatial.geodataframe(extent_type, polygon, file=False) - _spat_extent = gdf.iloc[0].geometry - - # _spat_extent = polygon - # extent_type = 'polygon' - # #DevGoal: properly format this input type (and any polygon type) so that it is clockwise (and only contains 1 pole)!! - # warnings.warn("this type of input is not yet well handled and you may not be able to find data") - - # user-entered polygon as a single list of lon and lat coordinates - elif all(isinstance(i, scalar_types) for i in spatial_extent): - assert ( - len(spatial_extent) >= 8 - ), "Your spatial extent polygon has too few vertices" - assert ( - len(spatial_extent) % 2 == 0 - ), "Your spatial extent polygon list should have an even number of entries" - assert ( - spatial_extent[0] == spatial_extent[-2] - ), "Starting longitude doesn't match ending longitude" - assert ( - spatial_extent[1] == spatial_extent[-1] - ), "Starting latitude doesn't match ending latitude" - extent_type = "polygon" - polygon = [float(i) for i in spatial_extent] - - gdf = geospatial.geodataframe(extent_type, polygon, file=False) - _spat_extent = gdf.iloc[0].geometry - - # _spat_extent = polygon - - else: - raise ValueError( - "Your spatial extent does not meet minimum input criteria or the input format is not correct" - ) - - # DevGoal: write a test for this? - # make sure there is nothing set to _geom_filepath since its existence determines later steps - try: - del _geom_filepath - except: - UnboundLocalError - - # DevGoal: revisit this section + geospatial.geodataframe. There might be some good ways to combine the functionality in these checks with that - elif isinstance(spatial_extent, str): - assert os.path.exists( - spatial_extent - ), "Check that the path and filename of your geometry file are correct" - # DevGoal: more robust polygon inputting (see Bruce's code): correct for clockwise/counterclockwise coordinates, deal with simplification, etc. - if spatial_extent.split(".")[-1] in ["kml", "shp", "gpkg"]: - extent_type = "polygon" - gdf = geospatial.geodataframe(extent_type, spatial_extent, file=True) - # print(gdf.iloc[0].geometry) - # DevGoal: does the below line mandate that only the first polygon will be read? Perhaps we should require files containing only one polygon? - # RAPHAEL - It only selects the first polygon if there are multiple. Unless we can supply the CMR params with muliple polygon inputs we should probably req a single polygon. - _spat_extent = gdf.iloc[0].geometry - # _spat_extent = apifmt._fmt_polygon(spatial_extent) - _geom_filepath = spatial_extent - - else: - raise TypeError("Input spatial extent file must be a kml, shp, or gpkg") - - # DevGoal: currently no specific test for this if statement... - if "_geom_filepath" not in locals(): - _geom_filepath = None - return extent_type, _spat_extent, _geom_filepath - - def temporal(date_range, start_time, end_time): """ Validate the input temporal parameters and return the needed parameters to the query object. diff --git a/icepyx/core/visualization.py b/icepyx/core/visualization.py index c16e5f7ca..c98593585 100644 --- a/icepyx/core/visualization.py +++ b/icepyx/core/visualization.py @@ -155,11 +155,11 @@ def __init__( self.product = is2ref._validate_OA_product(query_obj.product) - if query_obj.extent_type == "bounding_box": - self.bbox = query_obj._spat_extent + if query_obj._spatial._ext_type == "bounding_box": + self.bbox = query_obj.spatial.extent else: - mrc_bound = query_obj._spat_extent.minimum_rotated_rectangle + mrc_bound = query_obj.spatial.extent.minimum_rotated_rectangle # generate bounding box lonmin = min(mrc_bound.exterior.coords.xy[0]) lonmax = max(mrc_bound.exterior.coords.xy[0]) @@ -411,7 +411,9 @@ def parallel_request_OA(self) -> da.array: # generate parameter lists for OA requesting OA_para_list = self.generate_OA_parameters() - assert OA_para_list, "Your search returned no results; try different search parameters" + assert ( + OA_para_list + ), "Your search returned no results; try different search parameters" url_number = len(OA_para_list) diff --git a/icepyx/tests/ATL06v04_options.json b/icepyx/tests/ATL06v05_options.json similarity index 100% rename from icepyx/tests/ATL06v04_options.json rename to icepyx/tests/ATL06v05_options.json diff --git a/icepyx/tests/test_APIformatting.py b/icepyx/tests/test_APIformatting.py index 137582c63..83e88a131 100644 --- a/icepyx/tests/test_APIformatting.py +++ b/icepyx/tests/test_APIformatting.py @@ -30,974 +30,6 @@ def test_temporal_fmt(): assert obs == exp -########## _fmt_spatial ########## -def test_bounding_box_fmt(): - obs = apifmt._fmt_spatial("bounding_box", [-55, 68, -48, 71]) - exp = {"bounding_box": "-55,68,-48,71"} - assert obs == exp - - -def test_bbox_fmt(): - obs = apifmt._fmt_spatial("bbox", [-55, 68, -48, 71]) - exp = {"bbox": "-55,68,-48,71"} - assert obs == exp - - -def test_polygon_fmt(): - poly = Polygon( - [ - [-86.622742, -74.908126, 0.0], - [-86.602149, -74.998483, 0.0], - [-86.671945, -74.999545, 0.0], - [-86.667881, -75.01762, 0.0], - [-86.737771, -75.018662, 0.0], - [-86.717729, -75.109052, 0.0], - [-86.788057, -75.110077, 0.0], - [-86.780144, -75.14624, 0.0], - [-86.850654, -75.147247, 0.0], - [-86.835058, -75.219586, 0.0], - [-86.905925, -75.220574, 0.0], - [-86.894389, -75.274839, 0.0], - [-86.965529, -75.27581, 0.0], - [-86.950368, -75.348177, 0.0], - [-87.021872, -75.349129, 0.0], - [-87.003154, -75.439609, 0.0], - [-87.075115, -75.440545, 0.0], - [-87.052886, -75.549149, 0.0], - [-86.98038, -75.548205, 0.0], - [-86.965004, -75.620616, 0.0], - [-87.037878, -75.621564, 0.0], - [-87.034102, -75.63967, 0.0], - [-86.961136, -75.63872, 0.0], - [-86.957257, -75.656825, 0.0], - [-86.884208, -75.655851, 0.0], - [-86.872234, -75.710165, 0.0], - [-86.945563, -75.711143, 0.0], - [-86.925871, -75.801686, 0.0], - [-86.999681, -75.802647, 0.0], - [-86.988029, -75.856983, 0.0], - [-87.062135, -75.857925, 0.0], - [-87.058326, -75.87604, 0.0], - [-87.132537, -75.876959, 0.0], - [-87.128815, -75.895075, 0.0], - [-87.203132, -75.895972, 0.0], - [-87.199496, -75.914091, 0.0], - [-87.273919, -75.914965, 0.0], - [-87.27037, -75.933086, 0.0], - [-87.344899, -75.933938, 0.0], - [-87.341438, -75.95206, 0.0], - [-87.490715, -75.953695, 0.0], - [-87.487439, -75.97182, 0.0], - [-87.562188, -75.972604, 0.0], - [-87.559001, -75.99073, 0.0], - [-87.633856, -75.991491, 0.0], - [-87.627653, -76.027748, 0.0], - [-87.777778, -76.029203, 0.0], - [-87.774861, -76.047334, 0.0], - [-87.925213, -76.048696, 0.0], - [-87.922485, -76.06683, 0.0], - [-87.997771, -76.067476, 0.0], - [-87.995135, -76.085611, 0.0], - [-88.070527, -76.086234, 0.0], - [-88.067983, -76.104371, 0.0], - [-88.143481, -76.104971, 0.0], - [-88.14103, -76.123109, 0.0], - [-88.216633, -76.123686, 0.0], - [-88.214276, -76.141826, 0.0], - [-88.365701, -76.142909, 0.0], - [-88.363537, -76.161051, 0.0], - [-88.439359, -76.161557, 0.0], - [-88.43729, -76.1797, 0.0], - [-88.513217, -76.180183, 0.0], - [-88.511244, -76.198328, 0.0], - [-88.587276, -76.198787, 0.0], - [-88.585399, -76.216933, 0.0], - [-88.737681, -76.217781, 0.0], - [-88.736001, -76.235929, 0.0], - [-88.81225, -76.236317, 0.0], - [-88.810667, -76.254466, 0.0], - [-88.887022, -76.254831, 0.0], - [-88.885537, -76.272981, 0.0], - [-88.961998, -76.273321, 0.0], - [-88.960611, -76.291473, 0.0], - [-89.037177, -76.29179, 0.0], - [-89.035889, -76.309942, 0.0], - [-89.112561, -76.310235, 0.0], - [-89.111372, -76.328389, 0.0], - [-89.264932, -76.328903, 0.0], - [-89.263946, -76.347058, 0.0], - [-89.340833, -76.347279, 0.0], - [-89.339947, -76.365434, 0.0], - [-89.41694, -76.365631, 0.0], - [-89.416155, -76.383788, 0.0], - [-89.493254, -76.383961, 0.0], - [-89.492571, -76.402118, 0.0], - [-89.569775, -76.402267, 0.0], - [-89.569195, -76.420425, 0.0], - [-89.723816, -76.420649, 0.0], - [-89.723443, -76.438808, 0.0], - [-89.800859, -76.438884, 0.0], - [-89.80059, -76.457044, 0.0], - [-89.878112, -76.457095, 0.0], - [-89.877947, -76.475255, 0.0], - [-89.955575, -76.475282, 0.0], - [-89.955514, -76.493443, 0.0], - [-90.033248, -76.493445, 0.0], - [-90.033293, -76.511607, 0.0], - [-90.111131, -76.511584, 0.0], - [-90.111283, -76.529747, 0.0], - [-90.345113, -76.52953, 0.0], - [-90.345583, -76.547693, 0.0], - [-90.42363, -76.547571, 0.0], - [-90.424208, -76.565734, 0.0], - [-90.50236, -76.565588, 0.0], - [-90.503734, -76.601916, 0.0], - [-90.582098, -76.601744, 0.0], - [-90.583695, -76.638075, 0.0], - [-90.662272, -76.637877, 0.0], - [-90.664093, -76.67421, 0.0], - [-90.742884, -76.673987, 0.0], - [-90.743907, -76.692154, 0.0], - [-90.822803, -76.691906, 0.0], - [-90.823937, -76.710073, 0.0], - [-91.060932, -76.709176, 0.0], - [-91.062397, -76.727343, 0.0], - [-91.536922, -76.72487, 0.0], - [-91.539047, -76.743034, 0.0], - [-91.697397, -76.742008, 0.0], - [-91.699746, -76.760171, 0.0], - [-91.779021, -76.759619, 0.0], - [-91.783959, -76.795946, 0.0], - [-91.863446, -76.795367, 0.0], - [-91.873848, -76.868024, 0.0], - [-91.793917, -76.868605, 0.0], - [-91.796424, -76.886772, 0.0], - [-91.716375, -76.887329, 0.0], - [-91.721186, -76.923666, 0.0], - [-91.640906, -76.924199, 0.0], - [-91.647835, -76.97871, 0.0], - [-91.325297, -76.980597, 0.0], - [-91.327166, -76.998771, 0.0], - [-91.165637, -76.999562, 0.0], - [-91.167283, -77.017738, 0.0], - [-91.086397, -77.018096, 0.0], - [-91.089474, -77.054451, 0.0], - [-91.008355, -77.054784, 0.0], - [-91.015545, -77.145686, 0.0], - [-91.178934, -77.144989, 0.0], - [-91.180618, -77.16317, 0.0], - [-91.426015, -77.16193, 0.0], - [-91.434206, -77.234653, 0.0], - [-92.092069, -77.230176, 0.0], - [-92.08907, -77.212001, 0.0], - [-92.335283, -77.209895, 0.0], - [-92.352136, -77.300761, 0.0], - [-92.269483, -77.301495, 0.0], - [-92.276054, -77.337847, 0.0], - [-92.193152, -77.338557, 0.0], - [-92.199521, -77.374914, 0.0], - [-92.282662, -77.374202, 0.0], - [-92.285981, -77.392381, 0.0], - [-92.369233, -77.391642, 0.0], - [-92.383091, -77.464357, 0.0], - [-92.466819, -77.463587, 0.0], - [-92.470431, -77.481766, 0.0], - [-92.386581, -77.482537, 0.0], - [-92.390081, -77.500717, 0.0], - [-92.138102, -77.502874, 0.0], - [-92.141243, -77.521058, 0.0], - [-91.972963, -77.522365, 0.0], - [-91.984627, -77.595116, 0.0], - [-91.899978, -77.595733, 0.0], - [-91.90279, -77.613923, 0.0], - [-91.4788, -77.616608, 0.0], - [-91.480993, -77.634803, 0.0], - [-91.14118, -77.636469, 0.0], - [-91.14799, -77.709264, 0.0], - [-91.062516, -77.709615, 0.0], - [-91.070502, -77.800626, 0.0], - [-90.812128, -77.801523, 0.0], - [-90.81335, -77.819728, 0.0], - [-90.727088, -77.819973, 0.0], - [-90.732603, -77.911009, 0.0], - [-90.81952, -77.910763, 0.0], - [-90.820765, -77.928971, 0.0], - [-90.90781, -77.928697, 0.0], - [-90.909191, -77.946905, 0.0], - [-90.822014, -77.94718, 0.0], - [-90.823267, -77.96539, 0.0], - [-90.735953, -77.965638, 0.0], - [-90.737076, -77.983849, 0.0], - [-90.824523, -77.983601, 0.0], - [-90.825784, -78.001812, 0.0], - [-90.91336, -78.001535, 0.0], - [-90.914759, -78.019746, 0.0], - [-91.090167, -78.019109, 0.0], - [-91.093515, -78.055531, 0.0], - [-91.181481, -78.05517, 0.0], - [-91.188783, -78.128018, 0.0], - [-91.365784, -78.127206, 0.0], - [-91.370017, -78.163631, 0.0], - [-91.458782, -78.163181, 0.0], - [-91.463317, -78.199607, 0.0], - [-91.552351, -78.199128, 0.0], - [-91.554767, -78.217341, 0.0], - [-91.643932, -78.216832, 0.0], - [-91.651645, -78.271472, 0.0], - [-91.830785, -78.270365, 0.0], - [-91.833652, -78.288578, 0.0], - [-92.013037, -78.287355, 0.0], - [-92.016194, -78.305566, 0.0], - [-92.106013, -78.30491, 0.0], - [-92.115968, -78.359544, 0.0], - [-92.025726, -78.360203, 0.0], - [-92.035347, -78.414844, 0.0], - [-91.944667, -78.415477, 0.0], - [-91.947751, -78.433693, 0.0], - [-91.856918, -78.434298, 0.0], - [-91.859867, -78.452516, 0.0], - [-91.76888, -78.453093, 0.0], - [-91.771695, -78.471312, 0.0], - [-91.680555, -78.471861, 0.0], - [-91.683233, -78.490081, 0.0], - [-91.591939, -78.490602, 0.0], - [-91.59703, -78.527046, 0.0], - [-91.505436, -78.52754, 0.0], - [-91.507847, -78.545764, 0.0], - [-91.324343, -78.546665, 0.0], - [-91.330738, -78.601343, 0.0], - [-91.238533, -78.601752, 0.0], - [-91.24053, -78.61998, 0.0], - [-91.14817, -78.62036, 0.0], - [-91.150024, -78.638589, 0.0], - [-90.872462, -78.639554, 0.0], - [-90.873874, -78.657786, 0.0], - [-90.781194, -78.658049, 0.0], - [-90.78246, -78.676281, 0.0], - [-90.689626, -78.676516, 0.0], - [-90.691868, -78.712982, 0.0], - [-90.598728, -78.713188, 0.0], - [-90.599703, -78.731422, 0.0], - [-90.506409, -78.731598, 0.0], - [-90.508064, -78.76807, 0.0], - [-90.414462, -78.768217, 0.0], - [-90.41582, -78.804691, 0.0], - [-90.32191, -78.804808, 0.0], - [-90.324034, -78.877764, 0.0], - [-90.229502, -78.877852, 0.0], - [-90.230262, -78.914333, 0.0], - [-90.040568, -78.914419, 0.0], - [-90.040635, -78.932661, 0.0], - [-89.94563, -78.932659, 0.0], - [-89.94554, -78.950901, 0.0], - [-89.850378, -78.950868, 0.0], - [-89.850129, -78.969111, 0.0], - [-89.754809, -78.969048, 0.0], - [-89.75399, -79.005535, 0.0], - [-89.562719, -79.005317, 0.0], - [-89.561988, -79.023561, 0.0], - [-89.466196, -79.023406, 0.0], - [-89.465302, -79.04165, 0.0], - [-89.273406, -79.041249, 0.0], - [-89.272187, -79.059493, 0.0], - [-88.983893, -79.05866, 0.0], - [-88.982186, -79.076903, 0.0], - [-89.1747, -79.07749, 0.0], - [-89.173311, -79.095734, 0.0], - [-89.269737, -79.095982, 0.0], - [-89.268506, -79.114228, 0.0], - [-89.365099, -79.114445, 0.0], - [-89.364027, -79.132691, 0.0], - [-89.460787, -79.132879, 0.0], - [-89.458959, -79.169374, 0.0], - [-89.55605, -79.16953, 0.0], - [-89.555296, -79.187779, 0.0], - [-89.652554, -79.187905, 0.0], - [-89.651963, -79.206154, 0.0], - [-89.749389, -79.20625, 0.0], - [-89.748962, -79.2245, 0.0], - [-89.846555, -79.224564, 0.0], - [-89.846293, -79.242815, 0.0], - [-90.041814, -79.24285, 0.0], - [-90.042029, -79.297606, 0.0], - [-90.140292, -79.297577, 0.0], - [-90.140775, -79.334083, 0.0], - [-90.042173, -79.334112, 0.0], - [-90.042319, -79.37062, 0.0], - [-90.141261, -79.370591, 0.0], - [-90.141505, -79.388846, 0.0], - [-90.240618, -79.388785, 0.0], - [-90.241873, -79.443552, 0.0], - [-90.341501, -79.443459, 0.0], - [-90.342693, -79.479973, 0.0], - [-90.442666, -79.479848, 0.0], - [-90.444995, -79.534621, 0.0], - [-90.545492, -79.534464, 0.0], - [-90.546451, -79.552722, 0.0], - [-90.445777, -79.55288, 0.0], - [-90.447349, -79.5894, 0.0], - [-91.053456, -79.587965, 0.0], - [-91.055316, -79.606223, 0.0], - [-91.257663, -79.605486, 0.0], - [-91.259887, -79.623743, 0.0], - [-91.361228, -79.623325, 0.0], - [-91.36364, -79.641582, 0.0], - [-91.465152, -79.641131, 0.0], - [-91.488897, -79.805457, 0.0], - [-91.695178, -79.804442, 0.0], - [-91.698235, -79.822701, 0.0], - [-91.801545, -79.822143, 0.0], - [-91.808067, -79.85866, 0.0], - [-91.704384, -79.85922, 0.0], - [-91.707475, -79.87748, 0.0], - [-91.811346, -79.876919, 0.0], - [-91.814637, -79.895179, 0.0], - [-91.918685, -79.894584, 0.0], - [-91.922176, -79.912843, 0.0], - [-92.026401, -79.912214, 0.0], - [-92.030095, -79.930472, 0.0], - [-92.134495, -79.929808, 0.0], - [-92.138393, -79.948066, 0.0], - [-92.347532, -79.946636, 0.0], - [-92.351826, -79.964891, 0.0], - [-92.456562, -79.964125, 0.0], - [-92.461064, -79.982379, 0.0], - [-92.565975, -79.981578, 0.0], - [-92.570685, -79.999832, 0.0], - [-92.78084, -79.998126, 0.0], - [-92.785952, -80.016376, 0.0], - [-92.891195, -80.015471, 0.0], - [-92.896519, -80.033721, 0.0], - [-93.001935, -80.032781, 0.0], - [-93.007473, -80.051029, 0.0], - [-93.113062, -80.050053, 0.0], - [-93.118814, -80.0683, 0.0], - [-93.224577, -80.067288, 0.0], - [-93.230546, -80.085534, 0.0], - [-93.336481, -80.084487, 0.0], - [-93.324176, -80.048001, 0.0], - [-93.429699, -80.046925, 0.0], - [-93.417099, -80.010444, 0.0], - [-93.522213, -80.009338, 0.0], - [-93.515756, -79.991101, 0.0], - [-93.620655, -79.989964, 0.0], - [-93.61403, -79.971729, 0.0], - [-93.718714, -79.97056, 0.0], - [-93.711924, -79.952328, 0.0], - [-93.816393, -79.951128, 0.0], - [-93.788723, -79.87821, 0.0], - [-93.892414, -79.876987, 0.0], - [-93.864399, -79.804083, 0.0], - [-93.967323, -79.802836, 0.0], - [-93.946026, -79.748169, 0.0], - [-93.843651, -79.749409, 0.0], - [-93.823125, -79.694739, 0.0], - [-93.924956, -79.693505, 0.0], - [-93.90411, -79.638844, 0.0], - [-94.005379, -79.637584, 0.0], - [-93.998302, -79.619367, 0.0], - [-94.099369, -79.618077, 0.0], - [-94.092139, -79.599863, 0.0], - [-94.193003, -79.598544, 0.0], - [-94.185623, -79.580332, 0.0], - [-94.386921, -79.577602, 0.0], - [-94.379215, -79.559395, 0.0], - [-94.680431, -79.555069, 0.0], - [-94.672229, -79.53687, 0.0], - [-94.772403, -79.535367, 0.0], - [-94.747448, -79.48078, 0.0], - [-94.847075, -79.479253, 0.0], - [-94.81352, -79.406486, 0.0], - [-94.912434, -79.404938, 0.0], - [-94.903948, -79.38675, 0.0], - [-95.101351, -79.383566, 0.0], - [-95.092557, -79.365384, 0.0], - [-95.191045, -79.363748, 0.0], - [-95.155505, -79.291032, 0.0], - [-95.253295, -79.289376, 0.0], - [-95.244321, -79.271201, 0.0], - [-95.341915, -79.269517, 0.0], - [-95.332806, -79.251344, 0.0], - [-95.430206, -79.249633, 0.0], - [-95.420964, -79.231464, 0.0], - [-95.323729, -79.233172, 0.0], - [-95.269903, -79.124145, 0.0], - [-95.366167, -79.122454, 0.0], - [-95.357141, -79.104287, 0.0], - [-95.453215, -79.102568, 0.0], - [-95.425842, -79.048076, 0.0], - [-95.616944, -79.044565, 0.0], - [-95.598218, -79.00825, 0.0], - [-95.693408, -79.006456, 0.0], - [-95.683935, -78.988302, 0.0], - [-95.588901, -78.990093, 0.0], - [-95.579615, -78.971937, 0.0], - [-95.484707, -78.973695, 0.0], - [-95.475607, -78.955536, 0.0], - [-95.380824, -78.957262, 0.0], - [-95.37191, -78.9391, 0.0], - [-95.466538, -78.937377, 0.0], - [-95.457498, -78.919218, 0.0], - [-95.551942, -78.917468, 0.0], - [-95.542778, -78.899312, 0.0], - [-95.637038, -78.897535, 0.0], - [-95.609268, -78.843079, 0.0], - [-95.515467, -78.844846, 0.0], - [-95.506423, -78.826692, 0.0], - [-95.412744, -78.828427, 0.0], - [-95.403881, -78.81027, 0.0], - [-95.310325, -78.811973, 0.0], - [-95.301642, -78.793813, 0.0], - [-95.114747, -78.797124, 0.0], - [-95.106394, -78.778959, 0.0], - [-95.013057, -78.780567, 0.0], - [-95.004882, -78.7624, 0.0], - [-94.911669, -78.763976, 0.0], - [-94.895698, -78.727637, 0.0], - [-94.988611, -78.726066, 0.0], - [-94.940425, -78.617072, 0.0], - [-95.032424, -78.615487, 0.0], - [-95.024337, -78.597325, 0.0], - [-95.207964, -78.594073, 0.0], - [-95.191285, -78.557761, 0.0], - [-95.465652, -78.552682, 0.0], - [-95.474413, -78.57083, 0.0], - [-95.748962, -78.565482, 0.0], - [-95.721466, -78.511065, 0.0], - [-95.812493, -78.509234, 0.0], - [-95.803243, -78.491098, 0.0], - [-96.075717, -78.48544, 0.0], - [-96.06607, -78.467314, 0.0], - [-96.156692, -78.465373, 0.0], - [-96.146934, -78.447251, 0.0], - [-96.327803, -78.44329, 0.0], - [-96.297869, -78.388943, 0.0], - [-96.387836, -78.386929, 0.0], - [-96.377781, -78.368817, 0.0], - [-96.467577, -78.366779, 0.0], - [-96.457416, -78.34867, 0.0], - [-96.547041, -78.346606, 0.0], - [-96.536773, -78.328501, 0.0], - [-96.80504, -78.32215, 0.0], - [-96.794392, -78.304055, 0.0], - [-96.883611, -78.301886, 0.0], - [-96.872859, -78.283794, 0.0], - [-96.961909, -78.2816, 0.0], - [-96.940233, -78.245425, 0.0], - [-97.028977, -78.243209, 0.0], - [-97.018054, -78.225125, 0.0], - [-97.19517, -78.220617, 0.0], - [-97.184011, -78.20254, 0.0], - [-97.272383, -78.200248, 0.0], - [-97.238713, -78.14603, 0.0], - [-97.326651, -78.14372, 0.0], - [-97.315364, -78.125651, 0.0], - [-97.403134, -78.123318, 0.0], - [-97.391749, -78.105253, 0.0], - [-97.566921, -78.10051, 0.0], - [-97.555308, -78.082453, 0.0], - [-97.64271, -78.080044, 0.0], - [-97.607693, -78.025883, 0.0], - [-97.520682, -78.02828, 0.0], - [-97.497773, -77.992166, 0.0], - [-97.410987, -77.994529, 0.0], - [-97.399713, -77.976468, 0.0], - [-97.313022, -77.9788, 0.0], - [-97.27979, -77.924608, 0.0], - [-97.193451, -77.926901, 0.0], - [-97.139363, -77.836566, 0.0], - [-96.967859, -77.841038, 0.0], - [-96.946954, -77.804891, 0.0], - [-96.861407, -77.80708, 0.0], - [-96.851127, -77.789004, 0.0], - [-96.765675, -77.791162, 0.0], - [-96.725358, -77.718845, 0.0], - [-96.640377, -77.720964, 0.0], - [-96.620645, -77.6848, 0.0], - [-96.535882, -77.686886, 0.0], - [-96.526184, -77.668801, 0.0], - [-96.441516, -77.670857, 0.0], - [-96.384656, -77.562336, 0.0], - [-96.552494, -77.558236, 0.0], - [-96.514174, -77.485919, 0.0], - [-96.59757, -77.483841, 0.0], - [-96.58794, -77.465766, 0.0], - [-96.671187, -77.463665, 0.0], - [-96.680937, -77.481738, 0.0], - [-97.263693, -77.466276, 0.0], - [-97.253111, -77.448226, 0.0], - [-97.336123, -77.445916, 0.0], - [-97.325453, -77.42787, 0.0], - [-97.491148, -77.423178, 0.0], - [-97.480274, -77.405139, 0.0], - [-97.397559, -77.407495, 0.0], - [-97.376139, -77.371411, 0.0], - [-97.293628, -77.373733, 0.0], - [-97.28308, -77.355688, 0.0], - [-98.433698, -77.320866, 0.0], - [-98.421564, -77.302872, 0.0], - [-98.666926, -77.294764, 0.0], - [-98.642079, -77.2588, 0.0], - [-99.049167, -77.244815, 0.0], - [-99.036233, -77.226854, 0.0], - [-99.522851, -77.209257, 0.0], - [-99.509284, -77.191321, 0.0], - [-99.832489, -77.179101, 0.0], - [-99.818518, -77.161182, 0.0], - [-99.979666, -77.154929, 0.0], - [-99.965515, -77.137019, 0.0], - [-100.447336, -77.117686, 0.0], - [-100.432572, -77.099804, 0.0], - [-100.512625, -77.096499, 0.0], - [-100.483005, -77.060743, 0.0], - [-100.642555, -77.054077, 0.0], - [-100.627593, -77.036208, 0.0], - [-100.707198, -77.032842, 0.0], - [-100.692171, -77.014978, 0.0], - [-100.851044, -77.008182, 0.0], - [-100.835847, -76.990327, 0.0], - [-100.915114, -76.986897, 0.0], - [-100.899853, -76.969047, 0.0], - [-101.058051, -76.962123, 0.0], - [-101.042622, -76.944282, 0.0], - [-101.121553, -76.940788, 0.0], - [-101.090613, -76.905114, 0.0], - [-101.169293, -76.901606, 0.0], - [-101.153783, -76.883774, 0.0], - [-101.232316, -76.880245, 0.0], - [-101.216746, -76.862418, 0.0], - [-101.295133, -76.85887, 0.0], - [-101.217404, -76.769752, 0.0], - [-101.295238, -76.766205, 0.0], - [-101.279717, -76.748385, 0.0], - [-101.357407, -76.744819, 0.0], - [-101.310795, -76.691373, 0.0], - [-101.388141, -76.687797, 0.0], - [-101.372587, -76.669986, 0.0], - [-101.449791, -76.666392, 0.0], - [-101.326063, -76.523929, 0.0], - [-101.402436, -76.52035, 0.0], - [-101.341168, -76.449131, 0.0], - [-101.265184, -76.45269, 0.0], - [-101.175067, -76.345822, 0.0], - [-101.250474, -76.342292, 0.0], - [-101.190803, -76.27106, 0.0], - [-101.265793, -76.267525, 0.0], - [-101.250878, -76.249721, 0.0], - [-101.325735, -76.246168, 0.0], - [-101.280944, -76.192769, 0.0], - [-101.429978, -76.185621, 0.0], - [-101.399941, -76.150039, 0.0], - [-101.474214, -76.14644, 0.0], - [-101.459161, -76.128654, 0.0], - [-101.533304, -76.125037, 0.0], - [-101.518198, -76.107255, 0.0], - [-101.59221, -76.10362, 0.0], - [-101.577051, -76.085842, 0.0], - [-101.650932, -76.082189, 0.0], - [-101.635722, -76.064416, 0.0], - [-101.709473, -76.060745, 0.0], - [-101.694211, -76.042976, 0.0], - [-101.767832, -76.039287, 0.0], - [-101.752518, -76.021523, 0.0], - [-101.899461, -76.014086, 0.0], - [-101.837882, -75.943066, 0.0], - [-101.910936, -75.939333, 0.0], - [-101.89555, -75.921582, 0.0], - [-101.968477, -75.917832, 0.0], - [-101.953041, -75.900085, 0.0], - [-102.02584, -75.896317, 0.0], - [-102.010356, -75.878575, 0.0], - [-102.083027, -75.87479, 0.0], - [-102.067494, -75.857052, 0.0], - [-102.140038, -75.853249, 0.0], - [-102.124457, -75.835516, 0.0], - [-102.196874, -75.831696, 0.0], - [-102.181245, -75.813967, 0.0], - [-102.253535, -75.810129, 0.0], - [-102.237859, -75.792406, 0.0], - [-102.310023, -75.78855, 0.0], - [-102.294299, -75.770832, 0.0], - [-102.366338, -75.766959, 0.0], - [-102.350567, -75.749245, 0.0], - [-102.494353, -75.741443, 0.0], - [-102.478451, -75.723738, 0.0], - [-102.693572, -75.711884, 0.0], - [-102.70973, -75.729573, 0.0], - [-102.853113, -75.72155, 0.0], - [-102.869482, -75.739229, 0.0], - [-102.941198, -75.735179, 0.0], - [-102.957693, -75.752851, 0.0], - [-103.029452, -75.748774, 0.0], - [-103.012872, -75.731107, 0.0], - [-103.227644, -75.718758, 0.0], - [-103.210852, -75.701106, 0.0], - [-103.282275, -75.696951, 0.0], - [-103.265441, -75.679303, 0.0], - [-103.336738, -75.675132, 0.0], - [-103.303027, -75.639846, 0.0], - [-103.445162, -75.631459, 0.0], - [-103.428203, -75.613826, 0.0], - [-103.923762, -75.583823, 0.0], - [-103.90627, -75.566227, 0.0], - [-103.976811, -75.56186, 0.0], - [-103.941793, -75.526678, 0.0], - [-104.012128, -75.5223, 0.0], - [-103.942283, -75.45195, 0.0], - [-103.914847, -75.426057, 0.0], - [-103.846549, -75.420428, 0.0], - [-103.814359, -75.41156, 0.0], - [-103.74731, -75.394972, 0.0], - [-103.643531, -75.376578, 0.0], - [-103.639472, -75.360155, 0.0], - [-103.549124, -75.339049, 0.0], - [-103.509054, -75.329656, 0.0], - [-103.456714, -75.307204, 0.0], - [-103.37484, -75.273725, 0.0], - [-103.284801, -75.264374, 0.0], - [-103.224839, -75.25812, 0.0], - [-103.182394, -75.249825, 0.0], - [-103.086408, -75.237813, 0.0], - [-103.042136, -75.231576, 0.0], - [-102.981295, -75.215486, 0.0], - [-102.956754, -75.210167, 0.0], - [-102.921448, -75.203018, 0.0], - [-102.898283, -75.198106, 0.0], - [-102.873449, -75.192921, 0.0], - [-102.84957, -75.188785, 0.0], - [-102.825705, -75.184646, 0.0], - [-102.789524, -75.181222, 0.0], - [-102.744295, -75.17242, 0.0], - [-102.656346, -75.16239, 0.0], - [-102.607491, -75.160775, 0.0], - [-102.560626, -75.159773, 0.0], - [-102.511333, -75.159268, 0.0], - [-102.378744, -75.152045, 0.0], - [-102.34262, -75.146716, 0.0], - [-102.266406, -75.132957, 0.0], - [-102.223828, -75.128342, 0.0], - [-102.157455, -75.12945, 0.0], - [-102.113853, -75.130386, 0.0], - [-102.068876, -75.13139, 0.0], - [-102.040635, -75.126691, 0.0], - [-102.013199, -75.12121, 0.0], - [-101.969076, -75.11627, 0.0], - [-101.953576, -75.113073, 0.0], - [-101.923326, -75.111044, 0.0], - [-101.896684, -75.109917, 0.0], - [-101.821333, -75.103337, 0.0], - [-101.766389, -75.098945, 0.0], - [-101.726414, -75.090073, 0.0], - [-101.723655, -75.079577, 0.0], - [-101.631989, -75.054005, 0.0], - [-101.564382, -75.02971, 0.0], - [-101.547244, -75.015213, 0.0], - [-101.531499, -75.000643, 0.0], - [-101.549303, -74.990901, 0.0], - [-101.489949, -74.940509, 0.0], - [-101.469959, -74.921526, 0.0], - [-101.455398, -74.908855, 0.0], - [-101.420557, -74.891146, 0.0], - [-101.399072, -74.882138, 0.0], - [-101.391177, -74.870096, 0.0], - [-101.371447, -74.860874, 0.0], - [-101.363063, -74.853621, 0.0], - [-101.338827, -74.838164, 0.0], - [-101.312982, -74.826333, 0.0], - [-101.29282, -74.816401, 0.0], - [-101.276851, -74.808624, 0.0], - [-101.27464, -74.804247, 0.0], - [-101.259243, -74.798558, 0.0], - [-101.251822, -74.792086, 0.0], - [-101.267741, -74.78708, 0.0], - [-101.256493, -74.781809, 0.0], - [-101.257733, -74.779767, 0.0], - [-101.250447, -74.777156, 0.0], - [-101.240613, -74.770054, 0.0], - [-101.222641, -74.763963, 0.0], - [-101.216307, -74.748673, 0.0], - [-101.212936, -74.740259, 0.0], - [-101.200426, -74.734469, 0.0], - [-101.197349, -74.72643, 0.0], - [-101.188725, -74.7179, 0.0], - [-101.207959, -74.716895, 0.0], - [-101.219968, -74.709239, 0.0], - [-101.232933, -74.706803, 0.0], - [-101.230248, -74.703234, 0.0], - [-101.238372, -74.70027, 0.0], - [-101.254074, -74.700252, 0.0], - [-101.275428, -74.693637, 0.0], - [-101.306089, -74.693851, 0.0], - [-101.351676, -74.691805, 0.0], - [-101.364701, -74.681592, 0.0], - [-101.396392, -74.67954, 0.0], - [-101.416381, -74.679976, 0.0], - [-101.462601, -74.674445, 0.0], - [-101.482989, -74.660146, 0.0], - [-101.530932, -74.656493, 0.0], - [-101.545802, -74.657827, 0.0], - [-101.570915, -74.655354, 0.0], - [-101.627933, -74.648117, 0.0], - [-101.647793, -74.639151, 0.0], - [-101.676385, -74.635907, 0.0], - [-101.678978, -74.633321, 0.0], - [-101.695894, -74.628422, 0.0], - [-101.728673, -74.621731, 0.0], - [-101.781287, -74.617603, 0.0], - [-101.794801, -74.615021, 0.0], - [-101.870395, -74.608983, 0.0], - [-101.933735, -74.601768, 0.0], - [-101.986726, -74.595483, 0.0], - [-102.032573, -74.595827, 0.0], - [-102.026749, -74.590285, 0.0], - [-102.010395, -74.580201, 0.0], - [-102.035597, -74.564212, 0.0], - [-102.090552, -74.553133, 0.0], - [-102.264411, -74.519626, 0.0], - [-102.339743, -74.51083, 0.0], - [-102.411915, -74.510518, 0.0], - [-102.424826, -74.497263, 0.0], - [-102.377212, -74.483896, 0.0], - [-102.280808, -74.473374, 0.0], - [-102.236421, -74.463717, 0.0], - [-102.185211, -74.450043, 0.0], - [-102.150282, -74.438359, 0.0], - [-102.110682, -74.429878, 0.0], - [-102.080455, -74.419386, 0.0], - [-102.029215, -74.421347, 0.0], - [-101.986657, -74.414487, 0.0], - [-101.942992, -74.405238, 0.0], - [-101.914922, -74.383364, 0.0], - [-101.795349, -74.369597, 0.0], - [-101.698034, -74.375051, 0.0], - [-101.572267, -74.390817, 0.0], - [-101.433665, -74.404266, 0.0], - [-101.358339, -74.410301, 0.0], - [-101.276679, -74.412744, 0.0], - [-101.200663, -74.403148, 0.0], - [-101.126055, -74.400282, 0.0], - [-101.050277, -74.385754, 0.0], - [-100.925725, -74.378623, 0.0], - [-100.827076, -74.373988, 0.0], - [-100.786332, -74.316362, 0.0], - [-100.72066, -74.319735, 0.0], - [-100.708238, -74.301973, 0.0], - [-100.642611, -74.305321, 0.0], - [-100.617997, -74.26979, 0.0], - [-100.552486, -74.273111, 0.0], - [-100.528129, -74.237572, 0.0], - [-100.462734, -74.240864, 0.0], - [-100.355131, -74.080906, 0.0], - [-100.290352, -74.084143, 0.0], - [-100.278602, -74.066367, 0.0], - [-100.213868, -74.06958, 0.0], - [-100.190588, -74.03402, 0.0], - [-100.125968, -74.037206, 0.0], - [-100.114438, -74.019422, 0.0], - [-100.049863, -74.022585, 0.0], - [-100.061323, -74.040372, 0.0], - [-99.996651, -74.043518, 0.0], - [-100.008066, -74.061309, 0.0], - [-99.943298, -74.064439, 0.0], - [-99.954667, -74.082234, 0.0], - [-99.889802, -74.085347, 0.0], - [-99.878504, -74.067549, 0.0], - [-99.68397, -74.076757, 0.0], - [-99.672911, -74.058947, 0.0], - [-99.218628, -74.079702, 0.0], - [-99.208094, -74.061869, 0.0], - [-98.688058, -74.08435, 0.0], - [-98.678122, -74.06649, 0.0], - [-98.026778, -74.092735, 0.0], - [-98.035988, -74.110626, 0.0], - [-97.774563, -74.120566, 0.0], - [-97.783502, -74.138469, 0.0], - [-97.521457, -74.148094, 0.0], - [-97.512812, -74.13018, 0.0], - [-97.447324, -74.132532, 0.0], - [-97.438772, -74.114615, 0.0], - [-97.242413, -74.121541, 0.0], - [-97.234101, -74.103616, 0.0], - [-97.103247, -74.108126, 0.0], - [-97.095101, -74.090197, 0.0], - [-97.02972, -74.092418, 0.0], - [-97.021665, -74.074486, 0.0], - [-96.825632, -74.08102, 0.0], - [-96.833465, -74.098959, 0.0], - [-96.768011, -74.101099, 0.0], - [-96.775789, -74.119041, 0.0], - [-96.513501, -74.127404, 0.0], - [-96.506019, -74.109452, 0.0], - [-96.374919, -74.113506, 0.0], - [-96.367602, -74.095549, 0.0], - [-96.302101, -74.097543, 0.0], - [-96.294875, -74.079584, 0.0], - [-96.229432, -74.081555, 0.0], - [-96.222295, -74.063595, 0.0], - [-96.156909, -74.065543, 0.0], - [-96.149863, -74.047581, 0.0], - [-95.95383, -74.053295, 0.0], - [-95.947021, -74.035326, 0.0], - [-95.816402, -74.039029, 0.0], - [-95.809755, -74.021057, 0.0], - [-95.679223, -74.024673, 0.0], - [-95.672738, -74.006697, 0.0], - [-95.542294, -74.010228, 0.0], - [-95.535971, -73.992248, 0.0], - [-95.405616, -73.995692, 0.0], - [-95.399454, -73.97771, 0.0], - [-95.26919, -73.981068, 0.0], - [-95.263189, -73.963082, 0.0], - [-95.133017, -73.966355, 0.0], - [-95.121348, -73.930376, 0.0], - [-95.056388, -73.931978, 0.0], - [-95.050646, -73.913988, 0.0], - [-94.985747, -73.915568, 0.0], - [-94.980091, -73.897576, 0.0], - [-94.915251, -73.899134, 0.0], - [-94.909681, -73.881141, 0.0], - [-94.844902, -73.882677, 0.0], - [-94.839417, -73.864683, 0.0], - [-94.774698, -73.866196, 0.0], - [-94.769297, -73.848201, 0.0], - [-94.704639, -73.849692, 0.0], - [-94.699323, -73.831696, 0.0], - [-94.634725, -73.833165, 0.0], - [-94.629493, -73.815168, 0.0], - [-94.564955, -73.816615, 0.0], - [-94.559808, -73.798617, 0.0], - [-94.430842, -73.801447, 0.0], - [-94.420869, -73.765446, 0.0], - [-94.356514, -73.766828, 0.0], - [-94.351616, -73.748827, 0.0], - [-94.287321, -73.750186, 0.0], - [-94.277701, -73.714183, 0.0], - [-94.213539, -73.715519, 0.0], - [-94.223015, -73.751526, 0.0], - [-94.158698, -73.752845, 0.0], - [-94.168073, -73.788858, 0.0], - [-94.103602, -73.79016, 0.0], - [-94.117527, -73.844188, 0.0], - [-94.052828, -73.845474, 0.0], - [-94.057417, -73.863487, 0.0], - [-93.992635, -73.864754, 0.0], - [-93.997163, -73.882768, 0.0], - [-93.5429, -73.89108, 0.0], - [-93.546925, -73.909105, 0.0], - [-93.416904, -73.911299, 0.0], - [-93.420791, -73.929327, 0.0], - [-93.095219, -73.934459, 0.0], - [-93.098746, -73.952494, 0.0], - [-93.033533, -73.95346, 0.0], - [-93.030081, -73.935424, 0.0], - [-92.117389, -73.946779, 0.0], - [-92.114979, -73.92873, 0.0], - [-92.049815, -73.929387, 0.0], - [-92.05215, -73.947436, 0.0], - [-91.921656, -73.948689, 0.0], - [-91.923848, -73.96674, 0.0], - [-91.793186, -73.967912, 0.0], - [-91.795233, -73.985966, 0.0], - [-91.729821, -73.986521, 0.0], - [-91.731798, -74.004576, 0.0], - [-91.666307, -74.005112, 0.0], - [-91.668214, -74.023169, 0.0], - [-91.077936, -74.027065, 0.0], - [-91.076703, -74.009003, 0.0], - [-91.011175, -74.009332, 0.0], - [-91.01002, -73.991272, 0.0], - [-90.879106, -73.991867, 0.0], - [-90.878103, -73.973806, 0.0], - [-90.812717, -73.974073, 0.0], - [-90.811791, -73.956012, 0.0], - [-90.746478, -73.956258, 0.0], - [-90.74733, -73.974319, 0.0], - [-90.551155, -73.974933, 0.0], - [-90.551785, -73.992995, 0.0], - [-90.486316, -73.993159, 0.0], - [-90.486872, -74.011222, 0.0], - [-90.290232, -74.011589, 0.0], - [-90.290565, -74.029653, 0.0], - [-90.159318, -74.029795, 0.0], - [-90.1595, -74.047861, 0.0], - [-90.028101, -74.04792, 0.0], - [-90.028133, -74.065986, 0.0], - [-89.830808, -74.065919, 0.0], - [-89.830418, -74.102053, 0.0], - [-89.764492, -74.10199, 0.0], - [-89.764221, -74.120058, 0.0], - [-89.69822, -74.119973, 0.0], - [-89.697523, -74.156112, 0.0], - [-89.63137, -74.156006, 0.0], - [-89.630517, -74.192147, 0.0], - [-89.564212, -74.19202, 0.0], - [-89.563707, -74.210092, 0.0], - [-89.430947, -74.209775, 0.0], - [-89.430287, -74.227847, 0.0], - [-89.29738, -74.227445, 0.0], - [-89.296564, -74.245518, 0.0], - [-89.230036, -74.245285, 0.0], - [-89.22914, -74.263358, 0.0], - [-89.162537, -74.263104, 0.0], - [-89.161562, -74.281178, 0.0], - [-89.028207, -74.280607, 0.0], - [-89.02594, -74.316754, 0.0], - [-88.892285, -74.316097, 0.0], - [-88.890991, -74.334171, 0.0], - [-88.82409, -74.333811, 0.0], - [-88.822715, -74.351885, 0.0], - [-88.688766, -74.3511, 0.0], - [-88.687231, -74.369174, 0.0], - [-88.620184, -74.368749, 0.0], - [-88.618567, -74.386824, 0.0], - [-88.484327, -74.38591, 0.0], - [-88.482549, -74.403984, 0.0], - [-88.348167, -74.402984, 0.0], - [-88.346228, -74.421057, 0.0], - [-88.278965, -74.420525, 0.0], - [-88.276942, -74.438598, 0.0], - [-88.142273, -74.437468, 0.0], - [-88.140087, -74.455541, 0.0], - [-88.072681, -74.454944, 0.0], - [-88.07041, -74.473017, 0.0], - [-87.935456, -74.471756, 0.0], - [-87.93302, -74.489828, 0.0], - [-87.865472, -74.489165, 0.0], - [-87.862952, -74.507237, 0.0], - [-87.79533, -74.506552, 0.0], - [-87.792724, -74.524624, 0.0], - [-87.65734, -74.523188, 0.0], - [-87.654567, -74.541259, 0.0], - [-87.586805, -74.540508, 0.0], - [-87.583946, -74.558579, 0.0], - [-87.51611, -74.557806, 0.0], - [-87.513164, -74.575876, 0.0], - [-87.241573, -74.572566, 0.0], - [-87.238298, -74.590633, 0.0], - [-87.034444, -74.587922, 0.0], - [-87.03092, -74.605986, 0.0], - [-86.962905, -74.605038, 0.0], - [-86.955671, -74.641167, 0.0], - [-86.887503, -74.640195, 0.0], - [-86.868859, -74.730522, 0.0], - [-86.800293, -74.729523, 0.0], - [-86.792609, -74.765656, 0.0], - [-86.723889, -74.764633, 0.0], - [-86.716003, -74.800766, 0.0], - [-86.647127, -74.799719, 0.0], - [-86.63091, -74.871988, 0.0], - [-86.561712, -74.870913, 0.0], - [-86.553377, -74.907049, 0.0], - [-86.622742, -74.908126, 0.0], - ] - ) - obs = apifmt._fmt_spatial("polygon", poly) - exp = { - "polygon": "-86.622742,-74.908126,-86.561712,-74.870913,-86.868859,-74.730522,-86.962905,-74.605038,-89.02594,-74.316754,-89.630517,-74.192147,-89.830808,-74.065919,-90.746478,-73.956258,-91.668214,-74.023169,-92.049815,-73.929387,-93.420791,-73.929327,-93.997163,-73.882768,-94.277701,-73.714183,-95.133017,-73.966355,-96.513501,-74.127404,-99.889802,-74.085347,-100.114438,-74.019422,-100.355131,-74.080906,-100.462734,-74.240864,-100.827076,-74.373988,-101.795349,-74.369597,-102.424826,-74.497263,-101.188725,-74.7179,-101.564382,-75.02971,-103.37484,-75.273725,-103.914847,-75.426057,-104.012128,-75.5223,-103.029452,-75.748774,-102.350567,-75.749245,-101.837882,-75.943066,-101.899461,-76.014086,-101.280944,-76.192769,-101.325735,-76.246168,-101.190803,-76.27106,-101.250474,-76.342292,-101.175067,-76.345822,-101.402436,-76.52035,-101.326063,-76.523929,-101.449791,-76.666392,-101.310795,-76.691373,-101.357407,-76.744819,-101.217404,-76.769752,-101.295133,-76.85887,-101.058051,-76.962123,-100.447336,-77.117686,-98.433698,-77.320866,-97.28308,-77.355688,-97.491148,-77.423178,-96.514174,-77.485919,-96.552494,-77.558236,-96.384656,-77.562336,-96.441516,-77.670857,-97.139363,-77.836566,-97.193451,-77.926901,-97.64271,-78.080044,-96.297869,-78.388943,-96.327803,-78.44329,-95.721466,-78.511065,-95.748962,-78.565482,-94.940425,-78.617072,-94.988611,-78.726066,-94.911669,-78.763976,-95.609268,-78.843079,-95.637038,-78.897535,-95.37191,-78.9391,-95.693408,-79.006456,-95.269903,-79.124145,-95.323729,-79.233172,-95.430206,-79.249633,-95.155505,-79.291032,-95.191045,-79.363748,-94.81352,-79.406486,-94.847075,-79.479253,-94.747448,-79.48078,-94.772403,-79.535367,-93.90411,-79.638844,-93.843651,-79.749409,-93.967323,-79.802836,-93.788723,-79.87821,-93.816393,-79.951128,-93.230546,-80.085534,-91.707475,-79.87748,-91.801545,-79.822143,-91.488897,-79.805457,-91.465152,-79.641131,-90.447349,-79.5894,-90.545492,-79.534464,-90.042319,-79.37062,-90.140775,-79.334083,-90.041814,-79.24285,-88.982186,-79.076903,-90.230262,-78.914333,-90.32191,-78.804808,-90.689626,-78.676516,-91.150024,-78.638589,-92.035347,-78.414844,-92.106013,-78.30491,-91.651645,-78.271472,-91.365784,-78.127206,-91.188783,-78.128018,-91.090167,-78.019109,-90.737076,-77.983849,-90.909191,-77.946905,-90.732603,-77.911009,-90.727088,-77.819973,-91.070502,-77.800626,-91.14118,-77.636469,-91.90279,-77.613923,-91.984627,-77.595116,-91.972963,-77.522365,-92.466819,-77.463587,-92.199521,-77.374914,-92.352136,-77.300761,-92.335283,-77.209895,-91.434206,-77.234653,-91.426015,-77.16193,-91.015545,-77.145686,-91.008355,-77.054784,-91.086397,-77.018096,-91.647835,-76.97871,-91.640906,-76.924199,-91.873848,-76.868024,-91.779021,-76.759619,-90.823937,-76.710073,-90.345113,-76.52953,-86.988029,-75.856983,-86.945563,-75.711143,-86.872234,-75.710165,-87.034102,-75.63967,-86.965004,-75.620616,-87.075115,-75.440545,-87.003154,-75.439609,-87.021872,-75.349129,-86.835058,-75.219586,-86.850654,-75.147247,-86.717729,-75.109052,-86.737771,-75.018662,-86.602149,-74.998483,-86.622742,-74.908126" - } - assert obs == exp - - ########## _fmt_var_subset_list ########## def test_var_subset_list_fmt(): obs = apifmt._fmt_var_subset_list( @@ -1022,26 +54,28 @@ def test_readable_granules(): obs = apifmt._fmt_readable_granules("ATL06", cycles=["02"], tracks=["1387"]) exp = ["ATL06_??????????????_138702??_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL07',cycles=['02'],tracks=['1387']) - exp = ['ATL07-??_??????????????_138702??_*'] + obs = apifmt._fmt_readable_granules("ATL07", cycles=["02"], tracks=["1387"]) + exp = ["ATL07-??_??????????????_138702??_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL06',tracks=['1387']) - exp = ['ATL06_??????????????_1387????_*'] + obs = apifmt._fmt_readable_granules("ATL06", tracks=["1387"]) + exp = ["ATL06_??????????????_1387????_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL07',tracks=['1387']) - exp = ['ATL07-??_??????????????_1387????_*'] + obs = apifmt._fmt_readable_granules("ATL07", tracks=["1387"]) + exp = ["ATL07-??_??????????????_1387????_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL11',tracks=['1387']) - exp = ['ATL11_1387??_*'] + obs = apifmt._fmt_readable_granules("ATL11", tracks=["1387"]) + exp = ["ATL11_1387??_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL06',cycles=['02']) - exp = ['ATL06_??????????????_????02??_*'] + obs = apifmt._fmt_readable_granules("ATL06", cycles=["02"]) + exp = ["ATL06_??????????????_????02??_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL07',cycles=['02']) - exp = ['ATL07-??_??????????????_????02??_*'] + obs = apifmt._fmt_readable_granules("ATL07", cycles=["02"]) + exp = ["ATL07-??_??????????????_????02??_*"] assert obs == exp - obs = apifmt._fmt_readable_granules('ATL06',files=['ATL06_20190329071316_13870211_003_*']) - exp = ['ATL06_20190329071316_13870211_003_*'] + obs = apifmt._fmt_readable_granules( + "ATL06", files=["ATL06_20190329071316_13870211_003_*"] + ) + exp = ["ATL06_20190329071316_13870211_003_*"] assert obs == exp @@ -1104,17 +138,17 @@ def test_CMRparams_no_other_inputs(): CMRparams.build_params( product="ATL06", - version="003", + version="005", start=dt.datetime(2019, 2, 20, 0, 0), end=dt.datetime(2019, 2, 24, 23, 59, 59), extent_type="bounding_box", - spatial_extent=[-55, 68, -48, 71], + spatial_extent="-55.0,68.0,-48.0,71.0", ) obs_fmted_params = CMRparams.fmted_keys exp_fmted_params = { "short_name": "ATL06", - "version": "003", + "version": "005", "temporal": "2019-02-20T00:00:00Z,2019-02-24T23:59:59Z", - "bounding_box": "-55,68,-48,71", + "bounding_box": "-55.0,68.0,-48.0,71.0", } assert obs_fmted_params == exp_fmted_params diff --git a/icepyx/tests/test_behind_NSIDC_API_login.py b/icepyx/tests/test_behind_NSIDC_API_login.py index a277fcd35..d01e1e0ec 100644 --- a/icepyx/tests/test_behind_NSIDC_API_login.py +++ b/icepyx/tests/test_behind_NSIDC_API_login.py @@ -13,7 +13,7 @@ @pytest.fixture(scope="module") def reg(): live_reg = ipx.Query( - "ATL06", [-55, 68, -48, 71], ["2019-02-22", "2019-02-28"], version="004" + "ATL06", [-55, 68, -48, 71], ["2019-02-22", "2019-02-28"], version="005" ) yield live_reg del live_reg @@ -21,7 +21,7 @@ def reg(): @pytest.fixture(scope="module") def session(reg): - capability_url = f"https://n5eil02u.ecs.nsidc.org/egi/capabilities/{reg.product}.{reg._version}.xml" + capability_url = "https://n5eil02u.ecs.nsidc.org/egi/capabilities/{reg.product}.{reg._version}.xml" ed_obj = Earthdata( "icepyx_devteam", "icepyx.dev@gmail.com", @@ -39,8 +39,8 @@ def session(reg): def test_get_custom_options_output(session): - obs = is2ref._get_custom_options(session, "ATL06", "004") - with open("./icepyx/tests/ATL06v04_options.json") as exp_json: + obs = is2ref._get_custom_options(session, "ATL06", "005") + with open("./icepyx/tests/ATL06v05_options.json") as exp_json: exp = json.load(exp_json) assert all(keys in obs.keys() for keys in exp.keys()) assert all(obs[key] == exp[key] for key in exp.keys()) diff --git a/icepyx/tests/test_geospatial.py b/icepyx/tests/test_geospatial.py deleted file mode 100644 index 9d7f86b13..000000000 --- a/icepyx/tests/test_geospatial.py +++ /dev/null @@ -1,30 +0,0 @@ -import pytest -import warnings -import geopandas as gpd -from shapely.geometry import Polygon - - -import icepyx.core.geospatial as geospatial - -########## geodataframe ########## -def test_gdf_from_bbox(): - obs = geospatial.geodataframe("bounding_box", [-55, 68, -48, 71]) - geom = [Polygon(list(zip([-55, -55, -48, -48, -55], [68, 71, 71, 68, 68])))] - exp = gpd.GeoDataFrame(geometry=geom) - # DevNote: this feels like a questionable test to me, since it specifies the first entry (though there should only be one) - assert obs.geometry[0] == exp.geometry[0] - - -# TestQuestions: 1) Do these need to be tested? -# 2) Is the best way to test them with lengthy inputs and seeing if the gdfs are the same? -# def test_gdf_from_strpoly(): - -# def test_gdf_from_filepoly(): - - -def test_bad_extent_input(): - ermsg = "Your spatial extent type is not an accepted input and a geodataframe cannot be constructed" - # DevNote: can't get the test to pass if the extent_type is included. Not sure why the strings "don't match" - # ermsg = "Your spatial extent type (polybox) is not an accepted input and a geodataframe cannot be constructed" - with pytest.raises(TypeError, match=ermsg): - geospatial.geodataframe("polybox", [1, 2, 3, 4]) diff --git a/icepyx/tests/test_query.py b/icepyx/tests/test_query.py index 7df29914d..8b5d53ffe 100644 --- a/icepyx/tests/test_query.py +++ b/icepyx/tests/test_query.py @@ -33,7 +33,7 @@ def test_icepyx_boundingbox_query(): "03:30:00", "21:30:00", "005", - ("bounding box", [-64.0, 66.0, -55.0, 72.0]), + ("bounding_box", [-64.0, 66.0, -55.0, 72.0]), ) assert obs_tuple == exp_tuple diff --git a/icepyx/tests/test_spatial.py b/icepyx/tests/test_spatial.py new file mode 100644 index 000000000..c7731152b --- /dev/null +++ b/icepyx/tests/test_spatial.py @@ -0,0 +1,1468 @@ +import datetime as dt +import geopandas as gpd +import numpy as np +import os +from pathlib import Path +import pytest +import re +from shapely.geometry import Polygon +import warnings + +import icepyx.core.spatial as spat + + +# ######### "Bounding Box" input tests ################################################################################ +# (Note that these ALSO test the @property functions for the class for bounding boxes) + + +def test_intlist_bbox(): + """ + Bounding box test w/ a List of valid Int inputs. + * tests that expected output is correct + * tests that _ext_type is correct + + """ + # initialize Spatial object; + # it should call validate_spatial function correctly + + intlist_bbox = spat.Spatial([-64, 66, -55, 72]) + assert intlist_bbox._ext_type == "bounding_box" + assert intlist_bbox._geom_file is None + assert intlist_bbox.extent == [-64, 66, -55, 72] + + +def test_floatlist_bbox(): + floatlist_bbox = spat.Spatial([-64.2, 66.2, -55.5, 72.5]) + assert floatlist_bbox._ext_type == "bounding_box" + assert floatlist_bbox._geom_file is None + assert floatlist_bbox.extent == [-64.2, 66.2, -55.5, 72.5] + + +def test_numpyfloatarray_bbox(): + npfloat_bbox = spat.Spatial(np.array([-64.2, 66.2, -55.5, 72.5])) + assert npfloat_bbox._ext_type == "bounding_box" + assert npfloat_bbox._geom_file is None + assert npfloat_bbox.extent == [-64.2, 66.2, -55.5, 72.5] + + +def test_numpyfloatlist_bbox(): + npfloatlist_bbox = spat.Spatial(list(np.array([-64.2, 66.2, -55.5, 72.5]))) + assert npfloatlist_bbox._ext_type == "bounding_box" + assert npfloatlist_bbox._geom_file is None + assert npfloatlist_bbox.extent == [-64.2, 66.2, -55.5, 72.5] + + +def test_intlist_with0_bbox(): + npfloatlist_bbox = spat.Spatial(list(np.array([0, -80, 90, -60]))) + assert npfloatlist_bbox._ext_type == "bounding_box" + assert npfloatlist_bbox._geom_file is None + assert npfloatlist_bbox.extent == [0, -80, 90, -60] + + +# ########## Bounding Box Assertion Error tests ############################################# +# (input for all of these tests is bad; ensuring the spatial class catches this) + + +def test_too_few_bbox_points(): + with pytest.raises(AssertionError): + too_few_bbox_points = spat.Spatial([-64.2, 66.2, -55.5]) + + +def test_too_many_bbox_points(): + with pytest.raises(AssertionError): + too_many_bbox_points = spat.Spatial([-64.2, 66.2, -55.5, 72.5, 0]) + + +def test_invalid_low_latitude_1_bbox(): + with pytest.raises(AssertionError): + low_lat_1_bbox = spat.Spatial([-64.2, -90.2, -55.5, 72.5]) + + +def test_invalid_high_latitude_1_bbox(): + with pytest.raises(AssertionError): + high_lat_1_bbox = spat.Spatial([-64.2, 90.2, -55.5, 72.5]) + + +def test_invalid_low_latitude_3_bbox(): + with pytest.raises(AssertionError): + low_lat_3_bbox = spat.Spatial([-64.2, 66.2, -55.5, -90.5]) + + +def test_invalid_high_latitude_3_bbox(): + with pytest.raises(AssertionError): + high_lat_3_bbox = spat.Spatial([-64.2, 66.2, -55.5, 90.5]) + + +def test_invalid_low_longitude_0_bbox(): + with pytest.raises(AssertionError): + low_lon_0_bbox = spat.Spatial([-180.2, 66.2, -55.5, 72.5]) + + +def test_invalid_high_longitude_0_bbox(): + with pytest.raises(AssertionError): + high_lon_0_bbox = spat.Spatial([180.2, 66.2, -55.5, 72.5]) + + +def test_invalid_low_longitude_2_bbox(): + with pytest.raises(AssertionError): + low_lon_2_bbox = spat.Spatial([-64.2, 66.2, -180.5, 72.5]) + + +def test_invalid_high_longitude_2_bbox(): + with pytest.raises(AssertionError): + high_lon_2_bbox = spat.Spatial([-64.2, 66.2, 180.5, 72.5]) + + +def test_same_sign_lowleft_gt_upright_latitude_bbox(): + with pytest.raises(AssertionError): + lat_ll_gt_ur_ss_bbox = spat.Spatial([-64.2, 72.5, -55.5, 66.2]) + + +def test_bad_values_bbox(): + with pytest.raises(ValueError): + bad_input = spat.Spatial(["a", "b", "c", "d"]) + + +# ############### END BOUNDING BOX TESTS ################################################################ + +# ######### "Polygon" input tests (NOT FROM FILE) ###################################################### + + +def test_list_pairs_polygon(): + poly_list_pair = spat.Spatial( + [[-55, 68], [-55, 71], [-48, 71], [-48, 68], [-55, 68]] + ) + expected_poly_list_pair = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_list_pair._ext_type == "polygon" + assert poly_list_pair._geom_file is None + assert poly_list_pair.extent == expected_poly_list_pair + + +def test_tuple_latlon_pairs(): + poly_tuple_pair = spat.Spatial( + [(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)] + ) + expected_poly_tuple_pair = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_tuple_pair._ext_type == "polygon" + assert poly_tuple_pair._geom_file is None + assert poly_tuple_pair.extent == expected_poly_tuple_pair + + +def test_intlist_latlon_coords(): + poly_list = spat.Spatial([-55, 68, -55, 71, -48, 71, -48, 68, -55, 68]) + expected_poly_list = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_list._ext_type == "polygon" + assert poly_list._geom_file is None + assert poly_list.extent == expected_poly_list + + +def test_floatlist_latlon_coords(): + poly_float_list = spat.Spatial( + [-55.0, 68.7, -55.0, 71, -48, 71, -48, 68.7, -55.0, 68.7] + ) + expected_poly_float_list = [ + -55.0, + 68.7, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.7, + -55.0, + 68.7, + ] + + assert poly_float_list._ext_type == "polygon" + assert poly_float_list._geom_file is None + assert poly_float_list.extent == expected_poly_float_list + + +# numpy array tests + + +def test_numpy_list_pairs_polygon(): + poly_list_pair = spat.Spatial( + np.array([[-55, 68], [-55, 71], [-48, 71], [-48, 68], [-55, 68]]) + ) + expected_poly_list_pair = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_list_pair._ext_type == "polygon" + assert poly_list_pair._geom_file is None + assert poly_list_pair.extent == expected_poly_list_pair + + +def test_numpy_tuple_latlon_pairs(): + poly_tuple_pair = spat.Spatial( + np.array([(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)]) + ) + expected_poly_tuple_pair = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_tuple_pair._ext_type == "polygon" + assert poly_tuple_pair._geom_file is None + assert poly_tuple_pair.extent == expected_poly_tuple_pair + + +def test_numpy_intlist_latlon_coords(): + poly_list = spat.Spatial(np.array([-55, 68, -55, 71, -48, 71, -48, 68, -55, 68])) + expected_poly_list = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_list._ext_type == "polygon" + assert poly_list._geom_file is None + assert poly_list.extent == expected_poly_list + + +# ########## Polygon Assertion Error tests ############################################################ +# (input for all of these tests is bad; ensuring the spatial class catches this) + + +def test_odd_num_lat_long_list_poly_throws_error(): + with pytest.raises(AssertionError): + bad_input = spat.Spatial([-55, 68, -55, 71, -48, 71, -48, 68, -55]) + + +def test_wrong_num_lat_long_tuple_poly_throws_error(): + with pytest.raises(ValueError): + bad_input = spat.Spatial( + [(-55, 68, 69), (-55, 71), (-48, 71), (-48, 68), (-55, 68)] + ) + + +def test_bad_value_types_poly(): + with pytest.raises(ValueError): + bad_input = spat.Spatial(["a", "b", "c", "d", "e"]) + + +# ###################### Automatically Closed Polygon Tests ########################################################### + + +def test_poly_tuple_latlon_pairs_auto_close(): + poly_tuple_pair = spat.Spatial([(-55, 68), (-55, 71), (-48, 71), (-48, 68)]) + expected_poly_tuple_pair = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_tuple_pair._ext_type == "polygon" + assert poly_tuple_pair._geom_file is None + assert poly_tuple_pair.extent == expected_poly_tuple_pair + + +def test_poly_list_auto_close(): + poly_list = spat.Spatial([-55, 68, -55, 71, -48, 71, -48, 68]) + expected_poly_list = [ + -55.0, + 68.0, + -55.0, + 71.0, + -48.0, + 71.0, + -48.0, + 68.0, + -55.0, + 68.0, + ] + + assert poly_list._ext_type == "polygon" + assert poly_list._geom_file is None + assert poly_list.extent == expected_poly_list + + +# ###################### END POLYGON NO FILE TESTS #################################################################### + +# ######### Geom File Input Tests ###################################################### + + +def test_poly_file_simple_one_poly(): + + poly_from_file = spat.Spatial( + str( + Path( + "./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg" + ).resolve() + ) + ) + + expected_poly = [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0] + + assert poly_from_file._ext_type == "polygon" + assert poly_from_file._geom_file is not None + assert poly_from_file._geom_file == str( + Path( + "./doc/source/example_notebooks/supporting_files/simple_test_poly.gpkg" + ).resolve() + ) + assert poly_from_file.extent == expected_poly + + +# ########## Geom File Assertion Error tests ############################################################ + +# (input for all of these tests is bad; ensuring the spatial class catches this) + + +def test_bad_poly_inputfile_name_throws_error(): + with pytest.raises(AssertionError): + bad_input = spat.Spatial("bad_filename.gpkg") + + +def test_bad_poly_inputfile_type_throws_error(): + with pytest.raises(TypeError): + bad_input = spat.Spatial(str(Path("./icepyx/tests/test_read.py").resolve())) + + +########## geodataframe ########## + + +def test_gdf_from_one_bbox(): + + obs = spat.geodataframe("bounding_box", [-55, 68, -48, 71]) + geom = [Polygon(list(zip([-55, -55, -48, -48, -55], [68, 71, 71, 68, 68])))] + exp = gpd.GeoDataFrame(geometry=geom) + + # make sure there is only one geometry before comparing them + assert len(obs.geometry) == 1 + assert len(exp.geometry) == 1 + assert obs.geometry[0].equals(exp.geometry[0]) + + +def test_gdf_from_multi_bbox(): + obs = spat.geodataframe("bounding_box", [-55, 68, -48, 71]) + geom = [Polygon(list(zip([-55, -55, -48, -48, -55], [68, 71, 71, 68, 68])))] + exp = gpd.GeoDataFrame(geometry=geom) + + # make sure there is only one geometry before comparing them + assert len(obs.geometry) == 1 + assert len(exp.geometry) == 1 + assert obs.geometry[0].equals(exp.geometry[0]) + + +# TestQuestions: 1) Do these need to be tested? +# 2) Is the best way to test them with lengthy inputs and seeing if the gdfs are the same? + +# def test_gdf_from_strpoly_one_simple(): + +# def test_gdf_from_strpoly_multi_simple(): + +# def test_gdf_from_strpoly_one_complex(): + +# def test_gdf_from_filepoly_one_simple(): + +# def test_gdf_from_filepoly_one_complex(): + +# def test_gdf_from_filepoly_multi_simple(): + + +def test_bad_extent_type_input(): + ermsg = re.escape( + r"Your spatial extent type (polybox) is not an accepted input and a geodataframe cannot be constructed" + ) + with pytest.raises(TypeError, match=ermsg): + spat.geodataframe("polybox", [1, 2, 3, 4]) + + +# ###################### END GEOM FILE INPUT TESTS #################################################################### + +# ######### Dateline Crossing Tests ###################################################### + + +@pytest.mark.parametrize( + "bbox", + [[-55.5, 66.2, -64.2, 72.5], [1, -71, -1, -70]], +) +def test_bbox_crosses_dateline(bbox): + obs = spat.check_dateline("bounding_box", bbox) + exp = True + assert exp == obs + + +@pytest.mark.parametrize( + "bbox", + [[-64.2, 66.2, 55.5, 72.5], [-55, 68, -48, 71], [-1, -71, 1, -70]], +) +def test_bbox_not_crosses_dateline(bbox): + obs = spat.check_dateline("bounding_box", bbox) + exp = False + assert exp == obs + + +def test_poly_wrong_input(): + with pytest.raises(AssertionError): + tuplelist = spat.check_dateline( + "polygon", + [[160, -45], [160, -40], [-170, -39], [-128, -40], [-128, -45], [160, -45]], + ) + + +def test_poly_crosses_dateline(): + obs = spat.check_dateline( + "polygon", [160, -45, 160, -40, -170, -39, -128, -40, -128, -45, 160, -45] + ) + exp = True + assert exp == obs + + +# Note: users must manually specify their region crosses the dateline for regions spanning >90 longitude +def test_poly_not_crosses_dateline(): + obs = spat.check_dateline( + "polygon", [-55, 68, -55, 71, -48, 71, -47, 70, -48, 68, -55, 68] + ) + exp = False + assert exp == obs + + +# ###################### END DATELINE CROSSING TESTS #################################################################### + +# ######### CMR AND EGI API FORMATTING TESTS ###################################################### + + +def test_bounding_box_fmt(): + bbox = spat.Spatial([-55, 68, -48, 71]) + obs = bbox.fmt_for_CMR() + exp = "-55.0,68.0,-48.0,71.0" + assert obs == exp + + +def test_bbox_fmt(): + bbox = spat.Spatial([-55, 68, -48, 71]) + obs = bbox.fmt_for_EGI() + exp = "-55.0,68.0,-48.0,71.0" + assert obs == exp + + +@pytest.fixture +def poly(): + coords = [ + [-86.622742, -74.908126], + [-86.602149, -74.998483], + [-86.671945, -74.999545], + [-86.667881, -75.01762], + [-86.737771, -75.018662], + [-86.717729, -75.109052], + [-86.788057, -75.110077], + [-86.780144, -75.14624], + [-86.850654, -75.147247], + [-86.835058, -75.219586], + [-86.905925, -75.220574], + [-86.894389, -75.274839], + [-86.965529, -75.27581], + [-86.950368, -75.348177], + [-87.021872, -75.349129], + [-87.003154, -75.439609], + [-87.075115, -75.440545], + [-87.052886, -75.549149], + [-86.98038, -75.548205], + [-86.965004, -75.620616], + [-87.037878, -75.621564], + [-87.034102, -75.63967], + [-86.961136, -75.63872], + [-86.957257, -75.656825], + [-86.884208, -75.655851], + [-86.872234, -75.710165], + [-86.945563, -75.711143], + [-86.925871, -75.801686], + [-86.999681, -75.802647], + [-86.988029, -75.856983], + [-87.062135, -75.857925], + [-87.058326, -75.87604], + [-87.132537, -75.876959], + [-87.128815, -75.895075], + [-87.203132, -75.895972], + [-87.199496, -75.914091], + [-87.273919, -75.914965], + [-87.27037, -75.933086], + [-87.344899, -75.933938], + [-87.341438, -75.95206], + [-87.490715, -75.953695], + [-87.487439, -75.97182], + [-87.562188, -75.972604], + [-87.559001, -75.99073], + [-87.633856, -75.991491], + [-87.627653, -76.027748], + [-87.777778, -76.029203], + [-87.774861, -76.047334], + [-87.925213, -76.048696], + [-87.922485, -76.06683], + [-87.997771, -76.067476], + [-87.995135, -76.085611], + [-88.070527, -76.086234], + [-88.067983, -76.104371], + [-88.143481, -76.104971], + [-88.14103, -76.123109], + [-88.216633, -76.123686], + [-88.214276, -76.141826], + [-88.365701, -76.142909], + [-88.363537, -76.161051], + [-88.439359, -76.161557], + [-88.43729, -76.1797], + [-88.513217, -76.180183], + [-88.511244, -76.198328], + [-88.587276, -76.198787], + [-88.585399, -76.216933], + [-88.737681, -76.217781], + [-88.736001, -76.235929], + [-88.81225, -76.236317], + [-88.810667, -76.254466], + [-88.887022, -76.254831], + [-88.885537, -76.272981], + [-88.961998, -76.273321], + [-88.960611, -76.291473], + [-89.037177, -76.29179], + [-89.035889, -76.309942], + [-89.112561, -76.310235], + [-89.111372, -76.328389], + [-89.264932, -76.328903], + [-89.263946, -76.347058], + [-89.340833, -76.347279], + [-89.339947, -76.365434], + [-89.41694, -76.365631], + [-89.416155, -76.383788], + [-89.493254, -76.383961], + [-89.492571, -76.402118], + [-89.569775, -76.402267], + [-89.569195, -76.420425], + [-89.723816, -76.420649], + [-89.723443, -76.438808], + [-89.800859, -76.438884], + [-89.80059, -76.457044], + [-89.878112, -76.457095], + [-89.877947, -76.475255], + [-89.955575, -76.475282], + [-89.955514, -76.493443], + [-90.033248, -76.493445], + [-90.033293, -76.511607], + [-90.111131, -76.511584], + [-90.111283, -76.529747], + [-90.345113, -76.52953], + [-90.345583, -76.547693], + [-90.42363, -76.547571], + [-90.424208, -76.565734], + [-90.50236, -76.565588], + [-90.503734, -76.601916], + [-90.582098, -76.601744], + [-90.583695, -76.638075], + [-90.662272, -76.637877], + [-90.664093, -76.67421], + [-90.742884, -76.673987], + [-90.743907, -76.692154], + [-90.822803, -76.691906], + [-90.823937, -76.710073], + [-91.060932, -76.709176], + [-91.062397, -76.727343], + [-91.536922, -76.72487], + [-91.539047, -76.743034], + [-91.697397, -76.742008], + [-91.699746, -76.760171], + [-91.779021, -76.759619], + [-91.783959, -76.795946], + [-91.863446, -76.795367], + [-91.873848, -76.868024], + [-91.793917, -76.868605], + [-91.796424, -76.886772], + [-91.716375, -76.887329], + [-91.721186, -76.923666], + [-91.640906, -76.924199], + [-91.647835, -76.97871], + [-91.325297, -76.980597], + [-91.327166, -76.998771], + [-91.165637, -76.999562], + [-91.167283, -77.017738], + [-91.086397, -77.018096], + [-91.089474, -77.054451], + [-91.008355, -77.054784], + [-91.015545, -77.145686], + [-91.178934, -77.144989], + [-91.180618, -77.16317], + [-91.426015, -77.16193], + [-91.434206, -77.234653], + [-92.092069, -77.230176], + [-92.08907, -77.212001], + [-92.335283, -77.209895], + [-92.352136, -77.300761], + [-92.269483, -77.301495], + [-92.276054, -77.337847], + [-92.193152, -77.338557], + [-92.199521, -77.374914], + [-92.282662, -77.374202], + [-92.285981, -77.392381], + [-92.369233, -77.391642], + [-92.383091, -77.464357], + [-92.466819, -77.463587], + [-92.470431, -77.481766], + [-92.386581, -77.482537], + [-92.390081, -77.500717], + [-92.138102, -77.502874], + [-92.141243, -77.521058], + [-91.972963, -77.522365], + [-91.984627, -77.595116], + [-91.899978, -77.595733], + [-91.90279, -77.613923], + [-91.4788, -77.616608], + [-91.480993, -77.634803], + [-91.14118, -77.636469], + [-91.14799, -77.709264], + [-91.062516, -77.709615], + [-91.070502, -77.800626], + [-90.812128, -77.801523], + [-90.81335, -77.819728], + [-90.727088, -77.819973], + [-90.732603, -77.911009], + [-90.81952, -77.910763], + [-90.820765, -77.928971], + [-90.90781, -77.928697], + [-90.909191, -77.946905], + [-90.822014, -77.94718], + [-90.823267, -77.96539], + [-90.735953, -77.965638], + [-90.737076, -77.983849], + [-90.824523, -77.983601], + [-90.825784, -78.001812], + [-90.91336, -78.001535], + [-90.914759, -78.019746], + [-91.090167, -78.019109], + [-91.093515, -78.055531], + [-91.181481, -78.05517], + [-91.188783, -78.128018], + [-91.365784, -78.127206], + [-91.370017, -78.163631], + [-91.458782, -78.163181], + [-91.463317, -78.199607], + [-91.552351, -78.199128], + [-91.554767, -78.217341], + [-91.643932, -78.216832], + [-91.651645, -78.271472], + [-91.830785, -78.270365], + [-91.833652, -78.288578], + [-92.013037, -78.287355], + [-92.016194, -78.305566], + [-92.106013, -78.30491], + [-92.115968, -78.359544], + [-92.025726, -78.360203], + [-92.035347, -78.414844], + [-91.944667, -78.415477], + [-91.947751, -78.433693], + [-91.856918, -78.434298], + [-91.859867, -78.452516], + [-91.76888, -78.453093], + [-91.771695, -78.471312], + [-91.680555, -78.471861], + [-91.683233, -78.490081], + [-91.591939, -78.490602], + [-91.59703, -78.527046], + [-91.505436, -78.52754], + [-91.507847, -78.545764], + [-91.324343, -78.546665], + [-91.330738, -78.601343], + [-91.238533, -78.601752], + [-91.24053, -78.61998], + [-91.14817, -78.62036], + [-91.150024, -78.638589], + [-90.872462, -78.639554], + [-90.873874, -78.657786], + [-90.781194, -78.658049], + [-90.78246, -78.676281], + [-90.689626, -78.676516], + [-90.691868, -78.712982], + [-90.598728, -78.713188], + [-90.599703, -78.731422], + [-90.506409, -78.731598], + [-90.508064, -78.76807], + [-90.414462, -78.768217], + [-90.41582, -78.804691], + [-90.32191, -78.804808], + [-90.324034, -78.877764], + [-90.229502, -78.877852], + [-90.230262, -78.914333], + [-90.040568, -78.914419], + [-90.040635, -78.932661], + [-89.94563, -78.932659], + [-89.94554, -78.950901], + [-89.850378, -78.950868], + [-89.850129, -78.969111], + [-89.754809, -78.969048], + [-89.75399, -79.005535], + [-89.562719, -79.005317], + [-89.561988, -79.023561], + [-89.466196, -79.023406], + [-89.465302, -79.04165], + [-89.273406, -79.041249], + [-89.272187, -79.059493], + [-88.983893, -79.05866], + [-88.982186, -79.076903], + [-89.1747, -79.07749], + [-89.173311, -79.095734], + [-89.269737, -79.095982], + [-89.268506, -79.114228], + [-89.365099, -79.114445], + [-89.364027, -79.132691], + [-89.460787, -79.132879], + [-89.458959, -79.169374], + [-89.55605, -79.16953], + [-89.555296, -79.187779], + [-89.652554, -79.187905], + [-89.651963, -79.206154], + [-89.749389, -79.20625], + [-89.748962, -79.2245], + [-89.846555, -79.224564], + [-89.846293, -79.242815], + [-90.041814, -79.24285], + [-90.042029, -79.297606], + [-90.140292, -79.297577], + [-90.140775, -79.334083], + [-90.042173, -79.334112], + [-90.042319, -79.37062], + [-90.141261, -79.370591], + [-90.141505, -79.388846], + [-90.240618, -79.388785], + [-90.241873, -79.443552], + [-90.341501, -79.443459], + [-90.342693, -79.479973], + [-90.442666, -79.479848], + [-90.444995, -79.534621], + [-90.545492, -79.534464], + [-90.546451, -79.552722], + [-90.445777, -79.55288], + [-90.447349, -79.5894], + [-91.053456, -79.587965], + [-91.055316, -79.606223], + [-91.257663, -79.605486], + [-91.259887, -79.623743], + [-91.361228, -79.623325], + [-91.36364, -79.641582], + [-91.465152, -79.641131], + [-91.488897, -79.805457], + [-91.695178, -79.804442], + [-91.698235, -79.822701], + [-91.801545, -79.822143], + [-91.808067, -79.85866], + [-91.704384, -79.85922], + [-91.707475, -79.87748], + [-91.811346, -79.876919], + [-91.814637, -79.895179], + [-91.918685, -79.894584], + [-91.922176, -79.912843], + [-92.026401, -79.912214], + [-92.030095, -79.930472], + [-92.134495, -79.929808], + [-92.138393, -79.948066], + [-92.347532, -79.946636], + [-92.351826, -79.964891], + [-92.456562, -79.964125], + [-92.461064, -79.982379], + [-92.565975, -79.981578], + [-92.570685, -79.999832], + [-92.78084, -79.998126], + [-92.785952, -80.016376], + [-92.891195, -80.015471], + [-92.896519, -80.033721], + [-93.001935, -80.032781], + [-93.007473, -80.051029], + [-93.113062, -80.050053], + [-93.118814, -80.0683], + [-93.224577, -80.067288], + [-93.230546, -80.085534], + [-93.336481, -80.084487], + [-93.324176, -80.048001], + [-93.429699, -80.046925], + [-93.417099, -80.010444], + [-93.522213, -80.009338], + [-93.515756, -79.991101], + [-93.620655, -79.989964], + [-93.61403, -79.971729], + [-93.718714, -79.97056], + [-93.711924, -79.952328], + [-93.816393, -79.951128], + [-93.788723, -79.87821], + [-93.892414, -79.876987], + [-93.864399, -79.804083], + [-93.967323, -79.802836], + [-93.946026, -79.748169], + [-93.843651, -79.749409], + [-93.823125, -79.694739], + [-93.924956, -79.693505], + [-93.90411, -79.638844], + [-94.005379, -79.637584], + [-93.998302, -79.619367], + [-94.099369, -79.618077], + [-94.092139, -79.599863], + [-94.193003, -79.598544], + [-94.185623, -79.580332], + [-94.386921, -79.577602], + [-94.379215, -79.559395], + [-94.680431, -79.555069], + [-94.672229, -79.53687], + [-94.772403, -79.535367], + [-94.747448, -79.48078], + [-94.847075, -79.479253], + [-94.81352, -79.406486], + [-94.912434, -79.404938], + [-94.903948, -79.38675], + [-95.101351, -79.383566], + [-95.092557, -79.365384], + [-95.191045, -79.363748], + [-95.155505, -79.291032], + [-95.253295, -79.289376], + [-95.244321, -79.271201], + [-95.341915, -79.269517], + [-95.332806, -79.251344], + [-95.430206, -79.249633], + [-95.420964, -79.231464], + [-95.323729, -79.233172], + [-95.269903, -79.124145], + [-95.366167, -79.122454], + [-95.357141, -79.104287], + [-95.453215, -79.102568], + [-95.425842, -79.048076], + [-95.616944, -79.044565], + [-95.598218, -79.00825], + [-95.693408, -79.006456], + [-95.683935, -78.988302], + [-95.588901, -78.990093], + [-95.579615, -78.971937], + [-95.484707, -78.973695], + [-95.475607, -78.955536], + [-95.380824, -78.957262], + [-95.37191, -78.9391], + [-95.466538, -78.937377], + [-95.457498, -78.919218], + [-95.551942, -78.917468], + [-95.542778, -78.899312], + [-95.637038, -78.897535], + [-95.609268, -78.843079], + [-95.515467, -78.844846], + [-95.506423, -78.826692], + [-95.412744, -78.828427], + [-95.403881, -78.81027], + [-95.310325, -78.811973], + [-95.301642, -78.793813], + [-95.114747, -78.797124], + [-95.106394, -78.778959], + [-95.013057, -78.780567], + [-95.004882, -78.7624], + [-94.911669, -78.763976], + [-94.895698, -78.727637], + [-94.988611, -78.726066], + [-94.940425, -78.617072], + [-95.032424, -78.615487], + [-95.024337, -78.597325], + [-95.207964, -78.594073], + [-95.191285, -78.557761], + [-95.465652, -78.552682], + [-95.474413, -78.57083], + [-95.748962, -78.565482], + [-95.721466, -78.511065], + [-95.812493, -78.509234], + [-95.803243, -78.491098], + [-96.075717, -78.48544], + [-96.06607, -78.467314], + [-96.156692, -78.465373], + [-96.146934, -78.447251], + [-96.327803, -78.44329], + [-96.297869, -78.388943], + [-96.387836, -78.386929], + [-96.377781, -78.368817], + [-96.467577, -78.366779], + [-96.457416, -78.34867], + [-96.547041, -78.346606], + [-96.536773, -78.328501], + [-96.80504, -78.32215], + [-96.794392, -78.304055], + [-96.883611, -78.301886], + [-96.872859, -78.283794], + [-96.961909, -78.2816], + [-96.940233, -78.245425], + [-97.028977, -78.243209], + [-97.018054, -78.225125], + [-97.19517, -78.220617], + [-97.184011, -78.20254], + [-97.272383, -78.200248], + [-97.238713, -78.14603], + [-97.326651, -78.14372], + [-97.315364, -78.125651], + [-97.403134, -78.123318], + [-97.391749, -78.105253], + [-97.566921, -78.10051], + [-97.555308, -78.082453], + [-97.64271, -78.080044], + [-97.607693, -78.025883], + [-97.520682, -78.02828], + [-97.497773, -77.992166], + [-97.410987, -77.994529], + [-97.399713, -77.976468], + [-97.313022, -77.9788], + [-97.27979, -77.924608], + [-97.193451, -77.926901], + [-97.139363, -77.836566], + [-96.967859, -77.841038], + [-96.946954, -77.804891], + [-96.861407, -77.80708], + [-96.851127, -77.789004], + [-96.765675, -77.791162], + [-96.725358, -77.718845], + [-96.640377, -77.720964], + [-96.620645, -77.6848], + [-96.535882, -77.686886], + [-96.526184, -77.668801], + [-96.441516, -77.670857], + [-96.384656, -77.562336], + [-96.552494, -77.558236], + [-96.514174, -77.485919], + [-96.59757, -77.483841], + [-96.58794, -77.465766], + [-96.671187, -77.463665], + [-96.680937, -77.481738], + [-97.263693, -77.466276], + [-97.253111, -77.448226], + [-97.336123, -77.445916], + [-97.325453, -77.42787], + [-97.491148, -77.423178], + [-97.480274, -77.405139], + [-97.397559, -77.407495], + [-97.376139, -77.371411], + [-97.293628, -77.373733], + [-97.28308, -77.355688], + [-98.433698, -77.320866], + [-98.421564, -77.302872], + [-98.666926, -77.294764], + [-98.642079, -77.2588], + [-99.049167, -77.244815], + [-99.036233, -77.226854], + [-99.522851, -77.209257], + [-99.509284, -77.191321], + [-99.832489, -77.179101], + [-99.818518, -77.161182], + [-99.979666, -77.154929], + [-99.965515, -77.137019], + [-100.447336, -77.117686], + [-100.432572, -77.099804], + [-100.512625, -77.096499], + [-100.483005, -77.060743], + [-100.642555, -77.054077], + [-100.627593, -77.036208], + [-100.707198, -77.032842], + [-100.692171, -77.014978], + [-100.851044, -77.008182], + [-100.835847, -76.990327], + [-100.915114, -76.986897], + [-100.899853, -76.969047], + [-101.058051, -76.962123], + [-101.042622, -76.944282], + [-101.121553, -76.940788], + [-101.090613, -76.905114], + [-101.169293, -76.901606], + [-101.153783, -76.883774], + [-101.232316, -76.880245], + [-101.216746, -76.862418], + [-101.295133, -76.85887], + [-101.217404, -76.769752], + [-101.295238, -76.766205], + [-101.279717, -76.748385], + [-101.357407, -76.744819], + [-101.310795, -76.691373], + [-101.388141, -76.687797], + [-101.372587, -76.669986], + [-101.449791, -76.666392], + [-101.326063, -76.523929], + [-101.402436, -76.52035], + [-101.341168, -76.449131], + [-101.265184, -76.45269], + [-101.175067, -76.345822], + [-101.250474, -76.342292], + [-101.190803, -76.27106], + [-101.265793, -76.267525], + [-101.250878, -76.249721], + [-101.325735, -76.246168], + [-101.280944, -76.192769], + [-101.429978, -76.185621], + [-101.399941, -76.150039], + [-101.474214, -76.14644], + [-101.459161, -76.128654], + [-101.533304, -76.125037], + [-101.518198, -76.107255], + [-101.59221, -76.10362], + [-101.577051, -76.085842], + [-101.650932, -76.082189], + [-101.635722, -76.064416], + [-101.709473, -76.060745], + [-101.694211, -76.042976], + [-101.767832, -76.039287], + [-101.752518, -76.021523], + [-101.899461, -76.014086], + [-101.837882, -75.943066], + [-101.910936, -75.939333], + [-101.89555, -75.921582], + [-101.968477, -75.917832], + [-101.953041, -75.900085], + [-102.02584, -75.896317], + [-102.010356, -75.878575], + [-102.083027, -75.87479], + [-102.067494, -75.857052], + [-102.140038, -75.853249], + [-102.124457, -75.835516], + [-102.196874, -75.831696], + [-102.181245, -75.813967], + [-102.253535, -75.810129], + [-102.237859, -75.792406], + [-102.310023, -75.78855], + [-102.294299, -75.770832], + [-102.366338, -75.766959], + [-102.350567, -75.749245], + [-102.494353, -75.741443], + [-102.478451, -75.723738], + [-102.693572, -75.711884], + [-102.70973, -75.729573], + [-102.853113, -75.72155], + [-102.869482, -75.739229], + [-102.941198, -75.735179], + [-102.957693, -75.752851], + [-103.029452, -75.748774], + [-103.012872, -75.731107], + [-103.227644, -75.718758], + [-103.210852, -75.701106], + [-103.282275, -75.696951], + [-103.265441, -75.679303], + [-103.336738, -75.675132], + [-103.303027, -75.639846], + [-103.445162, -75.631459], + [-103.428203, -75.613826], + [-103.923762, -75.583823], + [-103.90627, -75.566227], + [-103.976811, -75.56186], + [-103.941793, -75.526678], + [-104.012128, -75.5223], + [-103.942283, -75.45195], + [-103.914847, -75.426057], + [-103.846549, -75.420428], + [-103.814359, -75.41156], + [-103.74731, -75.394972], + [-103.643531, -75.376578], + [-103.639472, -75.360155], + [-103.549124, -75.339049], + [-103.509054, -75.329656], + [-103.456714, -75.307204], + [-103.37484, -75.273725], + [-103.284801, -75.264374], + [-103.224839, -75.25812], + [-103.182394, -75.249825], + [-103.086408, -75.237813], + [-103.042136, -75.231576], + [-102.981295, -75.215486], + [-102.956754, -75.210167], + [-102.921448, -75.203018], + [-102.898283, -75.198106], + [-102.873449, -75.192921], + [-102.84957, -75.188785], + [-102.825705, -75.184646], + [-102.789524, -75.181222], + [-102.744295, -75.17242], + [-102.656346, -75.16239], + [-102.607491, -75.160775], + [-102.560626, -75.159773], + [-102.511333, -75.159268], + [-102.378744, -75.152045], + [-102.34262, -75.146716], + [-102.266406, -75.132957], + [-102.223828, -75.128342], + [-102.157455, -75.12945], + [-102.113853, -75.130386], + [-102.068876, -75.13139], + [-102.040635, -75.126691], + [-102.013199, -75.12121], + [-101.969076, -75.11627], + [-101.953576, -75.113073], + [-101.923326, -75.111044], + [-101.896684, -75.109917], + [-101.821333, -75.103337], + [-101.766389, -75.098945], + [-101.726414, -75.090073], + [-101.723655, -75.079577], + [-101.631989, -75.054005], + [-101.564382, -75.02971], + [-101.547244, -75.015213], + [-101.531499, -75.000643], + [-101.549303, -74.990901], + [-101.489949, -74.940509], + [-101.469959, -74.921526], + [-101.455398, -74.908855], + [-101.420557, -74.891146], + [-101.399072, -74.882138], + [-101.391177, -74.870096], + [-101.371447, -74.860874], + [-101.363063, -74.853621], + [-101.338827, -74.838164], + [-101.312982, -74.826333], + [-101.29282, -74.816401], + [-101.276851, -74.808624], + [-101.27464, -74.804247], + [-101.259243, -74.798558], + [-101.251822, -74.792086], + [-101.267741, -74.78708], + [-101.256493, -74.781809], + [-101.257733, -74.779767], + [-101.250447, -74.777156], + [-101.240613, -74.770054], + [-101.222641, -74.763963], + [-101.216307, -74.748673], + [-101.212936, -74.740259], + [-101.200426, -74.734469], + [-101.197349, -74.72643], + [-101.188725, -74.7179], + [-101.207959, -74.716895], + [-101.219968, -74.709239], + [-101.232933, -74.706803], + [-101.230248, -74.703234], + [-101.238372, -74.70027], + [-101.254074, -74.700252], + [-101.275428, -74.693637], + [-101.306089, -74.693851], + [-101.351676, -74.691805], + [-101.364701, -74.681592], + [-101.396392, -74.67954], + [-101.416381, -74.679976], + [-101.462601, -74.674445], + [-101.482989, -74.660146], + [-101.530932, -74.656493], + [-101.545802, -74.657827], + [-101.570915, -74.655354], + [-101.627933, -74.648117], + [-101.647793, -74.639151], + [-101.676385, -74.635907], + [-101.678978, -74.633321], + [-101.695894, -74.628422], + [-101.728673, -74.621731], + [-101.781287, -74.617603], + [-101.794801, -74.615021], + [-101.870395, -74.608983], + [-101.933735, -74.601768], + [-101.986726, -74.595483], + [-102.032573, -74.595827], + [-102.026749, -74.590285], + [-102.010395, -74.580201], + [-102.035597, -74.564212], + [-102.090552, -74.553133], + [-102.264411, -74.519626], + [-102.339743, -74.51083], + [-102.411915, -74.510518], + [-102.424826, -74.497263], + [-102.377212, -74.483896], + [-102.280808, -74.473374], + [-102.236421, -74.463717], + [-102.185211, -74.450043], + [-102.150282, -74.438359], + [-102.110682, -74.429878], + [-102.080455, -74.419386], + [-102.029215, -74.421347], + [-101.986657, -74.414487], + [-101.942992, -74.405238], + [-101.914922, -74.383364], + [-101.795349, -74.369597], + [-101.698034, -74.375051], + [-101.572267, -74.390817], + [-101.433665, -74.404266], + [-101.358339, -74.410301], + [-101.276679, -74.412744], + [-101.200663, -74.403148], + [-101.126055, -74.400282], + [-101.050277, -74.385754], + [-100.925725, -74.378623], + [-100.827076, -74.373988], + [-100.786332, -74.316362], + [-100.72066, -74.319735], + [-100.708238, -74.301973], + [-100.642611, -74.305321], + [-100.617997, -74.26979], + [-100.552486, -74.273111], + [-100.528129, -74.237572], + [-100.462734, -74.240864], + [-100.355131, -74.080906], + [-100.290352, -74.084143], + [-100.278602, -74.066367], + [-100.213868, -74.06958], + [-100.190588, -74.03402], + [-100.125968, -74.037206], + [-100.114438, -74.019422], + [-100.049863, -74.022585], + [-100.061323, -74.040372], + [-99.996651, -74.043518], + [-100.008066, -74.061309], + [-99.943298, -74.064439], + [-99.954667, -74.082234], + [-99.889802, -74.085347], + [-99.878504, -74.067549], + [-99.68397, -74.076757], + [-99.672911, -74.058947], + [-99.218628, -74.079702], + [-99.208094, -74.061869], + [-98.688058, -74.08435], + [-98.678122, -74.06649], + [-98.026778, -74.092735], + [-98.035988, -74.110626], + [-97.774563, -74.120566], + [-97.783502, -74.138469], + [-97.521457, -74.148094], + [-97.512812, -74.13018], + [-97.447324, -74.132532], + [-97.438772, -74.114615], + [-97.242413, -74.121541], + [-97.234101, -74.103616], + [-97.103247, -74.108126], + [-97.095101, -74.090197], + [-97.02972, -74.092418], + [-97.021665, -74.074486], + [-96.825632, -74.08102], + [-96.833465, -74.098959], + [-96.768011, -74.101099], + [-96.775789, -74.119041], + [-96.513501, -74.127404], + [-96.506019, -74.109452], + [-96.374919, -74.113506], + [-96.367602, -74.095549], + [-96.302101, -74.097543], + [-96.294875, -74.079584], + [-96.229432, -74.081555], + [-96.222295, -74.063595], + [-96.156909, -74.065543], + [-96.149863, -74.047581], + [-95.95383, -74.053295], + [-95.947021, -74.035326], + [-95.816402, -74.039029], + [-95.809755, -74.021057], + [-95.679223, -74.024673], + [-95.672738, -74.006697], + [-95.542294, -74.010228], + [-95.535971, -73.992248], + [-95.405616, -73.995692], + [-95.399454, -73.97771], + [-95.26919, -73.981068], + [-95.263189, -73.963082], + [-95.133017, -73.966355], + [-95.121348, -73.930376], + [-95.056388, -73.931978], + [-95.050646, -73.913988], + [-94.985747, -73.915568], + [-94.980091, -73.897576], + [-94.915251, -73.899134], + [-94.909681, -73.881141], + [-94.844902, -73.882677], + [-94.839417, -73.864683], + [-94.774698, -73.866196], + [-94.769297, -73.848201], + [-94.704639, -73.849692], + [-94.699323, -73.831696], + [-94.634725, -73.833165], + [-94.629493, -73.815168], + [-94.564955, -73.816615], + [-94.559808, -73.798617], + [-94.430842, -73.801447], + [-94.420869, -73.765446], + [-94.356514, -73.766828], + [-94.351616, -73.748827], + [-94.287321, -73.750186], + [-94.277701, -73.714183], + [-94.213539, -73.715519], + [-94.223015, -73.751526], + [-94.158698, -73.752845], + [-94.168073, -73.788858], + [-94.103602, -73.79016], + [-94.117527, -73.844188], + [-94.052828, -73.845474], + [-94.057417, -73.863487], + [-93.992635, -73.864754], + [-93.997163, -73.882768], + [-93.5429, -73.89108], + [-93.546925, -73.909105], + [-93.416904, -73.911299], + [-93.420791, -73.929327], + [-93.095219, -73.934459], + [-93.098746, -73.952494], + [-93.033533, -73.95346], + [-93.030081, -73.935424], + [-92.117389, -73.946779], + [-92.114979, -73.92873], + [-92.049815, -73.929387], + [-92.05215, -73.947436], + [-91.921656, -73.948689], + [-91.923848, -73.96674], + [-91.793186, -73.967912], + [-91.795233, -73.985966], + [-91.729821, -73.986521], + [-91.731798, -74.004576], + [-91.666307, -74.005112], + [-91.668214, -74.023169], + [-91.077936, -74.027065], + [-91.076703, -74.009003], + [-91.011175, -74.009332], + [-91.01002, -73.991272], + [-90.879106, -73.991867], + [-90.878103, -73.973806], + [-90.812717, -73.974073], + [-90.811791, -73.956012], + [-90.746478, -73.956258], + [-90.74733, -73.974319], + [-90.551155, -73.974933], + [-90.551785, -73.992995], + [-90.486316, -73.993159], + [-90.486872, -74.011222], + [-90.290232, -74.011589], + [-90.290565, -74.029653], + [-90.159318, -74.029795], + [-90.1595, -74.047861], + [-90.028101, -74.04792], + [-90.028133, -74.065986], + [-89.830808, -74.065919], + [-89.830418, -74.102053], + [-89.764492, -74.10199], + [-89.764221, -74.120058], + [-89.69822, -74.119973], + [-89.697523, -74.156112], + [-89.63137, -74.156006], + [-89.630517, -74.192147], + [-89.564212, -74.19202], + [-89.563707, -74.210092], + [-89.430947, -74.209775], + [-89.430287, -74.227847], + [-89.29738, -74.227445], + [-89.296564, -74.245518], + [-89.230036, -74.245285], + [-89.22914, -74.263358], + [-89.162537, -74.263104], + [-89.161562, -74.281178], + [-89.028207, -74.280607], + [-89.02594, -74.316754], + [-88.892285, -74.316097], + [-88.890991, -74.334171], + [-88.82409, -74.333811], + [-88.822715, -74.351885], + [-88.688766, -74.3511], + [-88.687231, -74.369174], + [-88.620184, -74.368749], + [-88.618567, -74.386824], + [-88.484327, -74.38591], + [-88.482549, -74.403984], + [-88.348167, -74.402984], + [-88.346228, -74.421057], + [-88.278965, -74.420525], + [-88.276942, -74.438598], + [-88.142273, -74.437468], + [-88.140087, -74.455541], + [-88.072681, -74.454944], + [-88.07041, -74.473017], + [-87.935456, -74.471756], + [-87.93302, -74.489828], + [-87.865472, -74.489165], + [-87.862952, -74.507237], + [-87.79533, -74.506552], + [-87.792724, -74.524624], + [-87.65734, -74.523188], + [-87.654567, -74.541259], + [-87.586805, -74.540508], + [-87.583946, -74.558579], + [-87.51611, -74.557806], + [-87.513164, -74.575876], + [-87.241573, -74.572566], + [-87.238298, -74.590633], + [-87.034444, -74.587922], + [-87.03092, -74.605986], + [-86.962905, -74.605038], + [-86.955671, -74.641167], + [-86.887503, -74.640195], + [-86.868859, -74.730522], + [-86.800293, -74.729523], + [-86.792609, -74.765656], + [-86.723889, -74.764633], + [-86.716003, -74.800766], + [-86.647127, -74.799719], + [-86.63091, -74.871988], + [-86.561712, -74.870913], + [-86.553377, -74.907049], + [-86.622742, -74.908126], + ] + return spat.Spatial(coords) + + +def test_polygon_fmt(poly): + obs = poly.fmt_for_CMR() + exp = "-86.622742,-74.908126,-86.561712,-74.870913,-86.868859,-74.730522,-86.962905,-74.605038,-89.02594,-74.316754,-89.630517,-74.192147,-89.830808,-74.065919,-90.746478,-73.956258,-91.668214,-74.023169,-92.049815,-73.929387,-93.420791,-73.929327,-93.997163,-73.882768,-94.277701,-73.714183,-95.133017,-73.966355,-96.513501,-74.127404,-99.889802,-74.085347,-100.114438,-74.019422,-100.355131,-74.080906,-100.462734,-74.240864,-100.827076,-74.373988,-101.795349,-74.369597,-102.424826,-74.497263,-101.188725,-74.7179,-101.564382,-75.02971,-103.37484,-75.273725,-103.914847,-75.426057,-104.012128,-75.5223,-103.029452,-75.748774,-102.350567,-75.749245,-101.837882,-75.943066,-101.899461,-76.014086,-101.280944,-76.192769,-101.325735,-76.246168,-101.190803,-76.27106,-101.250474,-76.342292,-101.175067,-76.345822,-101.402436,-76.52035,-101.326063,-76.523929,-101.449791,-76.666392,-101.310795,-76.691373,-101.357407,-76.744819,-101.217404,-76.769752,-101.295133,-76.85887,-101.058051,-76.962123,-100.447336,-77.117686,-98.433698,-77.320866,-97.28308,-77.355688,-97.491148,-77.423178,-96.514174,-77.485919,-96.552494,-77.558236,-96.384656,-77.562336,-96.441516,-77.670857,-97.139363,-77.836566,-97.193451,-77.926901,-97.64271,-78.080044,-96.297869,-78.388943,-96.327803,-78.44329,-95.721466,-78.511065,-95.748962,-78.565482,-94.940425,-78.617072,-94.988611,-78.726066,-94.911669,-78.763976,-95.609268,-78.843079,-95.637038,-78.897535,-95.37191,-78.9391,-95.693408,-79.006456,-95.269903,-79.124145,-95.323729,-79.233172,-95.430206,-79.249633,-95.155505,-79.291032,-95.191045,-79.363748,-94.81352,-79.406486,-94.847075,-79.479253,-94.747448,-79.48078,-94.772403,-79.535367,-93.90411,-79.638844,-93.843651,-79.749409,-93.967323,-79.802836,-93.788723,-79.87821,-93.816393,-79.951128,-93.230546,-80.085534,-91.707475,-79.87748,-91.801545,-79.822143,-91.488897,-79.805457,-91.465152,-79.641131,-90.447349,-79.5894,-90.545492,-79.534464,-90.042319,-79.37062,-90.140775,-79.334083,-90.041814,-79.24285,-88.982186,-79.076903,-90.230262,-78.914333,-90.32191,-78.804808,-90.689626,-78.676516,-91.150024,-78.638589,-92.035347,-78.414844,-92.106013,-78.30491,-91.651645,-78.271472,-91.365784,-78.127206,-91.188783,-78.128018,-91.090167,-78.019109,-90.737076,-77.983849,-90.909191,-77.946905,-90.732603,-77.911009,-90.727088,-77.819973,-91.070502,-77.800626,-91.14118,-77.636469,-91.90279,-77.613923,-91.984627,-77.595116,-91.972963,-77.522365,-92.466819,-77.463587,-92.199521,-77.374914,-92.352136,-77.300761,-92.335283,-77.209895,-91.434206,-77.234653,-91.426015,-77.16193,-91.015545,-77.145686,-91.008355,-77.054784,-91.086397,-77.018096,-91.647835,-76.97871,-91.640906,-76.924199,-91.873848,-76.868024,-91.779021,-76.759619,-90.823937,-76.710073,-90.345113,-76.52953,-86.988029,-75.856983,-86.945563,-75.711143,-86.872234,-75.710165,-87.034102,-75.63967,-86.965004,-75.620616,-87.075115,-75.440545,-87.003154,-75.439609,-87.021872,-75.349129,-86.835058,-75.219586,-86.850654,-75.147247,-86.717729,-75.109052,-86.737771,-75.018662,-86.602149,-74.998483,-86.622742,-74.908126" + assert obs == exp + + +def test_boundingshape_fmt(poly): + obs = poly.fmt_for_EGI() + exp = '{"type":"FeatureCollection","features":[{"id":"0","type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[-86.622742,-74.908126],[-86.553377,-74.907049],[-86.561712,-74.870913],[-86.63091,-74.871988],[-86.647127,-74.799719],[-86.716003,-74.800766],[-86.723889,-74.764633],[-86.792609,-74.765656],[-86.800293,-74.729523],[-86.868859,-74.730522],[-86.887503,-74.640195],[-86.955671,-74.641167],[-86.962905,-74.605038],[-87.03092,-74.605986],[-87.034444,-74.587922],[-87.238298,-74.590633],[-87.241573,-74.572566],[-87.513164,-74.575876],[-87.51611,-74.557806],[-87.583946,-74.558579],[-87.586805,-74.540508],[-87.654567,-74.541259],[-87.65734,-74.523188],[-87.792724,-74.524624],[-87.79533,-74.506552],[-87.862952,-74.507237],[-87.865472,-74.489165],[-87.93302,-74.489828],[-87.935456,-74.471756],[-88.07041,-74.473017],[-88.072681,-74.454944],[-88.140087,-74.455541],[-88.142273,-74.437468],[-88.276942,-74.438598],[-88.278965,-74.420525],[-88.346228,-74.421057],[-88.348167,-74.402984],[-88.482549,-74.403984],[-88.484327,-74.38591],[-88.618567,-74.386824],[-88.620184,-74.368749],[-88.687231,-74.369174],[-88.688766,-74.3511],[-88.822715,-74.351885],[-88.82409,-74.333811],[-88.890991,-74.334171],[-88.892285,-74.316097],[-89.02594,-74.316754],[-89.028207,-74.280607],[-89.161562,-74.281178],[-89.162537,-74.263104],[-89.22914,-74.263358],[-89.230036,-74.245285],[-89.296564,-74.245518],[-89.29738,-74.227445],[-89.430287,-74.227847],[-89.430947,-74.209775],[-89.563707,-74.210092],[-89.564212,-74.19202],[-89.630517,-74.192147],[-89.63137,-74.156006],[-89.697523,-74.156112],[-89.69822,-74.119973],[-89.764221,-74.120058],[-89.764492,-74.10199],[-89.830418,-74.102053],[-89.830808,-74.065919],[-90.028133,-74.065986],[-90.028101,-74.04792],[-90.1595,-74.047861],[-90.159318,-74.029795],[-90.290565,-74.029653],[-90.290232,-74.011589],[-90.486872,-74.011222],[-90.486316,-73.993159],[-90.551785,-73.992995],[-90.551155,-73.974933],[-90.74733,-73.974319],[-90.746478,-73.956258],[-90.811791,-73.956012],[-90.812717,-73.974073],[-90.878103,-73.973806],[-90.879106,-73.991867],[-91.01002,-73.991272],[-91.011175,-74.009332],[-91.076703,-74.009003],[-91.077936,-74.027065],[-91.668214,-74.023169],[-91.666307,-74.005112],[-91.731798,-74.004576],[-91.729821,-73.986521],[-91.795233,-73.985966],[-91.793186,-73.967912],[-91.923848,-73.96674],[-91.921656,-73.948689],[-92.05215,-73.947436],[-92.049815,-73.929387],[-92.114979,-73.92873],[-92.117389,-73.946779],[-93.030081,-73.935424],[-93.033533,-73.95346],[-93.098746,-73.952494],[-93.095219,-73.934459],[-93.420791,-73.929327],[-93.416904,-73.911299],[-93.546925,-73.909105],[-93.5429,-73.89108],[-93.997163,-73.882768],[-93.992635,-73.864754],[-94.057417,-73.863487],[-94.052828,-73.845474],[-94.117527,-73.844188],[-94.103602,-73.79016],[-94.168073,-73.788858],[-94.158698,-73.752845],[-94.223015,-73.751526],[-94.213539,-73.715519],[-94.277701,-73.714183],[-94.287321,-73.750186],[-94.351616,-73.748827],[-94.356514,-73.766828],[-94.420869,-73.765446],[-94.430842,-73.801447],[-94.559808,-73.798617],[-94.564955,-73.816615],[-94.629493,-73.815168],[-94.634725,-73.833165],[-94.699323,-73.831696],[-94.704639,-73.849692],[-94.769297,-73.848201],[-94.774698,-73.866196],[-94.839417,-73.864683],[-94.844902,-73.882677],[-94.909681,-73.881141],[-94.915251,-73.899134],[-94.980091,-73.897576],[-94.985747,-73.915568],[-95.050646,-73.913988],[-95.056388,-73.931978],[-95.121348,-73.930376],[-95.133017,-73.966355],[-95.263189,-73.963082],[-95.26919,-73.981068],[-95.399454,-73.97771],[-95.405616,-73.995692],[-95.535971,-73.992248],[-95.542294,-74.010228],[-95.672738,-74.006697],[-95.679223,-74.024673],[-95.809755,-74.021057],[-95.816402,-74.039029],[-95.947021,-74.035326],[-95.95383,-74.053295],[-96.149863,-74.047581],[-96.156909,-74.065543],[-96.222295,-74.063595],[-96.229432,-74.081555],[-96.294875,-74.079584],[-96.302101,-74.097543],[-96.367602,-74.095549],[-96.374919,-74.113506],[-96.506019,-74.109452],[-96.513501,-74.127404],[-96.775789,-74.119041],[-96.768011,-74.101099],[-96.833465,-74.098959],[-96.825632,-74.08102],[-97.021665,-74.074486],[-97.02972,-74.092418],[-97.095101,-74.090197],[-97.103247,-74.108126],[-97.234101,-74.103616],[-97.242413,-74.121541],[-97.438772,-74.114615],[-97.447324,-74.132532],[-97.512812,-74.13018],[-97.521457,-74.148094],[-97.783502,-74.138469],[-97.774563,-74.120566],[-98.035988,-74.110626],[-98.026778,-74.092735],[-98.678122,-74.06649],[-98.688058,-74.08435],[-99.208094,-74.061869],[-99.218628,-74.079702],[-99.672911,-74.058947],[-99.68397,-74.076757],[-99.878504,-74.067549],[-99.889802,-74.085347],[-99.954667,-74.082234],[-99.943298,-74.064439],[-100.008066,-74.061309],[-99.996651,-74.043518],[-100.061323,-74.040372],[-100.049863,-74.022585],[-100.114438,-74.019422],[-100.125968,-74.037206],[-100.190588,-74.03402],[-100.213868,-74.06958],[-100.278602,-74.066367],[-100.290352,-74.084143],[-100.355131,-74.080906],[-100.462734,-74.240864],[-100.528129,-74.237572],[-100.552486,-74.273111],[-100.617997,-74.26979],[-100.642611,-74.305321],[-100.708238,-74.301973],[-100.72066,-74.319735],[-100.786332,-74.316362],[-100.827076,-74.373988],[-100.925725,-74.378623],[-101.050277,-74.385754],[-101.126055,-74.400282],[-101.200663,-74.403148],[-101.276679,-74.412744],[-101.358339,-74.410301],[-101.433665,-74.404266],[-101.572267,-74.390817],[-101.698034,-74.375051],[-101.795349,-74.369597],[-101.914922,-74.383364],[-101.942992,-74.405238],[-101.986657,-74.414487],[-102.029215,-74.421347],[-102.080455,-74.419386],[-102.110682,-74.429878],[-102.150282,-74.438359],[-102.185211,-74.450043],[-102.236421,-74.463717],[-102.280808,-74.473374],[-102.377212,-74.483896],[-102.424826,-74.497263],[-102.411915,-74.510518],[-102.339743,-74.51083],[-102.264411,-74.519626],[-102.090552,-74.553133],[-102.035597,-74.564212],[-102.010395,-74.580201],[-102.026749,-74.590285],[-102.032573,-74.595827],[-101.986726,-74.595483],[-101.933735,-74.601768],[-101.870395,-74.608983],[-101.794801,-74.615021],[-101.781287,-74.617603],[-101.728673,-74.621731],[-101.695894,-74.628422],[-101.678978,-74.633321],[-101.676385,-74.635907],[-101.647793,-74.639151],[-101.627933,-74.648117],[-101.570915,-74.655354],[-101.545802,-74.657827],[-101.530932,-74.656493],[-101.482989,-74.660146],[-101.462601,-74.674445],[-101.416381,-74.679976],[-101.396392,-74.67954],[-101.364701,-74.681592],[-101.351676,-74.691805],[-101.306089,-74.693851],[-101.275428,-74.693637],[-101.254074,-74.700252],[-101.238372,-74.70027],[-101.230248,-74.703234],[-101.232933,-74.706803],[-101.219968,-74.709239],[-101.207959,-74.716895],[-101.188725,-74.7179],[-101.197349,-74.72643],[-101.200426,-74.734469],[-101.212936,-74.740259],[-101.216307,-74.748673],[-101.222641,-74.763963],[-101.240613,-74.770054],[-101.250447,-74.777156],[-101.257733,-74.779767],[-101.256493,-74.781809],[-101.267741,-74.78708],[-101.251822,-74.792086],[-101.259243,-74.798558],[-101.27464,-74.804247],[-101.276851,-74.808624],[-101.29282,-74.816401],[-101.312982,-74.826333],[-101.338827,-74.838164],[-101.363063,-74.853621],[-101.371447,-74.860874],[-101.391177,-74.870096],[-101.399072,-74.882138],[-101.420557,-74.891146],[-101.455398,-74.908855],[-101.469959,-74.921526],[-101.489949,-74.940509],[-101.549303,-74.990901],[-101.531499,-75.000643],[-101.547244,-75.015213],[-101.564382,-75.02971],[-101.631989,-75.054005],[-101.723655,-75.079577],[-101.726414,-75.090073],[-101.766389,-75.098945],[-101.821333,-75.103337],[-101.896684,-75.109917],[-101.923326,-75.111044],[-101.953576,-75.113073],[-101.969076,-75.11627],[-102.013199,-75.12121],[-102.040635,-75.126691],[-102.068876,-75.13139],[-102.113853,-75.130386],[-102.157455,-75.12945],[-102.223828,-75.128342],[-102.266406,-75.132957],[-102.34262,-75.146716],[-102.378744,-75.152045],[-102.511333,-75.159268],[-102.560626,-75.159773],[-102.607491,-75.160775],[-102.656346,-75.16239],[-102.744295,-75.17242],[-102.789524,-75.181222],[-102.825705,-75.184646],[-102.84957,-75.188785],[-102.873449,-75.192921],[-102.898283,-75.198106],[-102.921448,-75.203018],[-102.956754,-75.210167],[-102.981295,-75.215486],[-103.042136,-75.231576],[-103.086408,-75.237813],[-103.182394,-75.249825],[-103.224839,-75.25812],[-103.284801,-75.264374],[-103.37484,-75.273725],[-103.456714,-75.307204],[-103.509054,-75.329656],[-103.549124,-75.339049],[-103.639472,-75.360155],[-103.643531,-75.376578],[-103.74731,-75.394972],[-103.814359,-75.41156],[-103.846549,-75.420428],[-103.914847,-75.426057],[-103.942283,-75.45195],[-104.012128,-75.5223],[-103.941793,-75.526678],[-103.976811,-75.56186],[-103.90627,-75.566227],[-103.923762,-75.583823],[-103.428203,-75.613826],[-103.445162,-75.631459],[-103.303027,-75.639846],[-103.336738,-75.675132],[-103.265441,-75.679303],[-103.282275,-75.696951],[-103.210852,-75.701106],[-103.227644,-75.718758],[-103.012872,-75.731107],[-103.029452,-75.748774],[-102.957693,-75.752851],[-102.941198,-75.735179],[-102.869482,-75.739229],[-102.853113,-75.72155],[-102.70973,-75.729573],[-102.693572,-75.711884],[-102.478451,-75.723738],[-102.494353,-75.741443],[-102.350567,-75.749245],[-102.366338,-75.766959],[-102.294299,-75.770832],[-102.310023,-75.78855],[-102.237859,-75.792406],[-102.253535,-75.810129],[-102.181245,-75.813967],[-102.196874,-75.831696],[-102.124457,-75.835516],[-102.140038,-75.853249],[-102.067494,-75.857052],[-102.083027,-75.87479],[-102.010356,-75.878575],[-102.02584,-75.896317],[-101.953041,-75.900085],[-101.968477,-75.917832],[-101.89555,-75.921582],[-101.910936,-75.939333],[-101.837882,-75.943066],[-101.899461,-76.014086],[-101.752518,-76.021523],[-101.767832,-76.039287],[-101.694211,-76.042976],[-101.709473,-76.060745],[-101.635722,-76.064416],[-101.650932,-76.082189],[-101.577051,-76.085842],[-101.59221,-76.10362],[-101.518198,-76.107255],[-101.533304,-76.125037],[-101.459161,-76.128654],[-101.474214,-76.14644],[-101.399941,-76.150039],[-101.429978,-76.185621],[-101.280944,-76.192769],[-101.325735,-76.246168],[-101.250878,-76.249721],[-101.265793,-76.267525],[-101.190803,-76.27106],[-101.250474,-76.342292],[-101.175067,-76.345822],[-101.265184,-76.45269],[-101.341168,-76.449131],[-101.402436,-76.52035],[-101.326063,-76.523929],[-101.449791,-76.666392],[-101.372587,-76.669986],[-101.388141,-76.687797],[-101.310795,-76.691373],[-101.357407,-76.744819],[-101.279717,-76.748385],[-101.295238,-76.766205],[-101.217404,-76.769752],[-101.295133,-76.85887],[-101.216746,-76.862418],[-101.232316,-76.880245],[-101.153783,-76.883774],[-101.169293,-76.901606],[-101.090613,-76.905114],[-101.121553,-76.940788],[-101.042622,-76.944282],[-101.058051,-76.962123],[-100.899853,-76.969047],[-100.915114,-76.986897],[-100.835847,-76.990327],[-100.851044,-77.008182],[-100.692171,-77.014978],[-100.707198,-77.032842],[-100.627593,-77.036208],[-100.642555,-77.054077],[-100.483005,-77.060743],[-100.512625,-77.096499],[-100.432572,-77.099804],[-100.447336,-77.117686],[-99.965515,-77.137019],[-99.979666,-77.154929],[-99.818518,-77.161182],[-99.832489,-77.179101],[-99.509284,-77.191321],[-99.522851,-77.209257],[-99.036233,-77.226854],[-99.049167,-77.244815],[-98.642079,-77.2588],[-98.666926,-77.294764],[-98.421564,-77.302872],[-98.433698,-77.320866],[-97.28308,-77.355688],[-97.293628,-77.373733],[-97.376139,-77.371411],[-97.397559,-77.407495],[-97.480274,-77.405139],[-97.491148,-77.423178],[-97.325453,-77.42787],[-97.336123,-77.445916],[-97.253111,-77.448226],[-97.263693,-77.466276],[-96.680937,-77.481738],[-96.671187,-77.463665],[-96.58794,-77.465766],[-96.59757,-77.483841],[-96.514174,-77.485919],[-96.552494,-77.558236],[-96.384656,-77.562336],[-96.441516,-77.670857],[-96.526184,-77.668801],[-96.535882,-77.686886],[-96.620645,-77.6848],[-96.640377,-77.720964],[-96.725358,-77.718845],[-96.765675,-77.791162],[-96.851127,-77.789004],[-96.861407,-77.80708],[-96.946954,-77.804891],[-96.967859,-77.841038],[-97.139363,-77.836566],[-97.193451,-77.926901],[-97.27979,-77.924608],[-97.313022,-77.9788],[-97.399713,-77.976468],[-97.410987,-77.994529],[-97.497773,-77.992166],[-97.520682,-78.02828],[-97.607693,-78.025883],[-97.64271,-78.080044],[-97.555308,-78.082453],[-97.566921,-78.10051],[-97.391749,-78.105253],[-97.403134,-78.123318],[-97.315364,-78.125651],[-97.326651,-78.14372],[-97.238713,-78.14603],[-97.272383,-78.200248],[-97.184011,-78.20254],[-97.19517,-78.220617],[-97.018054,-78.225125],[-97.028977,-78.243209],[-96.940233,-78.245425],[-96.961909,-78.2816],[-96.872859,-78.283794],[-96.883611,-78.301886],[-96.794392,-78.304055],[-96.80504,-78.32215],[-96.536773,-78.328501],[-96.547041,-78.346606],[-96.457416,-78.34867],[-96.467577,-78.366779],[-96.377781,-78.368817],[-96.387836,-78.386929],[-96.297869,-78.388943],[-96.327803,-78.44329],[-96.146934,-78.447251],[-96.156692,-78.465373],[-96.06607,-78.467314],[-96.075717,-78.48544],[-95.803243,-78.491098],[-95.812493,-78.509234],[-95.721466,-78.511065],[-95.748962,-78.565482],[-95.474413,-78.57083],[-95.465652,-78.552682],[-95.191285,-78.557761],[-95.207964,-78.594073],[-95.024337,-78.597325],[-95.032424,-78.615487],[-94.940425,-78.617072],[-94.988611,-78.726066],[-94.895698,-78.727637],[-94.911669,-78.763976],[-95.004882,-78.7624],[-95.013057,-78.780567],[-95.106394,-78.778959],[-95.114747,-78.797124],[-95.301642,-78.793813],[-95.310325,-78.811973],[-95.403881,-78.81027],[-95.412744,-78.828427],[-95.506423,-78.826692],[-95.515467,-78.844846],[-95.609268,-78.843079],[-95.637038,-78.897535],[-95.542778,-78.899312],[-95.551942,-78.917468],[-95.457498,-78.919218],[-95.466538,-78.937377],[-95.37191,-78.9391],[-95.380824,-78.957262],[-95.475607,-78.955536],[-95.484707,-78.973695],[-95.579615,-78.971937],[-95.588901,-78.990093],[-95.683935,-78.988302],[-95.693408,-79.006456],[-95.598218,-79.00825],[-95.616944,-79.044565],[-95.425842,-79.048076],[-95.453215,-79.102568],[-95.357141,-79.104287],[-95.366167,-79.122454],[-95.269903,-79.124145],[-95.323729,-79.233172],[-95.420964,-79.231464],[-95.430206,-79.249633],[-95.332806,-79.251344],[-95.341915,-79.269517],[-95.244321,-79.271201],[-95.253295,-79.289376],[-95.155505,-79.291032],[-95.191045,-79.363748],[-95.092557,-79.365384],[-95.101351,-79.383566],[-94.903948,-79.38675],[-94.912434,-79.404938],[-94.81352,-79.406486],[-94.847075,-79.479253],[-94.747448,-79.48078],[-94.772403,-79.535367],[-94.672229,-79.53687],[-94.680431,-79.555069],[-94.379215,-79.559395],[-94.386921,-79.577602],[-94.185623,-79.580332],[-94.193003,-79.598544],[-94.092139,-79.599863],[-94.099369,-79.618077],[-93.998302,-79.619367],[-94.005379,-79.637584],[-93.90411,-79.638844],[-93.924956,-79.693505],[-93.823125,-79.694739],[-93.843651,-79.749409],[-93.946026,-79.748169],[-93.967323,-79.802836],[-93.864399,-79.804083],[-93.892414,-79.876987],[-93.788723,-79.87821],[-93.816393,-79.951128],[-93.711924,-79.952328],[-93.718714,-79.97056],[-93.61403,-79.971729],[-93.620655,-79.989964],[-93.515756,-79.991101],[-93.522213,-80.009338],[-93.417099,-80.010444],[-93.429699,-80.046925],[-93.324176,-80.048001],[-93.336481,-80.084487],[-93.230546,-80.085534],[-93.224577,-80.067288],[-93.118814,-80.0683],[-93.113062,-80.050053],[-93.007473,-80.051029],[-93.001935,-80.032781],[-92.896519,-80.033721],[-92.891195,-80.015471],[-92.785952,-80.016376],[-92.78084,-79.998126],[-92.570685,-79.999832],[-92.565975,-79.981578],[-92.461064,-79.982379],[-92.456562,-79.964125],[-92.351826,-79.964891],[-92.347532,-79.946636],[-92.138393,-79.948066],[-92.134495,-79.929808],[-92.030095,-79.930472],[-92.026401,-79.912214],[-91.922176,-79.912843],[-91.918685,-79.894584],[-91.814637,-79.895179],[-91.811346,-79.876919],[-91.707475,-79.87748],[-91.704384,-79.85922],[-91.808067,-79.85866],[-91.801545,-79.822143],[-91.698235,-79.822701],[-91.695178,-79.804442],[-91.488897,-79.805457],[-91.465152,-79.641131],[-91.36364,-79.641582],[-91.361228,-79.623325],[-91.259887,-79.623743],[-91.257663,-79.605486],[-91.055316,-79.606223],[-91.053456,-79.587965],[-90.447349,-79.5894],[-90.445777,-79.55288],[-90.546451,-79.552722],[-90.545492,-79.534464],[-90.444995,-79.534621],[-90.442666,-79.479848],[-90.342693,-79.479973],[-90.341501,-79.443459],[-90.241873,-79.443552],[-90.240618,-79.388785],[-90.141505,-79.388846],[-90.141261,-79.370591],[-90.042319,-79.37062],[-90.042173,-79.334112],[-90.140775,-79.334083],[-90.140292,-79.297577],[-90.042029,-79.297606],[-90.041814,-79.24285],[-89.846293,-79.242815],[-89.846555,-79.224564],[-89.748962,-79.2245],[-89.749389,-79.20625],[-89.651963,-79.206154],[-89.652554,-79.187905],[-89.555296,-79.187779],[-89.55605,-79.16953],[-89.458959,-79.169374],[-89.460787,-79.132879],[-89.364027,-79.132691],[-89.365099,-79.114445],[-89.268506,-79.114228],[-89.269737,-79.095982],[-89.173311,-79.095734],[-89.1747,-79.07749],[-88.982186,-79.076903],[-88.983893,-79.05866],[-89.272187,-79.059493],[-89.273406,-79.041249],[-89.465302,-79.04165],[-89.466196,-79.023406],[-89.561988,-79.023561],[-89.562719,-79.005317],[-89.75399,-79.005535],[-89.754809,-78.969048],[-89.850129,-78.969111],[-89.850378,-78.950868],[-89.94554,-78.950901],[-89.94563,-78.932659],[-90.040635,-78.932661],[-90.040568,-78.914419],[-90.230262,-78.914333],[-90.229502,-78.877852],[-90.324034,-78.877764],[-90.32191,-78.804808],[-90.41582,-78.804691],[-90.414462,-78.768217],[-90.508064,-78.76807],[-90.506409,-78.731598],[-90.599703,-78.731422],[-90.598728,-78.713188],[-90.691868,-78.712982],[-90.689626,-78.676516],[-90.78246,-78.676281],[-90.781194,-78.658049],[-90.873874,-78.657786],[-90.872462,-78.639554],[-91.150024,-78.638589],[-91.14817,-78.62036],[-91.24053,-78.61998],[-91.238533,-78.601752],[-91.330738,-78.601343],[-91.324343,-78.546665],[-91.507847,-78.545764],[-91.505436,-78.52754],[-91.59703,-78.527046],[-91.591939,-78.490602],[-91.683233,-78.490081],[-91.680555,-78.471861],[-91.771695,-78.471312],[-91.76888,-78.453093],[-91.859867,-78.452516],[-91.856918,-78.434298],[-91.947751,-78.433693],[-91.944667,-78.415477],[-92.035347,-78.414844],[-92.025726,-78.360203],[-92.115968,-78.359544],[-92.106013,-78.30491],[-92.016194,-78.305566],[-92.013037,-78.287355],[-91.833652,-78.288578],[-91.830785,-78.270365],[-91.651645,-78.271472],[-91.643932,-78.216832],[-91.554767,-78.217341],[-91.552351,-78.199128],[-91.463317,-78.199607],[-91.458782,-78.163181],[-91.370017,-78.163631],[-91.365784,-78.127206],[-91.188783,-78.128018],[-91.181481,-78.05517],[-91.093515,-78.055531],[-91.090167,-78.019109],[-90.914759,-78.019746],[-90.91336,-78.001535],[-90.825784,-78.001812],[-90.824523,-77.983601],[-90.737076,-77.983849],[-90.735953,-77.965638],[-90.823267,-77.96539],[-90.822014,-77.94718],[-90.909191,-77.946905],[-90.90781,-77.928697],[-90.820765,-77.928971],[-90.81952,-77.910763],[-90.732603,-77.911009],[-90.727088,-77.819973],[-90.81335,-77.819728],[-90.812128,-77.801523],[-91.070502,-77.800626],[-91.062516,-77.709615],[-91.14799,-77.709264],[-91.14118,-77.636469],[-91.480993,-77.634803],[-91.4788,-77.616608],[-91.90279,-77.613923],[-91.899978,-77.595733],[-91.984627,-77.595116],[-91.972963,-77.522365],[-92.141243,-77.521058],[-92.138102,-77.502874],[-92.390081,-77.500717],[-92.386581,-77.482537],[-92.470431,-77.481766],[-92.466819,-77.463587],[-92.383091,-77.464357],[-92.369233,-77.391642],[-92.285981,-77.392381],[-92.282662,-77.374202],[-92.199521,-77.374914],[-92.193152,-77.338557],[-92.276054,-77.337847],[-92.269483,-77.301495],[-92.352136,-77.300761],[-92.335283,-77.209895],[-92.08907,-77.212001],[-92.092069,-77.230176],[-91.434206,-77.234653],[-91.426015,-77.16193],[-91.180618,-77.16317],[-91.178934,-77.144989],[-91.015545,-77.145686],[-91.008355,-77.054784],[-91.089474,-77.054451],[-91.086397,-77.018096],[-91.167283,-77.017738],[-91.165637,-76.999562],[-91.327166,-76.998771],[-91.325297,-76.980597],[-91.647835,-76.97871],[-91.640906,-76.924199],[-91.721186,-76.923666],[-91.716375,-76.887329],[-91.796424,-76.886772],[-91.793917,-76.868605],[-91.873848,-76.868024],[-91.863446,-76.795367],[-91.783959,-76.795946],[-91.779021,-76.759619],[-91.699746,-76.760171],[-91.697397,-76.742008],[-91.539047,-76.743034],[-91.536922,-76.72487],[-91.062397,-76.727343],[-91.060932,-76.709176],[-90.823937,-76.710073],[-90.822803,-76.691906],[-90.743907,-76.692154],[-90.742884,-76.673987],[-90.664093,-76.67421],[-90.662272,-76.637877],[-90.583695,-76.638075],[-90.582098,-76.601744],[-90.503734,-76.601916],[-90.50236,-76.565588],[-90.424208,-76.565734],[-90.42363,-76.547571],[-90.345583,-76.547693],[-90.345113,-76.52953],[-90.111283,-76.529747],[-90.111131,-76.511584],[-90.033293,-76.511607],[-90.033248,-76.493445],[-89.955514,-76.493443],[-89.955575,-76.475282],[-89.877947,-76.475255],[-89.878112,-76.457095],[-89.80059,-76.457044],[-89.800859,-76.438884],[-89.723443,-76.438808],[-89.723816,-76.420649],[-89.569195,-76.420425],[-89.569775,-76.402267],[-89.492571,-76.402118],[-89.493254,-76.383961],[-89.416155,-76.383788],[-89.41694,-76.365631],[-89.339947,-76.365434],[-89.340833,-76.347279],[-89.263946,-76.347058],[-89.264932,-76.328903],[-89.111372,-76.328389],[-89.112561,-76.310235],[-89.035889,-76.309942],[-89.037177,-76.29179],[-88.960611,-76.291473],[-88.961998,-76.273321],[-88.885537,-76.272981],[-88.887022,-76.254831],[-88.810667,-76.254466],[-88.81225,-76.236317],[-88.736001,-76.235929],[-88.737681,-76.217781],[-88.585399,-76.216933],[-88.587276,-76.198787],[-88.511244,-76.198328],[-88.513217,-76.180183],[-88.43729,-76.1797],[-88.439359,-76.161557],[-88.363537,-76.161051],[-88.365701,-76.142909],[-88.214276,-76.141826],[-88.216633,-76.123686],[-88.14103,-76.123109],[-88.143481,-76.104971],[-88.067983,-76.104371],[-88.070527,-76.086234],[-87.995135,-76.085611],[-87.997771,-76.067476],[-87.922485,-76.06683],[-87.925213,-76.048696],[-87.774861,-76.047334],[-87.777778,-76.029203],[-87.627653,-76.027748],[-87.633856,-75.991491],[-87.559001,-75.99073],[-87.562188,-75.972604],[-87.487439,-75.97182],[-87.490715,-75.953695],[-87.341438,-75.95206],[-87.344899,-75.933938],[-87.27037,-75.933086],[-87.273919,-75.914965],[-87.199496,-75.914091],[-87.203132,-75.895972],[-87.128815,-75.895075],[-87.132537,-75.876959],[-87.058326,-75.87604],[-87.062135,-75.857925],[-86.988029,-75.856983],[-86.999681,-75.802647],[-86.925871,-75.801686],[-86.945563,-75.711143],[-86.872234,-75.710165],[-86.884208,-75.655851],[-86.957257,-75.656825],[-86.961136,-75.63872],[-87.034102,-75.63967],[-87.037878,-75.621564],[-86.965004,-75.620616],[-86.98038,-75.548205],[-87.052886,-75.549149],[-87.075115,-75.440545],[-87.003154,-75.439609],[-87.021872,-75.349129],[-86.950368,-75.348177],[-86.965529,-75.27581],[-86.894389,-75.274839],[-86.905925,-75.220574],[-86.835058,-75.219586],[-86.850654,-75.147247],[-86.780144,-75.14624],[-86.788057,-75.110077],[-86.717729,-75.109052],[-86.737771,-75.018662],[-86.667881,-75.01762],[-86.671945,-74.999545],[-86.602149,-74.998483],[-86.622742,-74.908126]]]},"bbox":[-104.012128,-80.085534,-86.553377,-73.714183]}],"bbox":[-104.012128,-80.085534,-86.553377,-73.714183]}' + assert obs == exp diff --git a/icepyx/tests/test_validate_inputs.py b/icepyx/tests/test_validate_inputs.py index 2790dd69c..f8615906e 100644 --- a/icepyx/tests/test_validate_inputs.py +++ b/icepyx/tests/test_validate_inputs.py @@ -36,126 +36,6 @@ def test_old_version(): with pytest.warns(UserWarning, match=wrng): val.prod_version("003", "001") - -########## spatial ########## -def test_intlist_bbox(): - obs = val.spatial([-64, 66, -55, 72]) - expected = ["bounding_box", [-64, 66, -55, 72], None] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_floatlist_bbox(): - obs = val.spatial([-64.2, 66.2, -55.5, 72.5]) - expected = ["bounding_box", [-64.2, 66.2, -55.5, 72.5], None] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_numpyfloatarray_bbox(): - obs = val.spatial(np.array([-64.2, 66.2, -55.5, 72.5])) - expected = ["bounding_box", [-64.2, 66.2, -55.5, 72.5], None] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_numpyfloatlist_bbox(): - obs = val.spatial(list(np.array([-64.2, 66.2, -55.5, 72.5]))) - expected = ["bounding_box", [-64.2, 66.2, -55.5, 72.5], None] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_list_latlon_pairs(): - out = val.spatial([[-55, 68], [-55, 71], [-48, 71], [-48, 68], [-55, 68]]) - obs = [ - out[0], - out[1].exterior.coords.xy[0].tolist(), - out[1].exterior.coords.xy[1].tolist(), - out[2], - ] - # expected = ['polygon', [-55.0, 68.0, -55.0, 71.0, -48.0, 71.0, -48.0, 68.0, -55.0, 68.0], None] - # expected = ['polygon', [[-55.0, 68.0], [-55.0, 71.0], [-48.0, 71.0], [-48.0, 68.0], [-55.0, 68.0]], None] - expected = [ - "polygon", - [-55.0, -55.0, -48.0, -48.0, -55.0], - [68.0, 71.0, 71.0, 68.0, 68.0], - None, - ] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_tuple_latlon_pairs(): - out = val.spatial([(-55, 68), (-55, 71), (-48, 71), (-48, 68), (-55, 68)]) - obs = [ - out[0], - out[1].exterior.coords.xy[0].tolist(), - out[1].exterior.coords.xy[1].tolist(), - out[2], - ] - expected = [ - "polygon", - [-55.0, -55.0, -48.0, -48.0, -55.0], - [68.0, 71.0, 71.0, 68.0, 68.0], - None, - ] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_intlist_latlon_coords(): - out = val.spatial([-55, 68, -55, 71, -48, 71, -48, 68, -55, 68]) - obs = [ - out[0], - out[1].exterior.coords.xy[0].tolist(), - out[1].exterior.coords.xy[1].tolist(), - out[2], - ] - expected = [ - "polygon", - [-55.0, -55.0, -48.0, -48.0, -55.0], - [68.0, 71.0, 71.0, 68.0, 68.0], - None, - ] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_floatlist_latlon_coords(): - out = val.spatial([-55.0, 68.7, -55.0, 71, -48, 71, -48, 68.7, -55.0, 68.7]) - obs = [ - out[0], - out[1].exterior.coords.xy[0].tolist(), - out[1].exterior.coords.xy[1].tolist(), - out[2], - ] - expected = [ - "polygon", - [-55.0, -55.0, -48.0, -48.0, -55.0], - [68.7, 71.0, 71.0, 68.7, 68.7], - None, - ] - for i in range(len(expected)): - assert obs[i] == expected[i] - - -def test_spat_input_type(): - ermsg = "Your spatial extent does not meet minimum input criteria" - with pytest.raises(ValueError, match=ermsg): - val.spatial([-64, 66, (-55, 72), 72]) - - -def test_poly_spat_file_input(): - ermsg = "Check that the path and filename of your geometry file are correct" - with pytest.raises(AssertionError, match=ermsg): - val.spatial("file_path/name/invalid_type.txt") - - -# should there be additional tests on the valid file type if-else? If so, is this were we'd use a mock to assume -# a valid (existing) file has been passed? Otherwise we'll never get passed the assert statement... - - ########## temporal ########## def test_date_range_order(): ermsg = "Your date range is invalid" diff --git a/readthedocs.yml b/readthedocs.yml index a36602990..503321bde 100644 --- a/readthedocs.yml +++ b/readthedocs.yml @@ -7,9 +7,9 @@ version: 2 # Set the version of Python and other tools you might need build: - os: ubuntu-20.04 + os: ubuntu-22.04 tools: - python: "3.9" + python: "3.10" # Build documentation in the docs/ directory with Sphinx sphinx: diff --git a/setup.py b/setup.py index 5873d9474..f41b565c4 100644 --- a/setup.py +++ b/setup.py @@ -26,12 +26,21 @@ packages=setuptools.find_packages(exclude=["*tests"]), install_requires=INSTALL_REQUIRES, extras_require=EXTRAS_REQUIRE, - python_requires=">=3, <3.10", + python_requires=">=3", classifiers=[ - "Programming Language :: Python :: 3", + "Development Status :: 4 - Beta", + "Intended Audience :: Science/Research", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", - "Development Status :: 1 - Planning", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Topic :: Scientific/Engineering", + "Topic :: Scientific/Engineering :: GIS", + "Topic :: Software Development :: Libraries", ], py_modules=["_icepyx_version"], use_scm_version={