ベストプラクティス
この記事では、最適な地図の応答性について、 HERE Maps API for Javascript を最も効率的に使用できるように支援するためのベストプラクティスについて説明します。
アイコンを再利用します
Maps API for JavaScript で H.map.Icon
は、このクラスは再利用可能なビジュアルマップ マーカーを表します。 マップのパフォーマンスを最適化 H.map.Icon
するには、各マーカーに新しいインスタンスを作成する代わりに、できるだけ多くのマーカーオブジェクトでアイコンインスタンスを再利用します。
次のコードは、 icon
新しいマーカーごとに新しいオブジェクトを作成するための非推奨の方法を示しています。
var points = [...],
markers = [];
for (var i = 0; i < points.length; i++) {
markers.push(new H.map.Marker(points[i], {
icon: new H.map.Icon('graphics/markerHouse.png')
}));
}
マーカーごとに新しいicon
オブジェクトを作成する代わりに 、以下に示すように、すべてのH.map.Marker
インスタンスで単一のH.map.Icon
インスタンスを再利用します。
var points = [...],
markers = [],
icon = new H.map.Icon('graphics/markerHouse.png');
for (var i = 0; i < points.length; i++) {
markers.push(new H.map.Marker(points[i], {
icon: icon
}));
}
上記のアプローチにより、パフォーマンスの向上とメモリフットプリントの削減を実現できます。
"onAttach" および "onDetach" コールバックはシンプルにしてください
DomMarker
を使用する場合 は、DomIcon
コンストラクタにオプションonAttach
とonDetach
オプションを渡して、DomIcon
インスタンスを使用するすべてのDomMarkers
ののイベントリスナーを追加できます。
これらのコールバックは DomMarker
、がマップに表示されるたび、またはマップビューポイントから消去されるたびに呼び出されます。 このため、これらのコールバックでは高価な計算を行わないことをお勧めします。そうしないと、マップのパンニングやズームのパフォーマンスが著しく低下する可能性があります。
次の例は、このようなパフォーマンスの低下を引き起こす非推奨のアプローチを示しています。
var domIcon = new H.map.DomIcon(domElement, {
onAttach: function(clonedElement, domIcon, domMarker) {
var defaultButton = clonedElement.querySelector('.btn-default');
var infoButton = clonedElement.querySelector('.btn-info');
defaultButton.addEventListener('click', onDefaultClick);
infoButton.addEventListener('click', onInfoClick);
},
onDetach: function(clonedElement, domIcon, domMarker) {
var defaultButton = clonedElement.querySelector('.btn-default');
var infoButton = clonedElement.querySelector('.btn-info');
defaultButton.removeEventListener('click', onDefaultClick);
infoButton.removeEventListener('click', onInfoClick);
}
});
次 onAttach()/onDetach()
のコードで示されているイベントの委任などの技術を使用して、必要なすべてのアセットを事前に計算するか、または計算をイベントコールバックにオフロードしてください。
function onMarkerClick(e) {
var targetClassName = e.target.className;
if (targetClassName === 'btn-default') {
onDefaultClick(e);
} else if (targetClassName === 'btn-info') {
onInfoClick(e);
}
}
var domIcon = new H.map.DomIcon(domElement, {
onAttach: function(clonedElement, domIcon, domMarker) {
domElement.addEventListener('click', onMarkerClick);
},
onDetach: function(clonedElement, domIcon, domMarker) {
domElement.removeEventListener('click', onMarkerClick);
}
});
"mapviewchange" ではなく "mapviewchangeend" イベントを使用します
これらのイベント mapviewchange
と mapviewchangeend
は似ているようです。どちらもマップのビューポイントに対する変更の処理に使用できますが、その影響は異なります。 mapviewchange
は、ビューポイントの状態を変更するプロセスの各アニメーションステップで呼び出されます。 多くの場合、この操作は過剰です。 たとえば、ユーザーがマップをダブルクリックするたびに、現在のズーム レベルで UI 要素を複数回更新するのは非効率的です。
function displayZoomLevel() {...}
map.addEventListener('mapviewchange', function () {
var zoom = map.getZoom();
displayZoomLevel(zoom);
});
mapviewchangeend
一方、ビューポイントの変更が完了すると、が 1 回だけ呼び出されます。そのため、このイベントを使用してマップビューポイントを更新することをお勧めします。
function displayZoomLevel() {...}
map.addEventListener('mapviewchangeend', function () {
var zoom = map.getZoom();
displayZoomLevel(zoom);
});
mapviewchangeend
イベントはの「デバウンス」バージョン mapviewchange
である mapviewchangeend
ため、原則としてより効率的に使用できます。
組み込みのアニメーション機能を使用します
マップの中心の変更、ズームの変更、またはその両方によって生じるトランジションなど、さまざまなマップ状態間のトランジションをアニメーション化する必要がある場合は、常にマップエンジンの組み込みのアニメーション機能を使用してください。
setZoom()
setCenter()
setViewBounds()
などのインスタンスメソッドをマップ し、 アニメーション化されたトランジションを適用するかどうかを示す 2 番目の引数を受け入れます。
以下のスニペットに示されているように、独自のズームアニメーションを作成しないことをお勧めします。
var currentZoom = map.getZoom();
var endZoom = currentZoom + 3;
function step() {
currentZoom += 0.05;
map.setZoom(currentZoom);
(currentZoom < endZoom) && requestAnimationFrame(step);
}
step();
代わり setZoom()
に、オプションの 2 番目のパラメーターを使用してメソッドを呼び出し、アニメーションを実行します。
map.setZoom(map.getZoom() + 3, true);
"SpatialStyle" インスタンスを読み取り専用オブジェクトとして使用します
のインスタンス SpatialStyle
は、読み取り専用オブジェクトとして使用されます。 プロパティの変更は安全ではありません。また、表示の不整合が生じる可能性があります。
以下のスニペットは 、あるSpatial
オブジェクトを別のオブジェクトSpatialStyle
に再利用する例を示しています。 SpatialStyle
この操作は、オブジェクトを変更しないため有効です。
var style = spatial1.setStyle();
spatial2.setStyle(style);
Spatial
1 つのオブジェクトのスタイルを別のオブジェクトで再利用する場合に、 1 fillColor
つの変更で getStyle
メソッドによって返されたオブジェクトを変更すると、最初の空間の視覚的な表現に決定論的でない結果が生じることがあります。
var style = spatial1.getStyle();
style.fillColor = 'red';
spatial2.setStyle(style);
スタイルを変更する正しい方法は、次 のコード例に示すように、新しいSpatialStyle
オブジェクトを作成するか、または既存のオブジェクトでgetCopy()
メソッドを使用することです。
var style = spatial1.setStyle().getCopy({
fillColor: 'red'
});
spatial2.setStyle(style);
したがって、一般的なルール は、既存のSpatialStyle
オブジェクトを複数回再利用することですが、変更する必要がある場合は、新しいgetCopy()
オブジェクトを使用するか、または作成します。