Filled Area on Tile Maps in JavaScript

How to make an area on Map using a D3.js-based scattermap.


Plotly Studio: Transform any dataset into an interactive data application in minutes with AI. Sign up for early access now.

There are three different ways to show a filled area in a tile-based map.

  1. Use a scattermap trace and set fill attribute to 'toself'
  2. Use a map layout (i.e. by minimally using an empty Scattermap trace) and add a GeoJSON layer
  3. Use the Choroplethmap trace type
Filled Scattermap Trace
The following example uses Scattermap and sets fill = 'toself'.

var data = [
	{
		type: "scattermap",
		fill: "toself",
		lon: [-74, -70, -70, -74],
		lat: [47, 47, 45, 45],
		marker: { size: 10, color: "orange" }
	}
];

var layout = {
	map: {
		style: "stamen-terrain",
		center: { lon: -73, lat: 46 },
		zoom: 5
	},
	showlegend: false,
	height: 450,
	width: 600
};

Plotly.newPlot("myDiv", data, layout);

The following example shows how to use null in your data to draw multiple filled areas. Such gaps in trace data are unconnected by default, but this can be controlled via the connectgaps attribute.

var data = [{
		type: "scattermap",
		mode: "lines",
		fill: "toself",
		lon: [-10, -10, 8, 8, -10, null, 30, 30, 50, 50, 30, null, 100, 100, 80, 80, 100],
		lat: [30, 6, 6, 30, 30,    null, 20, 30, 30, 20, 20, null, 40, 50, 50, 40, 40]
		}]

var layout = {
	map: {style: "stamen-terrain", center: {lon: 40, lat: 20}, 'zoom': 1.5},
	showlegend: false,
	width:700, height: 700}

Plotly.newPlot("myDiv", data, layout)

This example shows an area below water layer, and sets geojson object of type feature and geometries of type MultiPolygon.

var data = [{
    type: "scattermap", mode: "markers",
    lon: [-73.605], lat: [45.51],
    marker: { size: 20, color: ["cyan"] }
  }];

var layout = {
  map: {
    style: "dark",
    center: { lon: -73.6, lat: 45.515},
    zoom: 12, layers: [{
        source: {
          type: "FeatureCollection",
          features: [{
              type: "Feature",
              geometry: {
                type: "MultiPolygon",
                coordinates: [[[
                      [-73.606352888, 45.507489991], [-73.606133883, 45.50687600],
                      [-73.605905904, 45.506773980], [-73.603533905, 45.505698946],
                      [-73.602475870, 45.506856969], [-73.600031904, 45.505696003],
                      [-73.599379992, 45.505389066], [-73.599119902, 45.505632008],
                      [-73.598896977, 45.505514039], [-73.598783894, 45.505617001],
                      [-73.591308727, 45.516246185], [-73.591380782, 45.516280145],
                      [-73.596778656, 45.518690062], [-73.602796770, 45.521348046],
                      [-73.612239983, 45.525564037], [-73.612422919, 45.525642061],
                      [-73.617229085, 45.527751983], [-73.617279234, 45.527774160],
                      [-73.617304713, 45.527741334], [-73.617492052, 45.527498362],
                      [-73.617533258, 45.527512253], [-73.618074188, 45.526759105],
                      [-73.618271651, 45.526500673], [-73.618446320, 45.526287943],
                      [-73.618968507, 45.525698560], [-73.619388002, 45.525216750],
                      [-73.619532966, 45.525064183], [-73.619686662, 45.524889290],
                      [-73.619787038, 45.524770086], [-73.619925742, 45.524584939],
                      [-73.619954486, 45.524557690], [-73.620122362, 45.524377961],
                      [-73.620201713, 45.524298907], [-73.620775593, 45.523650879]
                    ]]]
              }
            }]
        },
        type: "fill", below: "water", color: "teal"
      }]
  },
  height: 450, width: 700
};

Plotly.newPlot("myDiv", data, layout);