Skip to content

Unstructured Grids for Data Extraction

There are also RegionGrid types without an actual grid, maybe there are a set of coordinates and geometries that define the corners or the centres of a mesh, such as:

Basically, for each of these datasets, the data is given in such a way that the coordinates of the grid can be expressed via:

  • A Vector of Point2 types, with each Point2 type containing (lon,lat)
julia
using GeoRegions
using RegionGrids
using CairoMakie

Creating Unstructured Grids

A Unstructured Grid can be created as follows:

ggrd = RegionGrid(geo,Point2.(lon,lat))

where geo is a GeoRegion of interest that is found within the domain defined by the longitude and latitude grid vectors.

julia
lon = collect(10:20:360); nlon = length(lon)
lat = collect(-80:20:90); nlat = length(lat)

glon = zeros(nlon,nlat); glon .= lon;  glon = glon[:]
glat = zeros(nlon,nlat); glat .= lat'; glat = glat[:]

plon = glon .+ 14rand(nlon*nlat) .- 7
plat = glat .+ 14rand(nlon*nlat) .- 7

geo = GeoRegion([10,100,-80,10],[50,10,-40,50])

iggrd = RegionGrid(geo,Point2.(glon,glat))
pggrd = RegionGrid(geo,Point2.(plon,plat))
The VectorMask Grid type has the following properties:
    Indices             (ipoint) : [51, 55, 70, 71, 72, 73, 74, 75, 90, 91, 92, 93, 94, 108, 109]
    Longitude Points       (lon) : [-68.24406787366178, 4.001122214122667, -43.73345988981572, -28.284722405991374, -13.368821578482311, 4.036629078661573, 36.63176496594365, 47.22430306714027, -10.93308206883654, 10.504098092238973, 30.437873868054226, 46.762004631320664, 65.34644562751859, -13.009610940093523, 3.045101789724331]
    Latitude Points        (lat) : [-34.92730103496109, -14.863442634580185, -14.944662109300994, -16.44153594814545, -21.31073796876577, 0.7579686004540349, -5.524369726875455, -1.29296558853156, -1.4052908007288423, 26.56362646132839, 22.693828007190596, 17.034476179242695, 13.69831758318783, 24.172641407868177, 37.76480707736063]
    Rotated X Coordinates    (X)
    Rotated Y Coordinates    (Y)
    Rotation (°)             (θ) : 0.0
    RegionGrid Weights (weights)
    RegionGrid Size 			  : (15,) points

The API for creating a Unstructured Grid can be found here

What is in a Unstructured Grid?

RegionGrids.UnstructuredGrid Type
julia
UnstructuredGrid <: RegionGrid

A UnstructuredGrid is a RegionGrid that is created based on an unstructured grid often used in cubed-sphere or unstructured-mesh grids.

All UnstructuredGrid type will contain the following fields:

  • lon - A Vector of Floats, defining the longitudes for each point in the RegionGrid that describe the region.

  • lat - A Vector of Floats, defining the latitude for each point in the RegionGrid that describe the region.

  • ipoint - A Vector of Ints, defining the indices of the valid points from the original unstructured grid that were extracted into the RegionGrid.

  • weights - A Vector of Floats, defining the latitude-weights of each valid point in the grid. Will be NaN if outside the bounds of the GeoRegion used to define this RectilinearGrid.

  • X - A Vector of Floats, defining the X-coordinates (in meters) of each point in the "derotated" RegionGrid about the centroid for the shape of the GeoRegion.

  • Y - A Vector of Floats, defining the Y-coordinates (in meters) of each point in the "derotated" RegionGrid about the centroid for the shape of the GeoRegion.

  • θ - A Float storing the information on the angle (in degrees) about which the data was rotated in the anti-clockwise direction. Mathematically, it is rotation - geo.θ.

source

We see that in a UnstructuredGrid type, we have the lon and lat vectors that defined the perturbed longitude and latitude points that are within the GeoRegion.

julia
pggrd.lon
15-element Vector{Float64}:
 -68.24406787366178
   4.001122214122667
 -43.73345988981572
 -28.284722405991374
 -13.368821578482311
   4.036629078661573
  36.63176496594365
  47.22430306714027
 -10.93308206883654
  10.504098092238973
  30.437873868054226
  46.762004631320664
  65.34644562751859
 -13.009610940093523
   3.045101789724331
julia
pggrd.lat
15-element Vector{Float64}:
 -34.92730103496109
 -14.863442634580185
 -14.944662109300994
 -16.44153594814545
 -21.31073796876577
   0.7579686004540349
  -5.524369726875455
  -1.29296558853156
  -1.4052908007288423
  26.56362646132839
  22.693828007190596
  17.034476179242695
  13.69831758318783
  24.172641407868177
  37.76480707736063

An example of using Unstructured Grids

Say we have some sample data, here randomly generated.

julia
data = rand(nlon,nlat)[:]
162-element Vector{Float64}:
 0.3478415286387807
 0.7409595510339312
 0.7036897096177958
 0.2455304335123396
 0.946295027233593
 0.792616639538769
 0.3694604456085562
 0.9920417685517259
 0.6599081036754361
 0.6652015968995164

 0.16342440816846215
 0.3107232389489485
 0.028283301903656244
 0.4074328874905664
 0.6289720684155027
 0.19764277289284793
 0.49539285902055974
 0.19126118407592252
 0.9533035799896278

We extract the valid data within the GeoRegion of interest that we defined above:

julia
ndata = extract(data,iggrd)
pdata = extract(data,pggrd)
15-element Vector{Float64}:
 0.9065563425649826
 0.20896651049501969
 0.10107399443318055
 0.03420930081188911
 0.4643736510089548
 0.25617903329721536
 0.3586287285390325
 0.5032041275424867
 0.28367820889492734
 0.41604663563403455
 0.3623993460508096
 0.8677671111619495
 0.8747664293850191
 0.8091671700594689
 0.10565052424380283

And now let us visualize the results.

julia
slon,slat = coordinates(geo) # extract the coordinates
fig = Figure()

ax1 = Axis(
    fig[1,1],width=450,height=150,
    limits=(-180,360,-90,90)
)
scatter!(ax1,glon,glat,color=:lightgrey)
scatter!(ax1,plon,plat,color=data)
lines!(ax1,slon,slat,color=:black,linewidth=2)
lines!(ax1,slon.+360,slat,color=:black,linewidth=2,linestyle=:dash)

hidexdecorations!(ax1,ticks=false,grid=false)

ax2 = Axis(
    fig[2,1],width=450,height=150,
    limits=(-180,360,-90,90)
)
scatter!(ax2,iggrd.lon,iggrd.lat,color=:lightgrey)
scatter!(ax2,pggrd.lon,pggrd.lat,color=pdata)
lines!(ax2,slon,slat,color=:black,linewidth=2)

Label(fig[3,:],"Longitude / º")
Label(fig[:,0],"Latitude / º",rotation=pi/2)

resize_to_layout!(fig)
fig