init depot renew

This commit is contained in:
2026-09-22 11:58:57 +02:00
commit e9fa6a7309
205 changed files with 39721 additions and 0 deletions
@@ -0,0 +1,31 @@
from pycen import zh,con_bdcen
import geopandas as gpd
zh = zh()
dzh = zh.v_zoneshumides()
col_date = dzh.columns[dzh.columns.str.contains('date')]
dzh[col_date] = dzh[col_date].astype(str)
site = gpd.read_postgis('SELECT * FROM sites.c_sites_zonages WHERE date_fin IS NULL',con_bdcen)
col_rmq = dzh.columns[dzh.columns.str.contains('rmq')]
c1 = dzh[dzh.code_cb.str.contains('54.1',na=False)]
c2 = c1[c1.intersects(site.unary_union)]
c3 = dzh[dzh.code_cb.str.contains('54.1') &
(
dzh.rmq_interet_patri.str.contains('tufi',case=False)
# dzh.rmq_site.str.contains('tufi',case=False) |
# dzh.rmq_fct_majeur.str.contains('tufi',case=False) |
# dzh.rmq_bilan_menace.str.contains('tufi',case=False) |
# dzh.rmq_orient_act.str.contains('tufi',case=False) |
# dzh.rmq_usage_process.str.contains('tufi',case=False) |
# dzh.rmq_activ_hum.str.contains('tufi',case=False)
)
]
to_file = '/home/colas/Documents/tmp/diagnos_tuffière.gpkg'
c1.to_file(to_file,layer='541 only',driver='GPKG')
c2.to_file(to_file,layer='541 ENS',driver='GPKG')
c3.to_file(to_file,layer='541 TUF',driver='GPKG')
File diff suppressed because it is too large Load Diff
+324
View File
@@ -0,0 +1,324 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
import geopandas as gpd
from pycen import con,zh
from os import path,listdir
from re import findall
v_zh = zh().v_zoneshumides()
PATH = '/media/cgeier/SRV/FICHIERS/OUTILS/CARTOGRAPHIE/ESPACE DE TRAVAIL/ETUDES/Zones humides'
lst_layer = [x for x in listdir(PATH) if (x.endswith('.shp') or x.endswith('.gpkg')) and x.startswith('ZHP')]
def upper_first_letter(s):
if s is None or gpd.pd.isna(s):
return s
else:
return s[0].upper() + s[1:]
def manual_replace(s, old, new, index):
if s is None or gpd.pd.isna(s):
return s
else:
if old == s[index]:
return s[:index] + new + s[index +1:]
else :
return s
def extract_info(df,value):
t1 = df[0].str.lower().str.contains(value,na=False)
t2 = df[1].str.lower().str.contains(value,na=False)
t3 = df[2].str.lower().str.contains(value,na=False)
t4 = df[3].str.lower().str.contains(value,na=False)
t5 = df[4].str.lower().str.contains(value,na=False)
df[5] = None
for i,t in enumerate([t1,t2,t3,t4,t5]):
if t.any():
df.loc[t,5] = df[t][i]
return df[5].str.strip()
def extract_descripti2(df):
df['statut'] = extract_info(df,'isit|possible ?|absence zh|non cartographier')
df['source'] = extract_info(df,'photointe|ortho|scan|information communale')
return df
if __name__ == "__main__":
gdf = gpd.GeoDataFrame()
for layer in lst_layer:
print(layer)
data = gpd.read_file(path.join(PATH,layer))
gdf = gpd.pd.concat([gdf,data])
gdf.DATEMODIF = gpd.pd.to_datetime(gdf.DATEMODIF,format='mixed')
gdf.columns = gdf.columns.str.lower()
gdf.sort_values(['datemodif'],inplace=True,ignore_index=True,ascending=False)
gdf.drop(columns=['X','Y'],inplace=True,errors='ignore')
gdf.rename_geometry('geom',inplace=True)
# Suppression des doublons de géometries - temps de calcul long
gdf.drop_duplicates(subset='geom',inplace=True,ignore_index=True,keep='first')
tmp = (gdf.descripti2
.str.replace('/','|')
.str.replace('06|19','06/19')
.str.replace('04|12|2019','04/12/2019')
.str.replace('vistier','visiter')
.str.replace('AbsenceZH','Absence ZH')
.str.replace('Zone humide non cartographiée et','non cartographier | ZH')
.str.replace('continuité zh de la gère, à visiter','continuité zh de la gère | à visiter')
.str.split('\\|| - ',expand=True)
.replace('',None))
res = extract_descripti2(tmp)
gdf[['statut','source']] = res[['statut','source']]
gdf['comment'] = (gdf.descripti2
.str.replace('vistier','visiter')
.str.replace('AbsenceZH','Absence ZH')
.str.replace('Zone humide non cartographiée et','non cartographier | ZH')
.str.replace('continuité zh de la gère, à visiter','continuité zh de la gère | à visiter')
.str.replace('à visiter','A visiter')
.replace([x for x in gdf.statut.unique() if x is not None],'',regex=True)
.replace([x for x in gdf.source.unique() if x is not None],'',regex=True)
.str.strip()
.replace('',None)
.apply(lambda x: manual_replace(x,'|','',0)).str.strip()
.apply(lambda x: manual_replace(x,'|','',0)).str.strip()
.replace('',None)
.apply(lambda x: manual_replace(x,'/','',0)).str.strip()
.apply(lambda x: manual_replace(x,'|','',len(x)-1) if x is not None else None)
.apply(lambda x: manual_replace(x,',','',len(x)-1) if x is not None else None)
.replace('',None)
.apply(lambda x: manual_replace(x,'/','',len(x)-1) if x is not None else None)
.str.strip()
.str.replace('| | ','|')
.replace('',None)
.apply(lambda x: manual_replace(x,'?','',len(x)-1) if x is not None else None)
.str.strip()
.apply(lambda x: manual_replace(x,'|','',len(x)-1) if x is not None else None)
.str.strip()
.str.replace('Extension zh amont - peupleraie','Peupleraie - extension zh amont')
.str.replace("Zone d'effondrement - source","Source - zone d'effondrement")
)
gdf['statut'] = (gdf['statut']
.apply(lambda x: upper_first_letter(x))
.str.replace(' ?','?')
.str.replace('?',' ?')
.replace('À visiter','A visiter'))
gdf['source'] = (gdf['source']
.apply(lambda x: upper_first_letter(x))
.str.replace('Interprétation','Photointerprétation'))
is_inventaire = (gdf.observateu
.str.contains('Le Pic Vert|LPO Isère|Lo Parvi|Nature Vivante|ONF',case=False,na=False))
isna_source = gdf['source'].isna()
is_cenisere = gdf.observateu.str.contains('cen isère',case=False,na=False)
gdf.loc[is_inventaire&isna_source,'source'] = 'Inventaire'
gdf.loc[~is_inventaire&isna_source&~is_cenisere].observateu
gdf['type'] = (gdf.comment
.str.replace('prairie','Prairie')
.str.replace('Prairie humide','Prairiehumide')
.str.split('\\|| ',n=1)
.str[0]
.str.replace('Prairiehumide','Prairie humide')
.str.strip()
.replace({
'Roselières':'Roselière',
'Ornières':'Ornière',
'Fontaine':'Source',
'Lac':'Mare/lac alpin',
'Culture':'Culture temporairement inondée',
'Grève':'Alluvion',
'ZH':'Tourbière',
})
.apply(lambda x: upper_first_letter(x))
)
gdf['comment'] = (gdf.comment
.str.replace('prairie','Prairie')
.replace([x for x in gdf.type.unique() if x is not None or x.contains('INVZH')],'',regex=True)
.str.replace('Prairie humide','Prairiehumide')
.str.split('\\|| ',n=1)
.str[1]
.str.replace('Prairiehumide','Prairie humide')
.str.strip()
.replace('',None)
.apply(lambda x: manual_replace(x,'-','',0)).str.strip()
)
et = gdf.comment.str.startswith('et ',na=False)
de = gdf.comment.str.startswith('de ',na=False)
gdf.loc[et,'comment'] = gdf.loc[et,'comment'].str.replace('et ','',n=1)
gdf.loc[de,'comment'] = gdf.loc[de,'comment'].str.replace('de ','',n=1)
invzh = gdf['type'].str.contains('INVZH',na=False)
gdf.loc[invzh,'comment'] = gdf.loc[invzh,'type']
gdf.loc[invzh,'type'] = None
gdf.comment = (gdf.comment
.str.strip()
.str.removeprefix('\|')
.str.strip()
.str.removeprefix('?')
.str.strip()
.str.removeprefix('-')
.str.removesuffix('-')
.str.strip()
.replace('',None)
.apply(lambda x: upper_first_letter(x)))
is_interpret = gdf['source'].str.contains('interprétation',case=False,na=False)
gdf.loc[is_interpret,'ponctuelle'] = 'Incertain'
gdf.loc[~is_interpret,'ponctuelle'] = 'Oui'
is_jlg = gdf.observateu=='CEN Isère (J.-L. Grossi)'
type_isna = gdf['type'].isna()
gdf.loc[is_jlg&type_isna,'type'] = 'Mare'
gdf.drop(gdf[gdf.observateu.isna()].index,inplace=True)
is_balm = gdf.observateu=='CEN Isère (C. Balmain)'
is_lafo = gdf.observateu=='CEN Isère (A.Lafon)'
is_nico = gdf.observateu=='CEN Isère (N. Biron)'
is_obs_inc = gdf.observateu=='Inconnu'
is_zh = gdf['type']=='Petite zh'
is_inconnu = gdf['type']=='Inconnu'
gdf.loc[is_balm&~is_zh&is_inconnu,'type'] = 'Étang'
gdf.loc[is_balm&is_zh&is_inconnu,'type'] = 'Suintement'
gdf.loc[is_lafo&is_inconnu,'type'] = 'Boisement'
gdf.loc[is_obs_inc&is_inconnu,'type'] = 'Étang'
gdf.loc[is_nico&is_inconnu,'type'] = 'Prairie humide'
is_visite = gdf['statut'].isin(['Possible ?','Groupement fontinal possible ?','Groupement fontinal, possible ?','Roselière et possible mare','Non cartographier'])
gdf.loc[is_visite,'statut'] = 'A visiter'
statut_isna = gdf['statut'].isna()
gdf.loc[is_interpret&statut_isna,'statut'] = 'A visiter'
is_zh2 = gdf['statut'].isna()&gdf['comment'].str.startswith('Zh',na=False)
gdf.loc[is_zh2,'statut'] = 'A décrire'
dict_type = {
**dict.fromkeys(['Barrage','Bassin','Lagunage'],'Artificiel'),
**dict.fromkeys(['Mégaphorbiaie','Prairie','Prairie humide','Roselière'],'Prairie humide et roselière'),
**dict.fromkeys(['Source', 'Suintement', 'Talus'],'Source et Suintement'),
**dict.fromkeys(['Ornière', 'Mare'],'Mare'),
**dict.fromkeys(['Boisement', 'Peupleraie'],'Boisement'),
}
gdf['classe'] = (gdf['type']
.replace(dict_type))
# Harmonisation des observateurs
dict_obs = {
'NB':'CEN Isère (N. Biron)',
'Nico':'CEN Isère (N. Biron)',
'Alix':'CEN Isère (A. Guedou)',
'N BIRON':'CEN Isère (N. Biron)',
'N. Biron (CEN Isère)':'CEN Isère (N. Biron)',
'Nicolas Biron':'CEN Isère (N. Biron)',
'M. Juton (CEN Isère)':'CEN Isère (M. Juton)',
'CEN Isère (J.-L. Grossi)':'CEN Isère (J. L. Grossi)',
'Lpo Isère (F. Frossard)':'LPO Isère (F. Frossard)',
'Lpo Isère (H. Coffre)':'LPO Isère (H. Coffre)',
'Lpo Isère (D. Loose)':'LPO Isère (D. Loose)',
'J. F. Noblet':'Le Pic Vert (J. F. Noblet)',
'R. Fonters':'LPO Isère (R. Fonters)',
'R. Marciau':'CEN Isère (R. Marciau)',
}
gdf.replace(dict_obs,inplace=True)
# Suppression des ZH taguer Absence
not_zh = gdf['statut']=='Absence ZH'
idx_notzh = gdf[not_zh].index
gdf.drop(idx_notzh,inplace=True)
# Intersection des zh_ponctuelles et zh_surfacique - temps de calcul long
v_zh_union = v_zh.unary_union
is_intersect = gdf.intersects(v_zh_union)
lst_drop = ['Tourbière','Culture','Boisement','Prairie humide','Roselière','Grève','Barrage','Lac']
drop_prospect_pontc = ~gdf['type'].isin(lst_drop)
gdf_zh = gdf[is_intersect&drop_prospect_pontc].copy()
gdf_ponct= gdf[~is_intersect].copy()
# A faire :
# - Intersecter avec la couche zh surfacique,
# dissocier les donner d'intersection et conserver
# dans une autre couche les zones ponctuelles correspondant à des Mares/Etangs/bassin/Lac
bdd_table = 'zh_ponctuelles'
gdf_ponct.to_postgis(bdd_table,con,'zones_humides',if_exists='replace',index=True if 'gid' not in gdf.columns else False,index_label='gid')
sql = """
ALTER TABLE zones_humides.{tab} ADD PRIMARY KEY (gid);
GRANT ALL ON TABLE zones_humides.{tab} TO grp_admin;
GRANT SELECT ON TABLE zones_humides.{tab} TO grp_consult;
""".format(tab=bdd_table)
with con.begin() as cnx:
cnx.execute(sql)
bdd_table = 'zh_ponctuelles_in_zh'
gdf_zh.to_postgis(bdd_table,con,'zones_humides',if_exists='replace',index=True if 'gid' not in gdf.columns else False,index_label='gid')
sql = """
ALTER TABLE zones_humides.{tab} ADD PRIMARY KEY (gid);
GRANT ALL ON TABLE zones_humides.{tab} TO grp_admin;
GRANT SELECT ON TABLE zones_humides.{tab} TO grp_consult;
""".format(tab=bdd_table)
with con.begin() as cnx:
cnx.execute(sql)
########### POTENTIELLE SURFACIQUE #############
sql = """
SELECT * FROM zones_humides.zh_ponctuelles;
"""
gdf = gpd.read_postgis(
sql = sql,
con = con)
is_interpret = gdf['source'].str.contains('interprétation',case=False,na=False)
del_notzh = ~(gdf['statut'] == 'Absence ZH')
avere = gdf[~is_interpret&del_notzh].copy()
is_visite = avere['statut'].isin(['Possible ?','Groupement fontinal, possible ?','Roselière et possible mare','Non cartographier'])
avere.loc[is_visite,'statut'] = 'A visiter'
dict_type = {
**dict.fromkeys(['Barrage','Bassin','Lagunage'],'Artificiel'),
**dict.fromkeys(['Mégaphorbiaie','Prairie','Prairie humide','Roselière'],'Prairie humide et roselière'),
**dict.fromkeys(['Source', 'Suintement', 'Talus'],'Source et Suintement'),
**dict.fromkeys(['Ornière', 'Mare'],'Mare'),
**dict.fromkeys(['Boisement', 'Peupleraie'],'Boisement'),
}
avere['classe'] = (gdf['type']
.replace(dict_type))
########### POTENTIELLE #############
ptent = gdf[is_interpret&del_notzh].copy()
# avere['a_visiter'] = None
avere.to_postgis('zh_ponctuelles_averee',con,'zones_humides',if_exists='replace',index_label='gid')
sql = """
ALTER TABLE zones_humides.zh_ponctuelles_averee ADD PRIMARY KEY (gid);
GRANT ALL ON TABLE zones_humides.zh_ponctuelles_averee TO grp_admin;
GRANT SELECT ON TABLE zones_humides.zh_ponctuelles_averee TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(sql)
test = """
SELECT * FROM zones_humides.zh_ponctuelles;
"""
data = gpd.read_postgis(
sql = test,
con = con)
+465
View File
@@ -0,0 +1,465 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from datetime import datetime as dt
import pandas as pd
import geopandas as gpd
# Parametres bdd
user = 'cen_admin'
pwd = '#CEN38@venir'
adr = '91.134.194.221'
port = '5432'
base = 'azalee'
url = URL.create('postgresql+psycopg2',
username=user,
password=pwd,
host=adr,
database=base,
)
con = create_engine(url)
v_zoneshumides = """
DROP VIEW IF EXISTS zones_humides.v_zoneshumides;
CREATE OR REPLACE VIEW zones_humides.v_zoneshumides
AS WITH temp1 as (
SELECT DISTINCT ON (s.id)
s.id,
max(s6.date) "date"
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
JOIN sites.r_sites_geom s6 ON s.id::text = s6.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s.id
), hab as (
SELECT
s62.id_geom_site,
string_agg(s62.id_cb,';') code_cb,
string_agg(s621.lb_hab_fr,';') lib_cb
FROM zones_humides.r_site_habitat s62 JOIN ref_habitats.corine_biotope s621 ON s62.id_cb = s621.id
WHERE s62."valid"
GROUP BY 1
), usagprocess AS (
SELECT
s65.id_geom_site,
string_agg(s651.nom,';') activ_hum,
string_agg(s652.nom,';') impact,
string_agg(s653.nom,';') "position",
string_agg(s65.remarques,';') rmq_activ_hum
FROM zones_humides.r_site_usageprocess s65
JOIN zones_humides.param_activ_hum s651 ON s65.id_activ_hum = s651.id
JOIN zones_humides.param_impact s652 ON s65.id_impact = s652.id
JOIN zones_humides.param_position s653 ON s65.id_position = s653.id
WHERE s65."valid"
GROUP BY 1
), cnx as (
SELECT
s63.id_geom_site,
s631.nom connexion
FROM zones_humides.r_site_type_connect s63
JOIN zones_humides.param_type_connect s631 ON s63.id_param_connect = s631.id
WHERE s63."valid"
), tmp_auteur_site as (
SELECT
s.id,
string_agg(btrim(concat(s11.nom, ' ', s11.prenom,' (',COALESCE(s111.abbrev, s111.nom),')')),';') AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1 JOIN (personnes.personne s11
JOIN personnes.organisme s111 ON s11.id_organisme = s111.id) ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(btrim(concat(s611.nom, ' ', s611.prenom,' (',COALESCE(s6111.abbrev, s6111.nom),')')),';') AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61 JOIN (personnes.personne s611
JOIN personnes.organisme s6111 ON s611.id_organisme = s6111.id) ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s6.id
)
SELECT
s.id AS site_code,
s.nom,
s1.auteur_site,
s61.auteur_geom,
s6.geom,
s.date_deb AS date_site,
s6.date AS date_geom,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s5.nom AS typo_sdage,
s.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
s62.code_cb,
s62.lib_cb,
ct1.fct_bio,
ct1.fct_hydro,
ct1.int_patri,
ct1."val_socioEco",
ct2.crit_delim,
ct2.crit_def_esp,
s65.activ_hum,
s65.impact,
s65."position",
s65.rmq_activ_hum,
(string_to_array(ct3.entree_eau,'//'))[1] entree_eau_reg,
(string_to_array(ct3.entree_eau,'//'))[2] entree_eau_perm,
(string_to_array(ct3.entree_eau,'//'))[3] entree_eau_topo,
(string_to_array(ct3.sortie_eau,'//'))[1] sortie_eau_reg,
(string_to_array(ct3.sortie_eau,'//'))[2] sortie_eau_perm,
(string_to_array(ct3.sortie_eau,'//'))[3] sortie_eau_topo,
s63.connexion,
CASE WHEN s64."valid" THEN s64.id_origsub END origine_sub,
CASE WHEN s64."valid" THEN s641.nom END freq_sub,
CASE WHEN s64."valid" THEN s642.nom END etendu_sub
FROM sites.sites s
JOIN temp1 w USING (id)
LEFT JOIN tmp_auteur_site s1 ON s.id = s1.id
LEFT JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
LEFT JOIN sites.typo_sdage s5 ON s.id_typo_sdage::text = s5.id::text
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN tmp_auteur_geom s61 ON s6.id = s61.id
LEFT JOIN hab s62 ON s6.id = s62.id_geom_site
LEFT JOIN cnx s63 ON s6.id = s63.id_geom_site
LEFT JOIN (zones_humides.r_site_sub s64
JOIN (zones_humides.param_sub s641 JOIN zones_humides.type_param_sub s6411 ON s6411.id = s641.id_type) ON s64.id_freqsub = s641.id
JOIN (zones_humides.param_sub s642 JOIN zones_humides.type_param_sub s6421 ON s6421.id = s642.id_type) ON s64.id_etendsub = s642.id
) ON s6.id = s64.id_geom_site
LEFT JOIN usagprocess s65 ON s6.id = s65.id_geom_site
LEFT JOIN crosstab(
'SELECT
s63.id_geom_site::bigint,
s632.nom_court type_param,
string_agg(
CASE WHEN s63.description IS NULL THEN s631.nom
WHEN s63.description = '''' THEN s631.nom
ELSE CONCAT(s631.nom,'' ('',s63.description,'')'') END,
'';'') fct
FROM zones_humides.r_site_fctecosociopatri s63
JOIN (zones_humides.param_fct_eco_socio_patri s631
JOIN zones_humides.type_param_fct s632 ON s631.id_type = s632.id
) ON s63.id_fct = s631.id
WHERE s63."valid"
GROUP BY 1,2
ORDER BY 1,2,3',
'SELECT DISTINCT s632.nom_court FROM zones_humides.r_site_fctecosociopatri s63
JOIN (zones_humides.param_fct_eco_socio_patri s631
JOIN zones_humides.type_param_fct s632 ON s631.id_type = s632.id
) ON s63.id_fct = s631.id
ORDER BY 1 DESC;'
) AS ct1 ("id_geom_site" bigint, "fct_bio" text, "fct_hydro" text, "int_patri" text, "val_socioEco" text) ON s6.id = ct1.id_geom_site
LEFT JOIN crosstab(
'SELECT
s64.id_geom_site::bigint,
s642.nom_court type_param,
string_agg(
CASE WHEN s64.description IS NULL THEN s641.nom
WHEN s64.description = '''' THEN s641.nom
ELSE CONCAT(s641.nom,'' ('',s64.description,'')'') END,
'';'') fct
FROM zones_humides.r_site_critdelim s64
JOIN (zones_humides.param_delim_fct s641
JOIN zones_humides.type_param_delim_fct s642 ON s641.id_type = s642.id
) ON s64.id_crit_delim = s641.id
WHERE s64."valid"
GROUP BY 1,2
ORDER BY 1,2,3'
) AS ct2 ("id_geom_site" bigint, "crit_delim" text, "crit_def_esp" text) ON s6.id = ct2.id_geom_site
LEFT JOIN crosstab(
'SELECT
s64.id_geom_site,
s64.in_out,
CONCAT(
--''reg_hydro : '',
string_agg(s641.nom,'';''),''//'',
--''permanence : '',
string_agg(s642.nom,'';''),''//'',
--''rmq_toponymie : '',
string_agg(s64.rmq_toponymie,'';'')
) hydro
FROM zones_humides.r_site_reghydro s64
LEFT JOIN zones_humides.param_reg_hydro s641 ON s64.id_reg_hydro = s641.id
LEFT JOIN zones_humides.param_permanence s642 ON s64.id_permanence = s642.id
WHERE s64."valid"
GROUP BY 1,2
ORDER BY 1,2',
'SELECT DISTINCT in_out FROM zones_humides.r_site_reghydro ORDER BY 1 DESC;'
) AS ct3 ("id_geom_site" bigint, "entree_eau" text, "sortie_eau" text) ON s6.id = ct3.id_geom_site
) ON s.id::text = s6.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
AND s6.date = w.date
--AND s63."valid" AND s64."valid"
ORDER BY s.id ASC NULLS FIRST;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zoneshumides TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zoneshumides TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zoneshumides)
cnx.execute(grant)
v_pelouseseche = """
DROP VIEW IF EXISTS ps.v_pelouseseches;
CREATE OR REPLACE VIEW ps.v_pelouseseches
AS WITH temp1 as (
SELECT DISTINCT ON (s.id)
s.id,
max(s6.date) "date"
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
JOIN sites.r_sites_geom s6 ON s.id::text = s6.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s.id
), hab as (
SELECT
id_geom_site,
date,
(string_to_array(hab1,'//'))[1] n_hab1,
(string_to_array(hab1,'//'))[2] cb_hab1,
(string_to_array(hab1,'//'))[3] lb_hab1,
(string_to_array(hab2,'//'))[1] n_hab2,
(string_to_array(hab2,'//'))[2] cb_hab2,
(string_to_array(hab2,'//'))[3] lb_hab2,
(string_to_array(hab3,'//'))[1] n_hab3,
(string_to_array(hab3,'//'))[2] cb_hab3,
(string_to_array(hab3,'//'))[3] lb_hab3,
(string_to_array(hab4,'//'))[1] n_hab4,
(string_to_array(hab4,'//'))[2] cb_hab4,
(string_to_array(hab4,'//'))[3] lb_hab4
FROM crosstab(
$$WITH tmp as (
SELECT
id_geom_site,
MAX("date") date
FROM ps.r_site_habitat
GROUP BY 1
)
SELECT
s61.id_geom_site,
s61.date,
s61.index,
CONCAT(s61.n_hab,'//',
s62.code_hab,'//',
s621.lb_hab_fr) hab
FROM ps.r_site_habitat s61
JOIN (ps.r_hab_cb s62 JOIN ref_habitats.corine_biotope s621 ON s62.code_hab = s621.id) ON s61.id = s62.id_sitehab
JOIN tmp USING (id_geom_site)
WHERE s61.date = tmp.date
ORDER BY 1,2,3;$$,
'SELECT DISTINCT index FROM ps.r_site_habitat'
) AS ct ("id_geom_site" bigint, "date" date, "hab1" text, "hab2" text, "hab3" text, "hab4" text)
), tmp_auteur_site as (
SELECT
s.id,
string_agg(btrim(concat(s11.nom, ' ', s11.prenom,' (',COALESCE(s111.abbrev, s111.nom),')')),';') AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1 JOIN (personnes.personne s11
JOIN personnes.organisme s111 ON s11.id_organisme = s111.id) ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(btrim(concat(s611.nom, ' ', s611.prenom,' (',COALESCE(s6111.abbrev, s6111.nom),')')),';') AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61 JOIN (personnes.personne s611
JOIN personnes.organisme s6111 ON s611.id_organisme = s6111.id) ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s6.id
)
SELECT DISTINCT ON (s.id)
s.id AS site_code,
s.nom,
s1.auteur_site,
s61.auteur_geom,
s6.geom,
s.date_deb AS date_site,
s6.date AS date_geom,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
ct1.statut,
ct1.pratique,
ct1.recouvrement,
ct1.embrouss,
ct1.taux tx_embrouss,
hab.n_hab1,
hab.cb_hab1,
hab.lb_hab1,
hab.n_hab2,
hab.cb_hab2,
hab.lb_hab2,
hab.n_hab3,
hab.cb_hab3,
hab.lb_hab3,
hab.n_hab4,
hab.cb_hab4,
hab.lb_hab4
FROM sites.sites s
JOIN temp1 w USING (id)
LEFT JOIN tmp_auteur_site s1 ON s.id = s1.id
LEFT JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN tmp_auteur_geom s61 ON s6.id = s61.id
LEFT JOIN hab ON s6.id = hab.id_geom_site
LEFT JOIN crosstab(
'SELECT
s63.id_geom_site::bigint,
s63.taux,
s632.nom,
s631.description
FROM ps.r_site_param s63
JOIN (ps.param s631
JOIN ps.type_param s632 ON s631.id_type = s632.id
) ON s63.id_param = s631.id
--GROUP BY 1,2
ORDER BY 1,2,3',
'SELECT nom FROM ps.type_param'
) AS ct1 ("id_geom_site" bigint, "taux" text, "recouvrement" text, "embrouss" text, "pratique" text, "statut" text) ON s6.id = ct1.id_geom_site
) ON s6.id_site = s.id
WHERE s.date_fin IS NULL AND s3.nom_court::text = 'Pelouses sèches'::text
ORDER BY s.id, s6.date DESC NULLS LAST
;"""
grant = """
GRANT ALL ON TABLE ps.v_pelouseseches TO grp_admin;
GRANT SELECT ON TABLE ps.v_pelouseseches TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_pelouseseche)
cnx.execute(grant)
###########################
######## TEST CODE ########
###########################
select_import = """
WITH temp1 as (
SELECT DISTINCT ON (s.id)
s.id,
max(s6.date) "date"
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
JOIN sites.r_sites_geom s6 ON s.id::text = s6.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s.id
), tmp_auteur_site as (
SELECT
s.id,
string_agg(btrim(concat(s11.nom, ' ', s11.prenom,' (',COALESCE(s111.abbrev, s111.nom),')')),';') AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1 JOIN (personnes.personne s11
JOIN personnes.organisme s111 ON s11.id_organisme = s111.id) ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(btrim(concat(s611.nom, ' ', s611.prenom,' (',COALESCE(s6111.abbrev, s6111.nom),')')),';') AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61 JOIN (personnes.personne s611
JOIN personnes.organisme s6111 ON s611.id_organisme = s6111.id) ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s6.id
)
SELECT DISTINCT ON (s.id)
s.id AS site_code,
s.nom,
s1.auteur_site,
s61.auteur_geom,
s6.geom,
s.date_deb AS date_site,
s6.date AS date_geom,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process
FROM sites.sites s
JOIN temp1 w USING (id)
LEFT JOIN tmp_auteur_site s1 ON s.id = s1.id
LEFT JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN tmp_auteur_geom s61 ON s6.id = s61.id
LEFT JOIN crosstab(
'SELECT
s63.id_geom_site::bigint,
s63.taux tx_embrouss,
s632.nom type_param,
s631.description param
FROM ps.r_site_param s63
JOIN (ps.param s631
JOIN ps.type_param s632 ON s631.id_type = s632.id
) ON s63.id_param = s631.id
--GROUP BY 1,2
ORDER BY 1,2,3',
'SELECT nom FROM ps.type_param'
) AS ct1 ("id_geom_site" bigint, "taux" text, "statut" text, "embrouss" text, "pratique" text, "recouvremt" text) ON s6.id = ct1.id_geom_site
) ON s6.id_site = s.id
WHERE s.date_fin IS NULL AND s3.nom_court::text = 'Pelouses sèches'::text
ORDER BY s.id, s6.date DESC NULLS LAST
;
"""
select_import = """
SELECT * FROM zones_humides.v_zoneshumides
;
"""
data = gpd.read_postgis(
sql = text(select_import),
con = con,
geom_col='geom')
+34
View File
@@ -0,0 +1,34 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from datetime import datetime as dt
import pandas as pd
import geopandas as gpd
# Parametres bdd
from pycen import con
v_perso = """
DROP VIEW IF EXISTS personnes.v_personne CASCADE;
CREATE OR REPLACE VIEW personnes.v_personne
AS
SELECT
a.id,
CASE WHEN btrim(lower(concat(a.nom, ' ', a.prenom))) = lower(COALESCE(b.abbrev, b.nom))
then btrim(concat(a.nom, ' ', a.prenom))
else string_agg(btrim(concat(a.nom, ' ', a.prenom,' (',COALESCE(b.abbrev, b.nom),')')),';')
end AS auteur
FROM personnes.personne a
JOIN personnes.organisme b ON a.id_organisme = b.id
GROUP BY a.id,b.abbrev, b.nom;
"""
grant = """
GRANT ALL ON TABLE personnes.v_personne TO grp_admin;
GRANT SELECT ON TABLE personnes.v_personne TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_perso))
cnx.execute(grant)
+499
View File
@@ -0,0 +1,499 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from datetime import datetime as dt
import pandas as pd
import geopandas as gpd
from pycen import con
drop_v_ps = '''
DROP VIEW IF EXISTS ps.v_pelouseseches_all CASCADE;
DROP VIEW IF EXISTS ps.v_termophile CASCADE;
'''
with con.begin() as cnx:
cnx.execute(drop_v_ps)
v_ps_habcb = """
DROP VIEW IF EXISTS ps.v_ps_habcb;
CREATE OR REPLACE VIEW ps.v_ps_habcb
AS
SELECT
b.id_sitehab,
string_agg(
CASE
WHEN b.suspect is not null AND b.sep is not null THEN CONCAT(b.code_hab,' (',b.suspect,')',b.sep)
WHEN b.suspect is not null AND b.sep is null THEN CONCAT(b.code_hab,' (',b.suspect,')')
WHEN b.suspect is null AND b.sep is not null THEN CONCAT(b.code_hab,b.sep)
WHEN b.suspect is null AND b.sep is null THEN b.code_hab
ELSE b.code_hab
END,'' ORDER BY b.ordre) code_hab,
string_agg(b1.lb_hab_fr,';') lb_hab_fr
FROM ps.r_hab_cb b JOIN ref_habitats.corine_biotope b1 ON b.code_hab = b1.id
GROUP BY 1
ORDER BY 1
;
"""
grant = """
GRANT ALL ON TABLE ps.v_ps_habcb TO grp_admin;
GRANT SELECT ON TABLE ps.v_ps_habcb TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_ps_habcb))
cnx.execute(grant)
v_ps_sitehab_cross = """
DROP VIEW IF EXISTS ps.v_ps_sitehab_cross;
CREATE OR REPLACE VIEW ps.v_ps_sitehab_cross
AS
SELECT
id_site,
id_geom_site,
auteur,
date,
date_max,
(string_to_array(hab1,'//'))[1] n_hab1,
(string_to_array(hab1,'//'))[2] cb_hab1,
(string_to_array(hab1,'//'))[3] lb_hab1,
(string_to_array(hab2,'//'))[1] n_hab2,
(string_to_array(hab2,'//'))[2] cb_hab2,
(string_to_array(hab2,'//'))[3] lb_hab2,
(string_to_array(hab3,'//'))[1] n_hab3,
(string_to_array(hab3,'//'))[2] cb_hab3,
(string_to_array(hab3,'//'))[3] lb_hab3,
(string_to_array(hab4,'//'))[1] n_hab4,
(string_to_array(hab4,'//'))[2] cb_hab4,
(string_to_array(hab4,'//'))[3] lb_hab4
FROM crosstab(
$$
WITH auteur AS (
SELECT DISTINCT ON (id_sitehab)
c.id_sitehab,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM ps.r_sitehab_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehab
)
SELECT
a.id_site,
a.id_geom_site,
c.auteur,
a.date,
(SELECT MAX(date) FROM ps.r_site_habitat WHERE id_geom_site = a.id_geom_site ) date_max,
a.index,
CONCAT(a.n_hab,'//',
b.code_hab,'//',
b.lb_hab_fr
) hab
FROM ps.r_site_habitat a
LEFT JOIN ps.v_ps_habcb b ON a.id = b.id_sitehab
LEFT JOIN auteur c ON c.id_sitehab = a.id
WHERE
a.date = (SELECT MAX(date) FROM ps.r_site_habitat WHERE id_geom_site = a.id_geom_site)
ORDER BY a.id_site,a.id_geom_site,a.index
;$$,
'SELECT DISTINCT index FROM ps.r_site_habitat ORDER BY index LIMIT 4 ;'
) AS ct (
"id_site" varchar(10),
"id_geom_site" bigint,
"auteur" text,
"date" date,
"date_max" date,
"hab1" text,
"hab2" text,
"hab3" text,
"hab4" text)
ORDER BY 1,2
"""
grant = """
GRANT ALL ON TABLE ps.v_ps_sitehab_cross TO grp_admin;
GRANT SELECT ON TABLE ps.v_ps_sitehab_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_ps_sitehab_cross))
cnx.execute(grant)
# PB a.id_geom_site in (52716)
v_ps_params_cross = """
DROP VIEW IF EXISTS ps.v_ps_params_cross;
CREATE OR REPLACE VIEW ps.v_ps_params_cross
AS
SELECT --ct.*
ct.id_site,
ct.id_geom_site,
ct.auteur,
ct.date,
ct.date_max,
ct.statut,
ct.pratique,
ct.recouvrement,
ct.embrouss,
ct.taux tx_embrouss
FROM crosstab(
$$
WITH auteur AS (
SELECT DISTINCT ON (id_siteparam)
c.id_siteparam,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM ps.r_siteparam_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteparam
)
SELECT DISTINCT ON (a.id_site,a.id_geom_site, a2.nom,a.date)
a.id_site,
a.id_geom_site::bigint,
a.date,
(SELECT MAX(date) FROM ps.r_site_param WHERE id_geom_site = a.id_geom_site ) date_max,
STRING_AGG(distinct c.auteur,', '),
a.taux,
a2.nom,
STRING_AGG(a1.description,', ')
FROM ps.r_site_param a
JOIN (ps.param a1
JOIN ps.type_param a2 ON a1.id_type = a2.id
) ON a.id_param = a1.id
JOIN auteur c ON c.id_siteparam = a.id
--WHERE
-- a.id_geom_site in (52716)
GROUP BY 1,2,7,3,6
ORDER BY 1,2,7,3 DESC
$$,
$$SELECT nom FROM ps.type_param ORDER BY nom;$$
) AS ct ("id_site" varchar(10),"id_geom_site" bigint, "date" date, "date_max" date, "auteur" text, "taux" text, "embrouss" text, "pratique" text, "recouvrement" text, "statut" text)
--GROUP BY 1,2,4,5,6,7,8
ORDER BY 1,2
"""
grant = """
GRANT ALL ON TABLE ps.v_ps_params_cross TO grp_admin;
GRANT SELECT ON TABLE ps.v_ps_params_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_ps_params_cross))
cnx.execute(grant)
v_pelouseseches_all = drop_v_ps + """
CREATE OR REPLACE VIEW ps.v_pelouseseches_all
AS WITH tmp_auteur_site as (
SELECT
s.id,
string_agg(s11.auteur,';' ORDER BY s11.auteur) AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1
JOIN personnes.v_personne s11 ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s.id
ORDER BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(s611.auteur,';' ORDER BY s611.auteur) AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61
JOIN personnes.v_personne s611 ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
GROUP BY s6.id
ORDER BY s6.id
)
SELECT DISTINCT ON (s.id)
s.id AS site_code,
s6.geom,
s.nom,
s5.nom district_nat,
s6.libelle source,
s6.id_origine,
s1.auteur_site,
s6.auteur_geom,
(
SELECT DISTINCT ON ("date") auteur
FROM (values (param.date_max,param.auteur),(hab.date_max,hab.auteur)) AS value("date",auteur)
WHERE "date" = (SELECT MAX("date") FROM (values (param.date_max),(hab.date_max)) AS value("date"))
) as auteur_attrs,
s.date_deb AS date_site,
s6."date" AS date_geom,
(
SELECT MAX("date") FROM (values (param.date_max),(hab.date_max)) AS value("date")
) as date_attrs,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
param.statut,
param.pratique,
param.recouvrement,
param.embrouss,
param.tx_embrouss,
hab.n_hab1,
hab.cb_hab1,
hab.lb_hab1,
hab.n_hab2,
hab.cb_hab2,
hab.lb_hab2,
hab.n_hab3,
hab.cb_hab3,
hab.lb_hab3,
hab.n_hab4,
hab.cb_hab4,
hab.lb_hab4
FROM sites.sites s
JOIN tmp_auteur_site s1 ON s.id = s1.id
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
JOIN ref_territoire.districts_naturels s5 ON s.org = s5.abrev
JOIN ( SELECT DISTINCT ON (id_site) *
FROM sites.r_sites_geom sg
JOIN tmp_auteur_geom s61 ON sg.id = s61.id
LEFT JOIN sites.lots s62 USING (id_lot)
ORDER BY id_site, "date" DESC, date_insert DESC
) s6 ON s6.id_site = s.id
LEFT JOIN ps.v_ps_sitehab_cross hab ON s.id = hab.id_site
LEFT JOIN ps.v_ps_params_cross param ON s.id = param.id_site
----LEFT JOIN (sites.r_sites_geom s6
---- LEFT JOIN tmp_auteur_geom s61 ON s6.id = s61.id
---- LEFT JOIN ps.v_ps_sitehab_cross hab ON s6.id = hab.id_geom_site
---- LEFT JOIN ps.v_ps_params_cross param ON s6.id = param.id_geom_site
----) ON s6.id_site = s.id
--LEFT JOIN ps.r_infeq_1200m s7 ON s.id = s7.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Pelouses sèches'::text
--AND s3.id = 2
--AND s6.date = (SELECT MAX(date) FROM sites.r_sites_geom WHERE id_site = s.id)
--AND s6.date_insert = (
-- SELECT MAX(date_insert) FROM sites.r_sites_geom WHERE id_site = s.id AND date = (
-- SELECT MAX(date) FROM sites.r_sites_geom WHERE id_site = s.id))
--AND s7.infeq_1200 IS True
ORDER BY s.id, s6."date" DESC NULLS LAST
;"""
grant = """
GRANT ALL ON TABLE ps.v_pelouseseches_all TO grp_admin;
GRANT SELECT ON TABLE ps.v_pelouseseches_all TO grp_consult;
"""
comment = """
COMMENT ON VIEW ps.v_pelouseseches_all IS 'Vue des sites à pelouses sèches et milieux thermophiles';
COMMENT ON COLUMN ps.v_pelouseseches_all.site_code IS 'Identifiant de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.nom IS 'Nom de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.district_nat IS 'District naturel sur lequel est positionner la majeur partie de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.source IS 'Nom de la couche source de la pelouse sèche au sein du CEN Isère.';
COMMENT ON COLUMN ps.v_pelouseseches_all.id_origine IS 'Identifiant d''origine de la pelouse sèche au sein de la couche source.';
COMMENT ON COLUMN ps.v_pelouseseches_all.auteur_site IS 'Auteur ayant caractérisé la pelouse sèche pour la première fois.';
COMMENT ON COLUMN ps.v_pelouseseches_all.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.auteur_attrs IS 'Auteur le plus récent ayant défini les attributs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.date_site IS 'Date de la première description de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN ps.v_pelouseseches_all.date_attrs IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN ps.v_pelouseseches_all.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN ps.v_pelouseseches_all.type_site IS '';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_site IS 'Remarques générale concernant la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_orient_act IS 'Remarques sur les orientations et les actes de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.statut IS 'Statut (Communautaire, Prioritaire ou non défini) de la pelouse sèche définit suivant la Directive Habitat.';
COMMENT ON COLUMN ps.v_pelouseseches_all.pratique IS 'Pratique agricole réalisée sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.recouvrement IS 'Niveau de recouvrement du sol herbacé par rapport au sol nu.';
COMMENT ON COLUMN ps.v_pelouseseches_all.embrouss IS 'Niveau d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.tx_embrouss IS 'Taux d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.n_hab1 IS 'Pourcentage de présence de l''habitat 1 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.cb_hab1 IS 'Identifiants CORINE Biotopes constituant l''habitat 1 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_all.lb_hab1 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 1 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_all.n_hab2 IS 'Pourcentage de présence de l''habitat 2 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.cb_hab2 IS 'Identifiants CORINE Biotopes constituant l''habitat 2 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_all.lb_hab2 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 2 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_all.n_hab3 IS 'Pourcentage de présence de l''habitat tertiaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.cb_hab3 IS 'Identifiants CORINE Biotopes constituant l''habitat 3 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_all.lb_hab3 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 3 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_all.n_hab4 IS 'Pourcentage de présence de l''habitat majoritaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_all.cb_hab4 IS 'Identifiants CORINE Biotopes constituant l''habitat 4 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_all.lb_hab4 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 4 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
"""
with con.begin() as cnx:
cnx.execute(v_pelouseseches_all)
cnx.execute(grant)
cnx.execute(comment)
v_termophile = (v_pelouseseches_all
.replace('v_pelouseseches_all','v_termophile')
.replace('Pelouses sèches','Milieux thermophile'))
grant = grant.replace('v_pelouseseches_all','v_termophile')
comment = (comment
.replace('v_pelouseseches_all','v_termophile')
.replace('de la pelouse sèche','du milieux thermophile'))
with con.begin() as cnx:
cnx.execute(v_termophile)
cnx.execute(grant)
cnx.execute(comment)
v_pelouseseches = """
CREATE OR REPLACE VIEW ps.v_pelouseseches
AS
SELECT
*
FROM ps.v_pelouseseches_all s
LEFT JOIN ps.r_infeq_1200m s7 ON s.site_code = s7.id_site
WHERE
s7.infeq_1200 IS True
ORDER BY s.site_code DESC NULLS LAST
"""
grant = """
GRANT ALL ON TABLE ps.v_pelouseseches TO grp_admin;
GRANT SELECT ON TABLE ps.v_pelouseseches TO grp_consult;
"""
comment = """
COMMENT ON VIEW ps.v_pelouseseches IS 'Vue des sites à pelouses sèches strictes, situées à niveau ou sous 1200 mètre';
COMMENT ON COLUMN ps.v_pelouseseches.site_code IS 'Identifiant de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.nom IS 'Nom de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.district_nat IS 'District naturel sur lequel est positionner la majeur partie de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.source IS 'Nom de la couche source de la pelouse sèche au sein du CEN Isère.';
COMMENT ON COLUMN ps.v_pelouseseches.id_origine IS 'Identifiant d''origine de la pelouse sèche au sein de la couche source.';
COMMENT ON COLUMN ps.v_pelouseseches.auteur_site IS 'Auteur ayant caractérisé la pelouse sèche pour la première fois.';
COMMENT ON COLUMN ps.v_pelouseseches.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.auteur_attrs IS 'Auteur le plus récent ayant défini les attributs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.date_site IS 'Date de la première description de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN ps.v_pelouseseches.date_attrs IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN ps.v_pelouseseches.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN ps.v_pelouseseches.type_site IS '';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_site IS 'Remarques générale concernant la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_orient_act IS 'Remarques sur les orientations et les actes de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.statut IS 'Statut (Communautaire, Prioritaire ou non défini) de la pelouse sèche définit suivant la Directive Habitat.';
COMMENT ON COLUMN ps.v_pelouseseches.pratique IS 'Pratique agricole réalisée sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.recouvrement IS 'Niveau de recouvrement du sol herbacé par rapport au sol nu.';
COMMENT ON COLUMN ps.v_pelouseseches.embrouss IS 'Niveau d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.tx_embrouss IS 'Taux d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.n_hab1 IS 'Pourcentage de présence de l''habitat 1 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.cb_hab1 IS 'Identifiants CORINE Biotopes constituant l''habitat 1 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches.lb_hab1 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 1 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches.n_hab2 IS 'Pourcentage de présence de l''habitat 2 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.cb_hab2 IS 'Identifiants CORINE Biotopes constituant l''habitat 2 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches.lb_hab2 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 2 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches.n_hab3 IS 'Pourcentage de présence de l''habitat tertiaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.cb_hab3 IS 'Identifiants CORINE Biotopes constituant l''habitat 3 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches.lb_hab3 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 3 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches.n_hab4 IS 'Pourcentage de présence de l''habitat majoritaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches.cb_hab4 IS 'Identifiants CORINE Biotopes constituant l''habitat 4 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches.lb_hab4 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 4 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
"""
with con.begin() as cnx:
cnx.execute(v_pelouseseches)
cnx.execute(grant)
cnx.execute(comment)
v_pelouseseches_sup1200 = """
CREATE OR REPLACE VIEW ps.v_pelouseseches_sup1200
AS
SELECT
*
FROM ps.v_pelouseseches_all s
LEFT JOIN ps.r_infeq_1200m s7 ON s.site_code = s7.id_site
WHERE
s7.infeq_1200 IS False
ORDER BY s.site_code DESC NULLS LAST
"""
grant = """
GRANT ALL ON TABLE ps.v_pelouseseches_sup1200 TO grp_admin;
GRANT SELECT ON TABLE ps.v_pelouseseches_sup1200 TO grp_consult;
"""
comment = """
COMMENT ON VIEW ps.v_pelouseseches IS 'Vue des sites à pelouses sèches strictes, situées au dessus de 1200 mètre';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.site_code IS 'Identifiant de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.nom IS 'Nom de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.district_nat IS 'District naturel sur lequel est positionner la majeur partie de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.source IS 'Nom de la couche source de la pelouse sèche au sein du CEN Isère.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.id_origine IS 'Identifiant d''origine de la pelouse sèche au sein de la couche source.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.auteur_site IS 'Auteur ayant caractérisé la pelouse sèche pour la première fois.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.auteur_attrs IS 'Auteur le plus récent ayant défini les attributs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.date_site IS 'Date de la première description de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.date_attrs IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.type_site IS '';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_site IS 'Remarques générale concernant la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_orient_act IS 'Remarques sur les orientations et les actes de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.statut IS 'Statut (Communautaire, Prioritaire ou non défini) de la pelouse sèche définit suivant la Directive Habitat.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.pratique IS 'Pratique agricole réalisée sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.recouvrement IS 'Niveau de recouvrement du sol herbacé par rapport au sol nu.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.embrouss IS 'Niveau d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.tx_embrouss IS 'Taux d''embroussaillement de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.n_hab1 IS 'Pourcentage de présence de l''habitat 1 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.cb_hab1 IS 'Identifiants CORINE Biotopes constituant l''habitat 1 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.lb_hab1 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 1 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.n_hab2 IS 'Pourcentage de présence de l''habitat 2 sur 4 de la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.cb_hab2 IS 'Identifiants CORINE Biotopes constituant l''habitat 2 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.lb_hab2 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 2 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.n_hab3 IS 'Pourcentage de présence de l''habitat tertiaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.cb_hab3 IS 'Identifiants CORINE Biotopes constituant l''habitat 3 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.lb_hab3 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 3 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.n_hab4 IS 'Pourcentage de présence de l''habitat majoritaire sur la pelouse sèche.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.cb_hab4 IS 'Identifiants CORINE Biotopes constituant l''habitat 4 sur 4 de la pelouse sèche.\n- & : Entremêlement d''habitat\n- / : Habitat en transition dans le sens de lecture\n- (..) : Habitat suspecté.';
COMMENT ON COLUMN ps.v_pelouseseches_sup1200.lb_hab4 IS 'Libellé(s) CORINE Biotopes constituant(s) l''habitat 4 sur 4 de la pelouse sèche. Chaque élément de la liste est séparé par un '';''.';
"""
with con.begin() as cnx:
cnx.execute(v_pelouseseches_sup1200)
cnx.execute(grant)
cnx.execute(comment)
v_pelouseseches_noalti = """
CREATE OR REPLACE VIEW ps.v_pelouseseches_noalti
AS
SELECT
*
FROM ps.v_pelouseseches_all s
LEFT JOIN ps.r_infeq_1200m s7 ON s.site_code = s7.id_site
WHERE
s7.infeq_1200 IS NULL
ORDER BY s.site_code DESC NULLS LAST
"""
grant = """
GRANT ALL ON TABLE ps.v_pelouseseches_noalti TO grp_admin;
"""
comment = """
COMMENT ON VIEW ps.v_pelouseseches_noalti IS 'Vue des sites à pelouses sèches strictes, ne possèdant pas de critères ''infeq_1200''';
"""
with con.begin() as cnx:
cnx.execute(v_pelouseseches_noalti)
cnx.execute(grant)
cnx.execute(comment)
# test = """
# SELECT * FROM ps.v_pelouseseches_all;
# """
# data = gpd.read_postgis(
# sql = test,
# con = con)
+57
View File
@@ -0,0 +1,57 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from datetime import datetime as dt
import pandas as pd
import geopandas as gpd
# Parametres bdd
from pycen import con
v_rpg2021_ilots_anonymes_isere = """
DROP VIEW IF EXISTS ref_territoire.v_rpg2021_ilots_anonymes_isere;
CREATE OR REPLACE VIEW ref_territoire.v_rpg2021_ilots_anonymes_isere
AS SELECT --s.id,
s.*
FROM ref_territoire.rpg2021_ilots_anonymes_reg s,
ref_territoire.dept_isere reg
WHERE st_intersects(s.geom, reg.geom);
"""
grant_rpg2021_ilots = """
ALTER TABLE ref_territoire.v_rpg2021_ilots_anonymes_isere OWNER TO cen_admin;
GRANT ALL ON TABLE ref_territoire.v_rpg2021_ilots_anonymes_isere TO cen_admin;
GRANT ALL ON TABLE ref_territoire.v_rpg2021_ilots_anonymes_isere TO grp_admin;
GRANT SELECT ON TABLE ref_territoire.v_rpg2021_ilots_anonymes_isere TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_rpg2021_ilots_anonymes_isere)
cnx.execute(grant_rpg2021_ilots)
v_rpg2021_parcelles_graphiques_isere = (v_rpg2021_ilots_anonymes_isere
.replace('v_rpg2021_ilots_anonymes_isere','v_rpg2021_parcelles_graphiques_isere')
.replace('rpg2021_ilots_anonymes_reg','rpg2021_parcelles_graphiques_reg'))
grant = grant_rpg2021_ilots.replace('v_rpg2021_ilots_anonymes_isere','v_rpg2021_parcelles_graphiques_isere')
with con.begin() as cnx:
cnx.execute(v_rpg2021_parcelles_graphiques_isere)
cnx.execute(grant)
v_rpg2020_ilots_anonymes_isere = v_rpg2021_ilots_anonymes_isere.replace('2021','2020')
grant = grant_rpg2021_ilots.replace('2021','2020')
with con.begin() as cnx:
cnx.execute(v_rpg2020_ilots_anonymes_isere)
cnx.execute(grant)
v_rpg2020_parcelles_graphiques_isere = v_rpg2021_ilots_anonymes_isere.replace('v_rpg2021_ilots_anonymes_isere','v_rpg2020_parcelles_graphiques_isere')
grant = grant_rpg2021_ilots.replace('v_rpg2021_ilots_anonymes_isere','v_rpg2020_parcelles_graphiques_isere')
with con.begin() as cnx:
cnx.execute(v_rpg2020_parcelles_graphiques_isere)
cnx.execute(grant)
+76
View File
@@ -0,0 +1,76 @@
from pycen import con
from sqlalchemy import text
v_sites = '''
DROP VIEW IF EXISTS sites.v_sites;
CREATE OR REPLACE VIEW sites.v_sites
AS
WITH tmp_auteur_site as (
SELECT
s.id,
string_agg(s11.auteur,';' ORDER BY s11.auteur) AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1
JOIN personnes.v_personne s11 ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
GROUP BY s.id
ORDER BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(s611.auteur,';' ORDER BY s611.auteur) AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61
JOIN personnes.v_personne s611 ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
GROUP BY s6.id
ORDER BY s6.id
)
SELECT
g.id id_geom_site,
s.id code_site,
s.nom,
s1.auteur_site,
g1.auteur_geom,
s.date_deb date,
s.date_fin,
s.id_old_site,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s5.id||' - '||s5.nom AS typo_sdage,
s.dept,
s.org,
s.num,
s.remarques,
s.nom_com,
s.nom_com_json,
g.geom,
g.date date_geom,
g.link_pdf,
g.rmq_fct_majeur,
g.rmq_interet_patri,
g.rmq_bilan_menace,
g.rmq_orient_act,
g.rmq_usage_process,
g2.libelle lot,
g.id_origine,
g.date_insert
FROM sites.sites s
LEFT JOIN tmp_auteur_site s1 ON s.id = s1.id
LEFT JOIN sites.autre_nom s2 ON s.id = s2.id_site
LEFT JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
LEFT JOIN sites.typo_sdage s5 ON s.id_typo_sdage::text = s5.id::text
LEFT JOIN sites.r_sites_geom g ON s.id = g.id_site
LEFT JOIN tmp_auteur_geom g1 ON g.id = g1.id
LEFT JOIN sites.lots g2 USING (id_lot)
;
'''
with con.begin() as cnx:
cnx.execute(text(v_sites))
+555
View File
@@ -0,0 +1,555 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from datetime import datetime as dt
import pandas as pd
import geopandas as gpd
# Parametres bdd
from pycen import con
drop_v_zh = 'DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;'
with con.begin() as cnx:
cnx.execute(drop_v_zh)
v_zh_hab = """
DROP VIEW IF EXISTS zones_humides.v_zh_hab;
CREATE OR REPLACE VIEW zones_humides.v_zh_hab
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitehab)
c.id_sitehab,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehab_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehab
ORDER BY 1
)
SELECT DISTINCT ON (a.id_geom_site)
a.id_geom_site,
c.auteur,
MAX(a.date) date,
string_agg(a.id_cb,';') code_cb,
string_agg(b.lb_hab_fr,';') lib_cb
FROM zones_humides.r_site_habitat a
JOIN ref_habitats.corine_biotope b ON a.id_cb = b.id
JOIN auteur c ON c.id_sitehab = a.id
WHERE a."valid"
GROUP BY 1,2
ORDER BY a.id_geom_site
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_hab TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_hab TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_zh_hab))
cnx.execute(grant)
v_zh_usgprocess = """
DROP VIEW IF EXISTS zones_humides.v_zh_usgprocess;
CREATE OR REPLACE VIEW zones_humides.v_zh_usgprocess
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteusage)
c.id_siteusage,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteusage_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteusage
ORDER BY 1
), usgprocess as (
SELECT distinct on (a.id_geom_site,a1.nom,a2.nom)
a.id_geom_site,
c.auteur,
MAX(a.date) date,
a1.nom activ_hum,
a.activ_hum_autre,
a2.nom impact,
a3.nom "position",
a.remarques rmq_activ_hum
FROM zones_humides.r_site_usageprocess a
JOIN zones_humides.param_activ_hum a1 ON a.id_activ_hum = a1.id
JOIN zones_humides.param_impact a2 ON a.id_impact = a2.id
JOIN zones_humides.param_position a3 ON a.id_position = a3.id
JOIN auteur c ON c.id_siteusage = a.id
WHERE a."valid"
--AND date = a.date
GROUP BY a.id_geom_site,c.auteur,a1.nom,a.activ_hum_autre,a2.nom,a3.nom,a.remarques
ORDER BY 1
)
SELECT DISTINCT ON (id_geom_site)
id_geom_site,
auteur,
MAX(date) date,
string_agg(
CASE WHEN activ_hum = 'Autre (préciser dans l''encart réservé aux remarques)' THEN activ_hum_autre
ELSE activ_hum END,';') activ_hum,
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN rmq_activ_hum
ELSE impact END,';') impact,
string_agg("position",';') "position",
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN NULL
ELSE rmq_activ_hum END,';') rmq_activ_hum
FROM usgprocess
GROUP BY 1,2
ORDER BY 1
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_usgprocess TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_usgprocess TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_usgprocess)
cnx.execute(grant)
v_zh_connex = """
DROP VIEW IF EXISTS zones_humides.v_zh_connex;
CREATE OR REPLACE VIEW zones_humides.v_zh_connex
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteconnect)
c.id_siteconnect,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteconnect_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteconnect
ORDER BY 1
)
SELECT
a.id_geom_site,
c.auteur,
a.date,
b.nom connexion
FROM zones_humides.r_site_type_connect a
JOIN zones_humides.param_type_connect b ON a.id_param_connect = b.id
JOIN auteur c ON c.id_siteconnect = a.id
WHERE a."valid"
AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_type_connect WHERE id_geom_site = a.id_geom_site)
ORDER BY 1
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_connex TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_connex TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_connex)
cnx.execute(grant)
v_zh_submertion = """
DROP VIEW IF EXISTS zones_humides.v_zh_submertion;
CREATE OR REPLACE VIEW zones_humides.v_zh_submertion
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitesub)
c.id_sitesub,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitesub_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitesub
ORDER BY 1
)
SELECT
a.id_geom_site,
c.auteur,
a.date,
a1.nom subm_freq,
a2.nom subm_etend,
a.id_origsub subm_orig
FROM zones_humides.r_site_sub a
JOIN (zones_humides.param_sub a1 JOIN zones_humides.type_param_sub s6411 ON s6411.id = a1.id_type) ON a.id_freqsub = a1.id
JOIN (zones_humides.param_sub a2 JOIN zones_humides.type_param_sub s6421 ON s6421.id = a2.id_type) ON a.id_etendsub = a2.id
JOIN auteur c ON c.id_sitesub = a.id
WHERE a."valid"
AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_sub WHERE id_geom_site = a.id_geom_site)
AND s6411.nom = 'Submersion fréquente'
AND s6421.nom = 'Submersion étendue'
ORDER BY 1
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_submertion TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_submertion TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_submertion)
cnx.execute(grant)
v_zh_fctecosociopatri_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_fctecosociopatri_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_fctecosociopatri_cross
AS
SELECT
id_geom_site,
auteur,
MAX(date) date,
fct_bio,
fct_hydro,
int_patri,
"val_socioEco"
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitefct)
c.id_sitefct,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitefct_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitefct
ORDER BY 1
)
SELECT
a.id_geom_site::bigint,
d.auteur,
MAX(a.date) date,
c.nom_court type_param,
string_agg(
CASE WHEN a.description IS NULL THEN b.nom
WHEN a.description = '' THEN b.nom
ELSE CONCAT(b.nom,' (',a.description,')') END,
';') fct
FROM zones_humides.r_site_fctecosociopatri a
JOIN (zones_humides.param_fct_eco_socio_patri b
JOIN zones_humides.type_param_fct c ON b.id_type = c.id
) ON a.id_fct = b.id
JOIN auteur d ON d.id_sitefct = a.id
WHERE a."valid"
GROUP BY a.id_geom_site,d.auteur,c.nom_court
ORDER BY 1,4;$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_fct ORDER BY 1 ASC;$$
) AS ct (
"id_geom_site" bigint,
"auteur" text,
"date" date,
"fct_bio" text,
"fct_hydro" text,
"int_patri" text,
"val_socioEco" text)
GROUP BY id_geom_site,auteur,fct_bio,fct_hydro,int_patri,"val_socioEco"
ORDER BY 1,3,2;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_fctecosociopatri_cross)
cnx.execute(grant)
v_zh_critdelim_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_critdelim_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_critdelim_cross
AS
SELECT DISTINCT ON (id_geom_site)
id_geom_site,
auteur,
MAX(date) date,
crit_delim,
crit_def_esp
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitedelim)
c.id_sitedelim,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitedelim_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitedelim
ORDER BY 1
)
SELECT
a.id_geom_site::bigint,
d.auteur,
MAX(a.date) date,
c.nom_court type_param,
string_agg(
CASE WHEN a.description IS NULL THEN b.nom
WHEN a.description = '' THEN b.nom
ELSE CONCAT(b.nom,' (',a.description,')') END,
';') fct
FROM zones_humides.r_site_critdelim a
JOIN (zones_humides.param_delim_fct b
JOIN zones_humides.type_param_delim_fct c ON b.id_type = c.id
) ON a.id_crit_delim = b.id
JOIN auteur d ON d.id_sitedelim = a.id
WHERE a."valid"
GROUP BY a.id_geom_site,d.auteur,c.nom_court
ORDER BY 1,2,3$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_delim_fct ORDER BY 1 DESC;$$
) AS ct (
"id_geom_site" bigint,
"auteur" text,
"date" date,
"crit_delim" text,
"crit_def_esp" text)
GROUP BY id_geom_site,auteur,crit_delim,crit_def_esp
ORDER BY 1,3,2;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_critdelim_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_critdelim_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_critdelim_cross)
cnx.execute(grant)
v_zh_reghydro_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_reghydro_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_reghydro_cross
AS
SELECT DISTINCT ON (id_geom_site)
id_geom_site,
auteur,
MAX(date) date,
(string_to_array(ct.entree_eau,'//'))[1] entree_eau_reg,
(string_to_array(ct.entree_eau,'//'))[2] entree_eau_perm,
(string_to_array(ct.entree_eau,'//'))[3] entree_eau_topo,
(string_to_array(ct.sortie_eau,'//'))[1] sortie_eau_reg,
(string_to_array(ct.sortie_eau,'//'))[2] sortie_eau_perm,
(string_to_array(ct.sortie_eau,'//'))[3] sortie_eau_topo
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitehydro)
c.id_sitehydro,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehydro_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehydro
ORDER BY 1
)
SELECT
a.id_geom_site,
d.auteur,
MAX(a.date) date,
a.in_out,
CONCAT(
string_agg(a1.nom,';'),'//', -- reg_hydro
string_agg(a2.nom,';'),'//', -- permanence
string_agg(a.rmq_toponymie,';') -- rmq_toponymie
) hydro
FROM zones_humides.r_site_reghydro a
LEFT JOIN zones_humides.param_reg_hydro a1 ON a.id_reg_hydro = a1.id
LEFT JOIN zones_humides.param_permanence a2 ON a.id_permanence = a2.id
JOIN auteur d ON d.id_sitehydro = a.id
WHERE a."valid"
GROUP BY a.id_geom_site,d.auteur,a.in_out
ORDER BY 1,2$$,
$$SELECT DISTINCT in_out FROM zones_humides.r_site_reghydro ORDER BY 1 DESC;$$
) AS ct (
"id_geom_site" bigint,
"auteur" text,
"date" date,
"entree_eau" text,
"sortie_eau" text)
GROUP BY id_geom_site,auteur,entree_eau,sortie_eau
ORDER BY 1,3,2;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_reghydro_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_reghydro_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_reghydro_cross)
cnx.execute(grant)
v_zoneshumides = """
DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;
CREATE OR REPLACE VIEW zones_humides.v_zoneshumides
AS
WITH tmp_auteur_site as (
SELECT
s.id,
string_agg(s11.auteur,';' ORDER BY s11.auteur) AS auteur_site
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1
JOIN personnes.v_personne s11 ON s1.id_auteur = s11.id
) ON s.id::text = s1.id_site::text
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s.id
ORDER BY s.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(s611.auteur,';' ORDER BY s611.auteur) AS auteur_geom
FROM sites.sites s
JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61
JOIN personnes.v_personne s611 ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s.id = s6.id_site
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s6.id
ORDER BY s6.id
)
SELECT
s.id AS site_code,
(SELECT ARRAY_AGG(id_site_old) FROM (values (s7.id_site_old)) AS value(id_site_old) WHERE id_site_old IS NOT NULL) old_code,
s.nom,
s2.autre_nom,
s1.auteur_site,
s61.auteur_geom,
(
SELECT DISTINCT ON (date) auteur
FROM (values (s6.date,s61.auteur_geom),(s62.date,s62.auteur),(s63.date,s63.auteur),(s64.date,s64.auteur),(s65.date,s65.auteur),
(s66.date,s66.auteur),(s67.date,s67.auteur),(s68.date,s68.auteur)) AS value(date,auteur)
WHERE date = (SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date))
) as auteur_last_maj,
s.date_deb AS date_site,
s6.date AS date_geom,
(SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date)) as date_last_maj,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s5.id||' - '||s5.nom AS typo_sdage,
s5.mnemo mnemo_sdage,
s.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
s62.code_cb,
s62.lib_cb,
s63.activ_hum,
s63.impact,
s63."position",
s63.rmq_activ_hum,
s64.connexion,
s65.subm_orig,
s65.subm_freq,
s65.subm_etend,
s66.fct_bio,
s66.fct_hydro,
s66.int_patri,
s66."val_socioEco",
s67.crit_delim,
s67.crit_def_esp,
s68.entree_eau_reg,
s68.entree_eau_perm,
s68.entree_eau_topo,
s68.sortie_eau_reg,
s68.sortie_eau_perm,
s68.sortie_eau_topo,
s6.geom
FROM sites.sites s
LEFT JOIN tmp_auteur_site s1 ON s.id = s1.id
LEFT JOIN sites.autre_nom s2 ON s.id = s2.id_site
LEFT JOIN sites.type_milieu s3 ON s.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s.id_type_site::text = s4.id::text
LEFT JOIN sites.typo_sdage s5 ON s.id_typo_sdage::text = s5.id::text
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN tmp_auteur_geom s61 ON s6.id = s61.id
LEFT JOIN zones_humides.v_zh_hab s62 ON s6.id = s62.id_geom_site
LEFT JOIN zones_humides.v_zh_usgprocess s63 ON s6.id = s63.id_geom_site
LEFT JOIN zones_humides.v_zh_connex s64 ON s6.id = s64.id_geom_site
LEFT JOIN zones_humides.v_zh_submertion s65 ON s6.id = s65.id_geom_site
LEFT JOIN zones_humides.v_zh_fctecosociopatri_cross s66 ON s6.id = s66.id_geom_site
LEFT JOIN zones_humides.v_zh_critdelim_cross s67 ON s6.id = s67.id_geom_site
LEFT JOIN zones_humides.v_zh_reghydro_cross s68 ON s6.id = s68.id_geom_site
) ON s.id::text = s6.id_site::text
LEFT JOIN sites.hist_id_site s7 ON s.id = s7.id_site_new
WHERE s.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
AND s6.date = (SELECT MAX(date) FROM sites.r_sites_geom WHERE id_site = s.id)
ORDER BY s.id ASC NULLS FIRST;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zoneshumides TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zoneshumides TO grp_consult;
"""
comment = """
COMMENT ON COLUMN zones_humides.v_zoneshumides.site_code IS 'Identifiant de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.nom IS 'Nom de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_site IS 'Auteur ayant caractérisé la zone humide pour la première fois.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_last_maj IS 'Auteur le plus récent ayant défini les attributs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_site IS 'Date de la première description de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_last_maj IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_site IS '';
COMMENT ON COLUMN zones_humides.v_zoneshumides.typo_sdage IS 'Typologie sdage de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_site IS 'Remarques générale concernant la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_orient_act IS 'Remarques sur les orientations et les actes de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.code_cb IS 'Liste des codes CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.lib_cb IS 'Liste des habitats CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.activ_hum IS 'Liste des activités humaines identifiées sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''impacts'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.impact IS 'Liste des impacts identifiés et engendrés par les activités humaine sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."position" IS 'Liste des potionnements des différentes activités humaines sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''impact''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_activ_hum IS 'Remarques concernant activités humaines identifiées sur la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.connexion IS 'Connexion de la zone humide dans son environnement.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_orig IS 'Origine de l''eau submerssive.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_freq IS 'Fréquence de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_etend IS 'Etendue de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_bio IS 'Liste des fonctions biologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_hydro IS 'Liste des fonctions hydrologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.int_patri IS 'Liste des interêts patrimoniaux de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."val_socioEco" IS 'Liste des valeurs socio-economiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_delim IS 'Liste des critères de délimitation de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_def_esp IS 'Liste des critères de l''espace de fonctionnalité de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_reg IS 'Liste des entrées d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_perm IS 'Liste des permanances respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_topo IS 'Liste de la toponymie respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_reg IS 'Liste des sorties d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_perm IS 'Liste des permanances respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_topo IS 'Liste de la toponymie respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
"""
with con.begin() as cnx:
cnx.execute(text(v_zoneshumides))
cnx.execute(grant)
cnx.execute(comment)
v_rhomeosite = """
DROP VIEW IF EXISTS zones_humides.v_rhomeosite;
CREATE OR REPLACE VIEW zones_humides.v_rhomeosite
AS
SELECT
v.site_code||' - '||v.nom "NAME",
SPLIT_PART(v.auteur_geom,' (',1) "REFERENT",
REPLACE(SPLIT_PART(v.auteur_geom,' (',2),')','') "ORG",
SPLIT_PART(v.typo_sdage,' - ',1) "TYPE",
CASE WHEN r.nom::text = 'alpin' THEN '1'
WHEN r.nom::text = 'continental' THEN '2'
WHEN r.nom::text = 'mediterraneen' THEN '4'
END "ODONATE",
v.geom
FROM zones_humides.v_zoneshumides v, ref_territoire.ref_biogeo r
WHERE st_intersects(v.geom, r.geom)
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_rhomeosite TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_rhomeosite TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_rhomeosite))
cnx.execute(grant)
test = """
SELECT * FROM zones_humides.v_zoneshumides;
"""
data = pd.read_sql_query(
sql = text(test),
con = con)
data[~data.index.isin(data.drop_duplicates(subset='site_code',keep=False).index)]
data[data.duplicated(subset='site_code',keep=False)]
+594
View File
@@ -0,0 +1,594 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import text
from datetime import datetime as dt
import geopandas as gpd
from pycen import con
drop_v_zh = 'DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;'
with con.begin() as cnx:
cnx.execute(drop_v_zh)
v_zh_hab = """
DROP VIEW IF EXISTS zones_humides.v_zh_hab;
CREATE OR REPLACE VIEW zones_humides.v_zh_hab
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitehab)
c.id_sitehab,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehab_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehab
ORDER BY 1
)
SELECT DISTINCT ON (a.id_site)
--a.id_geom_site,
a.id_site,
c.auteur,
--MAX(a."date") "date",
a."date",
string_agg(a.id_cb,';' order by a.id_cb) code_cb,
string_agg(b.lb_hab_fr,';' order by a.id_cb) lib_cb
FROM zones_humides.r_site_habitat a
JOIN ref_habitats.corine_biotope b ON a.id_cb = b.id
JOIN auteur c ON c.id_sitehab = a.id
WHERE a."valid"
GROUP BY 1,2,3
ORDER BY a.id_site, a."date" desc,row_number() OVER (ORDER BY a.id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_hab TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_hab TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_zh_hab))
cnx.execute(grant)
v_zh_usgprocess = """
DROP VIEW IF EXISTS zones_humides.v_zh_usgprocess;
CREATE OR REPLACE VIEW zones_humides.v_zh_usgprocess
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteusage)
c.id_siteusage,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteusage_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteusage
ORDER BY 1
), usgprocess as (
SELECT distinct on (a.id_site,a1.nom,a2.nom)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
a1.nom activ_hum,
a.activ_hum_autre,
a2.nom impact,
a3.nom "position",
a.remarques rmq_activ_hum
FROM zones_humides.r_site_usageprocess a
JOIN zones_humides.param_activ_hum a1 ON a.id_activ_hum = a1.id
JOIN zones_humides.param_impact a2 ON a.id_impact = a2.id
JOIN zones_humides.param_position a3 ON a.id_position = a3.id
JOIN auteur c ON c.id_siteusage = a.id
WHERE a."valid"
--AND date = a.date
--GROUP BY a.id_geom_site,c.auteur,a1.nom,a.activ_hum_autre,a2.nom,a3.nom,a.remarques
--GROUP BY a.id_site,c.auteur,a1.nom,a.activ_hum_autre,a2.nom,a3.nom,a.remarques
ORDER BY a.id_site,a1.nom,a2.nom, a."date" desc,row_number() OVER (ORDER BY a.id_site) desc
)
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
string_agg(
CASE WHEN activ_hum = 'Autre (préciser dans l''encart réservé aux remarques)' THEN activ_hum_autre
ELSE activ_hum END,';') activ_hum,
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN rmq_activ_hum
ELSE impact END,';') impact,
string_agg("position",';') "position",
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN NULL
ELSE rmq_activ_hum END,';') rmq_activ_hum
FROM usgprocess
GROUP BY 1,2,3
ORDER BY id_site, "date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_usgprocess TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_usgprocess TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_usgprocess)
cnx.execute(grant)
v_zh_connex = """
DROP VIEW IF EXISTS zones_humides.v_zh_connex;
CREATE OR REPLACE VIEW zones_humides.v_zh_connex
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteconnect)
c.id_siteconnect,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteconnect_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteconnect
ORDER BY 1
)
SELECT DISTINCT ON (id_site)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
b.nom connexion
FROM zones_humides.r_site_type_connect a
JOIN zones_humides.param_type_connect b ON a.id_param_connect = b.id
JOIN auteur c ON c.id_siteconnect = a.id
WHERE a."valid"
--AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_type_connect WHERE id_site = a.id_site)
ORDER BY a.id_site,"date" desc,row_number() OVER (ORDER BY a.id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_connex TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_connex TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_connex)
cnx.execute(grant)
v_zh_submertion = """
DROP VIEW IF EXISTS zones_humides.v_zh_submertion;
CREATE OR REPLACE VIEW zones_humides.v_zh_submertion
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitesub)
c.id_sitesub,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitesub_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitesub
ORDER BY 1
)
SELECT DISTINCT ON (a.id_site)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
a1.nom subm_freq,
a2.nom subm_etend,
a.id_origsub subm_orig
FROM zones_humides.r_site_sub a
JOIN (zones_humides.param_sub a1 JOIN zones_humides.type_param_sub s6411 ON s6411.id = a1.id_type) ON a.id_freqsub = a1.id
JOIN (zones_humides.param_sub a2 JOIN zones_humides.type_param_sub s6421 ON s6421.id = a2.id_type) ON a.id_etendsub = a2.id
JOIN auteur c ON c.id_sitesub = a.id
WHERE a."valid"
--AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_sub WHERE id_site = a.id_site)
AND s6411.nom = 'Submersion fréquente'
AND s6421.nom = 'Submersion étendue'
ORDER BY a.id_site,"date" desc,row_number() OVER (ORDER BY a.id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_submertion TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_submertion TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_submertion)
cnx.execute(grant)
v_zh_fctecosociopatri_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_fctecosociopatri_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_fctecosociopatri_cross
AS
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
fct_bio,
fct_hydro,
int_patri,
"val_socioEco"
FROM crosstab(
$$ WITH auteur AS (
SELECT DISTINCT ON (id_sitefct)
c.id_sitefct,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitefct_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitefct
ORDER BY 1
), tmp_select as (
SELECT
id_site,
(SELECT regexp_split_to_table(auth,',') FROM (values (string_agg(d.auteur,',' order by ROW()))) AS value(auth) Limit 1) auteur,
MAX(a.date) date,
c.nom_court type_param,
b.nom,
string_agg(DISTINCT a.description,'\n') remark
FROM zones_humides.r_site_fctecosociopatri a
JOIN (zones_humides.param_fct_eco_socio_patri b
JOIN zones_humides.type_param_fct c ON b.id_type = c.id
) ON a.id_fct = b.id
JOIN auteur d ON d.id_sitefct = a.id
WHERE a."valid"
GROUP BY a.id_site,c.nom_court,b.nom
ORDER BY a.id_site,c.nom_court DESC,b.nom
)
SELECT
id_site,
string_agg(
DISTINCT CASE WHEN extract(year from date)>'1'
THEN auteur||'-'|| extract(year from date)
ELSE auteur END,
'; ') auteur,
MAX(date) date,
type_param,
string_agg(distinct
CASE WHEN remark IS NULL THEN nom
WHEN remark = '' THEN nom
ELSE CONCAT(nom,' (',remark,')') END,
';') fct
FROM tmp_select
GROUP BY 1,4
ORDER BY 1,4,3;$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_fct ORDER BY 1 ASC;$$
) AS ct (
"id_site" text,
"auteur" text,
"date" date,
"fct_bio" text,
"fct_hydro" text,
"int_patri" text,
"val_socioEco" text)
--GROUP BY id_site,auteur,fct_bio,fct_hydro,int_patri,"val_socioEco"
ORDER BY id_site,"date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_fctecosociopatri_cross)
cnx.execute(grant)
v_zh_critdelim_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_critdelim_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_critdelim_cross
AS
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
crit_delim,
crit_def_esp
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitedelim)
c.id_sitedelim,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitedelim_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitedelim
ORDER BY 1
)
SELECT
--a.id_geom_site::bigint,
id_site,
string_agg(
DISTINCT CASE WHEN extract(year from a.date)>'1'
THEN d.auteur||'-'|| extract(year from a.date)
ELSE d.auteur END,
'; ') auteur,
MAX(a.date) date,
c.nom_court type_param,
string_agg( DISTINCT
CASE WHEN a.description IS NULL THEN b.nom
WHEN a.description = '' THEN b.nom
ELSE CONCAT(b.nom,' (',a.description,')') END,
'; ') fct
FROM zones_humides.r_site_critdelim a
JOIN (zones_humides.param_delim_fct b
JOIN zones_humides.type_param_delim_fct c ON b.id_type = c.id
) ON a.id_crit_delim = b.id
JOIN auteur d ON d.id_sitedelim = a.id
WHERE a."valid"
GROUP BY 1,4
ORDER BY 3,1,2$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_delim_fct ORDER BY 1 DESC;$$
) AS ct (
"id_site" text,
"auteur" text,
"date" date,
"crit_delim" text,
"crit_def_esp" text)
--GROUP BY id_site,auteur,crit_delim,crit_def_esp
ORDER BY id_site,"date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_critdelim_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_critdelim_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_critdelim_cross)
cnx.execute(grant)
v_zh_reghydro_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_reghydro_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_reghydro_cross
AS
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
(string_to_array(ct.entree_eau,'//'))[1] entree_eau_reg,
(string_to_array(ct.entree_eau,'//'))[2] entree_eau_perm,
(string_to_array(ct.entree_eau,'//'))[3] entree_eau_topo,
(string_to_array(ct.sortie_eau,'//'))[1] sortie_eau_reg,
(string_to_array(ct.sortie_eau,'//'))[2] sortie_eau_perm,
(string_to_array(ct.sortie_eau,'//'))[3] sortie_eau_topo
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitehydro)
c.id_sitehydro,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehydro_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehydro
ORDER BY 1
)
SELECT
--a.id_geom_site,
id_site,
d.auteur,
MAX(a.date) date,
a.in_out,
CONCAT(
string_agg(a1.nom,';'),'//', -- reg_hydro
string_agg(a2.nom,';'),'//', -- permanence
string_agg(a.rmq_toponymie,';') -- rmq_toponymie
) hydro
FROM zones_humides.r_site_reghydro a
LEFT JOIN zones_humides.param_reg_hydro a1 ON a.id_reg_hydro = a1.id
LEFT JOIN zones_humides.param_permanence a2 ON a.id_permanence = a2.id
JOIN auteur d ON d.id_sitehydro = a.id
WHERE a."valid"
GROUP BY a.id_site,d.auteur,a.in_out
ORDER BY 1,2$$,
$$SELECT DISTINCT in_out FROM zones_humides.r_site_reghydro ORDER BY 1 DESC;$$
) AS ct (
"id_site" text,
"auteur" text,
"date" date,
"entree_eau" text,
"sortie_eau" text)
--GROUP BY id_site,auteur,entree_eau,sortie_eau
ORDER BY id_site,"date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_reghydro_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_reghydro_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_reghydro_cross)
cnx.execute(grant)
v_zoneshumides = """
DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;
CREATE OR REPLACE VIEW zones_humides.v_zoneshumides
AS
WITH tmp_auteur_site as (
SELECT
s0.id,
string_agg(s11.auteur,';' ORDER BY s11.auteur) AS auteur_site
FROM sites.sites s0
JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1
JOIN personnes.v_personne s11 ON s1.id_auteur = s11.id
) ON s0.id::text = s1.id_site::text
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s0.id
ORDER BY s0.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(s611.auteur,';' ORDER BY s611.auteur) AS auteur_geom
FROM sites.sites s0
JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61
JOIN personnes.v_personne s611 ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s0.id = s6.id_site
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s6.id
ORDER BY s6.id
),
tmp_other_name as (
SELECT
id_site_new,
ARRAY_AGG(id_site_old) id_site_old
FROM sites.r_site_maj
WHERE id_site_old IS NOT NULL
GROUP BY id_site_new
)
SELECT
s0.id AS site_code,
s7.id_site_old old_code,
s0.nom,
s2.autre_nom,
s1.auteur_site,
s6.auteur_geom,
(
SELECT DISTINCT ON (date) auteur
FROM (values (s6.date,s6.auteur_geom),(s62.date,s62.auteur),(s63.date,s63.auteur),(s64.date,s64.auteur),(s65.date,s65.auteur),
(s66.date,s66.auteur),(s67.date,s67.auteur),(s68.date,s68.auteur)) AS value(date,auteur)
WHERE date = (SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date))
) as auteur_last_maj,
s0.date_deb AS date_site,
s6.date AS date_geom,
(SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date)) as date_last_maj,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s5.id||' - '||s5.nom AS typo_sdage,
s5.mnemo mnemo_sdage,
s0.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
s62.code_cb,
s62.lib_cb,
s63.activ_hum,
s63.impact,
s63."position",
s63.rmq_activ_hum,
s64.connexion,
s65.subm_orig,
s65.subm_freq,
s65.subm_etend,
s66.fct_bio,
s66.fct_hydro,
s66.int_patri,
s66."val_socioEco",
s67.crit_delim,
s67.crit_def_esp,
s68.entree_eau_reg,
s68.entree_eau_perm,
s68.entree_eau_topo,
s68.sortie_eau_reg,
s68.sortie_eau_perm,
s68.sortie_eau_topo,
s6.id_origine,
s6.geom
FROM sites.sites s0
LEFT JOIN tmp_auteur_site s1 ON s0.id = s1.id
LEFT JOIN sites.autre_nom s2 ON s0.id = s2.id_site
LEFT JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s0.id_type_site::text = s4.id::text
LEFT JOIN sites.typo_sdage s5 ON s0.id_typo_sdage::text = s5.id::text
LEFT JOIN (SELECT DISTINCT ON (sg.id_site) *
FROM sites.r_sites_geom sg
LEFT JOIN tmp_auteur_geom s61 USING (id) --ON s6.id = s61.id
ORDER BY sg.id_site, "date" DESC, date_insert DESC
) s6 ON s0.id::text = s6.id_site::text
LEFT JOIN zones_humides.v_zh_hab s62 ON s0.id = s62.id_site
LEFT JOIN zones_humides.v_zh_usgprocess s63 ON s0.id = s63.id_site
LEFT JOIN zones_humides.v_zh_connex s64 ON s0.id = s64.id_site
LEFT JOIN zones_humides.v_zh_submertion s65 ON s0.id = s65.id_site
LEFT JOIN zones_humides.v_zh_fctecosociopatri_cross s66 ON s0.id = s66.id_site
LEFT JOIN zones_humides.v_zh_critdelim_cross s67 ON s0.id = s67.id_site
LEFT JOIN zones_humides.v_zh_reghydro_cross s68 ON s0.id = s68.id_site
LEFT JOIN tmp_other_name s7 ON s0.id = s7.id_site_new
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
AND s6.date = (SELECT MAX(date) FROM sites.r_sites_geom WHERE r_sites_geom.id_site = s0.id)
ORDER BY s0.id ASC NULLS FIRST;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zoneshumides TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zoneshumides TO grp_consult;
"""
comment = """
COMMENT ON COLUMN zones_humides.v_zoneshumides.site_code IS 'Identifiant de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.old_code IS 'Ancien identifiant de la zone humide pouvant se retrouver dans des données historiques.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.nom IS 'Nom de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.autre_nom IS 'Autre nom de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_site IS 'Auteur ayant caractérisé la zone humide pour la première fois.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_last_maj IS 'Auteur le plus récent ayant défini les attributs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_site IS 'Date de la première description de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_last_maj IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_site IS '';
COMMENT ON COLUMN zones_humides.v_zoneshumides.typo_sdage IS 'Typologie sdage de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_site IS 'Remarques générale concernant la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_orient_act IS 'Remarques sur les orientations et les actes de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.code_cb IS 'Liste des codes CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.lib_cb IS 'Liste des habitats CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.activ_hum IS 'Liste des activités humaines identifiées sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''impacts'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.impact IS 'Liste des impacts identifiés et engendrés par les activités humaine sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."position" IS 'Liste des potionnements des différentes activités humaines sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''impact''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_activ_hum IS 'Remarques concernant activités humaines identifiées sur la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.connexion IS 'Connexion de la zone humide dans son environnement.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_orig IS 'Origine de l''eau submerssive.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_freq IS 'Fréquence de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_etend IS 'Etendue de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_bio IS 'Liste des fonctions biologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_hydro IS 'Liste des fonctions hydrologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.int_patri IS 'Liste des interêts patrimoniaux de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."val_socioEco" IS 'Liste des valeurs socio-economiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_delim IS 'Liste des critères de délimitation de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_def_esp IS 'Liste des critères de l''espace de fonctionnalité de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_reg IS 'Liste des entrées d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_perm IS 'Liste des permanances respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_topo IS 'Liste de la toponymie respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_reg IS 'Liste des sorties d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_perm IS 'Liste des permanances respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_topo IS 'Liste de la toponymie respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
"""
with con.begin() as cnx:
cnx.execute(text(v_zoneshumides))
cnx.execute(grant)
cnx.execute(comment)
v_rhomeosite = """
DROP VIEW IF EXISTS zones_humides.v_rhomeosite;
CREATE OR REPLACE VIEW zones_humides.v_rhomeosite
AS
SELECT
v.site_code||' - '||v.nom "NAME",
SPLIT_PART(v.auteur_geom,' (',1) "REFERENT",
REPLACE(SPLIT_PART(v.auteur_geom,' (',2),')','') "ORG",
SPLIT_PART(v.typo_sdage,' - ',1) "TYPE",
CASE WHEN r.nom::text = 'alpin' THEN '1'
WHEN r.nom::text = 'continental' THEN '2'
WHEN r.nom::text = 'mediterraneen' THEN '4'
END "ODONATE",
v.geom
FROM zones_humides.v_zoneshumides v, ref_territoire.ref_biogeo r
WHERE st_intersects(v.geom, r.geom)
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_rhomeosite TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_rhomeosite TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_rhomeosite))
cnx.execute(grant)
test = """
SELECT * FROM zones_humides.v_zoneshumides;
"""
data = gpd.pd.read_sql_query(
sql = text(test),
con = con)
data[~data.index.isin(data.drop_duplicates(subset='site_code',keep=False).index)]
data[data.duplicated(subset='site_code',keep=False)]
+641
View File
@@ -0,0 +1,641 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from sqlalchemy import text
from datetime import datetime as dt
import geopandas as gpd
from pycen import con
# Parametres bdd
from sqlalchemy import create_engine, text
from sqlalchemy.engine import URL
from pycen import con
drop_v_zh = 'DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;'
with con.begin() as cnx:
cnx.execute(drop_v_zh)
v_zh_hab = """
DROP VIEW IF EXISTS zones_humides.v_zh_hab;
CREATE OR REPLACE VIEW zones_humides.v_zh_hab
AS
WITH author AS (
SELECT DISTINCT ON (id_sitehab)
c.id_sitehab,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehab_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehab
ORDER BY 1
),
d_max as (
SELECT distinct on (id_site)
a.id_site,
c.auteur,
a."date"
FROM zones_humides.r_site_habitat a
JOIN author c ON c.id_sitehab = a.id
WHERE a."valid"
ORDER BY a.id_site, "date" DESC
)
SELECT --distinct on (a.id_cb)
d.id_site,
d.auteur,
d."date",
string_agg(a.id_cb,';' order by a.id_cb asc) code_cb,
string_agg(b.lb_hab_fr,';' order by a.id_cb asc) lib_cb
FROM (SELECT distinct on (id_site,id_cb) * FROM zones_humides.r_site_habitat ) a
JOIN ref_habitats.corine_biotope b ON a.id_cb = b.id
JOIN d_max d on a.id_site = d.id_site
WHERE a."valid"
GROUP BY 1,2,3
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_hab TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_hab TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_zh_hab))
cnx.execute(grant)
v_zh_usgprocess = """
DROP VIEW IF EXISTS zones_humides.v_zh_usgprocess;
CREATE OR REPLACE VIEW zones_humides.v_zh_usgprocess
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteusage)
c.id_siteusage,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteusage_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteusage
ORDER BY 1
), usgprocess as (
SELECT distinct on (a.id_site,a1.nom,a2.nom)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
a1.nom activ_hum,
a.activ_hum_autre,
a2.nom impact,
a3.nom "position",
a.remarques rmq_activ_hum
FROM zones_humides.r_site_usageprocess a
JOIN zones_humides.param_activ_hum a1 ON a.id_activ_hum = a1.id
JOIN zones_humides.param_impact a2 ON a.id_impact = a2.id
JOIN zones_humides.param_position a3 ON a.id_position = a3.id
JOIN auteur c ON c.id_siteusage = a.id
WHERE a."valid"
--AND date = a.date
--GROUP BY a.id_geom_site,c.auteur,a1.nom,a.activ_hum_autre,a2.nom,a3.nom,a.remarques
--GROUP BY a.id_site,c.auteur,a1.nom,a.activ_hum_autre,a2.nom,a3.nom,a.remarques
ORDER BY a.id_site,a1.nom,a2.nom, a."date" desc,row_number() OVER (ORDER BY a.id_site) desc
)
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
string_agg(
CASE WHEN activ_hum = 'Autre (préciser dans l''encart réservé aux remarques)' THEN activ_hum_autre
ELSE activ_hum END,';') activ_hum,
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN rmq_activ_hum
ELSE impact END,';') impact,
string_agg("position",';') "position",
string_agg(
CASE WHEN impact = 'Autre (préciser dans l''encart réservé aux remarques)' THEN NULL
ELSE rmq_activ_hum END,';') rmq_activ_hum
FROM usgprocess
GROUP BY 1,2,3
ORDER BY id_site, "date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_usgprocess TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_usgprocess TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_usgprocess)
cnx.execute(grant)
v_zh_connex = """
DROP VIEW IF EXISTS zones_humides.v_zh_connex;
CREATE OR REPLACE VIEW zones_humides.v_zh_connex
AS
WITH auteur AS (
SELECT DISTINCT ON (id_siteconnect)
c.id_siteconnect,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsiteconnect_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_siteconnect
ORDER BY 1
)
SELECT DISTINCT ON (id_site)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
b.nom connexion
FROM zones_humides.r_site_type_connect a
JOIN zones_humides.param_type_connect b ON a.id_param_connect = b.id
JOIN auteur c ON c.id_siteconnect = a.id
WHERE a."valid"
--AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_type_connect WHERE id_site = a.id_site)
ORDER BY a.id_site,"date" desc,row_number() OVER (ORDER BY a.id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_connex TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_connex TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_connex)
cnx.execute(grant)
v_zh_submertion = """
DROP VIEW IF EXISTS zones_humides.v_zh_submertion;
CREATE OR REPLACE VIEW zones_humides.v_zh_submertion
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitesub)
c.id_sitesub,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitesub_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitesub
ORDER BY 1
)
SELECT DISTINCT ON (a.id_site)
--a.id_geom_site,
a.id_site,
c.auteur,
a."date",
a1.nom subm_freq,
a2.nom subm_etend,
a.id_origsub subm_orig
FROM zones_humides.r_site_sub a
JOIN (zones_humides.param_sub a1 JOIN zones_humides.type_param_sub s6411 ON s6411.id = a1.id_type) ON a.id_freqsub = a1.id
JOIN (zones_humides.param_sub a2 JOIN zones_humides.type_param_sub s6421 ON s6421.id = a2.id_type) ON a.id_etendsub = a2.id
JOIN auteur c ON c.id_sitesub = a.id
WHERE a."valid"
--AND a.date = (SELECT MAX(date) FROM zones_humides.r_site_sub WHERE id_site = a.id_site)
AND s6411.nom = 'Submersion fréquente'
AND s6421.nom = 'Submersion étendue'
ORDER BY a.id_site,"date" desc,row_number() OVER (ORDER BY a.id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_submertion TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_submertion TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_submertion)
cnx.execute(grant)
v_zh_fctecosociopatri_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_fctecosociopatri_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_fctecosociopatri_cross
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitefct)
c.id_sitefct,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitefct_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitefct
ORDER BY 1
),max_author as (
SELECT DISTINCT ON (id_site)
a.id_site,
--(SELECT regexp_split_to_table(auth,',') FROM (values (string_agg(auteur,',' order by ROW()))) AS value(auth) Limit 1) auteur,
auteur,
a."date"
FROM auteur
JOIN zones_humides.r_site_fctecosociopatri a ON id_sitefct = a.id
order by 1,3 DESC,2
)
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
--(SELECT auteur ORDER BY ct."date" DESC) "date",
"date",
auteur,
fct_bio,
fct_hydro,
int_patri,
"val_socioEco"
FROM crosstab(
$$ WITH tmp_select as (
SELECT
max(a."id") id_sitefct,
id_site,
--(SELECT regexp_split_to_table(auth,',') FROM (values (string_agg(d.auteur,',' order by ROW()))) AS value(auth) Limit 1) auteur,
--MAX(a.date) date,
c.nom_court type_param,
b.nom,
string_agg(DISTINCT a.description,'\n') remark
FROM zones_humides.r_site_fctecosociopatri a
JOIN (zones_humides.param_fct_eco_socio_patri b
JOIN zones_humides.type_param_fct c ON b.id_type = c.id
) ON a.id_fct = b.id
--JOIN auteur d ON d.id_sitefct = a.id
WHERE a."valid"
GROUP BY a.id_site,c.nom_court,b.nom
ORDER BY a.id_site,c.nom_court DESC,b.nom
)
SELECT
id_site,
--(SELECT regexp_split_to_table(auth,',') FROM (values (string_agg(d.auteur,',' order by ROW()))) AS value(auth) Limit 1) auteur,
--MAX("date") "date",
type_param,
string_agg(distinct
CASE WHEN remark IS NULL THEN nom
WHEN remark = '' THEN nom
ELSE CONCAT(nom,' (',remark,')') END,
';') fct
FROM tmp_select
--JOIN auteur d using (id_sitefct)
GROUP BY id_site,type_param
ORDER BY id_site,type_param;$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_fct ORDER BY 1 ASC;$$
) AS ct (
"id_site" text,
--"auteur" text,
--"date" date,
"fct_bio" text,
"fct_hydro" text,
"int_patri" text,
"val_socioEco" text
)
JOIN max_author USING (id_site)
--GROUP BY id_site,auteur,fct_bio,fct_hydro,int_patri,"val_socioEco"
--WHERE id_site in ('38CG0110','38RD0057','38VS0063')
ORDER BY id_site,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_fctecosociopatri_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_fctecosociopatri_cross)
cnx.execute(grant)
v_zh_critdelim_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_critdelim_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_critdelim_cross
AS
WITH auteur AS (
SELECT DISTINCT ON (id_sitedelim)
c.id_sitedelim,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitedelim_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitedelim
ORDER BY 1
),max_author as (
SELECT DISTINCT ON (id_site)
a.id_site,
--(SELECT regexp_split_to_table(auth,',') FROM (values (string_agg(auteur,',' order by ROW()))) AS value(auth) Limit 1) auteur,
auteur,
a."date"
FROM auteur
JOIN zones_humides.r_site_critdelim a ON id_sitedelim = a.id
order by 1,3 DESC,2
)
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
"date",
auteur,
crit_delim,
crit_def_esp
FROM crosstab(
$$ SELECT
--a.id_geom_site::bigint,
id_site,
c.nom_court type_param,
string_agg( DISTINCT
CASE WHEN a.description IS NULL THEN b.nom
WHEN a.description = '' THEN b.nom
ELSE CONCAT(b.nom,' (',a.description,')') END,
'; ') fct
FROM zones_humides.r_site_critdelim a
JOIN (zones_humides.param_delim_fct b
JOIN zones_humides.type_param_delim_fct c ON b.id_type = c.id
) ON a.id_crit_delim = b.id
--JOIN auteur d ON d.id_sitedelim = a.id
WHERE a."valid"
GROUP BY 1,2
ORDER BY 1$$,
$$SELECT DISTINCT nom_court FROM zones_humides.type_param_delim_fct ORDER BY 1 DESC;$$
) AS ct (
"id_site" text,
--"auteur" text,
--"date" date,
"crit_delim" text,
"crit_def_esp" text)
JOIN max_author USING (id_site)
--GROUP BY id_site,auteur,crit_delim,crit_def_esp
--WHERE id_site in ('38CG0110','38RD0057','38VS0063')
ORDER BY id_site,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_critdelim_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_critdelim_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_critdelim_cross)
cnx.execute(grant)
v_zh_reghydro_cross = """
DROP VIEW IF EXISTS zones_humides.v_zh_reghydro_cross;
CREATE OR REPLACE VIEW zones_humides.v_zh_reghydro_cross
AS
SELECT DISTINCT ON (id_site)
--id_geom_site,
id_site,
auteur,
"date",
(string_to_array(ct.entree_eau,'//'))[1] entree_eau_reg,
(string_to_array(ct.entree_eau,'//'))[2] entree_eau_perm,
(string_to_array(ct.entree_eau,'//'))[3] entree_eau_topo,
(string_to_array(ct.sortie_eau,'//'))[1] sortie_eau_reg,
(string_to_array(ct.sortie_eau,'//'))[2] sortie_eau_perm,
(string_to_array(ct.sortie_eau,'//'))[3] sortie_eau_topo
FROM crosstab(
$$WITH auteur AS (
SELECT DISTINCT ON (id_sitehydro)
c.id_sitehydro,
string_agg(c1.auteur,';' ORDER BY c1.auteur) auteur
FROM zones_humides.r_rsitehydro_auteur c
JOIN personnes.v_personne c1 ON c1.id = c.id_auteur
GROUP BY c.id_sitehydro
ORDER BY 1
)
SELECT
--a.id_geom_site,
id_site,
d.auteur,
MAX(a.date) date,
a.in_out,
CONCAT(
string_agg(a1.nom,';'),'//', -- reg_hydro
string_agg(a2.nom,';'),'//', -- permanence
string_agg(a.rmq_toponymie,';') -- rmq_toponymie
) hydro
FROM zones_humides.r_site_reghydro a
LEFT JOIN zones_humides.param_reg_hydro a1 ON a.id_reg_hydro = a1.id
LEFT JOIN zones_humides.param_permanence a2 ON a.id_permanence = a2.id
JOIN auteur d ON d.id_sitehydro = a.id
WHERE a."valid"
GROUP BY a.id_site,d.auteur,a.in_out
ORDER BY 1,2$$,
$$SELECT DISTINCT in_out FROM zones_humides.r_site_reghydro ORDER BY 1 DESC;$$
) AS ct (
"id_site" text,
"auteur" text,
"date" date,
"entree_eau" text,
"sortie_eau" text)
--GROUP BY id_site,auteur,entree_eau,sortie_eau
ORDER BY id_site,"date" desc,row_number() OVER (ORDER BY id_site) desc
;"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zh_reghydro_cross TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zh_reghydro_cross TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(v_zh_reghydro_cross)
cnx.execute(grant)
v_zoneshumides = """
DROP VIEW IF EXISTS zones_humides.v_zoneshumides CASCADE;
CREATE OR REPLACE VIEW zones_humides.v_zoneshumides
AS
WITH tmp_auteur_site as (
SELECT
s0.id,
string_agg(s11.auteur,';' ORDER BY s11.auteur) AS auteur_site
FROM sites.sites s0
JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_auteur s1
JOIN personnes.v_personne s11 ON s1.id_auteur = s11.id
) ON s0.id::text = s1.id_site::text
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s0.id
ORDER BY s0.id
), tmp_auteur_geom as (
SELECT
s6.id,
string_agg(s611.auteur,';' ORDER BY s611.auteur) AS auteur_geom
FROM sites.sites s0
JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN (sites.r_sites_geom s6
LEFT JOIN (sites.r_geomsites_auteur s61
JOIN personnes.v_personne s611 ON s61.id_auteur = s611.id
) ON s6.id = s61.id_geom_site
) ON s0.id = s6.id_site
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
GROUP BY s6.id
ORDER BY s6.id
),
tmp_other_name as (
SELECT
id_site_new,
ARRAY_AGG(id_site_old) id_site_old
FROM sites.r_site_maj
WHERE id_site_old IS NOT NULL
GROUP BY id_site_new
)
SELECT
s0.id AS site_code,
s7.id_site_old old_code,
s0.nom,
s2.autre_nom,
s1.auteur_site,
s6.auteur_geom,
(
SELECT DISTINCT ON (date) auteur
FROM (values (s6.date,s6.auteur_geom),(s62.date,s62.auteur),(s63.date,s63.auteur),(s64.date,s64.auteur),(s65.date,s65.auteur),
(s66.date,s66.auteur),(s67.date,s67.auteur),(s68.date,s68.auteur)) AS value(date,auteur)
WHERE date = (SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date))
) as auteur_last_maj,
s0.date_deb AS date_site,
s6.date AS date_geom,
(SELECT MAX(date) FROM (values (s6.date),(s62.date),(s63.date),(s64.date),(s65.date),(s66.date),(s67.date),(s68.date)) AS value(date)) as date_last_maj,
s3.nom_court AS type_milieu,
s4.nom AS type_site,
s5.id||' - '||s5.nom AS typo_sdage,
s5.mnemo mnemo_sdage,
s0.remarques AS rmq_site,
s6.rmq_fct_majeur,
s6.rmq_interet_patri,
s6.rmq_bilan_menace,
s6.rmq_orient_act,
s6.rmq_usage_process,
s62.code_cb,
s62.lib_cb,
s63.activ_hum,
s63.impact,
s63."position",
s63.rmq_activ_hum,
s64.connexion,
s65.subm_orig,
s65.subm_freq,
s65.subm_etend,
s66.fct_bio,
s66.fct_hydro,
s66.int_patri,
s66."val_socioEco",
s67.crit_delim,
s67.crit_def_esp,
s68.entree_eau_reg,
s68.entree_eau_perm,
s68.entree_eau_topo,
s68.sortie_eau_reg,
s68.sortie_eau_perm,
s68.sortie_eau_topo,
s6.id_origine,
s6.geom
FROM sites.sites s0
LEFT JOIN tmp_auteur_site s1 ON s0.id = s1.id
LEFT JOIN sites.autre_nom s2 ON s0.id = s2.id_site
LEFT JOIN sites.type_milieu s3 ON s0.id_type_milieu = s3.id
LEFT JOIN sites.type_site s4 ON s0.id_type_site::text = s4.id::text
LEFT JOIN sites.typo_sdage s5 ON s0.id_typo_sdage::text = s5.id::text
LEFT JOIN (SELECT DISTINCT ON (sg.id_site) *
FROM sites.r_sites_geom sg
LEFT JOIN tmp_auteur_geom s61 USING (id) --ON s6.id = s61.id
ORDER BY sg.id_site, "date" DESC, date_insert DESC
) s6 ON s0.id::text = s6.id_site::text
LEFT JOIN zones_humides.v_zh_hab s62 ON s0.id = s62.id_site
LEFT JOIN zones_humides.v_zh_usgprocess s63 ON s0.id = s63.id_site
LEFT JOIN zones_humides.v_zh_connex s64 ON s0.id = s64.id_site
LEFT JOIN zones_humides.v_zh_submertion s65 ON s0.id = s65.id_site
LEFT JOIN zones_humides.v_zh_fctecosociopatri_cross s66 ON s0.id = s66.id_site
LEFT JOIN zones_humides.v_zh_critdelim_cross s67 ON s0.id = s67.id_site
LEFT JOIN zones_humides.v_zh_reghydro_cross s68 ON s0.id = s68.id_site
LEFT JOIN tmp_other_name s7 ON s0.id = s7.id_site_new
WHERE s0.date_fin IS NULL
AND s3.nom_court::text = 'Milieux humides'::text
AND s6.date = (SELECT MAX(date) FROM sites.r_sites_geom WHERE r_sites_geom.id_site = s0.id)
ORDER BY s0.id ASC NULLS FIRST;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_zoneshumides TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_zoneshumides TO grp_consult;
"""
comment = """
COMMENT ON COLUMN zones_humides.v_zoneshumides.site_code IS 'Identifiant de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.old_code IS 'Ancien identifiant de la zone humide pouvant se retrouver dans des données historiques.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.nom IS 'Nom de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.autre_nom IS 'Autre nom possible de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_site IS 'Auteur ayant caractérisé la zone humide pour la première fois.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_geom IS 'Auteur ayant définis la géometrie actuelle de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.auteur_last_maj IS 'Auteur le plus récent ayant défini les attributs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_site IS 'Date de la première description de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_geom IS 'Date de la géométrie.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.date_last_maj IS 'Date des attributs les plus récents.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_milieu IS 'Caractérisation du milieu.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.type_site IS '';
COMMENT ON COLUMN zones_humides.v_zoneshumides.typo_sdage IS 'Typologie sdage de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.mnemo_sdage IS 'Libellé mnémonique sdage de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_site IS 'Remarques générale concernant la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_fct_majeur IS 'Remarques sur les fonctions majeurs de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_interet_patri IS 'Remarques sur les intérêts patrimoniaux de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_bilan_menace IS 'Remarques globales sur les menaces qui concernent la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_orient_act IS 'Remarques sur les orientations et les actes de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_usage_process IS 'Remarques concernant les usages et les processus naturels de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.code_cb IS 'Liste des codes CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.lib_cb IS 'Liste des habitats CORINE Biotopes identifiés sur la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.activ_hum IS 'Liste des activités humaines identifiées sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''impacts'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.impact IS 'Liste des impacts identifiés et engendrés par les activités humaine sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''position''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."position" IS 'Liste des potionnements des différentes activités humaines sur la zone humide. Chaque élément de la liste est séparé par un '';'' et est lié à la colonne ''activ_hum'' et ''impact''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.rmq_activ_hum IS 'Remarques concernant activités humaines identifiées sur la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.connexion IS 'Connexion de la zone humide dans son environnement.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_orig IS 'Origine de l''eau submerssive.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_freq IS 'Fréquence de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.subm_etend IS 'Etendue de la submersion de la zone humide.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_bio IS 'Liste des fonctions biologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.fct_hydro IS 'Liste des fonctions hydrologiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.int_patri IS 'Liste des interêts patrimoniaux de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides."val_socioEco" IS 'Liste des valeurs socio-economiques de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_delim IS 'Liste des critères de délimitation de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.crit_def_esp IS 'Liste des critères de l''espace de fonctionnalité de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_reg IS 'Liste des entrées d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_perm IS 'Liste des permanances respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.entree_eau_topo IS 'Liste de la toponymie respectivement de chaque entrée d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_reg IS 'Liste des sorties d''eau du régime hydrique de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_perm IS 'Liste des permanances respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.sortie_eau_topo IS 'Liste de la toponymie respectivement de chaque sortie d''eau de la zone humide. Chaque élément de la liste est séparé par un '';''.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.id_origine IS 'Identifiant d''origine de la zone fournie par un partenaire exterieur.';
COMMENT ON COLUMN zones_humides.v_zoneshumides.geom IS 'Géometrie de la zone humide.';
"""
with con.begin() as cnx:
cnx.execute(text(v_zoneshumides))
cnx.execute(grant)
cnx.execute(comment)
v_rhomeosite = """
DROP VIEW IF EXISTS zones_humides.v_rhomeosite;
CREATE OR REPLACE VIEW zones_humides.v_rhomeosite
AS
with t1 as (
SELECT
v.site_code,
r.nom,
st_area(st_intersection(v.geom, r.geom)) area_intersect
FROM zones_humides.v_zoneshumides v
join ref_territoire.ref_biogeo r on st_intersects(v.geom, r.geom)
--group by 1,2
), t2 as (
select
site_code,
nom,
row_number() over (partition by site_code order by area_intersect desc) as ismax_ter
from t1
)
SELECT (v.site_code::text || ' - '::text) || v.nom::text AS "NAME",
split_part(v.auteur_geom, ' ('::text, 1) AS "REFERENT",
replace(split_part(v.auteur_geom, ' ('::text, 2), ')'::text, ''::text) AS "ORG",
split_part(v.typo_sdage, ' - '::text, 1) AS "TYPE",
CASE
WHEN t2.nom = 'alpin'::text THEN '1'::text
WHEN t2.nom = 'continental'::text THEN '2'::text
WHEN t2.nom = 'mediterraneen'::text THEN '4'::text
ELSE NULL::text
END AS "ODONATE",
v.geom
FROM zones_humides.v_zoneshumides v
join t2 on v.site_code = t2.site_code and t2.ismax_ter = 1
;
"""
grant = """
GRANT ALL ON TABLE zones_humides.v_rhomeosite TO grp_admin;
GRANT SELECT ON TABLE zones_humides.v_rhomeosite TO grp_consult;
"""
with con.begin() as cnx:
cnx.execute(text(v_rhomeosite))
cnx.execute(grant)
test = """
SELECT * FROM zones_humides.v_zoneshumides;
"""
data = gpd.pd.read_sql_query(
sql = text(test),
con = con)
data[~data.index.isin(data.drop_duplicates(subset='site_code',keep=False).index)]
data[data.duplicated(subset='site_code',keep=False)]
+187
View File
@@ -0,0 +1,187 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#Nom : : del_psduplicated.py
#Description : Suppessio, des géométries en doubon sous un nom différents et avec des erreurs d'intégration des données
#Copyright : 2022-07-20, CEN38
#Auteur : Colas Geier
#Version : 1.0
import geopandas as gpd
import pycen
from pycen import con,update_to_sql
df1 = gpd.read_postgis('SELECT * FROM ps.v_covered_ps ORDER BY 2',con,geom_col='geom_old')
df2 = gpd.read_postgis('SELECT * FROM ps.v_covered_ps ORDER BY 2',con,geom_col='geom_new')
# df.reset_index(inplace=True, drop=False)
df1.to_postgis('covered_ps_old',con,'ps','replace',False,geom_col='geom_old')
df2.to_postgis('covered_ps_new',con,'ps','replace',False,geom_col='geom_new')
df = df1.copy()
# ('38BDAU0907','38BIEV0032','38BIEV0033','38BDAU0905','38PCHA1088','38PCHA1089','38PCHA1002','38PCHA0908','38VERC3112','38PCHA0316','38VERC3171','38PCHA0325','38VERC2662','38PCHA0232','38PCHA0244','38VERC2732','38PCHA1086','38PCHA1087','38VERC3206','38PCHA0332','38PCHA0297','38VERC3013','38VERC2983','38PCHA0291','38VERC2961','38PCHA0286','38VERC3212','38PCHA0333','38PCHA0326','38VERC3175','38PCHA1005','38PCHA0018','38PCHA0474','38VERC3681','38PCHA0044','38PCHA1007','38PCHA0910','38PCHA1003','38PCHA0274','38VERC2902','38PCHA0032','38PCHA1006','38PCHA0121','38VERC1824','38VERC1743','38PCHA0111','38PCHA1004','38PCHA0928','38VERC1848','38PCHA0123','38PCHA0057','38PCHA1008','38PCHA0065','38PCHA1009','38BDAU0908','38VERC2008','38VERC2495','38BELL0154','38GRES0637','38VERC3451','38VERC0383','38VERC3222','38VERC3348','38GRES0629','38VERC2912','38CHAR0502','38CHAR0045','38VERC2058','38VERC1931','38MATH0010','38VERC1924','38CHAR0040','38GRES0006','38CHAR0900','38BELL0030','38VERC2163','38GRES0066','38VERC2100','38CHAR0049','38VERC2187','38GRES0077','38VERC2272','38VERC2807','38CHAR0079','38VERC2658','38CHAR0066','38CHAR0100','38VERC3008','38CHAR0903','38BELL0005','38CHAR0901','38CHAR0008','38VERC2414','38VERC0219','38VERC2514','38GRES0084','38VERC3076','38GRES0119','38VERC3311','38GRES0132','38VERC2718','38CHAR0072','38VERC3205','38CHAR0115','38VERC3108','38BELL0049','38VERC2377','38VERC0215','38VERC2387','38VERC0216','38VERC2431','38BELL0035','38VERC2408','38GRES0080','38GRES0686','38VERC3623','38CHAR0468','38VERC2384','38MATH0111','38VERC2649','38BELL0198','38VERC2661','38GRES0437','38VERC1748','38VERC2614','38GRES0472','38GRES0462','38VERC2446','38TRIE0215','38VERC2356','38VERC2329','38TRIE0211','38VERC2315','38TRIE0210','38TRIE0222','38VERC2405','38VERC2439','38TRIE0227','38TRIE0228','38VERC2443','38TRIE0229','38VERC2455','38CHAR0902','38TRIE0022','38GRES0141','38VERC3408','38VERC3159','38CHAR0113','38CHAR0001','38CHAR0899','38CHAR0905','38GRES0028','38CHAR0906','38CHAR0012','38CHAR0017','38CHAR0908','38GRES0136','38VERC3376','38VERC1668','38GRES0053','38GRES0127','38VERC3197','38VERC1549','38GRES0045','38GRES0030','38CHAR0907','38GRES1039','38GRES0031','38BIEV0004','38VERC3399','38CHAR0904','38GRES0025','38CHAR0029','38VERC1533','38CHAR0133','38VERC3354','38CHAR0031','38VERC1618','38VERC3369','38CHAR0135','38VERC3464','38GRES0143','38GRES0016','38GRES1038','38BELL0192','38VERC2556','38VERC2513','38CHAR0402','38BELL0164','38BELL0492','38MATH0024','38VERC2487','38VERC2646','38TRIE0250','38VERC3523','38TRIE0377','38BELL0489','38BELL0155','38BELL0491','38MCHA0009','38BELL0490','38BELL0162','38VERC1687','38CHAR0034','38VERC1721','38BELL0025','38BELL0016','38CHAR0909','38MATH0005','38VERC1756','38BELL0043','38VERC2641','38CHAR0027','38CHAR0910','38GRES0089','38VERC2601','38GRES0092','38VERC2629')
# ('38BIEV0032','38BDAU0907','38BDAU0905','38BIEV0033','38PCHA1089','38PCHA1088','38PCHA1002','38PCHA0908','38VERC3112','38PCHA0316','38VERC3171','38PCHA0325','38VERC2662','38PCHA0232','38VERC2732','38PCHA0244','38PCHA1086','38PCHA1087','38VERC3206','38PCHA0332','38VERC3013','38PCHA0297','38PCHA0291','38VERC2983','38VERC2961','38PCHA0286','38PCHA0333','38VERC3212','38PCHA0326','38VERC3175','38PCHA1005','38PCHA0018','38VERC3681','38PCHA0474','38PCHA1007','38PCHA0044','38PCHA0910','38PCHA1003','38VERC2902','38PCHA0274','38PCHA1006','38PCHA0032','38VERC1824','38PCHA0121','38PCHA0111','38VERC1743','38PCHA0928','38PCHA1004','38VERC1848','38PCHA0123','38PCHA0057','38PCHA1008','38PCHA1009','38PCHA0065','38BDAU0908','38VERC2008','38VERC2495','38BELL0154','38GRES0637','38VERC3451','38VERC0383','38VERC3222','38GRES0629','38VERC3348','38CHAR0502','38VERC2912','38VERC3623','38GRES0686','38CHAR0468','38VERC2384','38TRIE0215','38VERC2356','38VERC2329','38TRIE0211','38VERC2315','38TRIE0210','38VERC2405','38TRIE0222','38VERC2439','38TRIE0227','38VERC2443','38TRIE0228','38VERC2455','38TRIE0229','38VERC2487','38MATH0024','38VERC2646','38TRIE0250','38VERC3523','38TRIE0377')
# ('38BDAU0907','38BIEV0032','38BDAU0905','38BIEV0033','38PCHA1089','38PCHA1088','38PCHA1002','38PCHA0908','38PCHA0316','38VERC3112','38VERC3171','38PCHA0325','38PCHA0232','38VERC2662','38VERC2732','38PCHA0244','38PCHA1086','38PCHA1087','38VERC3206','38PCHA0332','38VERC3013','38PCHA0297','38PCHA0291','38VERC2983','38PCHA0286','38VERC2961','38PCHA0333','38VERC3212','38PCHA0326','38VERC3175','38PCHA0018','38PCHA1005','38PCHA0474','38VERC3681','38PCHA0044','38PCHA1007','38PCHA0910','38PCHA1003','38VERC2902','38PCHA0274','38PCHA0032','38PCHA1006','38VERC1824','38PCHA0121','38VERC1743','38PCHA0111','38PCHA0928','38PCHA1004','38PCHA0123','38VERC1848','38PCHA0057','38PCHA1008','38PCHA0065','38PCHA1009')
# ('38BDAU0907','38BIEV0032','38BDAU0905','38BIEV0033','38PCHA1088','38PCHA1089','38PCHA0316','38VERC3112','38PCHA0325','38VERC3171','38PCHA0232','38VERC2662','38PCHA0244','38VERC2732','38PCHA1087','38PCHA1086','38VERC3206','38PCHA0332','38VERC3013','38PCHA0297','38PCHA0291','38VERC2983','38PCHA0286','38VERC2961','38PCHA0333','38VERC3212','38VERC3175','38PCHA0326','38PCHA0018','38PCHA1005','38VERC3681','38PCHA0474','38PCHA0044','38PCHA1007','38PCHA0274','38VERC2902','38PCHA1006','38PCHA0032','38VERC1824','38PCHA0121','38VERC1743','38PCHA0111','38VERC1848','38PCHA0123','38PCHA0057','38PCHA1008','38PCHA0065','38PCHA1009')
# ('38BDAU0907','38BIEV0032','38BDAU0905','38BIEV0033','38PCHA1089','38PCHA1088','38PCHA0316','38VERC3112','38PCHA0325','38VERC3171','38PCHA0232','38VERC2662','38VERC2732','38PCHA0244','38PCHA1086','38PCHA1087','38VERC3206','38PCHA0332','38VERC3013','38PCHA0297','38VERC2983','38PCHA0291','38VERC2961','38PCHA0286','38PCHA0333','38VERC3212','38VERC3175','38PCHA0326','38PCHA0018','38PCHA1005','38PCHA0274','38VERC2902','38PCHA0121','38VERC1824','38PCHA0111','38VERC1743','38VERC1848','38PCHA0123','38PCHA1008','38PCHA0057','38PCHA1009','38PCHA0065')
# ('38BIEV0032','38BDAU0907','38BIEV0033','38BDAU0905','38PCHA1088','38PCHA1089','38PCHA1087','38PCHA1086')
v_ps = gpd.read_postgis(
"SELECT * FROM ps.v_pelouseseches WHERE site_code in ('%s') ORDER BY source,geom"%"','".join(df.id_site.tolist())
,pycen.con)
v_ps.set_index(['site_code','district_nat'],inplace=True)
v_ps.dropna(axis=1,how='all', inplace=True)
v_ps.fillna('NA', inplace=True)
for col in v_ps.columns[v_ps.columns.str.startswith('auteur')]:
tmp = v_ps[col].str.split(';')
for x in tmp: x.sort()
v_ps[col] = [';'.join(x) for x in tmp]
vp_clean = v_ps.drop_duplicates()
v_ps.loc[~v_ps.index.isin(vp_clean.index)]
v_ps.loc[~v_ps.index.isin(vp_clean.index)].droplevel(-1).index.tolist()
# ('38CHAR0915','38CHAR0919','38CHAR0922','38CHAR0936','38CHAR0938','38CHAR0940','38CHAR1195','38CHAR1197','38CHAR1203','38CHAR1220','38CHAR1221','38CHAR1222','38CHAR1223','38CHAR1224','38CHAR1225','38CHAR1226','38CHAR1227','38CHAR1228','38CHAR1229','38CHAR1230','38CHAR1231','38CHAR1232','38CHAR1233','38CHAR1234','38CHAR1235','38CHAR1236','38CHAR1237','38CHAR1238','38CHAR1239','38CHAR1240','38CHAR1241','38CHAR1242','38CHAR1243','38CHAR1244','38CHAR1245','38GRES1073','38GRES1074','38GRES1075','38MCHA0049','38PCHA1083','38PCHA1208','38PCHA1210','38PCHA1215','38PCHA1221','38TRIE1173','38TRIE2416','38TRIE2481','38TRIE2548','38TRIE2563','38TRIE2590','38TRIE2592','38TRIE2594','38TRIE2595','38TRIE2596','38TRIE2597','38TRIE2598','38TRIE2599','38TRIE2602','38TRIE2604','38TRIE2605','38TRIE2607','38TRIE2608','38TRIE2610','38TRIE2611','38TRIE2614','38TRIE2615','38TRIE2616','38TRIE2618','38TRIE2619','38TRIE2620','38TRIE2621','38TRIE2622','38TRIE2623','38TRIE2624','38TRIE2625','38TRIE2626','38TRIE2627','38TRIE2628','38TRIE2629','38TRIE2631','38TRIE2632','38TRIE2633','38TRIE2634','38TRIE2635','38TRIE2636','38TRIE2637','38TRIE2638','38TRIE2639','38TRIE2640','38TRIE2641','38TRIE2644','38TRIE2645','38TRIE2646','38TRIE2647','38TRIE2648','38TRIE2650','38TRIE2651','38TRIE2652','38TRIE2653','38TRIE2654','38TRIE2656','38TRIE2657','38TRIE2658','38TRIE2659','38TRIE2662','38TRIE2663','38TRIE2664','38TRIE2665','38TRIE2666','38TRIE2667','38TRIE2668','38TRIE2669','38TRIE2670','38TRIE2671','38TRIE2672','38TRIE2674','38TRIE2675','38TRIE2676','38TRIE2677','38TRIE2678','38TRIE2679','38TRIE2680','38TRIE2682','38TRIE2683','38TRIE2688','38TRIE2689','38TRIE2690','38TRIE2693','38TRIE2695','38TRIE2696','38TRIE2697','38TRIE2698','38TRIE2699','38TRIE2700','38TRIE2701','38TRIE2702','38TRIE2703','38TRIE2704','38TRIE2705','38TRIE2707','38TRIE2708','38TRIE2710','38TRIE2712','38TRIE2713','38TRIE2714','38TRIE2715','38TRIE2720','38TRIE2721','38TRIE2722','38TRIE2723','38TRIE2724','38TRIE2727','38TRIE2731','38TRIE2735','38TRIE2736','38TRIE2739','38TRIE2741','38TRIE2743','38TRIE2744','38TRIE2749','38TRIE2750','38TRIE2758','38TRIE2760','38TRIE2762','38TRIE2764','38TRIE2765','38TRIE2766','38TRIE2767','38TRIE2768','38TRIE2769','38TRIE2771','38TRIE2776','38TRIE2780','38TRIE2788','38VERC3691','38VERC3692','38VERC3698','38VERC3701','38VERC3903','38VERC3904','38VERC3906','38VERC3921','38VERC3924','38VERC3936','38VERC3937','38VERC3940','38VERC3941','38VERC3943','38VERC3945','38VERC3946','38VERC3948','38VERC3949','38VERC3950','38VERC3953','38VERC4017','38VERC4104','38VERC4123','38VERC4124','38VERC4180','38VERC4187','38VERC4188','38VERC4197','38VERC4205','38VERC4218','38VERC4290','38VERC4294','38VERC4364','38VERC4392','38VERC4396','38VERC4405','38VERC4406','38VERC4407','38VERC4408','38VERC4409','38VERC4446','38VERC4447','38VERC4448','38VERC4453','38VERC4462','38VERC4464','38VERC4469','38VERC4484','38VERC4485','38VERC4492','38VERC4498','38VERC4512','38VERC4526','38VERC4527','38VERC4530','38VERC4544','38VERC4558','38VERC4576','38VERC4577','38VERC4578','38VERC4579','38VERC4585','38VERC4588','38VERC4590','38VERC4627','38VERC4628','38VERC4636','38VERC4638','38VERC4639','38VERC4640','38VERC4643','38VERC4649','38VERC4650','38VERC4654','38VERC4655','38VERC4656','38VERC4657','38VERC4658','38VERC4659','38VERC4660','38VERC4661','38VERC4662','38VERC4663','38VERC4664','38VERC4665','38VERC4666','38VERC4667','38VERC4668','38VERC4669','38VERC4670','38VERC4671','38VERC4672','38VERC4673','38VERC4674','38VERC4675','38VERC4676','38VERC4678','38VERC4679','38VERC4680','38VERC4681','38VERC4685','38VERC4686','38VERC4692')
'38GRES1029','38GRES1031','38VERC0811','38VERC0861','38VERC1045','38VERC1427','38VERC1433','38VERC1453','38VERC1456','38VERC1465','38VERC1489','38VERC1494','38VERC3704','38VERC3708','38VERC4129','38VERC4134'
'38BIEV0032','38BDAU0907','38BDAU0905','38BIEV0033','38PCHA1089','38PCHA1088','38PCHA1002','38PCHA0908','38VERC3112','38PCHA0316','38PCHA0906','38PCHA1001','38PCHA0325','38VERC3171','38PCHA0232','38VERC2662','38VERC2732','38PCHA0244','38PCHA1086','38PCHA1087','38PCHA0332','38VERC3206','38VERC3013','38PCHA0297','38VERC2983','38PCHA0291','38VERC2961','38PCHA0286','38PCHA0333','38VERC3212','38VERC3175','38PCHA0326','38PCHA0018','38PCHA1005','38PCHA0474','38VERC3681','38PCHA0044','38PCHA1007','38PCHA0910','38PCHA1003','38PCHA0274','38VERC2902','38PCHA1006','38PCHA0032','38PCHA0121','38VERC1824','38PCHA0111','38VERC1743','38PCHA1004','38PCHA0928','38PCHA0123','38VERC1848','38PCHA1008','38PCHA0057','38PCHA0065','38PCHA1009','38VERC2008','38BDAU0908','38BELL0154','38VERC2495','38GRES0637','38VERC3451','38VERC0383','38VERC3222','38VERC3348','38GRES0629','38VERC2912','38CHAR0502','38CHAR0045','38VERC2058','38VERC1931','38MATH0010','38CHAR0040','38VERC1924','38GRES0006','38CHAR0900','38VERC2163','38BELL0030','38VERC2100','38GRES0066','38VERC2187','38CHAR0049','38VERC2272','38GRES0077','38VERC2807','38CHAR0079','38VERC2658','38CHAR0066','38CHAR0100','38VERC3008','38BELL0005','38CHAR0903','38CHAR0008','38CHAR0901','38VERC0219','38VERC2414','38VERC2514','38GRES0084','38VERC3076','38GRES0119','38GRES0132','38VERC3311','38CHAR0072','38VERC2718','38CHAR0115','38VERC3205','38VERC3108','38BELL0049','38VERC0215','38VERC2377','38VERC2387','38VERC0216','38BELL0035','38VERC2431','38GRES0080','38VERC2408','38GRES0686','38VERC3623','38VERC2384','38CHAR0468','38MATH0111','38VERC2649','38VERC2661','38BELL0198','38VERC1748','38GRES0437','38GRES0472','38VERC2614','38GRES0462','38VERC2446','38TRIE0215','38VERC2356','38TRIE0211','38VERC2329','38VERC2315','38TRIE0210','38TRIE0222','38VERC2405','38VERC2439','38TRIE0227','38VERC2443','38TRIE0228','38VERC2455','38TRIE0229','38TRIE0022','38CHAR0902','38GRES0141','38VERC3408','38CHAR0113','38VERC3159','38CHAR0001','38CHAR0899','38CHAR0905','38GRES0028','38CHAR0012','38CHAR0906','38CHAR0017','38CHAR0908','38GRES0214','38VERC2141','38VERC3072','38VERC0290','38VERC3376','38GRES0136','38GRES0053','38VERC1668','38GRES0127','38VERC3197','38GRES0183','38GRES1040','38VERC1549','38GRES0045','38GRES0030','38CHAR0907','38GRES1039','38GRES0031','38VERC3399','38BIEV0004','38CHAR0904','38GRES0025','38VERC1533','38CHAR0029','38CHAR0133','38VERC3354','38CHAR0031','38VERC1618','38MATH0083','38VERC1830','38GRES0203','38VERC1858','38MATH0082','38VERC1820','38CHAR0176','38GRES1041','38GRES0251','38VERC2935','38VERC0254','38VERC1926','38VERC3369','38CHAR0135','38VERC3464','38GRES0143','38GRES1038','38GRES0016','38VERC3139','38GRES0278','38VERC2556','38BELL0192','38VERC2513','38CHAR0402','38BELL0164','38BELL0492','38MATH0024','38VERC2487','38TRIE0250','38VERC2646','38TRIE0377','38VERC3523','38BELL0489','38BELL0155','38BELL0491','38MCHA0009','38BELL0162','38BELL0490','38CHAR0034','38VERC1687','38VERC1721','38BELL0025','38BELL0016','38CHAR0909','38MATH0005','38VERC1756','38VERC2641','38BELL0043','38CHAR0027','38CHAR0910','38VERC2601','38GRES0089','38GRES0092','38VERC2629'
s = gpd.pd.Series([
'CHA01','CHA01','CHA17','CHA17','STAP01','STAP01','CHE30','CHE30','STBO03','STBO03','STAN26','STAN26','STAN36','STAN36','STAN34','STAN34','STBO05','STBO05','STBO06','STBO06','STLA039','STLA039','STAN22','STAN22','MON50','MON50','MON56','MON56','MON55','MON55','STLA063','STLA063','STLA070','STLA070',
])
sql = '''
SELECT
v1.site_code,
v1.geom,
v1."source",
v1.rmq_usage_process,
CASE WHEN v1.id_origine IS NULL THEN v2.id_origine ELSE v1.id_origine END id_origine
--v1.id_origine --, v2.geom geom_new
FROM ps.v_pelouseseches v1, ps.v_pelouseseches v2
WHERE v1.geom = v2.geom
AND v1.site_code <> v2.site_code
ORDER BY 3,2;
'''
upd = gpd.read_postgis(sql,con)
upd.drop_duplicates(inplace=True)
upd.rename(columns={'site_code':'id_site'},inplace=True)
upd.loc[upd.source=='PS_CHAMBARAN_CEN38_2013','rmq_usage_process'] = \
upd.loc[upd.source=='PS_CHAMBARAN_CEN38_2013','rmq_usage_process'].replace(["\|",'\/','fasciès'],[" x "," x ",'faciès'],regex=True)
upd = upd[['id_site','rmq_usage_process']]
update_to_sql(upd,con,'r_sites_geom','sites','id_site')
'38MCHA0009','38BELL0491','38BELL0164','38BELL0492','38BELL0154','38VERC2495','38GRES1041','38CHAR0176','38VERC2614','38GRES0472','38VERC2649','38MATH0111','38BELL0198','38VERC2661','38GRES0437','38VERC1748','38MATH0082','38VERC1820','38VERC1830','38MATH0083','38PCHA1087','38PCHA1088','38PCHA1086','38PCHA1089','38VERC1858','38GRES0203','38BDAU0908','38VERC2008','38VERC1926','38VERC0254','38GRES0462','38VERC2446','38VERC2513','38CHAR0402','38BELL0192','38VERC2556','38VERC2384','38CHAR0468','38CHAR0502','38VERC2912','38GRES0214','38VERC2141','38VERC2935','38GRES0251','38VERC3222','38VERC0383','38VERC3072','38VERC0290','38GRES0637','38VERC3451','38VERC3348','38GRES0629','38GRES0278','38VERC3139','38VERC3623','38GRES0686','38BELL0489','38BELL0155','38BDAU0905','38BDAU0907','38BIEV0032','38BIEV0033','38GRES0183','38GRES1040','38BELL0490','38BELL0162','38VERC2629','38GRES0092','38VERC2058','38CHAR0045','38CHAR0115','38VERC3205','38CHAR0901','38CHAR0008','38VERC2431','38BELL0035','38GRES0080','38VERC2408','38VERC0216','38VERC2387','38VERC0215','38VERC2377','38BELL0043','38VERC2641','38CHAR0072','38VERC2718','38CHAR0066','38VERC2658','38CHAR0100','38VERC3008','38BELL0049','38VERC3108','38BELL0005','38CHAR0903','38GRES0119','38VERC3076','38GRES0084','38VERC2514','38CHAR0909','38BELL0016','38VERC3311','38GRES0132','38VERC1687','38CHAR0034','38VERC1756','38MATH0005','38VERC2807','38CHAR0079','38VERC2414','38VERC0219','38BELL0025','38VERC1721','38CHAR0910','38CHAR0027','38GRES0077','38VERC2272','38VERC2187','38CHAR0049','38GRES0066','38VERC2100','38VERC2163','38BELL0030','38GRES0089','38VERC2601','38GRES0006','38CHAR0900','38CHAR0040','38VERC1924','38MATH0010','38VERC1931','38VERC3112','38PCHA0316','38VERC3171','38PCHA0325','38PCHA0906','38PCHA1001','38VERC2732','38PCHA0244','38TRIE0250','38VERC2646','38VERC3399','38BIEV0004','38CHAR0904','38GRES0025','38CHAR0031','38VERC1618','38CHAR0908','38CHAR0017','38GRES0028','38CHAR0905','38TRIE0022','38CHAR0902','38GRES0141','38VERC3408','38CHAR0029','38VERC1533','38VERC3354','38CHAR0133','38GRES0143','38VERC3464','38GRES1038','38GRES0016','38VERC3369','38CHAR0135','38VERC1668','38GRES0053','38VERC3376','38GRES0136','38CHAR0001','38CHAR0899','38CHAR0113','38VERC3159','38VERC1549','38GRES0045','38GRES0127','38VERC3197','38CHAR0907','38GRES0030','38GRES1039','38GRES0031','38CHAR0012','38CHAR0906','38VERC1824','38PCHA0121','38PCHA0928','38PCHA1004','38VERC1848','38PCHA0123','38PCHA0111','38VERC1743','38VERC2487','38MATH0024','38VERC2315','38TRIE0210','38TRIE0211','38VERC2329','38TRIE0215','38VERC2356','38TRIE0222','38VERC2405','38TRIE0377','38VERC3523','38VERC2439','38TRIE0227','38TRIE0229','38VERC2455','38TRIE0228','38VERC2443','38VERC2902','38PCHA0274','38VERC3013','38PCHA0297','38PCHA0286','38VERC2961','38VERC2983','38PCHA0291','38VERC2662','38PCHA0232','38VERC3206','38PCHA0332','38VERC3212','38PCHA0333','38PCHA0326','38VERC3175','38PCHA1003','38PCHA0910','38PCHA1007','38PCHA0044','38VERC3681','38PCHA0474','38PCHA1006','38PCHA0032','38PCHA0018','38PCHA1005','38PCHA0057','38PCHA1008','38PCHA1009','38PCHA0065','38PCHA0908','38PCHA1002'
drop_site = [
'38VERC2141','38VERC3072','38GRES1040','38VERC1830','38VERC1858',''
]
'38VERC2141','38VERC3072','38GRES1040','38VERC1830','38VERC1858','38VERC1820','38GRES1041','38VERC2935','38VERC1926','38VERC3139'
('38VERC2058','38VERC1931','38VERC1924','38CHAR0900','38VERC2163','38VERC2100','38VERC2187','38VERC2272','38VERC2807','38VERC2658','38VERC3008','38CHAR0903','38CHAR0901','38VERC2414','38VERC2514','38VERC3076','38VERC3311','38VERC2718','38VERC3205','38VERC3108','38VERC2377','38VERC2387','38VERC2431','38VERC2408','38CHAR0902','38VERC3408','38VERC3159','38CHAR0899','38CHAR0905','38CHAR0906','38CHAR0908','38VERC3376','38VERC1668','38VERC3197','38VERC1549','38CHAR0907','38GRES1039','38VERC3399','38CHAR0904','38VERC1533','38VERC3354','38VERC1618','38VERC3369','38VERC3464','38GRES1038','38VERC1687','38VERC1721','38CHAR0909','38VERC1756','38VERC2641','38CHAR0910','38VERC2601','38VERC2629')
('38VERC2649','38VERC2661','38VERC1748','38VERC2614','38VERC2446','38VERC2556','38VERC2513','38BELL0492','38BELL0489','38BELL0491','38BELL0490')
'38VERC2495','38VERC2008'
('38VERC2356','38VERC2329','38VERC2315','38VERC2405','38VERC2439','38VERC2443','38VERC2455','38VERC2487','38VERC2646','38VERC3523')
('38VERC3451','38VERC3222','38VERC3348','38VERC2912','38VERC3623','38VERC2384')
'38VERC3681','38PCHA1007','38PCHA1006'
('38VERC3112','38VERC3171','38VERC2662','38VERC2732','38VERC3206','38VERC3013','38VERC2983','38VERC2961','38VERC3212','38VERC3175','38PCHA1005','38VERC2902','38VERC1824','38VERC1743','38VERC1848','38PCHA1008','38PCHA1009')
('38PCHA1087','38PCHA1088')
v_ps[(v_ps.source=='PS_CHAMBARAN_CEN38_2013')& ~(v_ps.auteur_site.isin([
'COSQUER Mélanie (CEN Isère)'
]))].reset_index().site_code.tolist()
path='/home/colas/Documents/9_PROJETS/2_PS/CBNA/Trieves_Vercors/'
file = 'ps_aInserer_for INS1.gpkg'
df = gpd.read_file(path+file)
df.rename_geometry('geom', inplace=True)
df['date'] = '2014-01-01'
df['date'] = gpd.pd.to_datetime(df['date'])
df['structure'] = 'CBNA'
# df.rename(columns={"obs":'auteur'}, inplace=True)
df['auteur'] = 'CBNA'
df.loc[df.statut=="Habitat d'intérêt communautaire",'statut'] = \
"Communautaire"
df.loc[df.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
df.loc[df.statut=="Habitat d'intérêt communautaire, retenu prioritaire",'statut'] = \
"Prioritaire"
df.loc[
df.statut=="""Habitat d'intérêt communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[
df.statut=="""Habitat d'intérêt communautaire retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[
df.statut=="""Habitat communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[df.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
df.to_file(path+file,driver='GPKG')
'38TRIE1043', '38TRIE1058', '38VERC1189', '38VERC1190','38VERC1191', '38VERC1196', '38VERC1199', '38VERC1200','38VERC1201', '38VERC1202', '38VERC1203', '38VERC1204','38VERC1205', '38VERC1209', '38VERC1210', '38VERC1211','38VERC1212', '38VERC1213', '38VERC1214', '38VERC1216','38VERC1218', '38VERC1227', '38VERC3738', '38VERC3952','38VERC4550', '38VERC4551', '38VERC4552', '38VERC4553','38VERC4554', '38VERC4555', '38VERC4556', '38VERC4557','38VERC4559', '38VERC4560', '38VERC4563', '38VERC4564','38VERC4565', '38VERC4566', '38VERC4568', '38VERC4569','38VERC4570', '38VERC4571', '38VERC4572', '38VERC4573','38VERC4574'
df_maj.loc[df_maj.id_site.isin(['38TRIE0788']),'code_hab2'] = '41.13 (43)'
df = gpd.read_postgis('SELECT * FROM pelouse_seche."PB_codehab_nonPresent_dans_corineBiotope"',pycen.con_bdcen)
df = df.replace(['38.81','31.8 t'],['31.81','31.8122'],regex=True)
df.date = gpd.pd.to_datetime(df.date)
df = df[~df.id_site.isin(lst_error2)]
'38PCHA0291','38PCHA0333','38PCHA0326','38MATH0083','38PCHA0910','38GRES0025','38CHAR0029','38PCHA0111','38GRES0030','38CHAR0012','38GRES0028','38CHAR0027','38GRES0053','38MATH0005','38BELL0030','38BELL0025','38CHAR0049','38MATH0010','38CHAR0079','38GRES0119','38GRES0127','38BELL0049','38BIEV0004','38GRES0006','38CHAR0176','38GRES0031','38GRES0183','38VERC0254','38GRES0214','38VERC0290','38GRES0278','38MATH0082','38GRES0203','38GRES0251','38CHAR0031','38VERC0383','38GRES0136','38GRES0084','38CHAR0135','38CHAR0133','38GRES0045','38GRES0141','38BELL0192','38BDAU0847','38CHAR0402'
update_to_sql(
df[['id_site','remarques']].rename(columns={'remarques':'rmq_interet_patri'}),
con,'r_sites_geom','sites','id_site'
)
df = gpd.read_postgis('SELECT * FROM pelouse_seche."PB_codehabCBNA_nonPresent_dans_corineBiotope"',pycen.con_bdcen)
df = df.replace(['43.171','43.13','31.4B','37.831','52 à 54'],['43','43','31.4','31.831','54'],regex=True)
'38CHAR1238','38CHAR1091','38TRIE2732','38OISA0273','38OISA0272','38GROU0015','38OISA0274','38VERC3785','38TRIE1399','38TRIE1402','38TRIE2443','38TRIE2444','38VERC1467','38VERC1382','38VERC1059','38TRIE0942','38TRIE0788','38OISA0190','38OISA0188','38OISA0189','38VERC0918','38TRIE1010','38TRIE0943','38BVIS0042','38VERC1253','38VERC1322','38VERC1323','38VERC3787'
gpd.read_postgis("SELECT * FROM sites.r_sites_geom WHERE id_site IN ('%s')"%"','".join(DF.id_site),pycen.con)
'38OISA0245','38TRIE1045','38TRIE1165','38TRIE2421','38VERC1401','38VERC1447','38VERC3718','38VERC3766','38VERC4003'
'38VERC4697','38VERC4698','38VERC4699','38VERC4700','38VERC4701','38VERC4704','38VERC4705','38VERC4706','38VERC4707','38VERC4708','38VERC4709','38VERC4710','38VERC4711','38VERC4712','38VERC4713','38VERC4714','38VERC4715','38VERC4716','38VERC4717','38VERC4718','38VERC4719','38VERC4720','38VERC4721','38VERC4722','38VERC4723','38VERC4724','38VERC4726','38VERC4727','38VERC4729','38VERC4730','38VERC4731','38VERC4732','38VERC4733','38VERC4734','38VERC4735','38VERC4736','38VERC4737','38VERC4738','38VERC4739','38VERC4741','38VERC4743','38VERC4746','38VERC4747','38VERC4748'
cvr = gpd.read_postgis("SELECT * FROM ps.v_pelouseseches WHERE site_code IN ('38VERC4740','38VERC4725','38VERC1271','38VERC4739')",pycen.con)
df = gpd.read_postgis("SELECT * FROM ps.v_pelouseseches WHERE site_code IN ('38VERC1249','38VERC1251','38VERC1272')",pycen.con)
tt = gpd.overlay(df,cvr.unary_union,how='difference')
# tt = df.copy()
tt = pycen.tools.Polygons_to_MultiPolygon(tt)
tt.drop(columns=['auteur_geom', 'auteur_attrs'],inplace=True)
tt.drop(columns=['date_geom', 'date_attrs'],inplace=True)
tt.rename(columns={'auteur_site':'auteur'},inplace=True)
tt.rename(columns={'date_site':'date'},inplace=True)
tt.columns = tt.columns.str.replace('cb_hab','code_hab',regex=True)
tt.rename(columns={'site_code':'id_site'},inplace=True)
tt[['auteur','structure']] = tt.auteur.str.split('(',expand=True).sort_index()
tt.auteur = tt.auteur.str.strip()
tt.structure = tt.structure.str.strip().str.replace('\)','',regex=True)
# tt.auteur = 'GRANGE Benjamin'
# tt['structure'] = 'CEN Isère'
'38VERC4697','38VERC4698','38VERC4699','38VERC4700','38VERC4701','38VERC4704','38VERC4705','38VERC4706','38VERC4707','38VERC4708','38VERC4709','38VERC4710','38VERC4711','38VERC4712','38VERC4713','38VERC4714','38VERC4715','38VERC4716','38VERC4717','38VERC4718','38VERC4719','38VERC4720','38VERC4721','38VERC4722','38VERC4723','38VERC4724','38VERC4726','38VERC4727','38VERC4729','38VERC4730','38VERC4731','38VERC4732','38VERC4733','38VERC4734','38VERC4735','38VERC4736','38VERC4737','38VERC4738','38VERC4739','38VERC4741','38VERC4743','38VERC4746','38VERC4747','38VERC4748'
'38VERC4702','38VERC4703','38VERC4725','38VERC4728','38VERC4740','38VERC4742','38VERC4744','38VERC4745'
'38BVIS0047','38VERC4082','38VERC4083','38VERC0618','38VERC1266','38VERC1267','38VERC1232','38VERC1240','38VERC4158','38VERC4158','38VERC4068','38VERC4086','38VERC4083'
'38BVIS0049', '38VERC1231', '38VERC1234', '38VERC1237','38VERC1241', '38VERC1246', '38VERC1247', '38VERC1248','38VERC1250', '38VERC1255', '38VERC1256', '38VERC1257','38VERC1261', '38VERC1262', '38VERC1263', '38VERC1265','38VERC1268', '38VERC1269', '38VERC1271', '38VERC1306','38VERC1322', '38VERC4051', '38VERC4052', '38VERC4056','38VERC4057', '38VERC4084'
+67
View File
@@ -0,0 +1,67 @@
from pycen import ps,con_bdcen
import geopandas as gpd
# Liste des habitats souhaités
list_habs = ['35.21','35.23','34.12','64.11','64.12']
habs = '|'.join(list_habs)
# v_pelouseseches
dfps = ps.v_pelouseseches()
cb_col = dfps.columns[dfps.columns.str.startswith('cb_hab')]
cdate = dfps.columns[dfps.columns.str.contains('date')]
for c in cdate:
dfps[c] = gpd.pd.to_datetime(dfps[c])
dfps['date'] = dfps[cdate].max(axis=1)
dfps['auteur'] = None
for c in cdate:
typ = c.removeprefix('date')
dfps.loc[dfps[c].eq(dfps.date),'auteur'] = dfps[dfps[c].eq(dfps.date)]['auteur'+typ]
dfps.drop(
columns=[*cdate,*'auteur' + cdate.str.removeprefix('date')],
inplace=True
)
df = gpd.GeoDataFrame()
for c in cb_col:
res = dfps[dfps[c].str.contains(habs,na=False)].copy()
df = gpd.pd.concat([df,res])
df.drop_duplicates(inplace=True)
print('Extract %s unités parcellaires ...'%df.shape[0])
# PB_codehab_nonPresent_dans_corineBiotope
sql = 'SELECT * FROM pelouse_seche."PB_codehab_nonPresent_dans_corineBiotope"'
dfpb = gpd.read_postgis(sql,con_bdcen)
dfps['date'] = gpd.pd.to_datetime(dfps['date'])
dfpb.rename(columns={
'id_site' : 'site_code',
'pratiques':'pratique',
'niv_embrous':'embrouss',
'recouvmnt':'recouvrement',
'remarques':'rmq_site',
'code_hab1':'cb_hab1',
'code_hab2':'cb_hab2',
'code_hab3':'cb_hab3',
'code_hab4':'cb_hab4',
'code_hab5':'cb_hab5',
}, inplace=True)
samecol = dfpb.columns[dfpb.columns.isin(dfps.columns)]
diffcol = dfpb.columns[~dfpb.columns.isin(dfps.columns)]
dfpb = dfpb[samecol]
cb_colpb = dfpb.columns[dfpb.columns.str.startswith('cb_hab')]
list_habspb = ['PS sur sable','Friche sableuse']
habspb = '|'.join(list_habspb)
for c in cb_colpb:
res = dfpb[dfpb[c].str.contains(habspb,na=False)].copy()
df = gpd.pd.concat([df,res])
df.drop_duplicates(inplace=True)
df['date'] = gpd.pd.to_datetime(df['date']).astype(str)
# df['date'] = gpd.pd.to_datetime(df['date'], unit='D')
print('Extract %s unités parcellaires ...'%df.shape[0])
df.to_file('/home/colas/Documents/9_PROJETS/2_PS/EXPORT/PNA_pelouse_sableuse.gpkg',driver='GPKG')
+32
View File
@@ -0,0 +1,32 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from pycen import con
# import pycen
drop = '''
DROP TRIGGER IF EXISTS trigger_end_zh ON gn_pr_zh.t_zh;
DROP FUNCTION IF EXISTS zones_humides.end_zh();
'''
s2 = '''CREATE OR REPLACE FUNCTION zones_humides.end_zh()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
IF (TG_OP = 'DELETE') then
UPDATE sites.sites
SET date_fin = current_timestamp
WHERE id = OLD.code;
END IF;
RETURN NULL;
END;
$function$
;'''
s1 = '''CREATE TRIGGER trigger_end_zh BEFORE
DELETE ON
gn_pr_zh.t_zh FOR EACH ROW EXECUTE FUNCTION zones_humides.end_zh()'''
with con.begin() as cnx:
cnx.execute(drop)
cnx.execute(s2)
cnx.execute(s1)
+36
View File
@@ -0,0 +1,36 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-.
from pycen import con
# import pycen
drop = '''
DROP TRIGGER IF EXISTS trigger_insert_new_zh ON gn_pr_zh.t_zh;
DROP FUNCTION IF EXISTS zones_humides.insert_new_zh();
'''
s2 = '''CREATE OR REPLACE FUNCTION zones_humides.insert_new_zh()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT into sites.sites (id,nom,date_deb,id_typo_sdage,remarques)
VALUES (new.code,new.main_name,new.create_date,(SELECT cd_nomenclature FROM gn_pr_zh.t_nomenclatures WHERE id = new.id_sdage),NULL);
INSERT into sites.r_sites_geom (id_site,geom,date,id_lot,id_origine)
VALUES (new.code,ST_TRANSFORM(new.geom,2154),new.create_date,NULL,new.zh_uuid::text);
RETURN NULL;
END;
$function$
;'''
s1 = '''CREATE TRIGGER trigger_insert_new_zh
AFTER INSERT OR UPDATE
ON gn_pr_zh.t_zh
FOR EACH ROW
EXECUTE FUNCTION zones_humides.insert_new_zh();
'''
with con.begin() as cnx:
cnx.execute(drop)
cnx.execute(s2)
cnx.execute(s1)
+163
View File
@@ -0,0 +1,163 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#Nom : : recup_ps.py
#Description :
#Copyright : 2021, CEN38
#Auteur : Colas Geier
#Version : 1.0
# from _typeshed import IdentityFunction
import pandas as pd
import geopandas as gpd
from sqlalchemy.engine import URL
from sqlalchemy import create_engine
import pycen
# Parametres bdd IN
from pycen import con_bdcen as con
dic = {
'Ssp':'IDFINAL',
'cod_cb':'code_cb',
'ccorineb':'code_cb',
'id_orig':'idorig',
'pourcentag':'part',
'carte_cb':'type',
'lib_cb':'libelle',
'id':'idorig',
'hectare':'hectares',
'nbre_hc':'hectares',
'observat':'obs',
'surf_m2':'surface',
'statut_car':'statutcart',
}
# table = '"PS_CHAMBARAN_CEN38_2013"'
path = '/home/colas/Documents/9_PROJETS/2_PS/CBNA/'
fV = path + 'PNR_Vercors_SHP/PNRV_data_04_2012.dbf'
fgV = path + 'PNR_Vercors_SHP/PNRV_poly_10_2008_L93_region.shp'
nV = 'cr_VERCORS_habitats_CBNA_1999-2007'
fC = path + 'PNR_Chartreuse_SHP/Chartreuse_2012_data.dbf'
fgC = path + 'PNR_Chartreuse_SHP/Chartreuse_2012_poly_region.shp'
nC = 'cr_CHARTREUSE_habitats_CBNA_2000-2012'
fT = path + 'Trieves_Vercors/TRIEVES_DATA.dbf'
fgT = path + 'Trieves_Vercors/TRIEVES_VERCORS.shp'
nT = 'cr_TRIEVES+VERCORS_habitats_CBNA'
fE = path + 'PNE/DELPHINE_DATA.dbf'
fgE = path + 'PNE/DELPHINE_POLY_L93.shp'
nE = 'cr_ECRIN_habitats_CBNA'
fileG = fgV
file = fV
name = nV
gdf = gpd.read_file(fileG)
gdf = pycen.tools.dropZ(gdf,geom_col='geometry')
dbf = gpd.read_file(file)
dbf.rename(columns=dic,inplace=True)
gdf.rename(columns=dic,inplace=True)
if gdf.columns[0] != 'IDFINAL':
gdf.rename(columns={gdf.columns[0]:'IDFINAL'},inplace=True)
# if dbf.columns[0] != 'IDFINAL':
# dbf.rename(columns={dbf.columns[0]:'IDFINAL'},inplace=True)
dbf.sort_values('IDFINAL', inplace=True)
gdf.sort_values('IDFINAL', inplace=True)
dbf.drop(columns=['geometry'], inplace=True)
same_cols = gdf.columns[gdf.columns.isin(dbf.columns)]
gdf.rename_geometry('geom',inplace=True)
dbf.drop_duplicates(inplace=True)
dbf.reset_index(drop=True,inplace=True)
dbf.columns = dbf.columns.str.lower()
gdf.columns = gdf.columns.str.lower()
dbf.rename(columns=dic,inplace=True)
gdf.rename(columns=dic,inplace=True)
dbf.drop(columns=[
'clemax','cle_code','codevegfin','code_final','lettre','hectares','lib_delphi','lien_habit','lien_typol','evolutif_m','codedelphi',
'cb_carte','cb_2','ch_eur25','ch_stat','cb_choix','choix','codedelphine',], inplace=True, errors='ignore')
gdf.drop(columns=[
'surface','hectares','support','echelle','perimetr',
'part','lettre','phyto','code_cb','cd_eur15','statut','type1','type2','cod_mil',], inplace=True, errors='ignore')
dbf.loc[dbf.statut=='Habitat non désigné','statut'] = None
dbf.loc[dbf.statut=='A préciser','statut'] = None
dbf.loc[dbf.code_cb=='A préciser','code_cb'] = None
dbf.loc[dbf.phyto=='A préciser','phyto'] = None
dbf.loc[dbf.phyto=='Néant','phyto'] = None
#### PNE ####
# dbf.loc[dbf.eur25=='Néant','eur25'] = None
# dbf.loc[dbf.l_eur25=='Néant','l_eur25'] = None
# dbf.loc[dbf.code_cb=='Néant','code_cb'] = None
# dbf.part = dbf.part.astype(int).astype(str)
# dbf.sort_values(['idfinal','part'], ascending=[True,False], inplace=True)
# dbf.dropna(axis=0, subset=['code_cb'], inplace=True)
dbf.sort_values(['idfinal','part'],ascending=[True,False],inplace=True)
tt = [list(range(1,dbf[dbf.idfinal==i].shape[0]+1)) for i in dbf.idfinal.unique() ]
dbf['num'] = [item for sublist in tt for item in sublist]
# dbf.rename(columns={'code_eur27':'code_eur27.'}, inplace=True)
dbf.rename(columns={'code_eur15':'code_eur15.'}, inplace=True)
# dbf.rename(columns={'eur25':'code_eur25.'}, inplace=True)
# dbf.rename(columns={'l_eur25':'l_eur25.'}, inplace=True)
gdf.set_index(['idfinal','idorig','secteur'], inplace=True)
dbf.set_index(['idfinal','idorig','secteur'], inplace=True)
# gdf.set_index(['idfinal','idorig'], inplace=True)
# dbf.set_index(['idfinal','idorig'], inplace=True)
dbf.set_index('num',append=True, inplace=True)
dbf2 = dbf.unstack().copy()
dbf2.dropna(axis=1,how='all', inplace=True)
lst_col = dbf2.columns.get_level_values(0).unique()
stt = ['statut%s'%i for i in range(1,dbf2.iloc[:,dbf2.columns.get_level_values(0)=='statut'].shape[1]+1)]
stc = ['statutcart%s'%i for i in range(1,dbf2.iloc[:,dbf2.columns.get_level_values(0)=='statutcart'].shape[1]+1)]
ste = ['site%s'%i for i in range(1,dbf2.iloc[:,dbf2.columns.get_level_values(0)=='site'].shape[1]+1)]
dbf2.columns = [x+str(j) for x,j in dbf2.columns]
for s in stt:
dbf2.loc[dbf2.statut1.isna(),'statut1'] = dbf2.loc[dbf2.statut1.isna(),s]
for s in stc:
dbf2.loc[dbf2.statutcart1.isna(),'statutcart1'] = dbf2.loc[dbf2.statutcart1.isna(),s]
dbf2.drop(columns=[
*stt[1:],*ste[1:],*stc[1:]
],inplace=True)
dbf2.rename(columns={
'statut1':'statut',
'statutcart1':'statutcart',
'site1':'site'
}, inplace=True)
dbf2.loc[dbf2.statut.isna(),'statut'] = 'N.D'
dbf2.part1 = dbf2.part1.astype(int)
dbf2.columns = dbf2.columns.str.replace('code_cb','code_hab',regex=True)
dbf2.columns = dbf2.columns.str.replace('part','n_hab',regex=True)
df = pd.merge(gdf,dbf2,how='inner',right_index=True,left_index=True)
df.geom = df.buffer(0)
df = pycen.tools.Polygons_to_MultiPolygon(df)
df.to_postgis(
name=name,
con=con,
schema='habitat',
if_exists='replace',
index=True,
geom_col='geom',
)
# dbf2[dbf2.columns[dbf2.columns.str.contains('type')]]
# dbf2[dbf2.columns[dbf2.columns.str.contains('phyto')]]
# dbf2[dbf2.columns[dbf2.columns.str.contains('phyto')]][~dbf2.phyto12.isna()]
# dbf2[dbf2.columns[dbf2.columns.str.contains('libelle')]]
# dbf2[dbf2.columns[dbf2.columns.str.contains('libelle')]][~dbf2.libelle13.isna()]
# dbf2[dbf2.columns[dbf2.columns.str.contains('codeveg')]]
# dbf2[dbf2.columns[dbf2.columns.str.contains('codeveg')]][~dbf2.codeveg13.isna()]
# dbf2.iloc[:,dbf2.columns.get_level_values(0)=='type']
# dbf2.iloc[:,dbf2.columns.get_level_values(0)=='statut']
# dbf2.columns = [x+str(j) for x,j in dbf2.columns]
# dbf2.part1 = dbf2.part1.astype(int)
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+345
View File
@@ -0,0 +1,345 @@
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from statistics import geometric_mean
import geopandas as gpd
import pandas as pd
from sqlalchemy.engine import URL
from sqlalchemy import create_engine
# from shapely.geometry import Polygon
import pycen
from os import listdir, chdir
from pathlib import Path
from zipfile import ZipFile
from rasterstats import zonal_stats
# Path MNT
path0 = '/home/colas/Documents/9_PROJETS/2_PS/'
path0_mnt = '/home/colas/Documents/9_PROJETS/3_PGZH/'
path = path0_mnt + 'SIG/'
p_mltifct = 'multi_fonctions/IGN - BD Alti 25M/'
path2_mnt = path0+'MNT/'
file_mnt25 = 'MNT_25m.tif'
file_mnt5 = 'MNT_5m.tif'
# Parametres bdd IN
from pycen import con_bdcen as con
# con = create_engine('postgresql+psycopg2://{0}:{1}@{2}/{3}'.format(user,pwd,adr,base), echo=False)
def keepgeom_indept(df):
dnat = pycen.ref.get_districtNat().geom.unary_union
df['in_isere'] = df.intersects(dnat)
df = df[df.in_isere].copy()
df.dropna(axis=1, how='all', inplace=True)
del df['in_isere']
return df
# df = gpd.read_postgis(
# sql = 'SELECT * FROM pelouse_seche."cr_PS_CBNA_habitats_aggreg_06_2020"',
# con = con
# )
lst_tab = ['"cr_VERCORS_habitats_CBNA_1999-2007"','"cr_TRIEVES+VERCORS_habitats_CBNA_2014"','"cr_ECRIN_habitats_CBNA_2014"','"cr_CHARTREUSE_habitats_CBNA_2000-2012"',]
table = lst_tab[3]
df = gpd.read_postgis(
sql = 'SELECT * FROM habitat.%s'%table,
con = con
)
df.set_index('idfinal', inplace=True)
# df.set_index('data_id', inplace=True)
colnhab = df.columns[df.columns.str.startswith('n_hab')]
nhab = df[colnhab].copy()
nhab['SUMM'] = nhab.sum(axis=1)
nhab['SUMM'].unique()
lst_hab = ['34.1','34.3','34.4','34.7','35.2','62.3','64.1']
df2 = pd.DataFrame()
for h in lst_hab:
tmp = df[
(df.code_hab1.str.contains(h,na=False))|
(df.code_hab2.str.contains(h,na=False)&(df.n_hab2 >= 20))|
(df.code_hab3.str.contains(h,na=False)&(df.n_hab3 >= 20))|
(df.code_hab4.str.contains(h,na=False)&(df.n_hab4 >= 20))
]
df2 = pd.concat([df2,tmp])
df3 = df2.copy()
# Before 1385 / After 1422
lst_hab2 = ['41','42','43','44','81','82','83']
for h2 in lst_hab2:
tmp2 = df2[
(df2.code_hab1.str.contains('&'+h2,na=False)&(df2.n_hab1 >= 60))
]
df2.drop(labels=tmp2.index,inplace=True)
for h2 in lst_hab2:
tmp2 = df2[
(df2.code_hab1.str.contains(h2+'.',na=False)&(df2.n_hab1 >= 60))
]
df2.drop(labels=tmp2.index,inplace=True)
for h2 in lst_hab2:
tmp3 = df3[
(df3.code_hab1.str.contains(h2,na=False)&(df3.n_hab1 >= 60))
]
df3.drop(labels=tmp3.index,inplace=True)
df2 = keepgeom_indept(df2)
df3 = keepgeom_indept(df3)
df = df2.copy()
df.reset_index(inplace=True,drop=False)
# ps = pycen.ps.get_sitesGeom()
sql = 'SELECT * FROM ps.v_pelouseseches_all'
PS = gpd.read_postgis(sql,pycen.con)
ps = PS[PS.source==table.replace('"','')].copy()
# 1385
not_in_azalee = df2[~df2.index.isin(df3.index)].copy()
in_azalee = df2[df2.index.isin(df3.index)].copy()
not_in_azalee.to_file(path0+'CBNA/MISSING_DATA_INDB/chartreuse.gpkg',layer='not_in_azalee')
in_azalee.to_file(path0+'CBNA/MISSING_DATA_INDB/chartreuse.gpkg',layer='in_azalee')
ps.columns
# Drop poly who intersect poly non-CBNA
# ps_autre = ps[~ps.auteur_geom.str.contains('CBNA')]
# intersect = gpd.sjoin(df,ps_autre,op='intersects').idfinal.tolist()
# drop_index = df[df.idfinal.isin(intersect)].index
# df.drop(drop_index,inplace=True)
# Drop poly who intersect poly CBNA
# ps_cbna = ps[ps.auteur_geom.str.contains('CBNA')]
# intersect = gpd.sjoin(
# df,
# gpd.GeoDataFrame( geometry=ps_cbna.centroid),
# op='intersects').idfinal.tolist()
# drop_index = df[df.idfinal.isin(intersect)].index
# df.drop(drop_index,inplace=True)
from os.path import join
PATH = '/home/colas/Documents/9_PROJETS/2_PS/CBNA/MISSING_DATA_INDB'
FILE = 'CHARTREUSE.gpkg'
df = gpd.read_file(join(PATH,FILE))
if 'date' not in df.columns and 'annee' in df.columns:
df.loc[~df.annee.isna(),'date'] = df.loc[~df.annee.isna(),'annee'].astype(str) + '-01-01'
df['date'] = pd.to_datetime(df['date'])
colnhab2 = df2.columns[df2.columns.str.startswith('n_hab')]
nhab2 = df2[colnhab2].copy()
nhab2['SUMM'] = nhab2.sum(axis=1)
nhab2['SUMM'].unique()
if table == '"cr_CHARTREUSE_habitats_CBNA_2000-2012"':
dic = {
'JCV':'VILLARET Jean-charles',
'GP' :'PACHE Gilles',
'AM' :'MIKOLAJCZAK Alexis',
'TL' :'LEGLAND Thomas',
'HM' :'MERLE Hugues',
'CC' :'Crassous Claire',
# 'AL'
# 'LA'
# 'JC'
}
df.obs = df.obs.replace(dic)
df.loc[~df.obs.isin(['ONF38',*dic.values()]),'obs'] = 'CBNA'
df.loc[df.structur=='ONF 38','structur'] = 'ONF38'
if table == '"cr_ECRIN_habitats_CBNA_2014"':
df['auteur'] = 'PnE'
df['structure'] = 'PnE'
df['date'] = '2014-01-01'
df['date'] = pd.to_datetime(df['date'])
if table == '"cr_TRIEVES+VERCORS_habitats_CBNA_2014"':
df['auteur'] = 'CBNA'
df['structure'] = 'CBNA'
df['date'] = '2014-01-01'
df['date'] = pd.to_datetime(df['date'])
if table == '"cr_VERCORS_habitats_CBNA_1999-2007"':
df['structure'] = 'CBNA'
if table in [
'"cr_VERCORS_habitats_CBNA_1999-2007"','"cr_TRIEVES+VERCORS_habitats_CBNA_2014"'
]:
df.loc[df.statut=="Habitat d'intérêt communautaire",'statut'] = \
"Communautaire"
df.loc[df.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
df.loc[df.statut=="Habitat d'intérêt communautaire, retenu prioritaire",'statut'] = \
"Prioritaire"
df.loc[
df.statut=="""Habitat d'intérêt communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[
df.statut=="""Habitat d'intérêt communautaire retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[
df.statut=="""Habitat communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
df.loc[df.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
if table in [
'"cr_CHARTREUSE_habitats_CBNA_2000-2012"', '"cr_ECRIN_habitats_CBNA_2014"']:
dic = {'PR':'Prioritaire','IC':'Communautaire','NC':'Non communautaire'}
df.statut.replace(dic,inplace=True)
df.reset_index(inplace=True, drop=True)
df.to_postgis(
'ps'+table[3:-1],pycen.con_bdcen,'pelouse_seche',geom_col='geom',if_exists='replace'
)
# [CROSS_MNT]
ddf = df[['idfinal','geom']].copy()
ddf.set_geometry('geom',inplace=True)
# home = str(Path.home())
# chdir(path+p_mltifct)
# Dir = listdir()
# Dir = [x for x in Dir if '.zip' in x]
# # stats = pd.DataFrame()
# for i, d in enumerate(Dir):
# zip = ZipFile(d).namelist()
# z = [z for z in zip if 'MNT' in z][0]
# print(z)
# tmp = zonal_stats(ddf.geom,'/vsizip/{zip}/{mnt}'.format(zip=d,mnt=z),stats="max")
# tmp = pd.DataFrame(tmp)
# tmp.columns = ['max%s'%i]
# if i == 0 :
# stats = tmp
# else:
# stats = pd.merge(stats,tmp,how='left',left_index=True,right_index=True)
# stats['bilan'] = stats.max(axis=1)
# tmp = pd.merge(df,stats['bilan'],left_index=True,right_index=True)
# tmp.bilan = tmp.bilan.round()
# zonal_tmp = zonal_stats(ddf.geom,path2_mnt+file_mnt25,stats="mean max",nodata=0,all_touched=True)
# import rasterio
# with rasterio.open(path2_mnt+file_mnt5) as src:
# affine = src.transform
# array = src.read(1)
# zonal_tmp3 = zonal_stats(ddf, array, affine=affine,stats="mean max",nodata=0,all_touched=True)
# zonal_tmp = pd.DataFrame(zonal_tmp)
# zonal_tmp3 = pd.DataFrame(zonal_tmp3)
# zonal_tmp.columns = ['max_alti','mean_alti']
# zonal_tmp3.columns = ['max_alti','mean_alti']
# tmp = pd.merge(df,zonal_tmp2,left_index=True,right_index=True)
from pycen import con as con_aza
sql = 'SELECT * FROM ps.v_pelouseseches_noalti'
ddf = gpd.read_postgis(sql,con_aza)
zonal_tmp2 = zonal_stats(ddf,path2_mnt+file_mnt5,stats="max",nodata=0,all_touched=True)
zonal_tmp2 = pd.DataFrame(zonal_tmp2)
zonal_tmp2.columns = ['max_alti']
tmp = pd.concat([ddf,zonal_tmp2], axis=1)
tmp = tmp.set_geometry('geom', crs=2154)
tmp['infeq_1200'] = tmp.max_alti <= 1200
tmp2 = tmp[['site_code','infeq_1200']].copy()
tmp2.rename(columns={'site_code':'id_site'},inplace=True)
tmp2.to_sql('r_infeq_1200m',con_aza,'ps',if_exists='append',index=False)
df.to_postgis(
'ps'+table[3:-1],pycen.con_bdcen,'pelouse_seche',geom_col='geom',if_exists='replace'
)
PSinfeq1200 = tmp[tmp.max_alti <= 1200].copy()
PSsup1200 = tmp[tmp.max_alti > 1200].copy()
# PSinfeq1200 = tmp[tmp.bilan <= 1200].copy()
# PSsup1200 = tmp[tmp.bilan > 1200].copy()
# PSinfeq1200.rename(columns={'bilan':'max_alti'}, inplace=True)
# PSsup1200.rename(columns={'bilan':'max_alti'}, inplace=True)
PSinfeq1200.dropna(axis=1, how='all',inplace=True)
if table in [
'"cr_VERCORS_habitats_CBNA_1999-2007"','"cr_TRIEVES+VERCORS_habitats_CBNA_2014"']:
PSinfeq1200.loc[PSinfeq1200.statut=="Habitat d'intérêt communautaire",'statut'] = \
"Communautaire"
PSinfeq1200.loc[PSinfeq1200.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
PSinfeq1200.loc[PSinfeq1200.statut=="Habitat d'intérêt communautaire, retenu prioritaire",'statut'] = \
"Prioritaire"
PSinfeq1200.loc[
PSinfeq1200.statut=="""Habitat d'intérêt communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
PSinfeq1200.loc[
PSinfeq1200.statut=="""Habitat d'intérêt communautaire retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
PSinfeq1200.loc[
PSinfeq1200.statut=="""Habitat communautaire, retenu prioritaire pour les sites riches en orchidées""",
'statut'] = "Prioritaire"
PSinfeq1200.loc[PSinfeq1200.statut=="Habitat d'intérêt communautaire retenu prioritaire",'statut'] = \
"Prioritaire"
if table in [
'"cr_CHARTREUSE_habitats_CBNA_2000-2012"', '"cr_ECRIN_habitats_CBNA_2014"']:
dic = {'PR':'Prioritaire','IC':'Communautaire','NC':'Non communautaire'}
PSinfeq1200.statut.replace(dic,inplace=True)
DF_INI = PSinfeq1200.copy()
df = DF_INI.copy()
# df['structure'] = 'CBNA'
# sql = """
# DELETE FROM sites.sites
# WHERE sites.id in (SELECT id_site from sites.r_sites_geom where id_lot = 1);
# """
# with pycen.con.begin() as cnx:
# cnx.execute(sql)
path0 = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT/'
cols_date = PSsup1200.columns[PSsup1200.columns.str.contains('date')]
PSsup1200[cols_date] = PSsup1200[cols_date].astype(str)
PSsup1200.to_file(path0 + 'PS_ECRIN_CBNA_2014_SUP1200.shp')
cols_date = DF_INI.columns[DF_INI.columns.str.contains('date')]
DF_INI[cols_date] = DF_INI[cols_date].astype(str)
DF_INI.to_file(path0 + 'PS_ECRIN_CBNA_2014_INF1200.shp')
op = '''
gdalwarp -overwrite -s_srs EPSG:2154 -t_srs EPSG:2154 -co FORMAT=GPKG -of GTiff -tr 25.0 -25.0 -tap -cutline \
"PG:dbname='bd-cen-38' host=192.168.0.189 port=5432 sslmode=disable user='cgeier' password='adm1n*bdCen'" \
-csql "SELECT * FROM habitat."cr_TRIEVES_VERCORS_habitats_CBNA_2014" WHERE idfinal in (24060)" \
"{mnt}" {out}
'''.format(
mnt=path2_mnt+'out.tif',
out=path2_mnt+'24060.tif')
system(op)
mnt = rio.open(Path_tmp+mnt_out)
sql = 'SELECT * FROM pelouse_seche."PB_codehab_nonPresent_dans_corineBiotope"'
df = gpd.read_postgis(sql,con)
lst = ['cr_TRIEVES+VERCORS_habitats_CBNA_2014','cr_VERCORS_habitats_CBNA_1999-2007','cr_ECRIN_habitats_CBNA_2014','cr_CHARTREUSE_habitats_CBNA_2000-2012']
df = df[df.table_org.isin(lst)]
df.loc[df.auteur=='PnE','structure'] = 'PnE'
sql = 'SELECT * FROM pelouse_seche."PB_codehabCBNA_nonPresent_dans_corineBiotope"'
df2 = gpd.read_postgis(sql,con)
df3 = pd.concat([df,df2])
df3.set_geometry('geom',inplace=True,crs=2154)
df3.to_postgis(
name='PB_codehabCBNA_nonPresent_dans_corineBiotope',
con=con,
schema='pelouse_seche',
if_exists='replace',
geom_col='geom'
)
+1456
View File
File diff suppressed because it is too large Load Diff
+118
View File
@@ -0,0 +1,118 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from pycen.tools import Polygons_to_MultiPolygon
from pycen import con
import geopandas as gpd
from sqlalchemy import create_engine, text
from geoalchemy2 import Geometry
user_cad = 'cgeier' # utilisateur de connexion à la bdd
pwd_cad = 'adm1n*bdCen' # mot de passe de la bdd
adr_cad = '91.134.194.221' # adresse ip de la bdd
port_cad = '5432' # port de la bdd
base_cad = 'rhomeo' # nom de la bdd
schema_cad = 'bdtopo3'
con = create_engine('postgresql+psycopg2://{0}:{1}@{2}:{3}/{4}'.format(user_cad,pwd_cad,adr_cad,port_cad,base_cad), echo=False)
file = '/media/cgeier/Disk2/5_BDD/RPG/1_DONNEES_LIVRAISON_2021/RPG_2-0_SHP_LAMB93_R84_2021-01-01/ILOTS_ANONYMES.shp'
dic = {
'CD_SSBV': 'cdssbv',
'LIB_SSBV': 'nom',
'CD_COMGEO': 'cd_comgeo',
'CD_CTB': 'cd_ctb',
'CD_': 'cd_',
'CD_SUBUNIT': 'cd_subunit',
'geometry': 'geom',
}
name_table = 'ilots_anonymes_2021'
name_schema = 'rpgnew'
# Parametres bdd OUT
# user_zh = 'postgres'
# pwd_zh = 'tutu'
# adr_zh = '192.168.60.10'
# base_zh = 'bd_cen'
# con_zh = create_engine('postgresql+psycopg2://{0}:{1}@{2}/{3}'.format(user_zh,pwd_zh,adr_zh,base_zh), echo=False)
select_cols = list(dic.values())
df = gpd.read_file(file)
# df = df.set_geometry('geom')
df.rename_geometry('geom', inplace=True)
df.columns = df.columns.str.lower()
if not df.crs:
df.set_crs(epsg=2154, inplace=True)
if df.crs.srs != 'epsg:2154':
df.to_crs(epsg=2154, inplace=True)
# df.rename(columns=dic, inplace=True)
# df = df[select_cols]
if 'id' not in df.columns:
df.index.name = 'id'
df.reset_index(drop=False, inplace=True)
if 'Polygon' in df.geom_type.unique() and 'MultiPolygon' in df.geom_type.unique():
df = Polygons_to_MultiPolygon(df)
# from shapely.geometry.multipolygon import MultiPolygon
# tmp = df.loc[df.geom_type == 'Polygon'].copy()
# geom = [MultiPolygon([x]) for x in tmp.loc[tmp.geom_type == 'Polygon','geom']]
# tmp = tmp.set_geometry(geom)
# df = gpd.pd.concat([df.drop(tmp.index), tmp]).sort_values('id').reset_index(drop=True)
if 'LineString' in df.geom_type.unique() and 'MultiLineString' in df.geom_type.unique():
from shapely.geometry.multilinestring import MultiLineString
tmp = df.loc[df.geom_type == 'LineString'].copy()
geom = [MultiLineString([x]) for x in tmp.loc[tmp.geom_type == 'LineString','geom']]
tmp = tmp.set_geometry(geom)
df = gpd.pd.concat([df.drop(tmp.index), tmp]).sort_values('id').reset_index(drop=True)
con.begin()
df.to_postgis(
name = name_table,
con = con,
schema = name_schema,
if_exists = 'replace',
chunksize = 100000,
dtype={'geom':Geometry(srid=2154)}
)
sql = """ALTER TABLE {sch}.{tab} OWNER TO cen_admin;
GRANT ALL ON TABLE {sch}.{tab} TO cen_admin;
GRANT ALL ON TABLE {sch}.{tab} TO grp_admin;
--GRANT SELECT ON TABLE {sch}.{tab} TO grp_consult;
""".format(sch=name_schema,tab=name_table)
with con.begin() as cnx:
cnx.execute(sql)
sql = """
REVOKE SELECT ON TABLE {sch}.{tab} FROM grp_consult;
""".format(sch=name_schema,tab=name_table)
with con.begin() as cnx:
cnx.execute(sql)
if 'rpg' in name_table:
v_tab = 'v_'+name_table.replace('reg','')+'isere'
lst_col = ','.join(tuple('s.'+df.columns))
sql = """CREATE OR REPLACE VIEW {sch}.{v_tab}
AS SELECT {cols}
FROM {sch}.{tab} s,
ref_territoire.dept_isere reg
WHERE st_intersects(s.geom, reg.geom);
ALTER TABLE {sch}.{v_tab} OWNER TO cen_admin;
GRANT ALL ON TABLE {sch}.{v_tab} TO cen_admin;
GRANT ALL ON TABLE {sch}.{v_tab} TO grp_admin;
GRANT SELECT ON TABLE {sch}.{v_tab} TO grp_consult;""".format(sch=name_schema,tab=name_table,v_tab=v_tab,cols=lst_col)
with con.begin() as cnx:
cnx.execute(sql)
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from pycen import con
import geopandas as gpd
from datetime import datetime as dt
file = '/home/colas/Documents/tmp/rpg/RPG_2-2__SHP_LAMB93_R84_2023-01-01/RPG/1_DONNEES_LIVRAISON_2023/RPG_2-2__SHP_LAMB93_R84_2023-01-01/PARCELLES_GRAPHIQUES.shp'
name_table = 'rpg_parcelles_graphiques_reg'
name_schema = 'ref_territoire'
thisyear = dt.now().year-1
df = gpd.read_file(file)
df.columns = df.columns.str.lower()
# df = df.set_geometry('geom')
df.rename_geometry('geom', inplace=True)
if not df.crs:
df.set_crs(epsg=2154, inplace=True)
if df.crs.srs != 'epsg:2154':
df.to_crs(epsg=2154, inplace=True)
exist_table = con.dialect.get_table_names(con, schema = name_schema)
if name_table in exist_table:
other_table = name_table.replace('rpg','rpg'+str(thisyear-1))
view = 'v_'+name_table.replace('reg','isere')
other_view = view.replace('rpg','rpg'+str(thisyear-1))
sql = """
ALTER TABLE IF EXISTS {sch}.{tab} RENAME TO "{othertab}";
ALTER VIEW IF EXISTS {sch}.{view} RENAME TO "v_{otherview}";
ALTER INDEX IF EXISTS {sch}.idx_rpg_parcelles_graphiques_reg_geom RENAME TO "idx_rpg{old_year}_parcelles_graphiques_reg_geom";
""".format(sch=name_schema,tab=name_table,othertab=other_table,old_year=thisyear-1,view=view,otherview=other_view)
with con.begin() as cnx:
cnx.execute(sql)
df.drop_duplicates().to_postgis(
name = name_table,
con = con,
schema = name_schema,
if_exists = 'replace',
index = False
)
sql = """
ALTER TABLE {sch}.{tab} OWNER TO cen_admin;
GRANT ALL ON TABLE {sch}.{tab} TO cen_admin;
GRANT ALL ON TABLE {sch}.{tab} TO grp_admin;
GRANT SELECT ON TABLE {sch}.{tab} TO grp_consult;
""".format(sch=name_schema,tab=name_table)
comment = """COMMENT ON TABLE {sch}.{tab} IS 'Version {v} 2.1 - Table des parcelles graphiques de la région Auvergne Rhône-Alpes.'""".format(sch=name_schema,tab=name_table,v=thisyear)
with con.begin() as cnx:
cnx.execute(sql)
cnx.execute(comment)
if 'rpg' in name_table:
v_tab = 'v_'+name_table.replace('reg','')+'isere'
lst_col = ','.join(tuple('s.'+df.columns))
sql = """CREATE OR REPLACE VIEW {sch}.{v_tab}
AS SELECT {cols}
FROM {sch}.{tab} s,
ref_territoire.dept_isere reg
WHERE st_intersects(s.geom, reg.geom);
ALTER TABLE {sch}.{v_tab} OWNER TO cen_admin;
GRANT ALL ON TABLE {sch}.{v_tab} TO cen_admin;
GRANT ALL ON TABLE {sch}.{v_tab} TO grp_admin;
GRANT SELECT ON TABLE {sch}.{v_tab} TO grp_consult;""".format(sch=name_schema,tab=name_table,v_tab=v_tab,cols=lst_col)
comment = """COMMENT ON VIEW {sch}.{v_tab} IS 'Version {v} 2.1 - Table des parcelles graphiques de l''isere.'""".format(sch=name_schema,v_tab=v_tab,v=thisyear)
with con.begin() as cnx:
cnx.execute(sql)
cnx.execute(comment)
+32
View File
@@ -0,0 +1,32 @@
from pycen import zh
import geopandas as gpd
import os
def get_intersected(df1,df2):
is_intersect = df1.intersects(df2.unary_union)
return df1[is_intersect].copy()
def format_data(df):
istype_date = df.dtypes == 'datetime64[ns]'
is_date = df.columns.str.contains('date|heure',case=False,regex=True)
col_date = df.columns[istype_date|is_date]
df[col_date] = df[col_date].astype(str)
if __name__ == "__main__":
PATH = '/home/colas/Documents/tmp/PNE'
file_pne = 'fwdcoucheszoneshumidesisroises/PNE_aoa.shp'
zh = zh()
v_zh = zh.v_zoneshumides()
zhp = zh.zh_ponctuelles()
pne = gpd.read_file(os.path.join(PATH,file_pne))
vzh_pne = get_intersected(v_zh,pne)
zhp_pne = get_intersected(zhp,pne)
format_data(vzh_pne)
format_data(zhp_pne)
vzh_pne.drop(['old_code','type_site'],axis=1).to_file(os.path.join(PATH,'PNE_ZH.gpkg'),driver='GPKG',layer='inventaire_zh')
zhp_pne.to_file(os.path.join(PATH,'PNE_ZH.gpkg'),driver='GPKG',layer='zh_ponctuelle')
@@ -0,0 +1,41 @@
import geopandas as gpd
from os import path
PATH = '/home/cgeier/Documents/9_PROJETS/2_PS/2026/Anne BELET - couchepelousessches'
anne = gpd.read_file(path.join(PATH,'couche_finale_modif_CEN.gpkg')).set_index('site_code')
mosa = gpd.read_file(path.join(PATH,'couche_finale_modif_mosaique.gpkg')).set_index('site_code')
call = gpd.read_file(path.join(PATH,'couche_finale2.gpkg')).set_index('site_code')
date_cols = anne.columns[anne.columns.str.contains('date')]
for tab in [anne,mosa,call]:
for d in date_cols :
tab[d] = (gpd.pd.to_datetime(tab[d],format='mixed',utc=True)
.astype(str)
.str.split(' ', expand=True)[0]
)
anne.loc[anne.auteur_attrs=='Anne BELET (GAM)','organisme'] = 'Grenoble Alpes Métropole'
anne.loc[anne.auteur_geom=='Anne BELET (GAM)','organisme'] = 'Grenoble Alpes Métropole'
anne.loc[anne.auteur_geom=='Ag Mosaique Env','organisme'] = 'Mosaïque Environnement'
anne.loc[anne.auteur_geom=='Ag Mosaique Env','auteur_geom'] = 'Mosaïque Environnement'
anne.loc[anne.auteur_attrs=='Anne BELET (GAM)','auteur'] = 'BELET Anne'
anne.loc[anne.auteur_geom=='Anne BELET (GAM)','auteur'] = 'BELET Anne'
anne.loc[anne.auteur_geom=='Mosaïque Environnement','auteur'] = 'Mosaïque Environnement'
anne['id_origine'] = anne.index.str[:10]
anne['id_site'] = anne.index.copy()
anne.loc[anne.index.str.len()<10,'id_site'] = None
anne.loc[anne.index.str.len()>10,'id_site'] = None
anne.rename(columns={
'rmq_interet_patri':'remarques','rmq_usage_process':'legende'
}, inplace=True)
anne.to_file(path.join(PATH,'GAM2026_couche_finale_modif_CEN (corrige).gpkg'),index=False)
mosa.to_file(path.join(PATH,'GAM2026_couche_finale_modif_mosaique (corrige).gpkg'))
call.to_file(path.join(PATH,'GAM2026_couche_finale (corrige).gpkg'))
anne.to_excel(path.join(PATH,'couche_finale_modif_CEN.xlsx'),index=False)
mosa.to_excel(path.join(PATH,'couche_finale_modif_mosaique.xlsx'))
+36
View File
@@ -0,0 +1,36 @@
import pandas as pd
import geopandas as gpd
from pycen import con_gn
old = gpd.read_file('/home/cgeier/Téléchargements/Telechargement_1772622390_2696/data/n_zone_humide_s_038/n_zone_humide_s_038.json')
new = gpd.read_postgis('SELECT * FROM gn_exports.v_synthese_zones_humides_isere',con_gn).to_crs(2154)
tab = pd.read_csv('/home/cgeier/Documents/9_PROJETS/1_ZH/2024/RENDU SIG/pv_evolution_dossier.csv',sep=',')
for etude in tab.nom_etude.unique():
if tab[(tab.nom_etude==etude)].organisme_transmission.any():
continue
print('\n',etude)
news = tab[(tab.nom_etude==etude) & (tab.status_inventaire == 'Nouvelle')]
modif = tab[(tab.nom_etude==etude) & (tab.status_inventaire== 'Modification')]
supp = tab[(tab.nom_etude==etude) & (tab.status_inventaire == 'Supression')]
new_add = new[new.code.isin(news.code_zh.tolist())].copy()
del_zh = old[old.id_local.isin(supp.code_zh.tolist())]
print('\tNouvelles surfaces ajoutées : %f ha'%(round(new_add.area.sum()/10000,2)),' ; %i zh'%new_add.shape[0],' ; \n\tcode : ',', '.join(list(new_add.code)))
print('\tSurfaces supprimées : %f ha'%(round(del_zh.area.sum()/10000,2)),' ; %i zh'%del_zh.shape[0],' ; \n\tcode : ',', '.join(list(del_zh.id_local)))
code_modif = modif.code_zh.tolist()
diff = (new[new.code.isin(code_modif)]
.sort_values('code').set_index('code').area - old[old.id_local.isin(code_modif)]
.sort_values('id_local').set_index('id_local').area
)
add = diff[diff > 0]
red = diff[diff < 0]
print('\tModification surfaces ajoutées : %f ha'%(round(add.sum()/10000,2)),' ; %i zh'%add.shape[0],' ; \n\tcode : ',', '.join(list(add.index)))
print('\tModification surfaces perdues : %f ha'%(round(red.sum()/10000,2)),' ; %i zh'%red.shape[0],' ; \n\tcode : ',', '.join(list(red.index)))
+116
View File
@@ -0,0 +1,116 @@
import pycen
import geopandas as gpd
dstct = pycen.ref.get_districtNat()
ps = pycen.ps.get_sitesGeom(statut='all')
ps['org_bd'] = ps.id_site.str[2:6]
ps['num'] = ps.id_site.str[6:]
df = gpd.sjoin(ps,dstct[['abrev','geom']]).drop(columns=['index_right'])
df.sort_values('id_site',inplace=True)
tmp = pycen.tools.calc_recouvrmt(df1=df[df.org != df.abrev], df2=dstct)
from geopandas import sjoin
tmp = sjoin(
df1,
df2[['geom']],
op = 'intersects',
how = 'left')
tmp.dropna(subset=['index_right'],inplace=True)
tmp.index_right = tmp.index_right.astype(int)
tmp.reset_index(inplace=True)
tmp = tmp.join(
df2[['geom']].rename(columns={'geom': 'right_geom'}),
on=['index_right'], how='left')
tmp2 = tmp[['index_right','right_geom']].copy() \
.rename(columns={'right_geom': 'geom'}) \
.set_geometry('geom')
tmp1 = tmp[['id_site','geom']].copy() \
.set_geometry('geom')
if not tmp1.geom.values.is_valid.all():
tmp1.loc[~tmp1.geom.values.is_valid,'geom'] = tmp1.loc[~tmp1.geom.values.is_valid,'geom'].buffer(0)
if not tmp2.geom.values.is_valid.all():
tmp2.loc[~tmp2.geom.values.is_valid,'geom'] = tmp2.loc[~tmp2.geom.values.is_valid,'geom'].buffer(0)
tmp['perc_rcvmt'] = (tmp1.intersection(tmp2).area/tmp1.area)*100
tmp = tmp.groupby(['id_site']).sum().reset_index()
df1 = df1.merge(tmp[['id_site','perc_rcvmt']], on=['id_site'], how='left')
df1.perc_rcvmt.fillna(0, inplace=True)
df1.perc_rcvmt = df1.perc_rcvmt.round(2)
tmp1['area_rcvmt'] = [gpd.overlay(tmp1.iloc[[i]],tmp2.iloc[[i]]).area.round()[0] for i in range(0,tmp1.shape[0]) ]
# Maj origine district
df = ps[ps.org_bd!=ps.org].sort_values('id_site').copy()
pycen.update_to_sql(
df[['id_site','org']].rename(columns={'id_site':'id'}).drop_duplicates(),
pycen.con,'sites','sites','id'
)
# Redéfinition des numéro de sites
ps_sit = pycen.ps.get_sitesInfos(statut='all')
ps_sit.loc[ps_sit.id.isin(df.id_site),'num'] = None
# attribution de numéro non utilisé
for o in ps_sit.org.unique():
tmp_sit = ps_sit.loc[ps_sit.org==o,'num'].dropna().astype(int)
min = tmp_sit.min()
max = tmp_sit.max()
lst = [str(i) for i in range(min,max) if i not in [*tmp_sit]]
tt = (ps_sit.org==o)&(ps_sit.num.isna())
tmp_sitna = ps_sit[tt]
if tmp_sitna.shape[0] <= len(lst):
ps_sit.loc[tt,'num'] = lst[:tmp_sitna.shape[0]]
else:
ps_sit.loc[(ps_sit.index.isin(tt[tt].index[:len(lst)])),'num'] = lst
tt2 = (ps_sit.org==o)&(ps_sit.num.isna())
min2 = max + 1
max2 = max + 1 + ps_sit[tt2].shape[0]
lst2 = [str(i) for i in range(min2,max2)]
ps_sit.loc[tt2,'num'] = lst2
df2 = ps_sit.loc[ps_sit.id.isin(df.id_site)]
df2.loc[df2.num.str.len() == 1,'num'] = '000'+ df2.loc[df2.num.str.len() == 1,'num']
df2.loc[df2.num.str.len() == 2,'num'] = '00' + df2.loc[df2.num.str.len() == 2,'num']
df2.loc[df2.num.str.len() == 3,'num'] = '0' + df2.loc[df2.num.str.len() == 3,'num']
pycen.update_to_sql(
df2[['id','num']].drop_duplicates(),
pycen.con,'sites','sites','id'
)
# Redéfinition des écritures
ps_sitnew = pycen.ps.get_sitesInfos(id_site=[*df.id_site],statut='all')
ps_sitnew = ps_sitnew[[
'id','dept','org','num',
]]
ps_sitnew['idnew'] = ps_sitnew.dept+ps_sitnew.org+ps_sitnew.num
# incrémentation de l'historique
ps_sitnew[['id','idnew']]\
.rename(columns={
'id':'id_site_old',
'idnew':'id_site_new'
}).to_sql(
'hist_id_site',
pycen.con,'sites',if_exists='append',index=False
)
# modification des noms
pycen.update_to_sql(
ps_sitnew[['index','dept','org','num']].rename(columns={'index':'id'}).drop_duplicates(),
pycen.con,'sites','sites',['dept','org','num']
)
pycen.update_to_sql(
ps_sitnew[['idnew','dept','org','num']].rename(columns={'idnew':'id'}).drop_duplicates(),
pycen.con,'sites','sites',['dept','org','num']
)
+233
View File
@@ -0,0 +1,233 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
# 2024-11-26
# LE script permet d'intégrer de nouvelles géométries
# dans la table sites.r_sites_geom. Les AUTEURS ont été
# intégrés manuellement.
import geopandas as gpd
from pycen import con, zh as ZH
from pycen.tools import dropZ, Polygons_to_MultiPolygon
from os import path
from shapely import wkb
from matplotlib import pyplot as plt
import pycen
from sqlalchemy import create_engine
from sqlalchemy.engine import URL
# isin_bdd = True
# # Parametres bdd CEN38 OUT
user = 'cen_admin'
pwd = "#CEN38@venir"
adr = '91.134.194.221'
base = 'azalee_restore'
url = URL.create("postgresql+psycopg2", username=user, password=pwd, host=adr, database=base)
con = create_engine(url)
zh = ZH()
r_geom = zh.get_sitesGeom()
r_geom = gpd.read_postgis('''
SELECT r_sites_geom.* FROM sites.r_sites_geom
JOIN sites.sites ON sites.id = r_sites_geom.id_site AND sites.id_type_milieu = 1
''',con)
r_geom.dropna(how="all",axis=1,inplace=True)
r_geom.drop(columns=['id','date_insert','id_origine','id_lot'],inplace=True)
r_geom.sort_values(['id_site','date'],inplace=True)
r_geom.drop_duplicates(['id_site'],keep='last',inplace=True)
PATH = '/home/colas/Documents/9_PROJETS/1_ZH/MAJ/Actu 2024/FAIT/CBNA/zh38'
file = 'hab_agreg.gpkg'
df = gpd.read_file(path.join(PATH,file))
df.rename_geometry('geom', inplace=True)
df.geom = [wkb.loads(wkb.dumps(g,output_dimension=2)) for g in df.geom]
df.dropna(how='all',axis=1,inplace=True)
# gpd.GeoSeries([r_geom.unary_union],crs=2154).contains(df.geom)
# df.contains(r_geom.geom).any()
# res = df.within(r_geom.unary_union)
perc = 80
zh_caract = df[df.zh=='caractéristique'].copy()
zh_caract['surfzhall'] = zh_caract.groupby(['idpolyfinal'])['n06rechab'].transform('sum')
lst_idpoly = zh_caract[zh_caract.surfzhall >= perc].idpolyfinal.unique()
# zh_caract.within(r_geom.unary_union)
# zh_caract.contains(r_geom.unary_union).any()
# Non Intersection Après 2015 - tout milieux
no_inters = df[
(df.lien_zh == 'aucun') & (df.n07anneehab > 2015) #& (df.zh=='caractéristique')
& (df.idpolyfinal.isin(lst_idpoly))
& (~df.n05lbhab.str.contains('invasif',na=False,case=False))
].copy()
no_inters = no_inters.drop(columns=['id_site']).sjoin(r_geom[['id_site','geom']])
no_inters.to_file(path.join(PATH,'inters.gpkg'),driver='GPKG',layer='no_inters%i'%perc)
len(no_inters.id_site.unique())
# Intersection Après 2015 - tout milieux
inters = df[
(df.lien_zh == 'intersecte') & (df.n07anneehab > 2015) #& (df.zh=='caractéristique')
# & (df.n06rechab.astype(int)>45)
& (df.idpolyfinal.isin(lst_idpoly))
& (~df.n05lbhab.str.contains('invasif',na=False,case=False))
].copy()
inters = inters.drop(columns=['id_site']).sjoin(r_geom[['id_site','geom']])
inters.to_file(path.join(PATH,'inters.gpkg'),driver='GPKG',layer='inters%i'%perc)
len(inters.id_site.unique())
# Intersection Après 2009 - milieux Forêts uniquement
inters_foret = df[
(df.lien_zh == 'intersecte') & (df.zh=='caractéristique') #& (df.n07anneehab > 1999)
# & (df.n06rechab.astype(int)>45)
& (df.idpolyfinal.isin(lst_idpoly)) & (df.n05lbhab.str.contains('for.t',na=False,case=False))
& (~df.n05lbhab.str.contains('invasif',na=False,case=False))
& (~df.idpolyfinal.isin(inters.idpolyfinal.tolist()))
].copy()
inters_foret = inters_foret.drop(columns=['id_site']).sjoin(r_geom[['id_site','geom']])
inters_foret.to_file(path.join(PATH,'inters.gpkg'),driver='GPKG',layer='inters_forets')
# Fusion Géométries
intersF = gpd.pd.concat([inters,inters_foret])
intersF.to_csv(path.join(PATH,'intersection_finale_hab_zh.csv'))
rgeo = (r_geom[r_geom.id_site.isin(intersF.id_site.unique())]
.copy())
for id_site in rgeo.id_site.unique():
rgeo.loc[rgeo.id_site==id_site,'geom'] = gpd.GeoSeries([
gpd.GeoSeries(
[*rgeo[rgeo.id_site==id_site].geom,
*intersF[intersF.id_site==id_site].geom],
crs=2154).unary_union
],
crs=2154,
index=rgeo[rgeo.id_site==id_site].index)
rgeo.date = '2024-01-21'
# Filtre geométries plus grandes
rgeo2 = rgeo[
rgeo.sort_values('id_site').area
> r_geom[r_geom.id_site.isin(rgeo.id_site.unique())].sort_values('id_site').area
]
# Check habitats describes
sql = 'SELECT * FROM zones_humides.r_site_habitat WHERE valid IS True and id_site IN {lst}'.format(lst=tuple(intersF.id_site.unique()))
hab_bdd = gpd.pd.read_sql(sql,con)
insert_hab = gpd.pd.DataFrame()
for id_site in intersF.id_site.unique():
lst_bddhab = hab_bdd[hab_bdd.id_site==id_site].id_cb.tolist()
cbn_hab = intersF[(intersF.id_site==id_site)&(~intersF.n24cdcb.astype(str).isin(lst_bddhab))]
insert_hab = gpd.pd.concat([insert_hab,cbn_hab])
ins_hab = (insert_hab[['n03observat','n04organism','n07anneehab','n24cdcb','id_site']]
.rename(columns={'n24cdcb':'id_cb','n03observat':'observer','n04organism':'organisme','n07anneehab':'annee'})
.replace(
{'AMODEI T':'AMODEI Thomas',
'Lo Parvi':'LO PARVI',
'ACER CAMPESTRE':'Acer Campestre',
'Réflex environnement':'REFLEX Environnement',
'Office National des Forets':'Office National des Forêts',
'Conservatoire botanique national alpin':'Conservatoire Botanique National Alpin',
'Mosaique Environnement, M. Voirin':'Mosaïque Environnement',
'Boucard E.':'BOUCARD E.',
'MALET, A., JOUD. D., LINOSSIER, T.':'MALET A., JOUD Didier, LINOSSIER T.',
'AURAND T., TAIN C':'AURAND Theo, TAIN C.',
'FOLCHER C.':'FOLCHER Caroline',
"Conservatoire d'espaces naturels": 'CEN Isère'
})
.drop_duplicates())
ins_hab['auteur'] = None
ins_hab.loc[ins_hab.observer.isna(),['auteur']] = ins_hab[ins_hab.observer.isna()].organisme
ins_hab.loc[~ins_hab.observer.isna(),['auteur']] = (ins_hab[~ins_hab.observer.isna()].observer +
' (' +ins_hab[~ins_hab.observer.isna()].organisme + ')')
ins_hab['date'] = ins_hab.annee.astype(str) + '-01-01'
ins_hab.drop(columns=['observer','organisme','annee'],inplace=True)
# Insertion geom BDD
rgeo2.to_postgis('r_sites_geom',pycen.con,'sites',if_exists='append',index=False)
siteid = gpd.pd.read_sql('''
SELECT DISTINCT ON (id_site) id,id_site
FROM sites.r_sites_geom
WHERE id_site IN {lst}
ORDER BY id_site,id DESC
'''.format(lst=tuple(rgeo2.id_site.unique())),pycen.con)
usr = siteid.drop(columns=['id_site']).copy()
usr.rename(columns={'id':'id_geom_site'},inplace=True)
usr['id_auteur'] = 96
usr.to_sql('r_geomsites_auteur',pycen.con,schema='sites',if_exists='append',index=False)
# Insertion habitat BDD
siteidgeo = gpd.pd.read_sql('''
SELECT DISTINCT ON (id_site) id id_geom_site,id_site
FROM sites.r_sites_geom
WHERE id_site IN {lst}
ORDER BY id_site,id DESC
'''.format(lst=tuple(ins_hab.id_site.unique())),pycen.con)
ins_habF = ins_hab.merge(siteidgeo, on='id_site',how='left')
ins_habF.sort_values(['id_site','id_cb','date'],inplace=True)
ins_habF.drop_duplicates(subset=['id_site','id_cb'],keep='last',inplace=True)
ins_habF['valid'] = True
ins_habF.to_csv(path.join(PATH,'habs_inserted.csv'))
(ins_habF
.drop(columns=['auteur'])
.to_sql('r_site_habitat',pycen.con,schema='zones_humides',if_exists='append',index=False))
refpers = (pycen.pers.get_auteur2()
.replace({'nom_prenom':{
'ONF38 (ONF)':'Office National des Forêts',
'CBNA (CBNA)':'Conservatoire Botanique National Alpin',
'LO PARVI (LO PARVI)':'LO PARVI',
'CEN Isère (CEN Isère)':'CEN Isère',
'Ecosphère (Ecosphère)':'Ecosphère',
'BURGEAP (BURGEAP)':'BURGEAP',
'Acer Campestre (Acer Campestre)':'Acer Campestre',
'REFLEX Environnement (REFLEX Environnement)':'REFLEX Environnement',
'REFLEX Environnement (REFLEX Environnement)':'REFLEX Environnement'
}})
.replace({'nom_prenom':{
'CBNA':'Conservatoire Botanique National Alpin',
'ONF':'Office National des Forêts',
'BÉGUIN Lucile':'BEGUIN Lucile',
'CEN AURA':'Conservatoire Régional des Espaces Naturels Rhône-Alpes',
'CD Isère':"Département de l'Isère"
}},regex=True))
pers_dict = dict(zip(refpers.nom_prenom,refpers.index))
siteidhab = gpd.pd.read_sql('''
SELECT DISTINCT id,id_site,id_cb,date,id_geom_site
FROM zones_humides.r_site_habitat
WHERE (id_site,id_cb,date,id_geom_site) IN {lst}
ORDER BY id_site,id DESC
'''.format(lst=tuple(tuple(ins_habF[['id_site','id_cb','date','id_geom_site']].itertuples(index=False,name=None)))),pycen.con)
hab_auth = (ins_habF[['id_site','auteur','id_cb','date']]
.astype(str)
.merge(siteidhab.astype(str), on=['id_site','id_cb','date'],how='left')
.rename(columns={'id':'id_sitehab'})
.set_index(['id_sitehab']))
hab_auth['orga'] = (hab_auth.auteur.str.split('(').str[-1]
.str.split(')').str[0])
test_auth = hab_auth.auteur.str.contains(',')
hab_auth1 = (hab_auth[~test_auth].auteur
.replace(pers_dict)
.to_frame('id_auteur'))
hab_auth_tmp = (hab_auth[test_auth]
.auteur.str.split('(').str[0]
.str.split(',')
.explode()
.str.strip()
.to_frame('auteur')
.merge(hab_auth.loc[test_auth,['orga']],left_index=True,right_index=True))
hab_auth2 = ((hab_auth_tmp.auteur+' ('+hab_auth_tmp.orga+')')
.replace({
'BURGEAP (BURGEAP, ECOSPHERE)':'BURGEAP',
'ECOSPHERE (BURGEAP, ECOSPHERE)':'Ecosphère',})
.replace(pers_dict)
.to_frame('id_auteur'))
(gpd.pd.concat([hab_auth1,hab_auth2])
.reset_index(drop=False)
.to_sql('r_rsitehab_auteur',pycen.con,schema='zones_humides',if_exists='append',index=False))
+153
View File
@@ -0,0 +1,153 @@
from pycen import zh as ZH
import geopandas as gpd
import pandas as pd
from sqlalchemy import create_engine
from sqlalchemy.engine import URL
import os
zh = ZH()
# isin_bdd = True
# # Parametres bdd CEN38 OUT
from pycen import con
lst_table = [
'r_sites_geom',
'r_site_critdelim',
'r_site_fctecosociopatri',
'r_site_habitat',
'r_site_reghydro',
'r_site_sub',
'r_site_type_connect',
'r_site_usageprocess',
]
result = {}
for table in lst_table:
sql_old = "SELECT max(t.id) FROM {sch}.{tab} t".format(tab=table,sch='sites' if table == 'r_sites_geom' else 'zones_humides')
if table == 'r_sites_geom':
sql_old += ' JOIN sites.sites ON sites.id = t.id_site AND sites.id_type_milieu = 1'
# else:
# sql_old += ''' JOIN sites.sites ON sites.id = r_sites_geom.id_site AND sites.id_type_milieu = 1'''
id_old = pd.read_sql(sql_old,con)
sql = "SELECT t.* FROM {sch}.{tab} t".format(tab=table,sch='sites' if table == 'r_sites_geom' else 'zones_humides')
if table == 'r_sites_geom':
sql += ' JOIN sites.sites ON sites.id = t.id_site AND sites.id_type_milieu = 1'
sql += " WHERE t.id > {id} AND id_site != '26PNRV0208'".format(id=id_old.values[0][0])
result[table] = pd.read_sql(sql,zh.con)
if table == 'r_sites_geom':
sql_lot = "SELECT * FROM sites.lots WHERE id_lot IN {id}".format(id=tuple(result[table].id_lot.dropna().unique()))
lot = pd.read_sql(sql_lot,zh.con).dropna(how='all',axis=1)
result[table] = result[table].merge(lot, on='id_lot',how='left')
r_geo = result['r_sites_geom']
sql = '''
with lots as (
SELECT DISTINCT ON (id_site)
id_site,lots.*
FROM sites.r_sites_geom
LEFT JOIN sites.lots USING (id_lot)
ORDER BY id_site, "date" DESC
)
SELECT v.*, lots.libelle FROM zones_humides.v_zoneshumides v
JOIN lots ON v.site_code = lots.id_site
WHERE v.site_code IN {lst_code}
'''.format(lst_code=str(tuple(r_geo.id_site.unique())))
vzh = gpd.read_postgis(sql,zh.con).dropna(subset=['libelle']).dropna(how='all',axis=1)
vzh_old = gpd.read_postgis('SELECT * FROM zones_humides.v_zoneshumides',con).dropna(how='all',axis=1)
vzh_new = gpd.read_postgis('SELECT * FROM zones_humides.v_zoneshumides',zh.con).dropna(how='all',axis=1)
date_cols = vzh.columns[vzh.columns.str.contains('date|heure')]
vzh[date_cols] = vzh[date_cols].astype(str)
vzh_old[['old_code',*date_cols]] = vzh_old[['old_code',*date_cols]].astype(str)
vzh_new[['old_code',*date_cols]] = vzh_new[['old_code',*date_cols]].astype(str)
PATH = '/home/colas/Documents/9_PROJETS/1_ZH/2024'
vzh_old.to_file(os.path.join(PATH,'20250415_avancement.gpkg'),driver='GPKG',layer='Inventaire_initiale')
vzh_new.to_file(os.path.join(PATH,'20250415_avancement.gpkg'),driver='GPKG',layer='Inv_actualisee_20250415')
for _lib in vzh.libelle.unique():
lib = (_lib.removesuffix('2024')
.removeprefix('ZH')
.replace('actualisation','CENIsere'))
tmp = vzh[vzh.libelle == _lib]
new = tmp[~tmp.site_code.isin(vzh_old.site_code.tolist())]
upt = tmp[tmp.site_code.isin(vzh_old.site_code.tolist())]
if not new.empty:
print(f'NEW {lib} : ',str(new.site_code.tolist()))
# new.to_file(os.path.join(PATH,'20250415_avancement.gpkg'),driver='GPKG',layer='newzh'+lib+str(new.shape[0]))
if not upt.empty:
print(f'UPDT {lib} : ',str(upt.site_code.tolist()))
# upt.to_file(os.path.join(PATH,'20250415_avancement.gpkg'),driver='GPKG',layer='majzh'+lib+str(upt.shape[0]))
vzh_reduc = (vzh[vzh.site_code.isin(vzh_old.site_code.tolist())].sort_values('site_code').set_index('site_code').area.sub(vzh_old[vzh_old.site_code.isin(vzh.site_code.tolist())].sort_values('site_code').set_index('site_code').area,fill_value=0))
vzh_reduc[vzh_reduc<0].sum() / 10000
vzh_reduc[vzh_reduc>0].sum() / 10000
area_maj = (vzh[vzh.site_code.isin(vzh_old.site_code.tolist())].area.sum() - vzh_old[vzh_old.site_code.isin(vzh.site_code.tolist())].area.sum()) / 10000
area_new = vzh[~vzh.site_code.isin(vzh_old.site_code.tolist())].area.sum() / 10000
cbna = vzh[vzh.libelle=='ZH_CBNA_2024']
new_cbna = cbna[(~cbna.site_code.isin(vzh_old.site_code.tolist()))&(vzh.libelle=='ZH_CBNA_2024')].area.sum() / 10000
maj_cbna = (cbna[cbna.site_code.isin(vzh_old.site_code.tolist())].area.sum() - vzh_old[vzh_old.site_code.isin(cbna.site_code.tolist())].area.sum()) / 10000
pgszh = vzh[vzh.libelle=='ZH_pgszhBelledonne_2024']
new_pgszh = pgszh[(~pgszh.site_code.isin(vzh_old.site_code.tolist()))&(vzh.libelle=='ZH_pgszhBelledonne_2024')].area.sum() / 10000
maj_pgszh = (pgszh[pgszh.site_code.isin(vzh_old.site_code.tolist())].area.sum() - vzh_old[vzh_old.site_code.isin(pgszh.site_code.tolist())].area.sum()) / 10000
evin = vzh[vzh.libelle=='ZH_EVINERUDE_2024']
new_evin = evin[(~evin.site_code.isin(vzh_old.site_code.tolist()))&(vzh.libelle=='ZH_EVINERUDE_2024')].area.sum() / 10000
maj_evin = (evin[evin.site_code.isin(vzh_old.site_code.tolist())].area.sum() - vzh_old[vzh_old.site_code.isin(evin.site_code.tolist())].area.sum()) / 10000
lst_attrs = []
r_geo = result['r_sites_geom']
for table in result.keys():
if table == 'r_sites_geom':
continue
df = result[table]
no_geo = df[~df.id_site.isin(r_geo.id_site.unique())]
lst_attrs += no_geo.id_site.unique().tolist()
lst_attrs = [x for x in list(set(lst_attrs)) if x is not None]
r_crit = result['r_site_critdelim']
r_fct = result['r_site_fctecosociopatri']
r_hab = result['r_site_habitat']
r_hyd = result['r_site_reghydro']
r_sub = result['r_site_sub']
r_connect = result['r_site_type_connect']
r_usg = result['r_site_usageprocess']
new_r_crit = r_crit[r_crit.id_site.isin(lst_attrs)]
new_r_fct = r_fct[r_fct.id_site.isin(lst_attrs)]
new_r_hab = r_hab[r_hab.id_site.isin(lst_attrs)]
new_r_hyd = r_hyd[r_hyd.id_site.isin(lst_attrs)]
new_r_sub = r_sub[r_sub.id_site.isin(lst_attrs)]
new_r_connect = r_connect[r_connect.id_site.isin(lst_attrs)]
new_r_usg = r_usg[r_usg.id_site.isin(lst_attrs)]
len_new_crit = new_r_crit.shape[0]
len_new_fct = new_r_fct.shape[0]
len_new_hab = new_r_hab.shape[0]
len_new_hyd = new_r_hyd.shape[0]
len_new_sub = new_r_sub.shape[0]
len_new_connect = new_r_connect.shape[0]
len_new_usg = new_r_usg.shape[0]
lst_new_crit = new_r_crit.id_site.unique().tolist()
lst_new_fct = new_r_fct.id_site.unique().tolist()
lst_new_hab = new_r_hab.id_site.unique().tolist()
lst_new_hyd = new_r_hyd.id_site.unique().tolist()
lst_new_sub = new_r_sub.id_site.unique().tolist()
lst_new_connect = new_r_connect.id_site.unique().tolist()
lst_new_usg = new_r_usg.id_site.unique().tolist()
tmp = gpd.read_file('/home/colas/Documents/9_PROJETS/1_ZH/MAJ/Actu 2024/BE EPODE - LEZE/KIT INVENTAIRE38 MODIFIE/a envoyer prêt/GEOM/38CG0105_Epode2025.gpkg')
tmp_old = gpd.read_postgis('SELECT * FROM zones_humides.v_zoneshumides WHERE site_code = \'38CG0105\'',con)
+20
View File
@@ -0,0 +1,20 @@
#!/usr/bin/env python3
# -*- coding:UTF-8 -*-
from pycen import con, update_to_sql
import geopandas as gpd
file = "/media/cgeier/SRV/FICHIERS/OUTILS/CARTOGRAPHIE/ESPACE DE TRAVAIL/ETUDES/PGSZH_Belledonne/Inventaire 2023/ZH_Belledonne_MAJ_2023_NB.shp"
df = gpd.read_file(file)
df = (df[df.site_code.isin(['38BB0028','38BB0055','38RD0170'])]
.filter(items=['site_code', 'geometry']))
df.rename_geometry('geom', inplace=True)
df.rename(columns={'site_code': 'id_site'}, inplace=True)
df_updt = df[df.id_site.isin(['38RD0170'])]
update_to_sql(df_updt,con,'r_sites_geom','sites','id_site')
df_ins = df[df.id_site.isin(['38BB0028','38BB0055'])]
df_ins['date'] = '2023-06-21'
df_ins.to_postgis('r_sites_geom',con,if_exists='append',index=False,schema='sites')
+146
View File
@@ -0,0 +1,146 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import geopandas as gpd
from pycen import con
path0 = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT/'
file = 'CDisère_PS2016_4Montagnes.shp'
dic = {
'identifian':'ident',
'habitat1' : 'code_hab1',
'partpoly1': 'n_hab1',
'habitat2' : 'code_hab2',
'partpoly2': 'n_hab2',
'habitat3' : 'code_hab3',
'partpoly3': 'n_hab3',
'habitat4' : 'code_hab4',
'partpoly4': 'n_hab4',
'légende':'legende',
'embrou_cod':'niv_embrous',
'embrous':'%_embrous',
'sol nu_cod':'recouvmnt',
'sol nu':'%_recouvmnt',
'orchidées':'rmq_phyto',
'alliance':'rmq_phytosocio',
'maec':'rmq_contract_agri',
}
dic_auth = {
'Anne-Lyse Murro':'MURRO Anne-Lyse',
'Lucas Berardi' : 'BERARDI Lucas'
}
dic_prat = {
'Mixte' : 'Fauche, Pâturage',
'Adandon':'Abandon',
'P�turage':'Pâturage'
}
dic_stat = {
'Aucun' : 'Non communautaire',
'Prioriataire' : 'Prioritaire'
}
dic_date = {
'mai 2016' : '2016-05-01',
'juin 2016' : '2016-06-01',
'juillet 2016' : '2016-07-01',
'aout 2016' : '2016-08-01',
'août 2016' : '2016-08-01',
}
keep_cols = ['auteur','date',*dic.values(),'rosette','pratique','statut','remarques','geom']
def emb_correct(df):
l1 = ['GIR3','AU7']
l2 = ['BOI1','VIL10','VIL8a']
l3 = ['MEA4a','ME']
l4 = ['MO3','MA3','VIL14','BD1','VF','CHA2','CHA5','ROM3']
l5 = ['BEL1','JA5','AU4']
df.loc[df.index.isin(l1),'niv_embrous'] = 1
df.loc[df.index.isin(l2),'%_embrous'] = 4
df.loc[df.index.isin(l3),'%_embrous'] = 29
df.loc[df.index.isin(l4),'%_embrous'] = 30
df.loc[df.index.isin(l5),'%_embrous'] = 60
return df
def sol_correct(df):
# df.loc[df.index=='GEY1','%_recouvmnt'] = 19
df.loc[df.index=='CHA5','%_recouvmnt'] = 21
# df.loc[df.index=='GEY2','%_recouvmnt'] = 19
# df.loc[df.index=='SN1','%_recouvmnt'] = 19
df.loc[df.index=='AU1','%_recouvmnt'] = 21
df.loc[(df.recouvmnt==1)&(df['%_recouvmnt']>0),'%_recouvmnt'] = 0
df.loc[(df.recouvmnt==2)&(df['%_recouvmnt']>10),'%_recouvmnt'] = 10
df.loc[(df.recouvmnt==3)&(df['%_recouvmnt']>20),'%_recouvmnt'] = 20
df.loc[(df.recouvmnt==4)&(df['%_recouvmnt']<21),'%_recouvmnt'] = 21
return df
# récupération des données
sql = 'SELECT site_code,geom FROM ps.v_pelouseseches'
v_ps = gpd.read_postgis(sql, con)
df0 = gpd.read_file(path0 + file)
df0.columns = df0.columns.str.lower()
df0.rename(columns=dic, inplace=True)
df0.rename_geometry('geom', inplace=True)
df = df0[keep_cols].copy()
df.set_index('ident', inplace=True)
df.pratique.replace(dic_prat,inplace=True)
df.statut.replace(dic_stat,inplace=True)
df.auteur.replace(dic_auth,inplace=True,regex=True)
df.date = df.date.str.lower()
df.date.replace(dic_date,inplace=True)
df.date = gpd.pd.to_datetime(df.date)
df = emb_correct(df)
df = sol_correct(df)
# Correction code Corine Biotope
df.loc[df.code_hab2=='41D','code_hab2'] = '41.D'
# Concaténation des remarques
df.loc[~df.rmq_phyto.isna(),'remarques'] = df.loc[~df.rmq_phyto.isna(),'remarques'] +\
'; rmq_phyto : ' + df.loc[~df.rmq_phyto.isna(),'rmq_phyto']
df.loc[~df.rosette.isna(),'remarques'] = df.loc[~df.rosette.isna(),'remarques'] +\
'; rosette : ' + df.loc[~df.rosette.isna(),'rosette']
df.loc[~df.rmq_phytosocio.isna(),'remarques'] = df.loc[~df.rmq_phytosocio.isna(),'remarques'] +\
'; rmq_phytosocio : ' + df.loc[~df.rmq_phytosocio.isna(),'rmq_phytosocio']
df.loc[~df.rmq_contract_agri.isna(),'remarques'] = df.loc[~df.rmq_contract_agri.isna(),'remarques'] +\
'; rmq_contract_agri : ' + df.loc[~df.rmq_contract_agri.isna(),'rmq_contract_agri']
del df['rmq_phyto']
del df['rosette']
del df['rmq_phytosocio']
del df['rmq_contract_agri']
df.reset_index(drop=False,inplace=True)
df.rename(columns={'ident':'id_origine'}, inplace=True)
df['table_org'] = file
df['structure'] = 'CD Isère'
# END SCRIPT #
## tri des géométries avant insertion
# Identification des superpositions new_site/old_site
df_inters = gpd.sjoin(df,v_ps, how='left')
del df_inters['index_right']
lst_old_site = df_inters.site_code.unique()
v_ps = v_ps[v_ps.site_code.isin(lst_old_site)].copy()
# Calcul du recouvrement
df.reset_index(drop=False,inplace=True)
v_ps.loc[:,'surf'] = v_ps.area
tmp = gpd.overlay(v_ps,df[['ident','geom']],how='intersection',make_valid=True)
tmp['perc_rcvmt'] = 100*tmp.area/tmp['surf']
tmp_sitemaj = tmp[(tmp.perc_rcvmt > 10)&(~tmp.ident.duplicated(keep=False))].ident
tmp_sitenew = tmp[tmp.perc_rcvmt <= 10].ident.unique()
site_newvsold = {
'old' : [*tmp.site_code.unique()],
'new' : [*tmp.ident.unique()],
}
df_new = df_inters[df_inters.site_code.isna()]
df_inters.drop(df_new.index,inplace=True)
df_maj = df_inters[~df_inters.site_code.duplicated(keep=False)]
df_inters.drop(df_maj.index,inplace=True)
df_rep = df_inters.copy()
df_new = gpd.pd.concat([df_new,df_rep],axis=0)
@@ -0,0 +1,70 @@
import geopandas as gpd
import os
import pycen
import numpy as np
path = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT'
file = 'PS_AGGREGATION_NB_AG.shp'
def split_auth(col):
return col.str.split(r' \(',expand=True).replace('\)','',regex=True)
def format_auth(col):
auth = pycen.pers.get_auteur()
for c in col.unique():
tmp = c.lower().split(' ')
cd1 = (np.array([tmp[0] == n for n in auth.nom.str.lower()]) |
np.array([tmp[0] == n for n in auth.prenom.str.lower()]))
cd2 = (np.array([tmp[1] == n for n in auth.nom.str.lower()]) |
np.array([tmp[1] == n for n in auth.prenom.str.lower()]))
r = auth[cd1&cd2].nom_prenom.values[0]
col.replace(c,r,inplace=True)
return col
if __name__ == "__main__":
df = gpd.read_file(os.path.join(path,file))
df.columns = df.columns.str.lower()
df.dropna(axis=1,how='all', inplace=True)
for c in df.columns:
if df[c].dtype == object:
df[c] = df[c].str.strip()
if 'date' in c :
df[c] = gpd.pd.to_datetime(df[c])
n_hab = df.columns[df.columns.str.startswith('n_hab')]
df[df[n_hab].sum(axis=1) != 100]
# Auteurs
df[['auteur_split','structure']] = split_auth(df.auteur)
df.auteur_split = format_auth(df.auteur_split)
del df['auteur']
df.rename(columns={'auteur_split':'auteur'},inplace=True)
# Pratiques
df.pratiques.replace([r' \/ '],r', ',regex=True,inplace=True)
df.pratiques.replace({
'paturage broyage':'pâturage, broyage',
'abandon paturage':'abandon, pâturage',
'paturage':'pâturage'
}, inplace=True)
df.type_patur.replace({'N.D':None
}, inplace=True)
cd3 = (df.pratiques=='pâturage')&(~df.type_patur.isna())
df.loc[cd3,'pratiques'] = df.loc[cd3,'pratiques'] +' '+ df.loc[cd3,'type_patur']
df.loc[cd3,'type_patur'] = None
cd4 = (~df.pratiques.isin(['pâturage','pâturage ?']))&(df.pratiques.str.contains('pâturage'))&(~df.type_patur.isna())
df.loc[cd4,'pratiques'] = df.loc[cd4,'pratiques'].str.split(', ',expand=True)[0] + ' ' + df.loc[cd4,'type_patur'] + ', ' + df.loc[cd4,'pratiques'].str.split(', ',expand=True)[1]
df.loc[cd4,'type_patur'] = None
df.pratiques.replace({
'pâturage caprin - ovin':'pâturage caprin, pâturage ovin',
'jardin':'tonte',
'pâturage anin' : 'pâturage asin',
'pâturage lama' : 'pâturage asin',
'abandon ?' : 'incertain',
'pâturage ?' : 'incertain'
}, inplace=True)
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import pandas as pd
import geopandas as gpd
import pycen
path0 = '/home/colas/Documents/9_PROJETS/2_PS/TO IMPORT/'
path = 'cartohabitatsplatiere/'
file = 'Habitats I33 2008.gpkg'
df = gpd.read_file(path0+path+file)
df.rename_geometry('geom', inplace=True)
if file == 'Habitats I33 2008.gpkg' :
df.columns = df.columns.str.lower()
df.rename(columns={'date_maj':'date'}, inplace=True)
df['remarques'] = \
'détails : ' + df['type_détaillé'] + ';' +\
' regroupement : ' + df['type_regroupé'] + ';'\
' code_n2000 : ' + df['code_n2000'] + ';'\
' age : ' + df['age'] + ';'
del df['id']
del df['code_enjeu']
del df['enjeu_numérique']
del df['complexe_hab']
del df['echelle']
del df['entretien']
del df['type_détaillé']
del df['type_regroupé']
del df['surface']
del df['num_site']
del df['code_n2000']
del df['age']
# df.set_index('num_site',inplace=True)
df['auteur'] = 'PONT Bernard'
df['structure'] = "AAIP"
lst_hab = ['34.1','34.3','34.4','34.7','35.2','62.3','64.1']
df = df[df.code_cb.str.contains('|'.join(lst_hab))]
lst_hab2 = ['41','42','43','44','81','82','83']
df = df[~df.code_cb.str.contains('|'.join(lst_hab2))]
df.replace({'IC':'Communautaire'}, inplace=True)
df.index.name = 'ident'
df.reset_index(inplace=True, drop=False)
df.rename(columns={'code_cb':'code_hab1'}, inplace=True)
df['n_hab1'] = 100
ps = pycen.ps.get_sitesGeom()
# nv = gpd.read_file(path0+'PS_nature_vivante_2014.shp')
# nv.geometry = nv.buffer(50)
intersect = gpd.sjoin(df,ps,op='intersects')['ident'].tolist()
drop_index = df[df['ident'].isin(intersect)].index
df.drop(drop_index,inplace=True)
df.reset_index(inplace=True, drop=True)
# df.to_file(path0+path+'Habitats I33 2008 (manquants).gpkg', driver='GPKG')
# df = gpd.read_file(path0+path+'Habitats I33 2008 (manquants).gpkg')
+9
View File
@@ -0,0 +1,9 @@
import geopandas as gpd
import os
if __name__ == "__main__":
from pycen import con
PATH = "/home/colas/Documents/9_PROJETS/1_ZH/MAJ/GERECO - Schéma_strat_ZH_Huez"
+14
View File
@@ -0,0 +1,14 @@
from pathlib import Path
from marshmallow import (
Schema,
fields,
validates_schema,
ValidationError,
post_load,
)
BACKEND_DIR = Path(__file__).absolute().parent.parent.parent
ROOT_DIR = BACKEND_DIR.parent
CUSTOM_STATIC_FOLDER = fields.String(load_default=ROOT_DIR / "1_Packages")
print(CUSTOM_STATIC_FOLDER)
+107
View File
@@ -0,0 +1,107 @@
# 2024-11-26
# LE script permet d'intégrer de nouvelles géométries
# dans la table sites.r_sites_geom. Les AUTEURS ont été
# intégrés manuellement.
import geopandas as gpd
from pycen import con, zh as ZH
from pycen.tools import dropZ, Polygons_to_MultiPolygon
from os import path
from matplotlib import pyplot as plt
zh = ZH()
r_geom = zh.get_sitesGeom()
r_geom = gpd.read_postgis('''
SELECT r_sites_geom.* FROM sites.r_sites_geom
JOIN sites.sites ON sites.id = r_sites_geom.id_site AND sites.id_type_milieu = 1
''',con)
r_geom.dropna(how="all",axis=1,inplace=True)
r_geom.drop(columns=['id','date_insert','id_origine','id_lot'],inplace=True)
PATH = '/home/colas/Documents/9_PROJETS/1_ZH/MAJ/Actu 2024/CBNA/zh38'
file = 'zh_to_integ.gpkg'
df = gpd.read_file(path.join(PATH,file))
df.rename_geometry('geom', inplace=True)
df = dropZ(df)
# DEL geo A SUPP
del_id=df[df.lien_zh=='A SUPP'].index.tolist()
df.drop(del_id,inplace=True)
lstdel_id2 = [
'38RH0171','38RH0066','38RH0077','38BO0144','38BO0109',
'38BO0105','38RH0012','38BO0139','38BO0200','38RH0292',
'38BO0105 + combl vid'
]
del_id2 = df[df.lien_zh.isin(lstdel_id2)].index.tolist()
df.drop(del_id2,inplace=True)
lstdel_id3 = [
'38RH0293', '38RH0297', '38RH0296', '38RH0294', '38BO0331',
'38RH0295'
]
del_id3 = df[df.lien_zh.isin(lstdel_id3)].index.tolist()
df.drop(del_id3,inplace=True)
ins = df[df.lien_zh!='aucun'].copy()
ins.lien_zh.unique()
# # Fait
# r_geom[r_geom.id_site=='38RH0171']
# r_geom[r_geom.id_site=='38RH0066']
# r_geom[r_geom.id_site=='38RH0077']
# r_geom[r_geom.id_site=='38BO0144']
# r_geom[r_geom.id_site=='38BO0109']
# r_geom[r_geom.id_site=='38BO0105']
# r_geom[r_geom.id_site=='38RH0012']
# # Fait, Ne pas reproduire.
# BO139 = r_geom[r_geom.id_site=='38BO0139'].copy()
# BO200 = r_geom[r_geom.id_site=='38BO0200'].copy()
# RH292 = r_geom[r_geom.id_site=='38RH0292'].copy()
# BO139.date = '2024-11-26'
# BO200.date = '2024-11-26'
# RH292.date = '2024-11-26'
# BO139.geom = gpd.GeoSeries([
# BO139.geom.values[-1],
# *ins[ins.lien_zh=='38BO0139'].geom.values
# ],crs=2154).unary_union
# BO200.geom = gpd.GeoSeries([
# BO200.geom.values[-1],
# *ins[ins.lien_zh=='38BO0200'].geom.values
# ],crs=2154).unary_union
# RH292.geom = gpd.GeoSeries([
# RH292.geom.values[-1],
# *ins[ins.lien_zh=='38RH0292'].geom.values
# ],crs=2154).unary_union
# Polygons_to_MultiPolygon(BO139).to_postgis('r_sites_geom',con,schema='sites',if_exists='append',index=False)
# Polygons_to_MultiPolygon(BO200).to_postgis('r_sites_geom',con,schema='sites',if_exists='append',index=False)
# Polygons_to_MultiPolygon(RH292).to_postgis('r_sites_geom',con,schema='sites',if_exists='append',index=False)
# Traitement zh id3
gdf = gpd.GeoDataFrame()
for i in ins.lien_zh.unique():
if i == 'A prospecter':
continue
tmp = gpd.GeoDataFrame(
{'site_code':[i]},
geometry=[ins[ins.lien_zh==i].unary_union],
crs=2154
).rename_geometry('geom')
gdf = gpd.pd.concat([gdf,tmp])
# Traitement ZH id4, après tri des données avec Mathieu Juton
df = gpd.read_file(path.join(PATH,file),layer='zh_to_integ')
df.rename_geometry('geom', inplace=True)
del_id=df[df.lien_zh=='A SUPP'].index.tolist()
df.drop(del_id,inplace=True)
id_updtgeo = [
'38BI0086', '38BO0128', '38BO0160 + remove trou', '38BO0181',
'38BO0182', '38CG0001', '38CG0002', '38CG0019',
'38CG0023 + bouche trou', '38CG0025 + remove vide', '38CG0027',
'38CG0031', '38CG0147', '38CG0148', '38RH0054', '38RH0076',
'38RH0122', '38RH0123 + remove vide', '38RH0132 + remove vide',
'38RH0135 + remove route', '38RH0143', '38RH0148',
'38RH0148 + remove route'
]
File diff suppressed because it is too large Load Diff
+173
View File
@@ -0,0 +1,173 @@
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from statistics import geometric_mean
import geopandas as gpd
from shapely import wkb
from pycen import con,con_bdcen,update_to_sql
from pycen.tools import Polygons_to_MultiPolygon
from sys import exit
def recreate_history(n_site,o_site):
req = '''
UPDATE sites.sites SET date_fin = (
SELECT max(date_deb) FROM sites.sites WHERE id IN ('{site_new}')
) WHERE "id" IN ('{site_old}');
INSERT INTO sites.r_site_maj (id_site_new,id_site_old) VALUES ('{site_new}','{site_old}');
'''.format(site_new=n_site,site_old=o_site)
with con.begin() as cnx:
cnx.execute(req)
def modif_geomcover(old_geom, new_geom,how='maj',rcv=0.999):
# print(i)
sql = """
with w1 as (
SELECT s1.site_code, s1.geom geom_in, ST_ExteriorRing((ST_Dump(ST_Buffer(s2.geom,0.001))).geom) geom_split, s2.geom geom_over
FROM (select * from ps.v_pelouseseches where site_code = '{geom_old}') s1, (select * from ps.v_pelouseseches where site_code = '{geom_new}') s2
),
w2 as (
SELECT site_code, geom_in, ST_Collect(geom_split) geom_split, geom_over from w1 group by 1,2,4
),
w3 as (
SELECT site_code, geom_in,round(st_area(geom_in)) area_in, (ST_Dump(ST_Split(geom_in,geom_split))).geom geom_split, geom_over from w2
)
SELECT site_code, geom_in,area_in,round(st_area(st_union(geom_split))) area_split, st_multi(st_union(geom_split)) geom_split, geom_over from w3
WHERE ST_Within(geom_split,ST_Buffer(geom_over,0.02)) = False
group by 1,2,3,6;
""".format(geom_old=old_geom,geom_new=new_geom)
res_split = gpd.read_postgis(sql,con, geom_col='geom_split')
res_split.geom_in = [wkb.loads(x,hex=True) for x in res_split.geom_in]
res_split.set_geometry('geom_in',inplace=True, crs=2154)
if res_split.empty:
print([old_geom,new_geom,'EMPTY'])
else:
if res_split.area_split[0] < (res_split.area_in[0]*rcv) :
spl = res_split.area_split[0]
_in = res_split.area_in[0]
print([old_geom,new_geom,_in,spl,(_in/spl)])
# continue
# raise ValueError(j)
else:
# print('OK')
gdf = gpd.read_postgis("SELECT * FROM sites.r_sites_geom WHERE id_site = '%s'"%old_geom, con)
# df_aut = gpd.pd.read_sql_query('')
gdf.date = gpd.pd.to_datetime(gdf.date)
gdf.geom = res_split.geom_split
if how=='maj':
gdf = gdf.loc[gdf.groupby('id_site').date.idxmax(),['id','geom']]
update_to_sql(gdf, con, 'r_sites_geom', 'sites', 'id')
elif how=='insert':
gdf = gdf.loc[gdf.groupby('id_site').date.idxmax()]
gdf.drop(columns=['id','date_insert'],inplace=True,errors='ignore')
gdf.to_postgis(
name='r_sites_geom', con=con, schema='sites', if_exists='append', geom_col='geom'
)
print('END insert')
else:
raise ValueError([old_geom, new_geom])
sql = """SELECT
v1.site_code site_code_old, v1.geom geom_old, v2.site_code site_code_new, v2.geom geom_new,
v1."source" source_old,v2."source" source_new, v1.id_origine orig_old,v2.id_origine orig_new
FROM ps.v_pelouseseches v1, ps.v_pelouseseches v2
WHERE ST_OVERLAPS(v1.geom,v2.geom) = TRUE
AND v1.date_geom < v2.date_geom
AND v1.site_code <> v2.site_code;"""
df = gpd.read_postgis(sql,con,geom_col='geom_new')
df.geom_old = [wkb.loads(x,hex=True) for x in df.geom_old]
df.set_geometry('geom_old',inplace=True, crs=2154)
v_ps = gpd.read_postgis('SELECT * FROM ps.v_pelouseseches', con)
sql = """SELECT
v1.site_code site_code_old, v1.geom geom_old, v2.site_code site_code_new, v2.geom geom_new,
v1."source" source_old,v2."source" source_new, v1.id_origine orig_old,v2.id_origine orig_new
FROM ps.v_pelouseseches v1, ps.v_pelouseseches v2
WHERE ST_OVERLAPS(v1.geom,v2.geom) = TRUE
AND v1.date_geom = v2.date_geom
AND v1.site_code <> v2.site_code;"""
dfx = gpd.read_postgis(sql,con,geom_col='geom_new')
print(dfx.shape[0])
dfx.apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new,how='maj',rcv=0.999),axis=1)
idem = df[(df.geom_old.area.round()/df.geom_new.area.round()).between(0.98,1.02) & (df.source_old=='cr_CHARTREUSE_habitats_CBNA_2000-2012')]
idem.apply(lambda x: recreate_history(o_site=x.site_code_old,n_site=x.site_code_new),axis=1)
df[df.source_old=='cr_VERCORS_habitats_CBNA_1999-2007']\
.apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new,how='maj',rcv=0.999),axis=1)
df[df.source_old=='cr_VERCORS_habitats_CBNA_1999-2007']\
.apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new,how='insert',rcv=0.9),axis=1)
# modif_geomcover('38VERC0654', '38VERC4644',how='insert',rcv=0.9)
# recreate_history(o_site='38VERC0760',n_site='38VERC3866')
# recreate_history(o_site='38VERC0712',n_site='38VERC3859')
# recreate_history(o_site='38VERC0687',n_site='38VERC3756')
# recreate_history(o_site='38VERC0779',n_site='38VERC3768')
# recreate_history(o_site='38VERC4193',n_site='38VERC4635')
# recreate_history(o_site='38VERC4204',n_site='38VERC4637')
# recreate_history(o_site='38VERC4242',n_site='38VERC4642')
# recreate_history(o_site='38VERC4253',n_site='38VERC4644')
# recreate_history(o_site='38VERC4258',n_site='38VERC4645')
# recreate_history(o_site='38CHAR0735',n_site='38CHAR0045')
# recreate_history(o_site='38CHAR0766',n_site='38GRES0136')
# recreate_history(o_site='38CHAR0694',n_site='38VERC0215')
# recreate_history(o_site='38TRIE2441',n_site='38TRIE1337')
# recreate_history(o_site='38VERC0651',n_site='38VERC3762')
# recreate_history(o_site='38VERC0663',n_site='38VERC3846')
# recreate_history(o_site='38VERC0671',n_site='38VERC3849')
# recreate_history(o_site='38VERC0672',n_site='38VERC3851')
# recreate_history(o_site='38VERC4260',n_site='38VERC4646')
# recreate_history(o_site='38VERC4268',n_site='38VERC4647')
# recreate_history(o_site='38VERC4270',n_site='38VERC4648')
# recreate_history(o_site='38CHAR0677',n_site='38CHAR0100')
# recreate_history(o_site='38CHAR0699',n_site='38CHAR0072')
# recreate_history(o_site='38CREM0404',n_site='38CREM0104')
# recreate_history(o_site='38CREM0405',n_site='38CREM0105')
# recreate_history(o_site='38CREM0412',n_site='38CREM0178')
# recreate_history(o_site='38CREM0417',n_site='38CREM0114')
# recreate_history(o_site='38CREM0420',n_site='38CREM0064')
# recreate_history(o_site='38VERC0735',n_site='38VERC3862')
# recreate_history(o_site='38VERC0744',n_site='38VERC3764')
# recreate_history(o_site='38VERC0753',n_site='38VERC3865')
# recreate_history(o_site='38VERC1194',n_site='38VERC3735')
# recreate_history(o_site='38VERC1198',n_site='38VERC3736')
# recreate_history(o_site='38VERC1207',n_site='38VERC3738')
# recreate_history(o_site='38TRIE1015',n_site='38VERC3714')
# recreate_history(o_site='38TRIE2467',n_site='38TRIE2630')
# recreate_history(o_site='38PCHA0994',n_site='38GRES0844')
# recreate_history(o_site='38PCHA0994',n_site='38GRES0844')
# recreate_history(o_site='38VERC1236',n_site='38VERC4705')
# recreate_history(o_site='38VERC1233',n_site='38VERC4706')
# recreate_history(o_site='38VERC1242',n_site='38VERC1237')
# recreate_history(o_site='38VERC1243',n_site='38VERC4726')
# recreate_history(o_site='38VERC1260',n_site='38VERC4724')
# recreate_history(o_site='38VERC4027',n_site='38VERC4743')
# recreate_history(o_site='38VERC4085',n_site='38VERC4084')
# for i,j in df.iterrows():
# update_to_sql(gdf, con, 'r_sites_geom', 'sites', 'id')
df.apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new),axis=1)
# df.iloc[57:].apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new),axis=1)
df2 = df[df.source_old=='PS_Beaumont_2018_Drac_Nature.shp']
df2 = df[df.source_old=='cr_VERCORS_habitats_CBNA_1999-2007']
df2.apply(lambda x: modif_geomcover(old_geom=x.site_code_old,new_geom=x.site_code_new),axis=1)
# 38TRIE0678 38TRIE0721
vrc = df[df.source_old=='cr_VERCORS_habitats_CBNA_1999-2007'].copy()
s_vrc = gpd.read_postgis('SELECT * FROM pelouse_seche."ps_TRIEVES+VERCORS_habitats_CBNA_2014";',con=con_bdcen)
p_vrc = gpd.read_postgis('SELECT v.*,ST_PointOnSurface(v.geom) geom_point FROM pelouse_seche."ps_TRIEVES+VERCORS_habitats_CBNA_2014" v;',con=con_bdcen, geom_col='geom_point')
pvrc = gpd.read_postgis("SELECT v.*,ST_PointOnSurface(v.geom) geom_point FROM ps.v_pelouseseches v WHERE v.site_code IN ('%s');"%("','".join(vrc.site_code_old)),con=con, geom_col='geom_point')
t1 = s_vrc.geom.intersects(pvrc.geom_point.unary_union)
t2 = p_vrc.geom_point.intersects(vrc.geom_old.unary_union)
INS = s_vrc[t1|t2].copy()
INS.to_postgis(
'ps_covered',con,geom_col='geom',if_exists='replace'
)
+75
View File
@@ -0,0 +1,75 @@
from pycen import (
v_pelouseseches as ps,
con, con_bdcen,
update_to_sql
)
import geopandas as gpd
def update_psInf1200(df):
from rasterstats import zonal_stats
path0 = '/home/cgeier/Documents/9_PROJETS/2_PS/'
path2_mnt = path0+'MNT/'
file_mnt5 = 'MNT_5m.tif'
zonal_tmp = zonal_stats(df,path2_mnt+file_mnt5,stats="max",nodata=0,all_touched=True)
zonal = gpd.pd.DataFrame(zonal_tmp)
zonal.columns = ['max_alti']
tmp = gpd.pd.concat([df.reset_index(drop=True),zonal], axis=1)
tmp = tmp.set_geometry('geom', crs=2154)
tmp['infeq_1200'] = tmp.max_alti <= 1200
PS = (tmp[['site_code','infeq_1200']]
.rename(columns={'site_code':'id_site'},errors='ignore')
)
PS.to_sql('r_infeq_1200m',con,'ps',if_exists='append',index=False)
# update_to_sql(PS,con,'r_infeq_1200m','ps','id_site')
ps_all = gpd.read_postgis('''
SELECT vp.*,s7.infeq_1200
FROM ps."v_pelouseseches_all" vp
LEFT JOIN ps.r_infeq_1200m s7 ON vp.site_code::text = s7.id_site::text
ORDER BY vp.site_code DESC NULLS LAST;
''', con)
isnot_1200 = ps_all.infeq_1200.isna()
ps_all[~ps_all.infeq_1200]
update_psInf1200(ps_all[isnot_1200])
metro = gpd.read_file("/home/colas/Documents/tmp/PS_ACTU_METRO/Perimètre_GAM.geojson")
metro.rename_geometry('geom', inplace=True)
ps_agg = gpd.read_postgis('SELECT * FROM "pelouse_seche"."c_ps_inventaire_agreg"',con_bdcen)
ps_vps = gpd.read_postgis('SELECT * FROM ps."v_pelouseseches"',con)
ps_noalti = gpd.read_postgis('SELECT * FROM ps."v_pelouseseches_noalti"',con)
psdate_cols = ps_all.columns[ps_all.columns.str.startswith('date')]
ps_metro = ps_vps[ps_vps.intersects(metro.unary_union)].copy()
ag_metro = ps_agg[ps_agg.intersects(metro.unary_union)].copy()
is_cbna = ps_metro.source.str.contains('CBNA',na=False)
is_agg = ps_metro.id_origine.isin(ag_metro.id.tolist())
not_intersect = ~ps_metro.centroid.intersects(ag_metro.buffer(0).unary_union)
ps_metro_cbna = ps_metro[is_cbna].copy()
termo = ps_metro[not_intersect & is_cbna].copy()
ps_metro[psdate_cols] = ps_metro[psdate_cols].astype(str)
termo[psdate_cols] = termo[psdate_cols].astype(str)
termo.to_file('/home/colas/Documents/tmp/PS_ACTU_METRO/ps_actu_metro.gpkg',layer='ps_termo',driver='GPKG')
ps_metro.to_file('/home/colas/Documents/tmp/PS_ACTU_METRO/ps_actu_metro.gpkg',layer='ps_metro',driver='GPKG')
ag_metro.to_file('/home/colas/Documents/tmp/PS_ACTU_METRO/ps_actu_metro.gpkg',layer='ag_metro',driver='GPKG')
ps_termo = gpd.read_file('/home/colas/Documents/tmp/PS_ACTU_METRO/ps_actu_metro.gpkg',layer='ps_termo')
updt_termo = ps_termo[['site_code']].copy()
updt_termo.columns = ['id']
updt_termo['id_type_milieu'] = 99
update_to_sql(updt_termo,con,'sites','sites','id')
+61
View File
@@ -0,0 +1,61 @@
from pycen import con
sql1 = """
DROP VIEW IF EXISTS zones_humides.v_zh_ponctuelles;
CREATE VIEW zones_humides.v_zh_ponctuelles AS
SELECT
id,
territoire,
commune,
lieu_dit,
observer,
datemodif,
x,
y,
code_insee,
descripti2,
geom,
qui,
statut,
source,
comment,
type,
ponctuelle,
classe
FROM zones_humides.zh_ponctuelles
WHERE in_zh is False
"""
with con.begin() as cnx:
cnx.execute(sql1)
sql1 = """
DROP VIEW IF EXISTS zones_humides.v_zh_ponctuelles;
CREATE VIEW zones_humides.v_zh_ponctuelles AS
SELECT
id,
territoire,
commune,
lieu_dit,
observer,
datemodif,
x,
y,
code_insee,
descripti2,
geom,
qui,
statut,
source,
comment,
type,
ponctuelle,
classe
FROM zones_humides.zh_ponctuelles
WHERE in_zh is True
"""
with con.begin() as cnx:
cnx.execute(sql1)