DEM و منحصر کردن شبکه جریان با پایتون و Pyshed - آموزش
مقدمه
در دوران مدرن، الگوریتم های کامپیوتری می توانند ویژگی های هیدرولوژیکی را از ساخت توپوگرافی تفسیر کنند. پس از تعریف یک حوضه زهکشی، تمام آب هایی که در یک منطقه قرار می گیرند، باید در یک خروجی مشترک با گرانش به عنوان تنها نیروی محرکه تخلیه شوند. برای یک توپوگرافی حوضه ای "هیدرولوژیکی"، تمام شبکه های زهکشی باید مسیر نزولی را به نقطه تخلیه داشته باشند، بنابراین هر سینک یا depressions "مسیر" روبروی سطح را متوقف می کند و کامپیوتر از شبکه رودخانه عبور نخواهد کرد.
مدل های ارتفاعی دیجیتال (DEMs) از تفسیر ماهواره ای (Aster DEM یا Alos Palsar) با "اشتباه" از اشتباهات در تفسیر ارتفاع، رزیست رادیکال و یا بازتولید می شوند. نیاز به اصلاح این رسترها برای تفسیر ویژگی های هیدرولوژیکی وجود دارد. این آموزش فرایند را نشان می دهد که یک مدل ارتفاع دیجیتالی (DEM) را از یک سرور NASA / USGS با کتابخانه Pysheds پایتون بارگیری می کند. آموزش بر روی یک نوت بوک Jupyter انجام شد، فایل های ورودی و اسکریپت ها در بخش نهایی پست قرار می گیرند.
Pysheds
ویژگی های جدید در Pysheds برای حوضه و توزیع شبکه جریان وجود دارد. تا تاریخ این پست (22-01-2019)، آخرین نسخه Pysheds اجازه استفاده از مدل های ارتفاعی دیجیتال را در مختصات جغرافیایی (WGS84) و مختصات پیش بینی شده (WGS 84 UTM) می دهد. این قابلیت تطبیق تجزیه و تحلیل هیدرولوژیکی را افزایش می دهد.
دو مجموعه دستورات Pyshed برای این آموزش برای تهیه DEM مورد استفاده قرار گرفتند:
تشخیص و پر کردن depressions
تشخیص و حل و فصل flats
به طور معمول، تشخیص depressions در بازرسی بصری آسان نیست زیرا آنها در تعداد کمی از سلول ها قرار دارند. هنگامی که Pysheds آنها را پر کرد، باید بخش های مسطح را روی DEM اصلاح شده حل کند.
ELEVATION REPRESENTATION WITH STREAM NETWORK
DEPRESSIONS ON THE DEM (RED PIXELS)
FLAT PARTS AFTER THE DEPRESSION FILL
توپوگرافی نهایی و تصحیح شده در شبکه جریان از اصلی متفاوت است، همانطور که در شکل زیر دیده می شود. توپوگرافی سطح اصلی آبی تیره است، در حالی که ارتفاع اصلاح شده در آبی روشن نشان داده شده است.
Python code
This is the python code for this tutorial:
#Import required libraries
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as colors
import geopandas as gpd
from pysheds.grid import Grid
import mplleaflet
%matplotlib inline
#Open a digital elevation model
grid = Grid.from_raster('../Rst/20190109125130_1063922483.tif', data_name='dem')
#Define a function to plot the digital elevation model
def plotFigure(data, label, cmap='Blues'):
plt.figure(figsize=(12,10))
plt.imshow(data, extent=grid.extent)
plt.colorbar(label=label)
plt.grid()
#Minnor slicing on borders to enhance colobars
elevDem=grid.dem[:-1,:-1]
plotFigure(elevDem, 'Elevation (m)')
# Detect depressions
# Detect depressions
depressions = grid.detect_depressions('dem')
# Plot depressions
plt.imshow(depressions)
# Fill depressions
grid.fill_depressions(data='dem', out_name='flooded_dem')
# Test result
depressions = grid.detect_depressions('flooded_dem')
plt.imshow(depressions)
# Detect flats
flats = grid.detect_flats('flooded_dem')
# Plot flats
plt.imshow(flats)
grid.resolve_flats(data='flooded_dem', out_name='inflated_dem')
plt.imshow(grid.inflated_dem[:-1,:-1])
# Create a flow direction grid
#N NE E SE S SW W NW
dirmap = (64, 128, 1, 2, 4, 8, 16, 32)
grid.flowdir(data='inflated_dem', out_name='dir', dirmap=dirmap)
plotFigure(grid.dir,'Flow Direction','viridis')
# Specify discharge point
x, y = -107.91663,27.83479
# Delineate the catchment
grid.catchment(data='dir', x=x, y=y, dirmap=dirmap, out_name='catch',
recursionlimit=15000, xytype='label', nodata_out=0)
# Clip the bounding box to the catchment
grid.clip_to('catch')
# Get a view of the catchment
demView = grid.view('dem', nodata=np.nan)
plotFigure(demView,'Elevation')
#export selected raster
grid.to_raster(demView, '../Output/clippedElevations_WGS84.tif')
# Define the stream network
grid.accumulation(data='catch', dirmap=dirmap, pad_inplace=False, out_name='acc')
accView = grid.view('acc', nodata=np.nan)
plotFigure(accView,"Cell Number",'PuRd')
streams = grid.extract_river_network('catch', 'acc', threshold=200, dirmap=dirmap)
streams["features"][:2]
def saveDict(dic,file):
f = open(file,'w')
f.write(str(dic))
f.close()
#save geojson as separate file
saveDict(streams,'../Output/streams_WGS84.geojson')
# Some functions to plot the json on jupyter notebook
streamNet = gpd.read_file('../Output/streams_WGS84.geojson')
streamNet.crs = {'init' :'epsg:4326'}
# The polygonize argument defaults to the grid mask when no arguments are supplied
shapes = grid.polygonize()
# Plot catchment boundaries
fig, ax = plt.subplots(figsize=(6.5, 6.5))
for shape in shapes:
coords = np.asarray(shape[0]['coordinates'][0])
ax.plot(coords[:,0], coords[:,1], color='cyan')
ax.set_xlim(grid.bbox[0], grid.bbox[2])
ax.set_ylim(grid.bbox[1], grid.bbox[3])
ax.set_title('Catchment boundary (vector)')
gpd.plotting.plot_dataframe(streamNet, None, cmap='Blues', ax=ax)
#ax = streamNet.plot()
mplleaflet.display(fig=ax.figure, crs=streamNet.crs, tiles='esri_aerial')
شناسه تلگرام مدیر سایت: SubBasin@
نشانی ایمیل: behzadsarhadi@gmail.com
(سوالات تخصصی را در گروه تلگرام ارسال کنید)
_______________________________________________________
نظرات (۰)