地図
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
、初期化が完了し、成功した場合に、入力パラメータを使用して呼び出し元に信号を送ります。 また、AndroidXMapFragment
は MapEngine インスタンスを初期化 し、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()
からAndroidXMapFragment
にMap
関連付けられます。 Map
このクラスは、デジタル形式で世界の仮想モデルを表します。 の主な属性 Map
GeoCoordinate
には、中心、角度(ズーム レベル)、方向( 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.LINEAR
Map.Animation.BOW
Map
、またはアプリが属性設定メソッドで使用されている間にフォアグラウンドに移動した場合、アニメーションが中断され、トランジションが失敗したように見えます。 この現象を回避 Map.Animation.NONE
するには、アニメーションの種類を使用するか、マップが安定するまで待ってから切り替え操作を実行してください。 複数の属性の設定
Map.setCenter(GeoCoordinate point, Animation animation, double level, float orientation, float tilt)
1 つ以上の属性を同時に変更するために提供される拡張 API です。 ズーム レベル、傾き、遠近法は、それぞれ、Map.MOVE_PRESERVE_ZOOM_LEVEL
、Map.MOVE_PRESERVE_ORIENTATION
、Map.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);
カスタムラスタタイルなど、特定の種類のマップ情報を予想どおりに表示する必要がある場合に、投影法モードを設定すると便利です。 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
して、これらのオブジェクトをトリガーできます。 MapRenderListener.onPostDraw(boolean, long)
でください。このメソッドは頻繁に呼び出されます。 歩行者機能
既定では、徒歩でのアクセス機能 ( 階段やエスカレーターなど ) を示すアイコンは地図に表示されません。 マップ ビューに歩行者機能を表示するには、目的のセットのPedestrianFeature
を使用してMap.setPedestrianFeaturesVisible(EnumSet)
メソッドを呼び出します。 機能タイプが有効になっているかどうかを確認するに Map.getPedestrianFeaturesVisible()
は、メソッドを呼び出します。
安全スポット
スピードカメラおよび交通ライトカメラは 、 HERE SDK の安全スポットとしても知られています。 デフォルトでは、安全スポットを示す歩行者機能アイコンは地図に表示されません。 安全スポットを表示するには Map.setSafetySpotsVisible(boolean)
、をに設定 true
します。 安全スポットが有効になっているかどうかを確認する areSafetySpotsVisible()
には、メソッドを呼び出します。
の SafetySpotObject
サブクラスであるを使用 MapProxyObject
すると、マップ上で個々の安全スポットアイコンを選択できます。 各 SafetySpotObject
には、 SafetySpotInfo
カメラの場所およびその他のプロパティを含む、対応するオブジェクトへの参照が含まれています。 マッププロキシオブジェクトの選択の詳細について は、『オブジェクトとインタラクション』を参照してください。