Skip to content

Commit a712e12

Browse files
author
Ashok Dahal
committed
added riskchanges desktop version for first time
1 parent a90bb2e commit a712e12

File tree

8 files changed

+1662
-0
lines changed

8 files changed

+1662
-0
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"cells": [],
3+
"metadata": {},
4+
"nbformat": 4,
5+
"nbformat_minor": 5
6+
}

RiskChangesDesktop/DataManage.py

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
from osgeo import gdal
2+
from osgeo import osr
3+
from osgeo import ogr
4+
import os
5+
import sys
6+
import copy
7+
import numpy as np
8+
import rasterio
9+
import geopandas as gpd
10+
import pandas as pd
11+
def reclassify(in_image,out_image,base,stepsize):
12+
input_image=rasterio.open(in_image)
13+
intensity_data=input_image.read(1)
14+
maxval=np.max(intensity_data)
15+
#print(maxval)
16+
prev=base
17+
i=1
18+
thresholds=np.arange(start=base,stop=maxval+stepsize,step=stepsize)[1:].tolist()
19+
intensity_data[intensity_data<base]=input_image.get_nodatavals()[0]
20+
for threshold in thresholds:
21+
intensity_data[(intensity_data<threshold) & (intensity_data>=prev)]=i
22+
i+=1
23+
prev=threshold
24+
25+
with rasterio.Env():
26+
profile = input_image.profile
27+
with rasterio.open(out_image, 'w', **profile) as dst:
28+
dst.write(intensity_data.astype(rasterio.float32), 1)
29+
dst=None
30+
input_image=None
31+
def ClassifyHazard(hazard_file,base,stepsize):
32+
infile=hazard_file
33+
outfile=hazard_file.replace(".tif","_reclassified.tif")
34+
reclassify(infile,outfile,base,stepsize)
35+
def MatchProjection(in_image,invector):
36+
37+
raster = gdal.Open(in_image)
38+
vector=ogr.Open(invector)
39+
lyr =vector.GetLayer()
40+
projras = osr.SpatialReference(wkt=raster.GetProjection())
41+
epsgras=projras.GetAttrValue('AUTHORITY',1)
42+
43+
projear=lyr.GetSpatialRef()
44+
epsgear=projear.GetAttrValue('AUTHORITY',1)
45+
#print(epsgear,epsgras)
46+
#return 0
47+
if int(epsgras)!=int(epsgear):
48+
toEPSG="EPSG:"+str(epsgear)
49+
out_image=in_image.replace(".tif","_projected.tif")
50+
gdal.Warp(out_image,in_image,dstSRS=toEPSG)
51+
raster=None
52+
return f"Raster reprojected and saved as {out_image} with epsg {toEPSG}"
53+
else:
54+
raster=None
55+
return "Both are in same projection system, no projection required"
56+
def ProjectVector(invector,epsg):
57+
outputShapefile=invector.replace(".shp","_projected.shp")
58+
data=gpd.read_file(invector)
59+
toepsg='epsg:'+str(epsg)
60+
data_reprojected=data.to_crs({'init': toepsg})
61+
data_reprojected.to_file(outputShapefile)
62+
return f"the file is reprojected and saved as f{outputShapefile}"
63+
64+
def ProjectRaster(in_image,epsg):
65+
raster = gdal.Open(in_image)
66+
projras = osr.SpatialReference(wkt=raster.GetProjection())
67+
epsgras=projras.GetAttrValue('AUTHORITY',1)
68+
print(epsgras,epsg)
69+
if int(epsgras)!=int(epsg):
70+
toEPSG="EPSG:"+str(epsg)
71+
out_image=in_image.replace(".tif","_projected.tif")
72+
gdal.Warp(out_image,in_image,dstSRS=toEPSG)
73+
raster=None
74+
return f"Raster reprojected and saved as {out_image} with epsg {toEPSG}"
75+
else:
76+
raster=None
77+
return "Both are in same projection system, no projection required"
78+
def CheckProjectionRaster(inraster):
79+
raster = gdal.Open(inraster)
80+
projras = osr.SpatialReference(wkt=raster.GetProjection())
81+
epsgras=projras.GetAttrValue('AUTHORITY',1)
82+
raster = None
83+
return f"The projection system EPSG code fo the Raster image {inraster} is {epsgras} "
84+
85+
def CheckProjectionVector(invector):
86+
try:
87+
dataset = ogr.Open(invector)
88+
except:
89+
return "Dataset Dosenot Exist"
90+
lyr=dataset.GetLayer()
91+
projear=lyr.GetSpatialRef()
92+
epsgear=projear.GetAttrValue('AUTHORITY',1)
93+
dataset=None
94+
return f"The projection system EPSG code fo the vector {invector} is {epsgear} "
95+
def CheckUniqueTypes(input_ear,type_coln):
96+
data=gpd.read_file(input_ear)
97+
unique=data[type_coln].unique()
98+
nunique=data[type_coln].nunique()
99+
data=None
100+
return f"There are {nunique} unique columns in your EAR file {input_ear} and they are {unique}"
101+
def LinkVulnerability(input_ear,type_coln,type_vuln):
102+
if 'csv' in input_ear:
103+
data=pd.read_csv(input_ear)
104+
elif 'shp' in input_ear:
105+
data=gpd.read_file(input_ear)
106+
else:
107+
raise TypeError('The format of the exposure must be either shp or csv')
108+
data["vulnfile"] = ""
109+
for key, value in type_vuln.items():
110+
data['vulnfile'].loc[data[type_coln] == key]=value
111+
if 'shp' in input_ear:
112+
outputname=input_ear.replace(".shp","_linked.shp")
113+
data.to_file(outputname)
114+
elif 'csv' in input_ear:
115+
outputname=input_ear.replace(".csv","_linked.csv")
116+
data.to_csv(outputname)
117+
data=None
118+
return f"The input EAR file has linked the vulnerability curve and stored at {outputname}"
119+
def ComputeCentroid(ear):
120+
df=gpd.read_file(ear)
121+
122+
def keep_first(geo):
123+
if geo.geom_type == 'Polygon':
124+
return geo
125+
elif geo.geom_type == 'MultiPolygon':
126+
return geo[0]
127+
df.geometry = df.geometry.apply(lambda _geo: keep_first(_geo))
128+
df2=df
129+
df.geometry=df2.centroid
130+
outputname_centroid=ear.replace(".shp","_centroid.shp")
131+
df.to_file(outputname_centroid)
132+
return f"The input EAR file has been converted to centroid and saved at {outputname_centroid}"

