Maps Explorerの例のNokia Maps API

これは、開発者向けのNokia APIのリリースに関する3番目の記事です。

見逃した人のために、ここに最初の2つの部分があります。

Nokia Music API

高度なカメラAPI



今日は、Nokia Maps APIの使用についてお話します。









マップエクスプローラー



Map Explorerは、Windows Phone 7で使用されているBing Mapsの代わりにWindows Phone 8 Maps APIを使用する方法を示すシンプルなSilverlightアプリケーションです。



アプリケーションのメインページには、マップ設定(マップビュー、傾斜、方向)を変更できるボタンとスライダーが含まれています。 より詳細なカメラ設定は、アプリケーション設定メニューで利用できます。 アプリケーションが実証する主な地図作成機能は、地図上の携帯電話の現在位置の受信と表示、キーワードによる検索、特定の地点から目的地までのルートと方向の描画です。



設計



このアプリケーションは、住所の検索、関心のある地点までのルートの計算、地図上での位置決めなど、Windows Phone 8コントロールの機能を1つのウィンドウで示すために作成されています。 画面上のすべてのコントロールを保存すると、パラメーターを変更する際の視覚的な反応をすぐに実演できます。 起動すると、アプリケーションはユーザーの位置データへのアクセスを要求します。 多くの機能は位置データに基づいているため、アプリケーションへのアクセスを許可することをお勧めします。 許可を受け取ると、アプリケーションは要求を発行しなくなります。







要求への応答を受信した後、アプリケーションはスタートページで開きます。 地図作成モード(道路、航空写真、ハイブリッド、地形)、傾斜モード(カスタマイズ可能な地図表示角度)、および方向(特定のルートの方向に地図を向けることができます)で地図パラメーターを直接制御するための要素が含まれています。 センタリングとズームは、ドラッグまたは「ピンチ」で行います。



カードデータに関連付けられたWindows Phone 8の機能へのアクセスは、アプリケーションメニューのボタンを使用して可能です。 「検索」ボタンをクリックすると、データ入力フォームが開きます。 検索条件に一致するオブジェクトが1つ以上見つかった場合、マップはアニメーションによって最初のオブジェクトにシフトされます。 「ルート」ボタンは、ルートを構築する機能を起動し、目的地を入力する必要があります。 メニューを開いて「Directions On」メニュー項目を選択すると、特定の方向をオンにできます。「At the wheel」と「On foot」から選択できる2つの移動モードがあります。

「Find Me」ボタンは、ユーザーの座標の決定を開始します。 データが受信されると、アニメーションマップは現在の場所のポイントに移動します。 アプリケーションの起動時に座標を決定する許可が得られなかった場合、リクエストは再び表示されます。 座標を決定する権限により、検索プロセスが開始されます。



追加の設定はアプリケーションメニューにあり、アトラクション、ハイキングルートの機能、ルートなどのパラメーターの表示を有効にすることができます。 ここで、カードのカラーモードを選択できます:暗い色と明るい色。



アーキテクチャの概要







アーキテクチャの分析



ユーザーインターフェース



ユーザーインターフェイスは、MainPageと、AboutApplication-PhoneApplicationPageから派生した情報で構成されます。 MainPageには、このアプリケーションの地図とすべての地図作成機能が含まれています。



Windows Phone Location API



Windows Phone Location APIは、Windows.Devices.Geolocation名前空間で現在の場所を決定するために使用されます。 ロケーションサービスを使用するには、アプリケーションのWMAppManifest.xmlファイルでID_CAP_LOCATIONを指定する必要があります。



Maps API



新しいWindows Phone 8 Maps APIは、有効なマップコントロール(Microsoft.Phone.Maps.Controls)および関連するマップサービス(Microsoft.Phone.Maps.Services)を提供します。 Maps APIを使用するには、アプリケーションのWMAppManifest.xmlファイルでID_CAP_LOCATIONを指定する必要があります。



マップ設定との直接的な相互作用



