SDK for Android 開発者ガイド

地図

SDK for Android のコア機能はマップです。 このセクションで説明する主な概念に は、 Androidアプリケーションへのマップの追加、マップによって表示される場所の変更、およびそのさまざまなプロパティが含まれます。 カバーされているクラスには、AndroidXMapFragmentおよびMapが含まれます。AndroidXMapFragmentおよびMapは、モデルがMapで、ビューがAndroidXMapFragmentである Model-View-Controller ( MVC )パターンの一部です。 は AndroidXMapFragment 、標準 の Android Fragment 派生コンポーネントです。 コントローラークラスを作成して、カスタムロジックを使用してすべてのインタラクションを調整できます。

マップをアプリケーションに統合する最初の手順は AndroidXMapFragment 、アプリケーションのビューレイアウトにを挿入することです。 これを行うに は、 Android XML レイアウトファイルに次のようにcom.here.android.mpa.mapping.AndroidXMapFragment追加します。


<!-- Example fragment. This can be integrated and annotated
    like any other android Fragment or View widget -->
<fragment
  class="com.here.android.mpa.mapping.AndroidXMapFragment"
  android:id="@+id/mapfragment"
  android:layout_width="match_parent"
  android:layout_height="match_parent"/>

このAndroidXMapFragmentクラスでは、パン、タップ、ピンチなどのすべてのユーザー操作、 および「マップジェスチャ」に記載されているその他の標準の HERE SDK タッチジェスチャが処理されます。

GitHub での地図統合の例

マップの統合の例については 、https://github.com/heremaps/マップ属性プロジェクトおよびマップレンダリングプロジェクトを参照してください。

AndroidXMapFragment を初期化しています

AndroidXMapFragment がレイアウトに追加された後、フラグメントを初期化する必要があります。 AndroidXMapFragment 初期化は非同期で処理されます。 初期化中に、MapEngineが初期化され、AndroidXMapFragmentに関連付けられている Map のインスタンスが作成されます。 AndroidXMapFragment.init(OnEngineInitListener) このメソッドは OnEngineInitListener 、初期化が完了し、成功した場合に、入力パラメータを使用して呼び出し元に信号を送ります。 また、AndroidXMapFragmentMapEngine インスタンスを初期化 し、AndroidXMapFragmentに関連付けられたMapオブジェクトを作成します。 次のコードは、 Activity が作成されたときの基本的な初期化フローを示しています。


@Override
public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  // Search for the Map Fragment
  final AndroidXMapFragment mapFragment = (AndroidXMapFragment)
     getSupportFragmentManager().findFragmentById(R.id.mapfragment);
  // initialize the Map Fragment and
  // retrieve the map that is associated to the fragment
  mapFragment.init(new OnEngineInitListener() {
    @Override
    public void onEngineInitializationCompleted(
        OnEngineInitListener.Error error) {
      if (error == OnEngineInitListener.Error.NONE) {
        // now the map is ready to be used
        Map map = mapFragment.getMap();
        // ...
      } else {
        System.out.println("ERROR: Cannot initialize AndroidXMapFragment");
      }
    }
  });
}
注 : パフォーマンス上の理由から、Fragment.setRetainInstance(boolean)が true にcom.here.android.mpa.mapping.AndroidXMapFragment設定されているため、Activityが再作成されたとき(たとえば、ズームレベルの変更後)、onCreate(Bundle)が再度呼び出されることはありません。
注 : AndroidXMapFragment このクラスは、 getScreenCapture(OnScreenCaptureListener)現在表示されている AndroidXMapFragment 領域のマップスナップショットを作成するための非同期メソッドを提供します。 スナップショットが作成されると、イベントコールバック OnScreenCaptureListener が発生 android.graphics.Bitmap し、スクリーンショットがオブジェクトとして提供されます。 このスクリーンキャプチャ方法は、ビューが前景にあり、レンダリング中の場合にのみ機能します。 背景または表示のないスクリーンキャプチャが必要な場合 MapOffscreenRendererは、を使用します。

