About the Norway bird map

Human infrastructure (wind farms, power lines, buildings) causes significant bird mortality worldwide. This tool visualizes the nearby bird observations and wind energy infrastructure in Norway, enabling data driven pre-stage screening before new projects are planned.

By combining open biodiversity data with turbine locations and species flight altitudes, we can compare recorded species with estimated rotor altitude overlap. This is exploratory screening, not a validated collision forecast, habitat survey or permitting assessment.

Red list categories

Norwegian Red List for Species 2021, published by Artsdatabanken. Categories follow the IUCN framework.

CR Critically endangered
Extremely high risk of extinction. Fewer than 50 mature individuals or 80%+ population decline over 3 generations.
EN Endangered
Very high risk of extinction. 50 to 250 mature individuals or 50-80% population decline over 3 generations.
VU Vulnerable
High risk of extinction. 30-50% population decline or fewer than 10,000 mature individuals.
NT Near threatened
Close to qualifying for a threatened category. Declining trends that may worsen.

Rotor zone risk

Norwegian wind turbines have hub heights of 31 to 145m and rotor diameters of 27 to 150m. The rotor swept zone varies per park. In the conflict scoring, each park is evaluated against its own rotor zone from NVE data.

▲ High overlap
More than 50% of the species' typical flight altitude band falls within the rotor zone. Examples for this reference zone include buzzards (30-200m) and gulls (10-150m).
● Partial overlap
Some flight altitude overlaps with the rotor zone but less than 50%. For the reference zone, white-tailed eagle (50-300m) has partial overlap. Classifications change with turbine dimensions.
no icon Low or no overlap
Species typically flies below 30m or above 200m. Examples: small passerines (2-30m), high-migrating geese (50-800m in transit).

Flight altitudes are approximate estimates based on general ornithological knowledge of each species' typical flight behavior. They are informed by published literature on collision risk and marine bird flight heights (see references below) but the specific [min, max] values were not directly extracted from those papers. Values represent typical local flight, not migration altitude.

Bird photograph credits and licenses

Heatmap and observation density

The heatmap shows observation density from a 10,000 record sample. Brighter areas have more reported bird observations. This reflects where people observe birds, not necessarily where bird density is highest. Urban areas and popular birding sites are overrepresented.

Points view shows individual observations as colored circles. Each species gets a unique color. Click a point to see species details, red list status, flight altitude, rotor zone overlap and observation count in the current filtered view.

Low to high observation density (inferno color scale)
Wind turbine park (icon size = installed capacity in MW)

Wind park bird conflict scoring

Each wind park is color coded from green (low conflict) through yellow (moderate) to red (high conflict) based on a composite score of nearby bird observations.

Step 1. Find nearby observations

