#!/usr/bin/env python # -*- coding: UTF-8 -*- # library pandas geopandas sqlalchemy psycopg2-binary openpyxl from calendar import c from os import getlogin import pandas as pd import geopandas as gpd from sqlalchemy.sql import text from sqlalchemy.engine import URL from sqlalchemy import create_engine from pycen import con_bdcen as con, con_fon from functools import reduce annee = 2022 path_source = '/media/{login}/SRV/FICHIERS/OUTILS/BASES DE DONNEES/BILAN_FEDE_CEN/{an}/Docs_SIG_joints{an}/Docs_SIG_joints{an}/'.format(login=getlogin(),an=annee) dico_data = 'Dico_DATA_sites_CEN_v%i_v1.xlsx' % annee sheet_par = 'parcelles_cen_XX_%i' % annee sheet_sit = 'sites_cen_XX_%i' % annee lv_cen = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=1, usecols='A:D',nrows=25) lv_typmaitr = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=1, usecols='F:K',nrows=23) lv_typmilie = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=1, usecols='M:N',nrows=16) lv_echelnum = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=1, usecols='P:Q',nrows=8) lv_typhab = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=13, usecols='P:Q',nrows=5) lv_sourcegeom = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=1, usecols='S:U',nrows=12) lv_lienres = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=20, usecols='M:N',nrows=4) lv_typprop = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=45, usecols='A:H',nrows=12) lv_codgeol = pd.read_excel(path_source+dico_data,sheet_name='listes_valeurs (copy&modif)',header=36, usecols='M:T',nrows=19) lst_cols_parc = pd.read_excel(path_source+dico_data,sheet_name=sheet_par,header=0, usecols='F',nrows=26)\ ['nom du champ'].tolist() user = 'postgres' pwd = 'postgres' adr = '172.17.0.2' base = 'postgres' url = URL.create('postgresql+psycopg2', username=user, password=pwd, host=adr, database=base, ) con_vm = create_engine(url) fadd = '/home/colas/Documents/tmp/FONCIER_FEDE/add_parc.gpkg' add = gpd.read_file(fadd) sql0 = '''SELECT t1.geo_parcelle, substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) par_id, t1.annee, t1.update_dat, t4.ccopre, t4.ccosec, t4.dcntpa, t1.geom, STRING_AGG(t3.gtoper::text,',') gtoper, STRING_AGG(t3.ccogrm::text,',') ccogrm, STRING_AGG(CONCAT(t3.gtoper::text||COALESCE('_'||t3.ccogrm::text,'')),',') type_prop, STRING_AGG(t3.ddenom::text,',') ddenom FROM "{sch}"."{t1}" t1 LEFT JOIN ("{sch}".parcelle_info t2 LEFT JOIN "{sch}".proprietaire t3 USING (comptecommunal)) USING (geo_parcelle) LEFT JOIN "{sch}".parcelle t4 ON t1.geo_parcelle = t4.parcelle '''.format( sch='38_202207', t1='v_geo_parcelle') sql1 = '''WHERE substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) IN ('%s') GROUP BY 1,2,3,4,5,6,7,8'''%"','".join(add.par_id) sql = sql0 + sql1 parcx = gpd.read_postgis(text(sql),con=con_vm) cols_parcx = parcx.columns for col in ['ccopre','ccosec','type_prop','ddenom'] : parcx[col] = parcx[col].str.strip() parcx[col] = parcx[col].replace('',None) parcx.loc[parcx.ccopre.isna(),'ccopre'] = parcx.loc[parcx.ccopre.isna(),'par_id'].str[5:8] parcx.loc[parcx.ccosec.isna(),'ccosec'] = parcx.loc[parcx.ccosec.isna(),'par_id'].str[8:10] parcx.loc[parcx.ccosec.str.len()==1,'ccosec'] = '0'+parcx.loc[parcx.ccosec.str.len()==1,'ccosec'] parcx.loc[parcx.dcntpa.isna(),'dcntpa'] = parcx.loc[parcx.dcntpa.isna(),'geom'].area.round().astype(int) parcx.loc[parcx.gtoper.isna(),['gtoper','ccogrm','type_prop']] = ['2','0','2_0'] parcx.loc[parcx.par_id=='380740000B0705','ddenom'] = "CONSERVATOIRE D'ESPACES NATURELS ISERE" parcx.dcntpa = parcx.dcntpa.astype(int) ###### Récupération des parcelles RN île de la Platière f_plaRN = '/home/colas/Documents/tmp/FONCIER_FEDE/PLATIERE/Maitrise_Foncier_RN.shp' f_plaENS = '/home/colas/Documents/tmp/FONCIER_FEDE/PLATIERE/Maitrise_Foncier_ENS.shp' RNNP_rn = gpd.read_file(f_plaRN) RNNP_ens = gpd.read_file(f_plaENS) RNNP_rn.rename_geometry('geom',inplace=True) RNNP_ens.rename_geometry('geom',inplace=True) RNNP_rn.rename(columns={'Date_sign':'annee_acq','surf_acqui':'surface_ac','surf_parce':'superficie'},inplace=True) RNNP_ens.rename(columns={'code_commu':'code_comm','année_acq':'annee_acq','année':'anne'},inplace=True) RNNP_rn = RNNP_rn[RNNP_rn.code_comm.str.len()==5] RNNP_ens = RNNP_ens[RNNP_ens.code_comm.str.len()==5] RNNP_rn['section'] = RNNP_rn.parcelle.str[:2] RNNP_ens['section'] = RNNP_ens.parcelle.str[:2] RNNP_rn['num_parc'] = RNNP_rn.parcelle.str[2:] RNNP_ens['num_parc'] = RNNP_ens.parcelle.str[2:] RNNP_rn['num_parc'] = RNNP_rn['num_parc'].str.strip() RNNP_ens['num_parc'] = RNNP_ens['num_parc'].str.strip() RNNP_rn.loc[RNNP_rn.num_parc.str.len()==1,'num_parc'] = '000' + RNNP_rn.loc[RNNP_rn.num_parc.str.len()==1,'num_parc'] RNNP_rn.loc[RNNP_rn.num_parc.str.len()==2,'num_parc'] = '00' + RNNP_rn.loc[RNNP_rn.num_parc.str.len()==2,'num_parc'] RNNP_rn.loc[RNNP_rn.num_parc.str.len()==3,'num_parc'] = '0' + RNNP_rn.loc[RNNP_rn.num_parc.str.len()==3,'num_parc'] RNNP_ens.loc[RNNP_ens.num_parc.str.len()==1,'num_parc'] = '000' + RNNP_ens.loc[RNNP_ens.num_parc.str.len()==1,'num_parc'] RNNP_ens.loc[RNNP_ens.num_parc.str.len()==2,'num_parc'] = '00' + RNNP_ens.loc[RNNP_ens.num_parc.str.len()==2,'num_parc'] RNNP_ens.loc[RNNP_ens.num_parc.str.len()==3,'num_parc'] = '0' + RNNP_ens.loc[RNNP_ens.num_parc.str.len()==3,'num_parc'] RNNP_rn.loc[RNNP_rn.code_comm.str.startswith('39'),'code_comm'] = '39' + RNNP_rn.loc[RNNP_rn.code_comm.str.startswith('39'),'code_comm'].str[2:] RNNP_ens.loc[RNNP_ens.code_comm.str.startswith('39'),'code_comm'] = '39' + RNNP_ens.loc[RNNP_ens.code_comm.str.startswith('39'),'code_comm'].str[2:] RNNP_rn['par_id'] = RNNP_rn.code_comm+'000'+RNNP_rn.section+RNNP_rn.num_parc RNNP_ens['par_id'] = RNNP_ens.code_comm+'000'+RNNP_ens.section+RNNP_ens.num_parc lst_par_id_rnnp = [*RNNP_rn.par_id,*RNNP_ens.par_id] RNNP = pd.concat([RNNP_rn,RNNP_ens]) RNNP['surf_parc_maitrise_m2'] = RNNP.surface_ac RNNP['pour_part'] = 0 RNNP.loc[(~RNNP.proportion.isna())&(RNNP.proportion!=100),'pour_part'] = 1 # Récup après, cf. dfgere frnnp_tofede = '/home/colas/Documents/tmp/FONCIER_FEDE/PLATIERE/parcelles_RNNP_tofede.gpkg' rnnp_tofede = gpd.read_file(frnnp_tofede,layer='parcelles_RNNP_tofede') rnnp_tofede.rename_geometry('geom', inplace=True) rnnp_tofede['id_site_cen_parc'] = 0 rnnp_tofede['id_site_fcen_parc'] = None # OK rnnp_tofede['insee_dep'] = rnnp_tofede.par_id.str[:2] rnnp_tofede['insee_com'] = rnnp_tofede.par_id.str[2:5] rnnp_tofede['num_section'] = rnnp_tofede.ccosec rnnp_tofede['num_parcelle'] = rnnp_tofede.par_id # rnnp_tofede['code_mfu1'] = None # Récup après, cf. dfgere # rnnp_tofede['code_mfu2'] = None # Récup après, cf. dfgere # rnnp_tofede['type_prop'] = None # Récup après, cf. parcb # rnnp_tofede['mesure_compens'] = None # Récup après, cf. dfgere rnnp_tofede['surf_ore_m2'] = 0 rnnp_tofede['date_debut_ore'] = None rnnp_tofede['date_fin_ore'] = None rnnp_tofede['doc_foncier'] = 0 rnnp_tofede['source_doc_foncier'] = 0 rnnp_tofede['parc_gestion_rnx'] = 0 rnnp_tofede['parc_gestion_rnx'] = 1 rnnp_tofede['surf_parc_maitrise_m2'] = rnnp_tofede.dcntpa rnnp_tofede['source_geom_parc_nature'] = 2 rnnp_tofede['source_geom_parc_annee'] = None # Récup après, cf. parcb rnnp_tofede['echelle_num_parc'] = 0 rnnp_tofede['source_surf_parc'] = 1 # OK rnnp_tofede['date_maj_parcelle'] = None # Récup après, cf. parcb rnnp_tofede['bnd'] = None # Récup après, cf. dfgere rnnp_tofede['pour_part'] = None # Récup après, cf. dfgere rnnp_tofede['domaine_public'] = 0 rnnp_tofede['id_proprietaire'] = None # Récup après, cf. parcb # RNNP_ens[(~RNNP_ens.num_parcel.isna())&(RNNP_ens.num_parcel!=RNNP_ens.parcelle)] ###### Récupération des données conservatoires sqlsit = '''SELECT * FROM %s.%s WHERE date_fin is NULL OR date_fin >= '%i-01-01' ;'''%('sites','c_sites_zonages',annee) dfsite = gpd.read_postgis(sql=sqlsit,geom_col='geom',con=con) # Isolation de tous les sites CEN (gestion/assist/mili) dfsite[ ~dfsite.code_site.duplicated()|\ (dfsite.code_site.duplicated() & dfsite.type_zonage == 'ZI') ] rngl = dfsite[(dfsite.code_site=='RNGL')&(dfsite.type_zonage=='ZI')] sqlfon = 'SELECT * FROM %s.%s'%('foncier','c_animation_fonciere_sites') dffonc = gpd.read_postgis(sql=sqlfon,geom_col='geom',con=con) ##### Données identifiées pour les remontées fédé ffede = '/home/colas/Documents/tmp/FONCIER_FEDE/extract_parc_for_fede.gpkg' tofede = gpd.read_file(ffede) tofede.rename_geometry('geom', inplace=True) cols_tofede = tofede.columns cols_join = [*cols_parcx[cols_parcx.isin(cols_tofede)]] tofede = pd.concat([tofede,parcx[cols_join]],ignore_index=True) tofede.reset_index(drop=True,inplace=True) if 'type_prop' in tofede.columns: tofede.drop(columns=['type_prop'], inplace=True) # tofede['id_site_cen_parc'] = 0 tofede['id_site_fcen_parc'] = None # OK tofede['insee_dep'] = tofede.par_id.str[:2] tofede['insee_com'] = tofede.par_id.str[2:5] tofede['num_section'] = tofede.ccosec tofede['num_parcelle'] = tofede.par_id # tofede['code_mfu1'] = None # Récup après, cf. dfgere # tofede['code_mfu2'] = None # Récup après, cf. dfgere # tofede['type_prop'] = None # Récup après, cf. parcb # tofede['mesure_compens'] = None # Récup après, cf. dfgere tofede['surf_ore_m2'] = 0 tofede['date_debut_ore'] = None tofede['date_fin_ore'] = None tofede['doc_foncier'] = 0 tofede['source_doc_foncier'] = 0 tofede['parc_gestion_rnx'] = 0 tofede.loc[tofede.geom.intersects(rngl.unary_union),'parc_gestion_rnx'] = 1 tofede['surf_parc_maitrise_m2'] = tofede.dcntpa tofede['source_geom_parc_nature'] = 2 # tofede['source_geom_parc_annee'] = None # Récup après, cf. parcc tofede['echelle_num_parc'] = 0 tofede['source_surf_parc'] = 1 # OK # tofede['date_maj_parcelle'] = None # Récup après, cf. parcc # tofede['bnd'] = None # Récup après, cf. dfgere # tofede['pour_part'] = None # Récup après, cf. dfgere tofede['domaine_public'] = 0 # tofede['id_proprietaire'] = None # Récup après, cf. parcb # c_fede = tofede[['par_id','geom']].copy() # c_fede.geom = tofede.representative_point() # pb_parcel = dffonc[~dffonc.intersects(c_fede.unary_union)] # c_fede.to_file('/home/colas/Documents/tmp/FONCIER_FEDE/centroid_parcelle_for_fede.gpkg', driver="GPKG") # pb_parcel.to_file('/home/colas/Documents/tmp/FONCIER_FEDE/polys_NoIntersect_parcelles.gpkg', driver="GPKG") ###### Récupération des données conservatoires # sqlsit = 'SELECT * FROM %s.%s'%('sites','c_sites_zonages') # dfsite = gpd.read_postgis(sql=sqlsit,geom_col='geom',con=con) sqlfon = 'SELECT * FROM %s.%s'%('foncier','c_animation_fonciere_sites') dffonc = gpd.read_postgis(sql=sqlfon,geom_col='geom',con=con) # dffonc.drop(columns=[], inplace=True) #### 1 geom devient 2 # id 7037 dffonc.loc[dffonc.id==7037, ['code_dep','code_com','section','numero','geom']] = tofede.loc[tofede.par_id=='381000000A2233',['insee_dep','insee_com','num_section','dnupla','geom']].values[0] add_p = gpd.GeoDataFrame( [tofede.loc[tofede.par_id=='381000000A2234',['insee_dep','insee_com','num_section','dnupla','geom']].values[0]], columns=['code_dep','code_com','section','numero','geom'] ) oth_cols = dffonc.columns[~dffonc.columns.isin(add_p.columns)].drop('id') add_p[[*oth_cols]] = dffonc.loc[dffonc.id==7037, [*oth_cols]].values[0] add_p['id'] = 0 add_p.set_geometry('geom', crs=2154, inplace=True) dffonc = pd.concat([dffonc,add_p]) # id 1932 dffonc.loc[dffonc.id==1932, ['code_dep','code_com','section','numero','geom']] = tofede.loc[tofede.par_id=='38140000AM0190',['insee_dep','insee_com','num_section','dnupla','geom']].values[0] add_p = gpd.GeoDataFrame( [tofede.loc[tofede.par_id=='38140000AM0189',['insee_dep','insee_com','num_section','dnupla','geom']].values[0]], columns=['code_dep','code_com','section','numero','geom'] ) oth_cols = dffonc.columns[~dffonc.columns.isin(add_p.columns)].drop('id') add_p[[*oth_cols]] = dffonc.loc[dffonc.id==1932, [*oth_cols]].values[0] add_p['id'] = 0 add_p.set_geometry('geom', crs=2154, inplace=True) dffonc = pd.concat([dffonc,add_p]) #### dropline = dffonc[dffonc.id.isin([7144,7106,7107,7108,7109,7110,6666])].index.values # drop geometrie dupliquée dffonc.drop([*dropline], inplace=True) dffonc.loc[dffonc.numero.str.len()==1,'numero'] = '000'+dffonc.loc[dffonc.numero.str.len()==1,'numero'] dffonc.loc[dffonc.numero.str.len()==2,'numero'] = '00'+dffonc.loc[dffonc.numero.str.len()==2,'numero'] dffonc.loc[dffonc.numero.str.len()==3,'numero'] = '0'+dffonc.loc[dffonc.numero.str.len()==3,'numero'] dffonc.loc[dffonc.section.str.len()==1,'section'] = '0'+dffonc.loc[dffonc.section.str.len()==1,'section'] dffonc.loc[dffonc.id == 7101,['code_dep','code_com','section','numero']] = ['38','037','0D','0130'] dffonc.loc[dffonc.id == 7102,['code_dep','code_com','section','numero']] = ['38','037','0D','0131'] dffonc.loc[dffonc.id == 7103,['code_dep','code_com','section','numero']] = ['38','037','0D','0132'] dffonc.loc[dffonc.id == 7104,['code_dep','code_com','section','numero']] = ['38','037','0D','0133'] dffonc.loc[dffonc.id == 7105,['code_dep','code_com','section','numero']] = ['38','037','0D','0134'] dffonc.loc[dffonc.id.isin([ 61,62,70,69,68,72,67,66,63,64,60,57,56,59,6,7,8,9,65,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, 26,27,28,29,30,58,31,32,33,34,35,36,37,38,39,40,41,55,54,42,43,71,44,45,46,47,48,49,50,51,52,53,4,5, 1350,1349,1345,1346,1347,1352,1353,1348,1354,1351, # ccopre == 121 2433,2447,2449,2432,2448 # ccopre == 274 ]),'code_com'] = '479' dffonc.loc[dffonc.id.isin([ 2604,2605,2535,2599,2603,2602,2601,2639,2534,2536,2537,2532,2538,2540,2539,2635,2641,2533,2563,2562, 2561,2556,2560,2555,2597,2607,2614,2591,2622,2623,2620,2621,2619,2593,2592,2550,2547,2544,2551,2553, 2552,2545,2541,2546,2548,2549,2543,2583,2566,2596,2608,2567,2559,2584,2568,2615,2629,2618,2631,2571, 2609,2572,2590,2632,2569,2570,2595,2558,2636,2633,2606,2574,2573,2564,2579,2580,2577,2578,2565,2557, 2576,2581,2613,2598,2626,2627,2625,2611,2624,2642,2554,2628,2582,2585,2610,2542,2594,2589,2575,2616, 2612,2600,2617,2630,2587,2588,2586,2638,2637,2640,2634 ]),'code_com'] = '292' dffonc.loc[dffonc.id.isin([7114,7115,7116,7117,7118,7119,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135]),'code_com'] = '064' dffonc.loc[dffonc.id.isin([7120,7121,7122,7123,7124,7125]),'code_com'] = '401' dffonc.loc[dffonc.id.isin([7136,7137,7138,7139]),['code_com','section']] = ['341','0B'] dffonc.loc[dffonc.id.isin([7142,7143]),'code_com'] = '052' dffonc.loc[dffonc.id.isin([1010288,1041363]),'code_com'] = '517' dffonc.loc[dffonc.id.isin([1182503,1182640]),'code_com'] = '147' dffonc.loc[dffonc.id.isin([1243657]),'code_com'] = '448' dffonc.loc[dffonc.id.isin([1629034,1629035]),'code_com'] = '257' dffonc.loc[dffonc.code_dep.isna(),'code_dep'] = '38' ##### dffonc.loc[dffonc.id==113, 'numero'] = '0389' dffonc.drop(dffonc[dffonc.id==114].index[0],inplace=True) dffonc.loc[dffonc.id==151, 'numero'] = '0369' dffonc.loc[dffonc.id==591, 'numero'] = '0705' # numero == '0542' est un ancien nom dffonc.sort_values(['code_dep','code_com','section','numero'],inplace=True) dffonc['par_id'] = dffonc.code_dep + dffonc.code_com + '___' + dffonc.section + dffonc.numero dffonc['parid_start'] = dffonc.code_dep + dffonc.code_com dffonc['parid_end'] = dffonc.section + dffonc.numero dffonc.loc[dffonc.id.isin([1634,1638,1606,1607,1608]),'par_id'] = dffonc.loc[dffonc.id.isin([1634,1638,1606,1607,1608]),'par_id'].replace('___','227',regex=True) dffonc.loc[dffonc.id.isin([1495,1673,1675]),'par_id'] = dffonc.loc[dffonc.id.isin([1495,1673,1675]),'par_id'].replace('___','000',regex=True) # dffonc.loc[dffonc.id.isin([1495,1675]),'par_id'] # Jointure by parid_start & parid_end dfpar_id = tofede[['par_id']].copy() dfpar_id['parid_start'] = dfpar_id.par_id.str[:5] dfpar_id['parid_end'] = dfpar_id.par_id.str[-6:] lst_parid_ok = [1495,1634,1638,1673,1675,1606,1607,1608] # liste parcelle par_id reconstitué entier parid_ok = dffonc.loc[dffonc.id.isin(lst_parid_ok)] parid_join = pd.merge( dffonc.loc[~dffonc.id.isin(lst_parid_ok)].drop(columns=['par_id']), dfpar_id.loc[~dfpar_id.par_id.isin(parid_ok.par_id)], on = ['parid_start','parid_end'], how='left' ) parid_join.geom = parid_join.buffer(0) parid_ok = pd.concat([ parid_ok, parid_join[~parid_join.par_id.isna()] ]) parid_ok.drop(columns=['parid_start','parid_end'], inplace=True) parid_na = parid_join[parid_join.par_id.isna()] # Jointure by centroid dfpar_id = tofede.loc[~tofede.par_id.isin(parid_ok.par_id),['par_id','geom']].copy() dfpar_id.geom = dfpar_id.representative_point() parid_join = gpd.sjoin(parid_na.drop(columns=['par_id']),dfpar_id,op='contains', how='left').drop(columns=['index_right']) parid_join_ok = parid_join[ [str(x).startswith(y) and z in str(x) for x,y,z in zip(parid_join['par_id'], parid_join['parid_start'],parid_join['section'])] ].copy() # parid_join[ [str(x).endswith(z) for x,y,z in zip(parid_join['par_id'], parid_join['parid_start'],parid_join['parid_end'])] ] parid_join_ok.drop(columns=['parid_start','parid_end'], inplace=True) # Couches annimation foncière finale parid_OK = pd.concat([parid_ok,parid_join_ok]) parid_NA = dffonc[~dffonc.id.isin(parid_OK.id.unique())] # Récupération des info BND sqlmod = 'SELECT * FROM %s'%('animation_fonciere_pour_fcen') dfmodf = gpd.read_postgis(sql=sqlmod,geom_col='geom',con=con) del dfmodf['id_0'] dffon_OK = pd.merge( parid_OK, dfmodf[['id','Parc_MCE','docs_off_num','Nbr_lots_BND','partiel_conv_ou_acq']], on='id',how='left') # lst_prop = ['Acquis par le CEN ou CREN','ACQUIS&CONVENTION', 'PARTIELLEMENT MAITRISE'] lst_conv = ["CONVENTION D'USAGE",'CONVENTION'] lst_gere = ['BAIL EMPHYTEOTIQUE', *lst_conv, *lst_prop] dfgere = dffon_OK[ # ( # (dffon_OK.geom.intersects(dfsite[(dfsite.type_zonage=='ZI')|(dfsite.type_site=='MC')].unary_union))| # (~dffon_OK.Parc_MCE.isna())|(~dffon_OK.Nbr_lots_BND.isna())| # (~dffon_OK.partiel_conv_ou_acq.isna())|(~dffon_OK.docs_off_num.isna()) # ) # & (dffon_OK.maitrise.isin(lst_gere)) ].copy() dfautr = dffon_OK[~dffon_OK.par_id.isin(dfgere.par_id)].copy() # id_site_cen_parc dfgere['id_site_cen_parc'] = dfgere.id # code_mfu1 & code_mfu2 dfgere['code_mfu1'] = None dfgere['code_mfu2'] = None dfgere.loc[dfgere.maitrise.isin(lst_prop),'code_mfu1'] = 'P' dfgere.loc[dfgere.maitrise.isin(lst_conv),'code_mfu1'] = 'C' dfgere.loc[dfgere.maitrise == 'BAIL EMPHYTEOTIQUE','code_mfu1'] = 'L' dfgere.loc[dfgere.maitrise.isin(lst_prop),'code_mfu2'] = 'P1' dfgere.loc[dfgere.maitrise.isin(lst_conv),'code_mfu2'] = 'C7' dfgere.loc[dfgere.maitrise == 'BAIL EMPHYTEOTIQUE','code_mfu2'] = 'L1' # BND dfgere['bnd'] = 0 dfgere.loc[dfgere.indivision=='BND','bnd'] = 1 tmp = pd.DataFrame(columns=dfgere.columns) for i,row in dfgere.loc[~dfgere.Nbr_lots_BND.isna()].iterrows(): # if i==0 : tmp = row.to_list() tmp = tmp.append([row]*(int(row.Nbr_lots_BND)-1)) dfgere = pd.concat([dfgere,tmp]).sort_index() # MC dfgere['mesure_compens'] = 0 dfgere.loc[dfgere.Parc_MCE=='OUI','mesure_compens'] = 1 # pour_part dfgere['pour_part'] = 0 dfgere.loc[dfgere.maitrise=='PARTIELLEMENT MAITRISE','pour_part'] = 1 # Parcelles millitaire dic = { 'ccosec':'section', } dfmili = dfsite[dfsite.type_site=='MILI'].copy() sqlmil = "SELECT * FROM %s.%s WHERE ST_Contains('SRID=2154;%s',geom)" % ('cadastre', 'parcelles_38',dfmili.buffer(10).unary_union) miliparc = gpd.read_postgis(sqlmil,con=con_fon) miliparc['code_dep'] = miliparc.codcom.str[:2] miliparc['code_com'] = miliparc.codcom.str[2:] dfmili = miliparc[['par_id','geom','ccosec','code_dep','code_com']].copy() dfmili.rename(columns=dic, inplace=True) dfmili['id_site_cen_parc'] = 0 dfmili['code_mfu1'] = 'C' dfmili['code_mfu2'] = 'C12' dfmili['bnd'] = 0 dfmili['mesure_compens'] = 0 dfmili['pour_part'] = 0 dfgere = pd.concat([dfgere,dfmili]) # from pycen import update_to_sql # tmpdffonc = dffonc[['id','nom_propri']] # tmpdffonc["nom_propri"] = tmpdffonc["nom_propri"].str.strip() # tmpdffonc.loc[tmpdffonc.nom_propri== '',"nom_propri"] = None # update_to_sql(df=tmpdffonc, con=con, table_name='c_animation_fonciere_sites', schema_name='foncier', key_name='id', geom_col=None) ##################### ##### Parcelles #####2017380474000AN # Ne considère pas Platière, ni le Grand Lemps ##################### # Récupération des infos dans la bdd bd_cen (#Foncier) # RNNP sql = '''SELECT DISTINCT ON (t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre,t1.ccosec,t1.dnupla) t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre, t1.ccosec,t1.dnupla::text, STRING_AGG(t6.gtoper::text,',') gtoper, STRING_AGG(t6.ccogrm::text,',') ccogrm, STRING_AGG(CONCAT(t6.gtoper::text||COALESCE('_'||t6.ccogrm::text,'')),',') type_prop, STRING_AGG(t6.ddenom::text,',') ddenom FROM {sch}."{t1}" t1 JOIN ({sch}."lots_38" t2 JOIN ({sch}."cadastre_38" t3 JOIN ({sch}."cptprop_38" t4 JOIN ({sch}."r_prop_cptprop_38" t5 JOIN {sch}."proprios_38" t6 USING (dnuper)) USING (dnupro)) USING (dnupro)) USING (lot_id)) USING (par_id) WHERE par_id IN ('{par_ids}') GROUP BY 1,2,3,4,5,6'''.format( sch='cadastre', t1='parcelles_38', par_ids="','".join(lst_par_id_rnnp)) parca1 = gpd.read_postgis(text(sql),con=con_fon) parca1.to_file('/home/colas/Documents/tmp/FONCIER_FEDE/PLATIERE/parcelles_RNNP_tofede.gpkg', driver='GPKG') # Récupération des infos dans la bdd bd_cen (#Foncier) sql = '''SELECT DISTINCT ON (t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre,t1.ccosec,t1.dnupla) t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre, t1.ccosec,t1.dnupla::text, STRING_AGG(t6.gtoper::text,',') gtoper, STRING_AGG(t6.ccogrm::text,',') ccogrm, STRING_AGG(CONCAT(t6.gtoper::text||COALESCE('_'||t6.ccogrm::text,'')),',') type_prop, STRING_AGG(t6.ddenom::text,',') ddenom FROM {sch}."{t1}" t1 JOIN ({sch}."lots_38" t2 JOIN ({sch}."cadastre_38" t3 JOIN ({sch}."cptprop_38" t4 JOIN ({sch}."r_prop_cptprop_38" t5 JOIN {sch}."proprios_38" t6 USING (dnuper)) USING (dnupro)) USING (dnupro)) USING (lot_id)) USING (par_id) WHERE par_id IN ('{par_ids}') GROUP BY 1,2,3,4,5,6'''.format( sch='cadastre', t1='parcelles_38', par_ids="','".join(tofede.par_id)) parca2 = gpd.read_postgis(text(sql),con=con_fon) cols_parca2 = parca2.columns cols_join = [*cols_parcx[cols_parcx.isin(cols_parca2)]] parcb = pd.concat([ parca1, parca2[~parca2.par_id.isin(parcx.par_id)], parcx[cols_join] ]) # n = 10 # while n!= 0: # parcb.type_prop = parcb.type_prop.replace(',,',',',regex=True) # n = n-1 parcb.loc[parcb.type_prop.str.contains('2_0'),['type_prop','gtoper','ccogrm']] = ['2_0_MIX','2','0'] parcb.loc[parcb.type_prop.isin(['2_7,2_3,','2_7,2_3,2_3,']),['type_prop','gtoper','ccogrm']] = ['2_0_MIX','2','0'] parcb.loc[parcb.type_prop.str.contains('2_9'),['type_prop','gtoper','ccogrm']] = ['2_9_PUB','2','9'] parcb.loc[parcb.type_prop.str.contains('2_8'),['type_prop','gtoper','ccogrm']] = ['2_8_PRI','2','8'] parcb.loc[parcb.type_prop.str.contains('2_7'),['type_prop','gtoper','ccogrm']] = ['2_7_PRI','2','7'] parcb.loc[parcb.type_prop.str.contains('2_6'),['type_prop','gtoper','ccogrm']] = ['2_6_PRI','2','6'] parcb.loc[parcb.type_prop.str.contains('2_5'),['type_prop','gtoper','ccogrm']] = ['2_5_PUB','2','5'] parcb.loc[parcb.type_prop.str.contains('2_4'),['type_prop','gtoper','ccogrm']] = ['2_4_COM','2','4'] parcb.loc[parcb.type_prop.str.contains('2_3'),['type_prop','gtoper','ccogrm']] = ['2_3_PUB','2','3'] parcb.loc[parcb.type_prop.str.contains('2_2'),['type_prop','gtoper','ccogrm']] = ['2_2_PUB','2','2'] parcb.loc[parcb.type_prop.str.contains('2_1'),['type_prop','gtoper','ccogrm']] = ['2_1_PUB','2','1'] parcb.loc[parcb.type_prop.str.contains('1,1'),['type_prop','gtoper','ccogrm']] = ['1_PRI','1',None] parcb.loc[parcb.type_prop == '1',['type_prop','gtoper','ccogrm']] = ['1_PRI','1',None] lstterm_cen38 = ["CONSERVATOIRE D'ESPACES NATURELS ISERE","AVENIR CONSERVATOIRE DES ESPACES NATURELS DE L'ISERE","CONSERVATOIRE D'ESPACES NATURELS ISERE AVENIR DIT CEN ISERE"] lstterm_cenra = ["CONSERVATOIRE RHONE ALPES DES ESPACES NATURELS","CONSERVATOIRE RH ALP ESPACES NATURELS"] parcb.loc[parcb.ddenom.isin([*lstterm_cen38,*lstterm_cenra]),['type_prop','gtoper','ccogrm']] = ['3_CEN','3',None] # parcb.loc[parcb.type_prop.str.len()==3,'gtoper'] = parcb[parcb.type_prop.str.len()==3].type_prop.str[0] # parcb.loc[parcb.type_prop.str.len()==3,'ccogrm'] = parcb[parcb.type_prop.str.len()==3].type_prop.str[-1] parcb.loc[parcb.dnupla.str.len()==1,'dnupla'] = '000' + parcb.loc[parcb.dnupla.str.len()==1,'dnupla'] parcb.loc[parcb.dnupla.str.len()==2,'dnupla'] = '00' + parcb.loc[parcb.dnupla.str.len()==2,'dnupla'] parcb.loc[parcb.dnupla.str.len()==3,'dnupla'] = '0' + parcb.loc[parcb.dnupla.str.len()==3,'dnupla'] parcb['id_proprietaire'] = 0 parcb.loc[parcb.ddenom.str.contains('|'.join(lstterm_cenra),na=False),'id_proprietaire'] = '28' # Récupération des infos dans la VM cadastre (#Foncier) # sql = '''SELECT geo_parcelle, substring(geo_parcelle from 1 for 2)||substring(geo_parcelle from 4 for 12) par_id, geom # FROM "38_202207".geo_parcelle''' # 38517000AW0032 # par_id # 380517000AW0032 # geo_parcelle sql = '''SELECT substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) par_id, t1.annee, t1.update_dat, t1.geom FROM "{sch}"."{t1}" t1 WHERE substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) IN ('{par_ids}') '''.format( sch='38_202207', t1='v_geo_parcelle', par_ids="','".join(tofede[~tofede.par_id.isin(parcx.par_id)].par_id)) parcc0 = gpd.read_postgis(text(sql),con=con_vm) sql = '''SELECT substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) par_id, t1.annee, t1.update_dat, t1.geom FROM "{sch}"."{t1}" t1 WHERE substring(t1.geo_parcelle from 1 for 2)||substring(t1.geo_parcelle from 4 for 12) IN ('{par_ids}') '''.format( sch='26_202007', t1='v_geo_parcelle', par_ids="','".join(tofede[~tofede.par_id.isin(parcx.par_id)].par_id)) parcc1 = gpd.read_postgis(text(sql),con=con_vm) cols_parcc = parcc0.columns cols_join = [*cols_parcx[cols_parcx.isin(cols_parcc)]] parcc = pd.concat([parcc0,parcc1,parcx[cols_join]]) parcc['source_geom_parc_annee'] = parcc.annee parcc['date_maj_parcelle'] = parcc.update_dat l1 = dfgere.columns[dfgere.columns.isin(lst_cols_parc)] l2 = tofede.columns[tofede.columns.isin(lst_cols_parc)] l3 = parcb.columns[parcb.columns.isin(lst_cols_parc)] l4 = parcc.columns[parcc.columns.isin(lst_cols_parc)] p1 = dfgere[['par_id',*l1]].copy() p2 = tofede[['par_id',*l2,'geom']].copy() p3 = parcb[['par_id',*l3]].copy() p4 = parcc[['par_id',*l4]].copy() dfs = [p1,p2,p3,p4] df_parcs = reduce(lambda left,right: pd.merge(left,right,on=['par_id'], how='left'), dfs) for par_id in df_parcs[df_parcs.par_id.duplicated(keep=False)].par_id.unique(): x = df_parcs[df_parcs.par_id==par_id].shape[0] df_parcs.loc[df_parcs.par_id==par_id,'surf_parc_maitrise_m2'] = round(df_parcs.loc[df_parcs.par_id==par_id,'surf_parc_maitrise_m2']/x).astype(int) df_parcs.date_maj_parcelle = df_parcs.date_maj_parcelle.astype(str) gdf_tofede = df_parcs[['id_site_fcen_parc','num_parcelle','date_maj_parcelle','geom']].copy() gdf_tofede = gdf_tofede.set_geometry('geom', crs=2154) gdf_tofede.rename(columns={ 'id_site_fcen_parc':'id_fcen', 'num_parcelle':'num_parc', 'date_maj_parcelle':'date_maj_p' },inplace=True) gdf_tofede.to_file('/home/colas/Documents/tmp/FONCIER_FEDE/SEND/Parcelles_CEN_38_%i.shp' % annee) df_tofede = df_parcs[lst_cols_parc].copy() df_tofede.loc[df_tofede.date_debut_ore.isna(),'date_debut_ore'] df_tofede.to_csv('/home/colas/Documents/tmp/FONCIER_FEDE/SEND/Parcelles_CEN_38_%i.csv' % annee) # parcb.loc[(parcb.ddenom.str.contains("AVENIR CONSERVATOIRE DES ESPACES NATURELS DE L'ISERE",case=False))].ddenom.unique() # parcb.loc[(parcb.ddenom.str.contains('CONSERVATOIRE|CEN',case=False))&(parcb.ddenom.str.contains('ISERE',case=False))].ddenom.unique() # parcb.loc[parcb.gtoper.isin(['1,1','2,1','1,2','1,1,1']),'gtoper'] = '1' # parcb.loc[parcb.gtoper.isin(['1,1,1,1','2,1,1,1,1,1,1','2,1,1,1,1,1,1,1,1,1,1,1,1,1,1','2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1']),'gtoper'] = '1' # parcb.loc[parcb.gtoper.isin(['2,2']),'gtoper'] = '2' # parcb.loc[parcb.gtoper=='1','ccogrm'] = None parcb[parcb.par_id.duplicated(keep=False)] dic_col = { 'code_dep' : 'insee_dep', 'section' : 'num_section', 'num_unique_v2' : 'num_parcelle', # ???? } dic_parc = { 'id':'id_site_cen_parc', } lst_prop = ['Acquis par le CEN ou CREN','ACQUIS&CONVENTION', 'PARTIELLEMENT MAITRISE'] lst_conv = ["CONVENTION D'USAGE",'CONVENTION'] lst_gere = ['BAIL EMPHYTEOTIQUE', *lst_conv, *lst_prop] sql = '''SELECT DISTINCT t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre, t1.ccosec,t1.dnupla::text, t6.gtoper::text, t6.ccogrm::text FROM {sch}."{t1}" t1 JOIN ({sch}."lots_38" t2 JOIN ({sch}."cadastre_38" t3 JOIN ({sch}."cptprop_38" t4 JOIN ({sch}."r_prop_cptprop_38" t5 JOIN {sch}."proprios_38" t6 USING (dnuper)) USING (dnupro)) USING (dnupro)) USING (lot_id)) USING (par_id) WHERE ST_Within(t1.geom, 'SRID=2154;{geom}') '''.format( sch='cadastre', t1='parcelles_38', geom=dffonc.unary_union) sql = '''SELECT DISTINCT t1.par_id,t1.geom, t1.dcntpa,t1.typprop_id,t1.ccopre, t1.ccosec,t1.dnupla::text, t6.gtoper::text, t6.ccogrm::text FROM {sch}."{t1}" t1 JOIN ({sch}."lots_38" t2 JOIN ({sch}."cadastre_38" t3 JOIN ({sch}."cptprop_38" t4 JOIN ({sch}."r_prop_cptprop_38" t5 JOIN {sch}."proprios_38" t6 USING (dnuper)) USING (dnupro)) USING (dnupro)) USING (lot_id)) USING (par_id) WHERE ST_Intersects(t1.geom, 'SRID=2154;{geom}') '''.format( sch='cadastre', t1='parcelles_38', geom=dffonc.unary_union) sql = sql + " AND t1.par_id LIKE ANY (array['%s']);"% "','".join(dffonc[~dffonc.par_id.isna()].par_id) parc = gpd.read_postgis(sql=text(sql),geom_col='geom',con=con_fon) parc.loc[parc.dnupla.str.len()==1,'dnupla'] = '000' + parc.loc[parc.dnupla.str.len()==1,'dnupla'] parc.loc[parc.dnupla.str.len()==2,'dnupla'] = '00' + parc.loc[parc.dnupla.str.len()==2,'dnupla'] parc.loc[parc.dnupla.str.len()==3,'dnupla'] = '0' + parc.loc[parc.dnupla.str.len()==3,'dnupla'] # parc = gpd.read_file('/home/colas/Documents/tmp/FONCIER_FEDE/extract_parc_for_fede.gpkg') # parc.rename_geometry('geom',inplace=True) # parc.to_file('/home/colas/Documents/tmp/FONCIER_FEDE/extract_parc_for_fede.gpkg',driver='GPKG') parc['semi_par_id'] = parc.par_id.str[:5] + parc.ccosec + parc.dnupla ###################### # HARMONISATION couche FONCIER dffonc_b1 = dffonc_b5 = dffonc_b20 = dffonc_b50 = dffonc.copy() dffonc_b1.geom = dffonc_b1.buffer(1) dffonc_b20.geom = dffonc_b20.buffer(20) dffonc_b50.geom = dffonc_b50.buffer(50) dffonc_b5.geom = dffonc_b5.buffer(5) tmp = gpd.sjoin(dffonc_b50[~dffonc_b50.numero.isna()],parc,op='contains',how='left') tmp2 = tmp[tmp.numero == tmp.dnupla] crsp = tmp2.id.tolist() tmp[~tmp.id.isin(crsp)] tmp[tmp.id.duplicated(keep=False)] ############## ############## dfparc = parc[['par_id','gtoper','ccogrm','geom']] dfgere = dffonc[dffonc.maitrise.isin(lst_gere)].copy() # parcelles gérée dfgere['code_mfu1'] = None dfgere['code_mfu2'] = None dfgere.loc[dfgere.maitrise.isin(lst_prop),'code_mfu1'] = 'P' dfgere.loc[dfgere.maitrise.isin(lst_conv),'code_mfu1'] = 'C' dfgere.loc[dfgere.maitrise == 'BAIL EMPHYTEOTIQUE','code_mfu1'] = 'L' dfgere.loc[dfgere.maitrise.isin(lst_prop),'code_mfu2'] = 'P1' dfgere.loc[dfgere.maitrise.isin(lst_conv),'code_mfu2'] = 'C7' dfgere.loc[dfgere.maitrise == 'BAIL EMPHYTEOTIQUE','code_mfu2'] = 'L1' dfgere.loc[dfgere.maitrise == 'PARTIELLEMENT MAITRISE','bnd'] = 1 dfgere.loc[dfgere.maitrise != 'PARTIELLEMENT MAITRISE','bnd'] = 0 # Parcelles d'interventions dftmp = dffonc[~dffonc.maitrise.isin(lst_gere)].copy() # couche temp des parcelles non-gérés sittmp = dfsite[(dfsite.assist_cnv)&(dfsite.assist_col)] # sites en assistance intersect = dftmp.intersects(sittmp.unary_union) # Intersection [couche temp] VS [sites assist] dfintr = dftmp[intersect] # parcelles d'interventions # Parcelles millitaire dic = { 'ccosec':'num_section', 'par_id':'num_parcelle' } dfmili = dfsite[dfsite.type_site=='MILI'].copy() sqlmil = "SELECT * FROM %s.%s WHERE ST_Contains('SRID=2154;%s',geom)" % ('cadastre', 'parcelles_38',dfmili.buffer(10).unary_union) miliparc = gpd.read_postgis(sqlmil,con=con_fon) miliparc['code_dep'] = miliparc.codcom.str[:2] miliparc['code_com'] = miliparc.codcom.str[2:] dfmili = miliparc[['par_id','geom','ccosec','code_dep','code_com']].copy() dfmili.rename(columns=dic, inplace=True) # All parcelles df = pd.concat([dfgere,dfintr,dfmili], ignore_index=True) keep_col = df.columns[df.columns.isin(lst_cols_parc)] df = df[keep_col] df.reset_index(drop=True, inplace=True) sql = '''SELECT par_id,geom, dcbtpa,typprop_id FROM %s."%s" WHERE ST_Intersects(geom, 'SRID=2154;%s') ''' % ('cadastre', 'parcelles_38',df.representative_point().unary_union) parc = gpd.read_postgis(sql=sql,geom_col='geom',con=con_fon) sql = '''SELECT geo_parcelle,geo_section,idu,proprietaire,proprietaire_info,geom FROM %s."%s" WHERE ST_Intersects(geom, 'SRID=2154;%s') ''' % ('ref_cadastre', 'parcelle_info',df.representative_point().unary_union) prop = gpd.read_postgis(sql=sql,geom_col='geom',con=con) df['insee_com'] = df.code_dep + df.code_com tmp = df[['id','geom']] gpd.sjoin(df,parc[['par_id','geom']],how='left',op='intersects') # df['num_parcelle'] = df['surf_ore_m2'] = 0 df['date_debut_ore'] = None df['date_fin_ore'] = None lst_doc = [] df.loc[df.id.isin(lst_doc),'doc_foncier'] = 1 df.loc[~df.id.isin(lst_doc),'doc_foncier'] = 0 df.loc[df.doc_foncier == 1,'source_doc_foncier'] = 'CEN Isère' df['pour_part'] = 0 df['domaine_public'] = 0 df['id_proprietaire'] = 0 df['parc_gestion_rnx'] = None # ????????????????? df['source_geom_parc_nature'] = 2 df['source_geom_parc_annee'] = 2017 df['source_surf_parc'] = 1 # 3800010000A0001 # 38566AK00981000 # 596060000A0012 # 073490000C0103 ########### ### Autre # ########### df = pd.DataFrame() df['id_cen'] = 14 df['id_site_cen'] = ''