npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

geotoolbox

v2.0.3

Published

geotoolbox is javascript tool for geographers based on d3geo, topojson and jsts. It allows to simply deal with geojson properties and provides several GIS operations useful for thematic cartography.

Downloads

120

Readme

logo

npm jsdeliver license code size

geotoolbox is a javascript tool for geographers. It allows one to manage GeoJSON properties (attribute data) and provides several useful GIS operations for thematic cartography.

From the version 2.0, it is mailny based on geos-wasm.

1. Installation

1.1. In browser

Latest version

<script src="https://cdn.jsdelivr.net/npm/geotoolbox" charset="utf-8"></script>

Pinned version

<script
  src="https://cdn.jsdelivr.net/npm/[email protected]"
  charset="utf-8"
></script>

1.2. In Observable

Latest version

geo = require("geotoolbox");

Pinned version

geo = require("[email protected]");

2. Demo

Find a demo of all functions here.

3. Documentation

3.1. Handle properties

_Here we are talking about some basic functions which are useful for handling attribute data. Example.

add allows adding a new field in the attribute table. This function returns a new object and does not modify the initial object.

geo.properties.add({
    x: world, // a GeoJSON object
    field: "gdppc", // new colname (string) 
    expression: "gdp/pop*1000" // a string containing an expression
})

head allows getting the n top values from a given field. This function returns a new object and does not modify the initial object.

geo.properties.head({
    x: world, // a GeoJSON object
    field: "gdp", // a colname (string)
    nb: 5 // default:10. Number of features to get. Here, the 5 richest countries.
})

keep allows selecting one or several columns to keep in the attribute table. All other columns are deleted. This function returns a new object and does not modify the initial object.

geo.properties.keep({
    x: world, // a GeoJSON object
    field: ["ISO3", "pop2020"] // colname(s) (string or array of strings) 
})

remove allows removing one or several columns in the attribute table. This function returns a new object and does not modify the initial object.

geo.properties.remove({
    x: world, // a GeoJSON object
    field: ["tmp", "FID"] // colname(s) (string or array of strings) 
})

select allows filtering a GeoJSON FeatureCollection by its attribute table. This function returns a new object and does not modify the initial object.

geo.properties.select({
    x: world, // a GeoJSON object
    expression: "pop2022 >= 100000" // an expression (string) 
})

subset allows creating a subset from an array of values. This function returns a new object and does not modify the initial object.

geo.properties.subset({
    x: world, // a GeoJSON object
    field: "ISO3", // colname (string)
    selection: ["USA", "CAN", "MEX"], // values to be kept. Here, North American countries
    inverse: false // default: false. If true, all countries except USA, CAN and MEX are kept 
})

table allows getting a GeoJSON FeatureCollection attribute table.

