Tools for editing Shapefile, GeoJSON, TopoJSON and CSV files

Overview

Mapshaper

Introduction

Mapshaper is software for editing Shapefile, GeoJSON, TopoJSON, CSV and several other data formats, written in JavaScript.

Mapshaper supports essential map making tasks like simplifying shapes, editing attribute data, clipping, erasing, dissolving, filtering and more.

See the project wiki for documentation on how to use mapshaper.

To suggest improvements, add an issue.

Command line tools

Mapshaper includes several command line programs, which can be run under Mac OS X, Linux and Windows.

  • mapshaper Runs mapshaper commands.
  • mapshaper-xl Works the same as mapshaper, but runs with more RAM to support larger files.
  • mapshaper-gui Runs the mapshaper Web interface locally.

The project wiki has an introduction to using the command line tool that includes many simple examples.

For a detailed reference, see the Command Reference.

Interactive web interface

Visit the public website at www.mapshaper.org or use the web UI locally via the mapshaper-gui script.

All processing is done in the browser, so your data stays private, even when using the public website.

The web UI works in recent desktop versions of Chrome, Firefox, Safari and Internet Explorer. Safari before v10.1 and IE before v10 are not supported.

User-contributed resources

rmapshaper is an R package written by Andy Teucher that gives R users access to many of mapshaper's editing commands.

Here are resources for using mapshaper with Docker, provided by Christian Weiss.

You can find a number of mapshaper tutorials online, including a two part guide to command line cartography by Dylan Moriarty and this introduction by Jack Dougherty.

Large file support

Web interface

Firefox is able to load Shapefiles and GeoJSON files larger than 1GB. Chrome has improved in recent versions, but is still prone to out-of-memory errors when importing files larger than several hundred megabytes.

Command line interface

There are hard limits for reading and writing most file types. The maximum output size of a single file of any type is 2GB. Some file types (GeoJSON, CSV, .shp) are read incrementally, so much larger files can be imported.

When working with very large files, mapshaper may become unresponsive or crash with the message "JavaScript heap out of memory."

One option is to run mapshaper-xl, which allocates more memory than the standard mapshaper program (8GB by default). Starting with version 0.4.131, you can specify the amount of memory to allocate like this: mapshaper-xl 20gb [commands].

Another solution is to run Node directly with the --max-old-space-size option. The following example (Mac or Linux) allocates 16GB of memory:

$ node  --max-old-space-size=16000 `which mapshaper` <mapshaper commands>

Installation

Mapshaper requires Node.js.

With Node installed, you can install the latest release version of mapshaper using npm. Install with the "-g" flag to make the executable scripts available systemwide.

npm install -g mapshaper

To install and run the latest development code from github:

git clone [email protected]:mbloch/mapshaper.git
cd mapshaper
npm install       # install dependencies
npm run build     # bundle source code files
npm link          # (optional) add global symlinks so scripts are available systemwide

Building and testing

From the project directory, run npm run build to build both the cli and web UI modules.

Run npm test to run mapshaper's tests.

License

This software is licensed under MPL 2.0.

According to Mozilla's FAQ, "The MPL's ‘file-level’ copyleft is designed to encourage contributors to share modifications they make to your code, while still allowing them to combine your code with code under other licenses (open or proprietary) with minimal restrictions."

Acknowledgements

My colleagues at The New York Times, for countless suggestions, bug reports and general helpfulness.

Mark Harrower, for collaborating on the original "MapShaper" program at the University of Wisconsin–Madison.

