Geo functions

Geo functions are used to perform geographical calculations on spatial data. These functions are essential for applications that require distance measurements, location-based queries, and other geospatial operations.

greatCircleDistance

Calculates the distance between two points on the Earth’s surface using the great-circle formula.

greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Input parameters

  • lon1Deg: Longitude of the first point in degrees. Range: [-180°, 180°].
  • lat1Deg: Latitude of the first point in degrees. Range: [-90°, 90°].
  • lon2Deg: Longitude of the second point in degrees. Range: [-180°, 180°].
  • lat2Deg: Latitude of the second point in degrees. Range: [-90°, 90°].

Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude.

Returned value

The distance between two points on the Earth’s surface, in meters.

Generates an exception when the input parameter values fall outside of the range.

Example

SELECT greatCircleDistance(55.755831, 37.617673, -55.755831, -37.617673) AS greatCircleDistance
┌─greatCircleDistance─┐
│            14128352 │
└─────────────────────┘

geoDistance

Similar to greatCircleDistance but calculates the distance on WGS-84 ellipsoid instead of sphere. This is more precise approximation of the Earth Geoid. The performance is the same as for greatCircleDistance (no performance drawback). It is recommended to use geoDistance to calculate the distances on Earth.

Technical note: for close enough points we calculate the distance using planar approximation with the metric on the tangent plane at the midpoint of the coordinates.

geoDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Input parameters

  • lon1Deg: Longitude of the first point in degrees. Range: [-180°, 180°].
  • lat1Deg: Latitude of the first point in degrees. Range: [-90°, 90°].
  • lon2Deg: Longitude of the second point in degrees. Range: [-180°, 180°].
  • lat2Deg: Latitude of the second point in degrees. Range: [-90°, 90°].

Positive values correspond to North latitude and East longitude, and negative values correspond to South latitude and West longitude.

Returned value

The distance between two points on the Earth’s surface, in meters.

Generates an exception when the input parameter values fall outside of the range.

Example

SELECT geoDistance(38.8976, -77.0366, 39.9496, -75.1503) AS geoDistance
┌─geoDistance─┐
│   212458.73 │
└─────────────┘

greatCircleAngle

Calculates the central angle between two points on the Earth’s surface using the great-circle formula.

greatCircleAngle(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

Input parameters

  • lon1Deg: Longitude of the first point in degrees.
  • lat1Deg: Latitude of the first point in degrees.
  • lon2Deg: Longitude of the second point in degrees.
  • lat2Deg: Latitude of the second point in degrees.

Returned value

The central angle between two points in degrees.

Example

SELECT greatCircleAngle(0, 0, 45, 0) AS arc
┌─arc─┐
│  45 │
└─────┘

pointInEllipses

Checks whether the point belongs to at least one of the ellipses. Coordinates are geometric in the Cartesian coordinate system.

pointInEllipses(x, y, x₀, y₀, a₀, b₀,...,xₙ, yₙ, aₙ, bₙ)

Input parameters

  • x, y: Coordinates of a point on the plane.
  • xᵢ, yᵢ: Coordinates of the center of the i-th ellipsis.
  • aᵢ, bᵢ: Axes of the i-th ellipsis in units of x, y coordinates.

The input parameters must be 2+4⋅n, where n is the number of ellipses.

Returned values

1 if the point is inside at least one of the ellipses; 0if it is not.

Example

SELECT pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)
┌─pointInEllipses(10., 10., 10., 9.1, 1., 0.9999)─┐
│                                               1 │
└─────────────────────────────────────────────────┘

pointInPolygon

Checks whether the point belongs to the polygon on the plane.

pointInPolygon((x, y), [(a, b), (c, d) ...], ...)

Input values

  • (x, y): Coordinates of a point on the plane. Data type: Tuple: A tuple of two numbers.
  • [(a, b), (c, d) ...]: Polygon vertices. Data type: Array. Each vertex is represented by a pair of coordinates (a, b). Vertices should be specified in a clockwise or counterclockwise order. The minimum number of vertices is 3. The polygon must be constant.
  • The function also supports polygons with holes (cut out sections). In this case, add polygons that define the cut out sections using additional arguments of the function. The function does not support non-simply-connected polygons.

Returned values

1 if the point is inside the polygon, 0 if it is not. If the point is on the polygon boundary, the function may return either 0 or 1.

Example

SELECT pointInPolygon((3., 3.), [(6, 0), (8, 4), (5, 8), (0, 2)]) AS res
┌─res─┐
│   1 │
└─────┘

Geohash

Geohash is the geocode system, which subdivides Earth’s surface into buckets of grid shape and encodes each cell into a short string of letters and digits. It is a hierarchical data structure, so the longer the geohash string is, the more precise the geographic location will be.

If you need to manually convert geographic coordinates to geohash strings, you can use geohash.org.

geohashEncode

Encodes latitude and longitude as a geohash-string.

Syntax

geohashEncode(longitude, latitude, [precision])

Input values

  • longitude: Longitude part of the coordinate you want to encode. Floating in range[-180°, 180°]. Float.
  • latitude: Latitude part of the coordinate you want to encode. Floating in range [-90°, 90°]. Float.
  • precision (optional): Length of the resulting encoded string. Defaults to 12. Integer in the range [1, 12]. Int8.
  • All coordinate parameters must be of the same type: either Float32 or Float64.
  • For the precision parameter, any value less than 1 or greater than 12 is silently converted to 12.

Returned values

  • Alphanumeric string of the encoded coordinate (modified version of the base32-encoding alphabet is used). String.

Example

Query:

SELECT geohashEncode(-5.60302734375, 42.593994140625, 0) AS res

Result:

┌─res──────────┐
│ ezs42d000000 │
└──────────────┘

geohashDecode

Decodes any geohash-encoded string into longitude and latitude.

Syntax

geohashDecode(hash_str)

Input values

  • hash_str: Geohash-encoded string.

Returned values

  • Tuple (longitude, latitude) of Float64 values of longitude and latitude. Tuple(Float64)

Example

SELECT geohashDecode('ezs42') AS res
┌─res─────────────────────────────┐
│ (-5.60302734375,42.60498046875) │
└─────────────────────────────────┘

geohashesInBox

Returns an array of geohash-encoded strings of given precision that fall inside and intersect boundaries of given box, basically a 2D grid flattened into array.

Syntax

geohashesInBox(longitude_min, latitude_min, longitude_max, latitude_max, precision)

Arguments

  • longitude_min: Minimum longitude. Range: [-180°, 180°]. Float.
  • latitude_min: Minimum latitude. Range: [-90°, 90°]. Float.
  • longitude_max: Maximum longitude. Range: [-180°, 180°]. Float.
  • latitude_max: Maximum latitude. Range: [-90°, 90°]. Float.
  • precision: Geohash precision. Range: [1, 12]. UInt8.

All coordinate parameters must be of the same type: either Float32 or Float64.

Returned values

  • Array of precision-long strings of geohash-boxes covering provided area, you should not rely on order of items. Array(String).
  • [] - Empty array if minimum latitude and longitude values aren’t less than corresponding maximum values.

Function throws an exception if resulting array is over 10’000’000 items long.

Example

Query:

SELECT geohashesInBox(24.48, 40.56, 24.785, 40.81, 4) AS thasos

Result:

┌─thasos──────────────────────────────────────┐
│ ['sx1q','sx1r','sx32','sx1w','sx1x','sx38'] │
└─────────────────────────────────────────────┘

H3 Index

H3 is a geographical indexing system where Earth’s surface divided into a grid of even hexagonal cells. This system is hierarchical, i. e. each hexagon on the top level ("parent") can be split into seven even but smaller ones ("children"), and so on.

The level of the hierarchy is called resolution and can receive a value from 0 till 15, where 0 is the base level with the largest and coarsest cells.

A latitude and longitude pair can be transformed to a 64-bit H3 index, identifying a grid cell.

The H3 index is used primarily for bucketing locations and other geospatial manipulations.

The full description of the H3 system is available at the Uber Engineering site.

h3IsValid

Verifies whether the number is a valid H3 index.

Syntax

h3IsValid(h3index)

Parameters

  • h3index: Hexagon index number. UInt64.

Returned values

  • 1: The number is a valid H3 index. UInt8.
  • 0: The number is not a valid H3 index. UInt8.

Example

Query:

SELECT h3IsValid(630814730351855103) AS h3IsValid

Result:

┌─h3IsValid─┐
│         1 │
└───────────┘

h3GetResolution

Defines the resolution of the given H3 index.

Syntax

h3GetResolution(h3index)

Parameters

  • h3index: Hexagon index number. UInt64.

Returned values

  • Index resolution. Range: [0, 15]. UInt8.
  • If the index is not valid, the function returns a random value. Use h3IsValid to verify the index. UInt8.

Example

Query:

SELECT h3GetResolution(639821929606596015) AS resolution

Result:

┌─resolution─┐
│         14 │
└────────────┘

h3EdgeAngle

Calculates the average length of the H3 hexagon edge in grades.

Syntax

h3EdgeAngle(resolution)

Parameters

  • resolution: Index resolution. UInt8. Range: [0, 15].

Returned values

  • The average length of the H3 hexagon edge in grades. Float64.

Example

Query:

SELECT h3EdgeAngle(10) AS edgeAngle

Result:

┌───────h3EdgeAngle(10)─┐
│ 0.0005927224846720883 │
└───────────────────────┘

h3EdgeLengthM

Calculates the average length of the H3 hexagon edge in meters.

Syntax

h3EdgeLengthM(resolution)

Parameters

  • resolution: Index resolution. UInt8. Range: [0, 15].

Returned values

  • The average length of the H3 hexagon edge in meters. Float64.

Example

Query:

SELECT h3EdgeLengthM(15) AS edgeLengthM

Result:

┌─edgeLengthM─┐
│ 0.509713273 │
└─────────────┘

h3EdgeLengthKm

Calculates the average length of the H3 hexagon edge in kilometers.

Syntax

h3EdgeLengthKm(resolution)

Parameters

  • resolution: Index resolution. UInt8. Range: [0, 15].

Returned values

  • The average length of the H3 hexagon edge in kilometers. Float64.

Example

Query:

SELECT h3EdgeLengthKm(15) AS edgeLengthKm

Result:

┌─edgeLengthKm─┐
│  0.000509713 │
└──────────────┘

geoToH3

Returns H3 point index (lon, lat) with specified resolution.

Syntax

geoToH3(lon, lat, resolution)

Arguments

  • lon: Longitude. Float64.
  • lat: Latitude. Float64.
  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned values

  • Hexagon index number. UInt64.
  • 0 in case of error. UInt64.

Example

Query:

SELECT geoToH3(37.79506683, 55.71290588, 15) AS h3Index

Result:

┌────────────h3Index─┐
│ 644325524701193974 │
└────────────────────┘

h3ToGeo

Returns the centroid longitude and latitude corresponding to the provided H3 index.

Syntax

h3ToGeo(h3Index)

Arguments

  • h3Index: H3 Index. UInt64.

Returned values

  • A tuple consisting of two values: tuple(lon,lat). lon: Longitude. Float64. lat: Latitude. Float64.

Example

Query:

SELECT h3ToGeo(644325524701193974) AS coordinates

Result:

┌─coordinates───────────────────────────┐
│ (37.79506616830252,55.71290243145668) │
└───────────────────────────────────────┘

h3ToGeoBoundary

Returns array of pairs (lon, lat), which corresponds to the boundary of the provided H3 index.

Syntax

h3ToGeoBoundary(h3Index)

Arguments

  • h3Index: H3 Index. UInt64.

Returned values

  • Array of pairs '(lon, lat)'. Array(Float64, Float64).

