Source code for gempy.core.grid_modules.topography
import numpy as np
from .create_topography import LoadDEMArtificial, LoadDEMGDAL
import skimage
[docs]class Topography:
"""
Object to include topography in the model.
Notes:
This always assumes that the topography we pass fits perfectly the extent
"""
[docs] def __init__(self, regular_grid=None, regular_grid_extent=None, regular_grid_resolution=None):
if regular_grid is None and (regular_grid_extent is None or regular_grid_resolution is None):
raise AttributeError('You need to pass either a regular grid or'
'extent and resolution')
# Set the extent and resolution of the grid
if regular_grid_resolution is None:
self.regular_grid_resolution = regular_grid.resolution[:2]
else:
self.regular_grid_resolution = regular_grid_resolution
assert all(np.asarray(self.regular_grid_resolution) >= 2), 'The regular grid needs to be at least of size 2 on all ' \
'directions.'
self.extent = regular_grid.extent[:] if regular_grid_extent is None else regular_grid_extent
# Values (n, 3)
self.values = np.zeros((0, 3))
# Values (n, n, 3)
self.values_2d = np.zeros((0, 3))
# Shape original
self.raster_shape = tuple()
# Topography Resolution
self.resolution = np.zeros((0, 3))
# Source for the
self.source = None
# Coords
self._x = None
self._y = None
@property
def x(self):
if self._x is not None:
return self._x
else:
val = self.values[:, 0]
val.sort()
return np.unique(val)
@property
def y(self):
if self._y is not None:
return self._y
else:
val = self.values[:, 1]
val.sort()
return np.unique(val)
[docs] def set_values(self, values_2d: np.ndarray):
"""General method to set topography
Args:
values_2d (numpy.ndarray[float,float, 3]): array with the XYZ values
in 2D
Returns:
:class:`gempy.core.grid_modules.topography.Topography`
"""
# Original topography data
self.values_2d = values_2d
self.resolution = values_2d.shape[:2]
# n,3 array
self.values = values_2d.reshape((-1, 3), order='C')
return self
[docs] def crop_topography(self, extent):
"""Crop the topography to a given extent.
This may be useful for example to mask the regular grid.
Args:
extent:
Returns:
"""
raise NotImplementedError
def resize_topo(self):
regular_grid_topo = skimage.transform.resize(
self.values_2d,
(self.regular_grid_resolution[0], self.regular_grid_resolution[1]),
mode='constant',
anti_aliasing=False, preserve_range=True)
return regular_grid_topo
def load_random_hills(self, **kwargs):
if 'extent' in kwargs:
self.extent = kwargs.pop('extent')
if 'resolution' in kwargs:
self.regular_grid_resolution = kwargs.pop('resolution')
dem = LoadDEMArtificial(extent=self.extent,
resolution=self.regular_grid_resolution, **kwargs)
self._x, self._y = dem.x, dem.y
self.set_values(dem.get_values())
def load_from_gdal(self, filepath):
dem = LoadDEMGDAL(filepath, extent=self.extent)
self._x, self._y = None, None
self.set_values(dem.get_values())
# self.source = 'gdal'
def save(self, path):
np.save(path, self.values_2d)
def load(self, path):
self.set_values(np.load(path))
self._x, self._y = None, None
return self.values
def load_from_saved(self, *args, **kwargs):
self.load(*args, **kwargs)