windkit 1.0.2__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {windkit-1.0.2 → windkit-2.0.1}/CHANGELOG.md +57 -2
  2. windkit-2.0.1/PKG-INFO +137 -0
  3. windkit-2.0.1/README.md +66 -0
  4. windkit-2.0.1/pyproject.toml +113 -0
  5. windkit-2.0.1/setup.cfg +4 -0
  6. {windkit-1.0.2 → windkit-2.0.1}/windkit/__init__.py +18 -3
  7. {windkit-1.0.2 → windkit-2.0.1}/windkit/_version.py +16 -3
  8. windkit-2.0.1/windkit/integrations/_earth_engine.py +337 -0
  9. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/__init__.py +1 -1
  10. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/_colormaps.py +17 -16
  11. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/elevation_map.py +2 -10
  12. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/landcover_map.py +5 -13
  13. windkit-2.0.1/windkit/plot/time_series.py +254 -0
  14. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/__init__.py +1 -0
  15. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_bbox.py +1 -5
  16. windkit-2.0.1/windkit/spatial/_conversions.py +42 -0
  17. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_interpolation.py +27 -27
  18. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_point.py +25 -30
  19. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_struct.py +27 -0
  20. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/spatial.py +1 -1
  21. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversions.py +13 -7
  22. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/vector_map.py +6 -2
  23. windkit-2.0.1/windkit/tutorial_data.py +276 -0
  24. {windkit-1.0.2 → windkit-2.0.1}/windkit/weibull.py +30 -15
  25. windkit-2.0.1/windkit/wind.py +968 -0
  26. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/binned_wind_climate.py +20 -6
  27. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/generalized_wind_climate.py +0 -149
  28. windkit-2.0.1/windkit/wind_climate/geostrophic_wind_climate.py +178 -0
  29. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/time_series_wind_climate.py +22 -0
  30. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/wind_climate.py +48 -4
  31. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_data.py +2 -2
  32. windkit-2.0.1/windkit/wind_farm/power_curve.py +124 -0
  33. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/uncertainty.py +4 -2
  34. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/wind_turbine_generator.py +41 -0
  35. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/wind_turbines.py +143 -0
  36. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/metadata.py +13 -7
  37. {windkit-1.0.2 → windkit-2.0.1}/windkit.egg-info/SOURCES.txt +3 -1
  38. windkit-1.0.2/PKG-INFO +0 -93
  39. windkit-1.0.2/README.md +0 -45
  40. windkit-1.0.2/pyproject.toml +0 -14
  41. windkit-1.0.2/setup.cfg +0 -65
  42. windkit-1.0.2/windkit/integrations/_earth_engine.py +0 -241
  43. windkit-1.0.2/windkit/tutorial_data.py +0 -185
  44. windkit-1.0.2/windkit/wind.py +0 -469
  45. windkit-1.0.2/windkit/wind_climate/geostrophic_wind_climate.py +0 -75
  46. {windkit-1.0.2 → windkit-2.0.1}/LICENSE +0 -0
  47. {windkit-1.0.2 → windkit-2.0.1}/windkit/_errors.py +0 -0
  48. {windkit-1.0.2 → windkit-2.0.1}/windkit/_rvea_xml.py +0 -0
  49. {windkit-1.0.2 → windkit-2.0.1}/windkit/_weibull_nb.py +0 -0
  50. {windkit-1.0.2 → windkit-2.0.1}/windkit/cfd.py +0 -0
  51. {windkit-1.0.2 → windkit-2.0.1}/windkit/config.py +0 -0
  52. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/all_vars.json +0 -0
  53. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/color_table_roughness.json +0 -0
  54. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/CGLS-LC100.json +0 -0
  55. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/CORINE.json +0 -0
  56. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/ESA_CCI.json +0 -0
  57. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/GWA4_micro.json +0 -0
  58. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/Globcover.json +0 -0
  59. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/MODIS.json +0 -0
  60. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/NEWA_micro_v2.json +0 -0
  61. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/landcover_tables/WorldCover.json +0 -0
  62. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/loss_tables/dtu_loss_table.csv +0 -0
  63. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/map_file_header_to_epsg.json +0 -0
  64. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/map_file_header_to_epsg_read.json +0 -0
  65. {windkit-1.0.2 → windkit-2.0.1}/windkit/data/uncertainty_tables/dtu_uncertainty_table.csv +0 -0
  66. {windkit-1.0.2 → windkit-2.0.1}/windkit/import_manager.py +0 -0
  67. {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/__init__.py +0 -0
  68. {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/_gwa_map_api.py +0 -0
  69. {windkit-1.0.2 → windkit-2.0.1}/windkit/integrations/_planetary_computer.py +0 -0
  70. {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/__init__.py +0 -0
  71. {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/_validation.py +0 -0
  72. {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/mcp.py +0 -0
  73. {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/regression.py +0 -0
  74. {windkit-1.0.2 → windkit-2.0.1}/windkit/ltc/scores.py +0 -0
  75. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/_helpers.py +0 -0
  76. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/color.py +0 -0
  77. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/histogram.py +0 -0
  78. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/operational_curves.py +0 -0
  79. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/raster_plot.py +0 -0
  80. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/roughness_rose.py +0 -0
  81. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/vertical_profile.py +0 -0
  82. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/wind_rose.py +0 -0
  83. {windkit-1.0.2 → windkit-2.0.1}/windkit/plot/wind_turbine.py +0 -0
  84. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/README.md +0 -0
  85. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_crs.py +0 -0
  86. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_cuboid.py +0 -0
  87. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_dimensions.py +0 -0
  88. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_latitude.py +0 -0
  89. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_metpy_natural_neighbors.py +0 -0
  90. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_raster.py +0 -0
  91. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_utm.py +0 -0
  92. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_vector.py +0 -0
  93. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/_vertical.py +0 -0
  94. {windkit-1.0.2 → windkit-2.0.1}/windkit/spatial/decorators.py +0 -0
  95. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/__init__.py +0 -0
  96. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/_vectormap_gml.py +0 -0
  97. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/_vectormap_helpers.py +0 -0
  98. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/get_map.py +0 -0
  99. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/landcover.py +0 -0
  100. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/__init__.py +0 -0
  101. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/_polygons_constraints.py +0 -0
  102. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/helper_functions.py +0 -0
  103. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/lines_to_poly.py +0 -0
  104. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/map_conversion/poly_to_lines.py +0 -0
  105. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/raster_map.py +0 -0
  106. {windkit-1.0.2 → windkit-2.0.1}/windkit/topography/topography.py +0 -0
  107. {windkit-1.0.2 → windkit-2.0.1}/windkit/utils.py +0 -0
  108. {windkit-1.0.2 → windkit-2.0.1}/windkit/weng_workspace.py +0 -0
  109. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/__init__.py +0 -0
  110. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/predicted_wind_climate.py +0 -0
  111. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_climate/weibull_wind_climate.py +0 -0
  112. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/__init__.py +0 -0
  113. {windkit-1.0.2 → windkit-2.0.1}/windkit/wind_farm/loss.py +0 -0
  114. {windkit-1.0.2 → windkit-2.0.1}/windkit/workspace.py +0 -0
  115. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/_validate.py +0 -0
  116. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/data_structures.py +0 -0
  117. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/direction.py +0 -0
  118. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/empty.py +0 -0
  119. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/sector.py +0 -0
  120. {windkit-1.0.2 → windkit-2.0.1}/windkit/xarray_structures/wsbin.py +0 -0
@@ -2,7 +2,62 @@
2
2
 
3
3
  All major changes are listed here.
4
4
 
5
- ## 1.0.2 (2025-07-21)
5
+ ## [2.0.1 (2026-01-29)](https://docs.wasp.dk/windkit/v2.0.1/)
6
+
7
+ ### Highlights
8
+
9
+ #### Performance improvements
10
+ * Significantly reduced import time by lazy loading some packages and data. Should be approx 1/3 of previous import time.
11
+
12
+ #### Documentation
13
+ * Restructured user guide into focused, object-based documentation pages:
14
+ - Wind climates section with dedicated pages for TSWC, BWC, WWC, and GWC including I/O formats and usage examples
15
+ - Topography section with elevation, roughness, and landcover map documentation including format support tables
16
+ - Spatial section explaining point, stacked_point, raster, and cuboid structures with operation examples
17
+ - Wind farms section documenting wind turbine datasets and WTG objects
18
+ - New overview section with data structures, schemas, and tutorial data documentation
19
+
20
+ #### Sheer and veer functionality
21
+
22
+ * Added new function `wk.shear_extrapolate` to extrapolate wind speeds to different heights using a power law shear profile.
23
+ * Added new function `wk.shear_exponent` to calculate a shear exponent from wind speeds
24
+ * Added guidance about `wk.shear_exponent` into shear extrapolation example.
25
+
26
+ * Added new function `wk.veer_extrapolate` to extrapolate wind direction linearly to different heights, accounting for circular discontinuities.
27
+ * Added new function `wk.wind_veer` to calculate wind veer from wind direction
28
+ * Added guidance about `wk.wind_veer` into shear extrapolation example.
29
+
30
+ ### Support for PyWAsP's Geostrophic wind climate objects
31
+
32
+ * new function `create_geowc`, which creates a dummy geostrophic wind climate
33
+ * functions `mean_wind_speed`, `mean_power_density`, `ws_freq_gt_mean`, `ws_cdf` and `mean_ws_moment` are now also working when a geostrophic wind climate is passed.
34
+
35
+ ### New features
36
+ * Added new function `wk.extrapolate_to_height` to extrapolate wind climate objects to different heights. Currently, only works for time-series wind climates (TSWC).
37
+ * `wk.roughness_map_to_file` now allows to write to a old fashioned `.map` file for the special case where these is a single polygon and the external roughness length is not specified (None). For this case we assume that the external roughness length is the same as the roughness length inside the polygon.
38
+ * `wk.roughness_map_to_file` now allows users to write to a `.map` as long all displacement heights in the map are zero.
39
+ * For `wv_count` objects (thus also geostrophic wind climates) if all of the bins have nan's, the result of function `mean_wind_speed`, `mean_power_density`, `ws_freq_gt_mean` and `mean_ws_moment` operating on such a function is also nan, whereas before it would be 0.
40
+ * Added new function `wk.load_tutorial_data` to download and load tutorial data directly into memory as windkit-compatible objects (xarray.Dataset and geopandas.GeoDataFrame).
41
+ * Changed `wk.get_tutorial_data` to return a `Path` to the extracted tutorial data folder, allowing users to load files manually using windkit readers or generic loaders. The function now includes detailed docstrings describing all available files for each dataset, including .nc, .omwc, .wtg, .map, and .csv.
42
+ * Added `wk.read_wind_turbines` and `wk.wind_turbines_to_file` functions to read and write wind turbine datasets in various formats. Both only support CSV for now. The CSV should follow the windkit wind turbine format specification.
43
+
44
+
45
+ ### Bug fixes
46
+ * Fixed pixel misalignment when downloading raster maps from Google Earth Engine. Downloads now use `crs_transform` instead of `scale` to preserve exact pixel alignment with source datasets (e.g., Globcover, SRTM, WorldCover). This fixes half-pixel offsets (~150m for Globcover) and ~12-15m offsets for elevation data.
47
+ * Bugfix in `read_bwc`: it now opens `bwc` stored in netcdf correctly.
48
+ but some of this functionality was only available in pywasp, so it has been moved there.
49
+ * Fixed bug where a point dataset with several horizontal locations would be converted to a single horizontal location when using the function `to_stacked_point`
50
+ * bug fix to interpolation, which would create invalid spatial structures when a dimension was in exclude dims but not present in the target structure (e.g. when doing interpolation from `stacked_point` to `point`).
51
+
52
+
53
+ ### Changes
54
+ * Changed default value of `use_bounds` to `True` in `wk.spatial.BBox.reproject` method.
55
+
56
+ ### Breaking changes
57
+
58
+ * `spatial_interpolate_gwc` has been removed. This functionality is now only available in PyWAsP through its `interpolate_gwc` function.
59
+
60
+ ## [1.0.2 (2025-07-21)](https://docs.wasp.dk/windkit/v1.0.2/)
6
61
 
7
62
  WindKit 1.0.2 is a patch release to ensure consistent config and app data paths on windows. Both the config and app data paths are now set by default to ``C:\\Users\\<user>\\AppData\\Roaming\\DTU Wind Energy\\windkit``.
8
63
 
@@ -277,7 +332,7 @@ as required in the `stacked_point` structure.
277
332
  * Switched configuration file from ini to toml, old file will be automatically migrated
278
333
 
279
334
 
280
- ## 0.8.0 (2024-06-10)
335
+ ## [0.8.0 (2024-06-10)](https://docs.wasp.dk/windkit/v0.8.0/)
281
336
 
282
337
  ### New features
283
338
 
windkit-2.0.1/PKG-INFO ADDED
@@ -0,0 +1,137 @@
1
+ Metadata-Version: 2.4
2
+ Name: windkit
3
+ Version: 2.0.1
4
+ Summary: WindKit provides core functionalities for working with wind resource data
5
+ Author: DTU Wind Energy
6
+ License-Expression: BSD-3-Clause
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Operating System :: OS Independent
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ License-File: LICENSE
12
+ Requires-Dist: geopandas>=1.0
13
+ Requires-Dist: h5netcdf
14
+ Requires-Dist: lxml>=5.0
15
+ Requires-Dist: netcdf4>=1.6
16
+ Requires-Dist: numpy>=1.26
17
+ Requires-Dist: packaging>=23
18
+ Requires-Dist: pandas>=2.1
19
+ Requires-Dist: platformdirs>=4.3
20
+ Requires-Dist: pydantic>=2.7
21
+ Requires-Dist: pydantic-settings>=2.3
22
+ Requires-Dist: pyproj>=3.6
23
+ Requires-Dist: pyyaml
24
+ Requires-Dist: rasterio>=1.3
25
+ Requires-Dist: requests
26
+ Requires-Dist: rioxarray>=0.17
27
+ Requires-Dist: scipy>=1.12
28
+ Requires-Dist: shapely>=2.0
29
+ Requires-Dist: toml
30
+ Requires-Dist: xarray>=2023.9
31
+ Provides-Extra: plots
32
+ Requires-Dist: matplotlib>=3.8; extra == "plots"
33
+ Requires-Dist: plotly>=5.12.0; extra == "plots"
34
+ Requires-Dist: kaleido; extra == "plots"
35
+ Provides-Extra: performance
36
+ Requires-Dist: numba>=0.57.0; extra == "performance"
37
+ Provides-Extra: data-apis
38
+ Requires-Dist: adlfs; extra == "data-apis"
39
+ Requires-Dist: earthengine-api; extra == "data-apis"
40
+ Requires-Dist: fsspec; extra == "data-apis"
41
+ Requires-Dist: planetary-computer; extra == "data-apis"
42
+ Requires-Dist: pystac-client; extra == "data-apis"
43
+ Requires-Dist: zarr>2.15; extra == "data-apis"
44
+ Provides-Extra: dev
45
+ Requires-Dist: dash; extra == "dev"
46
+ Requires-Dist: ipython; extra == "dev"
47
+ Requires-Dist: nbval; extra == "dev"
48
+ Requires-Dist: pre-commit; extra == "dev"
49
+ Requires-Dist: pytest; extra == "dev"
50
+ Requires-Dist: pytest-cov; extra == "dev"
51
+ Requires-Dist: pytest-xdist; extra == "dev"
52
+ Requires-Dist: windIO; extra == "dev"
53
+ Provides-Extra: doc
54
+ Requires-Dist: docutils; extra == "doc"
55
+ Requires-Dist: jupyter; extra == "doc"
56
+ Requires-Dist: jupyter-dash; extra == "doc"
57
+ Requires-Dist: jupyter-sphinx; extra == "doc"
58
+ Requires-Dist: myst-parser; extra == "doc"
59
+ Requires-Dist: nbsphinx; extra == "doc"
60
+ Requires-Dist: nbsphinx-link; extra == "doc"
61
+ Requires-Dist: pydata-sphinx-theme; extra == "doc"
62
+ Requires-Dist: recommonmark; extra == "doc"
63
+ Requires-Dist: sphinx; extra == "doc"
64
+ Requires-Dist: sphinx-argparse; extra == "doc"
65
+ Requires-Dist: sphinx-copybutton; extra == "doc"
66
+ Requires-Dist: sphinx-design; extra == "doc"
67
+ Requires-Dist: sphinx-gallery; extra == "doc"
68
+ Requires-Dist: sphinxcontrib-bibtex; extra == "doc"
69
+ Requires-Dist: sphinxext-opengraph; extra == "doc"
70
+ Dynamic: license-file
71
+
72
+ # WindKit
73
+
74
+ [![pipeline status](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/badges/master/pipeline.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
75
+ [![coverage](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/badges/master/coverage.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
76
+ [![release](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/badges/release.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/releases)
77
+ [![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD--3--Clause-blue.svg)](LICENSE)
78
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
79
+ [![Docs](https://img.shields.io/badge/docs-docs.wasp.dk-blue?logo=readthedocs&logoColor=white)](https://docs.wasp.dk/windkit)
80
+
81
+ [![PyPI](https://img.shields.io/pypi/v/windkit)](https://pypi.org/project/windkit/)
82
+ [![Downloads-pypi](https://img.shields.io/pypi/dm/windkit)](https://pypi.org/project/windkit/)
83
+
84
+
85
+ WindKit provides core functionalities for working with wind resource data, built on top of [xarray](https://xarray.dev/) and [geopandas](https://geopandas.org/).
86
+
87
+ ## Installation
88
+
89
+ **pip:**
90
+ ```bash
91
+ pip install windkit
92
+ ```
93
+
94
+ **conda:**
95
+ ```bash
96
+ conda install -c https://conda.windenergy.dtu.dk/channel/open windkit
97
+ ```
98
+
99
+ ## Quick Start
100
+
101
+ ```python
102
+ import windkit as wk
103
+
104
+ # Read a binned wind climate
105
+ bwc = wk.read_bwc("hovsore.tab")
106
+
107
+ # Calculate mean wind speed
108
+ mean_ws = wk.mean_wind_speed(bwc)
109
+ print(f"Mean wind speed: {mean_ws.values:.2f} m/s")
110
+
111
+ # Fit Weibull distribution and convert to Weibull wind climate
112
+ wwc = wk.weibull_fit(bwc)
113
+ ```
114
+
115
+ ## Features
116
+
117
+ - **Wind Climate I/O** - Read/write binned, Weibull, generalized, and time-series wind climates (NetCDF, .lib, .tab, .rsf, .wrg)
118
+ - **Map I/O** - Read/write elevation, roughness, and landcover maps (raster and vector formats)
119
+ - **WAsP Integration** - Read WAsP Workspace files and WAsP Engineering project files
120
+ - **Spatial Processing** - Clip, reproject, and interpolate spatial data with full CRS support
121
+ - **Wind Statistics** - Calculate mean wind speed, power density, Weibull parameters, and more
122
+ - **Plotting** - Interactive plots with Plotly, static plots with Matplotlib
123
+ - **Remote Data Access** - Download ERA5 reanalysis data and satellite-derived maps
124
+
125
+ ## Documentation
126
+
127
+ Full documentation: [docs.wasp.dk/windkit](https://docs.wasp.dk/windkit)
128
+
129
+ Community forum: [WAsP Python tools](https://www.wasptechnical.dk/forum/forum/19-wasp-python-tools/)
130
+
131
+ ## Contributing
132
+
133
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
134
+
135
+ ## License
136
+
137
+ BSD-3-Clause - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,66 @@
1
+ # WindKit
2
+
3
+ [![pipeline status](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/badges/master/pipeline.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
4
+ [![coverage](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/badges/master/coverage.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/pipelines)
5
+ [![release](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/badges/release.svg)](https://gitlab-internal.windenergy.dtu.dk/ram/software/pywasp/windkit/-/releases)
6
+ [![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD--3--Clause-blue.svg)](LICENSE)
7
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
8
+ [![Docs](https://img.shields.io/badge/docs-docs.wasp.dk-blue?logo=readthedocs&logoColor=white)](https://docs.wasp.dk/windkit)
9
+
10
+ [![PyPI](https://img.shields.io/pypi/v/windkit)](https://pypi.org/project/windkit/)
11
+ [![Downloads-pypi](https://img.shields.io/pypi/dm/windkit)](https://pypi.org/project/windkit/)
12
+
13
+
14
+ WindKit provides core functionalities for working with wind resource data, built on top of [xarray](https://xarray.dev/) and [geopandas](https://geopandas.org/).
15
+
16
+ ## Installation
17
+
18
+ **pip:**
19
+ ```bash
20
+ pip install windkit
21
+ ```
22
+
23
+ **conda:**
24
+ ```bash
25
+ conda install -c https://conda.windenergy.dtu.dk/channel/open windkit
26
+ ```
27
+
28
+ ## Quick Start
29
+
30
+ ```python
31
+ import windkit as wk
32
+
33
+ # Read a binned wind climate
34
+ bwc = wk.read_bwc("hovsore.tab")
35
+
36
+ # Calculate mean wind speed
37
+ mean_ws = wk.mean_wind_speed(bwc)
38
+ print(f"Mean wind speed: {mean_ws.values:.2f} m/s")
39
+
40
+ # Fit Weibull distribution and convert to Weibull wind climate
41
+ wwc = wk.weibull_fit(bwc)
42
+ ```
43
+
44
+ ## Features
45
+
46
+ - **Wind Climate I/O** - Read/write binned, Weibull, generalized, and time-series wind climates (NetCDF, .lib, .tab, .rsf, .wrg)
47
+ - **Map I/O** - Read/write elevation, roughness, and landcover maps (raster and vector formats)
48
+ - **WAsP Integration** - Read WAsP Workspace files and WAsP Engineering project files
49
+ - **Spatial Processing** - Clip, reproject, and interpolate spatial data with full CRS support
50
+ - **Wind Statistics** - Calculate mean wind speed, power density, Weibull parameters, and more
51
+ - **Plotting** - Interactive plots with Plotly, static plots with Matplotlib
52
+ - **Remote Data Access** - Download ERA5 reanalysis data and satellite-derived maps
53
+
54
+ ## Documentation
55
+
56
+ Full documentation: [docs.wasp.dk/windkit](https://docs.wasp.dk/windkit)
57
+
58
+ Community forum: [WAsP Python tools](https://www.wasptechnical.dk/forum/forum/19-wasp-python-tools/)
59
+
60
+ ## Contributing
61
+
62
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
63
+
64
+ ## License
65
+
66
+ BSD-3-Clause - see [LICENSE](LICENSE) for details.
@@ -0,0 +1,113 @@
1
+ [build-system]
2
+ requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "windkit"
7
+ description = "WindKit provides core functionalities for working with wind resource data"
8
+ readme = "README.md"
9
+ license = "BSD-3-Clause"
10
+ authors = [
11
+ {name = "DTU Wind Energy"}
12
+ ]
13
+ classifiers = [
14
+ "Programming Language :: Python :: 3",
15
+ "Operating System :: OS Independent",
16
+ ]
17
+ dynamic = ["version"]
18
+ requires-python = ">=3.11"
19
+ dependencies = [
20
+ "geopandas>=1.0",
21
+ "h5netcdf",
22
+ "lxml>=5.0",
23
+ "netcdf4>=1.6",
24
+ "numpy>=1.26",
25
+ "packaging>=23",
26
+ "pandas>=2.1",
27
+ "platformdirs>=4.3",
28
+ "pydantic>=2.7",
29
+ "pydantic-settings>=2.3",
30
+ "pyproj>=3.6",
31
+ "pyyaml",
32
+ "rasterio>=1.3",
33
+ "requests",
34
+ "rioxarray>=0.17",
35
+ "scipy>=1.12",
36
+ "shapely>=2.0",
37
+ "toml",
38
+ "xarray>=2023.9",
39
+ ]
40
+
41
+ [project.optional-dependencies]
42
+ plots = [
43
+ "matplotlib>=3.8",
44
+ "plotly>=5.12.0",
45
+ "kaleido",
46
+ ]
47
+ performance = [
48
+ "numba>=0.57.0",
49
+ ]
50
+ data_apis = [
51
+ "adlfs",
52
+ "earthengine-api",
53
+ "fsspec",
54
+ "planetary-computer",
55
+ "pystac-client",
56
+ "zarr>2.15",
57
+ ]
58
+ dev = [
59
+ "dash",
60
+ "ipython",
61
+ "nbval",
62
+ "pre-commit",
63
+ "pytest",
64
+ "pytest-cov",
65
+ "pytest-xdist",
66
+ "windIO",
67
+ ]
68
+ doc = [
69
+ "docutils",
70
+ "jupyter",
71
+ "jupyter-dash",
72
+ "jupyter-sphinx",
73
+ "myst-parser",
74
+ "nbsphinx",
75
+ "nbsphinx-link",
76
+ "pydata-sphinx-theme",
77
+ "recommonmark",
78
+ "sphinx",
79
+ "sphinx-argparse",
80
+ "sphinx-copybutton",
81
+ "sphinx-design",
82
+ "sphinx-gallery",
83
+ "sphinxcontrib-bibtex",
84
+ "sphinxext-opengraph",
85
+ ]
86
+
87
+ [project.scripts]
88
+ split_combomap = "windkit.topography.vector_map:_split_combo"
89
+
90
+ [tool.setuptools_scm]
91
+ write_to = "windkit/_version.py"
92
+
93
+ [tool.setuptools]
94
+ include-package-data = true
95
+
96
+ [tool.setuptools.packages.find]
97
+ namespaces = true
98
+
99
+ [tool.setuptools.package-data]
100
+ "windkit.data" = ["*.json"]
101
+ "windkit.data.landcover_tables" = ["*.json"]
102
+ "windkit.data.plot" = ["*.json"]
103
+ "windkit.data.loss_tables" = ["*.csv"]
104
+ "windkit.data.uncertainty_tables" = ["*.csv"]
105
+
106
+ [tool.pytest.ini_options]
107
+ minversion = "6.0"
108
+ norecursedirs = "dist build .tox"
109
+ testpaths = ["test",]
110
+ markers = [
111
+ "slow: marks tests as slow (deselect with '-m \"not slow\"')",
112
+ "performance: marks tests as performance tests (run with '-m performance')",
113
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -20,6 +20,10 @@ __all__ = [
20
20
  "vinterp_wind_speed",
21
21
  "rotor_equivalent_wind_speed",
22
22
  "tswc_resample",
23
+ "shear_extrapolate",
24
+ "shear_exponent",
25
+ "veer_extrapolate",
26
+ "wind_veer",
23
27
  # Time Series Wind Climate
24
28
  "validate_tswc",
25
29
  "is_tswc",
@@ -50,10 +54,10 @@ __all__ = [
50
54
  "create_gwc",
51
55
  "read_gwc",
52
56
  "gwc_to_file",
53
- "spatial_interpolate_gwc",
54
57
  # Geostrophic wind climate
55
58
  "validate_geowc",
56
59
  "is_geowc",
60
+ "create_geowc",
57
61
  # Predicted Wind Climate
58
62
  "create_pwc",
59
63
  # Wind Climate
@@ -64,6 +68,7 @@ __all__ = [
64
68
  "mean_wind_speed",
65
69
  "mean_power_density",
66
70
  "get_cross_predictions",
71
+ "extrapolate_to_height",
67
72
  # Landcover
68
73
  "LandCoverTable",
69
74
  "get_landcover_table",
@@ -100,6 +105,8 @@ __all__ = [
100
105
  "create_wind_turbines_from_dataframe",
101
106
  "create_wind_turbines_from_arrays",
102
107
  "wind_turbines_to_geodataframe",
108
+ "read_wind_turbines",
109
+ "wind_turbines_to_file",
103
110
  # workspace
104
111
  "Workspace",
105
112
  # weng_workspace
@@ -137,6 +144,7 @@ __all__ = [
137
144
  "total_uncertainty_factor",
138
145
  # tutorial_data
139
146
  "get_tutorial_data",
147
+ "load_tutorial_data",
140
148
  ]
141
149
 
142
150
  from windkit._version import version as __version__
@@ -153,6 +161,10 @@ from windkit.wind import (
153
161
  vinterp_wind_speed,
154
162
  rotor_equivalent_wind_speed,
155
163
  tswc_resample,
164
+ shear_extrapolate,
165
+ shear_exponent,
166
+ veer_extrapolate,
167
+ wind_veer,
156
168
  )
157
169
  from windkit.wind_climate.time_series_wind_climate import (
158
170
  validate_tswc,
@@ -190,13 +202,13 @@ from windkit.wind_climate.generalized_wind_climate import (
190
202
  create_gwc,
191
203
  read_gwc,
192
204
  gwc_to_file,
193
- spatial_interpolate_gwc,
194
205
  _reproject_gwc,
195
206
  )
196
207
  from windkit.wind_climate import generalized_wind_climate # noqa: F401
197
208
  from windkit.wind_climate.geostrophic_wind_climate import (
198
209
  validate_geowc,
199
210
  is_geowc,
211
+ create_geowc,
200
212
  )
201
213
  from windkit.wind_climate import geostrophic_wind_climate # noqa: F401
202
214
  from windkit.wind_climate.predicted_wind_climate import create_pwc
@@ -209,6 +221,7 @@ from windkit.wind_climate.wind_climate import (
209
221
  mean_wind_speed,
210
222
  mean_power_density,
211
223
  get_cross_predictions,
224
+ extrapolate_to_height,
212
225
  )
213
226
  from windkit.cfd import read_cfdres
214
227
  from windkit.wind_farm.wind_turbine_generator import (
@@ -228,6 +241,8 @@ from windkit.wind_farm.wind_turbines import (
228
241
  create_wind_turbines_from_dataframe,
229
242
  create_wind_turbines_from_arrays,
230
243
  wind_turbines_to_geodataframe,
244
+ read_wind_turbines,
245
+ wind_turbines_to_file,
231
246
  )
232
247
  from windkit.workspace import Workspace
233
248
  from windkit.weng_workspace import WengWorkspace
@@ -291,4 +306,4 @@ from windkit.xarray_structures.direction import (
291
306
  from windkit.xarray_structures.wsbin import (
292
307
  create_wsbin_coords,
293
308
  )
294
- from windkit.tutorial_data import get_tutorial_data
309
+ from windkit.tutorial_data import get_tutorial_data, load_tutorial_data
@@ -1,7 +1,14 @@
1
1
  # file generated by setuptools-scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
4
+ __all__ = [
5
+ "__version__",
6
+ "__version_tuple__",
7
+ "version",
8
+ "version_tuple",
9
+ "__commit_id__",
10
+ "commit_id",
11
+ ]
5
12
 
6
13
  TYPE_CHECKING = False
7
14
  if TYPE_CHECKING:
@@ -9,13 +16,19 @@ if TYPE_CHECKING:
9
16
  from typing import Union
10
17
 
11
18
  VERSION_TUPLE = Tuple[Union[int, str], ...]
19
+ COMMIT_ID = Union[str, None]
12
20
  else:
13
21
  VERSION_TUPLE = object
22
+ COMMIT_ID = object
14
23
 
15
24
  version: str
16
25
  __version__: str
17
26
  __version_tuple__: VERSION_TUPLE
18
27
  version_tuple: VERSION_TUPLE
28
+ commit_id: COMMIT_ID
29
+ __commit_id__: COMMIT_ID
19
30
 
20
- __version__ = version = '1.0.2'
21
- __version_tuple__ = version_tuple = (1, 0, 2)
31
+ __version__ = version = '2.0.1'
32
+ __version_tuple__ = version_tuple = (2, 0, 1)
33
+
34
+ __commit_id__ = commit_id = None