Skip to content

Commit bebb82b

Browse files
authored
DHI GTIF wind turbine service (#119)
* add basic PR for wind turbines * wind turbine: add udp * typo * fix format * wind turbines: update description * wind turbines: update description
1 parent 01110bd commit bebb82b

File tree

5 files changed

+302
-0
lines changed

5 files changed

+302
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
[
2+
{
3+
"id": "wind_turbine",
4+
"type": "openeo",
5+
"description": "Wind turbine detection",
6+
"backend": "openeo.cloud",
7+
"process_graph": {
8+
"wind_turbine": {
9+
"arguments": {
10+
"spatial_extent": {
11+
"east": 8.888,
12+
"north": 54.981,
13+
"south": 53.951,
14+
"west": 8.858
15+
},
16+
"year": 2024
17+
},
18+
"namespace": "https://raw.githubusercontent.com/ESA-APEx/apex_algorithms/refs/heads/dhi_wt/algorithm_catalog/dhi/wind_turbine/openeo_udp/wind_turbine.json",
19+
"process_id": "wind_turbine_detection"
20+
},
21+
"save1": {
22+
"process_id": "save_result",
23+
"arguments": {
24+
"data": {
25+
"from_node": "wind_turbine"
26+
},
27+
"format": "GEOJSON"
28+
},
29+
"result": true
30+
}
31+
},
32+
"reference_data": {
33+
"turbines.json": "https://s3.waw3-1.cloudferro.com/swift/v1/apex-examples/fusets_mogpr/fusets_mogpr.nc"
34+
}
35+
}
36+
]
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
{
2+
"process_graph": {
3+
"detection": {
4+
"process_id": "wind_turbine_detection",
5+
"namespace": "apex",
6+
"arguments": {
7+
"bbox": {"from_parameter": "spatial_extent"},
8+
"year": {"from_parameter": "year"}
9+
},
10+
"result": true
11+
}
12+
},
13+
"id": "wind_turbine_detection",
14+
"summary": "Wind turbine detection",
15+
"description": "# Description\n\nDetects wind turbines in open landscapes using Sentinel-2 imagery and a pre-trained computer vision object detection model.\nOpen landscapes can be considered all landscapes outside of built-up urban and peri-urban areas together with forested areas. \nIn general open landscapes is mainly comprised of open agricultural land and nature areas. \n\nThe user selects a region of interest and specifies a year to analyze. \nThe best available Sentinel-2 imagery for the selected region is ranked based on quality metrics and\nthe highest ranked image is chosen for wind turbine detection, based on several ranking parameters. \nThe Sentinel-2 imagery is then passed to the pre-trained neural network that returns the bounding boxes \nfor each detected turbine. Wind turbines are reported with a detection probability on the scale\nof 0 - 1. The higher the probability of the detection, the higher confidence that it is a TRUE detection.\n\nAdditional filtering is applied to account for multiple detections in close proximity. \nThe end result includes a .geojson file defining the bounding box of all wind turbine detections \nwith the detection date and probability as attributes. The service is so far applicable\nto Central Europe, with plans to expand further. \n\n\n# Performance characteristics\n\nThe costs of this service are based on the requested output area, making it independent of platform performance.\nAn example run of 220km² takes up to 30 minutes to complete, while smaller test areas complete drastically faster. \n\n\n# Examples\n\nBelow we overlay a Sentinel2-RGB image with the ML classification, thereby highlighting the detected areas.\n\n![wind_turbine_output](wind_turbine_example.png)\n\n# Known limitations\n\nWorks in open landscapes only, see description.",
16+
"returns": {
17+
"description": "A vector data cube with the locations of detected wind turbines.\n\nAll dimensions stay the same, except for the dimensions specified in corresponding parameters. There are three cases how the dimensions can change:\n\n1. The source dimension is the target dimension:\n - The (number of) dimensions remain unchanged as the source dimension is the target dimension.\n - The source dimension properties name and type remain unchanged.\n - The dimension labels, the reference system and the resolution are preserved only if the number of values in the source dimension is equal to the number of values computed by the process. Otherwise, all other dimension properties change as defined in the list below.\n2. The source dimension is not the target dimension. The target dimension exists with a single label only:\n - The number of dimensions decreases by one as the source dimension is 'dropped' and the target dimension is filled with the processed data that originates from the source dimension.\n - The target dimension properties name and type remain unchanged. All other dimension properties change as defined in the list below.\n3. The source dimension is not the target dimension and the latter does not exist:\n - The number of dimensions remain unchanged, but the source dimension is replaced with the target dimension.\n - The target dimension has the specified name and the type other. All other dimension properties are set as defined in the list below.\n\nUnless otherwise stated above, for the given (target) dimension the following applies:\n\n- the number of dimension labels is equal to the number of values computed by the process,\n- the dimension labels are incrementing integers starting from zero,\n- the resolution changes, and\n- the reference system is undefined.",
18+
"schema": {
19+
"type": "object",
20+
"subtype": "datacube"
21+
}
22+
},
23+
"categories": [
24+
"sentinel-2",
25+
"WIND ENERGY PRODUCTION/USE"
26+
],
27+
"parameters": [
28+
{
29+
"name": "spatial_extent",
30+
"description": "Limits the data to process to the specified bounding box or polygons.\n\nFor raster data, the process loads the pixel into the data cube if the point\nat the pixel center intersects with the bounding box or any of the polygons\n(as defined in the Simple Features standard by the OGC).\n\nFor vector data, the process loads the geometry into the data cube if the geometry\nis fully within the bounding box or any of the polygons (as defined in the\nSimple Features standard by the OGC). Empty geometries may only be in the\ndata cube if no spatial extent has been provided.\n\nEmpty geometries are ignored.\n\nSet this parameter to null to set no limit for the spatial extent.",
31+
"schema": [
32+
{
33+
"title": "Bounding Box",
34+
"type": "object",
35+
"subtype": "bounding-box",
36+
"required": [
37+
"west",
38+
"south",
39+
"east",
40+
"north"
41+
],
42+
"properties": {
43+
"west": {
44+
"description": "West (lower left corner, coordinate axis 1).",
45+
"type": "number"
46+
},
47+
"south": {
48+
"description": "South (lower left corner, coordinate axis 2).",
49+
"type": "number"
50+
},
51+
"east": {
52+
"description": "East (upper right corner, coordinate axis 1).",
53+
"type": "number"
54+
},
55+
"north": {
56+
"description": "North (upper right corner, coordinate axis 2).",
57+
"type": "number"
58+
},
59+
"base": {
60+
"description": "Base (optional, lower left corner, coordinate axis 3).",
61+
"type": [
62+
"number",
63+
"null"
64+
],
65+
"default": null
66+
},
67+
"height": {
68+
"description": "Height (optional, upper right corner, coordinate axis 3).",
69+
"type": [
70+
"number",
71+
"null"
72+
],
73+
"default": null
74+
},
75+
"crs": {
76+
"description": "Coordinate reference system of the extent, specified as as [EPSG code](http://www.epsg-registry.org/) or [WKT2 CRS string](http://docs.opengeospatial.org/is/18-010r7/18-010r7.html). Defaults to `4326` (EPSG code 4326) unless the client explicitly requests a different coordinate reference system.",
77+
"anyOf": [
78+
{
79+
"title": "EPSG Code",
80+
"type": "integer",
81+
"subtype": "epsg-code",
82+
"minimum": 1000,
83+
"examples": [
84+
3857
85+
]
86+
},
87+
{
88+
"title": "WKT2",
89+
"type": "string",
90+
"subtype": "wkt2-definition"
91+
}
92+
],
93+
"default": 4326
94+
}
95+
}
96+
},
97+
{
98+
"title": "Vector data cube",
99+
"description": "Limits the data cube to the bounding box of the given geometries in the vector data cube. For raster data, all pixels inside the bounding box that do not intersect with any of the polygons will be set to no data (`null`). Empty geometries are ignored.",
100+
"type": "object",
101+
"subtype": "datacube",
102+
"dimensions": [
103+
{
104+
"type": "geometry"
105+
}
106+
]
107+
},
108+
{
109+
"title": "No filter",
110+
"description": "Don't filter spatially. All data is included in the data cube.",
111+
"type": "null"
112+
}
113+
]
114+
},
115+
{
116+
"default": "2024",
117+
"description": "The year for wind turbine detection.",
118+
"name": "year",
119+
"optional": true,
120+
"schema": {
121+
"type": "string"
122+
}
123+
}
124+
],
125+
"default_job_options": {
126+
"max-executors": 20,
127+
"python-memory": "4500m",
128+
"executor-memory": "1g",
129+
"soft-errors": "true",
130+
"executor-cores": 1
131+
}
132+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
{
2+
"id": "dhi_wind_turbine_detection",
3+
"type": "Feature",
4+
"conformsTo": [
5+
"http://www.opengis.net/spec/ogcapi-records-1/1.0/req/record-core",
6+
"https://apex.esa.int/core/openeo-udp"
7+
],
8+
"geometry": null,
9+
"properties": {
10+
"created": "2025-03-12T00:00:00Z",
11+
"updated": "2025-03-12T00:00:00Z",
12+
"type": "service",
13+
"title": "Wind turbine detection",
14+
"description": "# Description\n\nDetects wind turbines in open landscapes using Sentinel-2 imagery and a pre-trained computer vision object detection model.\nOpen landscapes can be considered all landscapes outside of built-up urban and peri-urban areas together with forested areas. \nIn general open landscapes is mainly comprised of open agricultural land and nature areas. \n\nThe user selects a region of interest and specifies a year to analyze. \nThe best available Sentinel-2 imagery for the selected region is ranked based on quality metrics and\nthe highest ranked image is chosen for wind turbine detection, based on several ranking parameters. \nThe Sentinel-2 imagery is then passed to the pre-trained neural network that returns the bounding boxes \nfor each detected turbine. Wind turbines are reported with a detection probability on the scale\nof 0 - 1. The higher the probability of the detection, the higher confidence that it is a TRUE detection.\n\nAdditional filtering is applied to account for multiple detections in close proximity. \nThe end result includes a .geojson file defining the bounding box of all wind turbine detections \nwith the detection date and probability as attributes. The service is so far applicable\nto Central Europe, with plans to expand further. \n\n\n# Performance characteristics\n\nThe costs of this service are based on the requested output area, making it independent of platform performance.\nAn example run of 220km² takes up to 30 minutes to complete, while smaller test areas complete drastically faster. \n\n\n# Examples\n\nBelow we overlay a Sentinel2-RGB image with the ML classification, thereby highlighting the detected areas.\n\n![wind_turbine_output](wind_turbine_example.png)\n\n# Known limitations\n\nWorks in open landscapes only, see description.",
15+
"cost_estimate": 7,
16+
"cost_unit": "platform credits per km\u00b2",
17+
"keywords": [
18+
"wind turbine",
19+
"detection"
20+
],
21+
"language": {
22+
"code": "en-US",
23+
"name": "English (United States)"
24+
},
25+
"languages": [
26+
{
27+
"code": "en-US",
28+
"name": "English (United States)"
29+
}
30+
],
31+
"contacts": [
32+
{
33+
"name": "Alkiviadis Koukos",
34+
"position": "Researcher",
35+
"organization": "DHI",
36+
"links": [
37+
{
38+
"href": "https://eo.dhigroup.com/",
39+
"title": "DHI Website",
40+
"rel": "about",
41+
"type": "text/html"
42+
},
43+
{
44+
"href": "https://github.com/alkiskk",
45+
"title": "GitHub",
46+
"rel": "about",
47+
"type": "text/html"
48+
}
49+
],
50+
"contactInstructions": "Contact via DHI",
51+
"roles": [
52+
"principal investigator"
53+
]
54+
}
55+
],
56+
"themes": [
57+
{
58+
"concepts": [
59+
{
60+
"id": "Sentinel-2 MSI",
61+
"url": "https://gcmd.earthdata.nasa.gov/kms/concept/fc57a9a0-a287-4bcf-a517-20811b55596b?format=json"
62+
},
63+
{
64+
"id": "WIND ENERGY PRODUCTION/USE",
65+
"url": "https://gcmd.earthdata.nasa.gov/kms/concept/b3a95e10-1c1d-41cf-8802-8bb1d3a41353?format=json"
66+
}
67+
],
68+
"scheme": "https://gcmd.earthdata.nasa.gov/kms/concepts/concept_scheme/sciencekeywords"
69+
}
70+
],
71+
"formats": [
72+
{
73+
"name": "GeoJSON"
74+
}
75+
],
76+
"license": "proprietary"
77+
},
78+
"linkTemplates": [],
79+
"links": [
80+
{
81+
"rel": "application",
82+
"type": "application/vnd.openeo+json;type=process",
83+
"title": "openEO Process Definition",
84+
"href": "https://raw.githubusercontent.com/..."
85+
},
86+
{
87+
"rel": "service",
88+
"type": "application/json",
89+
"title": "openEO platform",
90+
"href": "https://openeo.cloud"
91+
},
92+
{
93+
"rel": "webapp",
94+
"type": "text/html",
95+
"title": "OpenEO Web Editor",
96+
"href": "https://editor.openeo.org"
97+
}
98+
]
99+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Description
2+
3+
Detects wind turbines in open landscapes using Sentinel-2 imagery and a pre-trained computer vision object detection model.
4+
Open landscapes can be considered all landscapes outside of built-up urban and peri-urban areas together with forested areas.
5+
In general open landscapes is mainly comprised of open agricultural land and nature areas.
6+
7+
The user selects a region of interest and specifies a year to analyze.
8+
The best available Sentinel-2 imagery for the selected region is ranked based on quality metrics and
9+
the highest ranked image is chosen for wind turbine detection, based on several ranking parameters.
10+
The Sentinel-2 imagery is then passed to the pre-trained neural network that returns the bounding boxes
11+
for each detected turbine. Wind turbines are reported with a detection probability on the scale
12+
of 0 - 1. The higher the probability of the detection, the higher confidence that it is a TRUE detection.
13+
14+
Additional filtering is applied to account for multiple detections in close proximity.
15+
The end result includes a .geojson file defining the bounding box of all wind turbine detections
16+
with the detection date and probability as attributes. The service is so far applicable
17+
to Central Europe, with plans to expand further.
18+
19+
20+
# Performance characteristics
21+
22+
The costs of this service are based on the requested output area, making it independent of platform performance.
23+
An example run of 220km² takes up to 30 minutes to complete, while smaller test areas complete drastically faster.
24+
25+
26+
# Examples
27+
28+
Below we overlay a Sentinel2-RGB image with the ML classification, thereby highlighting the detected areas.
29+
30+
![wind_turbine_output](wind_turbine_example.png)
31+
32+
# Known limitations
33+
34+
Works in open landscapes only, see description.
35+
179 KB
Loading

0 commit comments

Comments
 (0)