{"id":325307,"name":"Open Wind Energy","description":"Builds and displays onshore wind turbine site constraints in a fully automated way - avoiding the need for manually downloading and processing multiple GIS datasets by hand.","url":"https://github.com/open-wind/openwindenergy","last_synced_at":"2026-04-11T04:03:22.044Z","repository":{"id":285846325,"uuid":"957905593","full_name":"open-wind/openwindenergy","owner":"open-wind","description":"The Open Wind Energy toolkit builds and displays onshore wind turbine site constraints in a fully automated way - avoiding the need for manually downloading and processing multiple GIS datasets by hand.","archived":false,"fork":false,"pushed_at":"2025-07-07T19:11:33.000Z","size":98037,"stargazers_count":4,"open_issues_count":4,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-24T14:03:55.167Z","etag":null,"topics":["netzero","renewables","wind"],"latest_commit_sha":null,"homepage":"https://openwind.energy","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/open-wind.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-31T10:38:34.000Z","updated_at":"2025-10-14T17:48:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"4e1cfd46-1749-4894-9a18-f0469dde586e","html_url":"https://github.com/open-wind/openwindenergy","commit_stats":null,"previous_names":["open-wind/openwindenergy"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/open-wind/openwindenergy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-wind","download_url":"https://codeload.github.com/open-wind/openwindenergy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31258770,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-31T18:32:52.363Z","status":"ssl_error","status_checked_at":"2026-03-31T18:32:51.507Z","response_time":111,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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"}},"owner":{"login":"open-wind","name":"Open Wind","uuid":"200953944","kind":"user","description":"","email":"","website":"https://openwind.energy","location":null,"twitter":null,"company":"openwind.energy","icon_url":"https://avatars.githubusercontent.com/u/200953944?u=c51f8e60c9f42ffddc25da917a3bcb47cd825243\u0026v=4","repositories_count":1,"last_synced_at":"2025-03-28T18:47:52.416Z","metadata":{"has_sponsors_listing":false},"html_url":"https://github.com/open-wind","funding_links":[],"total_stars":0,"followers":0,"following":0,"created_at":"2025-03-28T18:47:52.671Z","updated_at":"2025-03-28T18:47:52.671Z","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-wind","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/open-wind/repositories"},"packages":[],"commits":{"id":11343071,"full_name":"open-wind/openwindenergy","default_branch":"master","total_commits":58,"total_committers":1,"total_bot_commits":0,"total_bot_committers":0,"mean_commits":58.0,"dds":0.0,"past_year_total_commits":55,"past_year_total_committers":1,"past_year_total_bot_commits":0,"past_year_total_bot_committers":0,"past_year_mean_commits":55.0,"past_year_dds":0.0,"last_synced_at":"2026-04-07T02:05:53.312Z","last_synced_commit":"9b9f31513963f5f59dc2d447148e4759ff24b929","created_at":"2025-09-25T00:22:17.894Z","updated_at":"2026-04-07T02:05:53.205Z","committers":[{"name":"StefanHaselwimmer","email":"shaselwimmer@cantab.net","login":"StefanHaselwimmer","count":58}],"past_year_committers":[{"name":"StefanHaselwimmer","email":"shaselwimmer@cantab.net","login":"StefanHaselwimmer","count":55}],"commits_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/commits","host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-09T00:00:23.197Z","repositories_count":6212670,"commits_count":914647918,"contributors_count":35332534,"owners_count":1143345,"icon_url":"https://github.com/github.png","host_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://commits.ecosyste.ms/api/v1/hosts/GitHub/repositories"}},"issues_stats":{"full_name":"open-wind/openwindenergy","html_url":"https://github.com/open-wind/openwindenergy","last_synced_at":"2026-04-07T02:01:22.521Z","status":"error","issues_count":4,"pull_requests_count":0,"avg_time_to_close_issue":null,"avg_time_to_close_pull_request":null,"issues_closed_count":0,"pull_requests_closed_count":0,"pull_request_authors_count":0,"issue_authors_count":1,"avg_comments_per_issue":1.25,"avg_comments_per_pull_request":null,"merged_pull_requests_count":0,"bot_issues_count":0,"bot_pull_requests_count":0,"past_year_issues_count":4,"past_year_pull_requests_count":0,"past_year_avg_time_to_close_issue":null,"past_year_avg_time_to_close_pull_request":null,"past_year_issues_closed_count":0,"past_year_pull_requests_closed_count":0,"past_year_pull_request_authors_count":0,"past_year_issue_authors_count":1,"past_year_avg_comments_per_issue":1.25,"past_year_avg_comments_per_pull_request":null,"past_year_bot_issues_count":0,"past_year_bot_pull_requests_count":0,"past_year_merged_pull_requests_count":0,"created_at":"2025-08-31T01:17:43.387Z","updated_at":"2026-04-07T02:01:22.521Z","repository_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy","issues_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories/open-wind%2Fopenwindenergy/issues","issue_labels_count":{},"pull_request_labels_count":{},"issue_author_associations_count":{"NONE":4},"pull_request_author_associations_count":{},"issue_authors":{"thisistheplace":4},"pull_request_authors":{},"host":{"name":"GitHub","url":"https://github.com","kind":"github","last_synced_at":"2026-04-09T00:00:10.509Z","repositories_count":14154603,"issues_count":34526788,"pull_requests_count":112877686,"authors_count":11231093,"icon_url":"https://github.com/github.png","host_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/repositories","owners_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/owners","authors_url":"https://issues.ecosyste.ms/api/v1/hosts/GitHub/authors"},"past_year_issue_labels_count":{},"past_year_pull_request_labels_count":{},"past_year_issue_author_associations_count":{"NONE":4},"past_year_pull_request_author_associations_count":{},"past_year_issue_authors":{"thisistheplace":4},"past_year_pull_request_authors":{},"maintainers":[],"active_maintainers":[]},"events":{"total":{"ForkEvent":1,"IssuesEvent":2,"WatchEvent":1,"IssueCommentEvent":4,"PushEvent":53,"CreateEvent":3},"last_year":{"ForkEvent":1,"IssuesEvent":2,"WatchEvent":1,"IssueCommentEvent":4,"PushEvent":50,"CreateEvent":3}},"keywords":["netzero","renewables","wind"],"dependencies":[],"score":2.0794415416798357,"created_at":"2025-09-25T00:01:56.385Z","updated_at":"2026-04-11T04:03:22.049Z","avatar_url":"https://github.com/open-wind.png","language":"Python","category":"Renewable Energy","sub_category":"Wind Energy","monthly_downloads":0,"total_dependent_repos":0,"total_dependent_packages":0,"readme":"# Open Wind Energy\n\nThe Open Wind Energy toolkit builds and displays onshore wind turbine site constraints in a fully automated way - avoiding the need for manually downloading and processing multiple GIS datasets by hand. \n\nIt is designed to save time and lower the barrier to entry for onshore wind site identification for the following users:\n\n- Community energy groups\n- Net Zero and fuel poverty organisations\n- Local authorities\n- Electricity companies\n\nThe toolkit also provides a streamlined process for generating different turbine-specific constraint layers and may be of interest to:\n\n- Wind farm developers\n- GIS analysts and data scientists\n\nThe toolkit outputs data in a number of industry-standard GIS formats:\n\n- `GeoJSON`\n- `ESRI Shapefile`\n- `GeoPackage`\n- Mapbox Vector Tiles (`mbtiles`)\n- QGIS file\n\nThe toolkit also provides local versions of several popular GIS viewing clients for viewing the final wind site constraints:\n\n- [MapLibre-GL](https://github.com/maplibre/maplibre-gl-js)\n- [TileServer-GL](https://github.com/maptiler/tileserver-gl)\n- [GeoNode](https://geonode.org/)\n\nFor an overview of how the toolkit works, see ['How it works'](#how-it-works), below.\n\n## Quickstart\n\nInstall [Docker](https://docker.com) then run:\n\n```\ngit clone https://github.com/open-wind/openwindenergy.git\ncd openwindenergy\n./build-docker.sh\n```\n\nThe process will take 10 to 20 hours to complete, depending on computer specification (see [Minimum platform requirements](#minimum-platform-requirements), below). \n\nOnce the data build has completed, set up a temporary map tileserver by typing:\n\n```\n./run-docker.sh\n```\n\nThen view a simple map showing the final datasets by opening a web browser and entering:\n```\nhttp://localhost:8000\n```\n\nThis will display the following map:\n\n## Open Wind Energy site constraints map\n\n![Open Wind Energy Site Constraints Map](/openwindenergy-image-map.png)\n\nThis map is also available at [https://map.openwind.energy](https://map.openwind.energy). \n\nThe map uses vanilla Javascript, [MapLibre-GL](https://github.com/maplibre/maplibre-gl-js) and [TileServer-GL](https://github.com/maptiler/tileserver-gl) and is straightforward to modify by a developer with basic HTML / Javascript skills. \n\nNote: the live map has been produced using the Open Wind Energy toolkit with no changes to the underlying source code or HTML.\n\n## Installation \n\nSee [INSTALL.md](INSTALL.md). \n\n## Turbine-specific wind site constraints\n\nBy default the Open Wind Energy toolkit creates onshore wind site constraints for turbines with a height to tip of **124.2 metres** and blade radius of **47.8 metres** - the average height to tip and average blade radius of all large (\u003e= 75 metre to tip height) failed and successful pre-2025 wind turbine planning applications according to Open Wind Energy's research. \n\nTo create wind site constraints for different turbines, add the height to tip value to the `build-docker.sh` prompt:\n\n```\n./build-docker.sh [HEIGHT TO TIP]\n```\n\nFor example:\n\n```\n./build-docker.sh 99.5\n./build-docker.sh 120\n./build-docker.sh 149.9\n```\n\nIf using a localised (non-Docker) version of toolkit:\n\n```\n./build-cli.sh [HEIGHT TO TIP]\n\n./build-cli.sh 99.5\n./build-cli.sh 120\n./build-cli.sh 149.9\n```\n\nTo specify the blade radius, add this value after the `[HEIGHT TO TIP]`:\n\n```\n./build-docker.sh [HEIGHT TO TIP] [BLADE RADIUS]\n```\n\nFor example:\n\n```\n./build-docker.sh 99.5 30.5\n./build-docker.sh 120 40\n./build-docker.sh 149.9 45\n```\n\nIf using a localised (non-Docker) version of toolkit:\n\n```\n./build-cli.sh [HEIGHT TO TIP]\n\n./build-cli.sh 99.5 30.5\n./build-cli.sh 120 40\n./build-cli.sh 149.9 45\n```\n\nNote: **[HEIGHT TO TIP]** and **[BLADE RADIUS]** parameters should only be numbers - so remove `m`, `metres`, etc.\n\n## Minimum platform requirements\n\nTo run the Open Wind Energy build process, you will need a computer with the following minimum configuration:\n\n- 12Gb memory\n- 90Gb hard disk\n\n## Typical timings\n\nTo run the entire build process - from generating the necessary Docker instances (if using Docker) to outputting the final files - will take between 10 and 20 hours. Once an initial build is completed, however, it will take considerably less time to generate wind site constraints for turbines with different tip heights. \n\nTo improve performance, PostGIS should be run on an optimized platform, eg. a high-performance cloud-based database service, as much of the time-consuming processing involves PostGIS spatial queries. \n\n## Build files\nOutput files will be created in `build-cli/` or `build-docker/` and will be located in the following folders:\n\n### `output`\nContains Open Wind Energy output files for each final data layer. Each layer will have a `GeoJSON`, `ESRI Shapefile` and `GeoPackage` version. \n\nFiles will be called either `tip-...` or `latest-...`: \n\n- `tip-...` files will be unchangeable over time (assuming source data doesn't change), regardless of number of times toolkit is run.\n\n- `latest-...` files represent *latest* build and are overwritten each time toolkit is run. \n\nAs different `[HEIGHT TO TIP]` or `[BLADE RADIUS]` parameters are run, the `output` folder will fill up with additional height-to-tip- and blade-radius-specific files, eg. `tip-99-5m-bld-35-5m--inland-waters.gpkg`, `tip-120-m-bld-45-m--inland-waters.gpkg`, etc.\n\n### `tileserver`\nContains complete folder required to run [TileServer-GL](https://github.com/maptiler/tileserver-gl) instance. MapBox Tiles (`mbtiles`) files will be created in `tileserver/data/` while style definitions will be created in `tileserver/styles/`. \n\nYou can either run your own [TileServer-GL](https://github.com/maptiler/tileserver-gl) instance to serve up these files (see https://github.com/maptiler/tileserver-gl) or create an account with [MapBox](https://www.mapbox.com/) and upload your `mbtiles` files to this account so MapBox can serve them.\n\n### `app`\nContains simple [MapLibre-GL](https://github.com/maplibre/maplibre-gl-js) map application using vanilla Javascript (`index.html` and `datasets-latest-style.js`). Note: you will need a running [TileServer-GL](https://github.com/maptiler/tileserver-gl) instance to use this map (see `tileserver`, above). The `run-cli.sh` and `run-docker.sh` scripts create a temporary Docker instance of TileServer-GL to allow the `mbtiles` files in `tileserver/data/` to be loaded.\n\n### `datasets-downloads`\nContains all downloaded datasets, converted into either `GeoJSON` or `GeoPackage` files.\n\n### `osm-export-yml`\nContains all downloaded [osm-export-tool](https://github.com/hotosm/osm-export-tool-python) `yml` files. These files are used to generate OpenStreetMap `GeoPackage` files from the OpenStreetMap bulk download (`[build-folder]/united-kingdom-latest.osm.pbf`).\n\n## Custom configuration and custom clipping\n\nThe Open Wind Energy data portal provides a full definition of datasets, dataset-specific buffers and related styling. The Open Wind Energy toolkit also uses a default *clipping area* - the coastline of the United Kingdom - to clip all final data layers for UK onshore wind. \n\nIf elements of the default configuration need to be modified - for example, to modify default buffers or closely crop on a specific area - this can be done using custom configuration `YML` files or by supplying a clipping area in the command line. \n\nPossible customizations include:\n\n- **Country-specific output**: Select only datasets for a specific country. This may be desirable if an organisation's focus is country-specific and/or to reduce overall processing time - processing time is less for country-specific configurations as the number and size of datasets to process is reduced.\n\n- **Custom buffers**: Buffer areas indicate the padding around specific GIS features where a turbine is not appropriate. With a custom configuration file you can override the default buffer values Open Wind Energy uses.\n\n- **Custom datasets**: Select a subset of datasets from those on the Open Wind Energy data portal.\n\n- **Custom styling**: Select specific colours for displaying the final dataset groups. \n\n- **Custom clipping**: Clip final results on a specific country or council area, eg. `Scotland` or `Essex`, or group of countries / council areas, eg. `Essex` *and* `Suffolk` *and* `Cambridgeshire`. This may be useful to local authorities or energy companies focused on specific areas of the UK.\n\n### Example custom configuration - `scotland`:\n\n![Open Wind Energy Custom Configuration - Scotland](/openwindenergy-image-custom-scotland.png)\n\nThis map was generated by entering:\n\n```\n./build-cli.sh --custom scotland\n```\n\n### Custom configuration files\n\nThere are three ways to use a custom configuration file:\n\n- **Local file**: Specify path to local `YML` configuration file.\n\n- **Internet URL**: Specify internet URL of `YML` configuration file.\n\n- **Specify configuration name**: Specify *name* of configuration from list of available configurations on [Open Wind Energy Configuration Area](https://data.openwind.energy/group/custom). The system will then download the configuration file with the same title from the data portal.\n\nTo use a local custom configuration file:\n```\n./build-cli.sh --custom /path/to/custom.yml\n./build-docker.sh --custom /path/to/custom.yml\n\n[For example]\n\n./build-cli.sh --custom configuration/custom-openwindenergy.yml\n./build-docker.sh --custom configuration/custom-openwindenergy.yml\n```\n\nTo use a custom configuration file on the internet:\n```\n./build-cli.sh --custom https://yourdomain.org/custom-openwindenergy.yml\n./build-docker.sh --custom https://yourdomain.org/custom-openwindenergy.yml\n```\n\nTo use a specific configuration from the [Open Wind Energy Configuration Area](https://data.openwind.energy/group/custom):\n```\n./build-cli.sh --custom [Name of configuration - if spaces, include quotes]\n./build-docker.sh --custom [Name of configuration - if spaces, include quotes]\n\n[For example]\n\n./build-cli.sh --custom 'Open Wind Energy'\n./build-docker.sh --custom 'Open Wind Energy'\n```\n\nTo specify a particular country configuration file from the data portal, use `england`, `wales`, `scotland` or `northern-ireland`. For example:\n\n```\n./build-cli.sh --custom england\n./build-cli.sh --custom wales\n./build-cli.sh --custom scotland\n./build-cli.sh --custom northern-ireland\n\n[or for Docker-based builds]\n\n./build-docker.sh --custom england\n./build-docker.sh --custom wales\n./build-docker.sh --custom scotland\n./build-docker.sh --custom northern-ireland\n```\n\n\nA number of sample `YML` custom configuration files are provided within the `configuration/` folder:\n```\ncustom-council.yml\ncustom-england.yml\ncustom-great-britain.yml\ncustom-northern-ireland.yml\ncustom-openwindenergy.yml\ncustom-scotland.yml\ncustom-wales.yml\n```\n\n### Elements of `YML` custom configuration file:\n\n```\n# Wind turbine height-to-tip to use\ntip-height:\n  124.2\n\n# Wind turbine blade radius to use\nblade-radius:\n  47.8\n\n# OpenStreetMap download to use\nosm:\n  https://download.geofabrik.de/europe/united-kingdom-latest.osm.pbf\n\n# Clipping area to use\nclipping:\n  - england\n  - wales\n  - scotland\n  - northern-ireland\n\n# Countries to use when selecting datasets\n# Note: 'uk' is required to download OSM datasets that are not country-specific\nareas:\n  - england\n  - wales\n  - scotland\n  - northern-ireland\n  - uk\n\n# Specific datasets from data.openwind.energy to use\n# Note: any datasets must exist on data.openwind.energy to be used\nstructure:\n  aviation-and-exclusion-areas:\n    - airspace--uk\n    - civilian-airports--uk\n    ...\n\n# Specific buffer values (in metres) to use for each dataset\n# Note: any datasets must exist on data.openwind.energy to be buffered\nbuffers: \n  hedgerows--uk: \n    50\n  inland-waters--uk:\n    1.1 * height-to-tip\n  separation-distance-from-residential--uk:\n    8 * blade-radius\n  ...\n\n# Colours to use for each dataset group when displaying final data layers\nstyle:\n  aviation-and-exclusion-areas:\n    color:\n      purple\n  ecology-and-wildlife:\n    color:\n      darkgreen\n  ...\n \n```\nNote: all elements are entirely optional and do not need to be included in a custom configuration file - if values are omitted, default values from Open Wind Energy data portal will be used.\n\n### Custom clipping area\n\nYou can specify a custom clipping area that will be used for clipping all final datasets before they are output. To specify a custom clipping area, add the `--clip` argument:\n\n```\n./build-cli.sh --clip [area]\n./build-docker.sh --clip [area]\n```\n\nFor example\n```\n./build-cli.sh --clip 'Brighton and Hove'\n./build-docker.sh --clip Highland\n```\n\nIf a non-country area is supplied, the data pipeline will determine the country the clipping area is in and will *only* select datasets for that country (excluding OpenStreetMap datasets that are only limited by the value of the `osm` parameter).\n\nTo provide multiple values for the clipping area, ie. to create a clipping area that is a composite of several specific areas, use a custom configuration file instead. For example\n\n```\nclipping:\n  - Suffolk\n  - Essex\n  - Cambridgeshire\n```\n\nThis will clip the final dataset layers on `Suffolk` *and* `Essex` *and* `Cambridgeshire`.\n\n## Additional scripts\n\n- `geonode-build.sh`: Creates local copy of [GeoNode](https://geonode.org/) map server.\n\n- `geonode-upload.py`: Uploads post-build datasets to local copy of GeoNode created through `geonode-build.sh`. \n\nNote: due to raster-based focus of GeoNode / GeoServer together with the complexity of final Open Wind Energy datasets, a high performance computer is recommended to run GeoNode with Open Wind Energy constraint layers.\n\n## Command line parameters\nThe toolkit accepts the following optional command line arguments:\n\n- `[HEIGHT TO TIP]`: Height to tip in metres of intended wind turbine. This parameter is used to generate turbine-height-specific buffers. Note: enter number only, omitting `m`, `metres`, etc. \n\n- `--custom [path/URL/name of custom configuration file]`: Specify path, URL or name of `YML` custom configuration file. See [Custom configuration and custom clipping](#custom-configuration-and-custom-clipping).\n\n- `--clip [clipping area to use]`: Specific clipping area to use on final dataset layers. See [Custom configuration and custom clipping](#custom-configuration-and-custom-clipping).\n\n- `--purgeall`: Clears all downloads, exports and database tables as if starting fresh.\n\n- `--purgedb`: Clears all PostGIS tables and reexports final layer files.\n\n- `--purgederived`: Clears all derived (ie. non-core data) PostGIS tables and reexports final layer files.\n\n- `--purgeamalgamated`: Clears all amalgamated PostGIS tables and reexports final layer files.\n\n- `--skipdownload`: Skips download stage and just does PostGIS processing.\n\n- `--skipfonts`: Skips font installation stage and uses hosted version of openmaptiles fonts instead.\n\n- `--regenerate` *dataset*: Regenerates specific *dataset* by redownloading and recreating all tables relating to *dataset*.\n\n- `--buildtileserver`: Rebuilds files for tileserver.\n\n### Environment variables\nThe toolkit uses environment variables from `.env` and automatically copies `.env-template` (containing default values) to `.env` if `.env` has not been created. \n\nIf you need to modify the environment variables in `.env` script - for example to use a different PostGIS database or to resolve installation issues - the **mandatory** environment variables in `.env` are described below:\n\n- `POSTGRES_HOST`: Hostname of PostGIS database server to use.\n\n- `POSTGRES_DB`: PostGIS database to use.\n\n- `POSTGRES_USER`: Username of user who will access `POSTGRES_DB`. The user needs full access permissions to `POSTGRES_DB`. \n\n- `POSTGRES_PASSWORD`: Password of user who will access `POSTGRES_DB`.\n\n- `CKAN_URL`: URL of CKAN Open Data Portal to use to define wind (or other asset) site constraints.\n\n- `QGIS_PREFIX_PATH`: Filesystem prefix to QGIS (see [Using PyQGIS in standalone scripts](https://docs.qgis.org/3.40/en/docs/pyqgis_developer_cookbook/intro.html#using-pyqgis-in-standalone-scripts)).\n\n- `QGIS_PYTHON_PATH`: Absolute path to specific version of Python3 that QGIS uses, eg. `/usr/bin/python3`.\n\n- `QGIS_PROJ_DATA`: Absolute path to `PROJ` library directory, eg. `/usr/share/proj`.\n\nThere are also **optional** environment variables that can be set in `.env`:\n\n- `BUILD_FOLDER`: Absolute path to build folder where datasets will be downloaded and output files created. This will replace the default `build-cli/` build folder. *Note: only used if local (non-Docker) build.*\n\n- `TILESERVER_URL`: URL of [TileServer GL](https://github.com/maptiler/tileserver-gl) instance where you will host your mbtiles, eg. `https://tiles.openwind.energy`. This variable is used when creating the MapLibre-GL test site in `[build-directory]/app/index.html` and the related TileServer-GL `*.json` style files in `[build-directory]/tileserver/styles/`.\n\n- `GEONODE_BASE_URL`: URL of GeoNode instance to use when uploading data to GeoNode instance through `geonode-upload.sh`. *Note: only used if local (non-Docker) build.*\n\n- `GEOSERVER_BASE_URL`: URL of GeoServer instance to use when uploading data to GeoNode instance through `geonode-upload.sh`. *Note: only used if local (non-Docker) build.*\n\n- `ADMIN_USERNAME`: Username of GeoNode user to use when uploading data to GeoNode instance through `geonode-upload.sh`. *Note: only used if local (non-Docker) build.*\n\n- `ADMIN_PASSWORD`: Password of GeoNode user to use when uploading data to GeoNode instance through `geonode-upload.sh`. *Note: only used if local (non-Docker) build.*\n\n## How it works\n\n### 1. Download latest definition of onshore wind site constraints\nThe toolkit downloads the latest definition of onshore wind site constraints, including recommended buffers, from the Open Wind Energy [CKAN](https://ckan.org/) open data portal [data.openwind.energy](https://data.openwind.energy). \n\nThe definition contains updated information about where to locate the required datasets as well as higher level information about how to organise, process and amalgamate datasets once they have been downloaded. \n\nSee [Open Data Portal (CKAN) Custom Fields](#open-data-portal-ckan-custom-fields), below, for information about custom fields used in [CKAN](https://ckan.org/) to describe how datasets should be processed. \n\n### 2. Download and import required datasets\nThe toolkit downloads open source datasets from third party websites, eg. Historic England or OpenDataNI, and imports them into PostGIS. The range of data formats the toolkit currently supports include:\n\n- `GeoJSON`\n- `GeoPackage`\n- `ArcGIS`\n- `WFS`\n- `KML` / `KMZ`\n- [osm-export-tool](https://github.com/hotosm/osm-export-tool-python) `yml`\n\n[osm-export-tool](https://github.com/hotosm/osm-export-tool-python) `yml` files are used to define and import specific OpenStreetMap (https://www.openstreetmap.org/) datasets, eg. railways or major roads.\n\n### 3. Process imported datasets\nFor each imported dataset in PostGIS, the toolkit adds buffers where appropriate, clips each dataset to a predefined clipping path (currently UK coastline) and dissolves overlapping geometries. The toolkit then amalgamates geographically-specifically database tables to create a single unified table for the entire target area. \n\nFor example, the following tables will be amalgamated to create the table `tip_any__national_parks`:\n\n```\nnational_parks__scotland__pro\nnational_parks__england__pro\nnational_parks__wales__pro\nnational_parks__northern_ireland__pro\n```\n\n The toolkit then amalgamates tables by *group*, as defined in the Open Wind Energy open data portal [data.openwind.energy](https://data.openwind.energy) (see, for example, the group [Landscape and visual impacts](https://data.openwind.energy/group/landscape-and-visual-impacts)). \n \nThe following tables, for example, will be amalgamated to create the table `tip_any__landscape_and_visual_impacts`:\n\n```\ntip_any__areas_of_outstanding_natural_beauty\ntip_any__heritage_coasts\ntip_any__national_parks\n```\n\nWhen layers include buffers that are turbine height-to-tip or blade-radius dependent, final layers are amalgamated into a single `tip_[HEIGHT TO TIP]_bld_[BLADE RADIUS]__windconstraints` database table that defines overall site constraints for a turbine with height **[HEIGHT TO TIP]** and blade radius **[BLADE RADIUS]**.\n\n### 4. Export final layers\nAll PostGIS tables with prefix `tip_` will be exported as `GeoJSON`, `ESRI Shapefile`, `GeoPackage` and MapBox Vector Tiles (`mbtiles`). As the final wind constraint datasets are often highly detailed and interconnected, [Tippecanoe](https://github.com/felt/tippecanoe) is used to create optimized MapBox Vector Tiles that provide the most responsive user experience.\n\nIn addition to exporting separate layers, a [QGIS](https://qgis.org/) file is also generated that provides an overview of the latest exported layers. The QGIS file uses `GeoPackage` files in the `[build-folder]/output/` and does not require a tileserver to be running.\n\n### 5. Post-build\nOnce the build has completed, the final wind site constraint layers can be viewed as follows:\n\n#### Run local tileserver \nType `./run-docker.sh` (or `./run-cli.sh` if non-Docker build) and enter `http://localhost:8000` into web browser.\n\n#### Run QGIS\nInstall and run [QGIS](https://qgis.org/) and load exported QGIS file at `[build-folder]/windconstraints--latest.qgs`.\n\n## Generalizing to other use cases\n\nWhile the Open Wind Energy toolkit was specifically designed for onshore wind, the same codebase can be used to convert any CKAN data portal into final GIS layers for other use cases - for example solar farms, battery storage or green hydrogen. \n\nTo change the source CKAN open data portal the toolkit uses, set the `CKAN_URL` in the `.env` environment file:\n\n```\nCKAN_URL=https://data.otherdomain\n```\n\nYou can also add custom fields to the CKAN instance that modify toolkit processing using the following specification:\n\n### Open Data Portal ([CKAN](https://ckan.org/)) Custom Fields\n\nThe following custom fields are used within the [CKAN](https://ckan.org/) [Open Wind Energy Data Portal](https://data.openwind.energy) to describe how datasets should be processed by the Open Wind Energy toolkit:\n\n| Field | Value | Example | Description |\n| ----------- | ----------- | ----------- | ----------- |\n| `automation` | `exclude` | | Indicates dataset should not be included in automation process. This may be desirable when data portal is used to host non-constraint-related datasets that should not be included in final constraint layers. |\n| `automation` | `intersect` | | *To be implemented.* |\n| `buffer` | `[float]` | `50` | Absolute value in metres describing size of buffer to add to specific dataset. |\n| `buffer` | `[float] * height-to-tip` | `1.1 * height-to-tip` | Fractional value in height-to-tip units describing size of buffer to add to specific dataset. |\n| `buffer` | `[float] * blade-radius` | `1.1 * blade-radius` | Fractional value in blade-radius units describing size of buffer to add to specific dataset. |\n| `color` | *html-color* | `red` or `#FF3300` | Colour to be used when displaying dataset or dataset group in final user interface. |\n| `layer` | *layername* | `HES:Buildings_by_Category` | Specific layer to be downloaded from WFS endpoint. |\n\n## Contact\n\ninfo@openwind.energy\n\nhttps://openwind.energy\n\n## Thanks\n\nWe are grateful to the following individuals/organisations for their invaluable feedback and suggestions in shaping Open Wind Energy:\n\n- Kayla Ente, [Brighton \u0026 Hove Energy Services Co-operative](https://bhesco.co.uk)\n- Ben Cannell, [Sharenergy](https://sharenergy.coop)\n- [Clive Howard](https://www.linkedin.com/in/clivehoward/)\n- John Taylor, [Community Energy England](https://communityenergyengland.org/)\n- Mike Childs, Magnus Gallie, Toby Bridgeman, [Friends of the Earth](https://friendsoftheearth.uk/)\n- Catriona Cockburn, [Energise South Downs](https://esd.energy/)\n- Ben Sharpe, [Energise South Coast](https://www.energisesussexcoast.co.uk/)\n- Francis Cram, [MapStand](https://mapstand.com/)\n\n## Copyright\n\nOpen Wind Energy Toolkit  \nCopyright (c) Open Wind Energy, 2025  \nReleased under MIT License  \n\nDeveloped by Stefan Haselwimmer  \n","funding_links":[],"readme_doi_urls":[],"works":{},"citation_counts":{},"total_citations":0,"keywords_from_contributors":[],"project_url":"https://ost.ecosyste.ms/api/v1/projects/325307","html_url":"https://ost.ecosyste.ms/projects/325307"}