WindowsPhone上的地图Api 们......

咳咳,有点激动,刚刚还发了一条微博缓和一下气氛。


好的,因为现在手头有个项目需要用到地图和定位,祖哥就下圣旨让我去看看wp上有哪些地图的api,还特意提醒我说wp自带的那个Map控件会有偏移。


1. WP8自带的Map控件

好嘛,你说有偏移,我就查了一下嘛,然后发现说那玩意会偏移的论坛都是101112年的嘛。好嘛,那万一fix掉了呢?

嗯,抱着不装南墙不回头的心态,我开始用上了wp自带的map控件。

在Xaml里加一行xmlns声明:

    xmlns:maps="clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps"

还必须检查 WMAppManifest.xml 文件中的 ID_Cap_Map 功能以使用该控件。

然后可以用Map控件了:

<maps:Map />
太简单?

<maps:Map
                x:Name="LittleMap"
                HorizontalAlignment="Left"
                Margin="10,10,0,0"
                VerticalAlignment="Top"
                Height="587"
                Width="436"
                Center="30,120"
                ZoomLevel="13"
                Pitch="30" />

差不多了- - 好吧说一下比较复杂的那个 Center是地图要显示的中心点,ZoomLevel是缩放等级,数值越大表示精度越高,一共有1-20个等级,Pitch是倾斜度,表示的是你的视线和地面的夹角。

怎样定位呢? 直接来!大家可以随便弄一个button或者在ApplicationBar上弄一个,然后在click函数里(在click函数前加上async关键字)

Geoposition geoposition;
geoposition = await new Geolocator().GetGeopositionAsync();
LittleMap.SetView(geoposition.Coordinate.ToGeoCoordinate(), 13);
首先声明一个Geoposition变量,然后调用异步方法GetGeopositionAsync来获得此时的地理位置,然后调用SetView方法,设置当前显示的界面的中心点,以及缩放度,当然还有别的参数,大家可以随便玩玩。不知道为什么这个获取地理位置的函数特别耗时,要等一段比较明显的时间之后地图的视角才会变到我现在所处的位置。而且!!!!!

这个方法的偏移量很大,不,是灰常大!让人难以接受,我一开始都没找到我单位在哪= = 雅蠛蝶,不好不好。。。

还有一些Map的显示Mode啊什么的大家随便玩玩,反正这个偏移量是伤到我了。

P.S. 这个地图的查询功能还是比较好玩的,大家有兴趣的话可以去MSDN相关页面看一看。

P.P.S 有的网站说需要申请啥Key 然后在Map的一个CredentialsProvider属性上赋值。但是我一没找到那个属性,二不知道申请过Key 之后有啥用(除非你想用Here地图的Launcher API 后面说!)


2.添加Toolkit里关于Map的附加功能

虽然偏移量(不行还得再吐槽一次为什么不能把便宜修好了然后再玩呢?)是有的,但是还是不能阻止我们去继续增加一些小玩意的决心。在Silverlight Toolkit for Windows Phone里有一些针对Map的扩展比较有意思。首先大家先去下载一下这个Toolkit,里面有下载的步骤。安装完成之后我们在xaml里添加一个命名空间:

    xmlns:maptk="clr-namespace:Microsoft.Phone.Maps.Toolkit;assembly=Microsoft.Phone.Controls.Toolkit"

然后重头戏来啦,既然是针对map的扩展,那一定是要放在map里面的,然后就有了下面这段代码:

<maps:Map
                x:Name="LittleMap"
                HorizontalAlignment="Left"
                Margin="10,10,0,0"
                VerticalAlignment="Top"
                Height="587"
                Width="436"
                Center="30,120"
                ZoomLevel="13"
                Pitch="30">
                <maptk:MapExtensions.Children>
                    <maptk:UserLocationMarker
                        x:Name="UserLocationMarker"
                        Visibility="Collapsed" />
                </maptk:MapExtensions.Children>
            </maps:Map>
注意中间<maptk:MapExtensions.Children>和〈/maptk:MapExtensions.Children>之间的东西,他是Toolkit里的一些关于Map的控件,用于在Map上作出一个标记。从代码中我们可以看出只给它起了一个名字,然后设置为不可见。

然后我们在cs代码中写道:

Geoposition geoposition;
            geoposition = await new Geolocator().GetGeopositionAsync();
            this.UserLocationMarker = (UserLocationMarker)this.FindName("UserLocationMarker");
            this.UserLocationMarker.GeoCoordinate = geoposition.Coordinate.ToGeoCoordinate();
            this.UserLocationMarker.Visibility = System.Windows.Visibility.Visible;
            LittleMap.SetView(UserLocationMarker.GeoCoordinate, 13);

在我们上面得到地理位置的代码中添加了三行关于UserLocationMarker的代码,首先根据名字找到这个控件的示例,然后把坐标赋给控件,最后设置为可见,再次定位的时候就可以看到一个标记了。好了,关于Toolkit里面的控件还有许多可以玩的,还有兴趣的话可以看看 Toolkit的Sample,然后点击左边的PhoneToolkitSample8->Samples->MapsSample看看,里面有关于收藏啊显示路线啊什么的其他功能。


