×
Namespaces

Variants
Actions

有诺基亚地图和OpenStreetMap的Bing地图应用程序界面

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

兼容于
文章
翻译:
WS - OtomiiLu
最后由 hamishwillee 在 26 Jun 2013 编辑

本文介绍如何按照Nokia 和OPenStreetMap提供的图片来使用Bing 地图应用程序界面(API).

Contents

说明

地图API能够使用TileSource来提供拼贴图片统一资源标志符。运用它Nokia 地图和OpenStreetMap可以显示拼贴图片。 <mediaplayer>http://www.youtube.com/watch?v=0miGyJapsbg</mediaplayer> OpenStreetMap和Nokia使用可以被Map API运用的Mercator投影技术。Bing Maps Tile System文章介绍这个投影是怎样工作的。 提醒:为了使用Map API你需要Bing Maps 认证:: How to: Use the Bing Maps Silverlight Control for Windows Phone

Mercator 投影和 TileSource

为了使用带有Mecator 投影的地图我们需要设置模式属性到Mecator模式

<phone:PhoneApplicationPage 
...
xmlns:Maps="clr-namespace:Microsoft.Phone.Controls.Maps;assembly=Microsoft.Phone.Controls.Maps"
xmlns:MapsCore="clr-namespace:Microsoft.Phone.Controls.Maps.Core;assembly=Microsoft.Phone.Controls.Maps"
...>
...
<Maps:Map CredentialsProvider="bing map credentials here">
<Maps:Map.Mode>
<MapsCore:MercatorMode ></MapsCore:MercatorMode>
</Maps:Map.Mode>
<Maps:MapTileLayer x:Name="MapLayer">
</Maps:MapTileLayer>
</Maps:Map>
...
</phone:PhoneApplicationPage >

地图:MapTileLayer将用来设置我们的TileSource提供商。 为了创建一个新的TileSource提供商你只需要继承TileSource和重写函数

public virtual Uri GetUri( int x, int y, int zoomLevel)
{x,y} 是平铺坐标
zoomLevel 是拼贴的缩放级别. 

OpenStreetMap 拼贴图片

OpenStreetMap 拼贴资源定位符很简单:

http://OpenStreetMapUrl_base/zoom/x/y.png
	OpenStreetMapUrl_base依赖于你想要使用的服务器. 
	zoom, x 和 y是给予GetUri函数的参数。
	因此你只需要检查是否zoom 的大小被服务器支持
public class OpenSreetMap : TileSource
{
OpenSreetMap()
{
//Uri base of an OpenSTreetMap server
UriFormat = "http://a.tile.openstreetmap.org/{0}/{1}/{2}.png"
}
 
public override Uri GetUri(int x, int y, int zoomLevel)
{
if (zoomLevel > 0 && zoomLevel <= 18)
{
var url = string.Format(UriFormat,
zoomLevel,
x,
y);
 
return new Uri(url);
}
//if zoom level is not supported, return null
return null;
}
}

许多OpenStreetMap服务器提供大量的统一资源定位符来获得拼贴图片。这个可以用作加速拼贴图片加载。例子运用了这种特性。

Nokia地图

首先,你需要使用AppId和Token来使用Nokia 地图。为了创建这些认证,访问http://api.developer.nokia.com/ Nolia地图API静态完整图片提供商。基资源标志符是

"http://m.nok.it/?app_id=" + app_id + "&token=" + token

TIleSource必须给予256x256尺寸的图片统一资源标志符。为了确定尺寸你必须加高和宽属性。

"http://m.nok.it/?app_id=" + app_id + "&token=" + token "&w=256&h=256"

Zoomlevel参数对应于Nokia地图统一标志符的z属性。真的很简单啊!! 不幸的是不是这样。Nokia地图不使用{x,y}坐标。要解决这个问题,你必须使用ctrl属性:地图图片的中心点在{纬度,经度}。要转换{x,y}到{纬度,经度}中心位置,Bing Maps Tile System文章给予了PixelXYToLatLong函数。此函数转换像素位置到{纬度,经度}。一个拼贴的大小为256x256,因此拼贴第一个像素的坐标为{256*X, 256*Y}.就像我们需要以拼贴为中心,我们将转换拼贴像素中心到{纬度,经度}。

public override Uri GetUri(int x, int y, int zoomLevel)
{
if (zoomLevel > 0 && zoomLevel<=20)
{
double latitude = 0;
double longitude = 0;
 
//tile pixel center to {latitude, longitude}
PixelXYToLatLong(256 * x+128, 256 * y +128, zoomLevel, out latitude, out longitude );
...
return new Uri(url);
}
return null;
}

现在我们可以生成Nokia 地图拼贴统一资源标志符!!!

public class Nokia : TileSource
{
 
static string app_id = "your app id";
static string token = "your token";
 
public Nokia()
{
//base uri
UriFormat = "http://m.nok.it/?app_id="+app_id+"&token="+token+"&h=256&w=256"
+"&ctr={0},{1}&z={2}";
}
 
//compute Map size from zoomlevel
public static uint MapSize(int zoomlevel)
{
return (uint)256 << zoomlevel;
}
 
private static double Clip(double n, double minValue, double maxValue)
{
return Math.Min(Math.Max(n, minValue), maxValue);
}
//convert Pixel map position to latitude/longiture
public void PixelXYToLatLong(int pixelX, int pixelY, int levelOfDetail, out double latitude, out double longitude)
{
double mapSize = MapSize(levelOfDetail);
double x = (Clip(pixelX, 0, mapSize - 1) / mapSize) - 0.5;
double y = 0.5 - (Clip(pixelY, 0, mapSize - 1) / mapSize);
 
latitude = 90 - 360 * Math.Atan(Math.Exp(-y * 2 * Math.PI)) / Math.PI;
longitude = 360 * x;
}
 
 
public override Uri GetUri(int x, int y, int zoomLevel)
{
if (zoomLevel > 0 && zoomLevel<=20)
{
 
 
double latitude = 0;
double longitude = 0;
 
PixelXYToLatLong(256 * x+128, 256 * y +128, zoomLevel, out a, out b);
var url = string.Format(UriFormat,
latitude.ToString("#.0000##", CultureInfo.InvariantCulture), //Use English number format
longitude.ToString("#.0000##", CultureInfo.InvariantCulture), //Use English number format
zoomLevel
);
 
return new Uri(url);
}
return null;
}
}

为了改善此拼贴,Nokia Map Api提供商有两个其他的有趣属性: ml :拼贴语言 t :拼贴属性 运用这些属性的例子

生成示例

外部链接

This page was last modified on 26 June 2013, at 09:42.
198 page views in the last 30 days.
×