地図を操作しています

AndroidXMapFragmentが初期化されると、AndroidXMapFragment.getMap()からAndroidXMapFragmentMap関連付けられます。 Map このクラスは、デジタル形式で世界の仮想モデルを表します。 の主な属性 MapGeoCoordinateには、中心、角度(ズーム レベル)、方向( Orientation )、および傾き( Tilt )があります。 たとえば、次のコードスニペットは、Map.setCenter(GeoCoordinate, Map.Animation)を使用してカナダのバンクーバーでMapをレンダリングする方法を示しています。


// map fragment has been successfully initialized
...

// now the map is ready to be used
Map map = mapFragment.getMap();

// Set the map center to Vancouver, Canada.
map.setCenter(new GeoCoordinate(49.196261,
  -123.004773), Map.Animation.NONE);
...

前のコードでは、次のようになり

  • GeoCoordinate マップセンターのは new GeoCoordinate(double, double) 、コンストラクタの呼び出しによって作成されます。
  • マップの中心を設定する場合 Map.Animation.NONE 、変更内容をアニメーション化するか、該当するパラメータとして定数を渡してアニメーションを抑制するかを選択できます。

地図の中心、傾き、方向 、ズーム

HERE は Map 、属性の設定および取得の例です。

地図の中央

Mapの中央には、地図を表示するGeoCoordinate場所があります。 Map の中心を再定義する GeoCoordinateことで、を移動できます。

// Move the map to London
map.setCenter(new GeoCoordinate(51.51,-0.11),
  Map.Animation.NONE);

// Get the current center of the Map
GeoCoordinate coordinate = map.getCenter();

ズーム レベル

によって表示される地理的領域のサイズ Map は、ズーム レベルを変更することで制御できます。 ズーム レベルの範囲は getMinZoomLevel()getMaxZoomLevel()で、最小値はワールド全体を表示します。 次のコードでは、ズーム レベルを中央値に設定します。

// Get the maximum, minimum zoom level
double maxZoom = map.getMaxZoomLevel();
double minZoom = map.getMinZoomLevel();

// Set the zoom level to the median (10)
map.setZoomLevel((maxZoom + minZoom)/2);

// Get the zoom level back
double zoom = map.getZoomLevel();

方向

地図は任意の方向に向けることができます。 デフォルトでは、方向は真の北の位置にあります。 次のコードでは、向きを南から上に変更します。

// Rotate 180 degrees
map.setOrientation(180);

// Get the orientation, should be 180
float orientation = map.getOrientation();

傾斜

地図は 3 次元の視点で傾斜およびレンダリングできます。 デフォルトでは、チルトは完全にフラットになっています。 getMinTilt() およびを呼び出して、可能な最小および最大のチルト値を取得できます getMaxTilt()

// Set the tilt to 45 degrees
map.setTilt(45);

// Get the tilt
float tilt = map.getTilt();

アニメーション

マップでは、属性を変更するときに 3 種類のアニメーションがサポートされています。

  • Map.Animation.NONE
  • Map.Animation.LINEAR
  • Map.Animation.BOW

// Move to Vancouver using linear animation
map.setCenter(new GeoCoordinate(49.0,-123.0),
  Map.Animation.LINEAR);
注 : マップのサイズが変更された場合 Map.Animation.LINEARMap.Animation.BOWMap 、またはアプリが属性設定メソッドで使用されている間にフォアグラウンドに移動した場合、アニメーションが中断され、トランジションが失敗したように見えます。 この現象を回避 Map.Animation.NONE するには、アニメーションの種類を使用するか、マップが安定するまで待ってから切り替え操作を実行してください。

複数の属性の設定

Map.setCenter(GeoCoordinate point, Animation animation, double level, float orientation, float tilt) 1 つ以上の属性を同時に変更するために提供される拡張 API です。 ズーム レベル、傾き、遠近法は、それぞれ、Map.MOVE_PRESERVE_ZOOM_LEVELMap.MOVE_PRESERVE_ORIENTATIONMap.MOVE_PRESERVE_TILTを使用して保持および変更できます。

