Azure Maps Web SDK は、データ ソースにデータを格納します。 データ ソースを使用すると、クエリとレンダリングのためのデータ操作が最適化されます。 現在、データ ソースには次の 2 種類があります。
- GeoJSON ソース: GeoJSON 形式の生の場所データをローカルで管理します。 中小規模のデータ セット (数十万以上の図形) に適しています。
- ベクター タイル ソース: マップ タイリング システムに基づいて、現在のマップ ビューのベクター タイルとして書式設定されたデータを読み込みます。 大規模から大規模なデータ セット (数百万または数十億の図形) に最適です。
GeoJSON データ ソース
geoJSON ベースのデータ ソースは、 DataSource クラスを使用してローカルにデータを読み込んで格納します。 geoJSON データは、 atlas.data 名前空間のヘルパー クラスを使用して手動で作成または作成できます。
DataSource クラスは、ローカルまたはリモートの GeoJSON ファイルをインポートする関数を提供します。 リモート GeoJSON ファイルは、COR が有効なエンドポイントでホストされている必要があります。
DataSource クラスは、ポイント データをクラスタリングするための機能を提供します。 また、データは、 DataSource クラスで簡単に追加、削除、および更新できます。 次のコードは、Azure Maps で GeoJSON データを作成する方法を示しています。
//Create raw GeoJSON object.
var rawGeoJson = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-100, 45]
},
"properties": {
"custom-property": "value"
}
};
//Create GeoJSON using helper classes (less error prone and less typing).
var geoJsonClass = new atlas.data.Feature(new atlas.data.Point([-100, 45]), {
"custom-property": "value"
});
作成したデータ ソースは、 map.sources プロパティ ( SourceManager) を使用してマップに追加できます。 次のコードは、 DataSource を作成してマップに追加する方法を示しています。
//Create a data source and add it to the map.
var source = new atlas.source.DataSource();
map.sources.add(source);
次のコードは、geoJSON データを DataSourceに追加するさまざまな方法を示しています。
//GeoJsonData in the following code can be a single or array of GeoJSON features or geometries, a GeoJSON feature collection, or a single or array of atlas.Shape objects.
//Add geoJSON object to data source.
source.add(geoJsonData);
//Load geoJSON data from URL. URL should be on a CORs enabled endpoint.
source.importDataFromUrl(geoJsonUrl);
//Overwrite all data in data source.
source.setShapes(geoJsonData);
ヒント
DataSource内のすべてのデータを上書きするとします。
clear
add関数を呼び出すと、マップが 2 回再レンダリングされ、少し遅延が発生する可能性があります。 代わりに、 setShapes 関数を使用します。この関数は、データ ソース内のすべてのデータを削除して置き換え、マップの再レンダリングを 1 つだけトリガーします。
ベクター タイル ソース
ベクター タイル ソースでは、ベクター タイル レイヤーにアクセスする方法について説明します。 VectorTileSource クラスを使用して、ベクター タイル ソースをインスタンス化します。 ベクター タイル レイヤーはタイル レイヤーに似ていますが、同じではありません。 タイル レイヤーはラスター イメージです。 ベクター タイル レイヤーは、 PBF 形式の圧縮ファイルです。 この圧縮ファイルには、ベクター マップ データと 1 つ以上のレイヤーが含まれています。 ファイルは、各レイヤーのスタイルに基づいて、クライアントでレンダリングおよびスタイル設定できます。 ベクター タイル内のデータには、ポイント、ライン、ポリゴンの形式で地理フィーチャが含まれています。 ラスター タイル レイヤーの代わりにベクター タイル レイヤーを使用する利点はいくつかあります。
- ベクター タイルのファイル サイズは、通常、同等のラスター タイルよりもはるかに小さくなります。 そのため、使用される帯域幅が少なくなります。 これは、待機時間の短縮、マップの高速化、ユーザー エクスペリエンスの向上を意味します。
- ベクター タイルはクライアントにレンダリングされるため、表示されているデバイスの解像度に合わせて調整されます。 その結果、レンダリングされたマップは、明確なラベルを持つ、より明確に定義されているように見えます。
- ベクター マップ内のデータのスタイルを変更する場合、新しいスタイルをクライアントに適用できるため、データを再度ダウンロードする必要はありません。 これに対し、ラスター タイル レイヤーのスタイルを変更するには、通常、サーバーからタイルを読み込み、新しいスタイルを適用する必要があります。
- データはベクター形式で配信されるため、データを準備するために必要なサーバー側の処理が少なくなります。 その結果、新しいデータをより迅速に使用できるようになります。
Azure Maps は、オープン標準である Mapbox ベクター タイル仕様に準拠しています。 Azure Maps は、プラットフォームの一部として次のベクター タイル サービスを提供します。
ヒント
Azure Maps Render サービスのベクターまたはラスター イメージ タイルを Web SDK と共に使用する場合は、 atlas.microsoft.com をプレースホルダー {azMapsDomain}に置き換えることができます。 このプレースホルダーは、マップで使用されているのと同じドメインに置き換えられ、同じ認証の詳細も自動的に追加されます。 これにより、Microsoft Entra 認証を使用する場合のレンダリング サービスでの認証が大幅に簡略化されます。
ベクター タイル ソースのデータをマップに表示するには、ソースをいずれかのデータ レンダリング レイヤーに接続します。 ベクター ソースを使用するすべてのレイヤーで、オプションに sourceLayer 値を指定する必要があります。 次のコードでは、Azure Maps トラフィック フロー ベクター タイル サービスをベクター タイル ソースとして読み込み、ライン レイヤーを使用してマップに表示します。 このベクター タイル ソースには、"トラフィック フロー" と呼ばれるソース レイヤーに 1 つのデータ セットがあります。 このデータ セット内の行データには、色を選択し、線のサイズをスケーリングするためにこのコードで使用される traffic_level というプロパティがあります。
//Create a vector tile source and add it to the map.
var source = new atlas.source.VectorTileSource(null, {
tiles: ['https://{azMapsDomain}/traffic/flow/tile/pbf?api-version=1.0&style=relative&zoom={z}&x={x}&y={y}'],
maxZoom: 22
});
map.sources.add(source);
//Create a layer for traffic flow lines.
var flowLayer = new atlas.layer.LineLayer(source, null, {
//The name of the data layer within the data source to pass into this rendering layer.
sourceLayer: 'Traffic flow',
//Color the roads based on the traffic_level property.
strokeColor: [
'interpolate',
['linear'],
['get', 'traffic_level'],
0, 'red',
0.33, 'orange',
0.66, 'green'
],
//Scale the width of roads based on the traffic_level property.
strokeWidth: [
'interpolate',
['linear'],
['get', 'traffic_level'],
0, 6,
1, 1
]
});
//Add the traffic flow layer below the labels to make the map clearer.
map.layers.add(flowLayer, 'labels');
ベクター タイル ソースのデータをマップに表示する方法の完全な作業サンプルについては、Azure Maps サンプルのベクター タイル ライン レイヤーを参照してください。 このサンプルのソース コードについては、 ベクター タイル ライン レイヤーのサンプル コードを参照してください。
データ ソースをレイヤーに接続する
データは、レンダリング レイヤーを使用してマップ上にレンダリングされます。 1 つ以上のレンダリング レイヤーが 1 つのデータ ソースを参照できます。 次のレンダリング レイヤーには、データ ソースが必要です。
- バブル レイヤー - ポイント データをマップ上の拡大縮小された円としてレンダリングします。
- シンボル レイヤー - ポイント データをアイコンまたはテキストとしてレンダリングします。
- ヒート マップ レイヤー - ポイント データを密度ヒート マップとしてレンダリングします。
- 線レイヤー - 線をレンダリングしたり、多角形のアウトラインをレンダリングしたりします。
- 多角形レイヤー - 多角形の領域を単色またはイメージ パターンで塗りつぶします。
次のコードは、データ ソースを作成し、マップに追加して、バブル レイヤーに接続する方法を示しています。 次に、GeoJSON ポイント データをリモートの場所からデータ ソースにインポートします。
//Create a data source and add it to the map.
var source = new atlas.source.DataSource();
map.sources.add(source);
//Create a layer that defines how to render points in the data source and add it to the map.
map.layers.add(new atlas.layer.BubbleLayer(source));
//Load the earthquake data.
source.importDataFromUrl('https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/significant_month.geojson');
これらのデータ ソースに接続しないレンダリング レイヤーは他にもありますが、レンダリング用のデータを直接読み込みます。
複数のレイヤーを持つ 1 つのデータ ソース
複数のレイヤーを 1 つのデータ ソースに接続できます。 このオプションが役立つさまざまなシナリオがあります。 たとえば、ユーザーが多角形を描画するシナリオを考えてみましょう。 ユーザーがマップにポイントを追加すると、多角形領域をレンダリングして塗りつぶす必要があります。 多角形の輪郭を描くスタイル付きの線を追加すると、ユーザーが描画するときに多角形の端が見やすくなります。 多角形の個々の位置を簡単に編集するために、ピンやマーカーなどのハンドルを各位置の上に追加できます。
ほとんどのマッピング プラットフォームでは、多角形オブジェクト、線オブジェクト、および多角形内の各位置のピンが必要です。 ポリゴンが変更されると、ラインとピンを手動で更新する必要があります。これは、すぐに複雑になる可能性があります。
Azure Maps では、次のコードに示すように、データ ソース内の 1 つの多角形が必要になります。
//Create a data source and add it to the map.
var source = new atlas.source.DataSource();
map.sources.add(source);
//Create a polygon and add it to the data source.
source.add(new atlas.data.Feature(
new atlas.data.Polygon([[[/* Coordinates for polygon */]]]));
//Create a polygon layer to render the filled in area of the polygon.
var polygonLayer = new atlas.layer.PolygonLayer(source, 'myPolygonLayer', {
fillColor: 'rgba(255,165,0,0.2)'
});
//Create a line layer for greater control of rendering the outline of the polygon.
var lineLayer = new atlas.layer.LineLayer(source, 'myLineLayer', {
strokeColor: 'orange',
strokeWidth: 2
});
//Create a bubble layer to render the vertices of the polygon as scaled circles.
var bubbleLayer = new atlas.layer.BubbleLayer(source, 'myBubbleLayer', {
color: 'orange',
radius: 5,
strokeColor: 'white',
strokeWidth: 2
});
//Add all layers to the map.
map.layers.add([polygonLayer, lineLayer, bubbleLayer]);
ヒント
map.layers.add関数を使用してレイヤーをマップに追加する場合、既存のレイヤーの ID またはインスタンスを 2 番目のパラメーターとして渡すことができます。 これにより、既存のレイヤーの下に追加される新しいレイヤーを挿入するようにマップに指示されます。 このメソッドは、レイヤー ID を渡すことに加えて、次の値もサポートしています。
-
"labels"- マップ ラベル レイヤーの下に新しいレイヤーを挿入します。 -
"transit"- マップ道路レイヤーとトランジット レイヤーの下に新しいレイヤーを挿入します。
次のステップ
この記事で使用されるクラスとメソッドの詳細については、以下を参照してください。
マップに追加するその他のコード サンプルについては、次の記事を参照してください。