React 複数のシェイプ ファイルのバインドとオーバーレイ

    Ignite UI for React マップでは、複数の地理的シリーズオブジェクトを追加して、複数のシェープファイルを地理空間データでオーバーレイすることができます。たとえば、港湾の地理的位置をプロットするための IgrGeographicSymbolSeries、港湾間のルートをプロットするための IgrGeographicPolylineSeries、国の形状をプロットするための IgrGeographicShapeSeries などがあります。

    React 複数のシェイプ ファイルのバインドとオーバーレイの例

    このトピックでは、マップ コンポーネントに複数の地理的シリーズを表示する方法について段階的に説明します。すべての地理的シリーズは、IgrShapeDataSource クラスを使用して形状ファイルからロードされた地理空間データに従ってプロットします。IgrShapeDataSource オブジェクトの詳細については、シェープ ファイルのバインディングのトピックを参照してください。

    目的のデータをプロットするために、地理的シリーズを上記の組み合わせまたは他の組み合わせで使用できます。

    コンポーネントのインポート

    まず、必要なコンポーネントとモジュールをインポートします。

    import { IgrGeographicMapModule } from 'igniteui-react-maps';
    import { IgrGeographicMap } from 'igniteui-react-maps';
    import { IgrGeographicShapeSeries } from 'igniteui-react-maps';
    import { IgrGeographicPolylineSeries } from 'igniteui-react-maps';
    import { IgrGeographicSymbolSeries } from 'igniteui-react-maps';
    import { IgrDataChartInteractivityModule } from 'igniteui-react-charts';
    import { IgrDataContext } from 'igniteui-react-core';
    import { IgrShapeDataSource } from 'igniteui-react-core';
    
    IgrGeographicMapModule.register();
    IgrDataChartInteractivityModule.register();
    

    シリーズの作成

    次に、後で異なるタイプのシェープ ファイルをロードする地理的シリーズでマップを作成します。

    public render() {
        return (
            <IgrGeographicMap
                width="100%"
                height="100%"
                zoomable="true" >
                <IgrGeographicShapeSeries
                    name="polygonSeries"
                    dataSource={this.state.polygons}
                    shapeMemberPath="points"
                    shapeFill="rgb(150, 150, 150)"
                    shapeStroke="Black"
                    shapeStrokeThickness={1.0} />
                <IgrGeographicPolylineSeries
                    name="lineSeries"
                    dataSource={this.state.polylines}
                    shapeMemberPath="points"
                    shapeStroke="rgba(147, 15, 180, 0.5)"
                    thickness={3.0}  />
                <IgrGeographicSymbolSeries
                    name="symbolSeries"
                    dataSource={this.state.locations}
                    longitudeMemberPath="longitude"
                    latitudeMemberPath="latitude"
                    markerType="Circle"
                    markerOutline="rgb(2, 102, 196)"
                    markerBrush="White" />
            </IgrGeographicMap>
        );
    }
    

    シェープファイルの読み込み

    次に、ページのコンストラクターで、地理マップコンポーネントに表示する各シェープファイルの IgrShapeDataSource を追加します。

    const sdsPolygons = new IgrShapeDataSource();
    sdsPolygons.importCompleted = this.onPolygonsLoaded;
    sdsPolygons.shapefileSource = url + "/shapes/WorldCountries.shp";
    sdsPolygons.databaseSource  = url + "/shapes/WorldCountries.dbf";
    sdsPolygons.dataBind();
    const sdsPolylines = new IgrShapeDataSource();
    sdsPolylines.importCompleted = this.onPolylinesLoaded;
    sdsPolylines.shapefileSource = url + "/shapes/WorldConnections.shp";
    sdsPolylines.databaseSource  = url + "/shapes/WorldConnections.dbf";
    sdsPolylines.dataBind();
    const sdsLocations = new IgrShapeDataSource();
    sdsLocations.importCompleted = this.onPointsLoaded;
    sdsLocations.shapefileSource = url + "/Shapes/WorldCities.shp";
    sdsLocations.databaseSource  = url + "/Shapes/WorldCities.dbf";
    sdsLocations.dataBind();
    

    ポリゴンの処理

    世界の国々の IgrShapeDataSource に読み込まれた形状データを処理し、IgrGeographicShapeSeries オブジェクトに割り当てます。

    import { IgrGeographicShapeSeries } from 'igniteui-react-maps';
    import { IgrShapeDataSource } from 'igniteui-react-core';
    // ...
    public onPolygonsLoaded(sds: IgrShapeDataSource, 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);
        };
    
        const shapeSeries = this.geoMap.series[0] as IgrGeographicShapeSeries;
        shapeSeries.dataSource = geoPolygons;
    }
    

    ポリラインの処理

    IgrShapeDataSource に読み込まれた形状データを処理し、主要都市間の通信ルートを使用して、IgrGeographicPolylineSeries オブジェクトに割り当てます。

    import { IgrGeographicPolylineSeries } from 'igniteui-react-maps';
    import { IgrShapeDataSource } from 'igniteui-react-core';
    // ...
    public onPolylinesLoaded(sds: IgrShapeDataSource, 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);
        }
        const lineSeries = this.geoMap.series[1] as IgrGeographicPolylineSeries;
        lineSeries.dataSource = geoPolylines;
    }
    

    ポイントの処理

    IgrShapeDataSource に読み込まれた世界各国の形状データを処理し、IgrGeographicSymbolSeries オブジェクトに割り当てます。

    import { IgrGeographicSymbolSeries } from 'igniteui-react-maps';
    import { MarkerType } from 'igniteui-react-charts';
    // ...
    public onPointsLoaded(sds: IgrShapeDataSource, 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);
            }
        }
        const symbolSeries = this.geoMap.series[2] as IgrGeographicSymbolSeries;
        symbolSeries.dataSource = geoLocations;
    }
    

    マップ背景

    また形状ファイルがアプリケーションのために十分な地理的文脈 (国の形状など) を提供した際に、地図背景コンテンツで地理的画像を非表示にしたい場合があります。

    public geoMap: IgrGeographicMapComponent;
    // ...
    
    this.geoMap.backgroundContent = {};
    

    概要

    上記すべてのコード スニペットを以下のコード ブロックにまとめて、プロジェクトに簡単にコピーできます。

    import * as React from "react";
    import "../styles.css";
    import "./GeoMapStyles.css";
    import DataUtils from "../../utilities/DataUtils"
    import WorldUtils from "../../utilities/WorldUtils"
    
    import { IgrGeographicMapImagery } from 'igniteui-react-maps';
    import { IgrGeographicMapModule } from 'igniteui-react-maps';
    import { IgrGeographicMap } from 'igniteui-react-maps';
    import { IgrGeographicShapeSeries } from 'igniteui-react-maps';
    import { IgrGeographicPolylineSeries } from 'igniteui-react-maps';
    import { IgrGeographicSymbolSeries } from 'igniteui-react-maps';
    import { IgrDataChartInteractivityModule } from 'igniteui-react-charts';
    import { IgrDataContext } from 'igniteui-react-core';
    import { IgrShapeDataSource } from 'igniteui-react-core';
    
    IgrGeographicMapModule.register();
    IgrDataChartInteractivityModule.register();
    
    export default class MapBindingMultipleShapes extends React.Component<any,any> {
    
        public geoMap: IgrGeographicMap;
    
        constructor(props: any) {
            super(props);
    
            this.onMapReferenced = this.onMapReferenced.bind(this);
            this.onPointsLoaded = this.onPointsLoaded.bind(this);
            this.onPolylinesLoaded = this.onPolylinesLoaded.bind(this);
            this.onPolygonsLoaded = this.onPolygonsLoaded.bind(this);
    
            this.state = { locations: [], polylines: [], polygons: []}
        }
    
        public render() {
            const mapStyle = { background: "rgb(212, 212, 212)" } as React.CSSProperties;
    
            return (
                <div className="sampleRoot">
                    <div className="map" style={mapStyle} >
                        <IgrGeographicMap
                            ref={this.onMapReferenced}
                            width="100%"
                            height="100%"
                            zoomable="true" >
                            <IgrGeographicShapeSeries
                                name="polygonSeries"
                                dataSource={this.state.polygons}
                                shapeMemberPath="points"
                                shapeFill="rgb(150, 150, 150)"
                                shapeStroke="Black"
                                shapeStrokeThickness={1.0} />
                            <IgrGeographicPolylineSeries
                                  name="lineSeries"
                                 dataSource={this.state.polylines}
                                 shapeMemberPath="points"
                                 shapeStroke="rgba(147, 15, 180, 0.5)"
                                 thickness={3.0}  />
                            <IgrGeographicSymbolSeries
                                name="symbolSeries"
                                dataSource={this.state.locations}
                                longitudeMemberPath="longitude"
                                latitudeMemberPath="latitude"
                                markerType="Circle"
                                markerOutline="rgb(2, 102, 196)"
                                markerBrush="White" />
                       </IgrGeographicMap>
                    </div>
                </div>
            );
        }
    
        public onMapReferenced(map: IgrGeographicMap) {
            this.geoMap = map;
            this.geoMap.backgroundContent = undefined;
            this.geoMap.windowRect = { left: 0.2, top: 0.1, width: 0.6, height: 0.6 };
    
            console.log("series.count " + this.geoMap.series.count);
            console.log("actualSeries.length " + this.geoMap.actualSeries.length);
    
            this.geoMap.actualSeries[0].tooltipTemplate = this.getPolygonsTooltip;
            this.geoMap.actualSeries[1].tooltipTemplate = this.getPolylinesTooltip;
            this.geoMap.actualSeries[2].tooltipTemplate = this.getPointTooltip;
    
            const url = DataUtils.getPublicURL();
            // loading a shapefile with geographic polygons
            const sdsPolygons = new IgrShapeDataSource();
            sdsPolygons.importCompleted = this.onPolygonsLoaded;
            sdsPolygons.shapefileSource = url + "/shapes/WorldCountries.shp";
            sdsPolygons.databaseSource  = url + "/shapes/WorldCountries.dbf";
            sdsPolygons.dataBind();
    
            const sdsPolylines = new IgrShapeDataSource();
            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 IgrShapeDataSource();
            sdsPoints.importCompleted = this.onPointsLoaded;
            sdsPoints.shapefileSource = url + "/Shapes/WorldCities.shp";
            sdsPoints.databaseSource  = url + "/Shapes/WorldCities.dbf";
            sdsPoints.dataBind();
        }
    
        public onPointsLoaded(sds: IgrShapeDataSource, e: any) {
    
            const geoLocations: any[] = [];
            // parsing shapefile data and creating geo-locations
            for (const record of sds.getPointData()) {
                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);
                }
            }
            this.setState({ locations: geoLocations });
        }
    
        public onPolylinesLoaded(sds: IgrShapeDataSource, e: any) {
            const geoPolylines: any[] = [];
            // parsing shapefile data and creating geo-polygons
            sds.getPointData().forEach(record => {
                // 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);
            });
    
            this.setState({ polylines: geoPolylines });
        }
    
        public onPolygonsLoaded(sds: IgrShapeDataSource, e: any) {
            const geoPolygons: any[] = [];
            // parsing shapefile data and creating geo-polygons
            sds.getPointData().forEach(record => {
                // 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);
            });
    
            this.setState({ polygons: geoPolygons });
        }
    }
    

    API リファレンス