我正在使用Silverlight上的Bing地图开发一个应用程序。 最近,我被问到需要多长时间才能切换到或支持谷歌地图。
我知道Mapstraction可能是一种方法。但这种迁移有多困难/耗时?我没有找到任何关于此的见证。
还有其他选择吗?理想情况下,应用程序应该支持两个映射。
后来编辑:当然,解决方案应该是跨平台和跨浏览器:)
答案 0 :(得分:2)
我想说你需要考虑两个主要方面 - 技术和法律。
<强>技术强>
从技术角度来看,Bing Maps Silverlight控件是基于Silverlight的(显然!),而Google Maps API是基于Javascript的。 Silverlight和Javascript都在客户端的浏览器中执行,但在那之后,这几乎就是相似之处的结束!
技术完全不同,因此如果您决定创建Google Maps javascript版本以及Bing Maps SL版本,则必须完全重新编码和维护应用程序的两个单独版本。 Mapstraction无济于事,因为它只处理javascript映射提供程序。 (你当然可以使用Bing Maps v7 Javascript控件,但你也必须重新编码才能使用它。)
<强>法律强>
至于法律方面,我建议您查阅Google和Bing的使用条款,您可以分别在http://code.google.com/apis/maps/terms.html和http://www.microsoft.com/maps/product/terms.html访问这些条款。 我不是律师,但我会提请你注意以下几节:
来自Google使用条款:
10.1.1。一般限制。 (a)除通过服务外,无法访问Maps API。您不得通过本服务中提供的技术或方式或Google可能指定的其他明确授权方式访问或使用Maps API或任何内容。例如,您不得通过Maps API之外的接口或通道(包括未记录的Google界面)访问地图图块或图像。
- 这似乎明确禁止ColinE建议的那种使用,这涉及直接从Bing Maps SL击中谷歌的磁贴服务器。
10.2a)没有“包装”。除非获得Google的书面同意,否则您不得为本服务创建或提供“包装”。例如,您不得:(i)在您向他人提供的API中使用或提供服务或内容的任何部分(例如地图图像,地理编码,路线,地点或地形数据);或(ii)创建重新实施或复制Google地图的Maps API实施。
- 这对我来说,除非他们获得明确的许可(他们可能已经做过,我不知道),否则Mapstraction库本身违反了Google的使用条款,因为它提供了一个包装器通过Google的API进行分层。
而且,根据Bing的使用条款:
2i。)你可能不会...... 将Bing Maps Platform或其任何内容与任何其他映射平台集成;
- 目前尚不清楚“整合”的定义究竟是什么,但我肯定会说任何在同一界面中暴露Google地图和Bing地图元素的应用程序都会被整合,因此违反了Bing的使用条款以及Google的。
因此,如果您真的想要基于Google和Bing的地图,那么您将不得不创建和维护两个单独的版本。
答案 1 :(得分:0)
Silverlight Bing Maps控件支持图层的概念,其中每个图层都由TileSource描述:
<map:Map Name="map"
CopyrightVisibility="Collapsed" LogoVisibility="Collapsed" ScaleVisibility="Collapsed"
ZoomLevel="2"
CredentialsProvider="-- YOUR API KEY GOES HERE!!! ---">
<map:Map.Mode>
<mapCore:MercatorMode/>
</map:Map.Mode>
<map:MapTileLayer>
<map:MapTileLayer.TileSources>
<local:GoogleTile/>
</map:MapTileLayer.TileSources>
</map:MapTileLayer>
</map:Map>
TileSource是一个简单的类,它详细说明了源图像的URL格式。例如,以下TileSource可用于在Bing Maps控件中呈现GoogleSky地图:
public class GoogleTile : Microsoft.Phone.Controls.Maps.TileSource
{
public GoogleTile()
{
UriFormat = @"http://mw1.google.com/mw-planetary/sky/skytiles_v1/{0}_{1}_{2}.jpg";
}
public override Uri GetUri(int x, int y, int zoomLevel)
{
if (zoomLevel > 0)
{
var Url = string.Format(UriFormat, x, y, zoomLevel);
return new Uri(Url);
}
return null;
}
}
请参阅以下博文:
http://www.scottlogic.co.uk/blog/colin/2011/02/google-sky-on-windows-phone-7/
因此,为地图提供差异来源非常容易。