QGIS Plugin

The cityseer QGIS plugin provides Processing algorithms for computing localised network centrality metrics, land-use accessibility, and localised statistics directly within QGIS. It uses a dual graph representation where each road segment becomes a node connected to its neighbours, with support for multiple distance thresholds, shortest and simplest (angular) paths, and deterministic distance-based sampling.

The plugin is experimental and requires QGIS 4.0+.

Installation

Install the plugin from the QGIS plugin repository: go to Plugins > Manage and Install Plugins, search for “Cityseer”, and click Install. Enable the “Show also experimental plugins” option in the Settings tab if the plugin is not visible.

On first load, the plugin will prompt to install the cityseer Python library if it is not already available in the QGIS Python environment.

Common Concepts

The following concepts apply to all three algorithms:

  • Projected CRS: All input layers must use a projected metre-based coordinate reference system (not geographic/degrees). All layers in a given analysis must share the same CRS.
  • Distance thresholds: Metrics are computed independently at each distance threshold. Shorter distances capture local patterns; longer distances capture wider-area structure.
  • Boundary polygon: An optional polygon layer. Nodes whose midpoints fall inside the boundary are “live” (used as analysis sources); nodes outside provide network context only. Multi-polygon layers are supported (features are merged automatically).
  • Simplest path (angular): When enabled, paths minimise cumulative angular change instead of metric distance. This models route choice based on cognitive simplicity rather than physical distance.

Network Centrality

Accessible via Processing > Cityseer > Network Centrality.

Input Parameters

ParameterDescriptionDefault
Street network line layerA line layer in a projected metre-based CRS(required)
Distance thresholdsComma-separated distances in metres400,800
Betweenness tolerance %Controls betweenness spread across near-shortest paths. 0 = exact shortest paths only. Keep below 1%.0.0
Boundary polygonOptional polygon layer. Nodes inside the boundary are used as centrality sources; nodes outside provide network context only.(none)
Use deterministic distance-based samplingExperimental. When enabled, sampling probability is computed per distance threshold. Distances where the probability is 1.0 are computed exactly; larger distances are sampled for speed.True

Metric Selection

The algorithm dialog provides a 2x2 grid of metric categories. Each category can be toggled on or off independently, and individual metrics within each category are selected independently — enabling a metric in one category does not affect other categories.

Shortest pathSimplest path (angular)
Closenessharmonic, density, farness, beta, cycles, hillierharmonic, density, farness, hillier
Betweennessbetweenness, betweenness_betabetweenness, betweenness_beta

By default, harmonic closeness and betweenness are enabled for shortest paths. All simplest path categories are off by default.

Centrality Output

The output is a line layer with the original street segments and computed centrality values as attributes. Output fields follow the naming convention:

cc_<metric>_<distance>[_ang]

For example, with distances 400,800:

  • cc_harmonic_400, cc_harmonic_800
  • cc_betweenness_400, cc_betweenness_800
  • cc_harmonic_400_ang (if simplest path closeness is enabled)

Sampling

Deterministic distance-based sampling is enabled by default. Sampling probability depends only on the distance threshold: smaller distances run exactly while larger distances are sampled for a speed-up. The following table shows approximate sampling rates:

Distance (m)Sampled sourcesApprox. speed-up
400100%1x
800100%1x
1600100%1x
3200100%1x
500058.7%1.7x
800024.9%4.0x
1000016.6%6.0x
150007.8%12.7x
200004.6%21.7x

Disable sampling for exact computation at all distances.

Accessibility

Accessible via Processing > Cityseer > Accessibility. Computes land-use accessibility by counting reachable features (from a point or polygon data layer) within distance thresholds along the street network.

Accessibility Parameters

ParameterDescriptionDefault
Street network line layerA line layer in a projected metre-based CRS(required)
Data layerA point or polygon layer containing land-use features(required)
Land-use category fieldText column containing the land-use category for each feature. If not set, all features are treated as one category.(none)
Distance thresholdsComma-separated distances in metres400,800
Max assignment distanceMaximum distance (metres) to snap data points to the nearest street segment400
Use simplest path (angular)Use angular (simplest) paths instead of shortest (metric) pathsFalse
Boundary polygonOptional polygon layer. Nodes inside the boundary are used as sources; nodes outside provide network context only.(none)

Land-Use Categories

If a land-use field is selected, the dialog provides a Load categories button that reads unique values from the selected field. Individual categories can then be checked or unchecked. Categories are unchecked by default — use Select all to enable all categories, or check specific ones. Only text (string) columns are available for the land-use field.

If no land-use field is selected, all features are counted together under a single category (all).

Accessibility Output

The output is a line layer with the original street segments and computed accessibility values as attributes. For each land-use category and distance threshold, three types of columns are produced:

cc_<category>_<distance>[_ang]_nw    — unweighted count of reachable features
cc_<category>_<distance>[_ang]_wt    — distance-weighted count (exponential decay)
cc_<category>_nearest_max_<max_distance>[_ang]  — distance to nearest feature

For example, with a type field containing pub and shop, and distances 400,800:

  • cc_pub_400_nw, cc_pub_400_wt, cc_pub_800_nw, cc_pub_800_wt
  • cc_pub_nearest_max_800
  • cc_shop_400_nw, cc_shop_400_wt, cc_shop_800_nw, cc_shop_800_wt
  • cc_shop_nearest_max_800

Statistics

Accessible via Processing > Cityseer > Statistics. Computes localised statistics for a numerical data column within distance thresholds along the street network.

Statistics Parameters

ParameterDescriptionDefault
Street network line layerA line layer in a projected metre-based CRS(required)
Data layerA point or polygon layer containing numerical data(required)
Numerical fieldNumeric column to compute statistics on(required)
Distance thresholdsComma-separated distances in metres400,800
Max assignment distanceMaximum distance (metres) to snap data points to the nearest street segment400
Use simplest path (angular)Use angular (simplest) paths instead of shortest (metric) pathsFalse
Boundary polygonOptional polygon layer. Nodes inside the boundary are used as sources; nodes outside provide network context only.(none)

Only numeric columns are available for the numerical field selector. Features with missing, null, or non-finite values are skipped automatically.

Available Statistics

The algorithm dialog provides checkboxes for selecting which statistics to compute:

StatisticDescriptionWeighted variantDefault
SumSum of valuesYesOn
MeanMean of valuesYesOn
CountNumber of data pointsYesOn
MedianMedian of valuesYesOff
VarianceVariance of valuesYesOff
MADMedian Absolute DeviationYesOff
MaxMaximum valueNoOff
MinMinimum valueNoOff

Statistics with weighted variants produce both unweighted (_nw) and distance-weighted (_wt) columns. The weighted variant uses exponential distance decay. Max and min have no weighted variant and produce a single column per distance.

To compute statistics for multiple numerical columns, run the algorithm once per column.

Statistics Output

The output is a line layer with the original street segments and computed statistics as attributes. Output fields follow the naming convention:

cc_<field>_<statistic>_<distance>[_ang]_nw    — unweighted statistic
cc_<field>_<statistic>_<distance>[_ang]_wt    — distance-weighted statistic
cc_<field>_<statistic>_<distance>[_ang]       — for max/min (no weighted variant)

For example, with a price field and distances 400,800:

  • cc_price_sum_400_nw, cc_price_sum_400_wt, cc_price_sum_800_nw, cc_price_sum_800_wt
  • cc_price_mean_400_nw, cc_price_mean_400_wt, cc_price_mean_800_nw, cc_price_mean_800_wt
  • cc_price_max_400, cc_price_max_800