Web Components Vinculando e sobrepondo vários arquivos de forma
No mapa Ignite UI for Web Components, você pode adicionar vários objetos de série geográfica para sobrepor alguns shapefiles com dados geoespaciais. Por exemplo, IgcGeographicSymbolSeriesComponent
para plotar localizações geográficas de portos, para IgcGeographicPolylineSeriesComponent
plotar rotas entre portos e para IgcGeographicShapeSeriesComponent
plotar formas de países.
Web Components Binding and Overlaying Multiple Shape Files Example
Este tópico mostra passo a passo a exibição de várias séries geográficas no componente de mapa. Todas as séries geográficas são plotadas seguindo dados geoespaciais carregados de arquivos de forma usando o IgcShapeDataSource
classe. Consulte o Arquivos de forma de associação para obter mais informações sobre IgcShapeDataSource
objeto.
IgcGeographicSymbolSeriesComponent
– exibe a localização das principais cidadesIgcGeographicPolylineSeriesComponent
– exibe rotas entre os principais portosIgcGeographicShapeSeriesComponent
– exibe formas de países do mundo
Você pode usar a série geográfica acima ou outras combinações para plotar os dados desejados.
Importing Components
Primeiro, vamos importar os componentes e módulos necessários:
import { IgcGeographicMapModule } from 'igniteui-webcomponents-maps';
import { IgcDataChartInteractivityModule } from 'igniteui-webcomponents-charts';
import { IgcGeographicMapComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicShapeSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicPolylineSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicSymbolSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcShapeDataSource } from 'igniteui-webcomponents-core';
import { ModuleManager } from 'igniteui-webcomponents-core';
ModuleManager.register(
IgcDataChartInteractivityModule,
IgcGeographicMapModule
);
Creating Series
Em seguida, precisamos criar um mapa com algumas séries geográficas que posteriormente carregarão diferentes tipos de shapefile.
<igc-geographic-map id="geoMap" width="100%" height="100%" >
<igc-geographic-shape-series
id="polygonSeries"
shape-memberPath="points"
shape-fill="rgb(150, 150, 150)"
shape-stroke="Black"
shape-stroke-thickness="1.0">
</igc-geographic-shape-series>
<igc-geographic-polyline-series
id="lineSeries"
shape-member-path="points"
shape-stroke="rgba(147, 15, 180, 0.5)"
thickness="3.0" >
</igc-geographic-polyline-series>
<igc-geographic-symbol-series
id="symbolSeries"
longitude-member-path="longitude"
latitude-member-path="latitude"
marker-type="Circle"
marker-outline="rgb(2, 102, 196)"
marker-brush="White">
</igc-geographic-symbol-series>
</igc-geographic-map>
Loading Shapefiles
Em seguida, no construtor da página, adicione um IgcShapeDataSource
para cada shapefile que você deseja exibir no componente de mapa geográfico.
const sdsPolygons = new IgcShapeDataSource();
sdsPolygons.importCompleted = this.onPolygonsLoaded;
sdsPolygons.shapefileSource = url + "/shapes/WorldCountries.shp";
sdsPolygons.databaseSource = url + "/shapes/WorldCountries.dbf";
sdsPolygons.dataBind();
const sdsPolylines = new IgcShapeDataSource();
sdsPolylines.importCompleted = this.onPolylinesLoaded;
sdsPolylines.shapefileSource = url + "/shapes/WorldConnections.shp";
sdsPolylines.databaseSource = url + "/shapes/WorldConnections.dbf";
sdsPolylines.dataBind();
const sdsLocations = new IgcShapeDataSource();
sdsLocations.importCompleted = this.onPointsLoaded;
sdsLocations.shapefileSource = url + "/Shapes/WorldCities.shp";
sdsLocations.databaseSource = url + "/Shapes/WorldCities.dbf";
sdsLocations.dataBind();
Processing Polygons
Processe os dados carregados em IgcShapeDataSource
países do mundo e atribua-os ao IgcGeographicShapeSeriesComponent
objeto.
import { IgcGeographicShapeSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcShapeDataSource } from 'igniteui-webcomponents-core';
// ...
public onPolygonsLoaded(sds: IgcShapeDataSource, e: any) {
const geoPolygons: any[] = [];
// parsing shapefile data and creating geo-polygons
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
// using field/column names from .DBF file
const country = {
points: record.points,
name: record.fieldValues.NAME,
gdp: record.fieldValues.GDP,
population: record.fieldValues.POPULATION
};
geoPolygons.push(country);
};
let polygonSeries = (document.getElementById("polygonSeries") as IgcGeographicShapeSeriesComponent);
polygonSeries.dataSource = geoPolygons;
polygonSeries.renderSeries(false);
}
Processing Polyline
O processo molda os dados carregados com IgcShapeDataSource
rotas de comunicação entre as principais cidades e os atribui ao IgcGeographicPolylineSeriesComponent
objeto.
import { IgcGeographicPolylineSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcShapeDataSource } from 'igniteui-webcomponents-core';
// ...
public onPolylinesLoaded(sds: IgcShapeDataSource, e: any) {
const geoPolylines: any[] = [];
// parsing shapefile data and creating geo-polygons
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
// using field/column names from .DBF file
const route = {
points: record.points,
name: record.fieldValues.Name,
capacity: record.fieldValues.CapacityG,
distance: record.fieldValues.DistanceKM,
isOverLand: record.fieldValues.OverLand === 0,
isActive: record.fieldValues.NotLive !== 0,
service: record.fieldValues.InService
};
geoPolylines.push(route);
}
let lineSeries = (document.getElementById("lineSeries") as IgcGeographicPolylineSeriesComponent);
lineSeries.dataSource = geoPolylines;
lineSeries.renderSeries(false);
}
Processing Points
O processo molda os dados carregados com IgcShapeDataSource
locais das principais cidades e os atribui ao IgcGeographicSymbolSeriesComponent
objeto.
import { IgcGeographicSymbolSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcShapeDataSource } from 'igniteui-webcomponents-core';
// ...
public onPointsLoaded(sds: IgcShapeDataSource, e: any) {
const geoLocations: any[] = [];
// parsing shapefile data and creating geo-locations
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
const pop = record.fieldValues.POPULATION;
if (pop > 0) {
// each shapefile record has just one point
const location = {
latitude: record.points[0][0].y,
longitude: record.points[0][0].x,
city: record.fieldValues.NAME,
population: pop
};
geoLocations.push(location);
}
}
let symbolSeries = (document.getElementById("symbolSeries") as IgcGeographicSymbolSeriesComponent);
symbolSeries.dataSource = geoLocations;
symbolSeries.renderSeries(false);
}
Map Background
Além disso, talvez você queira ocultar imagens geográficas do conteúdo de plano de fundo do mapa se seus arquivos de forma fornecerem contexto geográfico suficiente (por exemplo, forma de países) para seu aplicativo.
public geoMap: IgcGeographicMapComponent;
// ...
this.geoMap.backgroundContent = null;
Summary
Para sua conveniência, todos os trechos de código acima são combinados em um bloco de código abaixo que você pode copiar facilmente para seu projeto.
import { SampleBase } from "../../sample-base";
import { AssetsUtils } from "../../../utilities/AssetsUtils";
import { IgcGeographicMapModule } from 'igniteui-webcomponents-maps';
import { IgcDataChartInteractivityModule } from 'igniteui-webcomponents-charts';
import { IgcGeographicMapComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicShapeSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicPolylineSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcGeographicSymbolSeriesComponent } from 'igniteui-webcomponents-maps';
import { IgcShapeDataSource } from 'igniteui-webcomponents-core';
import { ModuleManager } from 'igniteui-webcomponents-core';
ModuleManager.register(
IgcDataChartInteractivityModule,
IgcGeographicMapModule
);
let templateHTML = `
<div class="sample-container" style="background: #aad3df;">
<igc-geographic-map id="geoMap" width="100%" height="100%" >
<igc-geographic-shape-series
id="polygonSeries"
shape-memberPath="points"
shape-fill="rgb(150, 150, 150)"
shape-stroke="Black"
shape-stroke-thickness="1.0">
</igc-geographic-shape-series>
<igc-geographic-polyline-series
id="lineSeries"
shape-member-path="points"
shape-stroke="rgba(147, 15, 180, 0.5)"
thickness="3.0" >
</igc-geographic-polyline-series>
<igc-geographic-symbol-series
id="symbolSeries"
longitude-member-path="longitude"
latitude-member-path="latitude"
marker-type="Circle"
marker-outline="rgb(2, 102, 196)"
marker-brush="White">
</igc-geographic-symbol-series>
</igc-geographic-map>
</div>
`;
export class MapBindingMultipleShapes extends SampleBase {
public static htmlTagName: string = SampleBase.tag("MapBindingMultipleShapes");
public static register(): any {
window.customElements.define(this.htmlTagName, MapBindingMultipleShapes); return this;
}
private geoMap: IgcGeographicMapComponent;
constructor() {
super();
this.onPointsLoaded = this.onPointsLoaded.bind(this);
this.onPolylinesLoaded = this.onPolylinesLoaded.bind(this);
this.onPolygonsLoaded = this.onPolygonsLoaded.bind(this);
}
connectedCallback() {
this.innerHTML = templateHTML;
this.geoMap = document.getElementById("geoMap") as IgcGeographicMapComponent;
this.geoMap.backgroundContent = null;
this.geoMap.windowRect = { left: 0.2, top: 0.1, width: 0.6, height: 0.6 };
const url = AssetsUtils.getAssetsPath();
const sdsPolygons = new IgcShapeDataSource();
sdsPolygons.importCompleted = this.onPolygonsLoaded;
sdsPolygons.shapefileSource = url + "/shapes/WorldCountries.shp";
sdsPolygons.databaseSource = url + "/shapes/WorldCountries.dbf";
sdsPolygons.dataBind();
const sdsPolylines = new IgcShapeDataSource();
sdsPolylines.importCompleted = this.onPolylinesLoaded;
sdsPolylines.shapefileSource = url + "/shapes/WorldCableRoutes.shp";
sdsPolylines.databaseSource = url + "/shapes/WorldCableRoutes.dbf";
sdsPolylines.dataBind();
// // loading a shapefile with geographic points
const sdsPoints = new IgcShapeDataSource();
sdsPoints.importCompleted = this.onPointsLoaded;
sdsPoints.shapefileSource = url + "/shapes/WorldCities.shp";
sdsPoints.databaseSource = url + "/shapes/WorldCities.dbf";
sdsPoints.dataBind();
}
public onPointsLoaded(sds: IgcShapeDataSource, e: any) {
console.log("onPoints");
const geoLocations: any[] = [];
// parsing shapefile data and creating geo-locations
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
const pop = record.fieldValues.POPULATION;
if (pop > 0) {
// each shapefile record has just one point
const location = {
latitude: record.points[0][0].y,
longitude: record.points[0][0].x,
city: record.fieldValues.NAME,
population: pop
};
geoLocations.push(location);
}
}
let symbolSeries = (document.getElementById("symbolSeries") as IgcGeographicSymbolSeriesComponent);
symbolSeries.dataSource = geoLocations;
symbolSeries.renderSeries(false);
}
public onPolylinesLoaded(sds: IgcShapeDataSource, e: any) {
console.log("onPolylines");
const geoPolylines: any[] = [];
// parsing shapefile data and creating geo-polygons
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
// using field/column names from .DBF file
const route = {
points: record.points,
name: record.fieldValues.Name,
capacity: record.fieldValues.CapacityG,
distance: record.fieldValues.DistanceKM,
isOverLand: record.fieldValues.OverLand === 0,
isActive: record.fieldValues.NotLive !== 0,
service: record.fieldValues.InService
};
geoPolylines.push(route);
}
let lineSeries = (document.getElementById("lineSeries") as IgcGeographicPolylineSeriesComponent);
lineSeries.dataSource = geoPolylines;
lineSeries.renderSeries(false);
}
public onPolygonsLoaded(sds: IgcShapeDataSource, e: any) {
console.log("onPolygons ");
const geoPolygons: any[] = [];
// parsing shapefile data and creating geo-polygons
let pointData = sds.getPointData();
for ( let i = 0; i < pointData.length; i++ ) {
let record = pointData[i];
// using field/column names from .DBF file
const country = {
points: record.points,
name: record.fieldValues.NAME,
gdp: record.fieldValues.GDP,
population: record.fieldValues.POPULATION
};
geoPolygons.push(country);
};
let polygonSeries = (document.getElementById("polygonSeries") as IgcGeographicShapeSeriesComponent);
polygonSeries.dataSource = geoPolygons;
polygonSeries.renderSeries(false);
}
}