3.Here Launcher API

用Lumia的同志们应该都听过Here地图啊Here公交啊什么的,然后Nokia出了一个api,是关于调用这些应用的。比如你想在应用中让用户查询地图的某些功能,可以直接转过去。

好吧,在这个里面要用到之前申请的Application Key 或者说是 ID ,否则就等着Vs报 InvalidOperationException的错吧。


我们可以先在MainPage的构造函数里写一句话

Microsoft.Phone.Maps.MapsSettings.ApplicationContext.ApplicationId = "AkHsf3IMADTUAd7V71u_OH2j-hb54Nh4LtZQmfy8TClnXzd6CopCxmTpgvU3EJuh";

这个ID是真的可以用的!大家拿去玩,反正再过90天这个就不能用了。。。。如果大家拷贝之后发现不能用,看一下这篇文章的发布日期到你看到的日期是不是过了90天。。。 然后可以随便来一个Button写个click函数

var showmap = new ExploremapsShowMapTask
            {
                ViewPort = new LocationRectangle(new GeoCoordinate(60.35, 24.60), new GeoCoordinate(60.25, 24.80))
            };
            showmap.Show();

使用前提是你得有Here地图这个应用,否则先去下一个吧~ 

其他的Launcher大家可以参照Nokia的文档 。这个得要Here应用下载到手机里之后才起作用,没啥意思。


4.高德地图API

好东西!由于这位仁兄向国家申请了某些东西,可以没有偏移地得到地理位置信息!废话不多说,上图!不对- - 上攻略!

首先大家进入这个API的主页,申请一个Key先,一个账号可以申请10个key。然后进入WindowsPhone API,点击左边的相关下载,2.0的开发包是一定要下载的,然后非常重要的一个是开发指南,但是主页上只有一个v1.1的开发指南,坑爹!那到哪去找v2.0的呢?

先点击左边的常见问题,然后看到一大串,然后下面有一个问题:

Q: 我怎么开始使用高德地图Windows Phone API?

A: 您可以通过 开发指南学习如何使用高德地图Windows Phone API。
点之! 隐藏地较深。然后这个教程说的比较详细,我只说几点需要注意的:
a)添加引用时,到底应该添加arm的还是x86的呢?答案是:如果你要在虚拟机里跑,把x86的添加进去;如果要在真机(device)上跑,请添加arm里面的。另外,遵从有winmd添加winmd原则,没有的话再添加对应的dll.
b)教程里说控件的旋转时默认关闭的,但是我什么都没设置进去map之后是可以旋转的,大家可以手动设置能否旋转为false。
c)当大家使用AddMarker的时候也有几点需要注意。一个是要添加对应的图片。如果大家把 这个页面的示例代码下载下来就能拿到里面的Images文件夹。注意在Images前面没有斜杠”/“,另外,当Map刚加载的时候,它的Center是不可读的,如果大家在显示map之后立刻设置AddMarker的话就会报错,解决方法是添加一个事件处理函数处理map的Loaded事件, 当加载完成之后再设置AddMarker,并且要扔到Ui线程里做,具体是:
void amap_Loaded(object sender, RoutedEventArgs e)
        {
            this.Dispatcher.BeginInvoke(() => amap.AddMarker(new AMapMarkerOptions
            {
                IconUri = new Uri("Images/AZURE.png", UriKind.Relative),
                Position = amap.Center
            }));
        }
其他的话,大家随便玩吧。我没有去试往地图里添加点线面体这些东西,所以有可能还有别的问题大家仔细思考一下吧~

5. 合体!
好的!什么叫合体呢?哈哈哈哈哈这个你还不知道就太天真了!!!= = 
咳咳,其实真如我说过Wp自带的map会偏移,而高德地图给的api没有国际化的概念,就是只针对中国用户。所以为了既准确又能兼顾国际用户,我们把这两种方式合起来!
首先从高德获得地理位置信息,然后添加事件响应函数:
AMapGeolocator mylocation = new AMapGeolocator();
            this.UserLocationMarker = (UserLocationMarker)this.FindName("UserLocationMarker");
            mylocation.PositionChanged += mylocation_PositionChanged;
在响应函数里:
this.Dispatcher.BeginInvoke(() =>
            {
                this.UserLocationMarker.GeoCoordinate = new System.Device.Location.GeoCoordinate(args.LngLat.latitude,
                    args.LngLat.longitude);
                this.UserLocationMarker.Visibility = System.Windows.Visibility.Visible;
                LittleMap.SetView(UserLocationMarker.GeoCoordinate, 13);
            });
直接使用args的经纬度来设置Marker的位置,然后调用SetView去显示。完事!
如果你想用高德的Marker也行,反正只要基本地图控件是默认的,地理位置是高德给的,其他的都可以!

好了,就写到这个,大家体会体会吧!









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值