// Move to Vancouver using a bow animation, zoom level 17, 180
//degree orientation and 45 degree tilt
map.setCenter(new GeoCoordinate(49.0,-123.0),
  Map.Animation.BOW, 17.0d, 180, 45);

地図投影モード

デフォルトでは、地図は地球投影法モードに設定されています。 setProjectionMode(Projection) を呼び出し て、メルカトル図法を使用するように変更できます。 例 :
map.setProjectionMode(Map.Projection.MERCATOR);
カスタムラスタタイルなど、特定の種類のマップ情報を予想どおりに表示する必要がある場合に、投影法モードを設定すると便利です。
図 1. 地球儀投影
図 2. メルカトル図法

MapState および Map トランスフォームイベントのリッスン

MapState は、チルト 、方向、ズーム レベル、および中央のマップ属性を組み合わせたオブジェクトです。 アプリケーションは MapState 、を使用して、への更新をリッスンでき OnTransformListenerます。

マップトランスフォームイベントは、 MapState が変更される操作によってトリガーされます。 これらの操作には、ユーザー操作 ( マップジェスチャなど ) 、およびへのプログラム呼び出し Map ( など map.setCenter(GeoCoordinate, MapAnimation)) が含まれます。 onMapTransformStart() メソッドは MapState 変更が開始される前に呼び出され、 onMapTransformEnd(MapState) メソッドは安定 MapState した値に戻った後に呼び出されます。 このため、アニメーション化されたマップ移動イベントや継続的なユーザー操作など、 2 つのコールバックの間にはかなりの時間がかかることがあります。

OnTransformListener 次のコードは、を登録してマップ変換イベントをリッスンする例です。

map.addTransformListener(new OnTransformListener() {
  @Override
  public void onMapTransformStart() {
    // map transform is about to start
  }
  @Override
  public void onMapTransformEnd(MapState mapState) {
    // map transform has come to an end
  }
});
MapState これら 2 つのコールバックの間で変更があったときに UI ウィジェットを更新する必要がある場合は Runnable 、が onMapTransformStart() 呼び出されたときにをトリガーすることをお勧め map.getMapState() します。この方法では、を使用して現在のマップ状態を定期的に確認し( 1 秒あたり 30 フレーム未満)、それに応じて UI ウィジェットを更新します。 これ Runnable は、へのコール時にキャンセルできます onMapTransformEnd(MapState)AndroidHandler を使用 Runnable して、これらのオブジェクトをトリガーできます。
注 : で UI ウィジェットを更新しない MapRenderListener.onPostDraw(boolean, long) でください。このメソッドは頻繁に呼び出されます。

歩行者機能

既定では、徒歩でのアクセス機能 ( 階段やエスカレーターなど ) を示すアイコンは地図に表示されません。 マップ ビューに歩行者機能を表示するには、目的のセットのPedestrianFeatureを使用してMap.setPedestrianFeaturesVisible(EnumSet)メソッドを呼び出します。 機能タイプが有効になっているかどうかを確認するに Map.getPedestrianFeaturesVisible() は、メソッドを呼び出します。

図 3. 歩行者機能アイコン

安全スポット

スピードカメラおよび交通ライトカメラは 、 HERE SDK の安全スポットとしても知られています。 デフォルトでは、安全スポットを示す歩行者機能アイコンは地図に表示されません。 安全スポットを表示するには Map.setSafetySpotsVisible(boolean) 、をに設定 trueします。 安全スポットが有効になっているかどうかを確認する areSafetySpotsVisible() には、メソッドを呼び出します。

SafetySpotObjectサブクラスであるを使用 MapProxyObjectすると、マップ上で個々の安全スポットアイコンを選択できます。 各 SafetySpotObject には、 SafetySpotInfo カメラの場所およびその他のプロパティを含む、対応するオブジェクトへの参照が含まれています。 マッププロキシオブジェクトの選択の詳細について は、『オブジェクトとインタラクション』を参照してください。