Load a grid

Grids are made using a Java utility called GeoTessBuilder. Loading them into memory from file is the standard constructor in PyGeoTess. Viewing grid metadata is as simple as using print or str.

from geotess import Grid

grid = Grid('geotess/data/geotess_grid_16000.geotess')
print(grid)
GeoTessGrid
gridID = 4FD3D72E55EFA8E13CA096B4C8795F03
memory : 0.11776 MB
input Grid File : geotess/data/geotess_grid_16000.geotess
generated by software version : GridBuilder 0.0.0  Fri May 25 11:34:59 MDT 2012

nTessellations = 1
nLevels = 3
nVertices = 162
nTriangles = 420

    Tess    Level  LevelID     NTri    First   Last+1
      0        0        0       20        0       20
      0        1        1       80       20      100
      0        2        2      320      100      420

Built-in grids

The grids and models that GeoTess distributes are also part of PyGeoTess. The files are found in geotess/data, but they are also pre-loaded into class instances. Here, we simply import the previous grid.

from geotess.data import grid_16000

print(grid_16000)
GeoTessGrid
gridID = 4FD3D72E55EFA8E13CA096B4C8795F03
memory : 0.11776 MB
input Grid File : geotess/data/geotess_grid_16000.geotess
generated by software version : GridBuilder 0.0.0  Fri May 25 11:34:59 MDT 2012

nTessellations = 1
nLevels = 3
nVertices = 162
nTriangles = 420

    Tess    Level  LevelID     NTri    First   Last+1
      0        0        0       20        0       20
      0        1        1       80       20      100
      0        2        2      320      100      420

Vertices and triangles

In PyGeoTess, Grid vertices are geocentric coordinates of points of intersection on a tessellation, and triangles are the three integer vertex indices that form a triangle in the tessellation. For a given grid, all vertices are accessible via the Grid.vertices method, and the triangles (vertex associations) for a particular tessellation and level are gotten with the Grid.triangles method.

vertices = grid.vertices()
triangles = grid.triangles(tess=0, level=2)

print("The first 10 vertices are:\n{}".format(vertices[:10]))
print("The first 10 triangles are:\n{}".format(triangles[:10]))
The first 10 vertices are:
[[   0.           90.        ]
 [  72.           26.71930078]
 [   0.           26.71930078]
 [ 144.           26.71930078]
 [-144.           26.71930078]
 [ -72.           26.71930078]
 [  36.          -26.71930078]
 [ 108.          -26.71930078]
 [-180.          -26.71930078]
 [-108.          -26.71930078]]
The first 10 triangles are:
[[42 43 44]
 [12 44 43]
 [13 42 44]
 [14 43 42]
 [42 45 46]
 [ 0 46 45]
 [14 42 46]
 [13 45 42]
 [43 47 48]
 [ 1 48 47]]

Plotting grids

The .vertices and .triangles methods above return arrays that are amenable to plotting using Matplotlib's triplot function. We'll project first using Matplotlib Basemap.

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap

m = Basemap(projection='ortho',lat_0=45,lon_0=-100)
m.etopo()
x, y = m(vertices[:,0], vertices[:,1])

plt.triplot(vertices[:,0], vertices[:,1], triangles);

png

The cirularity of vertex longitudes makes plotting a bit wonky. Luckily, Matplotlib has the tools Triangulation and TriAnalyzer to mask out these long, flat triangles from the plot.

from matplotlib.tri import Triangulation, TriAnalyzer

tri = Triangulation(x, y, triangles)
tri_an = TriAnalyzer(tri)
mask = tri_an.get_flat_tri_mask()

plt.triplot(x, y, triangles, mask=mask)

png

Not perfect, but not as messy.