×
Namespaces

Variants
Actions

WP7标绘附近建筑

From Nokia Developer Wiki
Jump to: navigation, search
SignpostIcon HereMaps 99.png
SignpostIcon XAML 40.png
SignpostIcon WP7 70px.png
Article Metadata

代码示例
源文件: Media:NearMe.zip

兼容于
文章
翻译:
最后由 hamishwillee 在 17 Jul 2013 编辑

这篇文章展示了如何 在Bing Map上标绘附近建筑。

Contents

简介

使用Bing Maps Silverlight Control我们可以创建有更好的题图体验的Windows Phone应用程序。在这篇文章中,我们将会看到在Windows Phone上使用 Bing Maps Silverlight Control所需步骤,并在地图上绘制图标。首先我们需要使用Windows Live ID从Bing Maps Account Center申请一个账户。当我们的账户被创建时,我们就能从账户中获得KEY并在我们的应用程序中使用。

Windows Phone Windows Phone Windows Phone
Land Mark Category
Pushpin on Landmarks
Land Mark information detail


Bing Maps Bing Maps Bing Maps

目的

我们出于教育的目的,在创建应用程序时将Bing Map和Google Places API结合起来。我们将从Google Places API获得建筑物的坐标并在Bing Map中绘制出来。当用户点击任何一个图标时,将会显示所点击的建筑物的信息并显示它与用户当前位置的距离。

实现

让我们利用Windows Phone Application模板来创建一个WP7项目。我们在MainPage.xaml中使用WP7 ListBox控件制作一系列路标。当用户点击点击任何列表项目,MainPage.xaml.cs类中的Menu_SelectionChanged事件处理程序将被调用。当加载地图后,首先我们使用GeoCoordinateWatcher:: StatusChanged事件来检查是否有能力来提供位置更新,然后检查用户的位置并用GeoCoordinateWatcher:: PositionChanged事件来改变。

void myStatusChanged(GeoPositionStatusChangedEventArgs e)
{
switch (e.Status)
{
case GeoPositionStatus.Disabled:
 
progressBar.IsIndeterminate = false;
progressBar.Visibility = Visibility.Collapsed;
MessageBox.Show("location is unsupported on this device");
break;
case GeoPositionStatus.Initializing:
 
break;
case GeoPositionStatus.NoData:
 
progressBar.IsIndeterminate = false;
progressBar.Visibility = Visibility.Collapsed;
MessageBox.Show("data unavailable");
break;
case GeoPositionStatus.Ready:
 
break;
}
}//end of funt


void myPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
{
latitude = e.Position.Location.Latitude;
longitude = e.Position.Location.Longitude;
 
LoadLandMarkList();
}//end of funt

LoadLandMarkList()方法下载并解析从Google Places API中获得的XML data。在那里我们获得每一个路标的Name, Address, LatitudeLongitude。我们计算路标的总数并将每一个路标绘制在Bing Map上。

for (int i = 0; i < LandMarkCount; i++)
{
RssLandMark st = LandMarkPositionArray.GetValue(i) as RssLandMark;
Pushpin landMark = new Pushpin();
landMark.Location = new GeoCoordinate(Convert.ToDouble(st.latitude), Convert.ToDouble(st.longitude));
 
 
if (st.name.Length > 8)
{
 
LandMarkTitle = st.name.Substring(0, 8) + "..";
}
 
 
landMark.Foreground = new SolidColorBrush(Colors.Black);
landMark.Background = new SolidColorBrush(Colors.Orange);
landMark.Content = LandMarkTitle;
landMark.FontSize = 21;
landMark.Opacity = .9;
landMark.Tag = i + "";
landMark.Tap += new EventHandler<System.Windows.Input.GestureEventArgs>(showandMarkDetails_Completed);
 
map1.Children.Add(landMark);
}

当用户点击任何一个图标时,我们调用EventHandler来显示建筑物的地址并显示建筑物与用户的距离。

void showandMarkDetails_Completed(object sender, System.Windows.Input.GestureEventArgs e)
{
int id = Convert.ToInt32((sender as Pushpin).Tag);
RssLandMark st = LandMarkPositionArray.GetValue(id) as RssLandMark;
 
 
title_txt.Text = st.name;
address_txt.Text = st.address;
dist_txt.Text = "You are around " + calcutaleDistance(latitude, longitude, Convert.ToDouble(st.latitude), Convert.ToDouble(st.longitude)) + " away";
 
 
popup.Visibility = Visibility.Visible;
bg.Visibility = Visibility.Visible;
 
}//end of funt

calcutaleDistance()方法被调用来计算建筑物与用户之间的距离。

public static string calcutaleDistance(double ulat, double ulon, double lat, double lon)
{
var sCoord = new GeoCoordinate(ulat, ulon);
var eCoord = new GeoCoordinate(lat, lon);
 
var R = 6371;
double lat1 = (sCoord.Latitude) / 180 * Math.PI;
double lat2 = (eCoord.Latitude) / 180 * Math.PI;
 
double lng1 = (sCoord.Longitude) / 180 * Math.PI;
double lng2 = (eCoord.Longitude) / 180 * Math.PI;
 
double dlng = lng2 - lng1;
double dlat = lat2 - lat1;
 
var a = Math.Pow(Math.Sin(dlat / 2), 2) + Math.Cos(lat1) *
Math.Cos(lat2) * Math.Pow(Math.Sin(dlng / 2), 2);
var c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
 
var d = R * c;
 
return (String.Format("{0:0.00}", d) + " km");
}//end of funt

我们添加一个应用条来改变Bing Map视图模式。

private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
//备忘录:改变地图的视图模式
if (map1.Mode is AerialMode)
{
map1.Mode = new RoadMode();
}
else
{
map1.Mode = new AerialMode(true);
}
}//end of funt

概要

这是一个基本的Bing Map操作,在MSDN上有关Bing Map的资源很多。我在这里发现了一个。但是这篇文章显示了怎样简单并灵活的使用Bing Map Controls。我也试图在Qt SDK上创建相同的应用程序来为Nokia显示地图,这样我们可以学习在这两个平台上技术方面的相同点和不同点。

源代码

完整的源代码实例可在如下网站获得:File:NearMe.zip

This page was last modified on 17 July 2013, at 09:43.
77 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×