Nemo's Parental Misguidance

    h3-js
    TypeScript icon, indicating that this package has built-in type declarations

    3.7.2 • Public • Published

    H3 Logo

    h3-js

    H3 Version Build Status Coverage Status

    The h3-js library provides a pure-JavaScript version of the H3 Core Library, a hexagon-based geographic grid system. It can be used either in Node >= 6 or in the browser. The core library is transpiled from C using emscripten, offering full parity with the C API and highly efficient operations.

    For more information on H3 and for the full API documentation, please see the H3 Documentation.

    Install

    npm install h3-js
    

    Usage

    The library uses ES6 modules. Bundles for Node and the browser are built to the dist folder.

    Import

    ES6 usage:

    import {h3ToGeo} from "h3-js";

    CommonJS usage:

    const h3 = require("h3-js");

    Pre-bundled script (library is available as an h3 global):

    <script src="https://unpkg.com/h3-js"></script>

    Core functions

    // Convert a lat/lng point to a hexagon index at resolution 7
    const h3Index = h3.geoToH3(37.3615593, -122.0553238, 7);
    // -> '87283472bffffff'
    
    // Get the center of the hexagon
    const hexCenterCoordinates = h3.h3ToGeo(h3Index);
    // -> [37.35171820183272, -122.05032565263946]
    
    // Get the vertices of the hexagon
    const hexBoundary = h3.h3ToGeoBoundary(h3Index);
    // -> [ [37.341099093235684, -122.04156135164334 ], ...]

    Useful algorithms

    // Get all neighbors within 1 step of the hexagon
    const kRing = h3.kRing(h3Index, 1);
    // -> ['87283472bffffff', '87283472affffff', ...]
    
    // Get the set of hexagons within a polygon
    const polygon = [
        [37.813318999983238, -122.4089866999972145],
        [37.7198061999978478, -122.3544736999993603],
        [37.8151571999998453, -122.4798767000009008]
    ];
    const hexagons = h3.polyfill(polygon, 7);
    // -> ['872830828ffffff', '87283082effffff', ...]
    
    // Get the outline of a set of hexagons, as a GeoJSON-style MultiPolygon
    const coordinates = h3.h3SetToMultiPolygon(hexagons, true);
    // -> [[[
    //      [-122.37681938644465, 37.76546768434345],
    //      [-122.3856345540363,37.776004200673846],
    //      ...
    //    ]]]

    API Reference

    h3


    h3.h3IsValid(h3Index) ⇒ boolean

    Whether a given string represents a valid H3 index

    Returns: boolean - Whether the index is valid

    Param Type Description
    h3Index H3IndexInput H3 index to check

    h3.h3IsPentagon(h3Index) ⇒ boolean

    Whether the given H3 index is a pentagon

    Returns: boolean - isPentagon

    Param Type Description
    h3Index H3IndexInput H3 index to check

    h3.h3IsResClassIII(h3Index) ⇒ boolean

    Whether the given H3 index is in a Class III resolution (rotated versus the icosahedron and subject to shape distortion adding extra points on icosahedron edges, making them not true hexagons).

    Returns: boolean - isResClassIII

    Param Type Description
    h3Index H3IndexInput H3 index to check

    h3.h3GetBaseCell(h3Index) ⇒ number

    Get the number of the base cell for a given H3 index

    Returns: number - Index of the base cell (0-121)

    Param Type Description
    h3Index H3IndexInput H3 index to get the base cell for

    h3.h3GetFaces(h3Index) ⇒ Array.<number>

    Get the indices of all icosahedron faces intersected by a given H3 index

    Returns: Array.<number> - Indices (0-19) of all intersected faces

    Param Type Description
    h3Index H3IndexInput H3 index to get faces for

    h3.h3GetResolution(h3Index) ⇒ number

    Returns the resolution of an H3 index

    Returns: number - The number (0-15) resolution, or -1 if invalid

    Param Type Description
    h3Index H3IndexInput H3 index to get resolution

    h3.geoToH3(lat, lng, res) ⇒ H3Index

    Get the hexagon containing a lat,lon point

    Returns: H3Index - H3 index

    Param Type Description
    lat number Latitude of point
    lng number Longtitude of point
    res number Resolution of hexagons to return

    h3.h3ToGeo(h3Index) ⇒ Array.<number>

    Get the lat,lon center of a given hexagon

    Returns: Array.<number> - Point as a [lat, lng] pair

    Param Type Description
    h3Index H3IndexInput H3 index

    h3.h3ToGeoBoundary(h3Index, [formatAsGeoJson]) ⇒ Array.<Array.<number>>

    Get the vertices of a given hexagon (or pentagon), as an array of [lat, lng] points. For pentagons and hexagons on the edge of an icosahedron face, this function may return up to 10 vertices.

    Returns: Array.<Array.<number>> - Array of [lat, lng] pairs

    Param Type Description
    h3Index H3Index H3 index
    [formatAsGeoJson] boolean Whether to provide GeoJSON output: [lng, lat], closed loops

    h3.h3ToParent(h3Index, res) ⇒ H3Index

    Get the parent of the given hexagon at a particular resolution

    Returns: H3Index - H3 index of parent, or null for invalid input

    Param Type Description
    h3Index H3IndexInput H3 index to get parent for
    res number Resolution of hexagon to return

    h3.h3ToChildren(h3Index, res) ⇒ Array.<H3Index>

    Get the children/descendents of the given hexagon at a particular resolution

    Returns: Array.<H3Index> - H3 indexes of children, or empty array for invalid input

    Param Type Description
    h3Index H3IndexInput H3 index to get children for
    res number Resolution of hexagons to return

    h3.h3ToCenterChild(h3Index, res) ⇒ H3Index

    Get the center child of the given hexagon at a particular resolution

    Returns: H3Index - H3 index of child, or null for invalid input

    Param Type Description
    h3Index H3IndexInput H3 index to get center child for
    res number Resolution of hexagon to return

    h3.kRing(h3Index, ringSize) ⇒ Array.<H3Index>

    Get all hexagons in a k-ring around a given center. The order of the hexagons is undefined.

    Returns: Array.<H3Index> - H3 indexes for all hexagons in ring

    Param Type Description
    h3Index H3IndexInput H3 index of center hexagon
    ringSize number Radius of k-ring

    h3.kRingDistances(h3Index, ringSize) ⇒ Array.<Array.<H3Index>>

    Get all hexagons in a k-ring around a given center, in an array of arrays ordered by distance from the origin. The order of the hexagons within each ring is undefined.

    Returns: Array.<Array.<H3Index>> - Array of arrays with H3 indexes for all hexagons each ring

    Param Type Description
    h3Index H3IndexInput H3 index of center hexagon
    ringSize number Radius of k-ring

    h3.hexRing(h3Index, ringSize) ⇒ Array.<H3Index>

    Get all hexagons in a hollow hexagonal ring centered at origin with sides of a given length. Unlike kRing, this function will throw an error if there is a pentagon anywhere in the ring.

    Returns: Array.<H3Index> - H3 indexes for all hexagons in ring
    Throws:

    • Error If the algorithm could not calculate the ring
    Param Type Description
    h3Index H3IndexInput H3 index of center hexagon
    ringSize number Radius of ring

    h3.polyfill(coordinates, res, [isGeoJson]) ⇒ Array.<H3Index>

    Get all hexagons with centers contained in a given polygon. The polygon is specified with GeoJson semantics as an array of loops. Each loop is an array of [lat, lng] pairs (or [lng, lat] if isGeoJson is specified). The first loop is the perimeter of the polygon, and subsequent loops are expected to be holes.

    Returns: Array.<H3Index> - H3 indexes for all hexagons in polygon

    Param Type Description
    coordinates Array.<Array.<number>> | Array.<Array.<Array.<number>>> Array of loops, or a single loop
    res number Resolution of hexagons to return
    [isGeoJson] boolean Whether to expect GeoJson-style [lng, lat] pairs instead of [lat, lng]

    h3.h3SetToMultiPolygon(h3Indexes, [formatAsGeoJson]) ⇒ Array.<Array.<Array.<Array.<number>>>>

    Get the outlines of a set of H3 hexagons, returned in GeoJSON MultiPolygon format (an array of polygons, each with an array of loops, each an array of coordinates). Coordinates are returned as [lat, lng] pairs unless GeoJSON is requested.

    It is the responsibility of the caller to ensure that all hexagons in the set have the same resolution and that the set contains no duplicates. Behavior is undefined if duplicates or multiple resolutions are present, and the algorithm may produce unexpected or invalid polygons.

    Returns: Array.<Array.<Array.<Array.<number>>>> - MultiPolygon-style output.

    Param Type Description
    h3Indexes Array.<H3IndexInput> H3 indexes to get outlines for
    [formatAsGeoJson] boolean Whether to provide GeoJSON output: [lng, lat], closed loops

    h3.compact(h3Set) ⇒ Array.<H3Index>

    Compact a set of hexagons of the same resolution into a set of hexagons across multiple levels that represents the same area.

    Returns: Array.<H3Index> - Compacted H3 indexes
    Throws:

    • Error If the input is invalid (e.g. duplicate hexagons)
    Param Type Description
    h3Set Array.<H3IndexInput> H3 indexes to compact

    h3.uncompact(compactedSet, res) ⇒ Array.<H3Index>

    Uncompact a compacted set of hexagons to hexagons of the same resolution

    Returns: Array.<H3Index> - The uncompacted H3 indexes
    Throws:

    • Error If the input is invalid (e.g. invalid resolution)
    Param Type Description
    compactedSet Array.<H3IndexInput> H3 indexes to uncompact
    res number The resolution to uncompact to

    h3.h3IndexesAreNeighbors(origin, destination) ⇒ boolean

    Whether two H3 indexes are neighbors (share an edge)

    Returns: boolean - Whether the hexagons share an edge

    Param Type Description
    origin H3IndexInput Origin hexagon index
    destination H3IndexInput Destination hexagon index

    h3.getH3UnidirectionalEdge(origin, destination) ⇒ H3Index

    Get an H3 index representing a unidirectional edge for a given origin and destination

    Returns: H3Index - H3 index of the edge, or null if no edge is shared

    Param Type Description
    origin H3IndexInput Origin hexagon index
    destination H3IndexInput Destination hexagon index

    h3.getOriginH3IndexFromUnidirectionalEdge(edgeIndex) ⇒ H3Index

    Get the origin hexagon from an H3 index representing a unidirectional edge

    Returns: H3Index - H3 index of the edge origin

    Param Type Description
    edgeIndex H3IndexInput H3 index of the edge

    h3.getDestinationH3IndexFromUnidirectionalEdge(edgeIndex) ⇒ H3Index

    Get the destination hexagon from an H3 index representing a unidirectional edge

    Returns: H3Index - H3 index of the edge destination

    Param Type Description
    edgeIndex H3IndexInput H3 index of the edge

    h3.h3UnidirectionalEdgeIsValid(edgeIndex) ⇒ boolean

    Whether the input is a valid unidirectional edge

    Returns: boolean - Whether the index is valid

    Param Type Description
    edgeIndex H3IndexInput H3 index of the edge

    h3.getH3IndexesFromUnidirectionalEdge(edgeIndex) ⇒ Array.<H3Index>

    Get the [origin, destination] pair represented by a unidirectional edge

    Returns: Array.<H3Index> - [origin, destination] pair as H3 indexes

    Param Type Description
    edgeIndex H3IndexInput H3 index of the edge

    h3.getH3UnidirectionalEdgesFromHexagon(h3Index) ⇒ Array.<H3Index>

    Get all of the unidirectional edges with the given H3 index as the origin (i.e. an edge to every neighbor)

    Returns: Array.<H3Index> - List of unidirectional edges

    Param Type Description
    h3Index H3IndexInput H3 index of the origin hexagon

    h3.getH3UnidirectionalEdgeBoundary(edgeIndex, [formatAsGeoJson]) ⇒ Array.<Array.<number>>

    Get the vertices of a given edge as an array of [lat, lng] points. Note that for edges that cross the edge of an icosahedron face, this may return 3 coordinates.

    Returns: Array.<Array.<number>> - Array of geo coordinate pairs

    Param Type Description
    edgeIndex H3IndexInput H3 index of the edge
    [formatAsGeoJson] boolean Whether to provide GeoJSON output: [lng, lat]

    h3.h3Distance(origin, destination) ⇒ number

    Get the grid distance between two hex indexes. This function may fail to find the distance between two indexes if they are very far apart or on opposite sides of a pentagon.

    Returns: number - Distance between hexagons, or a negative number if the distance could not be computed

    Param Type Description
    origin H3IndexInput Origin hexagon index
    destination H3IndexInput Destination hexagon index

    h3.h3Line(origin, destination) ⇒ Array.<H3Index>

    Given two H3 indexes, return the line of indexes between them (inclusive).

    This function may fail to find the line between two indexes, for example if they are very far apart. It may also fail when finding distances for indexes on opposite sides of a pentagon.

    Notes:

    • The specific output of this function should not be considered stable across library versions. The only guarantees the library provides are that the line length will be h3Distance(start, end) + 1 and that every index in the line will be a neighbor of the preceding index.
    • Lines are drawn in grid space, and may not correspond exactly to either Cartesian lines or great arcs.

    Returns: Array.<H3Index> - H3 indexes connecting origin and destination
    Throws:

    • Error If the line cannot be calculated
    Param Type Description
    origin H3IndexInput Origin hexagon index
    destination H3IndexInput Destination hexagon index

    h3.experimentalH3ToLocalIj(origin, destination) ⇒ CoordIJ

    Produces IJ coordinates for an H3 index anchored by an origin.

    • The coordinate space used by this function may have deleted regions or warping due to pentagonal distortion.
    • Coordinates are only comparable if they come from the same origin index.
    • Failure may occur if the index is too far away from the origin or if the index is on the other side of a pentagon.
    • This function is experimental, and its output is not guaranteed to be compatible across different versions of H3.

    Returns: CoordIJ - Coordinates as an {i, j} pair
    Throws:

    • Error If the IJ coordinates cannot be calculated
    Param Type Description
    origin H3IndexInput Origin H3 index
    destination H3IndexInput H3 index for which to find relative coordinates

    h3.experimentalLocalIjToH3(origin, coords) ⇒ H3Index

    Produces an H3 index for IJ coordinates anchored by an origin.

    • The coordinate space used by this function may have deleted regions or warping due to pentagonal distortion.
    • Coordinates are only comparable if they come from the same origin index.
    • Failure may occur if the index is too far away from the origin or if the index is on the other side of a pentagon.
    • This function is experimental, and its output is not guaranteed to be compatible across different versions of H3.

    Returns: H3Index - H3 index at the relative coordinates
    Throws:

    • Error If the H3 index cannot be calculated
    Param Type Description
    origin H3IndexInput Origin H3 index
    coords CoordIJ Coordinates as an {i, j} pair

    h3.pointDist(latlng1, latlng2, unit) ⇒ number

    Great circle distance between two geo points. This is not specific to H3, but is implemented in the library and provided here as a convenience.

    Returns: number - Great circle distance
    Throws:

    • Error If the unit is invalid
    Param Type Description
    latlng1 Array.<number> Origin coordinate as [lat, lng]
    latlng2 Array.<number> Destination coordinate as [lat, lng]
    unit string Distance unit (either UNITS.m or UNITS.km)

    h3.cellArea(h3Index, unit) ⇒ number

    Exact area of a given cell

    Returns: number - Cell area
    Throws:

    • Error If the unit is invalid
    Param Type Description
    h3Index H3Index H3 index of the hexagon to measure
    unit string Distance unit (either UNITS.m2 or UNITS.km2)

    h3.exactEdgeLength(edge, unit) ⇒ number

    Exact length of a given unidirectional edge

    Returns: number - Cell area
    Throws:

    • Error If the unit is invalid
    Param Type Description
    edge H3Index H3 index of the edge to measure
    unit string Distance unit (either UNITS.m, UNITS.km, or UNITS.rads)

    h3.hexArea(res, unit) ⇒ number

    Average hexagon area at a given resolution

    Returns: number - Average area
    Throws:

    • Error If the unit is invalid
    Param Type Description
    res number Hexagon resolution
    unit string Area unit (either UNITS.m2, UNITS.km2, or UNITS.rads2)

    h3.edgeLength(res, unit) ⇒ number

    Average hexagon edge length at a given resolution

    Returns: number - Average edge length
    Throws:

    • Error If the unit is invalid
    Param Type Description
    res number Hexagon resolution
    unit string Distance unit (either UNITS.m, UNITS.km, or UNITS.rads)

    h3.numHexagons(res) ⇒ number

    The total count of hexagons in the world at a given resolution. Note that above resolution 8 the exact count cannot be represented in a JavaScript 32-bit number, so consumers should use caution when applying further operations to the output.

    Returns: number - Count

    Param Type Description
    res number Hexagon resolution

    h3.getRes0Indexes() ⇒ Array.<H3Index>

    Get all H3 indexes at resolution 0. As every index at every resolution > 0 is the descendant of a res 0 index, this can be used with h3ToChildren to iterate over H3 indexes at any resolution.

    Returns: Array.<H3Index> - All H3 indexes at res 0


    h3.getPentagonIndexes(res) ⇒ Array.<H3Index>

    Get the twelve pentagon indexes at a given resolution.

    Returns: Array.<H3Index> - All H3 pentagon indexes at res

    Param Type Description
    res number Hexagon resolution

    h3.degsToRads(deg) ⇒ number

    Convert degrees to radians

    Returns: number - Value in radians

    Param Type Description
    deg number Value in degrees

    h3.radsToDegs(rad) ⇒ number

    Convert radians to degrees

    Returns: number - Value in degrees

    Param Type Description
    rad number Value in radians

    h3.H3Index : string

    64-bit hexidecimal string representation of an H3 index


    h3.H3IndexInput : string | Array.<number>

    64-bit hexidecimal string representation of an H3 index, or two 32-bit integers in little endian order in an array.


    h3.CoordIJ : Object

    Coordinates as an {i, j} pair

    Properties

    Name Type
    i number
    j number

    h3.UNITS : Object

    Length/Area units

    Properties

    Name Type
    m string
    m2 string
    km string
    km2 string
    rads string
    rads2 string

    Development

    The h3-js library uses yarn as the preferred package manager. To install the dev dependencies, just run:

    yarn
    

    To lint the code:

    yarn lint
    

    To run the tests:

    yarn test
    

    Code must be formatted with prettier; unformatted code will fail the build. To format all files:

    yarn prettier
    

    Benchmarks

    The h3-js library includes a basic benchmark suite using Benchmark.js. Because many of the functions may be called over thousands of hexagons in a "hot loop", performance is an important concern. Benchmarks are run against the transpiled ES5 code by default.

    To run the benchmarks in Node:

    yarn benchmark-node
    

    To run the benchmarks in a browser:

    yarn benchmark-browser
    

    Sample Node output (Macbook Pro running Node 6):

    h3IsValid x 3,725,046 ops/sec ±0.47% (90 runs sampled)
    geoToH3 x 227,458 ops/sec ±0.84% (89 runs sampled)
    h3ToGeo x 843,167 ops/sec ±0.96% (87 runs sampled)
    h3ToGeoBoundary x 220,797 ops/sec ±2.56% (86 runs sampled)
    kRing x 144,955 ops/sec ±3.06% (85 runs sampled)
    polyfill x 9,291 ops/sec ±1.12% (88 runs sampled)
    h3SetToMultiPolygon x 311 ops/sec ±1.56% (82 runs sampled)
    compact x 1,336 ops/sec ±4.51% (86 runs sampled)
    uncompact x 574 ops/sec ±0.91% (85 runs sampled)
    h3IndexesAreNeighbors x 670,031 ops/sec ±1.36% (88 runs sampled)
    getH3UnidirectionalEdge x 356,089 ops/sec ±1.17% (85 runs sampled)
    getOriginH3IndexFromUnidirectionalEdge x 1,052,652 ops/sec ±0.54% (89 runs sampled)
    getDestinationH3IndexFromUnidirectionalEdge x 891,680 ops/sec ±0.90% (91 runs sampled)
    h3UnidirectionalEdgeIsValid x 3,551,111 ops/sec ±0.69% (85 runs sampled)
    

    When making code changes that may affect performance, please run benchmarks against master and then against your branch to identify any regressions.

    Transpiling the C Source

    The core library is transpiled using emscripten. The easiest way to build from source locally is by using Docker. Make sure Docker is installed, then:

    yarn docker-boot
    yarn build-emscripten
    

    The build script uses the H3_VERSION file to determine the version of the core library to build. To use a different version of the library (e.g. to test local changes), clone the desired H3 repo to ./h3c and then run yarn docker-emscripten.

    Contributing

    Pull requests and Github issues are welcome. Please include tests for new work, and keep the library test coverage at 100%. Please note that the purpose of this module is to expose the API of the H3 Core library, so we will rarely accept new features that are not part of that API. New proposed feature work is more appropriate in the core C library or in a new JS library that depends on h3-js.

    Before we can merge your changes, you must agree to the Uber Contributor License Agreement.

    Versioning

    The H3 core library adheres to Semantic Versioning. The h3-js library has a major.minor.patch version scheme. The major and minor version numbers of h3-js are the major and minor version of the bound core library, respectively. The patch version is incremented independently of the core library.

    Legal and Licensing

    The h3-js library is licensed under the Apache 2.0 License.

    DGGRID Copyright (c) 2015 Southern Oregon University

    Install

    npm i h3-js

    DownloadsWeekly Downloads

    100,090

    Version

    3.7.2

    License

    Apache-2.0

    Unpacked Size

    5.16 MB

    Total Files

    33

    Last publish

    Collaborators

    • nrabinowitz