次の例が明確に示すように、カードの制御要素の設定との直接的な相互作用は非常に簡単です。 マップの近接度を制御するスライダーは、MainPage.xamlファイルで説明されています。



<Slider x:Name="PitchSlider" ... Minimum="0" Maximum="70" Value="0" ValueChanged="PitchValueChanged"/>
      
      







次に、ValueChangedイベントのイベントハンドラーがMainPage.xaml.csファイルで実行されます。



 using Microsoft.Phone.Maps.Controls; ... public partial class MainPage : PhoneApplicationPage { ... private void PitchValueChanged(object sender, EventArgs e) { if (PitchSlider != null) { MyMap.Pitch = PitchSlider.Value; } } ... }
      
      







現在地の座標を取得する



現在地の座標を取得するのは、Geolocationを非同期で使用するのは非常に簡単です。 場所は特定のポイントではなく、おおよそ、ユーザーインターフェイスに表示できます。 これを行うために、座標は、決定の精度に応じて、地図の上部に半径のある半透明の円の形で表示されます。



 using System.Device.Location; using Windows.Devices.Geolocation; public partial class MainPage : PhoneApplicationPage { ... private GeoCoordinate MyCoordinate = null; private double _accuracy = 0.0; ... private async void GetCurrentCoordinate() { ... Geolocator geolocator = new Geolocator(); geolocator.DesiredAccuracy = PositionAccuracy.High; try { Geoposition currentPosition = await geolocator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(10)); _accuracy = currentPosition.Coordinate.Accuracy; ... Dispatcher.BeginInvoke(() => { MyCoordinate = new GeoCoordinate(currentPosition.Coordinate.Latitude, currentPosition.Coordinate.Longitude); ... }); } catch (Exception ex) { //     –      MessageBox.Show("Current location cannot be obtained. Check that location service is turned on in phone settings."); } ... } ... }
      
      







位置情報を取得する



ReverseGeocodeQueryを使用して、特定の場所に関する情報を要求できます。 マップエクスプローラーでは、マップ上のタグをタッチするとReverseGeocodeQueryが開始されます。 各タグの地理座標は、タグの作成時にタグポリゴン設定に保存されます。



 using using Microsoft.Phone.Maps.Services; public partial class MainPage : PhoneApplicationPage { ... private ReverseGeocodeQuery MyReverseGeocodeQuery = null; ... private void Marker_Click(object sender, EventArgs e) { Polygon p = (Polygon)sender; GeoCoordinate geoCoordinate = (GeoCoordinate)p.Tag; MyReverseGeocodeQuery = new ReverseGeocodeQuery(); MyReverseGeocodeQuery.GeoCoordinate = new GeoCoordinate(geoCoordinate.Latitude, geoCoordinate.Longitude); MyReverseGeocodeQuery.QueryCompleted += ReverseGeocodeQuery_QueryCompleted; MyReverseGeocodeQuery.QueryAsync(); } private void ReverseGeocodeQuery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e) { if (e.Error == null) { if (e.Result.Count > 0) { MapAddress address = e.Result[0].Information.Address; String msgBoxText = ""; ... if (address.Country.Length > 0) msgBoxText += "\n" + address.Country; MessageBox.Show(msgBoxText, AppResources.ApplicationTitle, MessageBoxButton.OK); } ... } } ... }
      
      







地図上のキーワードで検索



GeocodeQueryを使用して、都市や通りの名前など、特定のクエリの場所を見つけることができます。 GeocodeQuery_QueryCompletedイベントハンドラーは、キーワードによる検索時とルートの構築時の両方で呼び出されます。 ルートに関する部分の説明を以下に示します。 GeocodeQueryの結果は、SearchTermクエリに一致するリストです。 各MapLocationには、地図上の場所を配置するためのGeoCoordinateと、名前、説明、およびMapAdressの場所を含む詳細なLocationInformationがあります。



 using Microsoft.Phone.Maps.Services; public partial class MainPage : PhoneApplicationPage { ... private GeoCoordinate MyCoordinate = null; private List<GeoCoordinate> MyCoordinates = new List<GeoCoordinate>(); private GeocodeQuery MyGeocodeQuery = null; private bool _isRouteSearch = false; // True    ,  false ... private void SearchForTerm(String searchTerm) { ... MyGeocodeQuery = new GeocodeQuery(); MyGeocodeQuery.SearchTerm = searchTerm; MyGeocodeQuery.GeoCoordinate = MyCoordinate == null ? new GeoCoordinate(0, 0) : MyCoordinate; MyGeocodeQuery.QueryCompleted += GeocodeQuery_QueryCompleted; MyGeocodeQuery.QueryAsync(); } private void GeocodeQuery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e) { ... if (e.Error == null) { if (e.Result.Count > 0) { if (_isRouteSearch) //        { ... } else //        { //    MyCoordinates     . for (int i = 0; i < e.Result.Count; i++) { MyCoordinates.Add(e.Result[i].GeoCoordinate); } ... } } else { MessageBox.Show("No match found. Narrow your search eg Seattle WA."); } } ... }
      
      







現在地から目的地までのルートを表示する



RouteQueryを使用して、ある地理的地点から別の地点までのルートを取得できます。 クエリは、検索プロセス中にGeocodeQuery_QueryCompletedイベントハンドラーから起動されます。 現在の例では、ルートの作成に2つのポイント(開始と終了)のみを使用しています。 RouteQueryの結果はRoute.MapRouteです。これは、マップコントロールに簡単に適用できる視覚化です。 ルートは2つのウェイポイント間でRouteLegsに分割されます。 各RoutLegには、ルートに沿って実施できる操縦のオプションを表すRouteManeuversのセットがあります。



 public partial class MainPage : PhoneApplicationPage { ... private GeoCoordinate MyCoordinate = null; private List<GeoCoordinate> MyCoordinates = new List<GeoCoordinate>(); private RouteQuery MyRouteQuery = null; private Route MyRoute = null; private MapRoute MyMapRoute = null; private bool _isRouteSearch = false; // True    ,  false private TravelMode _travelMode = TravelMode.Driving; // Travel mode     .... private void GeocodeQuery_QueryCompleted(object sender, QueryCompletedEventArgs<IList<MapLocation>> e) { ... if (e.Error == null) { if (e.Result.Count > 0) { if (_isRouteSearch) //        { //         MyCoordinates.Add(e.Result[0].GeoCoordinate); //         List<GeoCoordinate> routeCoordinates = new List<GeoCoordinate>(); routeCoordinates.Add(MyCoordinate); routeCoordinates.Add(e.Result[0].GeoCoordinate); CalculateRoute(routeCoordinates); } else //        { ... } } ... } ... } private void CalculateRoute(List<GeoCoordinate> route) { ... MyRouteQuery = new RouteQuery(); MyRouteQuery.TravelMode = _travelMode; MyRouteQuery.Waypoints = route; MyRouteQuery.QueryCompleted += RouteQuery_QueryCompleted; MyRouteQuery.QueryAsync(); } private void RouteQuery_QueryCompleted(object sender, QueryCompletedEventArgs<Route> e) { ... if (e.Error == null) { MyRoute = e.Result; MyMapRoute = new MapRoute(MyRoute); MyMap.AddRoute(MyMapRoute); //       List<string> routeInstructions = new List<string>(); foreach (RouteLeg leg in MyRoute.Legs) { for (int i = 0; i < leg.Maneuvers.Count; i++) { RouteManeuver maneuver = leg.Maneuvers[i]; string instructionText = maneuver.InstructionText; ... routeInstructions.Add(instructionText); } } ... } ... } }
      
      







追加情報



マップコントロールおよび追加サービスに関する情報の詳細については、「 マップのガイド」を参照してください。



ダウンロード



Map Explorer v1.0プロジェクト

Map Explorerアプリケーションバイナリファイルv1.0



このアプリケーションはNokia Developer Projectsにあり、常に最新のアクティビティの表示、エラーの報告、コードの表示、質問、またはプロジェクトへの貢献を行うことができます。



All Articles