Geospatial transforms
We provide a very powerful list of transforms that were designed to work seamlessly with geospatial data. These transforms are implemented in different packages depending on how they interact with geometries.
The list of supported transforms is continuously growing. The following code can be used to print an updated list in any project environment:
# packages to print type tree
using InteractiveUtils
using AbstractTrees
using TransformsBase
# packages with transforms
using GeoStats
# define the tree of types
AbstractTrees.children(T::Type) = subtypes(T)
# print all currently available transforms
AbstractTrees.print_tree(TransformsBase.Transform)
Transform
├─ GeometricTransform
│ ├─ Bridge
│ ├─ CoordinateTransform
│ │ ├─ Affine
│ │ ├─ LengthUnit
│ │ ├─ Morphological
│ │ ├─ Proj
│ │ ├─ Rotate
│ │ ├─ Scale
│ │ ├─ Stretch
│ │ └─ Translate
│ ├─ LambdaMuSmoothing
│ ├─ Repair
│ ├─ Shadow
│ ├─ Slice
│ └─ StdCoords
├─ Identity
├─ TableTransform
│ ├─ Aggregate
│ ├─ CookieCutter
│ ├─ Detrend
│ ├─ Downscale
│ ├─ FeatureTransform
│ │ ├─ EigenAnalysis
│ │ ├─ Remainder
│ │ ├─ ColwiseFeatureTransform
│ │ │ ├─ Center
│ │ │ ├─ Coalesce
│ │ │ ├─ LowHigh
│ │ │ ├─ Quantile
│ │ │ └─ ZScore
│ │ └─ StatelessFeatureTransform
│ │ ├─ AbsoluteUnits
│ │ ├─ Assert
│ │ ├─ Closure
│ │ ├─ Coerce
│ │ ├─ ColTable
│ │ ├─ Compose
│ │ ├─ DropConstant
│ │ ├─ DropExtrema
│ │ ├─ DropMissing
│ │ ├─ DropNaN
│ │ ├─ DropUnits
│ │ ├─ Filter
│ │ ├─ Functional
│ │ ├─ Indicator
│ │ ├─ Learn
│ │ ├─ Levels
│ │ ├─ Map
│ │ ├─ OneHot
│ │ ├─ ProjectionPursuit
│ │ ├─ Reject
│ │ ├─ Rename
│ │ ├─ Replace
│ │ ├─ RowTable
│ │ ├─ Sample
│ │ ├─ Satisfies
│ │ ├─ Select
│ │ ├─ Sort
│ │ ├─ StdFeats
│ │ ├─ StdNames
│ │ ├─ LogRatio
│ │ │ ├─ ALR
│ │ │ ├─ CLR
│ │ │ └─ ILR
│ │ ├─ Unit
│ │ └─ Unitify
│ ├─ ClusteringTransform
│ │ ├─ GHC
│ │ ├─ GSC
│ │ └─ SLIC
│ ├─ Interpolate
│ ├─ InterpolateMissing
│ ├─ InterpolateNaN
│ ├─ InterpolateNeighbors
│ ├─ Potrace
│ ├─ Rasterize
│ ├─ Simulate
│ ├─ ParallelTableTransform
│ ├─ Transfer
│ ├─ UniqueCoords
│ └─ Upscale
└─ SequentialTransform
Transforms at the leaves of the tree above should have a docstring with more information on the available options. For example, the documentation of the Select
transform is shown below:
TableTransforms.Select
— TypeSelect(col₁, col₂, ..., colₙ)
Select([col₁, col₂, ..., colₙ])
Select((col₁, col₂, ..., colₙ))
The transform that selects columns col₁
, col₂
, ..., colₙ
.
Select(col₁ => newcol₁, col₂ => newcol₂, ..., colₙ => newcolₙ)
Selects the columns col₁
, col₂
, ..., colₙ
and rename them to newcol₁
, newcol₂
, ..., newcolₙ
.
Select(regex)
Selects the columns that match with regex
.
Examples
Select(1, 3, 5)
Select([:a, :c, :e])
Select(("a", "c", "e"))
Select(1 => :x, 3 => :y)
Select(:a => :x, :b => :y)
Select("a" => "x", "b" => "y")
Select(r"[ace]")
Transforms of type FeatureTransform
operate on the attribute table, whereas transforms of type GeometricTransform
operate on the underlying geospatial domain:
TableTransforms.FeatureTransform
— TypeFeatureTransform
A transform that operates on the columns of the table containing features, i.e., simple attributes such as numbers, strings, etc.
Meshes.GeometricTransform
— TypeGeometricTransform
A method to transform the geometry (e.g. coordinates) of objects. See https://en.wikipedia.org/wiki/Geometric_transformation.
Other transforms such as Detrend
are defined in terms of both the geospatial domain and the attribute table. All transforms and pipelines implement the following functions:
TransformsBase.isrevertible
— Functionisrevertible(transform)
Tells whether or not the transform
is revertible, i.e. supports a revert
function. Defaults to false
for new transform types.
Transforms can be revertible and yet don't be invertible. Invertibility is a mathematical concept, whereas revertibility is a computational concept.
See also isinvertible
.
TransformsBase.isinvertible
— Functionisinvertible(transform)
Tells whether or not the transform
is invertible, i.e. whether it implements the inverse
function. Defaults to false
for new transform types.
Transforms can be invertible in the mathematical sense, i.e., there exists a one-to-one mapping between input and output spaces.
See also inverse
, isrevertible
.
TransformsBase.inverse
— FunctionTransformsBase.apply
— Functionnewobject, cache = apply(transform, object)
Apply transform
on the object
. Return the newobject
and a cache
to revert the transform later.
TransformsBase.revert
— Functionobject = revert(transform, newobject, cache)
Revert the transform
on the newobject
using the cache
from the corresponding apply
call and return the original object
. Only defined when the transform
isrevertible
.
TransformsBase.reapply
— Functionnewobject = reapply(transform, object, cache)
Reapply the transform
to (a possibly different) object
using a cache
that was created with a previous apply
call. Fallback to apply
without using the cache
.
Feature transforms
Please check the TableTransforms.jl documentation for an updated list of feature transforms. As an example consider the following features over a Cartesian grid and their statistics:
using DataFrames
# table of features and domain
tab = DataFrame(a=rand(1000), b=randn(1000), c=rand(1000))
dom = CartesianGrid(100, 100)
# georeference table onto domain
Ω = georef(tab, dom)
# describe features
describe(values(Ω))
Row | variable | mean | min | median | max | nmissing | eltype |
---|---|---|---|---|---|---|---|
Symbol | Float64 | Float64 | Float64 | Float64 | Int64 | DataType | |
1 | a | 0.500666 | 0.000617235 | 0.509991 | 0.999665 | 0 | Float64 |
2 | b | -0.00628877 | -3.13443 | 0.0282004 | 3.20553 | 0 | Float64 |
3 | c | 0.500684 | 0.00232394 | 0.48421 | 0.996848 | 0 | Float64 |
We can create a pipeline that transforms the features to their normal quantile (or scores):
pipe = Quantile()
Ω̄, cache = apply(pipe, Ω)
describe(values(Ω̄))
Row | variable | mean | min | median | max | nmissing | eltype |
---|---|---|---|---|---|---|---|
Symbol | Float64 | Float64 | Float64 | Float64 | Int64 | DataType | |
1 | a | 0.00309023 | -3.09023 | 0.00125332 | 3.09023 | 0 | Float64 |
2 | b | 0.00309023 | -3.09023 | 0.00125332 | 3.09023 | 0 | Float64 |
3 | c | 0.00309023 | -3.09023 | 0.00125332 | 3.09023 | 0 | Float64 |
We can then revert the transform given any new geospatial data in the transformed sample space:
Ωₒ = revert(pipe, Ω̄, cache)
describe(values(Ωₒ))
Row | variable | mean | min | median | max | nmissing | eltype |
---|---|---|---|---|---|---|---|
Symbol | Float64 | Float64 | Float64 | Float64 | Int64 | DataType | |
1 | a | 0.501164 | 0.00224192 | 0.510386 | 0.997788 | 0 | Float64 |
2 | b | -0.00345502 | -2.90787 | 0.0290454 | 2.91113 | 0 | Float64 |
3 | c | 0.501182 | 0.0052542 | 0.484989 | 0.996202 | 0 | Float64 |
The Learn
transform is another important transform from StatsLearnModels.jl:
StatsLearnModels.Learn
— TypeLearn(train, model, incols => outcols)
Fits the statistical learning model
using the input columns, selected by incols
, and the output columns, selected by outcols
, from the train
table.
The column selection can be a single column identifier (index or name), a collection of identifiers or a regular expression (regex).
Examples
Learn(train, model, [1, 2, 3] => "d")
Learn(train, model, [:a, :b, :c] => :d)
Learn(train, model, ["a", "b", "c"] => 4)
Learn(train, model, [1, 2, 3] => [:d, :e])
Learn(train, model, r"[abc]" => ["d", "e"])
For more details, consider watching our JuliaCon2021 talk:
Geometric transforms
Please check the Meshes.jl documentation for an updated list of geometric transforms. As an example consider the rotation of geospatial data over a Cartesian grid:
# geospatial domain
Ω = georef((Z=rand(10, 10),))
# apply geometric transform
Ωr = Ω |> Rotate(Angle2d(π/4))
fig = Mke.Figure(size = (800, 400))
viz(fig[1,1], Ω.geometry, color = Ω.Z)
viz(fig[1,2], Ωr.geometry, color = Ωr.Z)
fig
Geostatistical transforms
Bellow is the current list of transforms that operate on both the geometries and features of geospatial data. They are implemented in the GeoStatsBase.jl package.
UniqueCoords
GeoStatsTransforms.UniqueCoords
— TypeUniqueCoords(var₁ => agg₁, var₂ => agg₂, ..., varₙ => aggₙ)
Retain locations in data with unique coordinates.
Duplicates of a variable varᵢ
are aggregated with aggregation function aggᵢ
. If an aggregation function is not defined for variable varᵢ
, the default aggregation function will be used. Default aggregation function is mean
for continuous variables and first
otherwise.
Examples
UniqueCoords(1 => last, 2 => maximum)
UniqueCoords(:a => first, :b => minimum)
UniqueCoords("a" => last, "b" => maximum)
# point set with repeated points
p = rand(Point, 50)
Ω = georef((Z=rand(100),), [p; p])
Z | geometry |
---|---|
Continuous | Point |
[NoUnits] | 🖈 Cartesian{NoDatum} |
0.0170029 | (x: 0.682365 m, y: 0.871545 m, z: 0.103151 m) |
0.937852 | (x: 0.52414 m, y: 0.742948 m, z: 0.268063 m) |
0.214006 | (x: 0.681288 m, y: 0.31579 m, z: 0.0850491 m) |
0.806907 | (x: 0.235482 m, y: 0.940148 m, z: 0.971315 m) |
0.843504 | (x: 0.587495 m, y: 0.889646 m, z: 0.666905 m) |
0.30077 | (x: 0.521506 m, y: 0.20534 m, z: 0.824848 m) |
0.926919 | (x: 0.280218 m, y: 0.957086 m, z: 0.681893 m) |
0.710748 | (x: 0.428888 m, y: 0.70393 m, z: 0.22674 m) |
0.924174 | (x: 0.507746 m, y: 0.0354666 m, z: 0.120916 m) |
0.245503 | (x: 0.269623 m, y: 0.890063 m, z: 0.737073 m) |
⋮ | ⋮ |
# discard repeated points
𝒰 = Ω |> UniqueCoords()
Z | geometry |
---|---|
Continuous | Point |
[NoUnits] | 🖈 Cartesian{NoDatum} |
0.311872 | (x: 0.682365 m, y: 0.871545 m, z: 0.103151 m) |
0.576858 | (x: 0.52414 m, y: 0.742948 m, z: 0.268063 m) |
0.453384 | (x: 0.681288 m, y: 0.31579 m, z: 0.0850491 m) |
0.776397 | (x: 0.235482 m, y: 0.940148 m, z: 0.971315 m) |
0.85828 | (x: 0.587495 m, y: 0.889646 m, z: 0.666905 m) |
0.299307 | (x: 0.521506 m, y: 0.20534 m, z: 0.824848 m) |
0.827628 | (x: 0.280218 m, y: 0.957086 m, z: 0.681893 m) |
0.568724 | (x: 0.428888 m, y: 0.70393 m, z: 0.22674 m) |
0.617143 | (x: 0.507746 m, y: 0.0354666 m, z: 0.120916 m) |
0.600408 | (x: 0.269623 m, y: 0.890063 m, z: 0.737073 m) |
⋮ | ⋮ |
Detrend
GeoStatsTransforms.Detrend
— TypeDetrend(col₁, col₂, ..., colₙ; degree=1)
Detrend([col₁, col₂, ..., colₙ]; degree=1)
Detrend((col₁, col₂, ..., colₙ); degree=1)
The transform that detrends columns col₁
, col₂
, ..., colₙ
with a polynomial of given degree
.
Detrend(regex; degree=1)
Detrends the columns that match with regex
.
Examples
Detrend(1, 3, 5)
Detrend([:a, :c, :e])
Detrend(("a", "c", "e"))
Detrend(r"[ace]", degree=2)
Detrend(:)
References
- Menafoglio, A., Secchi, P. 2013. A Universal Kriging predictor for spatially dependent functional data of a Hilbert Space
# quadratic trend + random noise
r = range(-1, stop=1, length=100)
μ = [x^2 + y^2 for x in r, y in r]
ϵ = 0.1rand(100, 100)
Ω = georef((Z=μ+ϵ,))
# detrend and obtain noise component
𝒩 = Ω |> Detrend(:Z, degree=2)
fig = Mke.Figure(size = (800, 400))
viz(fig[1,1], Ω.geometry, color = Ω.Z)
viz(fig[1,2], 𝒩.geometry, color = 𝒩.Z)
fig
Potrace
GeoStatsTransforms.Potrace
— TypePotrace(mask; [ϵ])
Potrace(mask, var₁ => agg₁, ..., varₙ => aggₙ; [ϵ])
Trace polygons on 2D image data with Selinger's Potrace algorithm.
The categories stored in column mask
are converted into binary masks, which are then traced into multi-polygons. When provided, the option ϵ
is forwarded to Selinger's simplification algorithm.
Duplicates of a variable varᵢ
are aggregated with aggregation function aggᵢ
. If an aggregation function is not defined for variable varᵢ
, the default aggregation function will be used. Default aggregation function is mean
for continuous variables and first
otherwise.
Examples
Potrace(:mask, ϵ=0.1)
Potrace(1, 1 => last, 2 => maximum)
Potrace(:mask, :a => first, :b => minimum)
Potrace("mask", "a" => last, "b" => maximum)
References
- Selinger, P. 2003. Potrace: A polygon-based tracing algorithm
# continuous feature
Z = [sin(i/10) + sin(j/10) for i in 1:100, j in 1:100]
# binary mask
M = Z .> 0
# georeference data
Ω = georef((Z=Z, M=M))
# trace polygons using mask
𝒯 = Ω |> Potrace(:M)
fig = Mke.Figure(size = (800, 400))
viz(fig[1,1], Ω.geometry, color = Ω.Z)
viz(fig[1,2], 𝒯.geometry, color = 𝒯.Z)
fig
𝒯.geometry
2 GeometrySet
├─ Multi(4×PolyArea)
└─ Multi(4×PolyArea)
Rasterize
GeoStatsTransforms.Rasterize
— TypeRasterize(grid)
Rasterize(grid, var₁ => agg₁, ..., varₙ => aggₙ)
Rasterize geometries within specified grid
.
Rasterize(nx, ny)
Rasterize(nx, ny, var₁ => agg₁, ..., varₙ => aggₙ)
Alternatively, use the grid with size nx
by ny
obtained with discretization of the bounding box.
Duplicates of a variable varᵢ
are aggregated with aggregation function aggᵢ
. If an aggregation function is not defined for variable varᵢ
, the default aggregation function will be used. Default aggregation function is mean
for continuous variables and first
otherwise.
Examples
grid = CartesianGrid(10, 10)
Rasterize(grid)
Rasterize(10, 10)
Rasterize(grid, 1 => last, 2 => maximum)
Rasterize(10, 10, 1 => last, 2 => maximum)
Rasterize(grid, :a => first, :b => minimum)
Rasterize(10, 10, :a => first, :b => minimum)
Rasterize(grid, "a" => last, "b" => maximum)
Rasterize(10, 10, "a" => last, "b" => maximum)
A = [1, 2, 3, 4, 5]
B = [1.1, 2.2, 3.3, 4.4, 5.5]
p1 = PolyArea((2, 0), (6, 2), (2, 2))
p2 = PolyArea((0, 6), (3, 8), (0, 10))
p3 = PolyArea((3, 6), (9, 6), (9, 9), (6, 9))
p4 = PolyArea((7, 0), (10, 0), (10, 4), (7, 4))
p5 = PolyArea((1, 3), (5, 3), (6, 6), (3, 8), (0, 6))
gt = georef((; A, B), [p1, p2, p3, p4, p5])
nt = gt |> Rasterize(20, 20)
viz(nt.geometry, color = nt.A)
Clustering
Unlike traditional clustering algorithms in machine learning, geostatistical clustering (a.k.a. domaining) algorithms consider both the features and the geospatial coordinates of the data.
Consider the following data as an example:
Ω = georef((Z=[10sin(i/10) + j for i in 1:4:100, j in 1:4:100],))
viz(Ω.geometry, color = Ω.Z)
GeoStatsTransforms.GHC
— TypeGHC(k, λ; kern=:epanechnikov, link=:ward, as=:cluster)
A transform for partitioning geospatial data into k
clusters according to a range λ
using Geostatistical Hierarchical Clustering (GHC). The larger the range the more connected are nearby samples.
Parameters
k
- Approximate number of clustersλ
- Approximate range of kernel function in length unitskern
- Kernel function (:uniform
,:triangular
or:epanechnikov
)link
- Linkage function (:single
,:average
,:complete
,:ward
or:ward_presquared
)as
- Variable name used to store clustering results
References
- Fouedjio, F. 2016. A hierarchical clustering method for multivariate geostatistical data
Notes
- The range parameter controls the sparsity pattern of the pairwise distances, which can greatly affect the computational performance of the GHC algorithm. We recommend choosing a range that is small enough to connect nearby samples. For example, clustering data over a 100x100 Cartesian grid with unit spacing is possible with
λ=1.0
orλ=2.0
but the problem starts to become computationally unfeasible aroundλ=10.0
due to the density of points.
𝒞 = Ω |> GHC(20, 1.0)
viz(𝒞.geometry, color = 𝒞.cluster)
GeoStatsTransforms.GSC
— TypeGSC(k, m; σ=1.0, tol=1e-4, maxiter=10, weights=nothing, as=:cluster)
A transform for partitioning geospatial data into k
clusters using Geostatistical Spectral Clustering (GSC).
Parameters
k
- Desired number of clustersm
- Multiplicative factor for adjacent weightsσ
- Standard deviation for exponential model (default to1.0
)tol
- Tolerance of k-means algorithm (default to1e-4
)maxiter
- Maximum number of iterations (default to10
)weights
- Dictionary with weights for each attribute (default tonothing
)as
- Variable name used to store clustering results
References
- Romary et al. 2015. Unsupervised classification of multivariate geostatistical data: Two algorithms
Notes
- The algorithm implemented here is slightly different than the algorithm
described in Romary et al. 2015. Instead of setting Wᵢⱼ = 0 when i <-/-> j, we simply magnify the weight by a multiplicative factor Wᵢⱼ *= m when i <–> j. This leads to dense matrices but also better results in practice.
𝒞 = Ω |> GSC(50, 2.0)
viz(𝒞.geometry, color = 𝒞.cluster)
GeoStatsTransforms.SLIC
— TypeSLIC(k, m; tol=1e-4, maxiter=10, weights=nothing, as=:cluster)
A transform for clustering geospatial data into approximately k
clusters using Simple Linear Iterative Clustering (SLIC). The transform produces clusters of samples that are spatially connected based on a distance dₛ
and that, at the same time, are similar in terms of vars
with distance dᵥ
. The tradeoff is controlled with a hyperparameter parameter m
in an additive model dₜ = √(dᵥ² + m²(dₛ/s)²)
.
Parameters
k
- Approximate number of clustersm
- Hyperparameter of SLIC modeltol
- Tolerance of k-means algorithm (default to1e-4
)maxiter
- Maximum number of iterations (default to10
)weights
- Dictionary with weights for each attribute (default tonothing
)as
- Variable name used to store clustering results
References
- Achanta et al. 2011. SLIC superpixels compared to state-of-the-art superpixel methods
𝒞 = Ω |> SLIC(50, 0.01)
viz(𝒞.geometry, color = 𝒞.cluster)
Interpolate
GeoStatsTransforms.Interpolate
— TypeInterpolate(domain, vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
Interpolate([g₁, g₂, ..., gₙ], vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
Interpolate geospatial data on given domain
or vector of geometries [g₁, g₂, ..., gₙ]
, using geostatistical models model₁
, ..., modelₙ
for variables vars₁
, ..., varsₙ
.
Interpolate(domain, model=NN(); [parameters])
Interpolate([g₁, g₂, ..., gₙ], model=NN(); [parameters])
Interpolate geospatial data on given domain
or vector of geometries [g₁, g₂, ..., gₙ]
, using geostatistical model
for all variables.
Parameters
point
- Perform interpolation on point support (default totrue
)prob
- Perform probabilistic interpolation (default tofalse
)
See also InterpolateNeighbors
, InterpolateMissing
, InterpolateNaN
.
GeoStatsTransforms.InterpolateNeighbors
— TypeInterpolateNeighbors(domain, vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
InterpolateNeighbors([g₁, g₂, ..., gₙ], vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
Interpolate geospatial data on given domain
or set of geometries g₁
, g₂
, ..., gₙ
, using geostatistical models model₁
, ..., modelₙ
for variables vars₁
, ..., varsₙ
.
InterpolateNeighbors(domain, model=NN(); [parameters])
InterpolateNeighbors([g₁, g₂, ..., gₙ], model=NN(); [parameters])
Interpolate geospatial data on given domain
or set of geometries g₁
, g₂
, ..., gₙ
, using geostatistical model
for all variables.
Unlike Interpolate
, this transform uses neighbor search methods to fit geostatistical models at each interpolation location with a reduced number of measurements.
Parameters
minneighbors
- Minimum number of neighbors (default to1
)maxneighbors
- Maximum number of neighbors (default to10
)neighborhood
- Search neighborhood (default tonothing
)distance
- A distance defined in Distances.jl (default toEuclidean()
)point
- Perform interpolation on point support (default totrue
)prob
- Perform probabilistic interpolation (default tofalse
)
The maxneighbors
parameter can be used to perform interpolation with a subset of measurements per prediction location. If maxneighbors
is not provided, then all measurements are used.
Two neighborhood
search methods are available:
If a
neighborhood
is provided, local prediction is performed by sliding theneighborhood
in the domain.If a
neighborhood
is not provided, the prediction is performed usingmaxneighbors
nearest neighbors according todistance
.
See also Interpolate
, InterpolateMissing
, InterpolateNaN
.
GeoStatsTransforms.InterpolateMissing
— TypeInterpolateMissing(vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
InterpolateMissing(vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
Interpolate geospatial data on its own domain, using geostatistical models model₁
, ..., modelₙ
and non-missing values of the variables vars₁
, ..., varsₙ
.
InterpolateMissing(model=NN(); [parameters])
InterpolateMissing(model=NN(); [parameters])
Interpolate geospatial data on its own domain, using geostatistical model
and non-missing values of all variables.
Just like InterpolateNeighbors
, this transform uses neighbor search methods to fit geostatistical models at each interpolation location with a reduced number of measurements.
Parameters
minneighbors
- Minimum number of neighbors (default to1
)maxneighbors
- Maximum number of neighbors (default to10
)neighborhood
- Search neighborhood (default tonothing
)distance
- A distance defined in Distances.jl (default toEuclidean()
)point
- Perform interpolation on point support (default totrue
)prob
- Perform probabilistic interpolation (default tofalse
)
The maxneighbors
parameter can be used to perform interpolation with a subset of measurements per prediction location. If maxneighbors
is not provided, then all measurements are used.
Two neighborhood
search methods are available:
If a
neighborhood
is provided, local prediction is performed by sliding theneighborhood
in the domain.If a
neighborhood
is not provided, the prediction is performed usingmaxneighbors
nearest neighbors according todistance
.
See also InterpolateNaN
, InterpolateNeighbors
, Interpolate
.
GeoStatsTransforms.InterpolateNaN
— TypeInterpolateNaN(vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
InterpolateNaN(vars₁ => model₁, ..., varsₙ => modelₙ; [parameters])
Interpolate geospatial data on its own domain, using geostatistical models model₁
, ..., modelₙ
and non-NaN values of the variables vars₁
, ..., varsₙ
.
InterpolateNaN(model=NN(); [parameters])
InterpolateNaN(model=NN(); [parameters])
Interpolate geospatial data on its own domain, using geostatistical model
and non-NaN values of all variables.
Just like InterpolateNeighbors
, this transform uses neighbor search methods to fit geostatistical models at each interpolation location with a reduced number of measurements.
Parameters
minneighbors
- Minimum number of neighbors (default to1
)maxneighbors
- Maximum number of neighbors (default to10
)neighborhood
- Search neighborhood (default tonothing
)distance
- A distance defined in Distances.jl (default toEuclidean()
)point
- Perform interpolation on point support (default totrue
)prob
- Perform probabilistic interpolation (default tofalse
)
The maxneighbors
parameter can be used to perform interpolation with a subset of measurements per prediction location. If maxneighbors
is not provided, then all measurements are used.
Two neighborhood
search methods are available:
If a
neighborhood
is provided, local prediction is performed by sliding theneighborhood
in the domain.If a
neighborhood
is not provided, the prediction is performed usingmaxneighbors
nearest neighbors according todistance
.
See also InterpolateMissing
, InterpolateNeighbors
, Interpolate
.
table = (; Z=[1.,0.,1.])
coord = [(25.,25.), (50.,75.), (75.,50.)]
geotable = georef(table, coord)
grid = CartesianGrid(100, 100)
model = Kriging(GaussianVariogram(range=35.))
interp = geotable |> Interpolate(grid, model)
viz(interp.geometry, color = interp.Z)
Simulate
GeoStatsTransforms.Simulate
— TypeSimulate(domain, vars₁ => process₁, ..., varsₙ => processₙ; [parameters])
Simulate(domain, nreals, vars₁ => process₁, ..., varsₙ => processₙ; [parameters])
Simulate([g₁, g₂, ..., gₙ], vars₁ => process₁, ..., varsₙ => processₙ; [parameters])
Simulate([g₁, g₂, ..., gₙ], nreals, vars₁ => process₁, ..., varsₙ => processₙ; [parameters])
Simulate nreals
realizations of variables varsᵢ
with geostatistical process processᵢ
over given domain
or vector of geometries [g₁, g₂, ..., gₙ]
.
The parameters
are forwarded to the rand
method of the geostatistical processes.
CookieCutter
GeoStatsTransforms.CookieCutter
— TypeCookieCutter(domain, parent => process, var₁ => procmap₁, ..., varₙ => procmapₙ; [parameters])
CookieCutter(domain, nreals, parent => process, var₁ => procmap₁, ..., varₙ => procmapₙ; [parameters])
Simulate nreals
realizations of variable parent
with geostatistical process process
, and each child variable varsᵢ
with process map procmapᵢ
, over given domain
.
The process map must be an iterable of pairs of the form: value => process. Each process in the map is related to a value of the parent
realization, therefore the values of the child variables will be chosen according to the values of the corresponding parent
realization.
The parameters
are forwarded to the rand
method of the geostatistical processes.
Examples
parent = QuiltingProcess(trainimg, (30, 30))
child0 = GaussianProcess(SphericalVariogram(range=20.0, sill=0.2))
child1 = GaussianProcess(SphericalVariogram(MetricBall((200.0, 20.0))))
transform = CookieCutter(domain, :parent => parent, :child => [0 => child0, 1 => child1])