Commit 00279ead authored by Roelofsen, Hans's avatar Roelofsen, Hans
Browse files

new version of plant draagkracht method

parent 3358372d
"""
Python tool for generating DRAAGKRACHT numbers for plant species for use in conjunction with the MNP model.
Essentially same content as dk_plant.py, but with improved UI, cleaner coding and elaborate output
Hans Roelofsen, WEnR, june 2021
"""
import os
import numpy as np
import itertools
import pandas as pd
import sys
import argparse
import datetime
sys.path.append(r'c:/apps/proj_code/benb_utils')
from draagkracht_ww import draagkracht_ww as dk_ww
from fix_bt import fix_bt
from speciescode2taxon import speciescode2taxon as code2tax
def plant_dk(ffargs):
"""
Function to calculate draagkracht, see help above.
:param A:
:param th_dk:
:param th_f:
:param th_t:
:param sp_src:
:param bt_src:
:param out_dir:
:return: *.csv and *.txt
"""
# Gather default data on plants
plant_dir = r'W:\PROJECTS\MNP2020\MNP_2020\c_fases\f7_draagkracht\a_source_data\plant'
# Vertaling associatie <-> beheertype. Add generalized syntaxon code and repair beheertypen ("01.02" -> "N01.02.00")
plant_associaties_src = 'vertaling_IPO_ASSO_2009_ps.xls' # Vertaling Associatie --> Beheertype
associaties = pd.read_excel(os.path.join(plant_dir, plant_associaties_src), sheet_name='vertaling_IPO_ASSO_2009')
associaties['syntaxon_gen'] = associaties.short.str.slice(stop=6).str.upper() # Generalize sub-Ass to Associatie
associaties['beheertype'] = associaties.Bc.apply(fix_bt, as_mnp=True) # Fix beheertypen codes
# Read plant response (Trouw/Frequentie) to Associaties, add generalized syntaxon code to plant response table
plant_responses_src = 'q_syntaxa_soorten_frequentie_trouwsoorten.xlsx' # Trouwgraad & frequentie soort/associatie
responses = pd.read_excel(os.path.join(plant_dir, plant_responses_src), sheet_name='q_soorten_verbonden_Wieger')
responses['syntaxon_gen'] = responses.Syntaxon_code.str.slice(stop=6).str.upper()
# Get master list of beheertypen
bt_master_src = r'c:\apps\proj_code\benb_utils\resources\snl_beheertypen.csv'
bt_master = pd.read_csv(bt_master_src, sep=',', comment='#', quotechar='"')
btcode2omschrijving = dict(zip(bt_master.LAND_TYPE_CODE.apply(fix_bt, as_mnp=True), bt_master.LST_NAME))
# Get default mnp draagkracht values
mnp_dk_src = r'w:\PROJECTS\qmar\MNP-SNL-ParameterSet\Parameters_v06_2019_12_09\03_MNP_versie6_par_density_factors_BT2019_v2.csv'
mnp_dk = pd.read_csv(mnp_dk_src, sep=',', usecols=['Species_code', 'Land_type_code', 'Land_type_quality'])
# Read list of equested beheertypen to analyse, add mnp-style code
try:
bts = pd.read_csv(args.bt_src, sep=',', usecols=['Land_type_code'])
except ValueError as e:
print('Error: beheertypen list must contain column "Land_type_code"')
raise
bts['bt_code'] = bts.Land_type_code.apply(fix_bt, as_mnp=True) # Add MNP-style Beheertype codes
bts.drop_duplicates(subset='bt_code', inplace=True)
# Map 1 beheertype to list of Associaties
bt2asso = dict.fromkeys(bts.bt_code, [])
for bt in bts.bt_code:
bt2asso[bt] = list(set(associaties.loc[associaties.beheertype == bt, 'syntaxon_gen']))
# Read list of equested species, add syntax group and assert all plants
try:
species = pd.read_csv(args.sp_src, sep=',', usecols=['Species_code', 'Local_name', 'Scientific_name'])
except ValueError:
print('Error: species list must contain columns "Species_code" (S09xxxxxx) "Local_name" "Scientific_name"')
species.drop_duplicates(subset='Species_code', inplace=True)
assert all(species.Species_code.apply(code2tax) == 'P'), "Error: non plants found in requested species list."
# species dicts
code2scientific = dict(zip(species.Species_code, species.Scientific_name))
code2local = dict(zip(species.Species_code, species.Local_name))
"""Loop trough alll Species/Beheertype combis. Calculate mean frequentie/trouw where possible. """
dk_lst = []
for (sp_code, bt) in itertools.product(species.Species_code, bts.bt_code):
print('Doing {0}-{1}'.format(sp_code, bt))
# Dictionary to hold results
d = dict.fromkeys(['Scientific_name', 'Land_type_code', 'mean_trouw', 'mean_freq', 'hits', 'hits_gte_th', 'dk_ww'],
np.nan)
# Get initial selection from plant response data
d['hits'] = responses.loc[(responses.Soortnaam == code2scientific[sp_code]) &
(responses.syntaxon_gen.isin(bt2asso[bt]))].shape[0]
# Narrow selection further down to rows meeting thresholds
sel1 = responses.loc[(responses.Soortnaam == code2scientific[sp_code]) &
(responses.syntaxon_gen.isin(bt2asso[bt])) &
(responses.Frequentie >= args.th_f) &
(responses.Trouw >= args.th_t), :].index
d['hits_gte_th'] = len(sel1)
d['mean_freq'] = responses.loc[sel1, 'Frequentie'].mean()
d['mean_trouw'] = responses.loc[sel1, 'Trouw'].mean()
d['dk_ww'] = dk_ww(frequentie=d['mean_freq'], trouw=d['mean_trouw'], th=args.th_dk, tuning=args.A)
d['Species_code'] = sp_code
d['Scientific_name'] = code2scientific[sp_code]
d['Local_name'] = code2local[sp_code]
d['Land_type_code'] = bt
d['Land_type_omschrijving'] = btcode2omschrijving[bt]
# Wrap up results and append to list
dk_lst.append(pd.DataFrame(d, index=pd.RangeIndex(1)))
# Overall draagkracht dataframe and set 0 to Nan
dk = pd.concat(dk_lst)
dk.hits = np.where(dk.hits == 0, np.nan, dk.hits)
dk.hits_gte_th = np.where(dk.hits_gte_th == 0, np.nan, dk.hits_gte_th)
# Merge with MNP default draagkracht values
dk = pd.merge(left=dk.assign(combi=dk.Species_code.str.cat(dk.Land_type_code)),
right=mnp_dk.assign(combi=mnp_dk.Species_code.str.cat(mnp_dk.Land_type_code))\
.drop(labels=['Species_code', 'Land_type_code'], axis=1)\
.rename(mapper={'Land_type_quality': 'dk_mnp'}, axis=1),
left_on='combi', right_on='combi', how='left').drop('combi', axis=1)
# Report on results
ts = datetime.datetime.now().strftime("%Y%m%d%H%M")
ts_full = datetime.datetime.now().strftime("%Y%m%dt%H%M%S")
species_requested = species.shape[0] # Aantal soorten gevraagd
bts_requested = bts.shape[0] # Aantal BTs gevraagd
combis_potential = np.multiply(species_requested, bts_requested) # potentiaal aantal draakgrachts
combis_w_data = dk.hits.notna().sum() # combi where data is provided
combis_meeting_th = dk.hits_gte_th.notna().sum() # combies where Trouw & Frequentie data meets criteria
combis_lost = (dk.dk_ww.isna() & dk.dk_mnp.notna()).sum() # Combi die eerst wel, nu geen Draagkracht heeft
combis_new = (dk.dk_ww.notna() & dk.dk_mnp.isna()).sum() # Combi die eerst niet, nu wel Draagkracht heeft
combis_kept = (dk.dk_ww.notna() & dk.dk_mnp.notna()).sum() # Combie die die eerst wel en nog steeds DK heeft
combis_never = (dk.dk_ww.isna() & dk.dk_mnp.isna()).sum() # Combie die toen niet, nu niet, nooit niet DK heeft
# X soorten met Wieger Wamelink draagkrachten voor N beheertypen
aantal_bts, aantal_soorten = np.unique(pd.pivot_table(data=dk, index='Species_code', aggfunc='count', values='dk_ww'),
return_counts=True)
dkww_df = pd.DataFrame({'n_beheertypen': aantal_bts, 'n_soorten': aantal_soorten})
report = \
"==RAPPORT AUTOMATISCHE DRAAGKRACHT BEPALING VOOR PLANTEN TBV MNP==\n"\
"door: {0}\ndatum: {1}\n\n" \
"draagkracht formule:\n dk(X,BT) = max({2}, min(((max(F,T)/100) * {3}), 1))\n\n" \
"where:\n"\
" dk = draagkracht\n"\
" X = plant species\n"\
" BT = beheertype\n"\
" F = mean(f(X,A1)... f(X, An)) where f = Frequentie of X in Associaties A1...An related to BT and f >= {4}\n"\
" T = mean(t(X,A1)... t(X, An)) where t = Trouw of X in Associaties A1...An related to BT and t >= {5}.\n\n"\
"input soortenlijst: {6}\n"\
"input beheertypen: {7}\n"\
"referentie trouw/freq: {8}\n"\
"referentie associaties: {9}\n"\
"referentie beheertypen: {10}\n"\
"referentie mnp draagkr: {11}\n\n"\
"n species gevraagd: {12}\n" \
"n beheertypen gevraagd: {13}\n"\
"n potentiale dk combis: {14}\n"\
"n combis w data: {15}\n"\
"n combis w data >= th: {16}\n"\
"n combis new tov ref: {17}\n"\
" lost : {18}\n"\
" kept : {19}\n"\
" never : {20}\n\n"\
"Aantal soorten met draagkracht voor X beheertypen:\n"\
"{21}\n"\
"Draaitabel:\n"\
"{22}".format(os.getenv('USERNAME'),
ts,
args.th_dk,
args.A,
args.th_f,
args.th_t,
args.sp_src,
args.bt_src,
os.path.join(plant_dir, plant_responses_src),
os.path.join(plant_dir, plant_associaties_src),
bt_master_src,
mnp_dk_src,
species_requested,
bts_requested,
combis_potential,
combis_w_data,
combis_meeting_th,
combis_new,
combis_lost,
combis_kept,
combis_never,
dkww_df.to_csv(index=False, sep='\t', line_terminator='\n'),
pd.pivot_table(dk.assign(Soort=dk.Scientific_name.str.cat(dk.Local_name, sep="_"),
BT=dk.Land_type_code.str.cat(dk.Land_type_omschrijving, sep='_')),
index='Soort', columns='BT', values='dk_ww', aggfunc='mean')\
.to_csv(sep=',', line_terminator='\n'))
basename = '03PlantDensityFactors{0}'.format(ts_full)
# Write report
with open(os.path.join(args.out_dir, '{}.txt'.format(basename)), 'w') as f:
f.write(report)
# MNP style CSV output
dk.dropna(axis=0, subset=['dk_ww'])\
.rename(mapper={'dk_ww': 'Land_type_quality'}, axis=1)\
.loc[:, ['Species_code', 'Land_type_code', 'Land_type_quality', 'Local_name', 'Scientific_name',
'Land_type_omschrijving']]\
.round({'Land_type_quality': 2})\
.to_csv(os.path.join(args.out_dir, '{}.csv'.format(basename)), sep=',', header=True, index=False)
print('...done')
if __name__ == '__main__':
def test(fargs):
# Provide default values to the args Namespace
setattr(args, 'A', 5)
setattr(args, 'th_dk', 0.1)
setattr(args, 'th_f', 5)
setattr(args, 'th_t', 5)
setattr(args, 'sp_src', r'.\sample_data\species_list.csv')
setattr(args, 'bt_src', r'.\sample_data\bts.csv')
setattr(args, 'out_dir', r'.\sample_data')
print('Testing...')
try:
plant_dk(fargs)
except AssertionError as e:
print(e)
sys.exit(1)
def full(fargs):
print('Calculating draagkracht as specified...')
try:
plant_dk(fargs)
except AssertionError as e:
print(e)
sys.exit(1)
model_desc = \
'For a list of Species (X1, X2...Xn) and a list of Beheertypen (BT1, BT2...BTn), calculate draagkracht for ' \
'each X-BT combination as:\n\n' \
' dk(X,BT) = max(th_dk, min(((max(F,T)/100) * A), 1))\n\n' \
'where:\n' \
' F = mean(f(X,A1)... f(X, An)) where f = Frequentie of X in Associaties A1...An that are related to BT.\n' \
' T = mean(t(X,A1)... t(X, An)) where t = Trouw of X in Associaties A1...An that are related to BT.\n\n' \
'type "test" for trial run with default values and sample data.\n'\
'type "full" and provide positional and optional arguments below otherwise.\n\n'\
'positional arguments:\n'\
' A parameter, usually between 1-5\n' \
' th_dk overall treshold for draagkracht, usually 0.1\n' \
' th_f treshold for f(X, Ax), usually 5\n' \
' th_t treshold for t(X, Ax), usually 5\n' \
' sp_src CSV list of plant species formatted Species_code, Local_name, Scientific_name\n' \
' bt_src CSV list of Beheertypen with at least column Land_type_code formatted NXX.YY.ZZ or NXX.YY'
parser = argparse.ArgumentParser(description=model_desc, formatter_class=argparse.RawDescriptionHelpFormatter)
subparsers = parser.add_subparsers(dest='subparser_name', help=argparse.SUPPRESS)
parser_test = subparsers.add_parser("test", help='test w sample data', description=model_desc,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser_test.set_defaults(func=test)
parser_full = subparsers.add_parser('full', help='run with user spec data and setting', description=model_desc,
formatter_class=argparse.RawDescriptionHelpFormatter)
parser_full.add_argument('A', help=argparse.SUPPRESS, type=int)
parser_full.add_argument('th_dk', help=argparse.SUPPRESS, type=float)
parser_full.add_argument('th_f', help=argparse.SUPPRESS, type=float)
parser_full.add_argument('th_t', help=argparse.SUPPRESS, type=float)
parser_full.add_argument('sp_src', help=argparse.SUPPRESS, type=str)
parser_full.add_argument('bt_src', help=argparse.SUPPRESS, type=str)
parser_full.add_argument('--out_dir', default=r'./', help='output directory', type=str)
parser_full.set_defaults(func=full)
args = parser.parse_args()
args.func(args)
......@@ -17,14 +17,32 @@ import os
import numpy as np
import itertools
import pandas as pd
from sample.mnp import helpers as hlp
# from mnp import helpers as hlp
import sys
import argparse
# from sample.mnp import helpers as hlp
from mnp import helpers as hlp
sys.path.append(r'c:/apps/proj_code/benb_utils')
from draagkracht_ww import draagkracht_ww as dk_ww
from fix_bt import fix_bt
parser = argparse.ArgumentParser()
parser.add_argument('mul_factor', default=5, help='multiplication factor in WW eq', type=int)
parser.add_argument('trouw_th', default=5, help='treshold for Trouw-graad', type=float)
parser.add_argument('freq_th', default=5, help='treshold for Frequentie-graad', type=float)
parser.add_argument('dk_th', default=0.1, help='minimum draagkracht', type=float)
parser.add_argument('out_dir', help='out_dir')
args = parser.parse_args()
"""output"""
out_dir = args.out_dir
"""Source data"""
plant_dir = r'W:\PROJECTS\MNP2020\c_fases\f7_draagkracht\a_source_data\plant'
plant_dir = r'W:\PROJECTS\MNP2020\MNP_2020\c_fases\f7_draagkracht\a_source_data\plant'
mnp_params_dir = r'w:\PROJECTS\qmar\MNP-SNL-ParameterSet\Parameters_v06_2019_12_09'
# TODO: deze variabele namen zijn nu nog vetonduidelijk!
src_mnp_sp_tax = r'07_MNP_versie4_par_population_factors.csv' # species-codes and Taxonomic group
src_mnp_sp_nms = r'09_MNP_versie4_Group_Species_valid model_468.csv' #species code, local name, scientific name
src_mnp_dk = r'03_MNP_versie6_par_density_factors_BT2019_v2.csv' # current MNP Draagkrachten
......@@ -52,7 +70,7 @@ Reduce sub-associations: 00XX11a --> 00XX11
Repair Beheertype codes in Input sheet vertaling_IPO_ASSO_2009.txt 04.02 --> N04.02.00
'''
assoXbts.loc[:, 'syntaxon_gen'] = assoXbts.short.str.slice(stop=6).str.upper()
assoXbts.loc[:, 'btC'] = assoXbts.Bc.apply(hlp.fix_bt, as_mnp=True)
assoXbts.loc[:, 'btC'] = assoXbts.Bc.apply(fix_bt, as_mnp=True)
'''Reduce sub-associations in Input sheet q_syntaxa_soorten_frequentie_trouwsoorten.txt'''
assoXsps.loc[:, 'syntaxon_gen'] = assoXsps.Syntaxon_code.str.slice(stop=6).str.upper()
......@@ -80,44 +98,55 @@ for row in dk.itertuples():
# np.min([np.multiply(np.divide(np.max([frequentie, trouw]), 100), 5), 1])
sel = assoXsps.loc[(assoXsps.Soortnaam == row.Scientific_name) &
(assoXsps.syntaxon_gen.isin(bt2asso[row.Land_type_code])), :]
(assoXsps.syntaxon_gen.isin(bt2asso[row.Land_type_code])) &
(assoXsps.Frequentie >= args.freq_th) &
(assoXsps.Trouw >= args.trouw_th), :]
if sel.empty:
print('{0} X {1}: failed'.format(row.Scientific_name, row.Land_type_code))
mean_freq, mean_trouw, dk_ww = np.nan, np.nan, np.nan
mean_freq, mean_trouw, draagkracht_ww = np.nan, np.nan, np.nan
else:
mean_freq = sel.Frequentie.mean()
mean_trouw = sel.Trouw.mean()
dk_ww = hlp.draagkracht_ww(frequentie=mean_freq, trouw=mean_trouw, th=0.01)
draagkracht_ww = dk_ww(frequentie=mean_freq, trouw=mean_trouw, th=args.dk_th, tuning=args.mul_factor)
print('{0} X {1}: n={2} freq={3} trouw={4} dk={5}'
.format(row.Scientific_name, row.Land_type_code, sel.shape[0], mean_freq, mean_trouw, dk_ww))
.format(row.Scientific_name, row.Land_type_code, sel.shape[0], mean_freq, mean_trouw, draagkracht_ww))
dk.loc[row.Index, 'mean_frequentie'] = mean_freq
dk.loc[row.Index, 'mean_trouw'] = mean_trouw
dk.loc[row.Index, 'Land_type_quality'] = dk_ww
dk.loc[row.Index, 'Land_type_quality'] = draagkracht_ww
'''Write draagkracht file per species'''
fails = []
goods = []
for species_code in list(set(dk.Species_code)):
local_name = code2localname[species_code].replace(' ', '_')
sel = dk.loc[(dk.Species_code == species_code) & (dk.Land_type_quality.notna()),
['Species_code', 'Land_type_code', 'Land_type_quality']].round({'Land_type_quality': 3})
if not sel.empty:
sel.to_csv(r'c:\apps\z_temp\mnp_dk\03_MNP_versie7_par_density_factors_{}.csv'.format(local_name),
index=False, header=True, sep=',')
print('To file: {}'.format(local_name))
goods.append(sel)
else:
sel = pd.Series({'Species_code': species_code, 'Local_name': local_name,
'Scientific_name': code2scientificname[species_code], 'msg': 'failed'})
fails.append(sel)
print('Fail: {}'.format(local_name))
dk_out = pd.concat(goods) ## TODO: dit zou niet nodig hoeven zijn. Put gelijk uit dk
dk_out.to_csv(os.path.join(out_dir, 'plant_draagkracht_factor{}.csv'.format(args.mul_factor)),
index=False, header=True, sep=',')
if len(fails) > 0:
fails_df = pd.concat(fails, axis=1)
fails_df.T.to_csv(r'c:\apps\z_temp\mnp_dk\03_MNP_versie7_par_density_factors_MISSING.csv',
index=True, header=True, sep='\t')
# fails_df.T.to_csv(r'c:\apps\z_temp\mnp_dk\03_MNP_versie7_par_density_factors_MISSING.csv',
# index=True, header=True, sep='\t')
# TODO: rapport wegschrijven:
# aantal soorten aangeboden
# aantal beheertypen aangeboden
# aantal combinaties voldoen aan alle vereisten
# aantal combinaties wel data, voldoet niet aan vereisten
# etc etc
'''5. Reporting
sp_done = len(set(dk.loc[dk.dk_ww.notna(), 'sp_name']))
......
......@@ -12,7 +12,7 @@ import shapely
import affine
import numbers
import argparse
from matplotlib import pyplot as plt
#from matplotlib import pyplot as plt
import xml.etree.ElementTree as ET
......@@ -673,15 +673,18 @@ def fix_bt(code_in, as_mnp=False):
return head
def draagkracht_ww(frequentie, trouw, th):
def draagkracht_ww(frequentie, trouw, th, mf=5):
"""
Draagkracht formule volgens Wieger Wamelink. Zie MS Teams discussie 16-07-2020 MNP2020/Fase 7 Objectivering Draagk..
min((max(frequentie, trouw)/100) * 5), 1)
:param frequentie: gemiddelde frequentie van soort X binnen beheertype Y
:param trouw: gemiddelde trouw van soort X binnen beheertype Y
:param th: minumum draagkracht value
:param mf: match factor, default 5
:return: draagkracht soort X - beheertype Y combinatie, gemaximaliseerd tot 1.
"""
dk = np.min([np.multiply(np.divide(np.max([frequentie, trouw]), 100), 5), 1])
dk = np.min([np.multiply(np.divide(np.max([frequentie, trouw]), 100), mf), 1])
if dk >= th:
return dk
else:
......@@ -767,4 +770,6 @@ def pnt2square_id(east_north, size, of='full'):
return out[of]
except KeyError:
print('select either full or brief as output format')
raise
\ No newline at end of file
raise
Land_type_code
N12.01.00
N12.02.00
N12.03.00
N12.04
N12.05
Species_code,Scientific_name,Local_name
S09000008,Actaea spicata,Christoffelkruid
S09000013,Agrimonia eupatoria,Gewone agrimonie
S09000014,Agrimonia procera,Welriekende agrimonie
S09000015,Agrostemma githago,Bolderik
S09000031,Allium oleraceum,Moeslook
S09000034,Allium ursinum,Daslook
S09000039,Alopecurus bulbosus,Knolvossenstaart
S09000043,Althaea officinalis,Heemst
S09000044,Alyssum alyssoides,Bleek schildzaad
S09000051,Anacamptis pyramidalis,Hondskruid
S09000053,Anagallis tenella,Teer guichelheil
S09000055,Andromeda polifolia,Lavendelhei
S09000061,Antennaria dioica,Rozenkransje
S09000062,Anthemis arvensis,Valse kamille
S09000063,Anthemis cotula,Stinkende kamille
S09000067,Anthoxanthum aristatum,Slofhak
S09000071,Anthyllis vulneraria,Wondklaver
S09000072,Misopates orontium,Akkerleeuwenbek
S09000074,Aphanes arvensis,Grote leeuwenklauw
S09000076,Apium graveolens,Selderij
S09000077,Apium inundatum,Ondergedoken moerasscherm
S09000091,Armeria maritima,Engels gras
S09000092,Armoracia rusticana,Mierik
S09000093,Arnica montana,Valkruid
S09000094,Arnoseris minima,Korensla
S09000100,Seriphidium maritimum,Zeealsem
S09000105,Asparagus officinalis subsp. prostratus,Liggende asperge
S09000124,Atriplex laciniata,Gelobde melde
S09000138,Beta vulgaris subsp. maritima,Strandbiet
S09000146,Blechnum spicant,Dubbelloof
S09000148,Botrychium lunaria,Gelobde maanvaren
S09000153,Briza media,Bevertjes
S09000157,Bromopsis erecta,Bergdravik
S09000164,Bromus secalinus,Dreps
S09000169,Bunium bulbocastanum,Aardkastanje
S09000170,Bupleurum tenuissimum,Fijn goudscherm
S09000175,Calamagrostis stricta,Stijf struisriet
S09000191,Campanula glomerata,Kluwenklokje
S09000196,Campanula rapunculus,Rapunzelklokje
S09000213,Carex appropinquata,Paardenhaarzegge
S09000214,Carex aquatilis,Noordse zegge
S09000217,Carex buxbaumii,Knotszegge
S09000218,Carex caryophyllea,Voorjaarszegge
S09000221,Carex diandra,Ronde zegge
S09000222,Carex digitata,Vingerzegge
S09000223,Carex dioica,Tweehuizige zegge
S09000230,Carex ericetorum,Heidezegge
S09000231,Carex extensa,Kwelderzegge
S09000233,Carex flava,Gele zegge
S09000234,Carex hartmanii,Kleine knotszegge
S09000236,Carex hostiana,Blonde zegge
S09000239,Carex lasiocarpa,Draadzegge
S09000242,Carex limosa,Slijkzegge
S09000247,Carex pallescens,Bleke zegge
S09000255,Carex pulicaris,Vlozegge
S09000256,Carex punctata,Stippelzegge
S09000266,Carex trinervis,Drienervige zegge
S09000268,Carex vulpina,Voszegge
S09000269,Carlina vulgaris,Driedistel
S09000271,Carum carvi,Karwij
S09000275,Catapodium marinum,Laksteeltje
S09000276,Catapodium rigidum,Stijf hardgras
S09000279,Centaurea cyanus,Korenbloem
S09000284,Centaurea scabiosa,Grote centaurie
S09000288,Centunculus minimus,Dwergbloem
S09000289,Cephalanthera damasonium,Bleek bosvogeltje
S09000293,Cerastium diffusum,Scheve hoornbloem
S09000321,Glebionis segetum,Gele ganzenbloem
S09000323,Chrysosplenium oppositifolium,Paarbladig goudveil
S09000324,Cicendia filiformis,Draadgentiaan
S09000327,Circaea alpina,Alpenheksenkruid
S09000330,Cirsium acaule,Aarddistel
S09000332,Cirsium dissectum,Spaanse ruiter
S09000337,Cladium mariscus,Galigaan
S09000341,Cochlearia officinalis subsp. anglica,Engels lepelblad
S09000343,Cochlearia officinalis subsp. officinalis,Echt lepelblad
S09000345,Colchicum autumnale,Herfsttijloos
S09000346,Comarum palustre,Wateraardbei
S09000356,Cornus suecica,Zweedse kornoelje
S09000360,Corrigiola litoralis,Riempjes
S09000373,Crepis paludosa,Moerasstreepzaad
S09000377,Cucubalus baccifer,Besanjelier
S09000379,Cuscuta epithymum,Klein warkruid
S09000386,Cynosurus cristatus,Kamgras
S09000389,Cystopteris fragilis,Blaasvaren
S09000392,Daphne mezereum,Rood peperboompje
S09000399,Deschampsia setacea,Moerassmele
S09000402,Dianthus armeria,Ruige anjer
S09000404,Dianthus deltoides,Steenanjer
S09000416,Drosera longifolia,Lange zonnedauw
S09000417,Drosera intermedia,Kleine zonnedauw
S09000418,Drosera rotundifolia,Ronde zonnedauw
S09000429,Baldellia ranunculoides subsp. ranunculoides,Stijve moerasweegbree
S09000430,Baldellia ranunculoides subsp. repens,Kruipende moerasweegbree
S09000432,Elatine hexandra,Gesteeld glaskroos
S09000438,Eleocharis quinqueflora,Armbloemige waterbies
S09000444,Elytrigia juncea subsp. boreoatlantica,Biestarwegras
S09000456,Epilobium palustre,Moerasbasterdwederik
S09000461,Epipactis palustris,Moeraswespenorchis
S09000467,Equisetum ramosissimum,Vertakte paardenstaart
S09000471,Equisetum variegatum,Bonte paardenstaart
S09000472,Erica cinerea,Rode dophei
S09000477,Eriophorum gracile,Slank wollegras
S09000478,Eriophorum latifolium,Breed wollegras
S09000479,Eriophorum vaginatum,Eenarig wollegras
S09000481,Erodium lebelii,Kleverige reigersbek
S09000486,Eryngium maritimum,Blauwe zeedistel
S09000488,Erysimum virgatum,Stijve steenraket
S09000491,Euphorbia amygdaloides,Amandelwolfsmelk
S09000492,Euphorbia cyparissias,Cipreswolfsmelk
S09000494,Euphorbia exigua,Kleine wolfsmelk
S09000496,Euphorbia palustris,Moeraswolfsmelk
S09000497,Euphorbia paralias,Zeewolfsmelk
S09000500,Euphorbia seguieriana,Zandwolfsmelk
S09000509,Odontites vernus subsp. serotinus,Rode ogentroost
S09000524,Filago minima,Dwergviltkruid
S09000529,Fragaria vesca,Bosaardbei
S09000532,Fritillaria meleagris,Wilde kievitsbloem
S09000536,Gagea spathacea,Schedegeelster
S09000541,Galeopsis segetum,Bleekgele hennepnetel
S09000548,Cruciata laevipes,Kruisbladwalstro
S09000553,Galium pumilum,Kalkwalstro
S09000558,Genista anglica,Stekelbrem
S09000560,Genista pilosa,Kruipbrem
S09000561,Genista tinctoria,Verfbrem
S09000562,Gentianella amarella,Slanke gentiaan
S09000563,Gentianella campestris,Veldgentiaan
S09000565,Gentianella ciliata,Franjegentiaan
S09000566,Gentiana cruciata,Kruisbladgentiaan
S09000567,Gentianella germanica,Duitse gentiaan
S09000568,Gentiana pneumonanthe,Klokjesgentiaan
S09000569,Geranium columbinum,Fijne ooievaarsbek
S09000575,Geranium pyrenaicum,Bermooievaarsbek
S09000578,Geum rivale,Knikkend nagelkruid
S09000588,Gnaphalium sylvaticum,Bosdroogbloem
S09000590,Goodyera repens,Dennenorchis
S09000593,Gymnadenia conopsea,Grote muggenorchis
S09000595,Atriplex pedunculata,Gesteelde zoutmelde
S09000597,Hammarbya paludosa,Veenmosorchis
S09000603,Helictotrichon pratense,Beemdhaver
S09000608,Herminium monorchis,Honingorchis
S09000612,Hieracium lactucella,Spits havikskruid
S09000626,Hierochloe odorata,Veenreukgras
S09000633,Holosteum umbellatum,Heelbeen
S09000635,Hordeum marinum,Zeegerst
S09000637,Hordeum secalinum,Veldgerst
S09000642,Hyoscyamus niger,Bilzekruid
S09000643,Hypericum canadense,Canadees hertshooi
S09000644,Hypericum elodes,Moerashertshooi
S09000645,Hypericum hirsutum,Ruig hertshooi
S09000650,Hypericum pulchrum,Fraai hertshooi
S09000652,Hypochaeris glabra,Glad biggenkruid
S09000659,Illecebrum verticillatum,Grondster
S09000663,Inula conyzae,Donderkruid
S09000668,Isoetes echinospora,Kleine biesvaren
S09000672,Juncus alpinoarticulatus subsp. atricapillus,Duinrus
S09000681,Juncus filiformis,Draadrus
S09000686,Juncus pygmaeus,Dwergrus
S09000689,Juncus tenageia,Wijdbloeiende rus
S09000691,Juniperus communis,Jeneverbes
S09000692,Knautia arvensis,Beemdkroon
S09000695,Koeleria pyramidata,Breed fakkelgras
S09000710,Lathyrus aphaca,Naakte lathyrus
S09000711,Lathyrus linifolius,Knollathyrus
S09000713,Lathyrus nissolia,Graslathyrus
S09000719,Leersia oryzoides,Rijstgras