RiskChangesDesktop/Exposure.py

Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
import rasterio
2+
import geopandas as gpd
3+
import numpy
4+
import os
5+
import sys
6+
from osgeo import ogr
7+
from osgeo import gdal
8+
from osgeo import osr
9+
import pandas as pd
10+
from rasterio.windows import Window
11+
from rasterio.windows import from_bounds
12+
from rasterio.mask import mask
13+
import tqdm.notebook as tqdm
14+
import numpy.ma as ma
15+
import numpy as np
16+
def Exposure(input_zone, input_value_raster,Ear_Table_PK):
17+
vector=ogr.Open(input_zone)
18+
lyr =vector.GetLayer()
19+
feat = lyr.GetNextFeature()
20+
geom = feat.GetGeometryRef()
21+
geometrytype=geom.GetGeometryName()
22+
if (geometrytype== 'POLYGON' or geometrytype== 'MULTIPOLYGON'):
23+
return zonalPoly(input_zone,input_value_raster,Ear_Table_PK,agg_col=None)
24+
25+
elif(geometrytype=='POINT' or geometrytype=='MULTIPOINT'):
26+
return zonalLine(input_zone,input_value_raster,Ear_Table_PK,agg_col=None)
27+
28+
elif(geometrytype=='LINESTRING' or geometrytype=='MULTILINESTRING'):
29+
return zonalPoint(lyr,input_value_raster,Ear_Table_PK,agg_col=None)
30+
def zonalPoly(input_zone_data,input_value_raster,Ear_Table_PK,agg_col=None):
31+
raster=rasterio.open(input_value_raster)
32+
data=gpd.read_file(input_zone_data)
33+
df=pd.DataFrame()
34+
for ind,row in tqdm.tqdm(data.iterrows(),total=data.shape[0]):
35+
maska,transform=rasterio.mask.mask(raster, [row.geometry], crop=True,nodata=0)
36+
zoneraster = ma.masked_array(maska, mask=maska==0)
37+
len_ras=zoneraster.count()
38+
#print(len_ras)
39+
if len_ras==0:
40+
continue
41+
42+
unique, counts = np.unique(zoneraster, return_counts=True)
43+
if ma.is_masked(unique):
44+
unique=unique.filled(0)
45+
idx=np.where(unique==0)[0][0]
46+
#print(idx)
47+
ids=np.delete(unique, idx)
48+
cus=np.delete(counts, idx)
49+
else:
50+
ids=unique
51+
cus=counts
52+
frequencies = np.asarray((ids, cus)).T
53+
for i in range(len(frequencies)):
54+
frequencies[i][1]=(frequencies[i][1]/len_ras)*100
55+
#print(frequencies)
56+
df_temp= pd.DataFrame(frequencies, columns=['class','exposed'])
57+
df_temp['geom_id']=row[Ear_Table_PK]
58+
df=df.append(df_temp,ignore_index=True)
59+
60+
raster=None
61+
return df
62+
def zonalLine(lyr,input_value_raster,Ear_Table_PK,agg_col=None):
63+
tempDict={}
64+
featlist=range(lyr.GetFeatureCount())
65+
raster = gdal.Open(input_value_raster)
66+
67+
projras = osr.SpatialReference(wkt=raster.GetProjection())
68+
epsgras=projras.GetAttrValue('AUTHORITY',1)
69+
70+
projear=lyr.GetSpatialRef()
71+
epsgear=projear.GetAttrValue('AUTHORITY',1)
72+
#print(epsgear,epsgras)
73+
if not epsgras==epsgear:
74+
toEPSG="EPSG:"+str(epsgear)
75+
output_raster=input_value_raster.replace(".tif","_projected.tif")
76+
gdal.Warp(output_raster,input_value_raster,dstSRS=toEPSG)
77+
raster=None
78+
raster=gdal.Open(output_raster)
79+
else:
80+
pass
81+
# Get raster georeference info
82+
raster_srs = osr.SpatialReference()
83+
raster_srs.ImportFromWkt(raster.GetProjectionRef())
84+
gt=raster.GetGeoTransform()
85+
xOrigin = gt[0]
86+
yOrigin = gt[3]
87+
pixelWidth = gt[1]
88+
pixelHeight = gt[5]
89+
rb=raster.GetRasterBand(1)
90+
91+
92+
df = pd.DataFrame()
93+
for FID in featlist:
94+
feat = lyr.GetFeature(FID)
95+
geom = feat.GetGeometryRef()
96+
extent = geom.GetEnvelope()
97+
xmin = extent[0]
98+
xmax = extent[1]
99+
ymin = extent[2]
100+
ymax = extent[3]
101+
102+
xoff = int((xmin - xOrigin)/pixelWidth)
103+
yoff = int((yOrigin - ymax)/pixelWidth)
104+
xcount = int((xmax - xmin)/pixelWidth)+1
105+
ycount = int((ymax - ymin)/pixelWidth)+1
106+
107+
target_ds = gdal.GetDriverByName('MEM').Create('', xcount, ycount, 1, gdal.GDT_Byte)
108+
target_ds.SetGeoTransform((
109+
xmin, pixelWidth, 0,
110+
ymax, 0, pixelHeight,
111+
))
112+
# Create for target raster the same projection as for the value raster
113+
target_ds.SetProjection(raster_srs.ExportToWkt())
114+
115+
gdal.RasterizeLayer(target_ds, [1], lyr, burn_values=[1])
116+
117+
# Read raster as arrays
118+
banddataraster = raster.GetRasterBand(1)
119+
dataraster = banddataraster.ReadAsArray(xoff, yoff, xcount, ycount).astype(numpy.float)
120+
121+
bandmask = target_ds.GetRasterBand(1)
122+
datamask = bandmask.ReadAsArray(0, 0, xcount, ycount).astype(numpy.float)
123+
# Mask zone of raster
124+
zoneraster = numpy.ma.masked_array(dataraster, numpy.logical_not(datamask))
125+
#print(zoneraster)
126+
(unique, counts) = numpy.unique(zoneraster, return_counts=True)
127+
unique[unique.mask] = 9999
128+
if 9999 in unique:
129+
falsedata=numpy.where(unique==9999)[0][0]
130+
ids=numpy.delete(unique, falsedata)
131+
cus=numpy.delete(counts, falsedata)
132+
else:
133+
ids=unique
134+
cus=counts
135+
#print(ids)
136+
frequencies = numpy.asarray((ids, cus)).T
137+
len_ras=zoneraster.count()
138+
for i in range(len(frequencies)):
139+
frequencies[i][1]=(frequencies[i][1]/len_ras)*100
140+
141+
df_temp= pd.DataFrame(frequencies, columns=['class','exposed'])
142+
df_temp['geom_id'] = feat[Ear_Table_PK]
143+
#df_temp['exposure_id'] = exposure_id
144+
#df_temp['admin_unit'] =feat[agg_col]
145+
df=df.append(df_temp,ignore_index=True)
146+
raster=None
147+
return df
148+
def zonalPoint(lyr,input_value_raster,Ear_Table_PK,agg_col):
149+
df=gpd.read_file(lyr)
150+
src=rasterio.open(input_value_raster)
151+
print("Calculating via centroid")
152+
coords = [(x,y) for x, y in tqdm.tqdm(zip(df.geometry.x, df.geometry.y))]
153+
a =src.sample(coords)
154+
exposure=[]
155+
for value in a:
156+
exposure.append(value[0])
157+
df['class']=exposure
158+
df['exposed']=100
159+
df.loc[(df['class']<0)|(df['class']>1000), 'class'] = 0
160+
df.loc[df['class']==0, 'exposed'] = 0
161+
df=df.rename(columns={Ear_Table_PK:'geom_id'})
162+
if agg_col != None :
163+
df_sel=df[['class','exposed','geom_id','admin_unit']]
164+
else:
165+
df_sel=df[['class','exposed','geom_id']]
166+
167+
src=None
168+
return df_sel
169+
def saveshp(df,outputname):
170+
df.to_file(outputname+".shp")
171+
def savecsv(df,outputname):
172+
df.drop('geometry',axis=1).to_csv(outputname+".csv")
173+
def ComputeExposure(ear,hazard,ear_key,outputdir,outputformat="csv"):
174+
exposure=Exposure(ear, hazard,ear_key)
175+
#import geopandas as gpd
176+
ear=gpd.read_file(ear)
177+
exposure_merged=ear.merge(exposure, how='right', left_on=[ear_key], right_on=['geom_id'])
178+
if outputformat=="shp":
179+
saveshp(exposure_merged,outputdir)
180+
if outputformat=="csv":
181+
savecsv(exposure_merged,outputdir)
182+
def aggregate(df,agg_col):
183+
try:
184+
df['exposed_areaOrLen']=df['exposed']*df['areaOrLen']/100
185+
df_aggregated=df.groupby(['admin_unit','class'],as_index=False).agg({'exposed_areaOrLen':'sum','exposed':'count'})
186+
except:
187+
df_aggregated=df.groupby(['admin_unit','class'],as_index=False).agg({'exposed':'count'})
188+
return df_aggregated
189+
def ComputeExposureAgg(ear,hazard,ear_key,admin_unit,agg_col,outputname,outputformat="csv"):
190+
ear_data=gpd.read_file(ear)
191+
admin_data=gpd.read_file(admin_unit)
192+
ear_temp=gpd.overlay(ear_data, admin_data, how='intersection', make_valid=True, keep_geom_type=True)
193+
194+
tempfile=ear.replace(".shp","_tempadmin.shp")
195+
ear_temp.to_file(tempfile)
196+
ear=tempfile
197+
198+
exposure=Exposure(ear, hazard,ear_key,agg_col)
199+
agg_exposure=aggregate(exposure,agg_col)
200+
#import geopandas as gpd
201+
#admin=gpd.read_file(ear)
202+
exposure_merged=admin_data.merge(agg_exposure, how='right', left_on=[agg_col], right_on=['admin_unit'])
203+
#return exposure_merged
204+
if outputformat=="shp":
205+
saveshp(exposure_merged,outputdir)
206+
if outputformat=="csv":
207+
savecsv(exposure_merged,outputdir)

0 commit comments

Comments
 (0)