DevExtreme v26.1 is now available.

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

Your search did not match any results.

Angular Vector Map - Floor Plan

This demo illustrates how you can use custom data in the VectorMap component. Visualized, the custom data constitutes a floor plan.

Backend API
<dx-vector-map id="vector-map" [projection]="projection"> <dxo-vector-map-tooltip [enabled]="true" [customizeTooltip]="customizeTooltip" ></dxo-vector-map-tooltip> <dxi-vector-map-layer [hoverEnabled]="false" [dataSource]="buildingData" name="building" ></dxi-vector-map-layer> <dxi-vector-map-layer color="transparent" [dataSource]="roomsData" name="rooms" [borderWidth]="1" > <dxo-vector-map-label [enabled]="true" dataField="name" ></dxo-vector-map-label> </dxi-vector-map-layer> </dx-vector-map>
import { bootstrapApplication } from '@angular/platform-browser'; import { Component, enableProdMode, provideZoneChangeDetection } from '@angular/core'; import { DxVectorMapModule } from 'devextreme-angular'; import { FeatureCollection, Service } from './app.service'; if (!/localhost/.test(document.location.host)) { enableProdMode(); } @Component({ selector: 'demo-app', providers: [Service], templateUrl: './app.component.html', styleUrls: ['./app.component.css'], imports: [ DxVectorMapModule, ], }) export class AppComponent { projection = { to(coordinates: number[]) { return [coordinates[0] / 100, coordinates[1] / 100]; }, from(coordinates: number[]) { return [coordinates[0] * 100, coordinates[1] * 100]; }, }; roomsData: FeatureCollection; buildingData: FeatureCollection; constructor(service: Service) { this.roomsData = service.getRoomsData(); this.buildingData = service.getBuildingData(); } customizeTooltip({ layer, attribute }) { if (layer.name === 'rooms') { return { text: `Square: ${attribute('square')} ft&#178`, }; } return null; } } bootstrapApplication(AppComponent, { providers: [ provideZoneChangeDetection({ eventCoalescing: true, runCoalescing: true }), ], });
::ng-deep #vector-map { height: 400px; }
import { Injectable } from '@angular/core'; export class FeatureCollection { type: string; features: Feature[]; } export class Feature { type: string; properties?: FeatureProperty; geometry: FeatureGeometry; } export class FeatureProperty { name: string; square?: number; } export class FeatureGeometry { type: string; coordinates: number[][][]; } const buildingData: FeatureCollection = { type: 'FeatureCollection', features: [ { type: 'Feature', geometry: { type: 'Polygon', coordinates: [[ [10, -80], [-80, -80], [-80, 80], [40, 80], [40, -20], [100, -20], [100, -80], [30, -80], [30, -74], [34, -74], [34, -68], [40, -68], [40, -74], [94, -74], [94, -26], [40, -26], [40, -60], [34, -60], [34, 74], [-74, 74], [-74, 30], [10, 30], [10, 24], [-74, 24], [-74, -24], [10, -24], [10, -30], [-74, -30], [-74, -74], [10, -74], ]], }, }, ], }; const roomsData: FeatureCollection = { type: 'FeatureCollection', features: [ { type: 'Feature', properties: { name: 'Room 1', square: 576, }, geometry: { type: 'Polygon', coordinates: [[ [-74, -30], [34, -30], [34, -74], [-74, -74], ]], }, }, { type: 'Feature', properties: { name: 'Room 2', square: 600, }, geometry: { type: 'Polygon', coordinates: [[ [-74, 24], [34, 24], [34, -24], [-74, -24], ]], }, }, { type: 'Feature', properties: { name: 'Room 3', square: 540, }, geometry: { type: 'Polygon', coordinates: [[ [-74, 74], [34, 74], [34, 30], [-74, 30], ]], }, }, { type: 'Feature', properties: { name: 'Room 4', square: 288, }, geometry: { type: 'Polygon', coordinates: [[ [40, -26], [94, -26], [94, -74], [40, -74], ]], }, }, ], }; @Injectable() export class Service { getBuildingData(): FeatureCollection { return buildingData; } getRoomsData(): FeatureCollection { return roomsData; } }
<!DOCTYPE html> <html lang="en"> <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=5.0" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/26.1.5/css/dx.light.css" /> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> <script src="https://cdn.jsdelivr.net/npm/zone.js@0.16.2/bundles/zone.umd.js"></script> <script src="./bundle.js" type="module"></script> </body> </html>