Skip to content
Snippets Groups Projects
Commit 5de66a3e authored by Roelofsen, Hans's avatar Roelofsen, Hans
Browse files

AHN from files

parent 7ad9279b
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,7 @@ try: ...@@ -8,6 +8,7 @@ try:
from ahn_read import get_opgaande_elementen, verify_matching_rasters from ahn_read import get_opgaande_elementen, verify_matching_rasters
from hoogtes_dbf import build_heights_table, heights_table_to_file from hoogtes_dbf import build_heights_table, heights_table_to_file
from flt_header import replace_hdr from flt_header import replace_hdr
from output_profile import build_output_profile, get_ahn_files
except ModuleNotFoundError: except ModuleNotFoundError:
from sample.geslotenheid.ahn_opgaande_elemenden.ahn_read import get_opgaande_elementen, verify_matching_rasters from sample.geslotenheid.ahn_opgaande_elemenden.ahn_read import get_opgaande_elementen, verify_matching_rasters
from sample.geslotenheid.ahn_opgaande_elemenden.read_write_windows import get_rw_windows from sample.geslotenheid.ahn_opgaande_elemenden.read_write_windows import get_rw_windows
...@@ -27,44 +28,66 @@ def build_opgaande_elementenkaart(**kwargs): ...@@ -27,44 +28,66 @@ def build_opgaande_elementenkaart(**kwargs):
""" """
dsm_source = kwargs['dsm_src'] output_profile, data_source = build_output_profile(**kwargs)
dtm_source = kwargs['dtm_src']
dsm = rio.open(dsm_source)
dtm = rio.open(dtm_source)
verify_matching_rasters(dsm, dtm)
windows = get_rw_windows(target_profile=dsm.profile,
sample=kwargs['sample'],
window_width=kwargs['w_width'],
window_height=kwargs['w_height'])
output_profile = dsm.profile
output_profile.update(dtype=np.uint16, nodata=0)
output_profile.update(driver={'tif': "GTiff", 'flt': 'EHdr'}[kwargs['of']])
extension = kwargs['of']
u_values = set() u_values = set()
with rio.open(os.path.join(kwargs['out_dir'], f'{kwargs["out_name"]}.{extension}'), 'w', **output_profile) as dest: with rio.open(os.path.join(kwargs['out_dir'], f'{kwargs["out_name"]}.{kwargs["of"]}'), 'w', **output_profile) as dest:
dest.update_tags(**kwargs) dest.update_tags(**kwargs)
for i, w in enumerate(windows, start=1): if data_source == 'file':
print(f'processing window {i}/{len(windows)}', end="\r") windows = get_rw_windows(target_profile=output_profile,
opg = get_opgaande_elementen( sample=kwargs['sample'],
dsm=dsm, window_width=kwargs['w_width'],
dtm=dtm, window_height=kwargs['w_height'])
read_window=w.rio_window,
minimum_difference=kwargs['min_diff'], dsm = rio.open(kwargs['dsm_src'])
uniform_height=kwargs['u_height'], dtm = rio.open(kwargs['dtm_src'])
maaiveld_value=kwargs['mv_value'], verify_matching_rasters(raster_a=dtm, raster_b=dsm)
)
dest.write(opg, 1, window=w.rio_window) for i, w in enumerate(windows, start=1):
u_values.update(np.unique(opg[opg != kwargs['mv_value']])) print(f'processing window {i}/{len(windows)}', end="\r")
opg = get_opgaande_elementen(
heights_table_to_file(os.path.join(kwargs['out_dir'], dsm=dsm,
dtm=dtm,
minimum_difference=kwargs['min_diff'],
uniform_height=kwargs['u_height'],
maaiveld_value=kwargs['mv_value'],
window=w.rio_window,
)
dest.write(opg, 1, window=w.rio_window)
u_values.update(np.unique(opg[opg != kwargs['mv_value']]))
if data_source == 'directory':
i = 0
for dsm_src, dtm_src in get_ahn_files(**kwargs):
dsm = rio.open(dsm_src)
dtm = rio.open(dtm_src)
verify_matching_rasters(raster_a=dtm, raster_b=dsm)
print(f'processing DSM-DTM file {i}/?', end="\r")
opg = get_opgaande_elementen(
dsm=dsm,
dtm=dtm,
minimum_difference=kwargs['min_diff'],
uniform_height=kwargs['u_height'],
maaiveld_value=kwargs['mv_value'],
)
dest.write(opg, 1, window=rio.windows.from_bounds(left=dsm.bounds.left,
bottom=dsm.bounds.bottom,
right=dsm.bounds.right,
top=dsm.bounds.top,
transform=output_profile['transform']))
u_values.update(np.unique(opg[opg != kwargs['mv_value']]))
i += 1
heights_table_to_file(os.path.join(kwargs['out_dir'],
f'{kwargs["out_name"]}_heights.dbf'), f'{kwargs["out_name"]}_heights.dbf'),
build_heights_table(list(u_values))) build_heights_table(list(u_values)))
...@@ -95,7 +118,6 @@ if __name__ == '__main__': ...@@ -95,7 +118,6 @@ if __name__ == '__main__':
try: try:
build_opgaande_elementenkaart(**vars(args)) build_opgaande_elementenkaart(**vars(args))
if args.filter_powerlines: if args.filter_powerlines:
filter_opgaande_elementen_under_powerlines(**vars(args)) filter_opgaande_elementen_under_powerlines(**vars(args))
except (ValueError, AssertionError) as e: except (ValueError, AssertionError) as e:
......
...@@ -160,10 +160,10 @@ def cap_dsm_to_dtm(dsm_array, dsm_nodata, ...@@ -160,10 +160,10 @@ def cap_dsm_to_dtm(dsm_array, dsm_nodata,
def get_opgaande_elementen( def get_opgaande_elementen(
dsm: rio.DatasetReader, dsm: rio.DatasetReader,
dtm: rio.DatasetReader, dtm: rio.DatasetReader,
read_window: rio.windows.Window,
minimum_difference: int = 3, minimum_difference: int = 3,
maaiveld_value: int = 0, maaiveld_value: int = 0,
uniform_height: int = 0, uniform_height: int = 0,
**kwargs
) -> np.array: ) -> np.array:
""" """
Read DSM and DTM for a certain bounding box. Return array with DSM-DTM differences Read DSM and DTM for a certain bounding box. Return array with DSM-DTM differences
...@@ -196,12 +196,12 @@ def get_opgaande_elementen( ...@@ -196,12 +196,12 @@ def get_opgaande_elementen(
""" """
# dtm_array = dtm.read(1)#, window=read_window) # dtm_array = dtm.read(1)#, window=read_window)
dtm_array = fill_array(dtm.read(1, window=read_window), nodata=dtm.nodata) dtm_array = fill_array(dtm.read(1, **kwargs), nodata=dtm.nodata)
dsm_array = dsm.read(1, window=read_window) dsm_array = dsm.read(1, **kwargs)
if np.all(dsm_array == dsm.nodata): if np.all(dsm_array == dsm.nodata):
# print(' All nodata, returning dummy array') # print(' All nodata, returning dummy array')
return np.multiply(np.ones(shape=(read_window.height, read_window.width)), return np.multiply(np.ones(shape=dsm_array.shape),
maaiveld_value) maaiveld_value)
verify = verify_dsm_exceeds_dtm(dsm_array=dsm_array, dsm_nodata=dsm.nodata, verify = verify_dsm_exceeds_dtm(dsm_array=dsm_array, dsm_nodata=dsm.nodata,
......
import os
import random
from typing import Tuple
import affine
import numpy as np
import pandas as pd
import rasterio as rio
from rasterio.coords import BoundingBox
from rasterio.shutil import exists
DEFAULT_BOUNDS = BoundingBox(left=0, bottom=300000, right=280000, top=625000)
def build_output_profile(**kwargs) -> Tuple[dict, str]:
"""
Build output profile
Parameters
----------
kwargs
Returns
-------
"""
if os.path.isfile(kwargs['dsm_src']):
dsm_sample_file = rio.open(kwargs['dsm_src'])
origin = 'file'
elif os.path.isdir(kwargs['dsm_src']):
dsm_sample_file = rio.open(os.path.join(kwargs['dsm_src'], os.listdir(kwargs['dsm_src'])[0]))
origin = 'directory'
else:
print('unknown source')
profile = rio.default_gtiff_profile.copy()
profile.update(dtype=np.uint16, nodata=0, crs=dsm_sample_file.crs)
profile.update(driver={'tif': "GTiff", 'flt': 'EHdr'}[kwargs['of']])
resolution = dsm_sample_file.res[0]
profile.update(transform=affine.Affine(a=resolution,
b=0,
c=dsm_sample_file.bounds.left if origin == "file" else DEFAULT_BOUNDS.left,
d=0,
e=resolution * -1,
f=dsm_sample_file.bounds.top if origin == "file" else DEFAULT_BOUNDS.top
))
profile.update(height=dsm_sample_file.shape[0] if origin == 'file' else int((DEFAULT_BOUNDS.top - DEFAULT_BOUNDS.bottom) / resolution),
width=dsm_sample_file.shape[1] if origin == 'file' else int((DEFAULT_BOUNDS.right - DEFAULT_BOUNDS.left) / resolution),
count=1,
nodata=0)
return profile, origin
def get_ahn_files(**kwargs):
"""
retrieve list of DSM and DTM files. Match based on filename
Parameters
----------
kwargs
Returns
-------
"""
d = {}
for x in ['dsm', 'dtm']:
assert os.path.isdir(kwargs[f'{x}_src'])
d[x] = [os.path.join(kwargs[f'{x}_src'], f) for f in os.listdir(kwargs[f'{x}_src']) if exists(os.path.join(kwargs[f'{x}_src'], f))]
dsms = pd.Series(d['dsm']).sort_values()
dtms = pd.Series(d['dtm']).sort_values()
assert dsms.shape == dtms.shape
if kwargs['sample'] > 0:
return random.sample([(dsm, dtm) for dsm, dtm in zip(dsms, dtms)], kwargs['sample'])
else:
return [(dsm, dtm) for dsm, dtm in zip(dsms, dtms)]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment