4  Spherical Geometries

There are too many false conclusions drawn and stupid measurements made when geographic software, built for projected Cartesian coordinates in a local setting, is applied at the global scale()

The previous chapter discussed geometries defined on the plane, R2. This chapter discusses what changes when we consider geometries not on the plane, but on the sphere (S2).

Although we learned in that the shape of the Earth is usually approximated by an ellipsoid, none of the libraries shown in green in provide access to a comprehensive set of functions that compute on an ellipsoid. Only the s2geometry (; ) library does provide it using a sphere rather than an ellipsoid. However, when compared to using a flat (projected) space as we did in the previous chapter, a sphere is a much better approximation to an ellipsoid.

4.1 Straight lines

The basic premise of simple features of is that geometries are represented by sequences of points connected by straight lines. On R2 (or any Cartesian space), this is trivial, but on a sphere straight lines do not exist. The shortest line connecting two points is an arc of the circle through both points and the centre of the sphere, also called a great circle segment. A consequence is that “the” shortest distance line connecting two points on opposing sides of the sphere does not exist, as any great circle segment connecting them has equal length. Note that the GeoJSON standard () has its own definition of straight lines in geodetic coordinates (see Exercise 1 at the end of this chapter).

4.2 Ring direction and full polygon

Any polygon on the sphere divides the sphere surface in two parts with finite area: the inside and the outside. Using the “counter-clockwise rule” as was done for R2 will not work because the direction interpretation depends on what is defined as inside. A convention here is to define the inside as the left (or right) side of the polygon boundary when traversing its points in sequence. Reversal of the node order then switches inside and outside.

In addition to empty polygons, one can define the full polygon on a sphere, which comprises its entire surface. This is useful, for instance for computing the oceans as the geometric difference between the full polygon and the union of the land mass (see and ).

4.3 Bounding box, rectangle, and cap

Where in R2 one can easily define bounding boxes as the range of the x and y coordinates, for ellipsoidal coordinates these ranges are not of much use when geometries cross the antimeridian (longitude +/- 180) or one of the poles. The assumption in R2 that lower x values are Westwards of higher ones does not hold when crossing the antimeridian. An alternative to delineating an area on a sphere that is more natural is the bounding cap, defined by its centre coordinates and a radius. For Antarctica, as depicted in Figures - (a) and (c), the bounding box formed by coordinate ranges is

Code
library(sf) |> suppressPackageStartupMessages()
library(maps) |> suppressPackageStartupMessages()
library(dplyr) |> suppressPackageStartupMessages()
map(fill = TRUE, plot = FALSE) |>
  st_as_sf() |>
  filter(ID == "Antarctica") -> a
st_bbox(a)
#   xmin   ymin   xmax   ymax 
# -180.0  -85.2  179.6  -60.5

which clearly does not contain the region (ymin being -90 and xmax 180). Two geometries that do contain the region are the bounding cap:

Code
#   lng lat angle
# 1   0 -90  29.5

and the bounding rectangle:

Code
#   lng_lo lat_lo lng_hi lat_hi
# 1   -180    -90    180  -60.5

For an area spanning the antimeridian, here the Fiji island country, the bounding box:

Code
map(fill = TRUE, plot = FALSE) |>
  st_as_sf() |>
  filter(ID == "Fiji") -> Fiji
st_bbox(Fiji)
#   xmin   ymin   xmax   ymax 
# -179.9  -21.7  180.2  -12.5

seems to span most of the Earth, as opposed to the bounding rectangle:

Code
#   lng_lo lat_lo lng_hi lat_hi
# 1    175  -21.7   -178  -12.5

where a value lng_lo larger than lng_hi indicates that the bounding rectangle spans the antimeridian. This property could not be inferred from the coordinate ranges.

4.4 Validity on the sphere

Many global datasets are given in ellipsoidal coordinates but are prepared in a way that they “work” when interpreted on the R2 space [-180,180] × [-90,90]. This means that:

  • geometries crossing the antimeridian (longitude +/- 180) are cut in half, such that they no longer cross it (but nearly touch each other)
  • geometries including a pole, like Antarctica, are cut at +/- 180 and make an excursion through -180,-90 and 180,-90 (both representing the Geographic South Pole)

shows two different representations of Antarctica, plotted with ellipsoidal coordinates taken as R2 (top) and in a Polar Stereographic projection (bottom), without (left) and with (right) an excursion through the Geographic South Pole. In the projections as plotted, polygons (b) and (c) are valid, polygon (a) is not valid as it self-intersects, and polygon (d) is not valid because it traverses the same edge to the South Pole twice. On the sphere (S2), polygon (a) is valid but (b) is not, for the same reason as (d) is not valid.

Code
# maps:
par(mfrow = c(2,2))
par(mar = c(1,1.2,1,1))
m <- st_as_sf(map(fill=TRUE, plot=FALSE))
m <- m[m$ID == "Antarctica", ]
plot(st_geometry(m), asp = 2)
title("a (not valid)")
# ne:
library(rnaturalearth)
# Support for Spatial objects (`sp`) will be deprecated in {rnaturalearth} and will be removed in a future release of the package. Please use `sf` objects with {rnaturalearth}. For example: `ne_download(returnclass = 'sf')`
ne <- ne_countries(returnclass = "sf")
ne <- ne[ne$region_un == "Antarctica", "region_un"]
plot(st_geometry(ne), asp = 2)
title("b (valid)")
# 3031
m |>
  st_geometry() |>
  st_transform(3031) |>
  plot()
title("c (valid)")
ne |>
  st_geometry() |>
  st_transform(3031) |>
  plot()
title("d (not valid)")
Figure 4.1: Antarctica polygon, (a, c): not passing through POINT(-180 -90); (b, d): passing through POINT(-180 -90) and POINT(180 -90)

4.5 Exercises

For the following exercises, use R where possible or relevant.

  1. How does the GeoJSON format () define “straight” lines between ellipsoidal coordinates (Section 3.1.1)? Using this definition of straight, how does LINESTRING(0 85,180 85) look like in an Arctic polar projection? How could this geometry be modified to have it cross the North Pole?
  2. For a typical polygon on S2, how can you find out ring direction?
  3. Are there advantages of using bounding caps over using bounding boxes? If so, list them.
  4. Why is, for small areas, the orthographic projection centred at the area a good approximation of the geometry as handled on S2?
  5. For rnaturalearth::ne_countries(country = "Fiji", returnclass = "sf"), check whether the geometry is valid on R2, on an orthographic projection centred on the country, and on S2. How can the geometry be made valid on S2? Plot the resulting geometry back on R2. Compare the centroid of the country, as computed on R2 and on S2, and the distance between the two.
  6. Consider dataset gisco_countries in R package giscoR, and select the country with NAME_ENGL == "Fiji". Does it have a valid geometry on the sphere? If so, how was this accomplished?