ridge-map
TypeScript icon, indicating that this package has built-in type declarations

1.0.2 • Public • Published

Ridge Map

Ridge map uses elevation data to make SVG plots of ridges. Provided with location co-ordinates and some configuration detail you can create a beautiful visualisation of elevation data.

Inspired by and borrows a lot of methods from ColCarroll's ridge_map Python library, but written from scratch for node.js with additional functionality and priorities not available in ridge_map:

  • Removed text label - you can add that yourself with more control in a design program.
  • Uses true strokes instead of polygons with a solid background. This makes it more flexible for use elsewhere.
  • Uses direct SVG manipulation instead of a plotting library for better SVG output.
  • Supports multiple map projections including mercator, web mercator, and any Proj4 valid cylindrical projections.
  • Doesn't support colormaps or elevation gradients.

Ridge map of the Himalayas, centred around Mt Everest

Installation

Create a fresh npm directory and install with NPM:

npm install ridge-map

Alternatively install the live development build with git:

npm install git+https://github.com/accudio/ridge-map.git

Usage

For basic usage, import and create a new RidgeMap with your bounding box and run getElevationData, generate and save:

import RidgeMap from 'ridge-map'

const map = new RidgeMap({
  // include your bounding box from http://bboxfinder.com
  bbox: [-3.886049,57.006752,-3.673875,57.184492],
})
await map.getElevationData()
await map.generate()
await map.save()

For advanced usage you can provide additional options:

import RidgeMap from './src/index.js'

const map = new RidgeMap({
  // Include your bounding box from http://bboxfinder.com
  bbox: [-3.886049,57.006752,-3.673875,57.184492],
  // Additional projections, options include 'latlng' (default), 'mercator', 'web-mercator'
  // and any proj4-valid cylindrical projection: https://www.npmjs.com/package/proj4
  projection: 'web-mercator',
  // Alternate viewpoints, options include 'south' (default), 'west', 'north', and 'east'
  viewpoint: 'north'
})
await map.getElevationData({
  // Number of lines (top to bottom), default 80
  num: 100,
  // Number of points each line (left to right), default 300
  points: 100,
  // Where to cache .hgt files, defaults to ~/.cache/srtm
  cache: './hgt-cache/'
})
await map.generate({
  // Control how exaggerated vertical differences are, increase to make more dramatic.
	// Default 40
  verticalRatio: 100,
  // Delete the provided number of meters of data, useful for coasts, lakes or rivers.
	// Set to 0 to disable (default)
  waterNTile: 1,
  // How few meters lines can change vertically within 3 points before removing, useful
	// for elevated lakes and rivers. Set to 0 to disable (default)
  lakeFlatness: 0.2,
  // colour of lines, supporting any valid CSS colour format, default black
  lineColour: '#f00',
  // width of lines, as used on an SVG canvas with width 100, default 0.1
  lineWidth: 1
})
//
await map.save({
  // filename to output
  name: 'our-output.svg',
  // whether to optimise SVG using SVGO, producing smaller, nicer outputs. Defaults to true
  svgo: false
})

Examples

See the examples directory for examples of what ridge map can produce and the code that produced it. If you've produced an interested ridge map or used it in an interesting way and would like it included in these examples, please let us know via an issue!

Examples of ridge maps of different locations and in different colours

Elevation data

Elevation data is looked up by .hgt files in the specified or default cache directory using the node package node-hgt. If data isn't available locally, it will be downloaded from imagico.de which includes composite data from several different sources. This covers pretty much all land globally, however the quality varies depending on location.

You can provide your own data by providing .hgt files in the cache directory with the default file names. For example you can download higher-quality elevation data for Europe from Sonny in 1" or 3" format.

License and Contributing

This project is licensed under the MIT license. The full license is included at LICENSE.md, or at mit-license.org.

Contributions are accepted, this is a list of potential additions or improvements that would be great to make:

  • Arbitrary viewpoints — cardinal directions are supported but can we support an arbitrary viewpoint of 45 degrees (from north-east) for example?
  • Performance — particularly for lots of lines and points ridge-map is pretty slow and can run into issues. It would be great to improve this!
  • Perspective — add perspective so rear lines should be scaled down and closer together than the front lines.
  • Map projections — I don't know if it would be possible but it would be cool if the library could support more map projections including non-cylindrical ones.

Readme

Keywords

Package Sidebar

Install

npm i ridge-map

Weekly Downloads

1

Version

1.0.2

License

MIT

Unpacked Size

31.1 kB

Total Files

8

Last publish

Collaborators

  • accudio