Example

Query:

SELECT h3ToGeoBoundary(644325524701193974) AS coordinates

Result:

┌─h3ToGeoBoundary(599686042433355775)────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [(37.2713558667319,-121.91508032705622),(37.353926450852256,-121.8622232890249),(37.42834118609435,-121.92354999630156),(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044),(37.26319797461824,-122.02910130919001)] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

h3kRing

Lists all the H3 hexagons in the raduis of k from the given hexagon in random order.

Syntax

h3kRing(h3index, k)

Arguments

  • h3index: Hexagon index number. UInt64.
  • k: Radius. integer

Returned values

  • Array of H3 indexes. Array(UInt64).

Example

Query:

SELECT arrayJoin(h3kRing(644325529233966508, 1)) AS h3index

Result:

┌────────────h3index─┐
│ 644325529233966508 │
│ 644325529233966497 │
│ 644325529233966510 │
│ 644325529233966504 │
│ 644325529233966509 │
│ 644325529233966355 │
│ 644325529233966354 │
└────────────────────┘

h3GetBaseCell

Returns the base cell number of the H3 index.

Syntax

h3GetBaseCell(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Hexagon base cell number. UInt8.

Example

Query:

SELECT h3GetBaseCell(612916788725809151) AS basecell

Result:

┌─basecell─┐
│       12 │
└──────────┘

h3HexAreaM2

Returns average hexagon area in square meters at the given resolution.

Syntax

h3HexAreaM2(resolution)

Parameters

  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned value

  • Area in square meters. Float64.

Example

Query:

SELECT h3HexAreaM2(13) AS area

Result:

┌─area─┐
│ 43.9 │
└──────┘

h3HexAreaKm2

Returns average hexagon area in square kilometers at the given resolution.

Syntax

h3HexAreaKm2(resolution)

Parameters

  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned value

  • Area in square kilometers. Float64.

Example

Query:

SELECT h3HexAreaKm2(13) AS area

Result:

┌──────area─┐
│ 0.0000439 │
└───────────┘

h3IndexesAreNeighbors

Returns whether or not the provided H3 indexes are neighbors.

Syntax

h3IndexesAreNeighbors(index1, index2)

Arguments

  • index1: Hexagon index number. UInt64.
  • index2: Hexagon index number. UInt64.

Returned value

  • 1: Indexes are neighbours. UInt8.
  • 0: Indexes are not neighbours. UInt8.

Example

Query:

SELECT h3IndexesAreNeighbors(617420388351344639, 617420388352655359) AS n

Result:

┌─n─┐
│ 1 │
└───┘

h3ToChildren

Returns an array of child indexes for the given H3 index.

Syntax

h3ToChildren(index, resolution)

Arguments

  • index: Hexagon index number. UInt64.
  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned values

  • Array of the child H3-indexes. Array(UInt64).

Example

Query:

SELECT h3ToChildren(599405990164561919, 6) AS children

Result:

┌─children───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [603909588852408319,603909588986626047,603909589120843775,603909589255061503,603909589389279231,603909589523496959,603909589657714687] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

h3ToParent

Returns the parent (coarser) index containing the given H3 index.

Syntax

h3ToParent(index, resolution)

Arguments

  • index: Hexagon index number. UInt64.
  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned value

  • Parent H3 index. UInt64.

Example

Query:

SELECT h3ToParent(599405990164561919, 3) AS parent

Result:

┌─────────────parent─┐
│ 590398848891879423 │
└────────────────────┘

h3ToString

Converts the H3Index representation of the index to the string representation.

h3ToString(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • String representation of the H3 index. String.

Example

Query:

SELECT h3ToString(617420388352917503) AS h3_string

Result:

┌─h3_string───────┐
│ 89184926cdbffff │
└─────────────────┘

stringToH3

Converts the string representation to the H3Index (UInt64) representation.

Syntax

stringToH3(index_str)

Parameters

  • index_str: String representation of the H3 index. String.

Returned value

  • Hexagon index number. Returns 0 on error. UInt64.

Example

Query:

SELECT stringToH3('89184926cc3ffff') AS index

Result:

┌──────────────index─┐
│ 617420388351344639 │
└────────────────────┘

h3GetResolution

Returns the resolution of the H3 index.

Syntax

h3GetResolution(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Index resolution. Range: [0, 15]. UInt8.

Example

Query:

SELECT h3GetResolution(617420388352917503) AS res

Result:

┌─res─┐
│   9 │
└─────┘

h3IsResClassIII

Returns whether H3 index has a resolution with Class III orientation.

Syntax

h3IsResClassIII(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • 1: Index has a resolution with Class III orientation. UInt8.
  • 0: Index doesn't have a resolution with Class III orientation. UInt8.

Example

Query:

SELECT h3IsResClassIII(617420388352917503) AS res

Result:

┌─res─┐
│   1 │
└─────┘

h3IsPentagon

Returns whether this H3 index represents a pentagonal cell.

Syntax

h3IsPentagon(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • 1: Index represents a pentagonal cell. UInt8.
  • 0: Index doesn't represent a pentagonal cell. UInt8.

Example

Query:

SELECT h3IsPentagon(644721767722457330) AS pentagon

Result:

┌─pentagon─┐
│        0 │
└──────────┘

h3GetFaces

Returns icosahedron faces intersected by a given H3 index.

Syntax

h3GetFaces(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned values

  • Array containing icosahedron faces intersected by a given H3 index. Array(UInt64).

Example

Query:

SELECT h3GetFaces(599686042433355775) AS faces

Result:

┌─faces─┐
│ [7]   │
└───────┘

h3CellAreaM2

Returns the exact area of a specific cell in square meters corresponding to the given input H3 index.

Syntax

h3CellAreaM2(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Cell area in square meters. Float64.

Example

Query:

SELECT h3CellAreaM2(579205133326352383) AS area

Result:

┌───────────────area─┐
│ 4106166334463.9233 │
└────────────────────┘

h3CellAreaRads2

Returns the exact area of a specific cell in square radians corresponding to the given input H3 index.

Syntax

h3CellAreaRads2(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Cell area in square radians. Float64.

Example

Query:

SELECT h3CellAreaRads2(579205133326352383) AS area

Result:

┌────────────────area─┐
│ 0.10116268528089567 │
└─────────────────────┘

h3ToCenterChild

Returns the center child (finer) H3 index contained by given H3 at the given resolution.

Syntax

h3ToCenterChild(index, resolution)

Parameters

  • index: Hexagon index number. UInt64.
  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned values

  • H3 index of the center child contained by given H3 at the given resolution. UInt64.

Example

Query:

SELECT h3ToCenterChild(577023702256844799,1) AS centerToChild

Result:

┌──────centerToChild─┐
│ 581496515558637567 │
└────────────────────┘

h3ExactEdgeLengthM

Returns the exact edge length of the unidirectional edge represented by the input h3 index in meters.

Syntax

h3ExactEdgeLengthM(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Exact edge length in meters. Float64.

Example

Query:

SELECT h3ExactEdgeLengthM(1310277011704381439) AS exactEdgeLengthM;

Result:

┌───exactEdgeLengthM─┐
│ 195449.63163407316 │
└────────────────────┘

h3ExactEdgeLengthKm

Returns the exact edge length of the unidirectional edge represented by the input h3 index in kilometers.

Syntax

h3ExactEdgeLengthKm(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Exact edge length in kilometers. Float64.

Example

Query:

SELECT h3ExactEdgeLengthKm(1310277011704381439) AS exactEdgeLengthKm;

Result:

┌──exactEdgeLengthKm─┐
│ 195.44963163407317 │
└────────────────────┘

h3ExactEdgeLengthRads

Returns the exact edge length of the unidirectional edge represented by the input h3 index in radians.

Syntax

h3ExactEdgeLengthRads(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • Exact edge length in radians. Float64.

Example

Query:

SELECT h3ExactEdgeLengthRads(1310277011704381439) AS exactEdgeLengthRads;

Result:

┌──exactEdgeLengthRads─┐
│ 0.030677980118976447 │
└──────────────────────┘

h3NumHexagons

Returns the number of unique H3 indices at the given resolution.

Syntax

h3NumHexagons(resolution)

Parameters

  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned value

  • Number of H3 indices. Int64.

Example

Query:

SELECT h3NumHexagons(3) AS numHexagons

Result:

┌─numHexagons─┐
│       41162 │
└─────────────┘

h3PointDistM

Returns the "great circle" or "haversine" distance between pairs of GeoCoord points (latitude/longitude) pairs in meters.

Syntax

h3PointDistM(lat1, lon1, lat2, lon2)

Arguments

  • lat1, lon1: Latitude and Longitude of point1 in degrees. Float64.
  • lat2, lon2: Latitude and Longitude of point2 in degrees. Float64.

Returned values

  • Haversine or great circle distance in meters.Float64.

Example

Query:

select h3PointDistM(-10.0 ,0.0, 10.0, 0.0) as h3PointDistM

Result:

┌──────h3PointDistM─┐
│ 2223901.039504589 │
└───────────────────┘

h3PointDistKm

Returns the "great circle" or "haversine" distance between pairs of GeoCoord points (latitude/longitude) pairs in kilometers.

Syntax

h3PointDistKm(lat1, lon1, lat2, lon2)

Arguments

  • lat1, lon1: Latitude and Longitude of point1 in degrees. Float64.
  • lat2, lon2: Latitude and Longitude of point2 in degrees. Float64.

Returned values

  • Haversine or great circle distance in kilometers. Float64.

Example

Query:

select h3PointDistKm(-10.0 ,0.0, 10.0, 0.0) as h3PointDistKm

Result:

┌─────h3PointDistKm─┐
│ 2223.901039504589 │
└───────────────────┘

h3PointDistRads

Returns the "great circle" or "haversine" distance between pairs of GeoCoord points (latitude/longitude) pairs in radians.

Syntax

h3PointDistRads(lat1, lon1, lat2, lon2)

Arguments

  • lat1, lon1: Latitude and Longitude of point1 in degrees. Float64.
  • lat2, lon2: Latitude and Longitude of point2 in degrees. Float64.

Returned values

  • Haversine or great circle distance in radians. Float64.

Example

Query:

select h3PointDistRads(-10.0 ,0.0, 10.0, 0.0) as h3PointDistRads

Result:

┌────h3PointDistRads─┐
│ 0.3490658503988659 │
└────────────────────┘

h3GetRes0Indexes

Returns an array of all the resolution 0 H3 indexes.

Syntax

h3GetRes0Indexes()

Returned values

  • Array of all the resolution 0 H3 indexes. Array(UInt64).

Example

Query:

select h3GetRes0Indexes as indexes 

Result:

┌─indexes─────────────────────────────────────┐
│ [576495936675512319,576531121047601151,....]│
└─────────────────────────────────────────────┘

h3GetPentagonIndexes

Returns all the pentagon H3 indexes at the specified resolution.

Syntax

h3GetPentagonIndexes(resolution)

Parameters

  • resolution: Index resolution. Range: [0, 15]. UInt8.

Returned value

  • Array of all pentagon H3 indexes. Array(UInt64).

Example

Query:

SELECT h3GetPentagonIndexes(3) AS indexes

Result:

┌─indexes────────────────────────────────────────────────────────┐
│ [590112357393367039,590464201114255359,590816044835143679,...] │
└────────────────────────────────────────────────────────────────┘

h3Line

Returns the line of indices between the two indices that are provided.

Syntax

h3Line(start,end)

Parameters

  • start: Hexagon index number that represents a starting point. UInt64.
  • end: Hexagon index number that represents an ending point. UInt64.

Returned value

Array of h3 indexes representing the line of indices between the two provided indices. Array(UInt64).

Example

Query:

 SELECT h3Line(590080540275638271,590103561300344831) as indexes

Result:

┌─indexes────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [590080540275638271,590080471556161535,590080883873021951,590106516237844479,590104385934065663,590103630019821567,590103561300344831] │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

h3Distance

Returns the distance in grid cells between the two indices that are provided.

Syntax

h3Distance(start,end)

Parameters

  • start: Hexagon index number that represents a starting point. UInt64.
  • end: Hexagon index number that represents an ending point. UInt64.

Returned value

  • Number of grid cells. Int64.

Returns a negative number if finding the distance fails.

Example

Query:

 SELECT h3Distance(590080540275638271,590103561300344831) as distance

Result:

┌─distance─┐
│        7 │
└──────────┘

h3HexRing

Returns the indexes of the hexagonal ring centered at the provided origin h3Index and length k.

Returns 0 if no pentagonal distortion was encountered.

Syntax

h3HexRing(index, k)

Parameters

  • index: Hexagon index number that represents the origin. UInt64.
  • k: Distance. UInt64.

Returned values

  • Array of H3 indexes. Array(UInt64).

Example

Query:

 SELECT h3HexRing(590080540275638271, toUInt16(1)) AS hexRing

Result:

┌─hexRing─────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [590080815153545215,590080471556161535,590080677714591743,590077585338138623,590077447899185151,590079509483487231] │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

h3GetUnidirectionalEdge

Returns a unidirectional edge H3 index based on the provided origin and destination and returns 0 on error.

Syntax

h3GetUnidirectionalEdge(originIndex, destinationIndex)

Parameters

  • originIndex: Origin Hexagon index number. UInt64.
  • destinationIndex: Destination Hexagon index number. UInt64.

Returned value

  • Unidirectional Edge Hexagon Index number. UInt64.

Example

Query:

 SELECT h3GetUnidirectionalEdge(599686042433355775, 599686043507097599) as edge

Result:

┌────────────────edge─┐
│ 1248204388774707199 │
└─────────────────────┘

h3UnidirectionalEdgeIsValid

Determines if the provided H3Index is a valid unidirectional edge index. Returns 1 if it's a unidirectional edge and 0 otherwise.

Syntax

h3UnidirectionalEdgeisValid(index)

Parameters

  • index: Hexagon index number. UInt64.

Returned value

  • 1: The H3 index is a valid unidirectional edge. UInt8.
  • 0: The H3 index is not a valid unidirectional edge. UInt8.

Example

Query:

 SELECT h3UnidirectionalEdgeIsValid(1248204388774707199) as validOrNot

Result:

┌─validOrNot─┐
│          1 │
└────────────┘

h3GetOriginIndexFromUnidirectionalEdge

Returns the origin hexagon index from the unidirectional edge H3Index.

Syntax

h3GetOriginIndexFromUnidirectionalEdge(edge)

Parameters

  • edge: Hexagon index number that represents a unidirectional edge. UInt64.

Returned value

  • Origin Hexagon Index number. UInt64.

Example

Query:

 SELECT h3GetOriginIndexFromUnidirectionalEdge(1248204388774707197) as origin

Result:

┌─────────────origin─┐
│ 599686042433355773 │
└────────────────────┘

h3GetDestinationIndexFromUnidirectionalEdge

Returns the destination hexagon index from the unidirectional edge H3Index.

Syntax

h3GetDestinationIndexFromUnidirectionalEdge(edge)

Parameters

  • edge: Hexagon index number that represents a unidirectional edge. UInt64.

Returned value

  • Destination Hexagon Index number. UInt64.

Example

Query:

 SELECT h3GetDestinationIndexFromUnidirectionalEdge(1248204388774707197) as destination

Result:

┌────────destination─┐
│ 599686043507097597 │
└────────────────────┘

h3GetIndexesFromUnidirectionalEdge

Returns the origin and destination hexagon indexes from the given unidirectional edge H3Index.

Syntax

h3GetIndexesFromUnidirectionalEdge(edge)

Parameters

  • edge: Hexagon index number that represents a unidirectional edge. UInt64.

Returned value

A tuple consisting of two values tuple(origin,destination):

  • origin: Origin Hexagon index number. UInt64.
  • destination: Destination Hexagon index number. UInt64.

Returns (0,0) if the provided input is not valid.

Example

Query:

 SELECT h3GetIndexesFromUnidirectionalEdge(1248204388774707199) as indexes

Result:

┌─indexes─────────────────────────────────┐
│ (599686042433355775,599686043507097599) │
└─────────────────────────────────────────┘

h3GetUnidirectionalEdgesFromHexagon

Provides all of the unidirectional edges from the provided H3Index.

Syntax

h3GetUnidirectionalEdgesFromHexagon(index)

Parameters

  • index: Hexagon index number that represents a unidirectional edge. UInt64.

Returned value

Array of h3 indexes representing each unidirectional edge. Array(UInt64).

Example

Query:

 SELECT h3GetUnidirectionalEdgesFromHexagon(1248204388774707199) as edges

Result:

┌─edges─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ [1248204388774707199,1320261982812635135,1392319576850563071,1464377170888491007,1536434764926418943,1608492358964346879] │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

h3GetUnidirectionalEdgeBoundary

Returns the coordinates defining the unidirectional edge.

Syntax

h3GetUnidirectionalEdgeBoundary(index)

Parameters

  • index: Hexagon index number that represents a unidirectional edge. UInt64.

Returned value

  • Array of pairs '(lon, lat)'. Array(Float64, Float64).

Example

Query:

 SELECT h3GetUnidirectionalEdgeBoundary(1248204388774707199) as boundary

Result:

┌─boundary────────────────────────────────────────────────────────────────────────┐
│ [(37.42012867767779,-122.03773496427027),(37.33755608435299,-122.090428929044)] │
└─────────────────────────────────────────────────────────────────────────────────┘

WKT

Returns a WKT (Well Known Text) geometric object from various Geo data types. Supported WKT objects are:

  • POINT
  • POLYGON
  • MULTIPOLYGON
  • LINESTRING
  • MULTILINESTRING

Syntax

WKT(geo_data)

### Parameters

geo_data can be one of the following Geo data types or their underlying primitive types:

  • Point
  • Ring
  • Polygon
  • MultiPolygon
  • LineString
  • MultiLineString

Returned value

  • WKT geometric object POINT is returned for a Point.
  • WKT geometric object POLYGON is returned for a Polygon
  • WKT geometric object MULTIPOLYGON is returned for a MultiPolygon.
  • WKT geometric object LINESTRING is returned for a LineString.
  • WKT geometric object MULTILINESTRING is returned for a MultiLineString.

Examples

POINT from tuple:

SELECT wkt((0., 0.))
POINT(0 0)

POLYGON from an array of tuples or an array of tuple arrays:

SELECT wkt([(0., 0.), (10., 0.), (10., 10.), (0., 10.)])
POLYGON((0 0,10 0,10 10,0 10))

MULTIPOLYGON from an array of multi-dimensional tuple arrays:

SELECT wkt([[[(0., 0.), (10., 0.), (10., 10.), (0., 10.)], [(4., 4.), (5., 4.), (5., 5.), (4., 5.)]], [[(-10., -10.), (-10., -9.), (-9., 10.)]]])
MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))

readWKTMultiPolygon

Converts a WKT (Well Known Text) MultiPolygon into a MultiPolygon type.

Example

SELECT
    toTypeName(readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))')) AS type,
    readWKTMultiPolygon('MULTIPOLYGON(((2 0,10 0,10 10,0 10,2 0),(4 4,5 4,5 5,4 5,4 4)),((-10 -10,-10 -9,-9 10,-10 -10)))') AS output FORMAT Markdown

typeoutput
MultiPolygon[[[(2,0),(10,0),(10,10),(0,10),(2,0)],[(4,4),(5,4),(5,5),(4,5),(4,4)]],[[(-10,-10),(-10,-9),(-9,10),(-10,-10)]]]

Input parameters

String starting with MULTIPOLYGON

Returned value

MultiPolygon

readWKTPolygon

Converts a WKT (Well Known Text) MultiPolygon into a Polygon type.

Example

SELECT
    toTypeName(readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))')) AS type,
    readWKTPolygon('POLYGON((2 0,10 0,10 10,0 10,2 0))') AS output
FORMAT Markdown
typeoutput
Polygon[[(2,0),(10,0),(10,10),(0,10),(2,0)]]

Input parameters

String starting with POLYGON

Returned value

Polygon

readWKTPoint

The readWKTPoint function in Tinybird parses a Well-Known Text (WKT) representation of a Point geometry and returns a point in the internal format.

Syntax

readWKTPoint(wkt_string)

Arguments

  • wkt_string: The input WKT string representing a Point geometry.

Returned value

The function returns an internal representation of the Point geometry.

Example

SELECT readWKTPoint('POINT (1.2 3.4)')
(1.2,3.4)

readWKTLineString

Parses a Well-Known Text (WKT) representation of a LineString geometry and returns it in the internal format.

Syntax

readWKTLineString(wkt_string)

Arguments

  • wkt_string: The input WKT string representing a LineString geometry.

Returned value

The function returns an internal representation of the linestring geometry.

Example

SELECT readWKTLineString('LINESTRING (1 1, 2 2, 3 3, 1 1)')
[(1,1),(2,2),(3,3),(1,1)]

readWKTMultiLineString

Parses a Well-Known Text (WKT) representation of a MultiLineString geometry and returns it in the internal format.

Syntax

readWKTMultiLineString(wkt_string)

Arguments

  • wkt_string: The input WKT string representing a MultiLineString geometry.

Returned value

The function returns an internal representation of the multilinestring geometry.

Example

SELECT readWKTMultiLineString('MULTILINESTRING ((1 1, 2 2, 3 3), (4 4, 5 5, 6 6))')
[[(1,1),(2,2),(3,3)],[(4,4),(5,5),(6,6)]]

readWKTRing

Parses a Well-Known Text (WKT) representation of a Polygon geometry and returns a ring (closed linestring) in the internal format.

Syntax

readWKTRing(wkt_string)

Arguments

  • wkt_string: The input WKT string representing a Polygon geometry.

Returned value

The function returns an internal representation of the ring (closed linestring) geometry.

Example

SELECT readWKTRing('POLYGON ((1 1, 2 2, 3 3, 1 1))')
[(1,1),(2,2),(3,3),(1,1)]

polygonsWithinSpherical

Returns true or false depending on whether or not one polygon lies completely inside another polygon. Reference https://www.boost.org/doc/libs/1_62_0/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html

Example

select polygonsWithinSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]])
0

Input parameters

Returned value

UInt8, 0 for false, 1 for true

polygonsDistanceSpherical

Calculates the minimal distance between two points where one point belongs to the first polygon and the second to another polygon. Spherical means that coordinates are interpreted as coordinates on a pure and ideal sphere, which is not true for the Earth. Using this type of coordinate system speeds up execution, but of course is not precise.

Example

SELECT polygonsDistanceSpherical([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]])
0.24372872211133834

Input parameters

Two polygons

Returned value

Float64

polygonsDistanceCartesian

Calculates distance between two polygons

Example

SELECT polygonsDistanceCartesian([[[(0, 0), (0, 0.1), (0.1, 0.1), (0.1, 0)]]], [[[(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)]]])
14.000714267493642

Input parameters

Two polygons

Returned value

Float64

polygonsEqualsCartesian

Returns true if two polygons are equal

Example

SELECT polygonsEqualsCartesian([[[(1., 1.), (1., 4.), (4., 4.), (4., 1.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])
1

Input parameters

Two polygons

Returned value

UInt8, 0 for false, 1 for true

polygonsSymDifferenceSpherical

Calculates the spatial set theoretic symmetric difference (XOR) between two polygons

Example

SELECT wkt(arraySort(polygonsSymDifferenceSpherical([[(50., 50.), (50., -50.), (-50., -50.), (-50., 50.), (50., 50.)], [(10., 10.), (10., 40.), (40., 40.), (40., 10.), (10., 10.)], [(-10., -10.), (-10., -40.), (-40., -40.), (-40., -10.), (-10., -10.)]], [[(-20., -20.), (-20., 20.), (20., 20.), (20., -20.), (-20., -20.)]])))
MULTIPOLYGON(((-20 -10.3067,-10 -10,-10 -20.8791,-20 -20,-20 -10.3067)),((10 20.8791,20 20,20 10.3067,10 10,10 20.8791)),((50 50,50 -50,-50 -50,-50 50,50 50),(20 10.3067,40 10,40 40,10 40,10 20.8791,-20 20,-20 -10.3067,-40 -10,-40 -40,-10 -40,-10 -20.8791,20 -20,20 10.3067)))

Input parameters

Polygons

Returned value

MultiPolygon

polygonsSymDifferenceCartesian

The same as polygonsSymDifferenceSpherical, but the coordinates are in the Cartesian coordinate system; which is more close to the model of the real Earth.

Example

SELECT wkt(polygonsSymDifferenceCartesian([[[(0, 0), (0, 3), (1, 2.9), (2, 2.6), (2.6, 2), (2.9, 1), (3, 0), (0, 0)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,1 1,2.9 1,3 0,0 0,0 3,1 2.9)),((1 2.9,1 4,4 4,4 1,2.9 1,2.6 2,2 2.6,1 2.9)))

Input parameters

Polygons

Returned value

MultiPolygon

polygonsIntersectionSpherical

Calculates the intersection (AND) between polygons, coordinates are spherical.

Example

SELECT wkt(arrayMap(a -> arrayMap(b -> arrayMap(c -> (round(c.1, 6), round(c.2, 6)), b), a), polygonsIntersectionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]])))
MULTIPOLYGON(((4.3666 50.8434,4.36024 50.8436,4.34956 50.8536,4.35268 50.8567,4.36794 50.8525,4.3666 50.8434)))

Input parameters

Polygons

Returned value

MultiPolygon

polygonsWithinCartesian

Returns true if the second polygon is within the first polygon.

Example

SELECT polygonsWithinCartesian([[[(2., 2.), (2., 3.), (3., 3.), (3., 2.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]])
1

Input parameters

Two polygons

Returned value

UInt8, 0 for false, 1 for true

polygonConvexHullCartesian

Calculates a convex hull. Reference

Coordinates are in Cartesian coordinate system.

Example

SELECT wkt(polygonConvexHullCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.), (2., 3.)]]]))
POLYGON((0 0,0 5,5 5,5 0,0 0))

Input parameters

MultiPolygon

Returned value

Polygon

polygonAreaSpherical

Calculates the surface area of a polygon.

Example

SELECT round(polygonAreaSpherical([[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]), 14)
9.387704e-8

Input parameters

Polygon

Returned value

Float

polygonsUnionSpherical

Calculates a union (OR).

Example

SELECT wkt(polygonsUnionSpherical([[[(4.3613577, 50.8651821), (4.349556, 50.8535879), (4.3602419, 50.8435626), (4.3830299, 50.8428851), (4.3904543, 50.8564867), (4.3613148, 50.8651279)]]], [[[(4.346693, 50.858306), (4.367945, 50.852455), (4.366227, 50.840809), (4.344961, 50.833264), (4.338074, 50.848677), (4.346693, 50.858306)]]]))
MULTIPOLYGON(((4.36661 50.8434,4.36623 50.8408,4.34496 50.8333,4.33807 50.8487,4.34669 50.8583,4.35268 50.8567,4.36136 50.8652,4.36131 50.8651,4.39045 50.8565,4.38303 50.8429,4.36661 50.8434)))

Input parameters

Polygons

Returned value

MultiPolygon

polygonPerimeterSpherical

Calculates the perimeter of the polygon.

Example

This is the polygon representing Zimbabwe:

POLYGON((30.0107 -15.6462,30.0502 -15.6401,30.09 -15.6294,30.1301 -15.6237,30.1699 -15.6322,30.1956 -15.6491,30.2072 -15.6532,30.2231 -15.6497,30.231 -15.6447,30.2461 -15.6321,30.2549 -15.6289,30.2801 -15.6323,30.2962 -15.639,30.3281 -15.6524,30.3567 -15.6515,30.3963 -15.636,30.3977 -15.7168,30.3993 -15.812,30.4013 -15.9317,30.4026 -16.0012,30.5148 -16.0004,30.5866 -16,30.7497 -15.9989,30.8574 -15.9981,30.9019 -16.0071,30.9422 -16.0345,30.9583 -16.0511,30.9731 -16.062,30.9898 -16.0643,31.012 -16.0549,31.0237 -16.0452,31.0422 -16.0249,31.0569 -16.0176,31.0654 -16.0196,31.0733 -16.0255,31.0809 -16.0259,31.089 -16.0119,31.1141 -15.9969,31.1585 -16.0002,31.26 -16.0235,31.2789 -16.0303,31.2953 -16.0417,31.3096 -16.059,31.3284 -16.0928,31.3409 -16.1067,31.3603 -16.1169,31.3703 -16.1237,31.3746 -16.1329,31.3778 -16.1422,31.384 -16.1488,31.3877 -16.1496,31.3956 -16.1477,31.3996 -16.1473,31.4043 -16.1499,31.4041 -16.1545,31.4027 -16.1594,31.4046 -16.1623,31.4241 -16.1647,31.4457 -16.165,31.4657 -16.1677,31.4806 -16.178,31.5192 -16.1965,31.6861 -16.2072,31.7107 -16.2179,31.7382 -16.2398,31.7988 -16.3037,31.8181 -16.3196,31.8601 -16.3408,31.8719 -16.3504,31.8807 -16.368,31.8856 -16.4063,31.8944 -16.4215,31.9103 -16.4289,32.0141 -16.4449,32.2118 -16.4402,32.2905 -16.4518,32.3937 -16.4918,32.5521 -16.5534,32.6718 -16.5998,32.6831 -16.6099,32.6879 -16.6243,32.6886 -16.6473,32.6987 -16.6868,32.7252 -16.7064,32.7309 -16.7087,32.7313 -16.7088,32.7399 -16.7032,32.7538 -16.6979,32.7693 -16.6955,32.8007 -16.6973,32.862 -16.7105,32.8934 -16.7124,32.9096 -16.7081,32.9396 -16.6898,32.9562 -16.6831,32.9685 -16.6816,32.9616 -16.7103,32.9334 -16.8158,32.9162 -16.8479,32.9005 -16.8678,32.8288 -16.9351,32.8301 -16.9415,32.8868 -17.0382,32.9285 -17.1095,32.9541 -17.1672,32.9678 -17.2289,32.9691 -17.2661,32.9694 -17.2761,32.9732 -17.2979,32.9836 -17.3178,32.9924 -17.3247,33.0147 -17.3367,33.0216 -17.3456,33.0225 -17.3615,33.0163 -17.3772,33.0117 -17.384,32.9974 -17.405,32.9582 -17.4785,32.9517 -17.4862,32.943 -17.4916,32.9366 -17.4983,32.9367 -17.5094,32.9472 -17.5432,32.9517 -17.5514,32.9691 -17.5646,33.0066 -17.581,33.0204 -17.5986,33.0245 -17.6192,33.0206 -17.6385,33.0041 -17.6756,33.0002 -17.7139,33.0032 -17.7577,32.9991 -17.7943,32.9736 -17.8106,32.957 -17.818,32.9461 -17.8347,32.9397 -17.8555,32.9369 -17.875,32.9384 -17.8946,32.9503 -17.9226,32.9521 -17.9402,32.9481 -17.9533,32.9404 -17.96,32.9324 -17.9649,32.9274 -17.9729,32.929 -17.9823,32.9412 -17.9963,32.9403 -18.0048,32.9349 -18.0246,32.9371 -18.0471,32.9723 -18.1503,32.9755 -18.1833,32.9749 -18.1908,32.9659 -18.2122,32.9582 -18.2254,32.9523 -18.233,32.9505 -18.2413,32.955 -18.2563,32.9702 -18.2775,33.0169 -18.3137,33.035 -18.3329,33.0428 -18.352,33.0381 -18.3631,33.0092 -18.3839,32.9882 -18.4132,32.9854 -18.4125,32.9868 -18.4223,32.9995 -18.4367,33.003 -18.4469,32.9964 -18.4671,32.9786 -18.4801,32.9566 -18.4899,32.9371 -18.501,32.9193 -18.51,32.9003 -18.5153,32.8831 -18.5221,32.8707 -18.5358,32.8683 -18.5526,32.8717 -18.5732,32.8845 -18.609,32.9146 -18.6659,32.9223 -18.6932,32.9202 -18.7262,32.9133 -18.753,32.9025 -18.7745,32.8852 -18.7878,32.8589 -18.79,32.8179 -18.787,32.7876 -18.7913,32.6914 -18.8343,32.6899 -18.8432,32.6968 -18.8972,32.7032 -18.9119,32.7158 -18.9198,32.7051 -18.9275,32.6922 -18.9343,32.6825 -18.9427,32.6811 -18.955,32.6886 -18.9773,32.6903 -18.9882,32.6886 -19.001,32.6911 -19.0143,32.699 -19.0222,32.7103 -19.026,32.7239 -19.0266,32.786 -19.0177,32.8034 -19.0196,32.8142 -19.0238,32.82 -19.0283,32.823 -19.0352,32.8253 -19.0468,32.8302 -19.0591,32.8381 -19.0669,32.8475 -19.0739,32.8559 -19.0837,32.8623 -19.1181,32.8332 -19.242,32.8322 -19.2667,32.8287 -19.2846,32.8207 -19.3013,32.8061 -19.3234,32.7688 -19.3636,32.7665 -19.3734,32.7685 -19.4028,32.7622 -19.4434,32.7634 -19.464,32.7739 -19.4759,32.7931 -19.4767,32.8113 -19.4745,32.8254 -19.4792,32.8322 -19.5009,32.8325 -19.5193,32.8254 -19.5916,32.8257 -19.6008,32.8282 -19.6106,32.8296 -19.6237,32.8254 -19.6333,32.8195 -19.642,32.8163 -19.6521,32.8196 -19.6743,32.831 -19.6852,32.8491 -19.6891,32.8722 -19.6902,32.8947 -19.6843,32.9246 -19.6553,32.9432 -19.6493,32.961 -19.6588,32.9624 -19.6791,32.9541 -19.7178,32.9624 -19.7354,32.9791 -19.7514,33.0006 -19.7643,33.0228 -19.7731,33.0328 -19.7842,33.0296 -19.8034,33.0229 -19.8269,33.0213 -19.8681,33.002 -19.927,32.9984 -20.0009,33.0044 -20.0243,33.0073 -20.032,32.9537 -20.0302,32.9401 -20.0415,32.9343 -20.0721,32.9265 -20.0865,32.9107 -20.0911,32.8944 -20.094,32.8853 -20.103,32.8779 -20.1517,32.8729 -20.1672,32.8593 -20.1909,32.8571 -20.2006,32.8583 -20.2075,32.8651 -20.2209,32.8656 -20.2289,32.8584 -20.2595,32.853 -20.2739,32.8452 -20.2867,32.8008 -20.3386,32.7359 -20.4142,32.7044 -20.4718,32.6718 -20.5318,32.6465 -20.558,32.6037 -20.5648,32.5565 -20.5593,32.5131 -20.5646,32.4816 -20.603,32.4711 -20.6455,32.4691 -20.6868,32.4835 -20.7942,32.4972 -20.8981,32.491 -20.9363,32.4677 -20.9802,32.4171 -21.0409,32.3398 -21.1341,32.3453 -21.1428,32.3599 -21.1514,32.3689 -21.163,32.3734 -21.1636,32.3777 -21.1634,32.3806 -21.1655,32.3805 -21.1722,32.3769 -21.1785,32.373 -21.184,32.3717 -21.1879,32.4446 -21.3047,32.4458 -21.309,32.4472 -21.3137,32.4085 -21.2903,32.373 -21.3279,32.3245 -21.3782,32.2722 -21.4325,32.2197 -21.4869,32.1673 -21.5413,32.1148 -21.5956,32.0624 -21.65,32.01 -21.7045,31.9576 -21.7588,31.9052 -21.8132,31.8527 -21.8676,31.8003 -21.922,31.7478 -21.9764,31.6955 -22.0307,31.6431 -22.0852,31.5907 -22.1396,31.5382 -22.1939,31.4858 -22.2483,31.4338 -22.302,31.3687 -22.345,31.2889 -22.3973,31.2656 -22.3655,31.2556 -22.358,31.2457 -22.3575,31.2296 -22.364,31.2215 -22.3649,31.2135 -22.3619,31.1979 -22.3526,31.1907 -22.3506,31.1837 -22.3456,31.1633 -22.3226,31.1526 -22.3164,31.1377 -22.3185,31.1045 -22.3334,31.097 -22.3349,31.0876 -22.3369,31.0703 -22.3337,31.0361 -22.3196,30.9272 -22.2957,30.8671 -22.2896,30.8379 -22.2823,30.8053 -22.2945,30.6939 -22.3028,30.6743 -22.3086,30.6474 -22.3264,30.6324 -22.3307,30.6256 -22.3286,30.6103 -22.3187,30.6011 -22.3164,30.5722 -22.3166,30.5074 -22.3096,30.4885 -22.3102,30.4692 -22.3151,30.4317 -22.3312,30.4127 -22.3369,30.3721 -22.3435,30.335 -22.3447,30.3008 -22.337,30.2693 -22.3164,30.2553 -22.3047,30.2404 -22.2962,30.2217 -22.2909,30.197 -22.2891,30.1527 -22.2948,30.1351 -22.2936,30.1111 -22.2823,30.0826 -22.2629,30.0679 -22.2571,30.0381 -22.2538,30.0359 -22.2506,30.0345 -22.2461,30.0155 -22.227,30.0053 -22.2223,29.9838 -22.2177,29.974 -22.214,29.9467 -22.1983,29.9321 -22.1944,29.896 -22.1914,29.8715 -22.1793,29.8373 -22.1724,29.7792 -22.1364,29.7589 -22.1309,29.6914 -22.1341,29.6796 -22.1383,29.6614 -22.1265,29.6411 -22.1292,29.604 -22.1451,29.5702 -22.142,29.551 -22.146,29.5425 -22.1625,29.5318 -22.1724,29.5069 -22.1701,29.4569 -22.1588,29.4361 -22.1631,29.3995 -22.1822,29.378 -22.1929,29.3633 -22.1923,29.3569 -22.1909,29.3501 -22.1867,29.2736 -22.1251,29.2673 -22.1158,29.2596 -22.0961,29.2541 -22.0871,29.2444 -22.0757,29.2393 -22.0726,29.1449 -22.0753,29.108 -22.0692,29.0708 -22.051,29.0405 -22.0209,29.0216 -21.9828,29.0138 -21.9404,29.0179 -21.8981,29.0289 -21.8766,29.0454 -21.8526,29.0576 -21.8292,29.0553 -21.81,29.0387 -21.7979,28.9987 -21.786,28.9808 -21.7748,28.9519 -21.7683,28.891 -21.7649,28.8609 -21.7574,28.7142 -21.6935,28.6684 -21.68,28.6297 -21.6513,28.6157 -21.6471,28.5859 -21.6444,28.554 -21.6366,28.5429 -21.6383,28.5325 -21.6431,28.4973 -21.6515,28.4814 -21.6574,28.4646 -21.6603,28.4431 -21.6558,28.3618 -21.6163,28.3219 -21.6035,28.2849 -21.5969,28.1657 -21.5952,28.0908 -21.5813,28.0329 -21.5779,28.0166 -21.5729,28.0026 -21.5642,27.9904 -21.5519,27.9847 -21.5429,27.9757 -21.5226,27.9706 -21.5144,27.9637 -21.5105,27.9581 -21.5115,27.9532 -21.5105,27.9493 -21.5008,27.9544 -21.4878,27.9504 -21.482,27.9433 -21.4799,27.9399 -21.478,27.9419 -21.4685,27.9496 -21.4565,27.953 -21.4487,27.9502 -21.4383,27.9205 -21.3812,27.9042 -21.3647,27.8978 -21.3554,27.8962 -21.3479,27.8967 -21.3324,27.8944 -21.3243,27.885 -21.3102,27.8491 -21.2697,27.8236 -21.2317,27.7938 -21.1974,27.7244 -21.1497,27.7092 -21.1345,27.6748 -21.0901,27.6666 -21.0712,27.6668 -21.0538,27.679 -21.0007,27.6804 -20.9796,27.6727 -20.9235,27.6726 -20.9137,27.6751 -20.8913,27.6748 -20.8799,27.676 -20.8667,27.6818 -20.8576,27.689 -20.849,27.6944 -20.8377,27.7096 -20.7567,27.7073 -20.7167,27.6825 -20.6373,27.6904 -20.6015,27.7026 -20.5661,27.7056 -20.5267,27.6981 -20.5091,27.6838 -20.4961,27.666 -20.4891,27.6258 -20.4886,27.5909 -20.4733,27.5341 -20.483,27.4539 -20.4733,27.3407 -20.473,27.306 -20.4774,27.2684 -20.4958,27.284 -20.3515,27.266 -20.2342,27.2149 -20.1105,27.2018 -20.093,27.1837 -20.0823,27.1629 -20.0766,27.1419 -20.0733,27.1297 -20.0729,27.1198 -20.0739,27.1096 -20.0732,27.0973 -20.0689,27.0865 -20.0605,27.0692 -20.0374,27.0601 -20.0276,27.0267 -20.0101,26.9943 -20.0068,26.9611 -20.0072,26.9251 -20.0009,26.8119 -19.9464,26.7745 -19.9398,26.7508 -19.9396,26.731 -19.9359,26.7139 -19.9274,26.6986 -19.9125,26.6848 -19.8945,26.6772 -19.8868,26.6738 -19.8834,26.6594 -19.8757,26.6141 -19.8634,26.5956 -19.8556,26.5819 -19.8421,26.5748 -19.8195,26.5663 -19.8008,26.5493 -19.7841,26.5089 -19.7593,26.4897 -19.7519,26.4503 -19.7433,26.4319 -19.7365,26.4128 -19.7196,26.3852 -19.6791,26.3627 -19.6676,26.3323 -19.6624,26.3244 -19.6591,26.3122 -19.6514,26.3125 -19.6496,26.3191 -19.6463,26.3263 -19.6339,26.3335 -19.613,26.331 -19.605,26.3211 -19.592,26.3132 -19.5842,26.3035 -19.5773,26.2926 -19.5725,26.2391 -19.5715,26.1945 -19.5602,26.1555 -19.5372,26.1303 -19.5011,26.0344 -19.2437,26.0114 -19.1998,25.9811 -19.1618,25.9565 -19.1221,25.9486 -19.1033,25.9449 -19.0792,25.9481 -19.0587,25.9644 -19.0216,25.9678 -19.001,25.9674 -18.9999,25.9407 -18.9213,25.8153 -18.814,25.7795 -18.7388,25.7734 -18.6656,25.7619 -18.6303,25.7369 -18.6087,25.6983 -18.5902,25.6695 -18.566,25.6221 -18.5011,25.6084 -18.4877,25.5744 -18.4657,25.5085 -18.3991,25.4956 -18.3789,25.4905 -18.3655,25.4812 -18.3234,25.4732 -18.3034,25.4409 -18.2532,25.4088 -18.176,25.3875 -18.139,25.3574 -18.1158,25.3234 -18.0966,25.2964 -18.0686,25.255 -18.0011,25.2261 -17.9319,25.2194 -17.908,25.2194 -17.8798,25.2598 -17.7941,25.2667 -17.8009,25.2854 -17.8093,25.3159 -17.8321,25.3355 -17.8412,25.3453 -17.8426,25.3765 -17.8412,25.4095 -17.853,25.4203 -17.8549,25.4956 -17.8549,25.5007 -17.856,25.5102 -17.8612,25.5165 -17.8623,25.5221 -17.8601,25.5309 -17.851,25.5368 -17.8487,25.604 -17.8362,25.657 -17.8139,25.6814 -17.8115,25.6942 -17.8194,25.7064 -17.8299,25.7438 -17.8394,25.766 -17.8498,25.786 -17.8622,25.7947 -17.8727,25.8044 -17.8882,25.8497 -17.9067,25.8636 -17.9238,25.8475 -17.9294,25.8462 -17.9437,25.8535 -17.96,25.8636 -17.9716,25.9245 -17.999,25.967 -18.0005,25.9785 -17.999,26.0337 -17.9716,26.0406 -17.9785,26.0466 -17.9663,26.0625 -17.9629,26.0812 -17.9624,26.0952 -17.9585,26.0962 -17.9546,26.0942 -17.9419,26.0952 -17.9381,26.1012 -17.9358,26.1186 -17.9316,26.1354 -17.9226,26.1586 -17.9183,26.1675 -17.9136,26.203 -17.8872,26.2119 -17.8828,26.2211 -17.8863,26.2282 -17.8947,26.2339 -17.904,26.2392 -17.9102,26.2483 -17.9134,26.2943 -17.9185,26.3038 -17.9228,26.312 -17.9284,26.3183 -17.9344,26.3255 -17.936,26.3627 -17.9306,26.4086 -17.939,26.4855 -17.9793,26.5271 -17.992,26.5536 -17.9965,26.5702 -18.0029,26.5834 -18.0132,26.5989 -18.03,26.6127 -18.0412,26.6288 -18.0492,26.6857 -18.0668,26.7 -18.0692,26.7119 -18.0658,26.7406 -18.0405,26.7536 -18.033,26.7697 -18.029,26.794 -18.0262,26.8883 -17.9846,26.912 -17.992,26.9487 -17.9689,26.9592 -17.9647,27.0063 -17.9627,27.0213 -17.9585,27.0485 -17.9443,27.0782 -17.917,27.1154 -17.8822,27.149 -17.8425,27.1465 -17.8189,27.1453 -17.7941,27.147 -17.7839,27.1571 -17.7693,27.4221 -17.5048,27.5243 -17.4151,27.5773 -17.3631,27.6045 -17.3128,27.6249 -17.2333,27.6412 -17.1985,27.7773 -17.0012,27.8169 -16.9596,27.8686 -16.9297,28.023 -16.8654,28.1139 -16.8276,28.2125 -16.7486,28.2801 -16.7065,28.6433 -16.5688,28.6907 -16.5603,28.7188 -16.5603,28.7328 -16.5581,28.7414 -16.5507,28.7611 -16.5323,28.7693 -16.5152,28.8089 -16.4863,28.8225 -16.4708,28.8291 -16.4346,28.8331 -16.4264,28.8572 -16.3882,28.857 -16.3655,28.8405 -16.3236,28.8368 -16.3063,28.8403 -16.2847,28.8642 -16.2312,28.8471 -16.2027,28.8525 -16.1628,28.8654 -16.1212,28.871 -16.0872,28.8685 -16.0822,28.8638 -16.0766,28.8593 -16.0696,28.8572 -16.0605,28.8603 -16.0494,28.8741 -16.0289,28.8772 -16.022,28.8989 -15.9955,28.9324 -15.9637,28.9469 -15.9572,28.9513 -15.9553,28.9728 -15.9514,29.0181 -15.9506,29.0423 -15.9463,29.0551 -15.9344,29.0763 -15.8954,29.0862 -15.8846,29.1022 -15.8709,29.1217 -15.8593,29.1419 -15.8545,29.151 -15.8488,29.1863 -15.8128,29.407 -15.7142,29.4221 -15.711,29.5085 -15.7036,29.5262 -15.6928,29.5634 -15.6621,29.5872 -15.6557,29.6086 -15.6584,29.628 -15.6636,29.6485 -15.6666,29.6728 -15.6633,29.73 -15.6447,29.7733 -15.6381,29.8143 -15.6197,29.8373 -15.6148,29.8818 -15.6188,29.9675 -15.6415,30.0107 -15.6462))
SELECT round(polygonPerimeterSpherical([(30.010654, -15.646227), (30.050238, -15.640129), (30.090029, -15.629381), (30.130129, -15.623696), (30.16992, -15.632171), (30.195552, -15.649121), (30.207231, -15.653152), (30.223147, -15.649741), (30.231002, -15.644677), (30.246091, -15.632068), (30.254876, -15.628864), (30.280094, -15.632275), (30.296196, -15.639042), (30.32805, -15.652428), (30.356679, -15.651498), (30.396263, -15.635995), (30.39771, -15.716817), (30.39926, -15.812005), (30.401327, -15.931688), (30.402568, -16.001244), (30.514809, -16.000418), (30.586587, -16.000004), (30.74973, -15.998867), (30.857424, -15.998144), (30.901865, -16.007136), (30.942173, -16.034524), (30.958296, -16.05106), (30.973075, -16.062016), (30.989767, -16.06429), (31.012039, -16.054885), (31.023718, -16.045169), (31.042218, -16.024912), (31.056895, -16.017574), (31.065421, -16.019641), (31.073328, -16.025532), (31.080872, -16.025946), (31.089037, -16.01189), (31.1141, -15.996904), (31.15849, -16.000211), (31.259983, -16.023465), (31.278897, -16.030287), (31.29533, -16.041655), (31.309592, -16.059019), (31.328351, -16.092815), (31.340908, -16.106664), (31.360339, -16.116896), (31.37026, -16.123718), (31.374601, -16.132916), (31.377754, -16.142218), (31.384006, -16.148832), (31.387727, -16.149556), (31.395582, -16.147695), (31.399613, -16.147282), (31.404315, -16.149866), (31.404057, -16.154517), (31.402713, -16.159374), (31.404574, -16.162268), (31.424107, -16.164749), (31.445708, -16.164955), (31.465655, -16.167746), (31.480641, -16.177978), (31.519192, -16.196478), (31.686107, -16.207227), (31.710705, -16.217872), (31.738197, -16.239783), (31.798761, -16.303655), (31.818088, -16.319571), (31.86005, -16.340759), (31.871935, -16.35037), (31.88072, -16.368044), (31.88563, -16.406284), (31.894363, -16.421477), (31.910279, -16.428919), (32.014149, -16.444938), (32.211759, -16.440184), (32.290463, -16.45176), (32.393661, -16.491757), (32.5521, -16.553355), (32.671783, -16.599761), (32.6831, -16.609889), (32.687906, -16.624255), (32.68863, -16.647303), (32.698655, -16.686784), (32.725217, -16.706421), (32.73095, -16.708656), (32.731314, -16.708798), (32.739893, -16.703217), (32.753845, -16.697946), (32.769348, -16.695466), (32.800664, -16.697326), (32.862004, -16.710452), (32.893372, -16.712415), (32.909598, -16.708075), (32.93957, -16.689781), (32.95621, -16.683063), (32.968509, -16.681615999999998), (32.961585, -16.710348), (32.933369, -16.815768), (32.916213, -16.847911), (32.900503, -16.867755), (32.828776, -16.935141), (32.83012, -16.941549), (32.886757, -17.038184), (32.928512, -17.109497), (32.954143, -17.167168), (32.967786, -17.22887), (32.96909, -17.266115), (32.969439, -17.276102), (32.973212, -17.297909), (32.983599, -17.317753), (32.992384, -17.324678), (33.014656, -17.336667), (33.021633, -17.345555), (33.022459, -17.361471), (33.016258, -17.377181), (33.011651, -17.383991), (32.997448, -17.404983), (32.958174, -17.478467), (32.951663, -17.486218), (32.942981, -17.491593), (32.936573, -17.498311), (32.936676, -17.509369), (32.947218, -17.543166), (32.951663, -17.551434), (32.969129, -17.56456), (33.006646, -17.580993), (33.020392, -17.598563), (33.024526, -17.619233), (33.020599, -17.638457), (33.004063, -17.675561), (33.000238, -17.713905), (33.003184, -17.757726), (32.999102, -17.794313), (32.973573, -17.810643), (32.957037, -17.817981), (32.946082, -17.834724), (32.939674, -17.855498), (32.936883, -17.875032), (32.938433, -17.894566), (32.950267, -17.922574), (32.952128, -17.940247), (32.948149, -17.95327), (32.940397, -17.959988), (32.932439, -17.964949), (32.927375, -17.972907), (32.928977, -17.982312), (32.941224, -17.996265), (32.940294, -18.004843), (32.934919, -18.024583), (32.93709, -18.047114), (32.972282, -18.150261), (32.975537, -18.183333), (32.974865, -18.190775), (32.965925, -18.212169), (32.958174, -18.225398), (32.952283, -18.233046), (32.950525999999996, -18.241314), (32.95497, -18.256301), (32.970163, -18.277488), (33.016878, -18.313661), (33.034965, -18.332885), (33.042768, -18.352005), (33.038066, -18.363064), (33.00923, -18.383941), (32.988198, -18.41319), (32.985356, -18.412467), (32.986803, -18.422285), (32.999515, -18.436651), (33.003029, -18.446883), (32.996414, -18.46714), (32.978586, -18.48006), (32.956624, -18.489878), (32.937142, -18.50104), (32.919313, -18.510032), (32.900296, -18.515303), (32.88314, -18.522124), (32.870737, -18.535767), (32.868257, -18.552613), (32.871668, -18.57318), (32.884483, -18.609044), (32.914559, -18.665888), (32.92231, -18.693173), (32.920243, -18.726246), (32.913267, -18.753014), (32.902518, -18.774512), (32.885207, -18.787844), (32.858852, -18.790015), (32.817924, -18.787018), (32.787642, -18.791255), (32.69142, -18.83425), (32.68987, -18.843241), (32.696794, -18.897192), (32.703202, -18.911868), (32.71576, -18.919826), (32.705063, -18.927474), (32.692247, -18.934295), (32.682532, -18.942667), (32.681085, -18.954966), (32.68863, -18.97729), (32.690283, -18.988246), (32.68863, -19.000958), (32.691058, -19.01429), (32.698965, -19.022249), (32.710282, -19.025969), (32.723873, -19.026589), (32.785988, -19.017701), (32.803351, -19.019561), (32.814203, -19.023799), (32.819991, -19.028346), (32.822988, -19.035168), (32.825262, -19.046847), (32.830223, -19.059146), (32.83813, -19.066897), (32.847483, -19.073925), (32.855906, -19.083744), (32.862262, -19.118057), (32.83322, -19.241977), (32.832187, -19.266678), (32.828673, -19.284558), (32.820715, -19.301301), (32.806142, -19.323419), (32.768831, -19.363623), (32.766454, -19.373442), (32.768521, -19.402794), (32.762217, -19.443412), (32.763354, -19.463979), (32.773947, -19.475864), (32.793119, -19.476691), (32.811309, -19.474521), (32.825365, -19.479172), (32.832187, -19.500876), (32.832497000000004, -19.519273), (32.825365, -19.59162), (32.825675, -19.600818), (32.828156, -19.610636), (32.829603, -19.623659), (32.825365, -19.633271), (32.819474, -19.641952), (32.81627, -19.652081), (32.819629, -19.674302), (32.83105, -19.685154), (32.849137, -19.689081), (32.872184, -19.690218), (32.894715, -19.684327), (32.924584, -19.655285), (32.943188, -19.64929), (32.960964, -19.658799), (32.962411, -19.679056), (32.954143, -19.717813), (32.962411, -19.735383), (32.979051, -19.751403), (33.0006, -19.764322), (33.022769, -19.773107), (33.032795, -19.784166), (33.029642, -19.80339), (33.022873, -19.826851), (33.021322, -19.868088), (33.001995, -19.927), (32.998378, -20.000897), (33.004373, -20.024255), (33.007266, -20.032006), (32.95373, -20.030249), (32.940087, -20.041515), (32.934299, -20.072107), (32.926548, -20.086473), (32.910683, -20.091124), (32.894405, -20.094018), (32.88531, -20.10301), (32.877869, -20.151689), (32.872908, -20.167192), (32.859265, -20.190859), (32.857095, -20.200575), (32.858335, -20.207499), (32.865053, -20.220935), (32.86557, -20.228893), (32.858438, -20.259486), (32.852961, -20.273852), (32.845209, -20.286668), (32.800767, -20.338551), (32.735862, -20.414205), (32.704443, -20.471773), (32.671783, -20.531821), (32.646462, -20.557969), (32.603674, -20.56479), (32.556545, -20.559312), (32.513136, -20.564583), (32.481614, -20.603031), (32.471072, -20.645509), (32.469108, -20.68685), (32.483474, -20.794233), (32.49722, -20.898103), (32.491019, -20.936344), (32.467661, -20.980165), (32.417122, -21.040937), (32.339814, -21.134058), (32.345343, -21.142843), (32.359864, -21.151421), (32.368856, -21.162997), (32.373352, -21.163617), (32.377744, -21.16341), (32.380638, -21.165477), (32.380535, -21.172195), (32.376866, -21.178499), (32.37299, -21.183977), (32.37175, -21.187905), (32.444613, -21.304693), (32.445849, -21.308994), (32.447197, -21.313685), (32.408543, -21.290327), (32.37299, -21.327948), (32.324517, -21.378177), (32.272221, -21.432541), (32.219718, -21.486904), (32.167318, -21.541268), (32.114814, -21.595632), (32.062415, -21.649995), (32.010015, -21.704462), (31.957615, -21.758826), (31.905215, -21.813189), (31.852712, -21.867553), (31.800312, -21.92202), (31.747808, -21.976384), (31.695512, -22.030747), (31.643112, -22.085214), (31.590712, -22.139578), (31.538209, -22.193941), (31.485809, -22.248305), (31.433822, -22.302048), (31.36871, -22.345043), (31.288922, -22.39734), (31.265616, -22.365507), (31.255642, -22.357962), (31.24572, -22.357549), (31.229597, -22.363957), (31.221536, -22.364887), (31.213474, -22.36189), (31.197868, -22.352588), (31.190685, -22.350624), (31.183657, -22.34556), (31.163348, -22.322616), (31.152599, -22.316414), (31.137717, -22.318482), (31.10454, -22.333364), (31.097048, -22.334922), (31.087642, -22.336878), (31.07033, -22.333674), (31.036121, -22.319618), (30.927187, -22.295744), (30.867087, -22.289646), (30.83789, -22.282308), (30.805282, -22.294504), (30.693919, -22.302772), (30.674282, -22.30856), (30.647410999999998, -22.32644), (30.632424, -22.330677), (30.625551, -22.32861), (30.610307, -22.318688), (30.601108, -22.316414), (30.57217, -22.316621), (30.507367, -22.309593), (30.488454, -22.310213), (30.46923, -22.315071), (30.431713, -22.331194), (30.412696, -22.336878), (30.372078, -22.343493), (30.334975, -22.344733), (30.300765, -22.336982), (30.269346, -22.316414), (30.25529, -22.304736), (30.240407, -22.296157), (30.2217, -22.290886), (30.196999, -22.289129), (30.15266, -22.294814), (30.13509, -22.293574), (30.111113, -22.282308), (30.082587, -22.262878), (30.067911, -22.25709), (30.038145, -22.253783), (30.035872, -22.250579), (30.034528, -22.246135), (30.015511, -22.227014), (30.005279, -22.22226), (29.983782, -22.217713), (29.973963, -22.213992), (29.946678, -22.198282), (29.932105, -22.194355), (29.896035, -22.191358), (29.871489, -22.179265), (29.837331, -22.172444), (29.779246, -22.136374), (29.758886, -22.130896), (29.691448, -22.1341), (29.679614, -22.138338), (29.661424, -22.126452), (29.641064, -22.129242), (29.60396, -22.145055), (29.570164, -22.141955), (29.551043, -22.145986), (29.542517, -22.162522), (29.53182, -22.172444), (29.506912, -22.170067), (29.456889, -22.158801), (29.436115, -22.163142), (29.399528, -22.182159), (29.378031, -22.192908), (29.363250999999998, -22.192288), (29.356947, -22.190944000000002), (29.350074, -22.186707), (29.273644, -22.125108), (29.26734, -22.115807), (29.259588, -22.096066), (29.254111, -22.087074), (29.244395, -22.075706), (29.239331, -22.072605), (29.144867, -22.075292), (29.10797, -22.069194), (29.070763, -22.051004), (29.040532, -22.020929), (29.021567, -21.982791), (29.013815, -21.940417), (29.017949, -21.898145), (29.028905, -21.876648), (29.045441, -21.852567), (29.057637, -21.829209), (29.05526, -21.809985), (29.038723, -21.797893), (28.998726, -21.786008), (28.980846, -21.774845), (28.951907, -21.768334), (28.891032, -21.764924), (28.860853, -21.757379), (28.714195, -21.693507), (28.66841, -21.679968), (28.629704, -21.651339), (28.6157, -21.647101), (28.585934, -21.644414), (28.553998, -21.636559), (28.542939, -21.638316), (28.532501, -21.643071), (28.497309, -21.651546), (28.481393, -21.657437), (28.464598, -21.660331), (28.443101, -21.655783), (28.361762, -21.616302), (28.321919, -21.603486), (28.284867, -21.596872), (28.165702, -21.595218), (28.090771, -21.581266), (28.032893, -21.577855), (28.016563, -21.572894), (28.002559, -21.564212), (27.990415, -21.551913), (27.984731, -21.542922), (27.975739, -21.522561), (27.970571, -21.514396), (27.963698, -21.510469), (27.958066, -21.511502), (27.953208, -21.510469), (27.949281, -21.500754), (27.954448, -21.487835), (27.950418, -21.482047), (27.943338, -21.479876), (27.939876, -21.478016), (27.941943, -21.468508), (27.949642, -21.456519), (27.953001, -21.448664), (27.950211, -21.438329), (27.920549, -21.381174), (27.904219, -21.364741), (27.897811, -21.35544), (27.896157, -21.347895), (27.896674, -21.332392), (27.8944, -21.32433), (27.884995, -21.310171), (27.849132, -21.269657), (27.823604, -21.231726), (27.793838, -21.197413), (27.724385, -21.149664), (27.709192, -21.134471), (27.674775, -21.090133), (27.666611, -21.071219), (27.666817, -21.053753), (27.678961, -21.000733), (27.680356, -20.979649), (27.672657, -20.923528), (27.672605, -20.913709), (27.675085, -20.891282), (27.674775, -20.879913), (27.676016, -20.866684), (27.681803, -20.857589), (27.689038, -20.849011), (27.694412, -20.837744999999998), (27.709605, -20.756716), (27.707332, -20.716719), (27.682475, -20.637344), (27.690382, -20.60148), (27.702629, -20.566134), (27.705575, -20.526653), (27.698133, -20.509083), (27.683767, -20.49606), (27.66599, -20.489136), (27.625786, -20.488619), (27.590853, -20.473323), (27.534112, -20.483038), (27.45391, -20.473323), (27.340739, -20.473013), (27.306012, -20.477354), (27.268392, -20.49575), (27.283998, -20.35147), (27.266015, -20.234164), (27.214907, -20.110451), (27.201781, -20.092984), (27.183746, -20.082339), (27.16292, -20.076551), (27.141888, -20.073347), (27.129692, -20.072934), (27.119771, -20.073864), (27.109642, -20.073244), (27.097343, -20.068903), (27.086491, -20.060532), (27.069231, -20.03738), (27.060136, -20.027562), (27.02665, -20.010095), (26.9943, -20.006788), (26.961072, -20.007201), (26.925054, -20.000897), (26.811882, -19.94643), (26.774469, -19.939815), (26.750801, -19.939609), (26.730957, -19.935888), (26.713904, -19.927413), (26.698608, -19.91253), (26.684758, -19.894547), (26.67717, -19.886815), (26.673803, -19.883385), (26.659437, -19.875737), (26.614065, -19.863438), (26.595565, -19.855583), (26.581922, -19.842147), (26.574791, -19.819513), (26.566316, -19.800806), (26.549263, -19.784063), (26.508852, -19.759258), (26.489731, -19.75192), (26.450251, -19.743342), (26.431854, -19.73652), (26.412837, -19.71957), (26.385242, -19.679056), (26.362711, -19.667584), (26.332325, -19.662416), (26.324367, -19.659109), (26.312171, -19.651358), (26.312481, -19.649601), (26.319096, -19.646293), (26.326331, -19.633891), (26.333462, -19.613014), (26.330981, -19.604952), (26.32106, -19.592033), (26.313205, -19.584178), (26.30349, -19.577254), (26.292638, -19.572499), (26.239101, -19.571466), (26.194452, -19.560200000000002), (26.155488, -19.537153), (26.13027, -19.501082), (26.034359, -19.243734), (26.011414, -19.199809), (25.981132, -19.161775), (25.956534, -19.122088), (25.948576, -19.103277), (25.944855, -19.079196), (25.948059, -19.058732), (25.964389, -19.021629), (25.9678, -19.000958), (25.967449, -18.999925), (25.940721, -18.921273), (25.815251, -18.813993), (25.779491, -18.738752), (25.773393, -18.665578), (25.761921, -18.630335), (25.736909, -18.608734), (25.698255, -18.590234), (25.669523, -18.566049), (25.622084, -18.501143), (25.608442, -18.487708), (25.574439, -18.465693), (25.508499, -18.399134), (25.49558, -18.378877), (25.490516, -18.365545), (25.481163, -18.323377), (25.473204, -18.303429), (25.440855, -18.2532), (25.408816, -18.175995), (25.387525, -18.138995), (25.357449, -18.115844), (25.323446, -18.09662), (25.296368, -18.068612), (25.255026, -18.001122), (25.226088, -17.931876), (25.21937, -17.908001), (25.21937, -17.879786), (25.259781, -17.794107), (25.266705, -17.800928), (25.285412, -17.809299), (25.315901, -17.83214), (25.335538, -17.841235), (25.345254, -17.842579), (25.376466, -17.841235), (25.409539, -17.853018), (25.420288, -17.854878), (25.49558, -17.854878), (25.500748, -17.856015), (25.510153, -17.861183), (25.516458, -17.862319), (25.522142, -17.860149), (25.530927, -17.850951), (25.536818, -17.848677), (25.603997, -17.836171), (25.657017, -17.81395), (25.681409, -17.81147), (25.694224, -17.819428), (25.70642, -17.829867), (25.743834, -17.839375), (25.765951, -17.849814), (25.786002, -17.862216), (25.794683, -17.872655), (25.804399, -17.888158), (25.849667, -17.906658), (25.86362, -17.923814), (25.847497, -17.929395), (25.846153, -17.943658), (25.853490999999998, -17.959988), (25.86362, -17.971563), (25.924495, -17.998952), (25.966973, -18.000502), (25.978548, -17.998952), (26.033739, -17.971563), (26.04056, -17.978488), (26.046554, -17.966292), (26.062471, -17.962882), (26.081178, -17.962365), (26.095234, -17.958541), (26.096164, -17.954614), (26.0942, -17.941901), (26.095234, -17.938077), (26.101228, -17.935803), (26.118591, -17.931566), (26.135438, -17.922574), (26.158589, -17.918337), (26.167477, -17.913582), (26.203031, -17.887227), (26.211919, -17.882783), (26.221117, -17.886297), (26.228249, -17.894669), (26.233933, -17.903971), (26.239204, -17.910172), (26.248299, -17.913376), (26.294291, -17.918543), (26.3038, -17.922781), (26.311965, -17.928362), (26.318269, -17.934356), (26.325504, -17.93601), (26.362711, -17.930636), (26.408599, -17.939007), (26.485494, -17.979315), (26.527145, -17.992027), (26.553604, -17.996471), (26.570243, -18.002879), (26.583369, -18.013215), (26.598872, -18.029958), (26.612721, -18.041223), (26.628844, -18.049181), (26.685689, -18.066751), (26.700003, -18.069232), (26.71194, -18.065821), (26.740569, -18.0405), (26.753591, -18.032955), (26.769714, -18.029028), (26.794002, -18.026237), (26.88826, -17.984586), (26.912031, -17.992027), (26.94867, -17.968876), (26.95916, -17.964742), (27.006289, -17.962675), (27.021275, -17.958541), (27.048457, -17.944278), (27.078171, -17.916993), (27.11543, -17.882163), (27.149019, -17.842476), (27.146539, -17.818911), (27.145299, -17.794107), (27.146952, -17.783875), (27.157081, -17.769302), (27.422078, -17.504822), (27.524294, -17.415112), (27.577314, -17.363125), (27.604495, -17.312792), (27.624856, -17.233314), (27.641186, -17.198484), (27.777301, -17.001183), (27.816886, -16.959636), (27.868562, -16.929663), (28.022993, -16.865393), (28.113922, -16.827551), (28.21252, -16.748589), (28.280113, -16.706524), (28.643295, -16.568755), (28.690734, -16.56028), (28.718794, -16.56028), (28.73285, -16.55811), (28.741377, -16.550668), (28.761117, -16.532271), (28.769282, -16.515218), (28.808866, -16.486279), (28.822509, -16.470776), (28.829124, -16.434603), (28.833051, -16.426438), (28.857236, -16.388198), (28.857029, -16.36546), (28.840492, -16.323602), (28.836772, -16.306342), (28.840286, -16.284741), (28.86416, -16.231205), (28.847107, -16.202679), (28.852481, -16.162785), (28.8654, -16.121237), (28.870981, -16.087234), (28.868501, -16.08217), (28.86385, -16.076589), (28.859303, -16.069561), (28.857236, -16.060466), (28.860336, -16.049407), (28.874082, -16.028943), (28.877183, -16.022018), (28.898887, -15.995457), (28.932373, -15.963727), (28.946862, -15.957235), (28.951287, -15.955252), (28.972784, -15.951428), (29.018053, -15.950602), (29.042341, -15.946261), (29.055053, -15.934375), (29.076344, -15.895411), (29.086162, -15.884559), (29.102182, -15.870916), (29.121716, -15.859341), (29.141869, -15.854483), (29.150964, -15.848799), (29.186311, -15.812832), (29.406969, -15.714233), (29.422059, -15.711030000000001), (29.508462, -15.703588), (29.526239, -15.692839), (29.563446, -15.662144), (29.587217, -15.655736), (29.608559, -15.658422999999999), (29.62799, -15.663591), (29.648505, -15.666588), (29.672793, -15.663281), (29.73005, -15.644677), (29.773252, -15.638062), (29.814283, -15.619666), (29.837331, -15.614808), (29.881773, -15.618839), (29.967504, -15.641473), (30.010654, -15.646227)]), 6)
0.45539

Input parameters

Returned value

polygonsIntersectionCartesian

Calculates the intersection of polygons.

Example

SELECT wkt(polygonsIntersectionCartesian([[[(0., 0.), (0., 3.), (1., 2.9), (2., 2.6), (2.6, 2.), (2.9, 1.), (3., 0.), (0., 0.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,2 2.6,2.6 2,2.9 1,1 1,1 2.9)))

Input parameters

Polygons

Returned value

MultiPolygon

polygonAreaCartesian

Calculates the area of a polygon

Example

SELECT polygonAreaCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.)]]])
25

Input parameters

Polygon

Returned value

Float64

polygonPerimeterCartesian

Calculates the perimeter of a polygon.

Example

SELECT polygonPerimeterCartesian([[[(0., 0.), (0., 5.), (5., 5.), (5., 0.)]]])
15

Input parameters

Polygon

Returned value

Float64

polygonsUnionCartesian

Calculates the union of polygons.

Example

SELECT wkt(polygonsUnionCartesian([[[(0., 0.), (0., 3.), (1., 2.9), (2., 2.6), (2.6, 2.), (2.9, 1), (3., 0.), (0., 0.)]]], [[[(1., 1.), (1., 4.), (4., 4.), (4., 1.), (1., 1.)]]]))
MULTIPOLYGON(((1 2.9,1 4,4 4,4 1,2.9 1,3 0,0 0,0 3,1 2.9)))

Input parameters

Polygons

Returned value

MultiPolygon

S2Index

S2 is a geographical indexing system where all geographical data is represented on a three-dimensional sphere (similar to a globe).

In the S2 library points are represented as the S2 Index - a specific number which encodes internally a point on the surface of a unit sphere, unlike traditional (latitude, longitude) pairs. To get the S2 point index for a given point specified in the format (latitude, longitude) use the geoToS2 function. Also, you can use the s2ToGeo function for getting geographical coordinates corresponding to the specified S2 point index.

geoToS2

Returns S2 point index corresponding to the provided coordinates (longitude, latitude).

Syntax

geoToS2(lon, lat)

Arguments

  • lon: Longitude. Float64.
  • lat: Latitude. Float64.

Returned values

  • S2 point index. UInt64.

Example

Query:

SELECT geoToS2(37.79506683, 55.71290588) AS s2Index

Result:

┌─────────────s2Index─┐
│ 4704772434919038107 │
└─────────────────────┘

s2ToGeo

Returns geo coordinates (longitude, latitude) corresponding to the provided S2 point index.

Syntax

s2ToGeo(s2index)

Arguments

  • s2index: S2 Index. UInt64.

Returned values

  • A tuple consisting of two values:
    • lon. Float64.
    • lat. Float64.

Example

Query:

SELECT s2ToGeo(4704772434919038107) AS s2Coodrinates

Result:

┌─s2Coodrinates────────────────────────┐
│ (37.79506681471008,55.7129059052841) │
└──────────────────────────────────────┘

s2GetNeighbors

Returns S2 neighbor indexes corresponding to the provided S2. Each cell in the S2 system is a quadrilateral bounded by four geodesics. So, each cell has 4 neighbors.

Syntax

s2GetNeighbors(s2index)

Arguments

  • s2index: S2 Index. UInt64.

Returned value

  • An array consisting of 4 neighbor indexes: array[s2index1, s2index3, s2index2, s2index4]. Array(UInt64).

Example

Query:

SELECT s2GetNeighbors(5074766849661468672) AS s2Neighbors

Result:

┌─s2Neighbors───────────────────────────────────────────────────────────────────────┐
│ [5074766987100422144,5074766712222515200,5074767536856236032,5074767261978329088] │
└───────────────────────────────────────────────────────────────────────────────────┘

s2CellsIntersect

Determines if the two provided S2 cells intersect or not.

Syntax

s2CellsIntersect(s2index1, s2index2)

Arguments

  • siIndex1, s2index2: S2 Index. UInt64.

Returned value

  • 1: If the cells intersect. UInt8.
  • 0: If the cells don't intersect. UInt8.

Example

Query:

SELECT s2CellsIntersect(9926595209846587392, 9926594385212866560) AS intersect

Result:

┌─intersect─┐
│         1 │
└───────────┘

s2CapContains

Determines if a cap contains a S2 point. A cap represents a part of the sphere that has been cut off by a plane. It is defined by a point on a sphere and a radius in degrees.

Syntax

s2CapContains(center, degrees, point)

Arguments

  • center: S2 point index corresponding to the cap. UInt64.
  • degrees: Radius of the cap in degrees. Float64.
  • point: S2 point index. UInt64.

Returned value

  • 1: If the cap contains the S2 point index. UInt8.
  • 0: If the cap doesn't contain the S2 point index. UInt8.

Example

Query:

SELECT s2CapContains(1157339245694594829, 1.0, 1157347770437378819) AS capContains

Result:

┌─capContains─┐
│           1 │
└─────────────┘

s2CapUnion

Determines the smallest cap that contains the given two input caps. A cap represents a portion of the sphere that has been cut off by a plane. It is defined by a point on a sphere and a radius in degrees.

Syntax

s2CapUnion(center1, radius1, center2, radius2)

Arguments

  • center1, center2: S2 point indexes corresponding to the two input caps. UInt64.
  • radius1, radius2: Radius of the two input caps in degrees. Float64.

Returned values

  • center: S2 point index corresponding the center of the smallest cap containing the two input caps. UInt64.
  • radius: Radius of the smallest cap containing the two input caps. Float64.

Example

Query:

SELECT s2CapUnion(3814912406305146967, 1.0, 1157347770437378819, 1.0) AS capUnion

Result:

┌─capUnion───────────────────────────────┐
│ (4534655147792050737,60.2088283994957) │
└────────────────────────────────────────┘

s2RectAdd

Increases the size of the bounding rectangle to include the given S2 point. In the S2 system, a rectangle is represented by a type of S2Region called a S2LatLngRect that represents a rectangle in latitude-longitude space.

Syntax

s2RectAdd(s2pointLow, s2pointHigh, s2Point)

Arguments

  • s2PointLow: Low S2 point index corresponding to the rectangle. UInt64.
  • s2PointHigh: High S2 point index corresponding to the rectangle. UInt64.
  • s2Point: Target S2 point index that the bound rectangle should be grown to include. UInt64.

Returned values

  • s2PointLow: Low S2 cell id corresponding to the grown rectangle. UInt64.
  • s2PointHigh: Height S2 cell id corresponding to the grown rectangle. UInt64.

Example

Query:

SELECT s2RectAdd(5178914411069187297, 5177056748191934217, 5179056748191934217) AS rectAdd

Result:

┌─rectAdd───────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘

s2RectContains

Determines if a given rectangle contains a S2 point. In the S2 system, a rectangle is represented by a type of S2Region called a S2LatLngRect that represents a rectangle in latitude-longitude space.

Syntax

s2RectContains(s2PointLow, s2PointHi, s2Point)

Arguments

  • s2PointLow: Low S2 point index corresponding to the rectangle. UInt64.
  • s2PointHigh: High S2 point index corresponding to the rectangle. UInt64.
  • s2Point: Target S2 point index. UInt64.

Returned value

  • 1: If the rectangle contains the given S2 point.
  • 0: If the rectangle doesn't contain the given S2 point.

Example

Query:

SELECT s2RectContains(5179062030687166815, 5177056748191934217, 5177914411069187297) AS rectContains

Result:

┌─rectContains─┐
│            0 │
└──────────────┘

s2RectUnion

Returns the smallest rectangle containing the union of this rectangle and the given rectangle. In the S2 system, a rectangle is represented by a type of S2Region called a S2LatLngRect that represents a rectangle in latitude-longitude space.

Syntax

s2RectUnion(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

Arguments

  • s2Rect1PointLow, s2Rect1PointHi: Low and High S2 point indexes corresponding to the first rectangle. UInt64.
  • s2Rect2PointLow, s2Rect2PointHi: Low and High S2 point indexes corresponding to the second rectangle. UInt64.

Returned values

  • s2UnionRect2PointLow: Low S2 cell id corresponding to the union rectangle. UInt64.
  • s2UnionRect2PointHi: High S2 cell id corresponding to the union rectangle. UInt64.

Example

Query:

SELECT s2RectUnion(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectUnion

Result:

┌─rectUnion─────────────────────────────────┐
│ (5179062030687166815,5177056748191934217) │
└───────────────────────────────────────────┘

s2RectIntersection

Returns the smallest rectangle containing the intersection of this rectangle and the given rectangle. In the S2 system, a rectangle is represented by a type of S2Region called a S2LatLngRect that represents a rectangle in latitude-longitude space.

Syntax

s2RectIntersection(s2Rect1PointLow, s2Rect1PointHi, s2Rect2PointLow, s2Rect2PointHi)

Arguments

  • s2Rect1PointLow, s2Rect1PointHi: Low and High S2 point indexes corresponding to the first rectangle. UInt64.
  • s2Rect2PointLow, s2Rect2PointHi: Low and High S2 point indexes corresponding to the second rectangle. UInt64.

Returned values

  • s2UnionRect2PointLow: Low S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. UInt64.
  • s2UnionRect2PointHi: High S2 cell id corresponding to the rectangle containing the intersection of the given rectangles. UInt64.

Example

Query:

SELECT s2RectIntersection(5178914411069187297, 5177056748191934217, 5179062030687166815, 5177056748191934217) AS rectIntersection

Result:

┌─rectIntersection──────────────────────────┐
│ (5178914411069187297,5177056748191934217) │
└───────────────────────────────────────────┘

Svg

Returns a string of select SVG element tags from Geo data.

Syntax

Svg(geometry,[style])

Aliases: SVG, svg

### Parameters

  • geometry: Geo data. Geo.
  • style: Optional style name. String.

Returned value

  • The SVG representation of the geometry. String.
    • SVG circle
    • SVG polygon
    • SVG path

Examples

Circle

Query:

SELECT SVG((0., 0.))

Result:

<circle cx="0" cy="0" r="5" style=""/>

Polygon

Query:

SELECT SVG([(0., 0.), (10, 0), (10, 10), (0, 10)])

Result:

<polygon points="0,0 0,10 10,10 10,0 0,0" style=""/>

Path

Query:

SELECT SVG([[(0., 0.), (10, 0), (10, 10), (0, 10)], [(4., 4.), (5, 4), (5, 5), (4, 5)]])

Result:

<g fill-rule="evenodd"><path d="M 0,0 L 0,10 L 10,10 L 10,0 L 0,0M 4,4 L 5,4 L 5,5 L 4,5 L 4,4 z " style=""/></g>
Was this page helpful?
Updated