%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart TD
Start([Start literature search]) --> SPC["<u><span style='color:#1a0dab;'>spc_corpus.yaml<br/>Assemble base SPC corpus</span></u>"]
click SPC "./input/search_terms/spc_corpus.yaml" "Open spc_corpus.yaml"
SPC --> SPC_list["spc keyword set<br/>(planning & connectivity terms)<br/>(n = <<SPC_LIST>>)"
]
SPC --> NATURE_list["nature keyword set<br/>(environmental context terms)<br/>(n = <<NATURE_LIST>>)"
]
SPC_list --> BaseQuery["Level 1 query<br/>spc terms AND nature dictionary<br/>(n = <<BASE_QUERY>>)"
]
NATURE_list --> BaseQuery
BaseQuery --> ChapterSelect{Apply chapter / theme refinements}
ChapterSelect --> CH1["<u><span style='color:#1a0dab;'>Chapter 1<br/>chapter_1.yaml<br/>Governance & planning principles</span></u>"]
click CH1 "./input/search_terms/chapter_1.yaml" "Open chapter_1.yaml"
ChapterSelect --> CH2["<u><span style='color:#1a0dab;'>Chapter 2<br/>chapter_2.yaml<br/>GBF targets, nexus themes, SDGs</span></u>"]
click CH2 "./input/search_terms/chapter_2.yaml" "Open chapter_2.yaml"
ChapterSelect --> CH3["<u><span style='color:#1a0dab;'>Chapter 3<br/>chapter_3.yaml<br/>Restoration & conservation planning</span></u>"]
click CH3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"
ChapterSelect --> CH4["<u><span style='color:#1a0dab;'>Chapter 4<br/>chapter_4.yaml<br/>Connectivity evidence & metrics</span></u>"]
click CH4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"
ChapterSelect --> CH5["<u><span style='color:#1a0dab;'>Chapter 5<br/>chapter_5.yaml<br/>Foresight & futures (sections, themes, cross-cutting)</span></u>"]
click CH5 "./input/search_terms/Chapter_5_1_2.yaml" "Open Chapter 5 search terms"
ChapterSelect --> CH6["<u><span style='color:#1a0dab;'>Chapter 6<br/>chapter_6.yaml (+ chapter_6_r2.yaml optional)<br/>Enabling environment</span></u>"]
click CH6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"
Spatial Planning and Connectivity Corpus - Technical Background Report
IPBES Spatial Planning and Connectivity Assessment
To Be added
Part of the Data Management Report
Disclaimer
This is a technical background document for the IPBES Methodological assessment of integrated biodiversity-inclusive spatial planning and ecological connectivity. This document provides technical details and implementation settings for the data management report of the Transformative Change Assessment Corpus and its usage. The sole purpose of this document is to document the workflows used to produce statistics, figures and maps, to document the source of the data and to make the process transparent and reproducible.
Contributors
Assessment Experts
Assessment TSU
Data and Knowledge tsu
LLM Usage Disclosure
Code and flowcharts in this project have been generated with the assistance of the Codex as well as Claude Code. All content and code is based on conceptuaisation by the authors and has been thoroughly reviewed and edited by humans afterwards.
Introduction
The literature search for the Spatial Planning and Connectivity assessment corpus was conducted using search terms provided by the experts and refined in co-operation with the IPBES task force for data and knowledge management. The search was conducted using OpenAlex, scripted from R to use the OpenAlex API. Search terms for the following searches were defined:
- Spatial Planning and Connectivity,
- Nature / Environment
- additional search terms for specific corpora
To assess the quality of the corpus, sets of key papers were selected by the experts to verify if these are in the corpus.
The following terminology is used in this document:
- Corpus: A body of works as based on a search on OpenAlex
- Spatial Planning and Connectivity Assessment Corpus: Short: SPC corpus; The corpus resulting from the search terms TO BE ADDED
- work: terminology used for a single document in their dataset. Each work has a unique OpenAlex id, but not necessarily a DOI.
The following searches are conducted on Title and Abstract only to account for fluctuating availability of full text searches and make the search more focussed..
Schematic Overview
This is a schematic overview of the search strategy. It is shown again in the Results section with the numbers of resulting hits. ### Overview
Chapter 1
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch1["<u><span style='color:#1a0dab;'>chapter_1.yaml<br/>Level 2 refinements</span></u>"]
click Ch1 "./input/search_terms/chapter_1.yaml" "Open chapter_1.yaml"
subgraph Chapter1Sets["Chapter 1 thematic searches"]
direction TB
C1_1["Set 1:<br/>land/spatial planning<br/>+ biodiversity goals<br/>+ societal needs/values<br/>(n = <<C1_1>>)"]
C1_2.1["Set 2.1:<br/>???<br/>(n = <<C1_2.1>>)"]
C1_2.2["Set 2.2:<br/>???<br/>(n = <<C1_2.2>>)"]
C1_3["Set 3:<br/>evidence & precaution<br/>+ ILK knowledge base<br/>(n = <<C1_3>>)"]
%% C1_4["Set 4:<br/>multilevel/transparent governance<br/>+ customary coherence<br/>(n = <<C1_4>>)"]
%% C1_5["Set 5:<br/>participatory planning<br/>+ co-design / engagement<br/>(n = <<C1_5>>)"]
%% C1_6["Set 6:<br/>equity / rights / tenure<br/>+ justice outcomes<br/>(n = <<C1_6>>)"]
%% C1_7["Set 7:<br/>connectivity (land-sea/cross-scale)<br/>+ nexus & climate links<br/>(n = <<C1_7>>)"]
end
Ch1 --> C1_1
Ch1 --> C1_2.1
Ch1 --> C1_2.2
Ch1 --> C1_3
%% Ch1 --> C1_4
%% Ch1 --> C1_5
%% Ch1 --> C1_6
%% Ch1 --> C1_7
Search Terms
Click chapter_1.yaml to download
Show the code
params$search_terms$chapter_1 |>
yaml::as.yaml() |>
cat()Set 1:
- ((indigenous AND (knowledge OR perspectives OR governance OR rights OR values OR
practices OR land)) OR "local knowledge" OR biocultural OR customary OR (diverse
AND ("knowledge systems" OR "world views" OR worldviews))) AND
- (planning OR governance OR policy OR tenure OR rights) AND
- (just OR inclusive OR fair OR effective OR equity OR equitable) AND
- (area OR territory OR "land use" OR "sea use" OR marine OR coastal OR "land-sea")
Set 2.1:
- ("multi-level" OR integrated OR accountable OR customary OR diverse OR "context-dependent"
OR "cross-scale" OR polycentric OR pluralism OR adaptive) AND
- (governance OR policy OR framework) AND
- ("spatial planning" OR "marine planning" OR "land-use planning" OR "sea-use planning"
OR "coastal planning" OR "territorial planning")
Set 2.2:
- ("legal pluralism" OR "institutional diversity" OR "polycentric governance" OR "multi-level
governance" OR "customary governance" OR "co-management" OR "adaptive governance"
OR "integrated governance" OR "cross-scale governance") AND
- (institution OR authority OR legitimacy) AND
- ("spatial planning" OR "marine planning" OR "land-use planning" OR "sea-use planning"
OR "coastal planning" OR "territorial planning")
Set 3:
- (participatory OR stakeholder OR transformative OR adaptive OR integrated) AND
- (approach OR strategy OR practice OR policy OR framework) AND
- ((spatial OR marine OR "land-use" OR "sea-use" OR coastal OR territorial) AND planning)
AND
- (landscape OR seascape OR watershed OR ecosystem OR area OR region OR "land-sea"
OR connectivity OR marine OR ocean OR maritime)
Chapter 2
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch2L2["<u><span style='color:#1a0dab;'>chapter_2.yaml<br/>Level 2 GBF bundles</span></u>"]
click Ch2L2 "../search_terms/chapter_2.yaml" "Open chapter_2.yaml"
subgraph Chapter2Sets["GBF contexts & targets"]
direction TB
Set_11["Set 1.1<br/>(n = <<Set_11>>)"]
Set_12["Set 1.2<br/>(n = <<Set_12>>)"]
Set_13["Set 1.3<br/>(n = <<Set_13>>)"]
Set_14["Set 1.3<br/>(n = <<Set_14>>)"]
Set_21["Set 2.1<br/>(n = <<Set_21>>)"]
Set_22["Set 2.2<br/>(n = <<Set_22>>)"]
%% Set_3["Set 3<br/>(n = <<Set_3>>)"]
end
Ch2L2 --> Set_11
Ch2L2 --> Set_12
Ch2L2 --> Set_13
Ch2L2 --> Set_21
Ch2L2 --> Set_22
%% Ch2L2 --> Set_3
%% subgraph L1_TARGET["GBF contexts & targets"]
%% T3["Target 3<br/>(n = <<T3>>)"]
%% T4["Target 4<br/>(n = <<T4>>)"]
%% T5["Target 5<br/>(n = <<T5>>)"]
%% T6["Target 6<br/>(n = <<T6>>)"]
%% T7["Target 7<br/>(n = <<T7>>)"]
%% T8["Target 8<br/>(n = <<T8>>)"]
%% T9["Target 9<br/>(n = <<T9>>)"]
%% T10["Target 10<br/>(n = <<T10>>)"]
%% T11["Target 11<br/>(n = <<T11>>)"]
%% T12["Target 12<br/>(n = <<T12>>)"]
%% T13["Target 13<br/>(n = <<T13>>)"]
%% T14["Target 14<br/>(n = <<T14>>)"]
%% T15["Target 15<br/>(n = <<T15>>)"]
%% T16["Target 16<br/>(n = <<T16>>)"]
%% T17["Target 17<br/>(n = <<T17>>)"]
%% T18["Target 18<br/>(n = <<T18>>)"]
%% T19["Target 19<br/>(n = <<T19>>)"]
%% T20["Target 20<br/>(n = <<T20>>)"]
%% T21["Target 21<br/>(n = <<T21>>)"]
%% T22["Target 22<br/>(n = <<T22>>)"]
%% T23["Target 23<br/>(n = <<T23>>)"]
%% end
%% Ch2L2 --> T3
%% Ch2L2 --> T4
%% Ch2L2 --> T5
%% Ch2L2 --> T6
%% Ch2L2 --> T7
%% Ch2L2 --> T8
%% Ch2L2 --> T9
%% Ch2L2 --> T10
%% Ch2L2 --> T11
%% Ch2L2 --> T12
%% Ch2L2 --> T13
%% Ch2L2 --> T14
%% Ch2L2 --> T15
%% Ch2L2 --> T16
%% Ch2L2 --> T17
%% Ch2L2 --> T18
%% Ch2L2 --> T19
%% Ch2L2 --> T20
%% Ch2L2 --> T21
%% Ch2L2 --> T22
%% Ch2L2 --> T23
%% subgraph L1_REL["Spatial Planning Related"]
%% REL["Spatial Planning Related<br/>(n = <<REL>>)"]
%% end
%% Ch2L2 --> REL
%% subgraph L1_NexusSets["Nexus"]
%% direction TB
%% Nexus_Water["Water<br/>(n = <<Nexus_Water>>)"]
%% Nexus_Food["Food<br/>(n = <<Nexus_Food>>)"]
%% Nexus_Health["Health<br/>(n = <<Nexus_Health>>)"]
%% Nexus_Climate["Climate<br/>(n = <<Nexus_Climate>>)"]
%% end
%% Ch2L2 --> Nexus_Water
%% Ch2L2 --> Nexus_Food
%% Ch2L2 --> Nexus_Health
%% Ch2L2 --> Nexus_Climate
%% L1_GBF --> Ch2L4["<u><span style='color:#1a0dab;'>chapter_2_sdg.yaml<br/>Level 4 SDG filters</span></u>"]
%% L1_NexusSets --> Ch2L4
%% L1_REL --> Ch2L4
%% click Ch2L4 "../search_terms/chapter_2_sdg.yaml" "Open chapter_2_sdg.yaml"
%% subgraph SDGSets["SDG goal filters"]
%% direction TB
%% SDG1["SDG 1"]
%% SDG2["SDG 2"]
%% SDG3["SDG 3"]
%% SDG4["SDG 4"]
%% SDG5["SDG 5"]
%% SDG6["SDG 6"]
%% SDG7["SDG 7"]
%% SDG8["SDG 8"]
%% SDG9["SDG 9"]
%% SDG10["SDG 10"]
%% SDG11["SDG 11"]
%% SDG12["SDG 12"]
%% SDG13["SDG 13"]
%% SDG14["SDG 14"]
%% SDG15["SDG 15"]
%% SDG16["SDG 16"]
%% SDG17["SDG 17"]
%% end
%% Ch2L4 --> SDG1
%% Ch2L4 --> SDG2
%% Ch2L4 --> SDG3
%% Ch2L4 --> SDG4
%% Ch2L4 --> SDG5
%% Ch2L4 --> SDG6
%% Ch2L4 --> SDG7
%% Ch2L4 --> SDG8
%% Ch2L4 --> SDG9
%% Ch2L4 --> SDG10
%% Ch2L4 --> SDG11
%% Ch2L4 --> SDG12
%% Ch2L4 --> SDG13
%% Ch2L4 --> SDG14
%% Ch2L4 --> SDG15
%% Ch2L4 --> SDG16
%% Ch2L4 --> SDG17
Search Terms
Click chapter_2.yaml to download
Show the code
params$search_terms$chapter_2 |>
yaml::as.yaml() |>
cat()Set 1.1:
- (((spatial OR "land use" OR regional OR municipal OR landscape OR design OR territorial
OR development OR marine OR urban OR conservation) AND (plan)) OR zoning) AND
- (GIS OR scenario OR modelling OR participatory OR synergies OR "trade-offs" OR "remote
sensing" OR "spatial prioritization")
Set 1.2:
- (((spatial OR "land use" OR regional OR municipal OR landscape OR design OR territorial
OR development OR marine OR urban OR conservation) AND (plan)) OR zoning) AND
- ("multi-criteria")
Set 1.3:
- (((spatial OR "land use" OR regional OR municipal OR landscape OR design OR territorial
OR development OR marine OR urban OR conservation) AND (plan)) OR zoning) AND
- (optimization OR monitoring OR indicators OR "community-based")
Set 1.4:
- (((spatial OR "land use" OR regional OR municipal OR landscape OR design OR territorial
OR development OR marine OR urban OR conservation) AND (plan)) OR zoning) AND
- (((impact OR environmental OR risk) AND assessment) OR ((spatial OR "cost-benefit")
AND analysis))
Set 2.1: (biodiversity OR ecosystem OR nature OR seascape OR agriculture OR forest
OR coastal OR marine OR "green infrastructure" OR "blue infrastructure" OR "protected
area" OR fragmentation OR connectivity OR biocultural)
Set 2.2: (urban OR culture OR stewardship OR "traditional ecological knowledge" OR
"indigenous knowledge" OR kinship OR reciprocity OR "socio-ecological systems")
Non implemented additional searches are:
- Click chapter_2_add.yaml to download
- Click chapter_2_sdg.yaml to download
Chapter 3
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch3["<u><span style='color:#1a0dab;'>chapter_3.yaml<br/>Level 2 refinements</span></u>"]
click Ch3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"
subgraph Chapter3Sets["Chapter 3 searches"]
direction TB
C3_1["Set 1:<br/>Protected/OECM + NBSAP + cases<br/>+ spatial prioritization + regional scales<br/>(n = <<C3_1>>)"]
C3_3["Set 3:<br/>Restoration planning + connectivity + resilience<br/>(n = <<C3_3>>)"]
C3_3.1A["Set 3.1 A:<br/>Objective<br/>(n = <<C3_3.1A>>)"]
C3_3.1BCD["Set 3.1 BCD:<br/>Concept<br/>(n = <<C3_3.1BCD>>)"]
C3_3.2D["Set 3.2 D:<br/>???<br/>(n = <<C3_3.2D>>)"]
C3_3.2F["Set 3.2 F:<br/>???<br/>(n = <<C3_3.2F>>)"]
C3_3.3["Set 3.3:<br/>???<br/>(n = <<C3_3.3>>)"]
C3_4["Set 4:<br/>Systematic conservation planning / gap analysis<br/>(n = <<C3_4>>)"]
C3_4.1AB["Set 4.1 AB:<br/>???<br/>(n = <<C3_4.1AB>>)"]
C3_4.1CD["Set 4.1 CD:<br/>???<br/>(n = <<C3_4.1CD>>)"]
C3_4.2["Set 4.2:<br/>???<br/>(n = <<C3_4.2>>)"]
C3_5.1["Set 5.1:<br/>???<br/>(n = <<C3_5.1>>)"]
C3_5.2["Set 5.1:<br/>???<br/>(n = <<C3_5.2>>)"]
end
Ch3 --> C3_1
Ch3 --> C3_3
Ch3 --> C3_3.1A
Ch3 --> C3_3.1BCD
Ch3 --> C3_3.2D
Ch3 --> C3_3.2F
Ch3 --> C3_3.3
Ch3 --> C3_4
Ch3 --> C3_4.1AB
Ch3 --> C3_4.1CD
Ch3 --> C3_4.2
Ch3 --> C3_5.1
Ch3 --> C3_5.2
Search Terms
Click chapter_3.yaml to download
Show the code
params$search_terms$chapter_3 |>
yaml::as.yaml() |>
cat()Set 1:
- (((protected OR conserved OR Indigenous) AND areas) OR OECM OR "other effective
area-based conservation measures" OR ITT OR "indigenous and traditional territories")
AND
- (NBSAP OR target OR (National AND ("Biodiversity Strategy"))) AND
- (regional OR national OR subnational OR marine OR interpretation OR interpret OR
implement OR implementation OR adapt OR adaptation OR translate OR translation governance
OR "decision-making" OR transboundary)
Set 3:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation))
Set 3.1A:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation)) AND
- (goal OR objective)
Set 3.1BCD:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation)) AND
- (concept OR principle)
Set 3.2CE:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation)) AND
- ("multi-criteria" OR "multi-objective" OR multicriteria OR (multiple AND (criteria
OR objective OR goal)))
Set 3.2D:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation)) AND
- (method OR tool OR approach OR software)
Set 3.2F:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- (spatial AND (planning OR prioritization OR prioritisation)) AND
- (inclusivity OR participation OR "co-management" OR "Indigenous knowledge" OR "traditional
ecological knowledge" OR ILK OR "local knowledge" OR "community-based restoration"
OR "stakeholder engagement" OR "social equity" OR justice)
Set 3.3:
- (ecology OR ecological OR biodiversity OR habitat OR ecosystem) AND
- (restoration OR rewilding) AND
- planning AND
- (indicator OR index OR metric OR objective)
Set 4:
- (conservation OR biodiversity OR "protected area" OR OECM OR reserve) AND
- spatial AND
- (planning OR prioritization OR prioritisation)
Set 4.1AB:
- (conservation OR biodiversity OR "protected area" OR OECM OR reserve) AND
- spatial AND
- (planning OR prioritization OR prioritisation) AND
- (concept OR principle)
Set 4.1CD:
- (conservation OR biodiversity OR "protected area" OR OECM OR reserve) AND
- spatial AND
- (planning OR prioritization OR prioritisation) AND
- (method OR tool OR approach OR software)
Set 4.2:
- (conservation OR biodiversity OR "protected area" OR OECM or reserve) AND
- (indicator OR index OR metric OR objective)
Set 5.1:
- (conservation OR biodiversity OR "protected area" OR OECM OR reserve) AND
- restoration AND
- spatial AND
- (planning OR prioritization OR prioritisation)
Set 5.2:
- ("adaptive management" OR "adaptive co-management" OR "adaptive comanagement" OR
"learning-based management" OR "iterative management") AND
- ("protected area" OR park OR reserve OR "conservation area" OR "biodiversity conservation"
OR "ecological restoration" OR "habitat restoration" OR "ecosystem restoration")
AND
- (planning OR implementation)
Chapter 4
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch4["<u><span style='color:#1a0dab;'>chapter_4.yaml<br/>Level 2 refinements</span></u>"]
click Ch4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"
subgraph Chapter4Sets["Chapter 4 searches"]
direction TB
C4_1["Set 1:<br/>Connectivity review articles<br/>(n = <<C4_1>>)"]
C4_2["Set 2:<br/>Connectivity benefits vs risks<br/>+ ecosystem services<br/>(n = <<C4_2>>)"]
C4_3["Set 3:<br/>Structural vs functional connectivity<br/>(n = <<C4_3>>)"]
C4_4["Set 4:<br/>Connectivity modelling toolkits<br/>(n = <<C4_4>>)"]
C4_5["Set 5:<br/>Connectivity indicators & metrics<br/>(n = <<C4_5>>)"]
C4_6["Set 6:<br/>Policy & governance integration<br/>(n = <<C4_6>>)"]
C4_7["Set 7:<br/>Multilevel / transboundary governance<br/>+ IPLC inclusion + land tenure<br/>(n = <<C4_7>>)"]
C4_8["Set 8:<br/>Movement ecology<br/>(dispersal / migration / permeability)<br/>(n = <<C4_8>>)"]
end
Ch4 --> C4_1
Ch4 --> C4_2
Ch4 --> C4_3
Ch4 --> C4_4
Ch4 --> C4_5
Ch4 --> C4_6
Ch4 --> C4_7
Ch4 --> C4_8
Search Terms
Click chapter_4.yaml to download
Show the code
params$search_terms$chapter_4 |>
yaml::as.yaml() |>
cat()Set 1: '"ecological connectivity"'
Set 2: ("ecological connectivity" OR "habitat connectivity" OR "landscape connectivity"
OR "wildlife corridor" OR "biological corridor") AND (benefits OR advantages OR
positive OR impacts OR opportunities) AND (risks OR drawbacks OR negative OR impacts
OR challenges) AND ("ecosystem services" OR "ecosystem management")
Set 3:
- '"structural connectivity" OR'
- '"functional connectivity"'
Set 4:
- '"connectivity analysis" OR'
- '"network analysis" OR'
- '"circuit theory" OR'
- '"least-cost path" OR'
- '"graph theory" OR'
- '"resistant kernels" OR'
- '"agent-based models" OR'
- Conefor OR
- '"pattern-oriented model" OR'
- '"state-space model" OR'
- '"corridor model" OR'
- '"simulated individual" OR'
- '"movement paths" OR'
- '"hidden Markov models" OR'
- '"effective connectivity" OR'
- '"gene flow"'
Set 5: '"ecological connectivity" AND (indicator OR index OR "metric*" OR objective)'
Set 6:
- ("ecological connectivity" OR "landscape connectivity" OR "functional connectivity"
OR "connectivity conservation") AND
- (policy OR framework OR governance OR "planning instrument" OR initiative OR agreement
OR global OR international OR "regional strategy" OR "transboundary cooperation"
OR "joint management" OR "cross-border conservation" OR "bioregional planning")
Set 7:
- ("ecological connectivity" OR "spatial governance") AND
- ("multi-level governance" OR "cross-scale governance" OR "transboundary governance")
AND
- ("inclusive governance" OR "community-based management" OR "co-management") AND
- ("Indigenous Peoples" OR "Local Communities" OR IPLCs) AND
- ("policy coherence" OR "cross-sectoral integration") AND
- ("land tenure" OR "property rights" OR "private land conservation")
Set 8:
- dispersal OR
- migration OR
- nomadism OR
- '"landscape permeability"'
Chapter 5
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch5L2["<u><span style='color:#1a0dab;'>chapter_5.yaml<br/>Level 2 foresight framing</span></u>"]
click Ch5L2 "./input/search_terms/chapter_5.yaml" "Open chapter_5.yaml"
subgraph L2Sets["Section 5.1–5.2 searches"]
direction TB
C5_1["Set 1:<br/>Future + project*/predict*/scenario<br/>(n = <<C5_1>>)"]
C5_2["Set 2:<br/>Future + pathway*/narrative*/vision*<br/>(n = <<C5_2>>)"]
C5_3["Set 3:<br/>Future-proof*/anticipat*/scenario planning<br/>(n = <<C5_3>>)"]
C5_4["Set 4:<br/>Foresight*/backcasting/simulat*/trend*<br/>(n = <<C5_4>>)"]
C5_5["Set 5:<br/>Model* AND scenario<br/>(n = <<C5_5>>)"]
end
Ch5L2 --> C5_1
Ch5L2 --> C5_2
Ch5L2 --> C5_3
Ch5L2 --> C5_4
Ch5L2 --> C5_5
subgraph L3Sets["Section 5.3 searches"]
direction TB
C5_3a["Set 1:<br/>Drivers of change<br/>(n = <<C5_3a>>)"]
C5_3b["Set 2:<br/>Driver modelling approaches<br/>(n = <<C5_3b>>)"]
C5_3c["Set 3:<br/>Driver gaps<br/>(n = <<C5_3c>>)"]
end
Ch5L2 --> C5_3a
Ch5L2 --> C5_3b
Ch5L2 --> C5_3c
subgraph L4Sets["Section 5.4 searches"]
direction TB
C5_4a["Set 1:<br/>Interactions (synergy/trade-off/nexus)<br/>(n = <<C5_4a>>)"]
C5_4b["Set 2:<br/>Response options (integrated planning / NbS)<br/>(n = <<C5_4b>>)"]
C5_4c["Set 3:<br/>Cross-scale synergy & trade-off terms<br/>(n = <<C5_4c>>)"]
end
Ch5L2 --> C5_4a
Ch5L2 --> C5_4b
Ch5L2 --> C5_4c
subgraph L5Sets["Section 5.5 searches"]
direction TB
C5_5a["Set 1:<br/>Adaptive / transformative management<br/>(n = <<C5_5a>>)"]
C5_5b["Set 2:<br/>Uncertainty quantification<br/>(n = <<C5_5b>>)"]
C5_5c["Set 3:<br/>Tipping points & thresholds<br/>(n = <<C5_5c>>)"]
C5_5d["Set 4:<br/>Cascading risks & precaution<br/>(n = <<C5_5d>>)"]
end
Ch5L2 --> C5_5a
Ch5L2 --> C5_5b
Ch5L2 --> C5_5c
Ch5L2 --> C5_5d
subgraph L6Sets["Section 5.6 searches"]
direction TB
C5_6a["Set 1:<br/>Science-policy-practice pathways<br/>(n = <<C5_6a>>)"]
C5_6b["Set 2:<br/>ILK integration & community planning<br/>(n = <<C5_6b>>)"]
C5_6c["Set 3:<br/>Enabling factors & coordination<br/>(n = <<C5_6c>>)"]
C5_6d["Set 4:<br/>Shocks, surprises, uncertainties<br/>(n = <<C5_6d>>)"]
end
Ch5L2 --> C5_6a
Ch5L2 --> C5_6b
Ch5L2 --> C5_6c
Ch5L2 --> C5_6d
subgraph CCSets["Cross-cutting searches"]
direction TB
CC1["Set 1:<br/>Scales & telecoupling<br/>(n = <<CC1>>)"]
CC2["Set 2:<br/>Co-production & inclusion<br/>(n = <<CC2>>)"]
end
Ch5L2 --> CC1
Ch5L2 --> CC2
Search Terms
Click chapter_5.yaml to download
Show the code
params$search_terms$chapter_5 |>
yaml::as.yaml() |>
cat()Sections 1 and 2:
Set 1: Future AND (projection OR projected OR predicted OR prediction OR forecast
OR scenario)
Set 2: Future AND (pathway OR narrative OR storyline OR foresight OR vision OR horizon
scan OR trajectory OR imagination)
Set 3:
- '"future-proof" OR'
- anticipate OR
- '"forward-looking" OR'
- '"futures thinking" OR'
- '"future-oriented" OR'
- prospective OR
- '"plausible future" OR'
- '"scenario planning"'
Set 4:
- Foresight OR
- backcasting OR
- simulate OR
- simulation OR
- '"delphi method" OR'
- storytelling OR
- '"environmental scan" OR'
- trend OR
- megatrend
Set 5: (model AND scenario)
Section 3:
Set 1:
- '"drivers of change" OR'
- '"biodiversity driver" OR'
- '"social-ecological driver" OR'
- '"technological driver" OR'
- '"perennial driver" OR'
- '"emerging driver" OR'
- '"cascading driver"'
Set 2:
- '"Integrated assessment" OR'
- '"land-use change model" OR'
- '"Scenario model" OR'
- '"Social-ecological model" OR'
- '"agent-based model" OR'
- '"telecoupled systems model" OR'
- '"hybrid model" OR'
- '"participatory model" OR'
- '"data-driven foresight model"'
Set 3:
- '"value-based driver" OR'
- '"compound driver" OR'
- '"interacting driver" OR'
- '"distant driver"'
Section 4:
Set 1:
- Synergy OR
- tradeoff OR
- '"trade-off" OR'
- nexus OR
- '"win-win" OR'
- '"cross-sectoral interaction" OR'
- '"co-benefit"'
Set 2:
- '"Integrated planning" OR'
- multifunctional OR
- '"nature-based solution" OR'
- '"adaptive governance" OR'
- '"cross-sectoral governance"'
Set 3:
- (Spatial OR temporal OR thematic OR "cross-scale") AND
- (Synergy OR tradeoff OR "trade-off" OR nexus OR "win-win")
Section 5:
Set 1:
- '"Adaptative management" OR'
- '"Adaptative governance" OR'
- '"Transformative adaptation" OR'
- '"Adaptive systems" OR'
- '"Adaptive foresight"'
Set 2:
- (Model OR data OR "decision-making under" OR planning OR scenario OR epistemic
OR ontological) AND
- uncertainty
Set 3:
- '"Tipping points" OR'
- thresholds OR
- '"Planetary boundaries" OR'
- '"Nonlinear system dynamics" OR'
- Surprise
Set 4:
- '"Cascading risk" OR'
- '"Risk management" OR'
- '"Environmental shocks" OR'
- '"Environmental risks" OR'
- '"Precautionary approach"'
Section 6:
Set 1:
- '"Science-policy-practice" OR'
- '"transformative pathways" OR'
- '"transdisciplinary co-production"'
Set 2:
- '"Knowledge co-production" OR'
- '"community-based spatial planning" OR'
- '"indigenous mapping" OR'
- '"traditional knowledge" OR'
- '"participatory scenario planning"'
Set 3:
- '"Multi-level governance" OR'
- '"institutional capacity" OR'
- '"cross-sectoral coordination"'
Set 4:
- '"Planning for uncertainty" OR'
- '"adaptive planning" OR'
- '"resilience planning" OR'
- '"anticipatory governance"'
Cross-cutting sets:
Set 1: ("Spatial scaling" OR "Temporal scaling" OR "Social scale" OR "Nested governance"
OR "Multi-scale planning" OR "Cross-scale interaction" OR Telecoupling OR Teleconnection
OR Metacoupling OR Spillover)
Set 2:
- ((Indigenous OR local OR ecological OR "co-production of") AND knowledge) OR
- pluralism OR
- epistemic OR
- '"Community-based" OR'
- Biocultural OR
- Customary OR
- tenure OR
- Participatory OR
- '"Cross-cultural" OR'
- '"knowledge integration" OR'
- ((Gender OR Social) AND Inclusion) OR
- '"Gender-responsive" OR'
- Intersectionality OR
- equity OR
- '"Women’s roles" OR'
- '"Women''s roles" OR'
- '"Women`s roles" OR'
- Gendered OR
- Empowerment OR
- '"capacity-building"'
Chapter 6
%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch6["<u><span style='color:#1a0dab;'>chapter_6.yaml<br/>Level 2 refinements</span></u>"]
click Ch6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"
subgraph Chapter6Sets["Chapter 6 searches"]
direction TB
C6_1["Set 1:<br/>Institutional & governance structures<br/>(n = <<C6_1>>)"]
C6_2["Set 2:<br/>Political & strategic leadership<br/>(n = <<C6_2>>)"]
C6_3["Set 3:<br/>Socio-cultural & stakeholder engagement<br/>(n = <<C6_3>>)"]
C6_4["Set 4:<br/>Collaboration, trust & networks<br/>(n = <<C6_4>>)"]
C6_5["Set 5:<br/>Financial & economic mechanisms<br/>(n = <<C6_5>>)"]
C6_6["Set 6:<br/>Legal & policy frameworks<br/>(n = <<C6_6>>)"]
C6_7["Set 7:<br/>Human & institutional capacity<br/>(n = <<C6_7>>)"]
C6_8["Set 8:<br/>Data, knowledge & decision support (8.1 + 8.2)<br/>(n = <<C6_8>>)"]
C6_9["Set 9:<br/>Ecological & spatial planning tools<br/>(n = <<C6_9>>)"]
C6_10["Set 10:<br/>Cross-cutting process enablers<br/>(n = <<C6_10>>)"]
end
Ch6 --> C6_1
Ch6 --> C6_2
Ch6 --> C6_3
Ch6 --> C6_4
Ch6 --> C6_5
Ch6 --> C6_6
Ch6 --> C6_7
Ch6 --> C6_8
Ch6 --> C6_9
Ch6 --> C6_10
Ch6R2["<u><span style='color:#1a0dab;'>chapter_6_r2.yaml<br/>Optional Level 3 filter</span></u>"]
Chapter6Sets --> Ch6R2
click Ch6R2 "./input/search_terms/chapter_6_r2.yaml" "Open chapter_6_r2.yaml"
subgraph Chapter6Case["Chapter 6 searches"]
R2["Case-study keywords<br/>(case stud*, example*, initiative*, etc.)"]
end
Ch6R2 --> R2
Search Terms
Click chapter_6.yaml to download
Show the code
params$search_terms$chapter_6 |>
yaml::as.yaml() |>
cat()Set 1:
- '"institutional arrangements" OR'
- '"governance structures" OR'
- '"cross-sector coordination" OR'
- '"multi-level governance" OR'
- '"inter-agency collaboration" OR'
- '"policy coherence" OR'
- '"environmental governance" OR'
- '"landscape governance" OR'
- '"seascape governance" OR'
- '"integrated landscape management"'
Set 2:
- '"political support" OR'
- '"environmental leadership" OR'
- '"ministerial alignment" OR'
- '"strategic prioritization" OR'
- '"national biodiversity strategy"'
Set 3:
- '"stakeholder engagement" OR'
- participation OR
- '"co-design" OR'
- '"co-production" OR'
- '"community-based management" OR'
- '"indigenous governance" OR'
- '"traditional knowledge" OR'
- '"Free Prior and Informed Consent" OR'
- FPIC OR
- '"stakeholder workshops" OR'
- '"stakeholder dialogues" OR'
- '"public consultation"'
Set 4:
- collaboration OR
- trust OR
- partnership OR
- '"multi-stakeholder platform" OR'
- coalition OR
- '"inter-organizational network" OR'
- cooperation
Set 5:
- '"biodiversity finance" OR'
- '"blended finance" OR'
- '"green finance" OR'
- '"conservation trust funds" OR'
- '"Payment of ecosystem services" OR'
- '"natural capital accounting" OR'
- '"biodiversity offsets"'
Set 6:
- '"environmental law" OR'
- legislation OR
- '"statutory framework" OR'
- '"policy instruments" OR'
- '"regulatory mechanisms" OR'
- '"strategic environmental assessment" OR'
- '"Environmental Impact Assessment"'
Set 7:
- '"institutional capacity" OR'
- '"technical expertise" OR'
- '"capacity building" OR'
- training OR
- '"professional development" OR'
- '"institutional strengthening" OR'
- '"workforce development" OR'
- education OR
- pipeline OR
- '"diversity and inclusion" OR'
- '"gender inequality" OR'
- '"girl’s education" OR'
- '"girl''s education" OR'
- '"girl`s education" OR'
- '"Indigenous knowledge" OR'
- '"generational knowledge" OR'
- '"institutional memory"'
Set 8.1:
- '"species distribution maps" OR'
- (("land cover" OR "protected area") AND data) OR
- '"Indigenous knowledge" OR'
- '"knowledge co-production" OR'
- '"knowledge and data management" OR'
- '"spatial data infrastructure" OR'
- ((CARE OR FAIR) AND principles) OR
- '"open science" OR'
- '"information delivery" OR'
- (data AND (standards OR stewardship OR "management plan" OR "sharing agreement"
OR archive OR repository OR structure)) OR
- metadata OR
- (quality AND (assurance OR control))
Set 8.2:
- '"monitoring and evaluation" OR'
- '"decision-support tools" OR'
- '"ecological model" OR'
- '"scenario planning and analysis" OR'
- ("systematic conservation planning" AND ("and model" OR tools)) OR
- '"biodiversity targets" OR'
- '"science communication" OR'
- '"science-practice gap" OR'
- '"participatory mapping and model" OR'
- '"scenario narratives" OR'
- '"evidence bridge" OR'
- '"boundary spanner and organization" OR'
- '"early adopter"'
Set 9:
- '"spatial planning" OR'
- '"landscape governance" OR'
- '"territorial integration" OR'
- '"land-use planning" OR'
- '"ecological connectivity" OR'
- '"ecological networks" OR'
- '"ecological corridors" OR'
- '"green infrastructure" OR'
- '"nature-based Strategic spatial planning solutions" OR'
- '"restoration planning" OR'
- '"blue infrastructure" OR'
- '"blue-green infrastructure" OR'
- '"spatial decision-making" OR'
- '"strategic spatial planning"'
Set 10:
- '"adaptive management" OR'
- '"feedback mechanisms" OR'
- '"monitoring and learning" OR'
- '"institutional innovation" OR'
- '"continuous improvement"'
Non implemented additional searches are:
- Click chapter_6_r2.yaml to download
Type Selsection
OpenAlex contains more then 270 million works of different types. The following table shows and explains the available types and highlights which are selected to be included in the SPC Corpus.
Show the code
params$types |>
knitr::kable(
caption = "OpenAlex Work Types and Inclusion in the SPC Corpus",
booktabs = TRUE,
align = c("l", "l", "l", "c")
) # |>| Type | Description | Included |
|---|---|---|
| article | Scholarly journal articles and related periodical works | TRUE |
| book | Monographs and other long-form published books | TRUE |
| book-chapter | Chapters published within edited books or proceedings | TRUE |
| dissertation | Doctoral or master level theses and dissertations | TRUE |
| editorial | Editorials and editor introductions | TRUE |
| preprint | Pre-publication manuscripts shared prior to peer review | TRUE |
| report | Technical, institutional, or policy reports | TRUE |
| review | Narrative or systematic review articles | TRUE |
| dataset | Published datasets and structured data releases | FALSE |
| erratum | Published corrections to previously released works | FALSE |
| grant | Summaries or descriptions of grant-funded projects | FALSE |
| letter | Correspondence, commentaries, and short letters | FALSE |
| libguides | Library research guides and curated bibliographies | FALSE |
| other | Works that do not align with a more specific OpenAlex type | FALSE |
| paratext | Prefaces, introductions, indexes, and other paratextual items | FALSE |
| peer-review | Formal peer review reports and evaluations | FALSE |
| reference-entry | Encyclopaedia or dictionary reference entries | FALSE |
| retraction | Notices retracting previously published works | FALSE |
| standard | Standards, protocols, and technical specifications | FALSE |
| supplementary-materials | Supplementary files accompanying primary publications | FALSE |
Show the code
# kableExtra::kable_styling(
# full_width = FALSE,
# position = "left"
# )Methods
SPC Corpus
Assess of Individual Terms in spc and nature search terms
This assessment is done on the whole of the OpenAlex corpus and only filtered for types and not for the date range.
Show the code
fn <- file.path(params$output_dir, "searchterm_assessment_spcc.rds")
if (!file.exists(fn)) {
result <- list(
spc = assess_search_term_both(
st = params$search_terms$spc_corpus$spc,
and_term = st_compact(params$search_terms$spc_corpus$spc_corpus$nature),
types = params$types_filter,
verbose = TRUE
),
nature = assess_search_term_both(
st = params$search_terms$spc_corpus$nature,
and_term = st_compact(params$search_terms$spc_corpus$spc_corpus$spc),
types = params$types_filter,
verbose = TRUE
)
) |>
saveRDS(fn)
}Get Key Paper
Here we get key papers in a parquet database which is partitioned by:
found_in: the search term or openalex which is used as the filter, i.e. the key paper occurs in corpus which would result from the search termid_used: the id used to testing,m either the OpenAlex id (id) or the doi (doi)page: only for processing reasons
No filtering, neither by type nor by publication year is done.
The other columns are as returned by the OpenAlex API.
Show the code
#|
dois <- params$key_papers$goldstandard$DOI[
params$key_papers$goldstandard$DOI != ""
]
ids <- params$key_papers$goldstandard$openalex_id[
params$key_papers$goldstandard$openalex_id != ""
]Show the code
#|
fn <- file.path(params$keyworks, "parquet", "found_in=openalex")
if (!dir.exists(fn)) {
### KP in OpenAlex
openalexPro::pro_query(
doi = dois,
chunk_limit = 50
) |>
openalexPro::pro_request(
output = file.path(fn, "..", "json_doi")
) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "..", "jsonl_doi"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=doi"),
delete_input = TRUE
)
openalexPro::pro_query(
id = ids,
multiple_id = TRUE,
chunk_limit = 50
) |>
openalexPro::pro_request(
output = file.path(fn, "..", "json_oa_id")
) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "..", "jsonl_oa_id"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=oa_id"),
delete_input = TRUE
)
}Show the code
#|
fn <- file.path(params$keyworks, "parquet", "found_in=spc")
if (!dir.exists(fn)) {
openalexPro::pro_query(
title_and_abstract.search = st$spc,
doi = dois,
chunk_limit = 25
) |>
openalexPro::pro_request(
output = file.path(fn, "..", "json_doi")
) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "..", "jsonl_doi"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=doi"),
delete_input = TRUE
)
openalexPro::pro_query(
title_and_abstract.search = st$spc,
id = ids,
multiple_id = TRUE,
chunk_limit = 25
) |>
openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "jsonl_oa_id"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=oa_id"),
delete_input = TRUE
)
}Show the code
#|
fn <- file.path(params$keyworks, "parquet", "found_in=nature")
if (!dir.exists(fn)) {
### KP in nature
openalexPro::pro_query(
title_and_abstract.search = st$nature,
doi = dois,
chunk_limit = 25
) |>
openalexPro::pro_request(output = file.path(fn, "json_doi")) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "jsonl_doi"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=doi"),
delete_input = TRUE
)
openalexPro::pro_query(
title_and_abstract.search = st$nature,
id = ids,
multiple_id = TRUE,
chunk_limit = 25
) |>
openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "jsonl_oa_id"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=oa_id"),
delete_input = TRUE
)
}Show the code
#|
fn <- file.path(params$keyworks, "parquet", "found_in=spcc")
if (!dir.exists(fn)) {
### KP in spcc
openalexPro::pro_query(
title_and_abstract.search = st$spcc,
doi = params$key_papers$goldstandard$DOI[
params$key_papers$goldstandard$DOI != ""
],
chunk_limit = 15
) |>
openalexPro::pro_request(output = file.path(fn, "json_doi")) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "jsonl_doi"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=doi"),
delete_input = TRUE
)
openalexPro::pro_query(
title_and_abstract.search = st$spcc,
id = params$key_papers$goldstandard$openalex_id[
params$key_papers$goldstandard$openalex_id != ""
],
multiple_id = TRUE,
chunk_limit = 25
) |>
openalexPro::pro_request(output = file.path(fn, "json_oa_id")) |>
openalexPro::pro_request_jsonl(
output = file.path(fn, "jsonl_oa_id"),
delete_input = TRUE
) |>
openalexPro::pro_request_jsonl_parquet(
output = file.path(fn, "id_used=oa_id"),
delete_input = TRUE
)
}Keypaper in Search Terms
The in the previous step retrieved works are analysed here to get a table which shows where the key paper occur.
Show the code
fn <- file.path(params$keyworks, "kp_found_in.rds")
if (!file.exists(fn)) {
arrow::open_dataset(file.path(params$keyworks, "parquet")) |>
dplyr::select(
id,
doi,
type,
found_in,
title,
citation
) |>
dplyr::group_by(id, doi, title, citation, type) |>
dplyr::summarise(
in_openalex = base::max(found_in == "openalex", na.rm = TRUE),
in_spc = base::max(found_in == "spc", na.rm = TRUE),
in_nature = base::max(found_in == "nature", na.rm = TRUE),
in_spcc = base::max(found_in == "spcc", na.rm = TRUE),
.groups = "drop"
) |>
dplyr::collect() |>
saveRDS(fn)
}Get Numbers from OpenAlex of the Search Terms
These data is gathered from OpenAlex directly, not downloaded any works. The data is used to assess the quality of the TCA Corpus.
The query contains: - the search term (nature, spc, spcc) - the types selected (article, book, book-chapter, dissertation, editorial, preprint, report, review) - the date range (from 1992-01-01 to 2025-12-31)
The following counts are retrieved:
Overall hits
Show the code
#|
fn <- file.path(params$corpus, "st_hits.rds")
if (!file.exists(fn)) {
queries <- lapply(
st,
function(s) {
openalexPro::pro_query(
title_and_abstract.search = s,
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to
)
}
)
queries$openalex <- openalexPro::pro_query(
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to,
)
results <- pbapply::pblapply(
queries,
function(query) {
query |>
openalexPro::pro_request(
count_only = TRUE,
verbose = TRUE
)
}
) |>
dplyr::bind_rows() |>
dplyr::select(count)
rownames(results) <- names(queries)
saveRDS(results, file = fn)
}TODO Counts per Language
THIS NEEDS TO BE DEBUGGED - NOT WORKING ANYMORE!!!
Show the code
#|
fn <- file.path(params$corpus, "st_languages.rds")
if (!file.exists(fn)) {
queries <- lapply(
st,
function(s) {
openalexPro::pro_query(
title_and_abstract.search = s,
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to,
group_by = "language"
)
}
)
queries$openalex <- openalexPro::pro_query(
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to,
group_by = "language"
)
pbapply::pblapply(
queries,
function(query) {
query |>
openalexR::oa_request(
verbose = TRUE
) |>
dplyr::bind_rows()
}
) |>
dplyr::bind_rows(.id = "source") |>
dplyr::select(source, language = key_display_name, count) |>
tidyr::pivot_wider(
names_from = source,
values_from = count,
names_prefix = "count_",
values_fn = list(count = sum),
values_fill = list(count = 0)
) |>
dplyr::select(
language,
count_openalex,
count_spc,
count_nature,
count_spcc
) |>
dplyr::arrange(desc(count_openalex)) |>
saveRDS(file = fn)
}Counts per Publication Year
Show the code
fn <- file.path(params$corpus, "st_years.rds")
if (!file.exists(fn)) {
queries <- lapply(
st,
function(s) {
openalexPro::pro_query(
title_and_abstract.search = s,
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to,
group_by = "publication_year"
)
}
)
queries$openalex <- openalexPro::pro_query(
type = params$types_filter,
from_publication_date = params$publication_date$from,
to_publication_date = params$publication_date$to,
group_by = "publication_year"
)
result <- pbapply::pblapply(
queries,
function(query) {
query |>
openalexR::oa_request(
verbose = TRUE
) |>
dplyr::bind_rows()
}
) |>
dplyr::bind_rows(.id = "source") |>
dplyr::select(source, year = key, count) |>
dplyr::mutate(year = base::as.integer(year)) |>
tidyr::pivot_wider(
names_from = source,
values_from = count,
names_prefix = "count_",
values_fn = list(count = sum),
values_fill = list(count = 0)
) |>
dplyr::select(
year,
count_openalex,
count_spc,
count_nature,
count_spcc
) |>
dplyr::arrange(dplyr::desc(year)) |>
saveRDS(file = fn)
}Chapter 1
Show the code
# params$search_terms$chapter_1
fn <- file.path(params$chapter_1, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L1(
sets = params$search_terms$chapter_1,
types_filter = NULL, #params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc
) |>
saveRDS(file = fn)
}Due to length limitations of the API call, the initial download is done without the types and to_publication_date filter (parquet folder) and afterwards filtered using the types filter (corpus directory).
Show the code
corpus_dir <- file.path(params$chapter_1, "corpus.openalex_pro", "corpus")
if (!dir.exists(corpus_dir)) {
fetch_corpus(
project_dir = file.path(params$chapter_1, "corpus.openalex_pro"),
search_terms = params$search_terms$chapter_1,
st_spcc = st$spcc,
publication_date = params$publication_date,
types_filter = params$types_filter,
workers = 8
)
}Show the code
fn <- file.path(
params$chapter_1,
"corpus.openalex_pro",
"csl_json"
)
if (!file.exists(fn)) {
sets <- list.files(
file.path(
params$chapter_1,
"corpus.openalex_pro",
"corpus"
),
full.names = TRUE,
recursive = FALSE
)
names(sets) <- sets |>
basename() |>
utils::URLdecode() |>
gsub(
pattern = "page=",
replacement = ""
)
samples <- lapply(
seq_along(sets),
function(part) {
message("Converting ", names(sets)[[part]], " ...")
openalexConvert::corpus_to_csljson(
corpus = sets[[part]],
output = sets[[part]] |>
dirname() |>
dirname() |>
file.path(
"csl_json",
names(sets)[[part]]
),
chunk_size = params$csljson_batch_size,
verbose = TRUE
)
}
)
}Show the code
fn <- file.path(
params$chapter_1,
"corpus.openalex_pro",
"log_export_sets.csv"
)
if (!file.exists(fn)) {
export_sets(
project_dir = file.path(params$chapter_1, "corpus.openalex_pro"),
select = c(
"id",
"doi",
"title",
"publication_year",
"citation",
"abstract",
"is_retracted",
"language",
"type",
"cited_by_count",
##
"primary_topic$id",
# "primary_topic$display_name",
"primary_topic$score",
"primary_topic$subfield$id",
"primary_topic$subfield$display_name",
"primary_topic$field$id",
"primary_topic$field$display_name",
"primary_topic$domain$id",
"primary_topic$domain$display_name"
## Only Chapter 2,
# "sustainable_development_goals",
)
)
}[1] "./spc_corpus/output/chapter_1/corpus.openalex_pro/log_export_sets.csv"
Chapter 2
Only works with identified at least one SDG are returned.
Show the code
fn <- file.path(params$chapter_2, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L1(
sets = params$search_terms$chapter_2,
types_filter = params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc,
sustainable_development_goals.idAND = "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17"
) |>
saveRDS(file = fn)
}Show the code
fns <- c(
"./spc_corpus/output/chapter_2/corpus.openalex_pro/corpus"
)
recalc <- !(all(
fns %in%
(file.path(params$chapter_2, "corpus.openalex_pro") |>
list.dirs(recursive = FALSE) |>
grepv(pattern = "corpus.openalex_pro/corpus"))
))
if (recalc) {
unlink(fns, recursive = TRUE)
fetch_corpus(
project_dir = file.path(params$chapter_2, "corpus.openalex_pro"),
search_terms = params$search_terms$chapter_2,
st_spcc = st$spcc,
publication_date = params$publication_date,
types_filter = params$types_filter,
sustainable_development_goals.idAND = "1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17",
workers = 2 # params$mc.cores
)
## Prepare Set 1 corpus
dst <- file.path(params$chapter_2, "corpus.openalex_pro", "corpus_Set_1")
dir.create(dst, recursive = TRUE, showWarnings = FALSE)
for (f in c(
"page=Set%201.1",
"page=Set%201.2",
"page=Set%201.3",
"page=Set%201.4"
)) {
src <- file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus",
f
)
file.copy(src, dst, recursive = TRUE)
}
## Prepare Set 2 corpus
dst <- file.path(params$chapter_2, "corpus.openalex_pro", "corpus_Set_2")
dir.create(dst, recursive = TRUE, showWarnings = FALSE)
for (f in c("page=Set%202.1", "page=Set%202.2")) {
src <- file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus",
f
)
file.copy(src, dst, recursive = TRUE)
}
}Show the code
fns <- c(
"./spc_corpus/output/chapter_2/corpus.openalex_pro/corpus_set_deduped"
)
recalc <- !(all(
fns %in%
(file.path(params$chapter_2, "corpus.openalex_pro") |>
list.dirs(recursive = FALSE) |>
grepv(pattern = "corpus.openalex_pro/corpus"))
))
if (recalc) {
fns <- c(
fns,
"spc_corpus/output/chapter_2/corpus.openalex_pro/corpus_Set_1_deduped",
"spc_corpus/output/chapter_2/corpus.openalex_pro/corpus_Set_2_deduped"
)
unlink(fns, recursive = TRUE)
## dedupe Set 1 and Set 2
# dedupe_corpus(
# project_dir = file.path(params$chapter_2, "corpus.openalex_pro"),
# corpus_name = "corpus",
# corpus_deduped_name = "corpus_deduped"
# )
dedupe_corpus(
project_dir = file.path(params$chapter_2, "corpus.openalex_pro"),
corpus_name = "corpus_Set_1",
corpus_deduped_name = "corpus_Set_1_deduped"
)
dedupe_corpus(
project_dir = file.path(params$chapter_2, "corpus.openalex_pro"),
corpus_name = "corpus_Set_2",
corpus_deduped_name = "corpus_Set_2_deduped"
)
## Combine Sets into one corpus_set
dir.create(file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set"
))
file.rename(
from = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_Set_1"
),
to = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set",
"set=Set%201"
)
)
file.rename(
from = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_Set_2"
),
to = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set",
"set=Set%202"
)
)
## Combine deduped sets into one corpus_set_deduped
dir.create(file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set_deduped"
))
file.rename(
from = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_Set_1_deduped"
),
to = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set_deduped",
"set=Set%201"
)
)
file.rename(
from = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_Set_2_deduped"
),
to = file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set_deduped",
"set=Set%202"
)
)
}Show the code
dn <- file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_final"
)
if (!dir.exists(dn)) {
arrow::open_dataset(
file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_set_deduped"
)
) |>
dplyr::select(
id,
doi,
citation,
publication_year,
title,
abstract,
type,
language,
open_access,
primary_location,
sustainable_development_goals
) |>
dplyr::collect() |>
# First, count occurrences of each idid
dplyr::add_count(
id,
name = "n_occurrences"
) |>
# Filter to only duplicated ids
dplyr::filter(
n_occurrences > 1
) |>
# Optionally remove the count column
dplyr::select(
-n_occurrences
) |>
# Keep only one record per id
dplyr::distinct(
id,
.keep_all = TRUE
) |>
# Arrange by id to see duplicates together
dplyr::arrange(id) |>
## Extract oa_status, journal and SDGs with score
dplyr::mutate(
oa_status = open_access$oa_status,
journal = primary_location$source$display_name,
) |>
arrow::write_dataset(
format = "parquet",
path = dn,
partitioning = "publication_year"
)
}Show the code
fn <- file.path(
params$chapter_2,
"corpus_final.csv"
)
if (!file.exists(fn)) {
dat <- file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_final"
) |>
arrow::open_dataset() |>
dplyr::collect() |>
dplyr::select(-primary_location, -open_access) |>
tidyr::unnest(
sustainable_development_goals,
keep_empty = TRUE,
names_sep = "_"
) |>
dplyr::rename(
sdg_name = sustainable_development_goals_display_name,
sdg_score = sustainable_development_goals_score,
sdg_id = sustainable_development_goals_id
) |>
dplyr::group_by(id) |>
dplyr::mutate(sdg_num = dplyr::row_number()) |>
dplyr::ungroup() |>
tidyr::pivot_wider(
names_from = sdg_num,
values_from = c(sdg_name, sdg_score, sdg_id),
names_glue = "sdg_{sdg_num}_{.value}"
)
write.csv(dat, fn)
fn_xlsx <- gsub(".csv", ".xlsx", fn)
writexl::write_xlsx(dat, fn_xlsx)
}Chapter 3
Show the code
fn <- file.path(params$chapter_3, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L1(
sets = params$search_terms$chapter_3,
types_filter = params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc
) |>
saveRDS(file = fn)
}Due to length limitations of the API call, the initial download is done without the types and to_publication_date (parquet folder) and afterwards filtered using the types filter (corpus directory).
Show the code
corpus_dir <- file.path(params$chapter_3, "corpus.openalex_pro", "corpus")
if (!dir.exists(corpus_dir)) {
fetch_corpus(
project_dir = file.path(params$chapter_3, "corpus.openalex_pro"),
search_terms = params$search_terms$chapter_3,
st_spcc = st$spcc,
publication_date = params$publication_date,
types_filter = params$types_filter,
workers = 8
)
}Show the code
fn <- file.path(
params$chapter_3,
"corpus.openalex_pro",
"csl_json"
)
if (!file.exists(fn)) {
sets <- list.files(
file.path(
params$chapter_3,
"corpus.openalex_pro",
"corpus"
),
full.names = TRUE,
recursive = FALSE
)
names(sets) <- sets |>
basename() |>
utils::URLdecode() |>
gsub(
pattern = "page=",
replacement = ""
)
samples <- lapply(
seq_along(sets),
function(part) {
message("Converting ", names(sets)[[part]], " ...")
openalexConvert::corpus_to_csljson(
corpus = sets[[part]],
output = sets[[part]] |>
dirname() |>
dirname() |>
file.path(
"csl_json",
names(sets)[[part]]
),
chunk_size = params$csljson_batch_size,
verbose = TRUE
)
}
)
}Show the code
fn <- file.path(
params$chapter_3,
"corpus.openalex_pro",
"log_export_sets.csv"
)
if (!file.exists(fn)) {
export_sets(
project_dir = file.path(params$chapter_3, "corpus.openalex_pro"),
select = c(
"id",
"doi",
"title",
"publication_year",
"citation",
"abstract",
"is_retracted",
"language",
"type",
"cited_by_count",
##
"primary_topic$id",
# "primary_topic$display_name",
"primary_topic$score",
"primary_topic$subfield$id",
"primary_topic$subfield$display_name",
"primary_topic$field$id",
"primary_topic$field$display_name",
"primary_topic$domain$id",
"primary_topic$domain$display_name"
## Only Chapter 2,
# "sustainable_development_goals",
)
)
}[1] "./spc_corpus/output/chapter_3/corpus.openalex_pro/log_export_sets.csv"
Chapter 4
Show the code
fn <- file.path(params$chapter_4, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L1(
sets = params$search_terms$chapter_4,
types_filter = params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc
) |>
saveRDS(file = fn)
}Chapter 5
Show the code
fn <- file.path(params$chapter_5, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L2(
sets = params$search_terms$chapter_5,
types_filter = params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc
) |>
saveRDS(file = fn)
}Chapter 6
Show the code
fn <- file.path(params$chapter_6, "st_hits.rds")
if (!file.exists(fn)) {
get_count_L1(
sets = params$search_terms$chapter_6,
types_filter = params$types_filter,
publication_year_from = params$publication_date$from,
publication_year_to = params$publication_date$to,
st_AND = st$spcc
) |>
saveRDS(file = fn)
}Results
SPC Corpus
Assessment of Search Terms
The individual terms are assessed with the second term as AND, e,g. each individual term in spc is assessed with AND nature. In addition,
SPC Term
Show the code
readRDS(file.path(params$output, "searchterm_assessment_spcc.rds"))$spc |>
dplyr::arrange(desc(count)) |>
dplyr::mutate(
count = format(count, big.mark = ","),
count_excl = format(count_excl, big.mark = ","),
) |>
knitr::kable(format = "html", escape = FALSE)| term | count | count_excl |
|---|---|---|
| (planning AND ("for ecosystem services" OR process OR scenario OR tools)) | 1,221,968 | 744,079 |
| (scenario AND (analysis OR "based model" OR "based planning" OR building OR planning OR thinking OR "and models" OR "of land use")) | 1,026,806 | 703,275 |
| (spatial AND (composition OR configuration OR "conservation prioritisation" OR "conservation prioritization" OR decision OR development OR "forest planning" OR governance OR planning OR prioritisation OR prioritization OR transformation)) | 770,979 | 550,644 |
| ((anticipatory OR "community based" OR "forest management" OR "land-sea" OR participatory OR "place based" OR regional OR sectorial OR territorial OR urban OR "agricultural management") AND planning) | 665,609 | 323,157 |
| connectivity | 556,389 | 504,070 |
| restoration | 545,919 | 483,532 |
| (("land use" OR "sea use" OR marine) AND (decision OR planning OR governance OR management OR model OR scenario OR trade-offs OR tradeoffs)) | 457,807 | 239,564 |
| (land AND (allocation OR governance OR system)) | 383,908 | 238,410 |
| (adaptive AND (management OR planning)) | 363,907 | 235,182 |
| (conservation AND (practice OR planning OR program OR strategy)) | 282,871 | 162,528 |
| (("key biodiversity" OR protected OR "remote ocean") AND areas) | 265,919 | 190,692 |
| (landscape AND (complexity OR planning OR governance OR management OR "ecological planning")) | 234,211 | 107,275 |
| ((integrative OR "trends and") AND scenarios) | 198,464 | 54,153 |
| (animal AND (migration OR movement)) | 88,083 | 75,793 |
| (("cumulative impact" OR "environmental impact" OR "strategic environmental") AND assessment) | 70,944 | 51,347 |
| ((functional OR working) AND landscapes) | 69,190 | 40,190 |
| (ecological AND (corridor OR networks)) | 62,327 | 35,913 |
| zoning | 56,775 | 40,046 |
| (biodiversity AND (assessment OR indicators OR scenario)) | 56,511 | 23,042 |
| "systems integration" | 53,021 | 45,926 |
| ((blue OR green) AND infrastructure) | 40,701 | 24,977 |
| ("ecosystem service" AND (mapping OR model OR planning)) | 32,708 | 7,422 |
| ((inclusive OR marine) AND governance) | 26,940 | 13,492 |
| "stepping stones" | 18,549 | 16,027 |
| (nature AND ("based solutions" OR futures)) | 17,758 | 12,201 |
| (integrated AND ("assessment framework" OR "assessment model" OR "coastal zone management")) | 11,695 | 6,581 |
| ((habitat OR wildlife) AND corridor) | 10,691 | 3,050 |
| (("ecosystem based" OR "sea use") AND management) | 7,663 | 2,586 |
| "multi-criteria decision analysis" | 7,006 | 4,797 |
| rewilding | 2,223 | 1,494 |
| IPBES | 1,284 | 714 |
| (("generalized dissimilarity" OR macroecological) AND model) | 1,258 | 720 |
| "reserve design" | 806 | 321 |
| "futures thinking" | 678 | 463 |
| OECM | 374 | 229 |
| "critical areas for biodiversity" | 20 | 8 |
Nature Term
Show the code
readRDS(file.path(params$output, "searchterm_assessment_spcc.rds"))$nature |>
dplyr::arrange(desc(count)) |>
dplyr::mutate(
count = format(count, big.mark = ","),
count_excl = format(count_excl, big.mark = ","),
) |>
knitr::kable(format = "html", escape = FALSE)| term | count | count_excl |
|---|---|---|
| environment | 6,833,509 | 4,913,689 |
| species | 4,751,451 | 2,918,991 |
| nature | 4,039,424 | 3,075,191 |
| sustainable | 3,442,154 | 2,374,580 |
| soil | 2,216,293 | 1,361,726 |
| sea | 1,450,752 | 794,057 |
| forest | 1,209,167 | 560,348 |
| river | 1,168,420 | 606,588 |
| ecological | 1,095,869 | 335,775 |
| landscape | 1,028,229 | 562,399 |
| conservation | 994,246 | 427,872 |
| Earth | 972,889 | 615,926 |
| ecosystem | 965,798 | 220,529 |
| marine | 881,662 | 368,791 |
| ocean | 762,961 | 334,620 |
| habitat | 656,908 | 136,469 |
| coastal | 575,714 | 181,793 |
| lake | 574,824 | 306,679 |
| restoration | 545,919 | 355,642 |
| territories | 542,695 | 330,802 |
| mountain | 502,009 | 244,257 |
| coast | 481,719 | 189,720 |
| biodiversity | 411,869 | 128,639 |
| terrestrial | 320,470 | 100,829 |
| ((protected OR conserved) AND areas) | 304,378 | 106,052 |
| ((agricultural OR arable) AND land) | 290,583 | 82,479 |
| freshwater | 254,644 | 76,852 |
| planet | 235,789 | 121,099 |
| flora | 234,317 | 116,580 |
| fauna | 212,001 | 58,114 |
| maritime | 182,472 | 104,186 |
| plantation | 176,844 | 77,142 |
| desert | 169,601 | 85,063 |
| wildlife | 166,431 | 46,816 |
| wetland | 165,876 | 54,185 |
| grassland | 139,600 | 32,674 |
| estuary | 112,667 | 30,843 |
| bog | 76,634 | 56,321 |
| marshes | 73,495 | 27,845 |
| "natural resource" | 69,697 | 25,425 |
| meadow | 59,903 | 16,627 |
| woodland | 59,176 | 14,186 |
| biosphere | 51,995 | 13,062 |
| savanna | 32,798 | 9,147 |
| "coupled system" | 32,262 | 26,300 |
| dryland | 28,935 | 10,149 |
| peatland | 23,295 | 8,628 |
| tundra | 20,690 | 4,786 |
| mires | 19,964 | 12,251 |
| fjord | 16,080 | 6,333 |
| shrubland | 12,716 | 1,167 |
| bioeconomy | 10,280 | 4,616 |
| "resource system" | 6,013 | 3,227 |
| seascape | 5,065 | 1,161 |
| heathland | 4,034 | 794 |
| marshland | 3,802 | 870 |
| chaparral | 3,057 | 1,193 |
| "environmental resource" | 2,538 | 817 |
| agroforest | 1,834 | 328 |
| "agro-forest" | 567 | 0 |
Keypaper in Corpus
No filtering, neither by type nor by publication year is done. Therefore, the pure search terms are evaluated. If a paper is included in this table, doex not mean it is included in the final SPC Corpus due to filtering by dates and types!
Show the code
readRDS(file.path(params$keyworks, "kp_found_in.rds")) |>
dplyr::mutate(
id_display = sub("^.*/(W[0-9]+)$", "\\1", id),
id = sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", id, id_display),
doi_display = sub("^https://doi.org/", "\\1", doi),
doi = sprintf("<a href=\"%s\" target=\"_blank\">%s</a>", doi, doi_display)
) |>
dplyr::arrange(
in_spcc,
in_spc,
in_nature,
in_openalex
) |>
dplyr::mutate(
dplyr::across(
dplyr::starts_with("in_"),
~ dplyr::case_when(
.x ~ '<b style="color:#008000;">☑</b>', # green bold checkbox
!.x ~ '<b style="color:#cc0000;">☐</b>' # red bold empty checkbox
)
)
) |>
dplyr::select(
id,
doi,
citation,
in_spcc,
in_spc,
in_nature,
in_openalex
) |>
knitr::kable(format = "html", escape = FALSE)| id | doi | citation | in_spcc | in_spc | in_nature | in_openalex |
|---|---|---|---|---|---|---|
| W2795786882 | 10.1007/s00267-018-1028-3 | Ida N.S. Djenontin & Alison M. Meadow (2018) | ☐ | ☐ | ☐ | ☑ |
| W2128217744 | 10.1177/0306312713508669 | David H. Guston (2013) | ☐ | ☐ | ☐ | ☑ |
| W3170399214 | 10.1016/j.mex.2021.101401 | Daniel Beiderbeck et al. (2021) | ☐ | ☐ | ☐ | ☑ |
| W2964311550 | 10.1016/j.techfore.2019.07.002 | Ian Belton et al. (2019) | ☐ | ☐ | ☐ | ☑ |
| W4233598570 | 10.1146/annurev-anthro-102218-011435 | David Valentine & Amelia Hassoun (2019) | ☐ | ☐ | ☐ | ☑ |
| W2056591496 | 10.1016/s0016-3287(98)00101-3 | Richard A. Slaughter (1998) | ☐ | ☐ | ☐ | ☑ |
| W2090312322 | 10.1016/j.futures.2007.11.010 | Joseph Voros (2007) | ☐ | ☐ | ☐ | ☑ |
| W4414957974 | 10.1073/pnas.2501695122 | Damaris Zurell et al. (2025) | ☐ | ☐ | ☑ | ☑ |
| W2910481941 | 10.1080/02513625.2018.1562795 | Peter Schmitt & Thorsten Wiechmann (2018) | ☐ | ☑ | ☐ | ☑ |
| W4407294089 | 10.1080/02697459.2025.2459975 | Romina Rodela (2025) | ☐ | ☑ | ☐ | ☑ |
| W2116090915 | 10.1016/j.futures.2012.10.003 | Muhammad Amer et al. (2012) | ☐ | ☑ | ☐ | ☑ |
| W2057938345 | 10.1108/14636680810855991 | Sohail Inayatullah (2008) | ☐ | ☑ | ☐ | ☑ |
| W1973628253 | 10.1016/j.enpol.2005.12.006 | Will McDowall & Malcolm Eames (2006) | ☐ | ☑ | ☐ | ☑ |
| W4238224782 | 10.1016/j.futures.2015.08.007 | I. Milojević & Sohail Inayatullah (2015) | ☐ | ☑ | ☐ | ☑ |
| W1992974326 | 10.1016/j.futures.2007.11.011 | Richard A. Slaughter (2007) | ☐ | ☑ | ☐ | ☑ |
| W1990273831 | 10.1126/science.1242552 | Silke Bauer & Bethany J. Hoye (2014) | ☑ | ☑ | ☑ | ☑ |
| W2784805535 | 10.1126/science.aam9712 | Marlee A. Tucker et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W3085078608 | 10.1038/s41467-020-18457-x | Michelle Ward et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W4281717750 | 10.1126/science.abl8974 | Angela Brennan et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W1880093763 | 10.1111/ecog.01507 | Rafael A. Magris et al. (2015) | ☑ | ☑ | ☑ | ☑ |
| W2783683111 | 10.1016/j.biocon.2017.12.020 | Santiago Saura et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W2791599583 | 10.1111/conl.12439 | Rafael A. Magris et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W4297536966 | 10.1016/j.tree.2022.09.002 | Maria Beger et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W2965201645 | 10.1016/j.biocon.2019.07.028 | Santiago Saura et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W3132073286 | 10.1016/j.biocon.2021.109008 | Annika T. H. Keeley et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4390696637 | 10.1038/s41467-023-43832-9 | Rachel Neugarten et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W4302293680 | 10.1111/csp2.12823 | David M. Theobald et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W4387055605 | 10.1038/s44183-023-00022-w | Julie Reimer et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W4402144060 | 10.1002/ece3.70231 | Amanda Liczner et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W4412704230 | 10.1073/pnas.2410937122 | Robin Naidoo et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4280541891 | 10.3389/fevo.2022.830822 | Sylvia Wood et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W4392367143 | 10.1111/brv.13066 | Steven J. Cooke et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W4410131928 | 10.3354/meps14888 | Susanne E. Tanner et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4413449508 | 10.1038/s41467-025-63205-8 | Jedediah F. Brodie et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4414925393 | 10.1016/j.tree.2025.09.007 | Sandra Neubert et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4415240687 | 10.1007/s10980-025-02210-0 | Tamsin L. Woodman et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W2255223904 | NA | Bob Scholes (2010) | ☑ | ☑ | ☑ | ☑ |
| W2978599153 | 10.26190/unsworks/27456 | Peter H. Verburg et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W2035832288 | 10.1007/s10980-014-0085-0 | Christian Albert et al. (2014) | ☑ | ☑ | ☑ | ☑ |
| W3200717663 | 10.1007/s10980-021-01329-0 | Jianquan Dong et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W2604803374 | 10.1093/biosci/bix012 | Charles H. Nilon et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W4220936177 | 10.1016/j.oneear.2022.02.008 | Christopher M. Raymond et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W2612157793 | 10.1016/j.marpol.2017.06.020 | Mara Ntona & Elisa Morgera (2017) | ☑ | ☑ | ☑ | ☑ |
| W2766457534 | 10.1016/j.landusepol.2017.10.017 | Chiara Cortinovis & Davide Geneletti (2017) | ☑ | ☑ | ☑ | ☑ |
| W2999493939 | 10.1016/j.landurbplan.2019.103741 | Christian Albert et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W2804302736 | 10.1016/j.scitotenv.2018.05.147 | Maria da Luz Fernandes et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W4376627395 | 10.1016/j.marpol.2023.105655 | Julie Reimer et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W3134065015 | 10.1016/j.envsci.2021.02.001 | Davide Longato et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4392293717 | 10.1016/j.ecolind.2024.111816 | Wen Song et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W2902345284 | 10.1007/s10980-018-0745-6 | Marcin Spyra et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W3159060995 | 10.1016/j.ecoser.2021.101273 | Karsten Grunewald et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W2046569818 | 10.1007/s10980-014-0052-9 | Christine Fürst et al. (2014) | ☑ | ☑ | ☑ | ☑ |
| W2810876831 | 10.3897/rio.4.e28045 | Evelyn Underwood et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W3158973852 | 10.1016/j.landurbplan.2021.104129 | Chiara Cortinovis et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W2904898541 | 10.1007/s10668-018-00300-5 | Azime Tezer et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W2771003204 | 10.1080/21513732.2017.1396257 | Christine Fürst et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W4406477943 | 10.1007/s11252-024-01656-5 | Israa Mahmoud et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W2592317409 | 10.1080/21513732.2017.1296494 | Justice Nana Inkoom et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W4320016094 | 10.1007/978-3-031-15773-8_4 | Falko Buschke et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W4404646473 | 10.1007/s00267-024-02086-x | Nina Farwig et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W4289516997 | 10.1007/s41207-022-00315-5 | Georgia Pozoukidou et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W1963746476 | 10.1016/j.ecocom.2009.10.006 | R.S. de Groot et al. (2009) | ☑ | ☑ | ☑ | ☑ |
| W2487200415 | 10.1016/j.marpol.2016.06.023 | Elianny Domínguez-Tejo et al. (2016) | ☑ | ☑ | ☑ | ☑ |
| W2759207970 | 10.3390/su9091668 | Leena Karrasch et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W2956763155 | 10.1088/1748-9326/ab3234 | Annika T. H. Keeley et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W2595174916 | 10.1038/35012251 | C. R. Margules & Sahotra Sarkar (2000) | ☑ | ☑ | ☑ | ☑ |
| W4313593374 | 10.1016/j.mex.2022.101989 | Holly Kirk et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W4412257196 | 10.5281/zenodo.6522392 | Unai Pascual et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W3209482460 | 10.25607/obp-1666 | Alejandro Iglesias-Campos et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W3100416804 | 10.1111/1365-2664.13796 | Virgilio Hermoso et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W3215595594 | 10.1093/biosci/biab091 | Abigail J. Lynch et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4393866290 | 10.3390/su16072965 | Qiqi Hu et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W2554309037 | 10.1111/btp.12386 | Agnieszka E. Latawiec et al. (2016) | ☑ | ☑ | ☑ | ☑ |
| W4295308933 | 10.1073/pnas.2203385119 | Natalia Estrada-Carmona et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W4415164578 | 10.1098/rsos.250810 | Rachael Garrett et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W2027491594 | 10.1016/j.ecolind.2015.03.029 | Christian Albert et al. (2015) | ☑ | ☑ | ☑ | ☑ |
| W1966247992 | 10.1080/21513732.2011.617711 | Davide Geneletti (2011) | ☑ | ☑ | ☑ | ☑ |
| W2918948909 | 10.1016/j.gecco.2019.e00569 | Arieanna C. Balbar & Anna Meta×as (2019) | ☑ | ☑ | ☑ | ☑ |
| W3194313759 | 10.1007/978-94-024-1681-7 | Christina von Haaren et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W2099188808 | 10.1016/j.landurbplan.2006.04.005 | Jolande W. Termorshuizen et al. (2006) | ☑ | ☑ | ☑ | ☑ |
| W2265414043 | 10.1146/annurev.ecolsys.32.081501.114012 | Steward T. A. Pickett et al. (2001) | ☑ | ☑ | ☑ | ☑ |
| W2766942546 | 10.1080/08920753.2017.1373450 | Kekuewa Kikiloi et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W2884329716 | 10.1007/978-3-319-94021-2 | László Miklós & Anna Špinerová (2018) | ☑ | ☑ | ☑ | ☑ |
| W4413900892 | 10.1016/j.tree.2025.07.014 | Jian Peng et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4409833817 | 10.1126/science.adn2225 | Jedediah F. Brodie et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W2524916285 | 10.1002/aqc.2645 | Alan M. Friedlander et al. (2016) | ☑ | ☑ | ☑ | ☑ |
| W4410629764 | 10.1016/j.rsma.2025.104257 | Liisi Lees et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W3021127236 | 10.1016/j.marpol.2020.103950 | Thomas Robertson et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W4412750811 | 10.1016/j.marpol.2025.106852 | Jean‐Eudes Beuret et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W3085006993 | 10.1002/pan3.10146 | Laura Pereira et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W2093445010 | 10.1126/science.1258832 | Jianguo Liu et al. (2015) | ☑ | ☑ | ☑ | ☑ |
| W2754686867 | 10.1038/s41559-017-0273-9 | Isabel M.D. Rosa et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W4380362703 | 10.1016/j.gloenvcha.2023.102681 | Hyejin Kim et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W4210386268 | 10.1016/j.envsci.2022.01.013 | Andressa V. Mansur et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W2122104680 | 10.1111/j.1523-1739.2009.01212.x | William J. Sutherland et al. (2009) | ☑ | ☑ | ☑ | ☑ |
| W4210765186 | 10.1038/s41893-021-00844-x | Roslyn Henry et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W2086673960 | 10.1016/j.tree.2009.04.008 | William J. Sutherland & Harry J. Woodroof (2009) | ☑ | ☑ | ☑ | ☑ |
| W4310004272 | 10.1007/s11625-022-01251-7 | Lucas Rutting et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W2161139387 | 10.1126/science.1196624 | Henrique M. Pereira et al. (2010) | ☑ | ☑ | ☑ | ☑ |
| W2023339029 | 10.1046/j.1523-1739.2003.01491.x | Garry Peterson et al. (2003) | ☑ | ☑ | ☑ | ☑ |
| W2971398159 | 10.1111/rec.13035 | George D. Gann et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W2114666631 | 10.1525/bio.2010.60.3.7 | Timothy J. Beechie et al. (2010) | ☑ | ☑ | ☑ | ☑ |
| W2062482344 | 10.1073/pnas.1201040109 | Joshua Goldstein et al. (2012) | ☑ | ☑ | ☑ | ☑ |
| W1540682446 | 10.1111/brv.12008 | Aija S. Kukkala & Atte Moilanen (2012) | ☑ | ☑ | ☑ | ☑ |
| W2028797766 | 10.1016/j.cosust.2013.05.002 | Ralf Seppelt et al. (2013) | ☑ | ☑ | ☑ | ☑ |
| W2470861343 | 10.1016/j.landurbplan.2016.05.003 | Adrienne Grêt‐Regamey et al. (2016) | ☑ | ☑ | ☑ | ☑ |
| W2015619301 | 10.1073/pnas.1000530107 | Lian Pin Koh & Jaboury Ghazoul (2010) | ☑ | ☑ | ☑ | ☑ |
| W2015646994 | 10.1016/j.tree.2014.07.005 | Carly N. Cook et al. (2014) | ☑ | ☑ | ☑ | ☑ |
| W3185562566 | 10.1038/d41586-021-02041-4 | Georgina G. Gurney et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4395447577 | 10.1126/science.adn3441 | Henrique M. Pereira et al. (2024) | ☑ | ☑ | ☑ | ☑ |
| W4212886831 | 10.1111/geb.13459 | Karel Mokany et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W3126018057 | 10.1111/rec.13346 | Jordi Cortina et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W2902463689 | 10.1016/j.tree.2018.10.006 | Emily Nicholson et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W2073677603 | 10.1016/j.biocon.2015.02.015 | Sebastián Martinuzzi et al. (2015) | ☑ | ☑ | ☑ | ☑ |
| W4386609980 | 10.1038/s43588-023-00503-5 | Yu Zheng et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W2952896657 | 10.5194/gmd-11-4537-2018 | Hyejin Kim et al. (2018) | ☑ | ☑ | ☑ | ☑ |
| W3161819570 | 10.1126/science.abc4896 | Louise O’Connor et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W2769947232 | 10.1016/j.cosust.2017.10.004 | Jean Paul Metzger et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W4386734502 | 10.1146/annurev-environ-112321-095011 | Steven J. Cork et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W3151200781 | 10.1111/rec.13403 | Ben L. Gilby et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4382181311 | 10.1007/s11625-023-01316-1 | América Paz Durán et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W4406904698 | 10.1016/j.tree.2024.12.002 | Sylvaine Giakoumi et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W4406487214 | 10.1007/s10980-024-02042-4 | Jiangxiao Qiu et al. (2025) | ☑ | ☑ | ☑ | ☑ |
| W1990241575 | 10.1007/s10021-004-0074-2 | Paul Raskin (2005) | ☑ | ☑ | ☑ | ☑ |
| W56780107 | 10.1007/978-1-4612-0529-6_10 | Jack Ahern (1999) | ☑ | ☑ | ☑ | ☑ |
| W2156111479 | 10.1111/gcb.12383 | Sebastián Martinuzzi et al. (2013) | ☑ | ☑ | ☑ | ☑ |
| W2159760863 | 10.1111/j.1466-8238.2010.00620.x | Joachim H. Spangenberg et al. (2011) | ☑ | ☑ | ☑ | ☑ |
| W3044450114 | 10.1016/j.envsoft.2020.104806 | Andrew J. Hoskins et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W3074014079 | 10.1007/s10113-020-01685-8 | Clara J. Veerkamp et al. (2020) | ☑ | ☑ | ☑ | ☑ |
| W2614376759 | 10.1016/j.envsci.2017.05.003 | Vanessa M. Adams et al. (2017) | ☑ | ☑ | ☑ | ☑ |
| W3145276257 | 10.1016/j.jenvman.2021.112400 | Yuyoung Choi et al. (2021) | ☑ | ☑ | ☑ | ☑ |
| W4382751812 | 10.1016/j.biocon.2023.110068 | Marcel Kok et al. (2023) | ☑ | ☑ | ☑ | ☑ |
| W2972648221 | 10.1111/1365-2664.13506 | Karel Mokany et al. (2019) | ☑ | ☑ | ☑ | ☑ |
| W4298615974 | 10.1007/s10980-022-01534-5 | Tom Harwood et al. (2022) | ☑ | ☑ | ☑ | ☑ |
| W4411717980 | 10.1007/s11625-025-01682-y | Sana Okayasu et al. (2025) | ☑ | ☑ | ☑ | ☑ |
SPC Corpus Measures and Numbers
These data is gathered from OpenAlex directly, not downloaded any works. The data is used to assess the quality of the TCA Corpus.
The query contains: - the search term (nature, spc, spcc) - the types selected (article, book, book-chapter, dissertation, editorial, preprint, report, review) - the date range (from 1992-01-01 to 2025-12-31)
Overall counts
Show the code
readRDS(file.path(params$corpus, "st_hits.rds")) |>
dplyr::mutate(
count = format(count, big.mark = ",")
) |>
knitr::kable(format = "html", escape = FALSE)| count | |
|---|---|
| nature | 24,198,955 |
| spc | 5,636,809 |
| spcc | 3,012,239 |
| openalex | 204,925,445 |
Show the code
corpus_counts <- readRDS(file.path(params$corpus, "st_hits.rds"))
render_mermaid(
file.path("figures", "overview.mmd"),
list(
SPC_LIST = format_count(corpus_counts[["spc", "count"]]),
NATURE_LIST = format_count(corpus_counts[["nature", "count"]]),
BASE_QUERY = format_count(corpus_counts[["spcc", "count"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart TD
Start([Start literature search]) --> SPC["<u><span style='color:#1a0dab;'>spc_corpus.yaml<br/>Assemble base SPC corpus</span></u>"]
click SPC "./input/search_terms/spc_corpus.yaml" "Open spc_corpus.yaml"
SPC --> SPC_list["spc keyword set<br/>(planning & connectivity terms)<br/>(n = 5,636,809)"
]
SPC --> NATURE_list["nature keyword set<br/>(environmental context terms)<br/>(n = 24,198,955)"
]
SPC_list --> BaseQuery["Level 1 query<br/>spc terms AND nature dictionary<br/>(n = 3,012,239)"
]
NATURE_list --> BaseQuery
BaseQuery --> ChapterSelect{Apply chapter / theme refinements}
ChapterSelect --> CH1["<u><span style='color:#1a0dab;'>Chapter 1<br/>chapter_1.yaml<br/>Governance & planning principles</span></u>"]
click CH1 "./input/search_terms/chapter_1.yaml" "Open chapter_1.yaml"
ChapterSelect --> CH2["<u><span style='color:#1a0dab;'>Chapter 2<br/>chapter_2.yaml<br/>GBF targets, nexus themes, SDGs</span></u>"]
click CH2 "./input/search_terms/chapter_2.yaml" "Open chapter_2.yaml"
ChapterSelect --> CH3["<u><span style='color:#1a0dab;'>Chapter 3<br/>chapter_3.yaml<br/>Restoration & conservation planning</span></u>"]
click CH3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"
ChapterSelect --> CH4["<u><span style='color:#1a0dab;'>Chapter 4<br/>chapter_4.yaml<br/>Connectivity evidence & metrics</span></u>"]
click CH4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"
ChapterSelect --> CH5["<u><span style='color:#1a0dab;'>Chapter 5<br/>chapter_5.yaml<br/>Foresight & futures (sections, themes, cross-cutting)</span></u>"]
click CH5 "./input/search_terms/Chapter_5_1_2.yaml" "Open Chapter 5 search terms"
ChapterSelect --> CH6["<u><span style='color:#1a0dab;'>Chapter 6<br/>chapter_6.yaml (+ chapter_6_r2.yaml optional)<br/>Enabling environment</span></u>"]
click CH6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"
Publication Years
Show the code
readRDS(file.path(params$corpus, "st_years.rds")) |>
dplyr::mutate(
dplyr::across(
dplyr::starts_with("count_"),
~ base::format(.x, big.mark = ",")
)
) |>
knitr::kable(format = "html", escape = FALSE)| year | count_openalex | count_spc | count_nature | count_spcc |
|---|---|---|---|---|
| 2025 | 7,024,215 | 331,075 | 1,148,157 | 198,063 |
| 2024 | 8,672,251 | 400,237 | 1,433,604 | 226,457 |
| 2023 | 8,800,438 | 404,415 | 1,456,730 | 218,067 |
| 2022 | 7,945,924 | 355,335 | 1,329,258 | 189,721 |
| 2021 | 8,655,439 | 354,061 | 1,334,177 | 188,928 |
| 2020 | 9,467,779 | 340,077 | 1,314,812 | 179,764 |
| 2019 | 9,186,561 | 299,234 | 1,194,205 | 156,951 |
| 2018 | 8,960,894 | 275,594 | 1,113,328 | 144,676 |
| 2017 | 8,920,577 | 252,218 | 1,039,376 | 131,548 |
| 2016 | 9,108,688 | 240,796 | 1,006,504 | 126,257 |
| 2015 | 8,879,550 | 231,523 | 982,924 | 121,665 |
| 2014 | 8,761,131 | 224,144 | 973,759 | 118,497 |
| 2013 | 8,482,636 | 211,059 | 934,487 | 111,122 |
| 2012 | 8,020,462 | 192,702 | 875,804 | 102,068 |
| 2011 | 7,753,054 | 178,462 | 820,324 | 94,208 |
| 2010 | 7,241,883 | 162,139 | 765,335 | 85,762 |
| 2009 | 6,785,530 | 145,079 | 698,345 | 76,646 |
| 2008 | 6,276,250 | 128,869 | 624,309 | 67,795 |
| 2007 | 5,817,068 | 114,654 | 573,333 | 60,482 |
| 2006 | 5,481,662 | 104,924 | 531,430 | 54,936 |
| 2005 | 5,018,808 | 92,872 | 480,920 | 48,944 |
| 2004 | 4,620,470 | 81,646 | 434,493 | 42,851 |
| 2003 | 4,317,436 | 74,728 | 403,805 | 39,187 |
| 2002 | 4,105,570 | 71,375 | 389,172 | 36,511 |
| 2001 | 3,512,306 | 53,975 | 319,330 | 28,871 |
| 2000 | 3,528,569 | 50,249 | 305,546 | 26,879 |
| 1999 | 2,908,060 | 42,387 | 258,993 | 22,310 |
| 1998 | 2,811,560 | 39,149 | 245,375 | 20,324 |
| 1997 | 2,644,466 | 36,505 | 229,958 | 18,840 |
| 1996 | 2,544,070 | 34,986 | 223,725 | 17,814 |
| 1995 | 2,347,216 | 32,055 | 207,527 | 16,291 |
| 1994 | 2,216,839 | 28,771 | 192,955 | 14,327 |
| 1993 | 2,102,230 | 26,755 | 183,703 | 13,284 |
| 1992 | 2,005,853 | 24,759 | 173,252 | 12,193 |
This graph only shows the relative nuymber of publications per year to identify different trends.
Show the code
readRDS(file.path(params$corpus, "st_years.rds")) |>
tidyr::pivot_longer(
cols = dplyr::starts_with("count_"),
names_to = "source",
values_to = "count",
names_prefix = "count_"
) |>
# scale each source so its total sum is 1
dplyr::group_by(source) |>
dplyr::mutate(
total_count = base::sum(count, na.rm = TRUE),
count = dplyr::if_else(total_count > 0, count / total_count, 0)
) |>
dplyr::ungroup() |>
dplyr::select(-total_count) |>
ggplot2::ggplot(ggplot2::aes(x = year, y = count, color = source)) +
ggplot2::geom_line(linewidth = 1) +
ggplot2::geom_point(size = 1.5) +
ggplot2::scale_y_continuous(
labels = scales::label_percent(accuracy = 1),
expand = ggplot2::expansion(mult = c(0.02, 0.06))
) +
ggplot2::labs(
x = "Year",
y = "Share of total works (sum-scaled per source)",
color = "Source",
title = "Publications per year by source (each source sums to 1)"
) +
ggplot2::theme_minimal(base_size = 14) +
ggplot2::theme(
legend.position = "bottom",
panel.grid.minor = ggplot2::element_blank()
)Language
Show the code
readRDS(file.path(params$corpus, "st_languages.rds")) |>
dplyr::mutate(
dplyr::across(
dplyr::starts_with("count_"),
~ base::format(.x, big.mark = ",")
)
) |>
knitr::kable(format = "html", escape = FALSE)| language | count_openalex | count_spc | count_nature | count_spcc |
|---|---|---|---|---|
| English | 148,846,144 | 5,288,696 | 22,525,939 | 2,845,795 |
| Spanish | 8,000,764 | 71,029 | 352,929 | 30,375 |
| Japanese | 7,787,128 | 1,701 | 14,813 | 847 |
| French | 5,980,155 | 38,307 | 269,824 | 20,131 |
| German | 5,957,848 | 13,895 | 63,583 | 5,261 |
| Chinese | 4,526,511 | 4,051 | 36,358 | 2,013 |
| Portuguese | 4,330,547 | 31,673 | 139,789 | 16,513 |
| Indonesian | 3,065,227 | 42,083 | 168,957 | 15,798 |
| Korean | 3,004,656 | 27,795 | 101,468 | 13,631 |
| Russian | 2,812,938 | 28,366 | 148,424 | 15,485 |
| Italian | 1,359,451 | 7,301 | 33,437 | 4,414 |
| Polish | 1,266,118 | 4,473 | 25,693 | 2,534 |
| Turkish | 884,257 | 5,415 | 26,426 | 2,932 |
| Dutch | 828,958 | 2,198 | 12,452 | 1,177 |
| Arabic | 734,494 | 3,589 | 18,948 | 1,541 |
| Ukrainian | 552,998 | 5,810 | 23,068 | 3,339 |
| Swedish | 512,579 | 5,564 | 18,269 | 2,606 |
| Persian | 489,990 | 2,521 | 7,940 | 1,539 |
| Czech | 486,942 | 4,093 | 18,998 | 1,659 |
| Catalan | 322,723 | 1,284 | 8,898 | 726 |
| Croatian | 228,056 | 3,082 | 13,735 | 1,586 |
| Norwegian | 196,452 | 1,068 | 4,788 | 505 |
| Finnish | 189,852 | 864 | 3,587 | 427 |
| Latvian | 188,932 | 2,863 | 13,130 | 606 |
| Hungarian | 175,778 | 1,582 | 7,548 | 820 |
| Modern Greek (1453-) | 161,551 | 1,083 | 4,300 | 571 |
| Danish | 160,609 | 334 | 2,692 | 147 |
| Malay (macrolanguage) | 153,050 | 2,710 | 10,498 | 1,346 |
| Slovenian | 107,001 | 830 | 3,894 | 448 |
| Thai | 106,295 | 2,476 | 5,129 | 875 |
| Lithuanian | 92,242 | 549 | 2,445 | 331 |
| Vietnamese | 80,039 | 243 | 1,512 | 177 |
| Serbo-Croatian | 79,403 | 1,241 | 4,513 | 606 |
| Romanian | 71,179 | 618 | 3,884 | 336 |
| Serbian | 65,154 | 552 | 2,600 | 285 |
| Slovak | 37,132 | 302 | 1,745 | 148 |
| Estonian | 32,041 | 181 | 1,407 | 109 |
| Galician | 31,127 | 125 | 683 | 41 |
| Hebrew | 26,528 | 227 | 2,565 | 128 |
| Bulgarian | 25,746 | 180 | 926 | 102 |
| Uzbek | 25,479 | 10 | 1,109 | 5 |
| Basque | 25,339 | 117 | 626 | 54 |
| Afrikaans | 24,413 | 305 | 1,668 | 189 |
| Latin | 21,507 | 71 | 553 | 43 |
| Esperanto | 20,983 | 116 | 703 | 52 |
| Hindi | 13,316 | 25 | 195 | 10 |
| Kazakh | 12,314 | 152 | 772 | 81 |
| Icelandic | 11,398 | 57 | 284 | 32 |
| Azerbaijani | 11,354 | 95 | 423 | 67 |
| Norwegian Nynorsk | 10,318 | 49 | 208 | 22 |
| Macedonian | 8,073 | 57 | 239 | 26 |
| Bosnian | 7,604 | 88 | 388 | 47 |
| Albanian | 7,220 | 24 | 154 | 17 |
| Georgian | 6,389 | 40 | 199 | 29 |
| Tagalog | 5,496 | 66 | 287 | 31 |
| Belarusian | 5,014 | 16 | 123 | 11 |
| Armenian | 4,707 | 86 | 483 | 54 |
| Tamil | 4,469 | 11 | 108 | 3 |
| Welsh | 4,229 | 9 | 86 | 5 |
| Urdu | 3,971 | 17 | 229 | 8 |
| Tajik | 3,820 | 7 | 30 | 5 |
| Irish | 3,787 | 17 | 173 | 14 |
| Yiddish | 3,734 | 20 | 426 | 11 |
| Mongolian | 3,565 | 16 | 122 | 7 |
| Nepali (macrolanguage) | 3,180 | 13 | 122 | 6 |
| Swahili (macrolanguage) | 3,038 | 16 | 74 | 13 |
| Bengali | 2,782 | 14 | 43 | 9 |
| Malagasy | 2,739 | 4 | 70 | 2 |
| Occitan (post 1500) | 2,417 | 10 | 43 | 5 |
| Kannada | 2,118 | 10 | 79 | 4 |
| Marathi | 2,084 | 7 | 51 | 6 |
| Pushto | 2,081 | 1 | 7 | 0 |
| Western Frisian | 2,075 | 12 | 59 | 7 |
| Ido | 2,007 | 20 | 162 | 15 |
| Breton | 1,932 | 10 | 61 | 6 |
| Malayalam | 1,502 | 9 | 109 | 6 |
| Javanese | 1,388 | 15 | 65 | 6 |
| Kirghiz | 1,212 | 10 | 65 | 3 |
| Kurdish | 1,171 | 4 | 24 | 3 |
| Luxembourgish | 1,107 | 4 | 46 | 3 |
| Ndonga | 1,037 | 138 | 504 | 97 |
| Sundanese | 1,017 | 6 | 49 | 2 |
| Sanskrit | 1,008 | 0 | 11 | 0 |
| Maltese | 962 | 1 | 13 | 0 |
| Sinhala | 793 | 3 | 10 | 1 |
| Telugu | 770 | 3 | 37 | 3 |
| Interlingua (International Auxiliary Language Association) | 764 | 5 | 17 | 3 |
| Gujarati | 693 | 1 | 6 | 1 |
| Interlingue | 674 | 11 | 29 | 4 |
| Tatar | 627 | 7 | 11 | 4 |
| Walloon | 580 | 3 | 25 | 1 |
| Scottish Gaelic | 570 | 1 | 10 | 1 |
| Bashkir | 524 | 2 | 9 | 0 |
| Dhivehi | 481 | 0 | 3 | 0 |
| Volapük | 344 | 4 | 7 | 1 |
| Oriya (macrolanguage) | 341 | 0 | 2 | 0 |
| Burmese | 339 | 3 | 16 | 1 |
| Panjabi | 333 | 0 | 11 | 0 |
| Tibetan | 311 | 0 | 4 | 0 |
| Somali | 311 | 2 | 4 | 1 |
| Aragonese | 304 | 1 | 5 | 0 |
| Haitian | 302 | 3 | 20 | 3 |
| Cornish | 236 | 0 | 5 | 0 |
| Lao | 223 | 2 | 11 | 1 |
| Central Khmer | 221 | 4 | 10 | 3 |
| Quechua | 184 | 0 | 7 | 0 |
| Amharic | 184 | 2 | 4 | 2 |
| Chechen | 143 | 0 | 1 | 0 |
| Manx | 141 | 2 | 6 | 0 |
| Limburgan | 138 | 0 | 2 | 0 |
| Romansh | 125 | 2 | 5 | 1 |
| Yoruba | 98 | 2 | 7 | 1 |
| Guarani | 97 | 0 | 1 | 0 |
| Sindhi | 97 | 0 | 0 | 0 |
| Uighur | 62 | 0 | 1 | 0 |
| Turkmen | 61 | 1 | 1 | 1 |
| Norwegian Bokmål | 52 | 1 | 1 | 0 |
| Assamese | 52 | 0 | 0 | 0 |
| Faroese | 50 | 8 | 28 | 8 |
| Chuvash | 42 | 0 | 2 | 0 |
| Ossetian | 35 | 0 | 0 | 0 |
| Komi | 23 | 6 | 4 | 4 |
| Sardinian | 14 | 0 | 1 | 0 |
| Corsican | 11 | 0 | 0 | 0 |
| Avaric | 9 | 0 | 0 | 0 |
| South Ndebele | 5 | 2 | 4 | 2 |
| Zulu | 3 | 0 | 0 | 0 |
| Northern Sami | 1 | 0 | 0 | 0 |
| Tsonga | 1 | 0 | 0 | 0 |
| NA | 0 | 321 | 3,062 | 209 |
This graph only shows the relative number of publications per year to identify different trends.
Show the code
readRDS(file.path(params$corpus, "st_languages.rds")) |>
# keep top 15 languages by total (before scaling)
dplyr::mutate(
total = count_openalex + count_spc + count_nature + count_spcc
) |>
dplyr::slice_max(total, n = 15) |>
dplyr::arrange(dplyr::desc(total)) |>
# fix display order so largest stays on top
dplyr::mutate(language = factor(language, levels = rev(language))) |>
dplyr::select(-total) |>
# reshape wide → long
tidyr::pivot_longer(
cols = dplyr::starts_with("count_"),
names_to = "source",
values_to = "count",
names_prefix = "count_"
) |>
# scale so each source sums to 1
dplyr::group_by(source) |>
dplyr::mutate(
total_source = base::sum(count, na.rm = TRUE),
count = dplyr::if_else(total_source > 0, count / total_source, 0)
) |>
dplyr::ungroup() |>
dplyr::select(-total_source) |>
ggplot2::ggplot(ggplot2::aes(x = language, y = count, fill = source)) +
ggplot2::geom_col(position = "dodge") +
ggplot2::coord_flip() +
ggplot2::scale_y_continuous(
labels = scales::label_percent(accuracy = 1),
expand = ggplot2::expansion(mult = c(0, 0.05))
) +
ggplot2::labs(
x = "Language",
y = "Share of total works within each source",
fill = "Source",
title = "Publications by language (top 15), scaled so each source sums to 1"
) +
ggplot2::theme_minimal(base_size = 14) +
ggplot2::theme(
legend.position = "bottom",
panel.grid.minor = ggplot2::element_blank()
)Individual Chapter
Here we show the sub-searches for the individual chapters. In the tables indicating the number, an NA value indicates that the search string was to long (most likely) or any other error occured in the search. The same applies when an error message is given.
Chapter 1
Show the code
ch1_hits <- readRDS(file.path(params$chapter_1, "st_hits.rds"))
ch1_counts <- setNames(ch1_hits$count, rownames(ch1_hits))
ch1_hits |>
dplyr::mutate(count = format_count(count)) |>
knitr::kable(
col.names = c("Count"),
align = "r"
)| Count | |
|---|---|
| Set 1 | 4,411 |
| Set 2.1 | 4,984 |
| Set 2.2 | 94 |
| Set 3 | 28,006 |
Show the code
render_mermaid(
file.path("figures", "chapter1.mmd"),
c(
C1_1 = format_count(ch1_counts[["Set 1"]]),
C1_2.1 = format_count(ch1_counts[["Set 2.1"]]),
C1_2.2 = format_count(ch1_counts[["Set 2.2"]]),
C1_3 = format_count(ch1_counts[["Set 3"]])
# C1_4 = format_count(ch1_counts[["Set 4"]]),
# C1_5 = format_count(ch1_counts[["Set 5"]]),
# C1_6 = format_count(ch1_counts[["Set 6"]]),
# C1_7 = format_count(ch1_counts[["Set 7"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch1["<u><span style='color:#1a0dab;'>chapter_1.yaml<br/>Level 2 refinements</span></u>"]
click Ch1 "./input/search_terms/chapter_1.yaml" "Open chapter_1.yaml"
subgraph Chapter1Sets["Chapter 1 thematic searches"]
direction TB
C1_1["Set 1:<br/>land/spatial planning<br/>+ biodiversity goals<br/>+ societal needs/values<br/>(n = 4,411)"]
C1_2.1["Set 2.1:<br/>???<br/>(n = 4,984)"]
C1_2.2["Set 2.2:<br/>???<br/>(n = 94)"]
C1_3["Set 3:<br/>evidence & precaution<br/>+ ILK knowledge base<br/>(n = 28,006)"]
%% C1_4["Set 4:<br/>multilevel/transparent governance<br/>+ customary coherence<br/>(n = <<C1_4>>)"]
%% C1_5["Set 5:<br/>participatory planning<br/>+ co-design / engagement<br/>(n = <<C1_5>>)"]
%% C1_6["Set 6:<br/>equity / rights / tenure<br/>+ justice outcomes<br/>(n = <<C1_6>>)"]
%% C1_7["Set 7:<br/>connectivity (land-sea/cross-scale)<br/>+ nexus & climate links<br/>(n = <<C1_7>>)"]
end
Ch1 --> C1_1
Ch1 --> C1_2.1
Ch1 --> C1_2.2
Ch1 --> C1_3
%% Ch1 --> C1_4
%% Ch1 --> C1_5
%% Ch1 --> C1_6
%% Ch1 --> C1_7
Chapter 2
In addition to the search terms, only works which have at least one identified SDG are returned.
Show the code
ch2_hits <- readRDS(file.path(params$chapter_2, "st_hits.rds"))
# ch2_counts <- lapply(
# ch2_hits,
# function(df) {
# setNames(df$count, rownames(df))
# }
# )
ch2_counts <- setNames(ch2_hits$count, rownames(ch2_hits))
ch2_hits |>
dplyr::mutate(count = format_count(count)) |>
knitr::kable(
col.names = c("Count"),
align = "r"
)| Count | |
|---|---|
| Set 1.1 | 152,903 |
| Set 1.2 | 2,660 |
| Set 1.3 | 78,268 |
| Set 1.4 | 56,634 |
| Set 2.1 | 940,546 |
| Set 2.2 | 287,119 |
Show the code
#|
render_mermaid(
file.path("figures", "chapter2.mmd"),
c(
Set_11 = format_count(ch2_counts[["Set 1.1"]]),
Set_12 = format_count(ch2_counts[["Set 1.2"]]),
Set_13 = format_count(ch2_counts[["Set 1.3"]]),
Set_14 = format_count(ch2_counts[["Set 1.4"]]),
Set_21 = format_count(ch2_counts[["Set 2.1"]]),
Set_22 = format_count(ch2_counts[["Set 2.2"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch2L2["<u><span style='color:#1a0dab;'>chapter_2.yaml<br/>Level 2 GBF bundles</span></u>"]
click Ch2L2 "../search_terms/chapter_2.yaml" "Open chapter_2.yaml"
subgraph Chapter2Sets["GBF contexts & targets"]
direction TB
Set_11["Set 1.1<br/>(n = 152,903)"]
Set_12["Set 1.2<br/>(n = 2,660)"]
Set_13["Set 1.3<br/>(n = 78,268)"]
Set_14["Set 1.3<br/>(n = 56,634)"]
Set_21["Set 2.1<br/>(n = 940,546)"]
Set_22["Set 2.2<br/>(n = 287,119)"]
%% Set_3["Set 3<br/>(n = <<Set_3>>)"]
end
Ch2L2 --> Set_11
Ch2L2 --> Set_12
Ch2L2 --> Set_13
Ch2L2 --> Set_21
Ch2L2 --> Set_22
%% Ch2L2 --> Set_3
%% subgraph L1_TARGET["GBF contexts & targets"]
%% T3["Target 3<br/>(n = <<T3>>)"]
%% T4["Target 4<br/>(n = <<T4>>)"]
%% T5["Target 5<br/>(n = <<T5>>)"]
%% T6["Target 6<br/>(n = <<T6>>)"]
%% T7["Target 7<br/>(n = <<T7>>)"]
%% T8["Target 8<br/>(n = <<T8>>)"]
%% T9["Target 9<br/>(n = <<T9>>)"]
%% T10["Target 10<br/>(n = <<T10>>)"]
%% T11["Target 11<br/>(n = <<T11>>)"]
%% T12["Target 12<br/>(n = <<T12>>)"]
%% T13["Target 13<br/>(n = <<T13>>)"]
%% T14["Target 14<br/>(n = <<T14>>)"]
%% T15["Target 15<br/>(n = <<T15>>)"]
%% T16["Target 16<br/>(n = <<T16>>)"]
%% T17["Target 17<br/>(n = <<T17>>)"]
%% T18["Target 18<br/>(n = <<T18>>)"]
%% T19["Target 19<br/>(n = <<T19>>)"]
%% T20["Target 20<br/>(n = <<T20>>)"]
%% T21["Target 21<br/>(n = <<T21>>)"]
%% T22["Target 22<br/>(n = <<T22>>)"]
%% T23["Target 23<br/>(n = <<T23>>)"]
%% end
%% Ch2L2 --> T3
%% Ch2L2 --> T4
%% Ch2L2 --> T5
%% Ch2L2 --> T6
%% Ch2L2 --> T7
%% Ch2L2 --> T8
%% Ch2L2 --> T9
%% Ch2L2 --> T10
%% Ch2L2 --> T11
%% Ch2L2 --> T12
%% Ch2L2 --> T13
%% Ch2L2 --> T14
%% Ch2L2 --> T15
%% Ch2L2 --> T16
%% Ch2L2 --> T17
%% Ch2L2 --> T18
%% Ch2L2 --> T19
%% Ch2L2 --> T20
%% Ch2L2 --> T21
%% Ch2L2 --> T22
%% Ch2L2 --> T23
%% subgraph L1_REL["Spatial Planning Related"]
%% REL["Spatial Planning Related<br/>(n = <<REL>>)"]
%% end
%% Ch2L2 --> REL
%% subgraph L1_NexusSets["Nexus"]
%% direction TB
%% Nexus_Water["Water<br/>(n = <<Nexus_Water>>)"]
%% Nexus_Food["Food<br/>(n = <<Nexus_Food>>)"]
%% Nexus_Health["Health<br/>(n = <<Nexus_Health>>)"]
%% Nexus_Climate["Climate<br/>(n = <<Nexus_Climate>>)"]
%% end
%% Ch2L2 --> Nexus_Water
%% Ch2L2 --> Nexus_Food
%% Ch2L2 --> Nexus_Health
%% Ch2L2 --> Nexus_Climate
%% L1_GBF --> Ch2L4["<u><span style='color:#1a0dab;'>chapter_2_sdg.yaml<br/>Level 4 SDG filters</span></u>"]
%% L1_NexusSets --> Ch2L4
%% L1_REL --> Ch2L4
%% click Ch2L4 "../search_terms/chapter_2_sdg.yaml" "Open chapter_2_sdg.yaml"
%% subgraph SDGSets["SDG goal filters"]
%% direction TB
%% SDG1["SDG 1"]
%% SDG2["SDG 2"]
%% SDG3["SDG 3"]
%% SDG4["SDG 4"]
%% SDG5["SDG 5"]
%% SDG6["SDG 6"]
%% SDG7["SDG 7"]
%% SDG8["SDG 8"]
%% SDG9["SDG 9"]
%% SDG10["SDG 10"]
%% SDG11["SDG 11"]
%% SDG12["SDG 12"]
%% SDG13["SDG 13"]
%% SDG14["SDG 14"]
%% SDG15["SDG 15"]
%% SDG16["SDG 16"]
%% SDG17["SDG 17"]
%% end
%% Ch2L4 --> SDG1
%% Ch2L4 --> SDG2
%% Ch2L4 --> SDG3
%% Ch2L4 --> SDG4
%% Ch2L4 --> SDG5
%% Ch2L4 --> SDG6
%% Ch2L4 --> SDG7
%% Ch2L4 --> SDG8
%% Ch2L4 --> SDG9
%% Ch2L4 --> SDG10
%% Ch2L4 --> SDG11
%% Ch2L4 --> SDG12
%% Ch2L4 --> SDG13
%% Ch2L4 --> SDG14
%% Ch2L4 --> SDG15
%% Ch2L4 --> SDG16
%% Ch2L4 --> SDG17
Deduplicated within each Set
Show the code
file.path(params$chapter_2, "corpus.openalex_pro", "corpus_set_deduped") |>
arrow::open_dataset() |>
dplyr::summarize(n = n(), .by = c(set)) |>
dplyr::collect()Final Corpus
This final corpus is the overlap between Set 21 and Set 2.
Show the code
cf <-
file.path(
params$chapter_2,
"corpus.openalex_pro",
"corpus_final"
) |>
arrow::open_dataset()
print("Columns in the final corpus:")[1] "Columns in the final corpus:"
Show the code
names(cf) [1] "id" "doi"
[3] "citation" "title"
[5] "abstract" "type"
[7] "language" "open_access"
[9] "primary_location" "sustainable_development_goals"
[11] "oa_status" "journal"
[13] "publication_year"
Show the code
print("Number of individual works (rows):")[1] "Number of individual works (rows):"
Show the code
nrow(cf) |>
format(big.mark = ",")[1] "122,621"
Chapter 3
Show the code
ch3_hits <- readRDS(file.path(params$chapter_3, "st_hits.rds"))
ch3_counts <- setNames(ch3_hits$count, rownames(ch3_hits))
ch3_hits |>
dplyr::mutate(count = format_count(count)) |>
knitr::kable(
col.names = c("Count"),
align = "r"
)| Count | |
|---|---|
| Set 1 | 12,766 |
| Set 3 | 3,598 |
| Set 3.1A | 964 |
| Set 3.1BCD | 311 |
| Set 3.2CE | 366 |
| Set 3.2D | 2,121 |
| Set 3.2F | 187 |
| Set 3.3 | 4,065 |
| Set 4 | 21,951 |
| Set 4.1AB | 1,858 |
| Set 4.1CD | 12,867 |
| Set 4.2 | 11,921 |
| Set 5.1 | 2,223 |
| Set 5.2 | 1,071 |
Show the code
render_mermaid(
file.path("figures", "chapter3.mmd"),
c(
C3_1 = format_count(ch3_counts[["Set 1"]]),
C3_3 = format_count(ch3_counts[["Set 3"]]),
C3_3.1A = format_count(ch3_counts[["Set 3.1A"]]),
C3_3.1BCD = format_count(ch3_counts[["Set 3.1BCD"]]),
C3_3.2D = format_count(ch3_counts[["Set 3.2D"]]),
C3_3.2F = format_count(ch3_counts[["Set 3.2F"]]),
C3_3.3 = format_count(ch3_counts[["Set 3.3"]]),
C3_4 = format_count(ch3_counts[["Set 4"]]),
C3_4.1AB = format_count(ch3_counts[["Set 4.1AB"]]),
C3_4.1CD = format_count(ch3_counts[["Set 4.1CD"]]),
C3_4.2 = format_count(ch3_counts[["Set 4.2"]]),
C3_5.1 = format_count(ch3_counts[["Set 5.1"]]),
C3_5.2 = format_count(ch3_counts[["Set 5.2"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch3["<u><span style='color:#1a0dab;'>chapter_3.yaml<br/>Level 2 refinements</span></u>"]
click Ch3 "./input/search_terms/chapter_3.yaml" "Open chapter_3.yaml"
subgraph Chapter3Sets["Chapter 3 searches"]
direction TB
C3_1["Set 1:<br/>Protected/OECM + NBSAP + cases<br/>+ spatial prioritization + regional scales<br/>(n = 12,766)"]
C3_3["Set 3:<br/>Restoration planning + connectivity + resilience<br/>(n = 3,598)"]
C3_3.1A["Set 3.1 A:<br/>Objective<br/>(n = 964)"]
C3_3.1BCD["Set 3.1 BCD:<br/>Concept<br/>(n = 311)"]
C3_3.2D["Set 3.2 D:<br/>???<br/>(n = 2,121)"]
C3_3.2F["Set 3.2 F:<br/>???<br/>(n = 187)"]
C3_3.3["Set 3.3:<br/>???<br/>(n = 4,065)"]
C3_4["Set 4:<br/>Systematic conservation planning / gap analysis<br/>(n = 21,951)"]
C3_4.1AB["Set 4.1 AB:<br/>???<br/>(n = 1,858)"]
C3_4.1CD["Set 4.1 CD:<br/>???<br/>(n = 12,867)"]
C3_4.2["Set 4.2:<br/>???<br/>(n = 11,921)"]
C3_5.1["Set 5.1:<br/>???<br/>(n = 2,223)"]
C3_5.2["Set 5.1:<br/>???<br/>(n = 1,071)"]
end
Ch3 --> C3_1
Ch3 --> C3_3
Ch3 --> C3_3.1A
Ch3 --> C3_3.1BCD
Ch3 --> C3_3.2D
Ch3 --> C3_3.2F
Ch3 --> C3_3.3
Ch3 --> C3_4
Ch3 --> C3_4.1AB
Ch3 --> C3_4.1CD
Ch3 --> C3_4.2
Ch3 --> C3_5.1
Ch3 --> C3_5.2
Chapter 4
Show the code
ch4_hits <- readRDS(file.path(params$chapter_4, "st_hits.rds"))
ch4_counts <- setNames(ch4_hits$count, rownames(ch4_hits))
ch4_hits |>
dplyr::mutate(count = format_count(count)) |>
knitr::kable(
col.names = c("Count"),
align = "r"
)| Count | |
|---|---|
| Set 1 | 1,387 |
| Set 2 | 241 |
| Set 3 | 6,290 |
| Set 4 | 29,809 |
| Set 5 | 375 |
| Set 6 | 2,676 |
| Set 7 | 0 |
| Set 8 | 89,971 |
Show the code
render_mermaid(
file.path("figures", "chapter4.mmd"),
c(
C4_1 = format_count(ch4_counts[["Set 1"]]),
C4_2 = format_count(ch4_counts[["Set 2"]]),
C4_3 = format_count(ch4_counts[["Set 3"]]),
C4_4 = format_count(ch4_counts[["Set 4"]]),
C4_5 = format_count(ch4_counts[["Set 5"]]),
C4_6 = format_count(ch4_counts[["Set 6"]]),
C4_7 = format_count(ch4_counts[["Set 7"]]),
C4_8 = format_count(ch4_counts[["Set 8"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch4["<u><span style='color:#1a0dab;'>chapter_4.yaml<br/>Level 2 refinements</span></u>"]
click Ch4 "./input/search_terms/chapter_4.yaml" "Open chapter_4.yaml"
subgraph Chapter4Sets["Chapter 4 searches"]
direction TB
C4_1["Set 1:<br/>Connectivity review articles<br/>(n = 1,387)"]
C4_2["Set 2:<br/>Connectivity benefits vs risks<br/>+ ecosystem services<br/>(n = 241)"]
C4_3["Set 3:<br/>Structural vs functional connectivity<br/>(n = 6,290)"]
C4_4["Set 4:<br/>Connectivity modelling toolkits<br/>(n = 29,809)"]
C4_5["Set 5:<br/>Connectivity indicators & metrics<br/>(n = 375)"]
C4_6["Set 6:<br/>Policy & governance integration<br/>(n = 2,676)"]
C4_7["Set 7:<br/>Multilevel / transboundary governance<br/>+ IPLC inclusion + land tenure<br/>(n = 0)"]
C4_8["Set 8:<br/>Movement ecology<br/>(dispersal / migration / permeability)<br/>(n = 89,971)"]
end
Ch4 --> C4_1
Ch4 --> C4_2
Ch4 --> C4_3
Ch4 --> C4_4
Ch4 --> C4_5
Ch4 --> C4_6
Ch4 --> C4_7
Ch4 --> C4_8
Chapter 5
Show the code
ch5_hits <- readRDS(file.path(params$chapter_5, "st_hits.rds"))
ch5_counts <- lapply(ch5_hits, function(df) {
setNames(df$count, rownames(df))
})
do.call(
rbind,
lapply(names(ch5_hits), function(sect_nm) {
df <- ch5_hits[[sect_nm]]
df$section <- sect_nm
df$set <- rownames(df)
rownames(df) <- NULL
df[,
c("section", "set", setdiff(names(df), c("section", "set"))),
drop = FALSE
]
})
) |>
dplyr::mutate(
count = format_count(count)
) |>
knitr::kable(
col.names = c("Section", "Set", "Count"),
align = c("c", "c", "r")
)| Section | Set | Count |
|---|---|---|
| Sections 1 and 2 | Set 1 | 203,060 |
| Sections 1 and 2 | Set 2 | 62,688 |
| Sections 1 and 2 | Set 3 | 61,473 |
| Sections 1 and 2 | Set 4 | 425,315 |
| Sections 1 and 2 | Set 5 | 267,697 |
| Section 3 | Set 1 | 2,919 |
| Section 3 | Set 2 | 15,626 |
| Section 3 | Set 3 | 117 |
| Section 4 | Set 1 | 63,322 |
| Section 4 | Set 2 | 21,664 |
| Section 4 | Set 3 | 14,256 |
| Section 5 | Set 1 | 15,193 |
| Section 5 | Set 2 | 84,675 |
| Section 5 | Set 3 | 53,802 |
| Section 5 | Set 4 | 29,203 |
| Section 6 | Set 1 | 180 |
| Section 6 | Set 2 | 4,258 |
| Section 6 | Set 3 | 3,121 |
| Section 6 | Set 4 | 2,521 |
| Cross-cutting sets | Set 1 | 45,650 |
| Cross-cutting sets | Set 2 | 232,690 |
Show the code
fmt_ch5 <- function(section, set) {
format_count(ch5_counts[[section]][[set]])
}
render_mermaid(
file.path("figures", "chapter5.mmd"),
c(
C5_1 = fmt_ch5("Sections 1 and 2", "Set 1"),
C5_2 = fmt_ch5("Sections 1 and 2", "Set 2"),
C5_3 = fmt_ch5("Sections 1 and 2", "Set 3"),
C5_4 = fmt_ch5("Sections 1 and 2", "Set 4"),
C5_5 = fmt_ch5("Sections 1 and 2", "Set 5"),
C5_3a = fmt_ch5("Section 3", "Set 1"),
C5_3b = fmt_ch5("Section 3", "Set 2"),
C5_3c = fmt_ch5("Section 3", "Set 3"),
C5_4a = fmt_ch5("Section 4", "Set 1"),
C5_4b = fmt_ch5("Section 4", "Set 2"),
C5_4c = fmt_ch5("Section 4", "Set 3"),
C5_5a = fmt_ch5("Section 5", "Set 1"),
C5_5b = fmt_ch5("Section 5", "Set 2"),
C5_5c = fmt_ch5("Section 5", "Set 3"),
C5_5d = fmt_ch5("Section 5", "Set 4"),
C5_6a = fmt_ch5("Section 6", "Set 1"),
C5_6b = fmt_ch5("Section 6", "Set 2"),
C5_6c = fmt_ch5("Section 6", "Set 3"),
C5_6d = fmt_ch5("Section 6", "Set 4"),
CC1 = fmt_ch5("Cross-cutting sets", "Set 1"),
CC2 = fmt_ch5("Cross-cutting sets", "Set 2")
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch5L2["<u><span style='color:#1a0dab;'>chapter_5.yaml<br/>Level 2 foresight framing</span></u>"]
click Ch5L2 "./input/search_terms/chapter_5.yaml" "Open chapter_5.yaml"
subgraph L2Sets["Section 5.1–5.2 searches"]
direction TB
C5_1["Set 1:<br/>Future + project*/predict*/scenario<br/>(n = 203,060)"]
C5_2["Set 2:<br/>Future + pathway*/narrative*/vision*<br/>(n = 62,688)"]
C5_3["Set 3:<br/>Future-proof*/anticipat*/scenario planning<br/>(n = 61,473)"]
C5_4["Set 4:<br/>Foresight*/backcasting/simulat*/trend*<br/>(n = 425,315)"]
C5_5["Set 5:<br/>Model* AND scenario<br/>(n = 267,697)"]
end
Ch5L2 --> C5_1
Ch5L2 --> C5_2
Ch5L2 --> C5_3
Ch5L2 --> C5_4
Ch5L2 --> C5_5
subgraph L3Sets["Section 5.3 searches"]
direction TB
C5_3a["Set 1:<br/>Drivers of change<br/>(n = 2,919)"]
C5_3b["Set 2:<br/>Driver modelling approaches<br/>(n = 15,626)"]
C5_3c["Set 3:<br/>Driver gaps<br/>(n = 117)"]
end
Ch5L2 --> C5_3a
Ch5L2 --> C5_3b
Ch5L2 --> C5_3c
subgraph L4Sets["Section 5.4 searches"]
direction TB
C5_4a["Set 1:<br/>Interactions (synergy/trade-off/nexus)<br/>(n = 63,322)"]
C5_4b["Set 2:<br/>Response options (integrated planning / NbS)<br/>(n = 21,664)"]
C5_4c["Set 3:<br/>Cross-scale synergy & trade-off terms<br/>(n = 14,256)"]
end
Ch5L2 --> C5_4a
Ch5L2 --> C5_4b
Ch5L2 --> C5_4c
subgraph L5Sets["Section 5.5 searches"]
direction TB
C5_5a["Set 1:<br/>Adaptive / transformative management<br/>(n = 15,193)"]
C5_5b["Set 2:<br/>Uncertainty quantification<br/>(n = 84,675)"]
C5_5c["Set 3:<br/>Tipping points & thresholds<br/>(n = 53,802)"]
C5_5d["Set 4:<br/>Cascading risks & precaution<br/>(n = 29,203)"]
end
Ch5L2 --> C5_5a
Ch5L2 --> C5_5b
Ch5L2 --> C5_5c
Ch5L2 --> C5_5d
subgraph L6Sets["Section 5.6 searches"]
direction TB
C5_6a["Set 1:<br/>Science-policy-practice pathways<br/>(n = 180)"]
C5_6b["Set 2:<br/>ILK integration & community planning<br/>(n = 4,258)"]
C5_6c["Set 3:<br/>Enabling factors & coordination<br/>(n = 3,121)"]
C5_6d["Set 4:<br/>Shocks, surprises, uncertainties<br/>(n = 2,521)"]
end
Ch5L2 --> C5_6a
Ch5L2 --> C5_6b
Ch5L2 --> C5_6c
Ch5L2 --> C5_6d
subgraph CCSets["Cross-cutting searches"]
direction TB
CC1["Set 1:<br/>Scales & telecoupling<br/>(n = 45,650)"]
CC2["Set 2:<br/>Co-production & inclusion<br/>(n = 232,690)"]
end
Ch5L2 --> CC1
Ch5L2 --> CC2
Chapter 6
Show the code
ch6_hits <- readRDS(file.path(params$chapter_6, "st_hits.rds"))
ch6_counts <- setNames(ch6_hits$count, rownames(ch6_hits))
ch6_hits |>
dplyr::mutate(count = format_count(count)) |>
knitr::kable(
col.names = c("Count"),
align = "r"
)| Count | |
|---|---|
| Set 1 | 12,626 |
| Set 2 | 1,529 |
| Set 3 | 84,873 |
| Set 4 | 170,621 |
| Set 5 | 3,624 |
| Set 6 | 56,439 |
| Set 7 | 255,581 |
| Set 8.1 | -4,128 |
| Set 8.2 | 18,683 |
| Set 9 | 60,445 |
| Set 10 | 19,044 |
Show the code
render_mermaid(
file.path("figures", "chapter6.mmd"),
c(
C6_1 = format_count(ch6_counts[["Set 1"]]),
C6_2 = format_count(ch6_counts[["Set 2"]]),
C6_3 = format_count(ch6_counts[["Set 3"]]),
C6_4 = format_count(ch6_counts[["Set 4"]]),
C6_5 = format_count(ch6_counts[["Set 5"]]),
C6_6 = format_count(ch6_counts[["Set 6"]]),
C6_7 = format_count(ch6_counts[["Set 7"]]),
C6_8 = format_count(sum(ch6_counts[c("Set 8.1", "Set 8.2")], na.rm = TRUE)),
C6_9 = format_count(ch6_counts[["Set 9"]]),
C6_10 = format_count(ch6_counts[["Set 10"]])
)
)%%{init: {'flowchart': {'htmlLabels': true}}}%%
flowchart LR
Start([SPC Corpus]) --> Ch6["<u><span style='color:#1a0dab;'>chapter_6.yaml<br/>Level 2 refinements</span></u>"]
click Ch6 "./input/search_terms/chapter_6.yaml" "Open chapter_6.yaml"
subgraph Chapter6Sets["Chapter 6 searches"]
direction TB
C6_1["Set 1:<br/>Institutional & governance structures<br/>(n = 12,626)"]
C6_2["Set 2:<br/>Political & strategic leadership<br/>(n = 1,529)"]
C6_3["Set 3:<br/>Socio-cultural & stakeholder engagement<br/>(n = 84,873)"]
C6_4["Set 4:<br/>Collaboration, trust & networks<br/>(n = 170,621)"]
C6_5["Set 5:<br/>Financial & economic mechanisms<br/>(n = 3,624)"]
C6_6["Set 6:<br/>Legal & policy frameworks<br/>(n = 56,439)"]
C6_7["Set 7:<br/>Human & institutional capacity<br/>(n = 255,581)"]
C6_8["Set 8:<br/>Data, knowledge & decision support (8.1 + 8.2)<br/>(n = 14,555)"]
C6_9["Set 9:<br/>Ecological & spatial planning tools<br/>(n = 60,445)"]
C6_10["Set 10:<br/>Cross-cutting process enablers<br/>(n = 19,044)"]
end
Ch6 --> C6_1
Ch6 --> C6_2
Ch6 --> C6_3
Ch6 --> C6_4
Ch6 --> C6_5
Ch6 --> C6_6
Ch6 --> C6_7
Ch6 --> C6_8
Ch6 --> C6_9
Ch6 --> C6_10
Ch6R2["<u><span style='color:#1a0dab;'>chapter_6_r2.yaml<br/>Optional Level 3 filter</span></u>"]
Chapter6Sets --> Ch6R2
click Ch6R2 "./input/search_terms/chapter_6_r2.yaml" "Open chapter_6_r2.yaml"
subgraph Chapter6Case["Chapter 6 searches"]
R2["Case-study keywords<br/>(case stud*, example*, initiative*, etc.)"]
end
Ch6R2 --> R2
Reuse
Citation
@report{krug,
author = {Krug, Rainer M. and Bishop, Gabriella and Villasante,
Sebastian},
title = {Spatial {Planning} and {Connectivity} {Corpus} - {Technical}
{Background} {Report}},
doi = {10.5281/zenodo.19608284},
langid = {en},
abstract = {To Be added}
}