back to home



The whole architecture and workflow is based on the following:

A project is an area in the world for a new windpark. Each project can have a variable amount of information added to it, such as restriction layers (e.g. environmental zones). The minimum requirements for a project are:

  • digital elevation model in the form of contour lines
  • the positions of the wind turbines

A job is always part of a project and describes one configuration you run the tool with. You can add as many jobs as you like for each project.

Note, the processing of jobs will happen in the database asynchronously, but the optimization software (currently, we could change that) can only deal with one job at a time. That means, if you register 5 jobs at once, it'll calculate those jobs sequentially, while the waiting jobs are put in a queue.

Create new project

In the New Job panel click the green Plus sign next to it and enter a name in the popup window. That's it! In database terms, this will create a new schema in the database.

Create New Job

We'll discuss each input option:

New Job

The name for a job must be:

  • unique within the project
  • ideally not contain spaces or other special characters (e.g. */.,;%&, but _- are fine)

Start at/Stop after

Each job is partitioned into multiple stages, which are run sequentially:

Stage 1: Triangulate Elevation: performs a Delaunay triangulation of the elevation input, which will serve as the basis of the "road" network
Stage 2: Generate Topology: creates the "road" network, i.e. the graph which will be used to generate the finals paths
Stage 3: Snap Turbines: correlates the turbine positions to the road network
Stage 4: Add Restriction Cost: adds the cost of restriction layers to the intersecting edges of the Delaunay graph
Stage 5: Add Elevation Cost: adds the cost of the elevation/grade buckets to the edges of the Delaunay graph
Stage 6: Generate Paths: calculates the least-cost paths from the access point(s) to all wind turbines on the cost-modulated Delaunay graph

Stage 2 is very expensive. Typically you'd calculate the Delaunay triangulation and topology only once per project and play around with the cost of restriction layers and elevation in subsequent jobs.

Note, if you (for whatever reason) want to only run a single stage, specify the same stage in both fields.

Fit Network

Since the routing network will be built from triangulating the elevation dataset (with Delaunay), it can happen that edges are "included" which are actually outside the project area. This is mostly the case for concave/banana-shaped survey areas.

To mitigate this effect we include the option of removing edges after the triangulation. What this'll do:

  1. Calculate the average side lengths of all Delaunay polygons and their standard deviation
  2. Remove Delaunay polygons whose longest side is longer than a multiple of the population's standard deviation. The factor with which to apply this cut-off is the user setting.

Note, DO NOT apply this setting on convex shaped survey areas!

The user settings are:

  • No: Don't apply any reduction of the Delaunay triangles
  • Soft: Apply a factor of 3 to the standard deviation, which will put the maximum length limit fairly high
  • Medium: Apply a factor of 2 to the standard deviation, which will put the maximum length moderately high
  • Aggressive: Apply a factor of 1 to the standard deviation, which will put the maximum length limit pretty low and could result in holes within the survey area!

This operation is performed in Stage 1. It's best practice to load and check the Delaunay polygons after Stage 1 was run successfully. See the ""

Trace Update

The optimization itself also optimizes turbine locations sequentially. When a least-cost path for one turbine is found, this option will make sure that the road segments which were used to connect that turbine to the network will have very low cost for the subsequent turbine locations.

Meaning, if enabled, the algorithm will more likely re-use the same path for multiple turbines.


Each project can contain an unlimited set of layers, which we grouped into several types. Some of these types are mandatory, some are optional, some can only be applied once per job, some others can be included multiple times:


  • Turbines: the positions of the wind turbines. Needs to be a Point geometry. Needs to be only one layer per job.
  • Access Points: the point(s) at which the network should enter, e.g. from existing road(s). Needs to be a Point geometry. Needs to be only one layer per job.
  • Elevation: the contour lines (isolines) describing the elevation. Needs to be LineStringZ or MultiLineStringZ. Needs to be only one layer per job.


  • Existing Roads: already existing (and potentially usable) roads in the area. Needs to be a LineString geometry. Needs to be only one layer per job.
  • Restriction: polygons describing areas of elevated cost, e.g. natural reserves. Needs to be a LineString or Polygon geometry. Can be multiple layers per job.

Optional layers can be used to fine-tune the cost of the Delaunay graph. Essentially, each edge's length, which intersects with an optional layer feature, will be multiplied with cost of the layer feature. You'll be asked to specify a cost. A factor of greater than 1 will penalize an edge, while a factor less than 1 will favor an edge. You have three options:

  • Feature based: each feature (e.g. a single polygon for some Restriction) can have a unique cost specified in a table column which must be selected
  • Whole layer: assign a single cost value to every feature, i.e. whole layer. For Existing Roads this is the only option.
  • Infinite: prevents routing through these areas/segments at all cost by removing intersecting Delaunay segments entirely from the graph

Note, you can also remove layers by (multi-)selecting its table entries and clicking the Remove button.

Note, for performance reasons it's very recommended to clip the input elevation layer to its minimum extent in order to limit the search space for the routing optimization.

Elevation factors

One of the basic ideas of this project is the ability to penalize edges which have a significant slope. We put possible slopes into buckets which can have an individual cost penalty.

Again, edges with a corresponding slope will have their length multiplied by the slope bucket's penalization factor. This works sequentially to the restriction layers, i.e. an edge's cost is made up of its length multiplied by the slope penalty multiplied by the (optional) restriction penalty or existing roads favoring factors.


It's recommended to record your intent with this job by providing a useful description which makes sense to you even in a few years from today.


Click the Process button to kick of the job.


In the Status panel you can query the status of your jobs. Click the Refresh icon to refresh the list of jobs available for the selected project. Enable All projects to search for jobs in all projects, not just the currently selected one.

In Job Details you can see the configuration for the currently selected job.

In Queued Jobs you can list (and delete) queued jobs.


Press long on the Filter icon to bring up a dialog to specify filters to query the jobs, which will be applied to the search query if you activate the filter by short-pressing the filter button.

Load Results

We included a convenience button to load the resulting road layer connecting all turbines. Click on the Download icon to load the layer into your QGIS session.

Clone Job

As a convenience function you can clone a previous job's configuration to launch a new job. Click the Copy icon for that.

Delete Job

The last button will delete a job. You'll be asked for confirmation, so you don't accidentally delete a valuable job.

Load Delaunay

Another button is in the "Fit Network" row, which loads the Delaunay polygon layer which was built with the specified "Fit Network" setting. Use this layer to double-check the settings.