Comments
  • Unable to process large shapefile

    Unable to process large shapefile

    I am trying to process a 1.2GB USA Census Block Group file. When trying to do the basic operation:

    mapshaper -p 0.1 usa_census_block_groups.shp -f shapefile -o test.shp
    

    I get the following error:

    buffer.js:194
          this.parent = new SlowBuffer(this.length);
                        ^
    RangeError: length > kMaxLength
        at new Buffer (buffer.js:194:21)
        at Object.fs.readFileSync (fs.js:302:14)
        at Object.Node.readFile (/usr/local/lib/node_modules/mapshaper/mapshaper.js:1299:20)
        at Object.MapShaper.readGeometryFile (/usr/local/lib/node_modules/mapshaper/mapshaper.js:9946:20)
        at Object.MapShaper.importFromFile (/usr/local/lib/node_modules/mapshaper/mapshaper.js:9934:27)
        at /usr/local/lib/node_modules/mapshaper/bin/mapshaper:43:28
        at Object.Utils.mapFilter (/usr/local/lib/node_modules/mapshaper/mapshaper.js:92:19)
        at Object.Utils.forEach (/usr/local/lib/node_modules/mapshaper/mapshaper.js:861:9)
        at procFiles (/usr/local/lib/node_modules/mapshaper/bin/mapshaper:37:11)
        at Object.<anonymous> (/usr/local/lib/node_modules/mapshaper/bin/mapshaper:19:3)
    
    opened by hallahan 21
  • Error trying to parse large JSON

    Error trying to parse large JSON

    Hi! i'm trying to simplify this GeoJson https://github.com/jgoodall/us-maps/tree/master/geojson. the zcta5.json is 1.4g

    mapshaper errors out whenever i try to parse it. i think it's the same error that was reported in #47 namely "Node won't assign a buffer greater than 1gb"

    opened by Javier-Rotelli 14
  • Select by ID in mapshaper GUI console

    Select by ID in mapshaper GUI console

    I can filter to features which have some property in the mapshaper GUI console via:

    filter 'propertyname == "value"'
    

    If my GeoJSON file has an id field, though (which is not in properties), it's not clear to me how to select based on that. Either a separate select command or a way to access the ID in a filter statement would be really helpful.

    opened by danvk 14
  • Overlay between polygons and attributes

    Overlay between polygons and attributes

    Is it possible to do Union in mapshaper and produce the intersection between all polygons and have also the values combination as output?

    |ID|Value| |---|---| |1|A| |2|A,B| |3|A,B,C| |4|A,C| |5|B| |6|C| |7|B,C|

    image

    Thank you

    opened by aborruso 13
  • [feature request] support gz compressed GeoJSONs

    [feature request] support gz compressed GeoJSONs

    Would be nice to support gz compressed GeoJSONs for input and output for bigger datasets. When using streams it could look something like this:

    if (this.options.gz) {
        outStream = zlib.createGzip();
        outStream.on('error', (err: any) => console.log(err.stack));
        let writeStream = fs.createWriteStream(`${file}.gz`);
        outStream.pipe(writeStream);
    } else {
        outStream = fs.createWriteStream(file);
    }
    

    #358 #501

    opened by indus 12
  • Fails to read really big geojson file

    Fails to read really big geojson file

    The problem: I am trying to simplify a really big geojson file with mapshaper.

    And it seems like, there are single polygons which occupy more space than the biggest possible buffer in node.js (currently 2GB on 64bit systems).

    ❯ mapshaper-xl -i results_sentinel_snow_vectorized.json -simplify 10% -filter remove-empty -o format=geojson geojson-type=FeatureCollection simplified.json                         
    Allocating 8 GB of heap memory
    TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received type number (2147483648)
        at Function.from (buffer.js:333:9)
        at Object.createBuffer (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:901:57)
        at updateCache (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:8046:23)
        at FileReader.readSync (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:8007:7)
        at readObject (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11378:39)
        at readObjects (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11314:15)
        at GeoJSONReader.readObjects (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11298:7)
        at importGeoJSONFile (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11488:35)
        at readJSONFile (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11502:17)
        at importJSON (/home/aaron/.nvm/versions/node/v14.15.3/lib/node_modules/mapshaper/mapshaper.js:11537:14) {
      code: 'ERR_INVALID_ARG_TYPE'
    }
    

    The workflow was always (last step = mapshaper simplify): input.tif => vectorized.json => simplified_vectorized.json

    Currently to bypass the problem, I use gdal_sieve.py to reduce the genereal complexity, so the biggest polygon is not greater than the maximum node.js buffer: input.tif => sieved_input.tif => vectorized.json => simplified_vectorized.json

    If you want to reproduce the error:

    • This was the input.tif which was used to generate the geojson file. (you can preview it with QGIS)
    • This is the really big geojson file, where mapshaper-xl fails.
    • This is the geojson file, generated by vectorizing a sieved version of the input.tif, where mapshaper-xl does not fail.

    (for context: the data is snow coverage over central europe, observed by a satellite)

    (to unzip .lrz files, you can use lrzip:

    • linux sudo apt install lrzip
    • macos brew install lrzip
    lrunzip someFile.lrz
    

    )

    opened by zingi 12
  • Refactoring mapshaper

    Refactoring mapshaper

    I've used mapshaper extensively for the past few weeks and still find it difficult to keep track of files and what calls what and where. Have you considered refactoring from your custom /* requires package */ syntax and custom build system to a more standard import package from "./package.js" syntax?

    Programmers unfamiliar with mapshaper's codebase also get zero editor support such as autocomplete and jump-to-file when they're trying to figure out what does what.

    It would make it easier for others to read and contribute to mapshaper if you gradually adopted standard Javascript imports. Would you be interested in a PR?

    opened by milkbump 12
  • mapshaper cannot find geojson file (username with spaces?)

    mapshaper cannot find geojson file (username with spaces?)

    shape_municipios_simp <- rmapshaper::ms_simplify(shape_municipios, sys = T) Error: [o] Command expects a single value. Received: C:\Users\Guarino R. Colli\AppData\Local\Temp\RtmpScK7dh\file41301ed349d8.geojson Run mapshaper -h to view help Error: Cannot open "C:\Users\Guarino R. Colli\AppData\Local\Temp\RtmpScK7dh\file41301ed349d8.geojson"; The file doesn't seem to exist.

    From other forums, the issue is related to a username (and directory names) with spaces. Is there a way around this, other than creating a new user? Thanks, Guarino.

    Sys.getenv()

    opened by grcolli 10
  • Output insanely slow

    Output insanely slow

    Problem

    The output operation is considerably slow on small file.

    How to reproduce the problem

    Run this on earth-lands.geo.json

    mapshaper -i earth-lands.geo.json
    -simplify dp interval=1
    -o precision=0.000001 format=geojson
    

    Then wait some hours...

    Same problem also if the same is done on mapshaper's web interface.

    See also this

    EDIT Also doing just this led to really long waiting...

    mapshaper -i earth-lands.geo.json -o
    

    The map has a single feature with an huge number of polygons.

    opened by simonepri 10
  • Use applyCommands on two objects (eg., with clip, erase, etc)

    Use applyCommands on two objects (eg., with clip, erase, etc)

    First, thank you so much for mapshaper. The topologically-aware polygon simplification is superb; it saves me on a regular basis.

    I apologize if this is documented somewhere already, but I'm trying to use mapshaper.applyCommands to clip a GeoJSON object on another GeoJSON object.

    In the node REPL:

    var mapshaper = require('mapshaper');
    
    var poly = {
      "type": "Feature",
      "geometry": {
      "type": "Polygon",
      "coordinates": [
      [
      [-114.345703125, 39.4369879],
      [-116.4534998, 37.18979823791],
      [-118.4534998, 38.17698709],
      [-115.345703125, 43.576878],
      [-106.611328125, 43.4529188935547],
      [-105.092834092, 46.20938402],
      [-106.66859, 39.4389646],
      [-103.6117867, 36.436756],
      [-114.34579879, 39.4361929]
      ] ]
      }
    }
    
    var clip_poly = {
      "type": "Feature",
      "geometry": {
      "type": "Polygon",
      "coordinates": [
      [
      [-114.345703125, 39.4361929993141],
      [-114.345703125, 43.4529188935547],
      [-106.611328125, 43.4529188935547],
      [-106.611328125, 39.4361929993141],
      [-114.345703125, 39.4361929993141]
      ] ]
      }
    }
    
    mapshaper.applyCommands("-clip clip_poly", poly, function(Error, data) {
      if (Error) console.error(Error);
      console.log(data);
    })
    

    I get: APIError: File not found (clip_poly).

    Is there a way to specify the clipping layer as an object rather than a filename with applyCommands?

    opened by ateucher 10
  • How to keep the original filename on merge & --split

    How to keep the original filename on merge & --split

    Is there a build-in way to keep the original filenames after split? Or do i have to prepare the input files by adding a .feature[].properties.originalFilename and then rename the output files based on that field?

    This question is inspired by: https://github.com/mbloch/mapshaper/issues/365

    opened by christian-weiss 9
  • data visualization with colorizer?

    data visualization with colorizer?

    Hello,

    I would like to color several thousand points with a palette of colors associated with values ​​at which I would have fixed the step. For example the color of each point changes every 0.2mm step for rain. My csv file therefore contains this: LON;LAT;VALUE I do points x=LON y=LAT But then? How to color each point according to its value? I can't get by with the colorizer command..

    Best regards

    opened by chris3522 0
  • -o overrides chrome download settings

    -o overrides chrome download settings

    Hello, -o in v0.6.16 probably overrides Chrome download settings, saving output now asks for user-selected directory all the time, even though it's set otherwise in browser settings (this issue doesn't show up in Firefox) Toc

    opened by tcerman 2
  • Bump qs from 6.9.3 to 6.11.0

    Bump qs from 6.9.3 to 6.11.0

    Bumps qs from 6.9.3 to 6.11.0.

    Changelog

    Sourced from qs's changelog.

    6.11.0

    • [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option (#442)
    • [readme] fix version badge

    6.10.5

    • [Fix] stringify: with arrayFormat: comma, properly include an explicit [] on a single-item array (#434)

    6.10.4

    • [Fix] stringify: with arrayFormat: comma, include an explicit [] on a single-item array (#441)
    • [meta] use npmignore to autogenerate an npmignore file
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, object-inspect, tape

    6.10.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [actions] reuse common workflows
    • [Dev Deps] update eslint, @ljharb/eslint-config, object-inspect, tape

    6.10.2

    • [Fix] stringify: actually fix cyclic references (#426)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [actions] update codecov uploader
    • [actions] update workflows
    • [Tests] clean up stringify tests slightly
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, object-inspect, safe-publish-latest, tape

    6.10.1

    • [Fix] stringify: avoid exception on repeated object values (#402)

    6.10.0

    • [New] stringify: throw on cycles, instead of an infinite loop (#395, #394, #393)
    • [New] parse: add allowSparse option for collapsing arrays with missing indices (#312)
    • [meta] fix README.md (#399)
    • [meta] only run npm run dist in publish, not install
    • [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbols, tape
    • [Tests] fix tests on node v0.6
    • [Tests] use ljharb/actions/node/install instead of ljharb/actions/node/run
    • [Tests] Revert "[meta] ignore eclint transitive audit warning"

    6.9.7

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] stringify: avoid encoding arrayformat comma when encodeValuesOnly = true (#424)
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] add note and links for coercing primitive values (#408)
    • [Tests] clean up stringify tests slightly
    • [meta] fix README.md (#399)
    • Revert "[meta] ignore eclint transitive audit warning"

    ... (truncated)

    Commits
    • 56763c1 v6.11.0
    • ddd3e29 [readme] fix version badge
    • c313472 [New] [Fix] stringify: revert 0e903c0; add commaRoundTrip option
    • 95bc018 v6.10.5
    • 0e903c0 [Fix] stringify: with arrayFormat: comma, properly include an explicit `[...
    • ba9703c v6.10.4
    • 4e44019 [Fix] stringify: with arrayFormat: comma, include an explicit [] on a s...
    • 113b990 [Dev Deps] update object-inspect
    • c77f38f [Dev Deps] update eslint, @ljharb/eslint-config, aud, has-symbol, tape
    • 2cf45b2 [meta] use npmignore to autogenerate an npmignore file
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • SVG export not including full relations

    SVG export not including full relations

    Trying to export .geojson multipolygons (polygon features) into SVG through Mapshaper - previously (some amount of months ago) this worked flawlessly, but trying this now results in several shapes being lost.

    See below a screenshot from mapshaper, with one of the multipolygon relations selected: image As you can see, this relation is divided into two large parts. Previously, these relations would be exported into SVG as a grouped object, with the name being "relation/[id]" - upon exporting to SVG now, this is the result:

    image

    The top half of the relation disappeared; and does no longer exist in the SVG. Consistently in my export, each relation with multiple areas - whether it be islands or exclaves, has one of these areas exported, and the rest ignored. The exception turns out to be areas consisting of only one line which are (seperately) exported no matter what.

    Though I'm uncertain whether or not the new approach to exporting these relations into SVG (as seperate objects instead of grouped) is intended behaviour (it would add a little extra manual work to my use-case if so, but not the end of the world), I doubt the non-exportation of these split relations is intentional.

    Can provide example file if needed.

    opened by booonen 1
  • Website output is broken/missing countries

    Website output is broken/missing countries

    Hello.

    I'm trying to convert this file (https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/10m/cultural/ne_10m_admin_1_states_provinces.zip) to topojson through the online interface at mapshaper.org. It loads in fine and shows all the detail you would expect.

    However, when i try to load the export into my programs it seems half the countries are flat-out missing. I've tried many combinations of parameters and simplifications, but no dice.

    I couldn't find any other issues detailing this problem.

    opened by PaulFranken 2
Releases(v0.6.17)
Owner
Matthew Bloch
Matthew Bloch
Converts geojson to svg string given svg viewport size and maps extent.

geojson2svg Converts geojson to svg string given svg viewport size and maps extent. Check world map, SVG scaled map and color coded map examples to de

Gagan Bansal 163 Dec 17, 2022
Dashboards-maps is a frontend plugin that helps you in uploading custom GeoJSON to OpenSearch and communicates with the geospatial backend plugin for the same.

Welcome! Project Resources Code of Conduct License Copyright Dashboards-Maps Dashboards-maps is a frontend plugin that helps you in uploading custom G

null 9 Dec 28, 2022
modern parser & stringifier for WKT, EWKT, and GeoJSON

betterknown betterknown development is supported by ?? placemark.io I wrote wellknown, a WKT parser and stringifier, eons ago. It's still sort of popu

Placemark 32 Sep 3, 2022
Write or parse GeoJSON as YAML

geoyaml Write or parse GeoJSON as YAML. Like this: type: FeatureCollection features: - geometry: type: Point coordinates: - 37.9

Lou Huang 19 Dec 1, 2021
Reproject GeoJSON. Works Offline.

reproject-geojson Reproject GeoJSON features Works Offline Pure JavaScript Cross-Platform (NodeJS or Browser) install npm install reproject-geojson us

Daniel J. Dufour 8 Jul 22, 2022
A memory-efficient GeoJSON representation.

memory-geojson (experimental ?? ) A memory-efficient GeoJSON representation. This is not a new format. It's not meant to be serialized, and it doesn't

Tom MacWright 19 Nov 29, 2022
Draw tools for mapbox-gl-js

@mapbox/mapbox-gl-draw Adds support for drawing and editing features on mapbox-gl.js maps. See a live example here Requires mapbox-gl-js. Compatible v

Mapbox 750 Jan 2, 2023
geotiff.js is a small library to parse TIFF files for visualization or analysis. It is written in pure JavaScript, and is usable in both the browser and node.js applications.

geotiff.js Read (geospatial) metadata and raw array data from a wide variety of different (Geo)TIFF files types. Features Currently available function

geotiff.js 649 Dec 21, 2022
An online tool to generate and visualize maps for irregular and/or gapped LED layouts, for use with FastLED, Pixelblaze and other libraries.

An online tool to generate and visualize maps for irregular and/or gapped LED layouts, for use with FastLED, Pixelblaze and other libraries.

Jason Coon 172 Dec 8, 2022
The NASA WorldWind Javascript SDK (WebWW) includes the library and examples for creating geo-browser web applications and for embedding a 3D globe in HTML5 web pages.

Web WorldWind New versions of WorldWind released Web WorldWind 0.10.0 and WorldWind Java 2.2.0 are now available on GitHub. The new version of Web Wor

NASA WorldWind 770 Jan 1, 2023
Serverless raster and vector map tile generation using Mapnik and AWS Lambda

tilegarden ??️ ?? Contents About Usage Deployment to AWS Additional Configuration Options Required AWS Permissions Features Configuration Selection an

Azavea 89 Dec 22, 2022
MERN stack travel app using mapbox API, Travel and drop pin , share reviews and rate the location

MERN-Travel-Map Travel Map Pin A single page application built with MERN Stack from scratch (MongoDB + Mongoose, Express, React & NodeJs) Table of Con

Bùi Quốc Trọng 11 Dec 29, 2022
An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin. It uses WebGL for hardware-accelerated graphics

Cesium 9.7k Dec 26, 2022
An open-source JavaScript library for world-class 3D globes and maps :earth_americas:

CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin. It uses WebGL for hardware-accelerated graphics

Cesium 9.7k Jan 3, 2023
This is the leaflet plugin for GeoServer. Using this plugin user can have access to wms and wfs request easily.

Documentation leaflet-geoserver-request This is the plugin for Geoserver various kind of requests. Using this plugin, we can make WMS, WFS, getLegendG

Tek Kshetri 127 Dec 15, 2022
A very fast geospatial point clustering library for browsers and Node.

supercluster A very fast JavaScript library for geospatial point clustering for browsers and Node. <script src="https://unpkg.com/[email protected]/d

Mapbox 1.6k Jan 7, 2023
A Node.js map tile library for PostGIS and torque.js, with CartoCSS styling

Windshaft A Node.js map tile library for PostGIS and torque.js, with CartoCSS styling. Can render arbitrary SQL queries Generates image and UTFGrid in

CARTO 306 Dec 22, 2022
The smallest, simplest and fastest JavaScript pixel-level image comparison library

pixelmatch The smallest, simplest and fastest JavaScript pixel-level image comparison library, originally created to compare screenshots in tests. Fea

Mapbox 5.1k Jan 8, 2023
Super Low-Level Raster Reprojection and Resampling Library

geowarp Super Low-Level Raster Reprojection and Resampling Library install npm install -S geowarp usage const geowarp = require("geowarp"); const proj

Daniel J. Dufour 27 Nov 9, 2022