geo.properties.table(world // a GeoJSON object

tail allows getting the n bottom values from a given field. This function returns a new object and does not modify the initial object.

geo.properties.tail({
    x: world, // a GeoJSON object
    field: "gdp", // a colname (string)
    nb: 5 // default:10. Number of features to get. Here, the 5 least wealthy countries
})

3.2 Handle geometries

Here we are talking about some basic functions which are useful for thematic maps, based on topojson, d3geo and jsts.

aggregate allows merging geometries based on their topology. To merge polygon geometries, see union. Example

aggregate

geo.aggregate(world) // a GeoJSON object

With options, you can compute an aggregate by id.

continents = geo.aggregate(
    world, // a GeoJSON object
    { 
        id: "continent" // ids
    })

bbox allows returning a geographic bounding box as GeoJSON from a GeoJSON or an array defining a bounding box [[left, bottom], [right, top]]. This function is based on Jacob Rus code. Example

bbox

geo.bbox(world) // a GeoJSON object

border allows extracting boundaries from a GeoJSON object (polygons). With options, you can get ids and calculate discontinuities. Example

border

geo.border(world) // a GeoJSON object

With options:

geo.border(
    world, // a GeoJSON object
    { 
        id: "ISO3", // ids
        values: "pop", // values
        type: "abs", // type of discontinuities calculated: rel (relative), abs(absolute) (default:"rel")
        share: 0.8 // share of kept borders (default: null for all)
    })

buffer allows building a buffer from points, lines or polygones. The distance is in kilometers.

buffer

geo.buffer(geojson, { dist: 1000 }) // 1000 km 

The distance value can also be contained in a GeoJSON field (in the properties). In this case, you just have to indicate the name of this field.

geo.buffer(geojson, { dist: "a field" }) // a field in properties

The merge option allows merging all the output buffers.

geo.buffer(geojson, { dist: 1000, merge:true }) 

The clip option prevents the buffers from sticking out of the world outline. Not having coordinates that exceed [-90, 90] in latitude and [-180, 180] in longitude is necessary for the d3.js projection functions to work properly.

geo.buffer(geojson, { dist: 1000, clip:true }) 

The step option allows defining the precision of the buffer (default:8)

geo.buffer(geojson, { dist: 1000, step:1 }) 

You can use wgs84=false if your GeoJSON is not in wgs84. In this case, the distance will be given in the map coordinates.

geo.buffer(geojson, { dist: 1000, wgs84:false }) 

clip allows clipping geometries. Example

clip

geo.clip(geojson1, {clip:geojson2}) 

With the option reverse:true, you can do a difference operation.

clip

geo.clip(geojson1, {clip:geojson2, reverse: true}) 

You can also define a buffer in km around the clip.

geo.clip(geojson1, {clip:geojson2, buffer: 100}) 

centroid allows computing centroids from polygons. Example

centroid

geo.centroid(world) // a GeoJSON (polygons) object

By default, the centroid is placed in the largest polygon. But you can avoid it.

geo.centroid(
    world, // a GeoJSON object
    {
        largest: false // largest polygon. true/false (default: true)
    })

It may happen that the coordinates of your base map are not in latitudes and longitudes, but already projected. In this case you can use the option planar = true.

geo.centroid(
    world, // a GeoJSON object
    {
        largest: false, // largest polygon. true/false (default: true)
        planar: true // if geometries are already projected
    })

coords2geo allows building a GeoJSON object from a table with lat,lng coordinates. Example

coords2geo

geo.coords2geo(
    data, // a json object
    {
        lat: "lat", // the field containing latitude coordinates (you can use also `latitude`) 
        lng: "lon" // the field containing longitude coordinates (you can use also `longitude`) 
    })

This function works also if coordinates are stored in a single field.

geo.coords2geo(
    data, // a json object
    {
        coords: "Coordinates" // the field containing coordinates separated by a comma or other separator. Coordinates in wkt format are also accepted. 
    })

For an even simpler automatic use, you don't have to specify the name of the variables containing the coordinates. If your data table contains the following fields (lat, latitude, lon,lng, longitude, coords, coordinates, coordinate), they are automatically selected. It is convenient, but for a better control and a faster calculation, it is still better to define where the coordinates are.

geo.coords2geo(data) // a json object

Sometimes the coordinates can be inverted. In this case you can set the reverse option to true.

geo.coords2geo(
    data, // a json object
    {
        reverse: true // to reverse latitudes and longitude coordinates
    })

densify allows to densify a geojson Example

densify

geo.densify(geojson, { dist: 0.4 }) 

The dist value determines the minimum distance between nodes.

dissolve allows dissolving geometries (multipart to single parts). Example

dissolve

geo.dissolve(world) // a GeoJSON object

nodes allows to retrieve geometry nodes. Example

nodes

geo.nodes(world) // a GeoJSON object

union allows merging polygon geometries. Example

union

geo.union(world) // a GeoJSON object

With options, you can compute a union by id.

continents = geo.union(
    world, // a GeoJSON object
    { 
        id: "continent" // ids
    })

simplify allows simplifying geometries while preserving topology (topojson.simplify algorithm). Example

simplify

geo.simplify(
    world, // a GeoJSON object
    { 
        k, // factor of simplification (default: 0.5)
    })

tissot tissot allows getting the Tissot's indicatrix. Example

tissot

geo.tissot(20) // step (default; 10)

geolines allows getting the natural geographic lines such as the equator, tropics & polar circles. Example

geolines

geo.geolines() 

3.3 Utils

filter allows to create and returns a new GeoJSON containing all the elements of the original GeoJSON that meet a condition determined by the callback function applied on properties (or geometries). the function returns a new GeoJSON and does not modify the initial GeoJSON. Find examples here.

filter

newworld = geo.filter(world, (d) => d.CNTR_ID == "BR")

You can also do the same thing on geometries by specifying a third argument as "geometry". For example:

newworld = geo.filter(world, (d) => d3.geoArea(d) > area, "geometry")

map allows to create a new GeoJSON with the results of a function call provided on each element of GeoJSON properties (or geometries). the function returns a new GeoJSON and does not modify the initial GeoJSON. Find examples here.

map

renameproperties = geo.map(world, (d, i) => ({
  index: i,
  id: d.CNTR_ID,
  name: d.CNTR_NAME
}))

You can also do the same thing on geometries by specifying a third argument as "geometry". For example:

dot = geo.map(
  world,
  (d) => ({ type: "Point", coordinates: d3.geoCentroid(d) }),
  "geometry"
)

rewind allows to allows to rewind outer ring counterclockwise and inner rings clockwise. It is adapted from MapBox geojson-rewind code) under ISC license. Example

rewind

geo.rewind(
    data, // a featureCollection
    {
        outer: true, // Rewind Rings Outer (default: true)
        mutate: true // to mutate the input geoJSON (default: true)
    })

featurecollection allows converting an array of features or an array of geometries to a well formatted GeoJSON. Example

featurecollection

geo.featurecollection(features) 

makevalid Returns a geometry which is valid according to the GEOS validity rules, and preserves as much as possible of the input geometry's extent, dimension, and structure. The returned geometry will be valid, or null if an exception occurs.

geo.makevalid(geojson) 

type allows get the geometry type of a GeoJSON. It return an object containg the number of dimensions of the geometries (1 for punctual, 2 for lineal, 3 for zonal and -1 for composite) and the types of the geometries ("Point", "LineString", "Polygon", "MultiPoint", "MultiLineString", "MultiPolygon").

geo.type(geojson) 

3.4 GIS operators

contains tests if the first geometry contains the second geometry.

geo.op.contains(geojson, geojson)

covers tests whether the first geometry covers the second geometry.

geo.op.covers(geojson, geojson)

crosses tests if two geometries cross.

geo.op.crosses(geojson, geojson)

coveredby tests whether the first geometry is covered by the second geometry.

geo.op.coverdby(geojson, geojson)

disjoint tests if two geometries are disjoint.

geo.op.disjoint(geojson, geojson)

equals tests whether two geometries are topologically equal.

geo.op.equals(geojson, geojson)

intersects tests if two geometries intersect in interior or boundary points.

geo.op.intersects(geojson, geojson)

overlaps tests if two geometries overlap in their interior points.

geo.op.overlaps(geojson, geojson)

touches tests if two geometries touch at one or more points.

geo.op.touches(geojson, geojson)

within tests if the first geometry is within the second geometry.

geo.op.within(geojson, geojson)