В последней статье мы представили городские ливневые наводнения и применение моделей, управляемых данными, для картографирования городских ливневых наводнений. Эта серия статей обобщает и поясняет (с кодом Python) статью На пути к картированию подверженности городским наводнениям с использованием моделей, управляемых данными, в Берлине, Германия, опубликованную в журнале Geomatics, Natural Hazards and Risk. Полный блокнот Jupyter Notebook и примеры данных для затопленных и незатопленных мест, а также использованные в статье прогностические функции доступны здесь
Карты подверженности наводнениям показывают вероятность затопления конкретного места на основе его физических характеристик, таких как топография, инфраструктура и гидрометеорологические условия. Модели, управляемые данными, подходят к этому как к проблеме классификации, то есть место либо затоплено, либо нет. Затопленные и незатопленные места необходимы для обучения, проверки и тестирования моделей, управляемых данными. Сбалансированный набор данных с равным количеством затопленных и незатопленных мест необходим для обучения, проверки и тестирования моделей, управляемых данными. Затопленные участки получаются из кадастров затоплений, которые включают исторические места затопления (см. рис. 1), в то время как незатопленные места генерируются случайным образом в районах без истории затопления. Затем модели, управляемые данными, используются для поиска взаимосвязи между характеристиками затопленных мест и возникновением наводнений.
Ожидается, что городские ливневые наводнения произойдут в низинных районах или в пределах топографических депрессий, где имеет тенденцию скапливаться сточная вода. Поэтому топографические характеристики, такие как высота над уровнем моря, уклон, кривизна и топографический индекс влажности (TWI), потенциально указывают на повышенную опасность наводнения. Кроме того, городские ливневые подтопления происходят из-за превышения пропускной способности системы ливневой канализации. Избыточный сток проходит через дорожную сеть, превращая его в предпочтительный путь. Поэтому расстояние между местом и ближайшей дорогой, оврагом и каналом считается важным для картирования подверженности наводнениям. Наконец, городские ливневые паводки вызываются интенсивными ливневыми дождями. Таким образом, осадки также должны быть включены в качестве прогностического признака. Мы использовали максимальную суточную глубину осадков и частоту экстремальных дождей, чтобы представить количество осадков. На рис. 2 показаны рассмотренные прогностические признаки. Эти прогностические признаки можно рассчитать в Arcmap, QGIS или python.
В документе сверточная нейронная сеть (CNN) (растровая модель) сравнивалась с традиционными алгоритмами машинного обучения, такими как случайный лес (RF) и машина опорных векторов (SVM) и искусственными нейронными сетями (ANN) (точечные модели). Наша гипотеза заключалась в том, что CNN превосходит другие модели.
В этой статье объясняется, как подготовить данные для точечных моделей. Мы можем прочитать шейп-файл, содержащий точки затопления и незатопления в python, используя геопанды. Затем нам нужно добавить пустой столбец для каждой прогностической функции.
# Import used packages import geopandas as gpd # used to read the shapfile import rasterio as rio # used to read the raster (.tif) files from rasterio.plot import show # used to make plots using rasterio import matplotlib.pyplot as plt #to make plots using matplotlib # Read your point shapefiles (Flooded and Non Flooded locations) points=gpd.read_file('Points.shp') # make columns to extract the values of each predictive feature # for each point. points['DEM']=0 # points['Slope']=0 points['Aspect']=0 points['Curvature']=0 points['TWI']=0 points['DTDrainage']=0 points['DTRoad']=0 points['DTRiver']=0 points['CN']=0 points['AP']=0 #Max daily precipitation points['FP']=0 #Frequency of extreme precipitation event.
Затем нам нужно открыть прогностические функции (растровые изображения) с помощью rasterio или gdal и прочитать их как массивы NumPy, чтобы мы могли работать с ними в python.
#The predictive features are in raster format so we use rasterio package to #read them and convert them to numpy array DEM_raster=rio.open('DEM.tif') DEM_arr=DEM_raster.read(1) Slope_raster=rio.open('Slope.tif') Slope_arr=Slope_raster.read(1) Aspect_raster=rio.open('Aspect.tif') Aspect_arr=Aspect_raster.read(1) Curvature_raster=rio.open('Curvature.tif') Curvature_arr=Curvature_raster.read(1) TWI_raster=rio.open('TWI.tif') TWI_arr=TWI_raster.read(1) DTRoad_raster=rio.open('DTRoad.tif') DTRoad_arr=DTRoad_raster.read(1) DTRiver_raster=rio.open('DTRiver.tif') DTRiver_arr=DTRiver_raster.read(1) DTDrainage_raster=rio.open('DTDrainage.tif') DTDrainage_arr=DTDrainage_raster.read(1) CN_raster=rio.open('CN.tif') CN_arr=CN_raster.read(1) AP_raster=rio.open('AP.tif') AP_arr=AP_raster.read(1) FP_raster=rio.open('FP.tif') FP_arr=FP_raster.read(1) #show point and raster on a matplotlib plot fig, ax = plt.subplots(figsize=(12,12)) points.plot(ax=ax, color='orangered') show(DEM_raster, ax=ax)
Теперь мы прочитали точки как фрейм данных с помощью геопанд, открыли прогностические функции с помощью растерио и прочитали их как массивы nump. Затем нам нужно извлечь значения прогнозных признаков для затопленных и незатопленных точек.
# Extracting the raster values to the points shapefile # count=0 for index,row in points.iterrows(): #iterate over the points in the shapefile longitude=row['geometry'].x #get the longitude of the point latitude=row['geometry'].y #get the latitude of the point #print("Longitude="+str(longitude)) #print(count) #count +=1 rowIndex, colIndex=DEM_raster.index(longitude,latitude) # the corresponding pixel to the point (longitude,latitude) # Extract the raster values at the point location points['DEM'].loc[index]=DEM_arr[rowIndex, colIndex] points['Slope'].loc[index]=Slope_arr[rowIndex, colIndex] points['Aspect'].loc[index]=Aspect_arr[rowIndex, colIndex] points['Curvature'].loc[index]=Curvature_arr[rowIndex, colIndex] points['DTRoad'].loc[index]=DTRoad_arr[rowIndex, colIndex] points['DTRiver'].loc[index]=DTRiver_arr[rowIndex, colIndex] points['DTDrainage'].loc[index]=DTDrainage_arr[rowIndex, colIndex] points['TWI'].loc[index]=TWI_arr[rowIndex, colIndex] points['CN'].loc[index]=CN_arr[rowIndex, colIndex] points['AP'].loc[index]=AP_arr[rowIndex, colIndex] points['FP'].loc[index]=FP_arr[rowIndex, colIndex] points.head() # to have a look on the calculated fields. # Save the points file points.to_file('points_data.shp') # save as a shapfile # or points.to_pickle('points_data.pkl') # save as a pickle.
Теперь у нас есть шейп-файл точек, который указывает расположение затопленных и незатопленных мест и включает значения прогнозных признаков в каждой точке. В следующей статье мы объясним, как реализовать точечные модели для картирования подверженности городов ливневым наводнениям.