В последней статье мы представили городские ливневые наводнения и применение моделей, управляемых данными, для картографирования городских ливневых наводнений. Эта серия статей обобщает и поясняет (с кодом 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.

Теперь у нас есть шейп-файл точек, который указывает расположение затопленных и незатопленных мест и включает значения прогнозных признаков в каждой точке. В следующей статье мы объясним, как реализовать точечные модели для картирования подверженности городов ливневым наводнениям.