React ヒート画像の表示

    Ignite UI for React マップ コントロールには、Shape ファイルをタイル シリーズにロードして地理空間データをロードすることにより、IgrShapeDataSource によって生成される ShapeFileRecord を使用して、ヒートマップ画像を表示する機能があります。

    このトピックを読み進めるための前提条件として、シェープ ファイルを地理的データにバインディングをお読みください。

    React ヒート画像の表示の例

    IgrShapeDataSource がそのシェイプ ファイルを読み込むと、そのデータを IgrShapefileRecord オブジェクトに変換します。これらのオブジェクトは、IgrShapeDataSourceGetPointData() メソッドから取得でき、TileGenerator プロパティに割り当てられた IgrHeatTileGeneratorIgrTileGeneratorMapImagery オブジェクトを使用してヒートマップを作成するために使用できます。この IgrTileGeneratorMapImagery は、tileImagery ソースとして IgrGeographicTileSeries で使用できます。

    IgrHeatTileGenerator オブジェクトは、xValuesyValuesvalues の 3 つの値パスを持つように機能します。これらの使用方法の例として、人口に関する情報を持つ形状ファイルの場合、xValues を経度、yValues を緯度、values を人口データとみなすことができます。これらの各プロパティは、number[] を取得します。

    ヒートマップ機能を使用する際の地理的タイルシリーズの表示は、minimumColor プロパティと maximumColor プロパティを IgrHeatTileGeneratorvalues プロパティに割り当てるコレクションの最小値と最大値に対応する色を記述する「rgba」文字列に設定することでカスタマイズできます。これをさらにカスタマイズするには、ジェネレーターの ScaleColors プロパティを設定して、色を説明する文字列のコレクションを含めます。これにより、IgrHeatTileGenerator に、マップに表示される値に使用する色がわかります。blurRadiusmaxBlurRadiususeBlurRadiusAdjustedForZoom プロパティを使用して、ScaleColors コレクション内の色が一緒にぼやける方法をカスタマイズすることもできます。

    IgrHeatTileGenerator は対数スケールも使用できます。これを使用する場合は、useLogarithmicScale プロパティを true に設定できます。

    Web Worker

    また、IgrHeatTileGenerator は、Web Worker が、別のスレッドでシェイプ ファイルからタイル イメージをロードする際の重いリフティングをサポートしています。これにより、ヒートマップ機能を使用する際に地理マップのパフォーマンスが大幅に向上します。ジェネレーターでWebワーカーを使用するには、useWebWorkers プロパティを true に設定し、webWorkerInstance プロパティを Web Worker のインスタンスに設定できます。

    // heatworker.worker.ts
    import { HeatTileGeneratorWebWorker } from 'igniteui-react-core';
    
    let worker: Worker = self as any;
    worker.onmessage = HeatTileGeneratorWebWorker.onmessage;
    HeatTileGeneratorWebWorker.postmessage = postMessageFunction;
    HeatTileGeneratorWebWorker.start();
    function postMessageFunction() {
        self.postMessage.apply(self, Array.prototype.slice.call(arguments));
    }
    export default {} as typeof Worker & (new () => Worker);
    

    依存関係

    import Worker from "./heatworker.worker"
    
    import { IgrGeographicMapImagery } from 'igniteui-react-maps';
    import { IgrHeatTileGenerator } from 'igniteui-react-core';
    import { IgrGeographicMap } from 'igniteui-react-maps';
    import { IgrGeographicMapModule } from 'igniteui-react-maps';
    import { IgrGeographicTileSeries } from 'igniteui-react-maps';
    import { IgrDataChartInteractivityModule } from 'igniteui-react-charts';
    import { IgrTileGeneratorMapImagery } from 'igniteui-react-maps';
    import { IgrShapeDataSource } from 'igniteui-react-core';
    // ...
    IgrDataChartInteractivityModule.register();
    IgrGeographicMapModule.register();
    

    ヒートマップの作成

    以下のコード スニペットは、人口ベースのヒートマップを Ignite UI for React マップ コンポーネントに表示する方法を示しています。

    public map: IgrGeographicMap;
    public tileImagery: IgrTileGeneratorMapImagery = null;
    // ...
    constructor(props: any) {
        super(props);
        this.onMapReferenced = this.onMapReferenced.bind(this);
        this.onDataLoaded = this.onDataLoaded.bind(this);
        this.tileImagery = new IgrTileGeneratorMapImagery();
        this.state = { tileImagery: null }
    }
    
    public onMapReferenced(map: IgrGeographicMap) {
        this.map = map;
    
        const url = process.env.PUBLIC_URL;
        const sds: IgrShapeDataSource = new IgrShapeDataSource();
        sds.importCompleted = this.onDataLoaded;
        sds.shapefileSource = url + "/Shapes/AmericanCities.shp";
        sds.databaseSource  = url + "/Shapes/AmericanCities.dbf";
        sds.dataBind();
    }
    
    public onDataLoaded(sds: IgrShapeDataSource, e: any) {
        let records = sds.getPointData();
        let latArray: number[] = [];
        let lonArray: number[] = [];
        let popArray: number[] = [];
    
        for (let r = 0; r < records.length; r++) {
          let record = records[r];
            for (let j = 0; j < record.points.length; j++) {
                let points = record.points[j];
                for (let k = 0; k < points.length; k++) {
                    latArray.push(points[k].y);
                    lonArray.push(points[k].x);
                }
            }
            let value = parseInt(record.fieldValues["POP2010"], 10);
            if (value >= 0) {
                popArray.push(value);
            } else {
                popArray.push(0);
          }
        }
    
        const gen = new IgrHeatTileGenerator();
        gen.xValues = lonArray;
        gen.yValues = latArray;
        gen.values = popArray;
        gen.blurRadius = 6;
        gen.maxBlurRadius = 20;
        gen.useBlurRadiusAdjustedForZoom = true;
        gen.minimumColor = "rgba(100, 255, 0, 0.4)";
        gen.maximumColor = "rgba(255, 255, 0, 0.95)";
        gen.scaleColors = ["rgba(0, 0, 255, 64)", "rgba(0, 255, 255, 96)", "rgba(0, 255, 0, 160)", "rgba(255, 255, 0, 180)", "rgba(255, 0, 0, 200)"];
        gen.useGlobalMinMax = true;
        gen.useGlobalMinMaxAdjustedForZoom = true;
        gen.useLogarithmicScale = true;
        gen.useWebWorkers = true;
        gen.webWorkerInstance = new Worker();
    
        this.tileImagery.tileGenerator = gen;
        this.setState({ tileImagery: this.tileImagery });
    }
    
    <IgrGeographicMap
        ref={this.onMapReferenced}
        height="100%"
        width="100%" >
        <IgrGeographicTileSeries
            name="heatTiles"
            tileImagery={this.state.tileImagery} />
    </IgrGeographicMap>
    

    API リファレンス