Help us shape the 2021 DevExtreme Roadmap. Take our 5 minute survey.
Dismiss
Your search did not match any results.
Vector Map

Floor Plan

Documentation

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

Copy to CodeSandBox
Apply
Reset
<dx-vector-map id="vector-map" [projection]="projection"> <dxo-tooltip [enabled]="true" [customizeTooltip]="customizeTooltip"></dxo-tooltip> <dxi-layer [hoverEnabled]="false" [dataSource]="buildingData" name="building"></dxi-layer> <dxi-layer color="transparent" [dataSource]="roomsData" name="rooms" [borderWidth]="1"> <dxo-label [enabled]="true" dataField="name"></dxo-label> </dxi-layer> </dx-vector-map>
import { NgModule, Component, enableProdMode } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 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/app.component.html', styleUrls: ['app/app.component.css'] }) export class AppComponent { projection: any; roomsData: FeatureCollection; buildingData: FeatureCollection; constructor(service: Service) { this.roomsData = service.getRoomsData(); this.buildingData = service.getBuildingData(); this.projection = { to(coordinates) { return [coordinates[0] / 100, coordinates[1] / 100]; }, from(coordinates) { return [coordinates[0] * 100, coordinates[1] * 100]; } }; } customizeTooltip(arg) { if(arg.layer.name === "rooms") return { text: "Square: " + arg.attribute("square") + " ft&#178" }; } } @NgModule({ imports: [ BrowserModule, DxVectorMapModule ], declarations: [AppComponent], bootstrap: [AppComponent] }) export class AppModule { } platformBrowserDynamic().bootstrapModule(AppModule);
::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[][][]; } let 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] ]] } } ] }; let 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; } }
// In real applications, you should not transpile code in the browser. You can see how to create your own application with Angular and DevExtreme here: // https://js.devexpress.com/Documentation/Guide/Angular_Components/Getting_Started/Create_a_DevExtreme_Application/ System.config({ transpiler: 'ts', typescriptOptions: { module: "system", emitDecoratorMetadata: true, experimentalDecorators: true }, meta: { 'typescript': { "exports": "ts" }, 'devextreme/dist/js/vectormap-data/*': { 'esModule': true }, 'devextreme/localization.js': { "esModule": true } }, paths: { 'npm:': 'https://unpkg.com/' }, map: { 'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js', 'typescript': 'npm:typescript@3.5.3/lib/typescript.js', '@angular': 'npm:@angular', 'tslib': 'npm:tslib@2.1.0/tslib.js', 'rxjs': 'npm:rxjs@6.4.0', 'devextreme/dist/js/vectormap-data': 'js/vectormap-data', 'rrule': 'npm:rrule@2.6.6/dist/es5/rrule.js', 'luxon': 'npm:luxon@1.25.0/build/global/luxon.min.js', 'es6-object-assign': 'npm:es6-object-assign@1.1.0', 'devextreme': 'npm:devextreme@20.2.5', 'jszip': 'npm:jszip@3.5.0/dist/jszip.min.js', 'devextreme-quill': 'npm:devextreme-quill@0.9.8/dist/dx-quill.min.js', 'devexpress-diagram': 'npm:devexpress-diagram@2.0.11', 'devexpress-gantt': 'npm:devexpress-gantt@2.0.18', 'devextreme-angular': 'npm:devextreme-angular@20.2.5', 'preact': 'npm:preact@10.5.11/dist/preact.js', 'preact/hooks': 'npm:preact@10.5.11/hooks/dist/hooks.js' }, packages: { 'app': { main: './app.component.ts', defaultExtension: 'ts' }, 'devextreme': { defaultExtension: 'js' }, 'devextreme/events/utils': { main: 'index' }, 'devextreme/events': { main: 'index' }, 'es6-object-assign': { main: './index.js', defaultExtension: 'js' } }, packageConfigPaths: [ "npm:@angular/*/package.json", "npm:@angular/common/*/package.json", "npm:rxjs/package.json", "npm:rxjs/operators/package.json", "npm:devextreme-angular/*/package.json", "npm:devextreme-angular/ui/*/package.json", "npm:devextreme-angular/package.json", "npm:devexpress-diagram/package.json", "npm:devexpress-gantt/package.json", ] });
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <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/20.2.5/css/dx.common.css" /> <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/20.2.5/css/dx.light.css" /> <script src="https://unpkg.com/core-js@2.4.1/client/shim.min.js"></script> <script src="https://unpkg.com/zone.js@0.10.2/dist/zone.js"></script> <script src="https://unpkg.com/reflect-metadata@0.1.3/Reflect.js"></script> <script src="https://unpkg.com/systemjs@0.21.3/dist/system.js"></script> <script src="config.js"></script> <script> System.import('app').catch(console.error.bind(console)); </script> </head> <body class="dx-viewport"> <div class="demo-container"> <demo-app>Loading...</demo-app> </div> </body> </html>