DevExtreme v23.1 is now available.

Explore our newest features/capabilities and share your thoughts with us.

Your search did not match any results.
Vector Map

Area with Labels and Two Legends

Documentation

The VectorMap component allows you to use color and size indicators to better illustrate the values associated with areas/markers. Use map legends to provide additional information on colors and marker size.

Backend API
Copy to CodeSandBox
Apply
Reset
<template> <DxVectorMap id="vector-map" :bounds="bounds" > <DxLayer :data-source="mapsWorld" :color-groups="colorGroups" :customize="customizeLayer" name="areas" color-grouping-field="population" palette="Violet" > <DxLabel :enabled="true" data-field="name" /> </DxLayer> <DxLayer :data-source="markers" :size-groups="sizeGroups" :opacity="0.8" name="markers" element-type="bubble" data-field="value" > <DxLabel :enabled="false" /> </DxLayer> <DxLegend :customize-items="customizeItems" :customize-text="customizeText" title="World Population<br/>Percentages" horizontal-alignment="left" vertical-alignment="bottom" > <DxSource layer="areas" grouping="color" /> </DxLegend> <DxLegend :customize-items="customizeItems" :customize-text="customizeMarkers" title="City Population" marker-shape="circle" horizontal-alignment="right" vertical-alignment="bottom" > <DxSource layer="markers" grouping="size" /> </DxLegend> <DxTooltip :enabled="true" :customize-tooltip="customizeTooltip" /> </DxVectorMap> </template> <script> import * as mapsData from 'devextreme-dist/js/vectormap-data/world.js'; import { DxVectorMap, DxLabel, DxLayer, DxLegend, DxSource, DxTooltip, } from 'devextreme-vue/vector-map'; import { populations, markers } from './data.js'; export default { components: { DxVectorMap, DxLabel, DxLayer, DxLegend, DxSource, DxTooltip, }, data() { return { markers, populations, colorGroups: [0, 0.5, 0.8, 1, 2, 3, 100], mapsWorld: mapsData.world, bounds: [-180, 85, 180, -75], sizeGroups: [0, 8000, 10000, 50000], }; }, methods: { customizeText(itemInfo) { if (itemInfo.index === 0) { return '< 0.5%'; } if (itemInfo.index === 5) { return '> 3%'; } return `${itemInfo.start}% to ${itemInfo.end}%`; }, customizeTooltip(info) { return { text: info.attribute('text'), }; }, customizeMarkers({ index }) { return ['< 8000K', '8000K to 10000K', '> 10000K'][index]; }, customizeItems(items) { return items.reverse(); }, customizeLayer(elements) { elements.forEach((element) => { const name = element.attribute('name'); const population = this.populations[name]; if (population) { element.attribute('population', population); } }); }, }, }; </script> <style> #vector-map { height: 700px; } </style>
import { createApp } from 'vue'; import App from './App.vue'; createApp(App).mount('#app');
<!DOCTYPE html> <html> <head> <title>DevExtreme Demo</title> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.6.12/client/shim.min.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script type="text/javascript" src="config.js"></script> <script type="text/javascript"> System.import("./index.js"); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <div id="app"></div> </div> </body> </html>
export const populations = { China: 19, India: 17.4, 'United States': 4.44, Indonesia: 3.45, Brazil: 2.83, Nigeria: 2.42, Bangladesh: 2.18, Russia: 2.04, Japan: 1.77, Mexico: 1.67, Philippines: 1.39, Vietnam: 1.25, Ethiopia: 1.23, Egypt: 1.21, Germany: 1.13, Turkey: 1.07, 'Democratic Republic of the Congo': 0.94, France: 0.92, Thailand: 0.9, 'United Kingdom': 0.89, Italy: 0.85, Burma: 0.84, 'South Africa': 0.74, 'South Korea': 0.7, Colombia: 0.66, Spain: 0.65, Tanzania: 0.63, Kenya: 0.62, Ukraine: 0.6, Argentina: 0.59, Algeria: 0.54, Poland: 0.54, Sudan: 0.52, Canada: 0.49, Uganda: 0.49, Morocco: 0.46, Uzbekistan: 0.43, }; export const markers = { type: 'FeatureCollection', features: [ { coordinates: [-74, 40.7], text: 'New York City', value: 8406, }, { coordinates: [100.47, 13.75], text: 'Bangkok', value: 8281, }, { coordinates: [37.62, 55.75], text: 'Moscow', value: 12111, }, { coordinates: [121.5, 31.2], text: 'Shanghai', value: 24150, }, { coordinates: [-43.18, -22.9], text: 'Rio de Janeiro', value: 6429, }, { coordinates: [31.23, 30.05], text: 'Cairo', value: 8922, }, { coordinates: [28.95, 41], text: 'Istanbul', value: 14160, }, { coordinates: [127, 37.55], text: 'Seoul', value: 10388, }, { coordinates: [139.68, 35.68], text: 'Tokyo', value: 9071, }, { coordinates: [103.83, 1.28], text: 'Singapore', value: 5399, }, { coordinates: [30.3, 59.95], text: 'Saint Petersburg', value: 5131, }, { coordinates: [28.03, -26.2], text: 'Johannesburg', value: 4434, }, { coordinates: [144.95, -37.8], text: 'Melbourne', value: 4252, }, ].map((data) => ({ type: 'Feature', geometry: { type: 'Point', coordinates: data.coordinates, }, properties: { value: data.value, text: data.text, }, })), };
window.config = { transpiler: 'plugin-babel', meta: { '*.vue': { loader: 'vue-loader', }, '*.ts': { loader: 'demo-ts-loader', }, '*.svg': { loader: 'svg-loader', }, 'devextreme/localization.js': { 'esModule': true, }, 'devextreme-dist/js/vectormap-data/*': { 'esModule': true, }, }, paths: { 'root:': '../../../../../', 'npm:': 'https://unpkg.com/', }, map: { 'vue': 'npm:vue@3.3.4/dist/vue.esm-browser.js', 'vue-loader': 'npm:dx-systemjs-vue-browser@1.1.1/index.js', 'demo-ts-loader': 'root:utils/demo-ts-loader.js', 'svg-loader': 'root:utils/svg-loader.js', 'devextreme-dist/js/vectormap-data': 'npm:devextreme-dist@23.1.5/js/vectormap-data', 'mitt': 'npm:mitt/dist/mitt.umd.js', 'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.28.1/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@23.1.5/cjs', 'devextreme-vue': 'npm:devextreme-vue@23.1.5', 'jszip': 'npm:jszip@3.7.1/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@1.6.2/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.2.1/dist/dx-diagram.js', 'devexpress-gantt': 'npm:devexpress-gantt@4.1.48/dist/dx-gantt.js', '@devextreme/runtime': 'npm:@devextreme/runtime@3.0.11', 'inferno': 'npm:inferno@7.4.11/dist/inferno.min.js', 'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js', 'inferno-create-element': 'npm:inferno-create-element@7.4.11/dist/inferno-create-element.min.js', 'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js', 'inferno-hydrate': 'npm:inferno-hydrate@7.4.11/dist/inferno-hydrate.min.js', 'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js', 'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js', 'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js', 'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js', 'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js', // Prettier 'prettier/standalone': 'npm:prettier@2.8.4/standalone.js', 'prettier/parser-html': 'npm:prettier@2.8.4/parser-html.js', }, packages: { 'devextreme-vue': { main: 'index.js', }, 'devextreme': { defaultExtension: 'js', }, 'devextreme/events/utils': { main: 'index', }, 'devextreme/events': { main: 'index', }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js', }, }, packageConfigPaths: [ 'npm:@devextreme/*/package.json', 'npm:@devextreme/runtime@3.0.11/inferno/package.json', ], babelOptions: { sourceMaps: false, stage0: true, }, }; System.config(window.config);