Multi-key Plant Identification
In a basic flora course I am taking, we use a field flora to identify wild plants. The flora is an identification key which works like a gigantic flow diagram: to identify an unknown plant species, you start at the top, get asked consecutive binary questions about its characteristics and depending on the answers, you are directed to follow up questions until you finally arrive at a final node in the flow diagram which corresponds to a plant species. Technically, such a flora is known as a single-access key because of its single point of entry and its fixed order of questions. It is also a dichotomous key since all questions have two mutually exclusive answers.
A disadvantage of this type of plant identification method is their linearity: if you cannot provide an answer to a question at a certain point in the flow diagram, you are more or less stuck and have to follow both paths from the question to follow-up questions in the hope that one branch will turn out to be the identifying one. This can for example happen because you are working from photos which do not have all the details, or, in my case, when you do not completely understand the technical botanical terms that are used in the question.
An alternative approach to flow-based identification methods, is a multi-access key method. In such an approach, you provide the observed value for an arbitrary plant characteristic to narrow down (i.e. filter) the set of possible plant species to those that satisfy the observed value. By progressively adding more observed values and filtering on characteristics you are finally left with one or only a small set of candidates. The big advantage of this approach is that there is no fixed order in which the user has to progress through the key and that the user can enter at any point.
In this sense multi-access plant identification methods are non-linear: there is no fixed order of questions and you can start with arbitrary characteristics to narrow down the set of potential candidates until you have filtered out all but the identifying species.
In particular, for groups of similar-looking plants multi-access keys are advantageous since you can quickly filter the candidate set based on available characteristic observations.
As an experiment I wanted to create a simple key with AI for the Senecio species, which contains very similar-looking plants (at least in my eyes as a botanical beginner).
In a first try, I just asked Claude 4 to generate such a web-based application. Although it generated a nice looking app, it was difficult to verify its correctness since the data, logic and presentation were all tightly coupled. An additional problem was that Claude repeatedly exceeded its context window since it included all the data, JavaScript, and HTML in a single file.
So I decided to separate the data generation part from the logic and presentation parts. I started with asking ChatGPT 3o for a list of Senecio and related variants that occur in the Netherlands:
Dutch name | Scientific name | Occurrence in NL |
---|---|---|
Bezemkruiskruid | Senecio inaequidens DC. | common |
Boskruiskruid | Senecio sylvaticus L. | common |
Jakobskruiskruid / Duinkruiskruid | Jacobaea vulgaris Gaertn. (≡ Senecio jacobaea) | common |
Klein kruiskruid | Senecio vulgaris L. | common |
Kleverig kruiskruid | Senecio viscosus L. | common |
Moerasandijvie | Tephroseris palustris (L.) Rchb. (≡ Senecio congestus) | fairly rare |
Moeraskruiskruid | Jacobaea paludosa (≡ Senecio paludosus) | fairly rare |
Rivierkruiskruid | Senecio fluviatilis (= S. sarracenicus) | rare |
Schaduwkruiskruid | Senecio ovatus (syn. S. fuchsii) | rare |
Viltig kruiskruid | Jacobaea erucifolia (≡ Senecio erucifolius) | common |
Waterkruiskruid | Jacobaea aquatica (≡ Senecio aquaticus) | common |
Oostelijk kruiskruid | Senecio vernalis Waldst. & Kit. | rare |
Glanzend kruiskruid | Senecio squalidus L. | very rare |
Zilverkruiskruid | Jacobaea maritima (≡ Senecio cineraria) | rare |
The correctness of this list can be easily verified manually using the provided links.
Next, I asked ChatGPT 3o to find for each species in the list a set of observable characteristics and produce the output as a JSON file. I gave it some examples of characteristics such as leaf shape and height. The full JSON output (in Dutch) can be found in an appendix but here, as an example, is the first entry Bezemkruiskruid (Broom ragwort) on the list, translated into English:
{
"species": "Broom ragwort",
"species_latin": "Senecio inaequidens",
"ray_florets_number": "many (≈ 10–13)",
"leaf_shape": "narrow, unlobed",
"leaf_surface": "smooth",
"black_involucre": "yes",
"height_cm": "20–110",
"stem_hairiness": "glabrous",
"inflorescence": "loose panicle",
"flowering_period": "May–Dec",
"rosette": "no",
"flower_head_diameter_mm": "18–25",
"extra_hint": "long, slender leaves",
"occurrence": "common (established)",
"url": "https://www.verspreidingsatlas.nl/1733",
"habitat": "dry, disturbed urban and railway embankments, gravel and sandy ruderal habitats",
"identification_details": "Perennial plant. Can be confused with Oxford ragwort, but broom ragwort has very narrow, linear leaves."
}
These species characteristics can all be manually checked on the Internet. It was already quite high-quality due to the anti-hallucination measures I take. Another technique I used was re-entering the data into Google 2.5 Pro and other AIs, specifically asking them to check its correctness.
After finalizing the data for the Senecio multi-access key, the next step is to define its logic. This consists of:
- a list of filters, where each filter corresponds to a specific species characteristic
- for each filter a set of possible filter values
- a mapping from each filter value to the set of characteristic values that satisfy it
When a filter is assigned to a filter value, species are excluded if their characteristic value is not included in the set mapped from that filter value.
For example, some filters like rosette are quite simple:
"rosette": {
"displayName": "Rosette",
"description": "Does the plant form a leaf rosette at the base of the stem?",
"options": {
"yes": ["yes"],
"no": ["no"]
}
}
Other like height are somewhat more involved:
"height_cm": {
"displayName": "Height (cm)",
"description": "The average height of a mature plant in centimetres.",
"options": {
"low (≤60 cm)": ["7–50", "15–45", "15–50", "20–50", "15–60"],
"medium (61–100 cm)": ["15–80", "30–100", "40–100"],
"tall (101–150 cm)": ["20–110", "15–150", "90–150", "60–150"],
"very tall (>150 cm)": ["60–180"]
}
}
Note that mapping the filter value low
to the range 20–110
may seem counter-intuitive. However, observing a plant with low height (≤60 cm) should not exclude species whose height falls within 20–110 cm. More generally, if a filter value and a characteristic value intersect, the characteristic value should be included in the mapping for that filter value. The underlying intuition is that if the intersection is empty, then selecting the filter value excludes species with that characteristic value.
The complete list of filters, filter values, and mappings can be found (in Dutch) in an appendix.
Once the data and logic of the application were established, I prompted Gemini 2.5 Pro to generate a web app using vanilla JavaScript and HTML. The app dynamically loads the species.json
and filters.json
files and presents a filtering GUI to the user. To make the app fully generic for any set of species, I added a content.json
file to define the web app’s title and other interface text:
{
"title": "Identification of Ragworts",
"subtitle": "An interactive tool to identify species of the genera <em>Senecio</em> and <em>Jacobaea</em> found in the Netherlands, based on their characteristics.",
...
}
The final result can be found here.
Appendix: Species
Species
[
{
"soort_nl": "Bezemkruiskruid",
"soort_latijn": "Senecio inaequidens",
"lint_bloemen_aantal": "veel (≈ 10–13)",
"blad_vorm": "smal, onlobbig",
"blad_oppervlak": "glad",
"zwart_omwindsel": "ja",
"hoogte_cm": "20–110",
"stengel_beharing": "kaal",
"bloeiwijze": "losse pluim",
"bloeitijd": "mei-dec",
"rozet": "nee",
"hoofdjes_diameter_mm": "18–25",
"extra_hint": "lange, slanke bladeren",
"voorkomen": "algemeen (ingeburgerd)",
"url": "https://www.verspreidingsatlas.nl/1733",
"biotoop": "droge, verstoorde stads- en spoorbermen, steenslag en zandige ruderalen",
"determinatie_details": "Vaste plant. Verwarring mogelijk met Glanzend kruiskruid, maar Bezemkruiskruid heeft zeer smalle, lijnvormige bladeren."
},
{
"soort_nl": "Boskruiskruid",
"soort_latijn": "Senecio sylvaticus",
"lint_bloemen_aantal": "zeer kort, vaak opgerold (8–15)",
"blad_vorm": "diep gelobd",
"blad_oppervlak": "zacht behaard",
"zwart_omwindsel": "vaak ja",
"hoogte_cm": "15–80",
"stengel_beharing": "spinnenwebachtig behaard",
"bloeiwijze": "brede, uitgespreide pluim",
"bloeitijd": "jun-okt",
"rozet": "ja",
"hoofdjes_diameter_mm": "5–8",
"extra_hint": "spinnenwebachtige haren",
"voorkomen": "algemeen (inheems)",
"url": "https://www.verspreidingsatlas.nl/1190",
"biotoop": "open zandige kapvlakten, bosranden en verstoorde heide",
"determinatie_details": "Eenjarige plant. Heeft een sterke, onaangename geur bij kneuzing van de bladeren."
},
{
"soort_nl": "Jakobskruiskruid",
"soort_latijn": "Jacobaea vulgaris",
"lint_bloemen_aantal": "veel (≈ 13)",
"blad_vorm": "diep gelobd",
"blad_oppervlak": "glad",
"zwart_omwindsel": "ja",
"hoogte_cm": "30–100",
"stengel_beharing": "zwak behaard",
"bloeiwijze": "dicht vlak scherm",
"bloeitijd": "jun-okt",
"rozet": "ja",
"hoofdjes_diameter_mm": "15–20",
"extra_hint": "schermen tot 20 cm Ø",
"voorkomen": "algemeen (inheems)",
"url": "https://www.verspreidingsatlas.nl/2290",
"biotoop": "matig voedselarme graslanden, bermen, duinen en heiden op zand",
"determinatie_details": "Tweejarige plant, giftig voor de meeste zoogdieren. Verwarring met Boerenwormkruid, die echter geen lintbloemen heeft."
},
{
"soort_nl": "Klein kruiskruid",
"soort_latijn": "Senecio vulgaris",
"lint_bloemen_aantal": "geen",
"blad_vorm": "onregelmatig gelobd",
"blad_oppervlak": "licht behaard",
"zwart_omwindsel": "ja",
"hoogte_cm": "7–50",
"stengel_beharing": "licht behaard",
"bloeiwijze": "compacte pluim",
"bloeitijd": "jan-dec",
"rozet": "nee",
"hoofdjes_diameter_mm": "5–8",
"extra_hint": "dichte knop-hoofdjes (meestal zonder lintbloemen)",
"voorkomen": "zeer algemeen (inheems)",
"url": "https://www.verspreidingsatlas.nl/1192",
"biotoop": "tuinen, bouwland en allerlei verstoorde gronden",
"determinatie_details": "Eenjarige plant die het hele jaar kan bloeien. De nootjes (zaadjes) zijn behaard. Een zeldzame variëteit (var. hibernicus) heeft wel korte lintbloemen."
},
{
"soort_nl": "Kleverig kruiskruid",
"soort_latijn": "Senecio viscosus",
"lint_bloemen_aantal": "± 13, vaak teruggerold",
"blad_vorm": "diep lobbig",
"blad_oppervlak": "klier-kleverig",
"zwart_omwindsel": "ja",
"hoogte_cm": "15–45",
"stengel_beharing": "klierharen (kleverig)",
"bloeiwijze": "losse tuil",
"bloeitijd": "jul-sep",
"rozet": "nee",
"hoofdjes_diameter_mm": "8–12",
"extra_hint": "omwindsel vaak stoffig",
"voorkomen": "algemeen (ingeburgerd)",
"url": "https://www.verspreidingsatlas.nl/1191",
"biotoop": "droge, zandige ruigten langs wegen, bouwterreinen en kust",
"determinatie_details": "Eenjarige plant. De hele plant voelt zeer kleverig aan door klierharen en heeft een sterke, afstotende geur."
},
{
"soort_nl": "Moerasandijvie",
"soort_latijn": "Tephroseris palustris",
"lint_bloemen_aantal": "± 21",
"blad_vorm": "rozetbladeren bochtig getand, stengelbladeren lancetvormig",
"blad_oppervlak": "villig",
"zwart_omwindsel": "nee",
"hoogte_cm": "15–150",
"stengel_beharing": "viltig",
"bloeiwijze": "dichte tuil",
"bloeitijd": "jun-jul",
"rozet": "ja",
"hoofdjes_diameter_mm": "6–13",
"extra_hint": "holle, viltige stengel; buitenomwindsel afwezig",
"voorkomen": "vrij algemeen",
"url": "https://www.verspreidingsatlas.nl/1184",
"biotoop": "natte moeras- en oeverpionierplekken op veen en slib",
"determinatie_details": "Tweejarige of vaste plant. Typische pionier op natte, open plekken. De afwezigheid van een buitenomwindsel is een sleutelkenmerk."
},
{
"soort_nl": "Moeraskruiskruid",
"soort_latijn": "Jacobaea paludosa",
"lint_bloemen_aantal": "12–20",
"blad_vorm": "lancet, zwak getand",
"blad_oppervlak": "glad (onderzijde grijsachtig viltig)",
"zwart_omwindsel": "nee",
"hoogte_cm": "60–180",
"stengel_beharing": "kaal",
"bloeiwijze": "scherm-tuil",
"bloeitijd": "jun-aug",
"rozet": "nee",
"hoofdjes_diameter_mm": "20–30",
"extra_hint": "tot 2 m hoog in riet",
"voorkomen": "vrij zeldzaam (kwetsbaar)",
"url": "https://www.verspreidingsatlas.nl/1189",
"biotoop": "natte, voedselrijke ruigten en rietlanden langs rivieren",
"determinatie_details": "Vaste plant. Typisch voor rietlanden en moerassige oevers. Vormt vaak dichte bestanden door wortelstokken."
},
{
"soort_nl": "Rivierkruiskruid",
"soort_latijn": "Senecio sarracenicus",
"lint_bloemen_aantal": "6–8",
"blad_vorm": "breed ovaal",
"blad_oppervlak": "glad",
"zwart_omwindsel": "ja",
"hoogte_cm": "90–150",
"stengel_beharing": "kaal",
"bloeiwijze": "brede schermvormige pluim",
"bloeitijd": "aug-sep",
"rozet": "nee",
"hoofdjes_diameter_mm": "20–30",
"extra_hint": "brede bladeren, natte oevers",
"voorkomen": "zeldzaam",
"url": "https://www.verspreidingsatlas.nl/1186",
"biotoop": "vochtige, voedselrijke uiterwaarden en rivieroevers",
"determinatie_details": "Vaste plant met wortelstokken, vormt vaak groepen. De bladeren zijn enkelvoudig en getand, niet diep ingesneden."
},
{
"soort_nl": "Schaduwkruiskruid",
"soort_latijn": "Senecio ovatus",
"lint_bloemen_aantal": "2–7",
"blad_vorm": "ovaal-lancet",
"blad_oppervlak": "glad",
"zwart_omwindsel": "ja",
"hoogte_cm": "60–150",
"stengel_beharing": "kaal",
"bloeiwijze": "plat scherm",
"bloeitijd": "jun-sep",
"rozet": "nee",
"hoofdjes_diameter_mm": "15–25",
"extra_hint": "groeit in halfschaduw",
"voorkomen": "zeldzaam",
"url": "https://www.verspreidingsatlas.nl/1187",
"biotoop": "vochtige, half beschaduwde bosranden en beekdalruigten",
"determinatie_details": "Vaste plant. De onderste bladeren zijn duidelijk gesteeld, de bovenste zittend. Kenmerkend voor beschaduwde, vochtige bossen."
},
{
"soort_nl": "Viltig kruiskruid",
"soort_latijn": "Jacobaea erucifolia",
"lint_bloemen_aantal": "veel",
"blad_vorm": "diep lobbig",
"blad_oppervlak": "grijs-viltig",
"zwart_omwindsel": "nee",
"hoogte_cm": "40–100",
"stengel_beharing": "grijs-viltig",
"bloeiwijze": "smalle scherm-pluim",
"bloeitijd": "jul-sep",
"rozet": "ja",
"hoofdjes_diameter_mm": "12–15",
"extra_hint": "blad grijsgroen, wollig; vormt wortelstokken",
"voorkomen": "algemeen",
"url": "https://www.verspreidingsatlas.nl/1185",
"biotoop": "droge, kalkrijke duingraslanden en open zand",
"determinatie_details": "Vaste plant die zich verspreidt met wortelstokken en matten kan vormen. De grijs-viltige beharing is een sleutelkenmerk."
},
{
"soort_nl": "Waterkruiskruid",
"soort_latijn": "Jacobaea aquatica",
"lint_bloemen_aantal": "12–15",
"blad_vorm": "liervormig tot veerdelig",
"blad_oppervlak": "glad",
"zwart_omwindsel": "nee",
"hoogte_cm": "15–80",
"stengel_beharing": "spinrag-behaard",
"bloeiwijze": "dolden-risp",
"bloeitijd": "jun-aug",
"rozet": "ja",
"hoofdjes_diameter_mm": "20–30",
"extra_hint": "nat grasland-pionier",
"voorkomen": "zeer zeldzaam (bedreigd)",
"url": "https://www.verspreidingsatlas.nl/1183",
"biotoop": "natte graslanden, greppels en trilvenen",
"determinatie_details": "Tweejarige plant. Verwarring met Jakobskruiskruid, maar Waterkruiskruid groeit op permanent natte plekken en heeft minder diep ingesneden bladeren."
},
{
"soort_nl": "Oostelijk kruiskruid",
"soort_latijn": "Senecio vernalis",
"lint_bloemen_aantal": "lang",
"blad_vorm": "diep lobbig, wollig",
"blad_oppervlak": "behaard",
"zwart_omwindsel": "ja",
"hoogte_cm": "15–50",
"stengel_beharing": "viltig",
"bloeiwijze": "losse tuil",
"bloeitijd": "mei-nov",
"rozet": "ja",
"hoofdjes_diameter_mm": "20–30",
"extra_hint": "voorjaarsplant",
"voorkomen": "lokaal (adventief)",
"url": "https://www.verspreidingsatlas.nl/1734",
"biotoop": "open, zandige akkers en jonge stuifduinen in voorjaar",
"determinatie_details": "Eenjarige voorjaarsbloeier. Kan massaal voorkomen op zandige akkers. De wollige beharing is opvallend."
},
{
"soort_nl": "Glanzend kruiskruid",
"soort_latijn": "Senecio squalidus",
"lint_bloemen_aantal": "± 13",
"blad_vorm": "lyratisch lobbig",
"blad_oppervlak": "(bijna) glad",
"zwart_omwindsel": "ja",
"hoogte_cm": "20–50",
"stengel_beharing": "kaal",
"bloeiwijze": "onregelmatig scherm",
"bloeitijd": "apr-dec",
"rozet": "nee",
"hoofdjes_diameter_mm": "15–25",
"extra_hint": "zwarte omwindsel-puntjes duidelijk",
"voorkomen": "uitbreidend (adventief)",
"url": "https://www.verspreidingsatlas.nl/5277",
"biotoop": "droge stenige stadsbiotopen, spoorballast en kademuren",
"determinatie_details": "Eenjarige of vaste plant. Verwarring met Bezemkruiskruid, maar Glanzend kruiskruid heeft duidelijk gelobde bladeren."
},
{
"soort_nl": "Zilverkruiskruid",
"soort_latijn": "Jacobaea maritima",
"lint_bloemen_aantal": "10–13",
"blad_vorm": "diep veerdelig",
"blad_oppervlak": "zilver-viltig",
"zwart_omwindsel": "nee",
"hoogte_cm": "15–60",
"stengel_beharing": "zilver-viltig",
"bloeiwijze": "losse tuil",
"bloeitijd": "jun-aug",
"rozet": "ja",
"hoofdjes_diameter_mm": "12–13",
"extra_hint": "hele plant zilverwit",
"voorkomen": "zeldzaam / verwilderend",
"url": "https://www.verspreidingsatlas.nl/5441",
"biotoop": "kustduinen, zeedijken en verwilderde tuinen op kalkrijk zand",
"determinatie_details": "Vaste plant (halfheester). Vaak aangeplant en verwilderd in de duinen. De zilverwitte, viltige beharing over de hele plant is onmiskenbaar."
}
]
Appendix: Filters
Filters
{
"filters": {
"zwart_omwindsel": {
"displayName": "Zwart omwindsel",
"description": "Heeft de plant een krans van zwarte puntjes aan de top van het omwindsel (de kelkachtige structuur onder de bloemhoofdjes)?",
"options": {
"ja": ["ja", "vaak ja"],
"nee": ["nee"]
}
},
"rozet": {
"displayName": "Rozet",
"description": "Vormt de plant een bladrozet aan de basis van de stengel?",
"options": {
"ja": ["ja"],
"nee": ["nee"]
}
},
"lint_bloemen_aantal": {
"displayName": "Aantal lintbloemen",
"description": "Het aantal lintbloemen (de 'blaadjes' van de bloem) per bloemhoofdje.",
"options": {
"geen": ["geen"],
"weinig (≤8)": ["2–7", "6–8"],
"gemiddeld (9–13)": [
"zeer kort, vaak opgerold (8–15)",
"veel (≈ 10–13)",
"veel (≈ 13)",
"± 13, vaak teruggerold",
"± 13",
"10–13"
],
"veel/lang (≥14)": ["12–15", "12–20", "± 21", "lang"]
}
},
"blad_oppervlak": {
"displayName": "Bladoppervlak",
"description": "Hoe voelt het oppervlak van de bladeren aan?",
"options": {
"glad": ["glad", "(bijna) glad", "glad (onderzijde grijsachtig viltig)"],
"behaard": ["zacht behaard", "licht behaard", "spinrag-behaard", "spinnenwebachtig behaard"],
"viltig/villig": ["villig", "viltig", "zilver-viltig", "grijs-viltig"],
"kleverig": ["klier-kleverig"]
}
},
"stengel_beharing": {
"displayName": "Stengelbeharing",
"description": "Is de stengel kaal, behaard, viltig of kleverig?",
"options": {
"kaal": ["kaal"],
"behaard": ["spinnenwebachtig behaard", "zwak behaard", "licht behaard", "spinrag-behaard"],
"viltig": ["viltig", "grijs-viltig"],
"kleverig": ["klierharen (kleverig)"]
}
},
"blad_vorm": {
"displayName": "Bladvorm",
"description": "De algemene vorm van de bladeren.",
"options": {
"smal/lineair": ["smal, onlobbig"],
"diep gelobd/lobbig": ["diep gelobd", "diep lobbig", "diep lobbig, wollig", "lyratisch lobbig"],
"onregelmatig gelobd": ["onregelmatig gelobd"],
"lancet/ovaal": [
"lancet, zwak getand",
"rozetbladeren bochtig getand, stengelbladeren lancetvormig",
"ovaal-lancet"
],
"breed ovaal": ["breed ovaal"],
"liervormig/veerdelig": ["liervormig tot veerdelig", "diep veerdelig"],
"wollig": ["diep lobbig, wollig"]
}
},
"bloeiwijze": {
"displayName": "Bloeiwijze",
"description": "De manier waarop de bloemen in een groep gerangschikt zijn.",
"options": {
"pluim": ["losse pluim", "brede, uitgespreide pluim", "compacte pluim"],
"scherm": ["dicht vlak scherm", "plat scherm", "onregelmatig scherm"],
"tuil": ["losse tuil", "dichte tuil"],
"scherm-pluim / scherm-tuil": ["smalle scherm-pluim", "brede schermvormige pluim", "scherm-tuil"],
"dolden-risp": ["dolden-risp"]
}
},
"hoogte_cm": {
"displayName": "Hoogte (cm)",
"description": "De gemiddelde hoogte van een volwassen plant in centimeters.",
"options": {
"laag (≤60 cm)": ["7–50", "15–45", "15–50", "20–50", "15–60"],
"middel (61–100 cm)": ["15–80", "30–100", "40–100"],
"hoog (101–150 cm)": ["20–110", "15–150", "90–150", "60–150"],
"zeer hoog (>150 cm)": ["60–180"]
}
},
"bloeitijd": {
"displayName": "Bloeitijd",
"description": "De periode van het jaar waarin de plant bloeit.",
"options": {
"jaarrond": ["jan-dec"],
"vroege bloei (apr–mei)": ["mei-dec", "mei-nov", "apr-dec"],
"midzomer (jun–jul)": ["jun-okt", "jun-jul", "jun-aug", "jun-sep", "jul-sep"],
"nazomer (aug–sep)": ["aug-sep", "jul-sep", "jun-sep"],
"late bloei (okt–dec)": ["mei-dec", "jun-okt", "jan-dec", "apr-dec"]
}
},
"hoofdjes_diameter_mm": {
"displayName": "Diameter hoofdjes (mm)",
"description": "De diameter van de individuele bloemhoofdjes in millimeters.",
"options": {
"klein (≤8 mm)": ["5–8"],
"middel (9–15 mm)": ["8–12", "6–13", "12–15"],
"groot (16–25 mm)": ["15–20", "18–25", "15–25"],
"zeer groot (≥26 mm)": ["20–30"]
}
},
"biotoop": {
"displayName": "Biotoop",
"description": "De typische natuurlijke omgeving of habitat waar de plant groeit.",
"options": {
"droog ruderaal/stads": [
"droge, verstoorde stads- en spoorbermen, steenslag en zandige ruderalen",
"tuinen, bouwland en allerlei verstoorde gronden",
"droge stenige stadsbiotopen, spoorballast en kademuren"
],
"open zand/heide": [
"open zandige kapvlakten, bosranden en verstoorde heide",
"droge, kalkrijke duingraslanden en open zand",
"open, zandige akkers en jonge stuifduinen in voorjaar"
],
"grasland/berm": [
"matig voedselarme graslanden, bermen, duinen en heiden op zand"
],
"nat/moeras/ruigte": [
"natte moeras- en oeverpionierplekken op veen en slib",
"natte, voedselrijke ruigten en rietlanden langs rivieren",
"vochtige, voedselrijke uiterwaarden en rivieroevers",
"natte graslanden, greppels en trilvenen"
],
"bos/halfschaduw": [
"vochtige, half beschaduwde bosranden en beekdalruigten"
],
"kust/duin": [
"droge, zandige ruigten langs wegen, bouwterreinen en kust",
"kustduinen, zeedijken en verwilderde tuinen op kalkrijk zand"
]
}
}
}
}