SuperMap iClient3D for WebGL を使用してGeoJSONデータでマスク効果を実現

 

一、はじめに

このコードは、3D地理情報可視化プラットフォームで地理的なマスク効果を作成する方法を示します 。GeoJSON形式のデータファイルを読み込むことにより、指定された領域(例えば、東半球と西半球のマスク)のマスクを計算して表示し、正確な座標を使用してその境界を定義します 。

 

二、考え方

具体的な実装手順は以下の通りです 。

  1. GeoJSONデータの読み込み:地理的領域の輪郭データを取得し、それを3D環境で表示可能な形式に変換します 。
  2. 座標変換:地理座標(経度・緯度など)を3D座標系での位置に変換します 。
  3. マスク効果の作成:座標データに基づいて東半球と西半球の領域を定義し、透明または半透明のマテリアルを適用してマスク効果を生成します 。
  4. 境界線の表示:各マスク領域に可視化された境界線を追加し、地図上でより目立たせます 。

三、データ処理

対応する領域の輪郭GeoJSONファイルを取得します。GeoJSONは、地理情報システム(GIS)でよく使用されるファイル形式で、地理的領域の幾何学的形状と属性データが含まれています。公開されている地理データセットを選択するか、要件に応じて領域のGeoJSONファイルをカスタマイズすることができます 。

 

四、フロントエンド読み込みコード

function init(SuperMap3D, scene, viewer) {

  // カメラオブジェクトを取得

  var camera = scene.camera;

 

  // マスクポイントの座標を格納する配列

  const maskpointArray = []

 

  // データファイルを読み込む(GeoJSON形式のデータと仮定)

  $.get('./data/Sample_1.json', function (json)

    const precision = 0.0001; // 精度を設定し、2つの半球の間に重複領域を生成するために使用

 

    // 最初の半球の境界座標を計算(西半球と仮定)

    const hemisphere1Coordinates = [

      -180, -89,   // 左下隅

      0 - precision, -89,  // 右下隅

      0 - precision, 89,   // 右上隅

      -180, 89    // 左上隅

    ];

 

    // 2番目の半球の境界座標を計算(東半球と仮定)

    const hemisphere2Coordinates = [

      0 + precision, -89,  // 左下隅

      180, -89,    // 右下隅

      180, 89,     // 右上隅

      0 + precision, 89    // 左上隅

    ];

 

    // マスクの色と透明度を定義

    const maskMaterial = new SuperMap3D.Color(0.1, 0.2, 0.3, 0.8);

 

    // 最初の半球のマスクエンティティを作成(西半球部分)

    const hemisphere1Mask = viewer.entities.add({

      polygon: {

        // 経度・緯度座標から変換されたポリゴンを使用してマスク領域を表す

        hierarchy: new SuperMap3D.PolygonHierarchy(

          SuperMap3D.Cartesian3.fromDegreesArray(hemisphere1Coordinates)

        ),

        height: 500,

        material: maskMaterial // 定義されたマスクマテリアルを使用

      }

    });

 

    // 読み込まれたGeoJSONデータから座標を抽出

    for (let i = 0; i < json.features[0].geometry.coordinates[0][0].length; i++) {

      // 座標をmaskpointArray配列に追加

      maskpointArray.push(json.features[0].geometry.coordinates[0][0][i][0]);

      maskpointArray.push(json.features[0].geometry.coordinates[0][0][i][1]);

    }

 

    // 経度・緯度から変換された座標からCartesian3オブジェクトを生成

    var maskspoint = SuperMap3D.Cartesian3.fromDegreesArray(maskpointArray);

 

    // 全球座標の境界を定義

    const globalCoordinates = [

      -180, -89,  // 左下隅

      1, -89,     // 右下隅

      1, 89,      // 右上隅

      -180, 89    // 左上隅

    ];

 

    // もう一方の全球座標の境界(東半球部分)

    const globalCoordinates1 = [

      180, 89,    // 左下隅

      -1, 89,     // 右下隅

      -1, -89,    // 右上隅

      180, -89    // 左上隅

    ];

 

    // 2番目の半球のマスクエンティティを作成(東半球部分)

    const hemisphere2Mask = viewer.entities.add({

      polygon: {

        hierarchy: new SuperMap3D.PolygonHierarchy(

          SuperMap3D.Cartesian3.fromDegreesArray(hemisphere2Coordinates),

          [

            {

              positions: maskspoint // ここに切り抜く領域の座標を追加

            }

          ]

        ),

        height: 500,

        material: maskMaterial // 定義されたマスクマテリアルを使用

      }

    });

 

    // マスクマテリアルの表示エラーを避けるために、手動でマテリアルを設定

    hemisphere2Mask.polygon.material = maskMaterial;

 

    // マスク領域の境界を表示するための境界線エンティティを作成

    const line = new SuperMap3D.Entity({

      id: 2,

      polyline: {

        positions: maskspoint, // 先ほど定義したマスク座標を使用

        width: 2, // 境界線の幅を設定

        material: SuperMap3D.Color.fromCssColorString('#6dcdeb') // 境界線の色を設定

      }

    });

 

    // 境界線エンティティをビューに追加

    viewer.entities.add(line);

  });

}

 

五、効果の表示




コメント

このブログの人気の投稿

【GIS初心者向け】国土数値情報、ShapefileとGeoJSONどっちをダウンロードすべき?特徴と使い分けを徹底解説!

伝統漁業の未来を変える宇宙の視点!定置網漁業と衛星データの賢い付き合い方

3分でわかる住所と地番の違い