For each park, all bird observations within a 30 km radius are collected. Distance is computed using a flat-Earth approximation (sufficient at Norway's scale).

dx = (obs.lon - park.lon) × 111 × cos(park.lat)
dy = (obs.lat - park.lat) × 111
distance = sqrt(dx² + dy²)     // in km

111 km = one degree of latitude (Earth circumference 40 000 km / 360°). The cos(lat) term corrects longitude because meridians converge toward the poles. At 60°N (southern Norway) one degree of longitude is ~55 km, not 111. This local approximation is used for the 30 km screening radius. It is not a geodesic distance calculation.

Step 2. Weight each observation

Each observation starts with a base weight of 1. Two multipliers are applied.

Red list multiplier
CR× 8
EN× 5
VU× 3
NT× 1.5
Not listed× 1 (no change)
Rotor zone overlap multiplier
High overlap× 3
Partial overlap× 1.5
Low / unknown× 1 (no change)

Red list weights reflect the relative severity of IUCN categories: CR is the highest extinction risk category, so each record receives the largest chosen weight (×8). The specific multipliers (8, 5, 3, 1.5) are author chosen, not from a published standard, but preserve the ordering of conservation priority. The 30 km search radius is an author chosen screening distance, not a measured movement range for every species. All observations within this radius are weighted equally (no distance decay).

weight = 1.0
if species in Red List:    weight × red_list_multiplier
if species rotor overlap:  weight × rotor_multiplier

score = sum of all weighted observations within 30 km

Step 3. Normalize and color

The raw score is normalized to a 0 to 1 range by dividing by 300 (author chosen display threshold), clamped at 1.0. The color is interpolated: green channel fades out above 0.5, red channel fades in below 0.5.

normalized = min(1, score / 300)

Color mapping:
  0.0 - 0.2  →  green   (low bird conflict)
  0.2 - 0.5  →  yellow  (moderate bird conflict)
  0.5 - 0.75 →  orange  (high bird conflict)
  0.75 - 1.0 →  red     (very high bird conflict)

The park display divides weighted records by 300. Municipality displays instead sum each relevant species once and divide by 60. These author chosen thresholds are not calibrated collision probabilities. Empty filtered samples are unknown; reporting effort and sample quotas affect the display.

Rotor zone overlap calculation

For each species with known flight altitude data, we calculate how much of its typical flight band overlaps with the park's specific rotor swept zone (derived from NVE hub height and rotor diameter data for each park).

rotor_zone = [park.rotor_min, park.rotor_max]  // per-park, from NVE data
bird_flight = [min_m, max_m]

overlap = max(0, min(bird_max, rotor_max) - max(bird_min, rotor_min))
flight_range = bird_max - bird_min
overlap_ratio = overlap / flight_range

Risk classification:
  overlap = 0           →  low    (no icon)
  overlap_ratio > 50%   →  high   (▲ red triangle)
  overlap_ratio ≤ 50%   →  medium (● yellow dot)

Example: white-tailed eagle flies at 50 to 300m. At Smøla (rotor zone 30-110m): overlap = min(300,110) - max(50,30) = 60m. Range = 250m. Ratio = 24% → medium. At Kjølberget (rotor zone 70-220m): overlap = min(300,220) - max(50,70) = 150m. Ratio = 60% → high.

Data confidence layer

When enabled, each of Norway's 357 municipalities (kommuner) is colored by observation count. This shows where our sample data is dense enough for meaningful analysis and where predictions should be treated with caution.

Method

Each bird observation is assigned to a kommune using point in polygon spatial join (ray-casting algorithm). The observation count per kommune determines the fill color.

0 observations — no data, lowest confidence
1 to 4 observations — very low confidence
5 to 14 observations — low confidence
15 to 29 observations — moderate confidence
30+ observations — good coverage (transparent)

With a 10K sample across 357 kommuner, the average is ~28 observations per kommune. Inland mountain and northern municipalities typically have fewer observations due to lower population and fewer citizen-science contributors. Grey and red areas should not be used for risk assessment without additional data collection.

Data sources

Bird observations
GBIF (Global Biodiversity Information Facility)
33.7M georeferenced bird records in Norway. Sample: 10,000 records (833 per month).
API: api.gbif.org/v1/occurrence/search | License: CC BY 4.0 / CC0 | No auth required
Wind turbines
NVE (Norwegian Water Resources and Energy Directorate) via HuggingFace
393 turbine records across 62 wind parks. Includes hub height, rotor diameter, capacity.
License: NVE open data | No auth required
Municipality boundaries
Kartverket via GitHub
357 Norwegian municipalities (kommuner), simplified GeoJSON.
License: CC BY 4.0 | No auth required
Red list
Artsdatabanken Norwegian Red List for Species 2021
56 bird species with IUCN categories (CR, EN, VU, NT). Manually curated.
Flight altitude
98 species with typical flight altitude ranges [min, max] in meters AGL. Represents local/foraging flight, not migration altitude. Values are approximate estimates based on general ornithological knowledge. The following publications informed the overall approach and provided context for specific species groups:
Johnston A. et al. (2014) Modelling flight heights of marine birds to more accurately assess collision risk with offshore wind turbines. Journal of Applied Ecology, 51(1), 31-41. doi:10.1111/1365-2664.12191
Band W. et al. (2007) Developing field and analytical methods to assess avian collision risk at wind farms. In: de Lucas M., Janss G., Ferrer M. (eds) Birds and Wind Farms. Quercus, Madrid.
Scottish Natural Heritage (2000, rev. 2017) Windfarms and birds: calculating a theoretical collision risk assuming no avoiding action. SNH Guidance Note.
Dahl E.L. et al. (2012) Reduced breeding success in white-tailed eagles at Smøla windfarm, western Norway. Environmental Research Letters, 7(4). doi:10.1088/1748-9326/7/4/044009
BirdLife Norge Species fact sheets and field guides. birdlife.no

Limitations

This is a screening tool, not a regulatory environmental impact assessment. Observation density reflects citizen-science reporting patterns, not true abundance. Flight altitudes are approximate estimates, not site-specific measurements. For actual wind farm planning, site-specific radar surveys and environmental assessments are required.

Team

Built at Tekna Hackathon: Code your way to a greener world (Feb 27-28, 2026, Oslo).

Almaz Ermilov
Michael Bitney
Dmitri Kuzkin
Marian Øverli

GitHub repository  ·  Live demo

All data from open sources. Code is open for hackathon purposes.

Place labels

Local town and city names come from GeoNames, retrieved 6 October 2026 under CC BY 4.0. This snapshot works offline.