{"id":22569139,"url":"https://github.com/dhimmel/openskistats","last_synced_at":"2025-07-21T19:35:25.850Z","repository":{"id":262658707,"uuid":"763593654","full_name":"dhimmel/openskistats","owner":"dhimmel","description":"The study of skiing where we shred open data like pow. Quantifying alpine ski areas with geospatial metrics derived from OpenStreetMap.","archived":false,"fork":false,"pushed_at":"2025-03-29T11:00:25.000Z","size":268885,"stargazers_count":12,"open_issues_count":7,"forks_count":3,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-05T17:38:53.105Z","etag":null,"topics":["data-science","data-visualization","downhill","elevation","geospatial","gis","mapping","open-data","openskimap","openstreetmap","orientation","python","quarto","ski-areas","skiing","slope","snowpack","solar-irradiance","sunlight","topography"],"latest_commit_sha":null,"homepage":"http://openskistats.org/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dhimmel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-02-26T15:29:17.000Z","updated_at":"2025-03-22T21:44:27.000Z","dependencies_parsed_at":"2024-12-18T21:21:48.753Z","dependency_job_id":"aef89404-a555-4417-9f0a-1ced92b9b6de","html_url":"https://github.com/dhimmel/openskistats","commit_stats":null,"previous_names":["dhimmel/ski-bearing-stats","dhimmel/openskistats"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhimmel%2Fopenskistats","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhimmel%2Fopenskistats/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhimmel%2Fopenskistats/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dhimmel%2Fopenskistats/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dhimmel","download_url":"https://codeload.github.com/dhimmel/openskistats/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248217150,"owners_count":21066633,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-science","data-visualization","downhill","elevation","geospatial","gis","mapping","open-data","openskimap","openstreetmap","orientation","python","quarto","ski-areas","skiing","slope","snowpack","solar-irradiance","sunlight","topography"],"created_at":"2024-12-08T00:18:23.276Z","updated_at":"2025-04-10T12:36:26.596Z","avatar_url":"https://github.com/dhimmel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenSkiStats: Shredding Data Like Powder\n\n[![GitHub Actions CI Tests Status](https://img.shields.io/github/actions/workflow/status/dhimmel/openskistats/tests.yaml?branch=main\u0026label=actions\u0026style=for-the-badge\u0026logo=github\u0026logoColor=white)](https://github.com/dhimmel/openskistats/actions/workflows/tests.yaml)\n\n\u003e [!IMPORTANT]\n\u003e This project is currently under heavy development.\n\u003e Methods and results are still preliminary and subject to change.\n\nThis project generates statistics on downhill ski slopes and areas from around the globe powered by the underlying OpenSkiMap/OpenStreetMap data.\nThe first application is the creation of roses showing the compass orientations of ski areas.\n\n## Development\n\nThe [`analyze` workflow](.github/workflows/analyze.yaml) performs a complete installation of dependencies on Linux and runs the analysis.\nIt serves as the reference for installing dependencies and executing the analysis, as well as the sole deployment route.\nFor convenience, we provide some local development instructions below.\n\n### Installation\n\nInstallation and execution requires several system dependencies,\nwhose installation and presence varies by platform.\nThe following commands are one method of installation on macOS:\n\n```shell\nbrew install imagemagick@6\n\n# install the fallback font if you don't have it\n# otherwise uv run openskistats visualize will warn:\n# WARNING:matplotlib.font_manager:findfont: Font family 'Noto Sans CJK JP' not found.\nbrew install --cask font-noto-sans-cjk\n```\n\nFor initial Python setup, first [install uv](https://docs.astral.sh/uv/getting-started/installation/).\nThen run the following commands:\n\n```shell\n# install the uv environment in uv.lock\nuv sync --extra=dev\n\n# install the pre-commit git hooks\npre-commit install\n```\n\n[Install quarto](https://quarto.org/docs/get-started/) and extensions:\n\n```shell\n# install quarto story extension\n(cd website/story \u0026\u0026 quarto add --no-prompt https://github.com/qmd-lab/closeread/archive/e3645070dd668004056ae508d2d25d05baca5ad1.zip)\n```\n\nInstall [R](https://cran.r-project.org/) and the `renv` environment:\n\n```shell\n# Check that R is installed by running:\nR --version\n\n# Install the R environment by restoring the project's dependencies in the `renv.lock` file:\nRscript -e \"setwd('r'); renv::restore()\"\n```\n\n### Execution\n\nFor commands that require access to the python environment,\nwhich includes those beginning with `openskistats` and `quarto`,\nyou can activate the `uv` environment any of the following ways:\n\n- configure your IDE to activate the venv automatically, e.g. via \"Python: Select Interpreter\" [in](https://code.visualstudio.com/docs/python/environments) Visual Studio Code.\n- prefix the command with `uv run`, e.g. `uv run openskistats --help`\n- [activate](https://docs.astral.sh/uv/pip/environments/#using-a-virtual-environment) the venv like `source .venv/bin/activate`\n\nTo execute the Python analysis, run the following commands:\n\n```shell\n# download latest OpenSkiMap data\n# run infrequently as we want to minimize stress on the OpenSkiMap servers\n# downloads persist locally\nopenskistats download\n\n# extract ski area metadata and metrics\nopenskistats analyze\n\nopenskistats visualize\n\n# run python test suite\npytest\n\n# run the full pre-commit suite\npre-commit run --all\n```\n\nTo execute the R analysis, run the following command:\n\n```shell\ncd r\nRscript 01.data.R\nRscript 02.plot.R\n```\n\nTo render the website, use either:\n\n```shell\n# using quarto preview to render and serve\nquarto preview website\n\n# render and serve to \u003chttp://localhost:8000\u003e manually \nquarto render website\npython -m http.server --directory=data/webapp\n```\n\n## References\n\nList of related webpages not yet mentioned in the manuscript:\n\n- https://avalanche.org/avalanche-encyclopedia/terrain/slope-characteristics/aspect/\n- https://www.onxmaps.com/backcountry/app/features/slope-aspect-map\n- https://en.wikipedia.org/wiki/Aspect_(geography)\n- https://gisgeography.com/aspect-map/\n- https://www.nsaa.org/NSAA/Media/Industry_Stats.aspx\n- https://www.skitalk.com/threads/comparing-latitude-and-elevation-at-western-us-resorts.9980/\n- https://gitlab.com/hugfr/european-ski-resorts-snow-reliability and https://zenodo.org/records/8047168\n- https://mapsynergy.com/ and https://mapsynergy.maps.arcgis.com/apps/dashboards/44d9c8422f3c4cc898642d75392337db\n- https://snowbrains.com/inconsistencies-in-classification-of-ski-slope-difficulty-ratings/\n- https://steepseeker.com/\n- https://bestsnow.net/\n- https://www.zrankings.com/\n\n## Publicity \u0026 Users\n\n- [2025-01-04 Closeread Prize Submission: Which way do you ski?](https://forum.posit.co/t/which-way-do-you-ski-closeread-prize/196451)\n- [2025-01-12 Reddit r/skiing](https://www.reddit.com/r/skiing/comments/1i03r3c/which_way_do_you_ski_introducing_openskistats/)\n- [2025-01-12 Reddit r/dataisbeautiful](https://www.reddit.com/r/dataisbeautiful/comments/1i0fmb2/oc_which_way_do_you_ski_orientations_metrics_for/)\n- [2025-01-15 Maps Mania Blog Post](https://googlemapsmania.blogspot.com/2025/01/global-ski-slope-orientations.html)\n- [2025-01-24 AnyChart DataViz Weekly](https://www.anychart.com/blog/2025/01/24/compeling-fresh-data-visualizations/)\n- [Italian Ski Forums](https://www.skiforum.it/board/index.php?threads/104961/post-2665811)\n\n## Wild Ideas\n\n- Table of all OpenStreetMap users that have contributed to ski areas, i.e. top skiers\n- Max slope v difficulty by region\n- fix matplotlib super title spacing\n\n## Upstream issue tracking\n\n- [openskimap.org/issues/82](https://github.com/russellporter/openskimap.org/issues/82): Add slope aspect information\n- [openskimap.org/issues/135](https://github.com/russellporter/openskimap.org/issues/135): ski_areas.geojson location information is missing\n- [openskimap.org/issues/137](https://github.com/russellporter/openskimap.org/issues/137): Restrict coordinate precision to prevent floating-point rounding errors\n- [openskimap.org/issues/141](https://github.com/russellporter/openskimap.org/issues/141): Extreme negative elevation values in some run coordinates\n- [openskimap.org/issues/143](https://github.com/russellporter/openskimap.org/issues/143) Data downloads block access from GitHub Issues\n- [photon/issues/838](https://github.com/komoot/photon/issues/838) and [openskimap.org/issues/139](https://github.com/russellporter/openskimap.org/issues/139): Black Mountain of New Hampshire USA is missing location region metadata\n- [osmnx/issues/1137](https://github.com/gboeing/osmnx/issues/1137) and [osmnx/pull/1139](https://github.com/gboeing/osmnx/pull/1139): Support directed bearing/orientation distributions and plots\n- [osmnx/issues/1143](https://github.com/gboeing/osmnx/issues/1143) and [osmnx/pull/1147](https://github.com/gboeing/osmnx/pull/1147): _bearings_distribution: defer weighting to np.histogram\n- [osmnx/pull/1149](https://github.com/gboeing/osmnx/pull/1149): _bearings_distribution: bin_centers terminology\n- [patito/issues/103](https://github.com/JakobGM/patito/issues/103): Validation fails on an empty list\n- [patito/issues/104](https://github.com/JakobGM/patito/issues/104): Optional list field with nested model fails to validate\n- [polars/issues/19771](https://github.com/pola-rs/polars/issues/19771): A no-op filter errors when the dataframe has an all null column\n- [polars/issues/15322](https://github.com/pola-rs/polars/issues/15322#issuecomment-2570076975): skip_nulls does not work in map_elements\n- [reactable-py/issues/25](https://github.com/machow/reactable-py/issues/25): Column default sort order does not override global default\n- [reactable-py/issues/28](https://github.com/machow/reactable-py/issues/28): Column class_ argument only sets the dev class for the first row\n- [reactable-py/issues/29](https://github.com/machow/reactable-py/issues/29): Should great_tables be a dependency (currently dev dependency)\n- [reactable-py/issues/38](https://github.com/machow/reactable-py/issues/38): How to call custom javascript after the table is loaded?\n- [quarto-cli/issues/11656](https://github.com/quarto-dev/quarto-cli/issues/11656): YAML bibliographies should accept list format, currently requires a dictionary with references\n- [pandoc/issues/10452](https://github.com/jgm/pandoc/issues/10452): YAML bibliographies require an object with references and do not accept arrays\n- [quarto-cli/discussions/11668](https://github.com/quarto-dev/quarto-cli/discussions/11668): markdown visual editor sentence wrap in figure captions\n\n## License\n\nThe code in this repository is released under a [BSD-2-Clause Plus Patent License](LICENSE.md).\n\nThis project is built on data from [OpenSkiMap](https://openskimap.org/), which is based on [OpenStreetMap](https://www.openstreetmap.org/).\nOpenStreetMap and OpenSkiMap data are released under the [Open Data Commons Open Database License](https://opendatacommons.org/licenses/odbl/).\nLearn more at \u003chttps://www.openstreetmap.org/copyright\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhimmel%2Fopenskistats","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdhimmel%2Fopenskistats","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdhimmel%2Fopenskistats/lists"}