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.

    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);
        }
    }
    

    API References