| HT's profile微软必应地图(Bing Maps, former...PhotosBlogLists | Help |
|
|
November 11 微软发布必应地图SilverLight控件1.0经过数月的CTP预览版本,微软终于发布必应地图SilverLight 1.0版(Bing Maps Silverlight Control Version 1.0)。关于必应地图SilverLight版的好处我就不多费口舌了,总之就是通过RIA(Rich Internet Application)创造下一代LBS位置服务应用。or your grubby, coding hands and vividly, creative minds to start bringing to life the next generation of location-based applications. The Bing Maps Silverlight Control adds stunning aesthetic, unmatched performance and an innovative revolution to an already strong arsenal contained under the Bing Maps Platform’s umbrella. Let’s skip the marketing jazz and go straight for the gusto – what’s in the Bing Maps Silverlight Control v. 1? Enter bullet list…
Holy smokes! This is a lot to digest. Take it all in…. Now, take a breather because we’ve changed the Terms of Use that should put smiles on a lot of faces out there. The changes to the Terms of Use are so big, I’ve decided to write an entire blog entry dedicated just for that, "Bing Maps Terms of Use Changes; Benefit Educators, Not-for-Profits and Developers." Here are some helpful links:
In the mean time, download the .dlls for the Bing Maps Silverlight Map Control. Also, watch the video about what the Bing Maps Silverlight Control means to Microsoft, it’s partners and customers and developers. And, this is only the beginning… 必应地图华丽更新本来我想把标题取的更华丽一些,比如“必应地图革命性的升级”之类的。但是,这次更新离我想象中的还有些距离,至少我之前看到的内部版不完全是这样的,因此姑且算是个过渡版本吧,期待更完美必应地图
不过无论如何,这次升级动作比较大,整体界面风格和之前的版本有了彻底的变化。主要的更新包括以下内容:
November 10 必应地图2.0!今天,必应地图发布2.0版本,将会有很大变化。敬请关注http://maps.bing.com/ 。
我会带来详细介绍。
November 05 必应地图和SilverLight这几天RIA(Rich Internet Application)这个词总不期而遇,想了想万事都有其存在的道理。就好比当许多人还在为第一套房奋斗的时候,一部分人在考虑提高生活质量,比如低密度、高绿化率以及温泉、菜园等外在条件。互联网应用也不例外,当我们通过技术解决了很多基本社会生活需求的时候,我们忍不住考虑一下建设小康型互联网。于是有了Flash,有了SilverLight,有了HTML5。犹如贫困的生活不代表爱情的真谛,朴素的软件界面不代表政府工作的严肃性,为什么我们就不能让工作变得更有意思一些呢。
传统的在线地图几乎千篇一律的采用了JavaScript控件形式,我们必须承认这种革新确实给开发带来了很大的便捷,使普通开发人员不需要拥有GIS背景知识也可以开发一些简单的LBS应用。当微软给出了在线交互式SDK以后,程序开发就变得更简单了,仅需要拷贝、粘贴、替换一些参数。案例、效果、代码一条龙
当微软今年3月推出必应地图SilverLight控件(Bing Maps SL Control)时,当时并没有太大的感触,并且觉得舍弃了三维模型比较可惜(也许将来Bing Maps SL会加上)。但是,随着SilverLight技术的不断发展以及国内开发人员对SilverLight越来越熟悉,基于SilverLight的地图应用也越来越广泛,其中有几个网站给我留下了比较深刻的印象。
1、IDV Solutions,DOD Collaborative GIS
IDV Solutions是微软全球金牌合作伙伴,为必应地图开发了很多解决方案。上图展示的就是IDV其中一个项目DOD Collaborative GIS,国防部协作GIS平台。当发生突发事件时(恐怖分子劫持人质、火宅、交通事故等等),相关部门可以在线协同作战,在必应地图上进行作战方案研究,模拟事故现场,模拟兵力部署,模拟进攻路线等等。必应地图提供的高清晰卫星图可以清楚的展示事件现场的地理形势,而SilverLight提供了良好的页面交互性。用户可以很方便的将各种对象,如飞机、卡车、人员、建筑等,拖拽到地图上。
可以想象,假如配备了这套系统,结合实时视频数据,2008年春节雪灾时温总理就不用亲临现场了,只需要将各部门召集在一起进行网络部署,调动一切可调动的人力物力,制定救灾方案。
2、微软MSN Travel Guide
前一篇文章中已经介绍过微软亚洲研究院开发的旅游指南(Travel Guide),此处重新提出这项应用一方面是因为它很好的结合了必应地图、必应搜索以及SilverLight,另一方面它的思路比较符合我的想法。我一直认为搜索不应当仅仅是上百度或Google查一下某个关键字,然后得到一些网页链接。当温饱型搜索实现以后,我们应该追求小康型搜索。我理解的小康型搜索应该比垂直搜索更进一步,将不同的垂直信息有效整合形成新的解决方案,满足某一类型的需求,比如旅游指南。
Travel Guide做了一个很有益的尝试,如果有一天有人一想到要去旅游首先上Travel Guide搜一下,那时候才是Travel Guide真正成功了。目前看来还有很大一段路要走。一方面,还可以从游客的角度去考虑,一般旅游之前都希望获得哪些信息,需要做什么准备工作等等。另外一方面,在展示方面可以做的更好,比如微软还有PhotoSynth,可以对照片进行智能分析,显示景点全貌;微软有TrueSpace,可以进行三维建模;微软有强大的合作伙伴群体,为微软提供丰富准确的数据,以及与旅游相关的后续服务,诸如酒店预订、机票预订等等。
3、气候管理系统
最近听的另一个比较多的词汇是“数据可视化”。我说朴素的界面不代表政府工作的严肃性,汇报工作不一定只靠格式化的文档和枯燥的数据。采用必应地图,可以使工作更轻松,更有意思,更有效率。这个“气候管理系统”充分利用必应地图和SilverLight的优点,将“数据可视化”理念发挥到极致。这个系统采用了现在比较流行mashup概念,即将不同数据层在基础地图上叠加,比如风图、云图、水量图、雨量图等等。小小的预测一下,这种形式的气候管理系统将成为一个里程碑,成为行业的示范性项目。 微软必应地图赞助Navteq 2010年LBS全球大赛 想挑战吗?有很好的创意?想赢得数十万奖金吗?来参加Navteq的2010年LBS全球大奖赛吧!微软必应地图首次赞助此项赛事。任何对LBS位置业务、移动和互联网有热情的开发人员都可以参与这次盛事,并有机会赢取全球知名公司的投资。你就是下一个LiveCast, Skyhook Wireless 或 Navman – 之前的获奖项目。什么是NAVTEQ LBS Challenge?以下文字摘自NAVTEQ的原文:the NAVTEQ Global LBS Challenge focused on driving the development and visibility of innovative location-based solutions (LBS) for wireless devices. The Global LBS Challenge has become the premier event in the wireless industry and a global symbol of LBS innovation and opportunity. From business applications to sports, travel and security, integrating the accuracy and richness of NAVTEQ digital map data facilitates the discovery of the next wave of LBS using dynamic positioning technology.
NAVTEQ Global LBS大奖赛重点关注无线设备上具有创新性的LBS应用,从体育、旅游到安全等各个领域,结合Navteq丰富准确的地图数据,探索下一代LBS业务。
EMEA - February 14, 2010 – Barcelona, Spain – Mobile World Congress North America – March 30, 2010 – San Jose, USA – Where 2.0 India – April 29, 2010 – New Delhi, India South America – May 25, 2010 – Sao Paolo, Brazil – Geo Summit Asia – June 14, 2010 – Singapore - CommunicAsia 大赛注册地址:http://www.nn4d.com/site/global/market/lbs_challenge/p_lbs_home.jsp。亚洲地区的注册截止日期为2010年3月5日,请大家抓紧时间。 更多关于此次LBS Challenge,请关注微软主页。 October 29 在必应地图SilverLight控件中加载其他地图(Google卫星图等)Tips:在必应地图SilverLight控件(Bing Maps SilverLight Map Control)加载别的地图,例如Google卫星图,Yahoo地图等。
最近一年时不时的考虑微软和Google孰优孰劣的问题,前天的MSN签名也换成Enterprise Microsoft vs Consumer Google,基本上代表了自己的结论。总的来说,两者都是很伟大的公司,伟大的不仅仅是其所拥有的产品和技术这么简单,而是Microsoft和Google所代表的背后所蕴含的人、技术、文化、生态链、对社会的影响等等。相比之下,微软是以做企业客户的思路来经营市场,而Google更像是一个互联网公司,并且更贴近终端用户。因此,Google赢得了更多的口碑。但是现在认为谁更有前途为之尚早,因为到了微软、Google这样级别的企业,影响其成败的不仅仅是产品、技术、用户,而且还有其背后的投资者。
引言这么长一段,小而言之,微软必应地图和谷歌地图这两个全球最有影响力的在线地图,各自都有其优势。例如在中国,Google提供了分辨率还算不错的卫星地图(之所以说还算不错是因为微软在国外提供的卫星地图分辨率最高能够达到0.35米,Google在国内提供的最高分辨率1米),而微软因为某些原因一直没有在国内的必应地图平台上提供卫星地图。但是微软在全球推出了SilverLight地图控件,得到了很多用户的推崇。于是有很多用户,包括我在内,曾经考虑过能否在微软必应地图SilverLight控件中既能够显示全球地图,又能够显示中国道路图,并且最好还能够显示Google卫星地图。本文的目的就是为了实现这个目标。
照例是准备工作,想理解这篇文章的内容,需要先理解前面几篇文章,至少也得多少明白SilverLight地图控件的开发:
1)https://sharepoint.connect.microsoft.com/silverlightmapcontrolctp/iSDK/default.htm 必应地图SilverLight在线交互式SDK 2)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3231.entry 必应地图SilverLight控件的一些参考3)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3241.entry 必应地图SilverLight控件开发入门
4)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3428.entry 必应地图Tile System原理及加载自定义图层
5)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3430.entry 通过必应地图SilverLight控件加载中国地图
理解了第5)篇文章,我们知道在必应地图SilverLight控件上加载别的地图,无非是指定一个目标地图为自定义图层。我们来简单复习一下如何在必应地图SilverLight控件上加载必应中国地图。其基本步骤大致如下:
1、创建一个MapTileLayer对象的实例
2、创建一个Tile Source对象的实例
3、将Tile Source对象实例添加到MapTileLayer实例中
4、将MapTileLayer实例添加到Map
同学们可能注意到,在那篇文章中我主要修改了必应地图SilverLight控件官方给出例子中的tileSourceUri,即:
UriBuilder tileSourceUri = new UriBuilder("http://r3.tiles.ditu.live.com/tiles/{0}.png?g=47");
这段代码的主要作用就是将必应地图图片的URL转换成SilverLight控件所识别Tile Source Uri格式。
其实从本质上来讲,动态的将在线地图图片作为自定义图层加载在必应地图上,其实就是向在线地图发出http request下载图片,然后在客户端做叠加。因此,我们需要考虑的是如何构造这个http request。对于必应地图SilverLight控件应用客户端而言,能够获得的是x、y坐标值及当前放大级别z(zoom level)。
那么我们怎么知道Google卫星地图的url格式呢?万能的httpWatch再次登上舞台,轻而易举的我们就可以分析出其格式如下:
剩下的工作就简单了,重载一下Tile Source对象,申明一个GoogleTileSource类:
public class GoogleTileSource : TileSource
{ public GoogleTileSource() : base("http://khm{0}.google.com/kh/v=47&x={1}&y={2}&z={3}") { } public override Uri GetUri(int x, int y, int zoomLevel)
{ return new Uri(string.Format(this.UriFormat, x % 4, x, y, zoomLevel)); } } 然后按照前面所述的四个步骤添加自定义图层:
public MapTileLayer customTileLayer = new MapTileLayer(); //create a MapTileLayer object instance
public GoogleTileSource gTileSource = new GoogleTileSource(); //create a Tile Source object instance customTileLayer.TileSources.Add(gTileSource); //add tile source to MapTileLayer
myMap.Children.Add(customTileLayer); //add MapTileLayer to Map 这样,我们就可以在必应地图SilverLight控件中叠加显示Google卫星图片了。当然你也可以增加两个按钮,分别控制显示必应地图中文道路图和Google卫星地图。下面附两张demo的截图,显示OpenStreetMap提供的双语道路图,以及Google的卫星地图:
微软必应地图数据更新10月27日,微软必应地图(Bing Maps Global)再次更新了大量地图数据,总计约65TB。此次更新主要集中在爱尔兰、斯堪的纳维亚地区以及珠穆朗玛峰等地。中国区域更新的城市(卫星地图)包括:
内蒙古牙克石市(又是第一次听说的地名),326平方公里;
辽宁锦西,2299平方公里;
山西云冈,1573平方公里;
山东济南,647平方公里;
山西渭南(骊山),591平方公里;
安徽淮南,620平方公里;
江苏江阴,386平方公里;
江苏崇明,349平方公里;
福建漳州,675平方公里;
福建南平,3641平方公里;
登陆http://bingmapsupdates.cloudapp.net/可以查看微软必应地图全球数据更新的情况。 October 13 通过必应地图SilverLight控件显示中国地图鉴于很多朋友问起来如何通过必应地图SilverLight控件(Virtual Earth SilverLight Control,VESL)显示中国地图,我还是简单写一下吧。既要避免违反公司规定,又要让更多的用户使用必应地图,还真是有些矛盾。我继续以地图爱好者的身份,从公开能够获得的参考资料中分析如何实现这一解决方案吧。
以下是一些准备工作,大家可以预习或复习一下。
1)https://sharepoint.connect.microsoft.com/silverlightmapcontrolctp/iSDK/default.htm 必应地图SilverLight在线交互式SDK 2)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3231.entry 必应地图SilverLight控件的一些参考3)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3241.entry 必应地图SilverLight控件开发入门
4)http://acnchen.spaces.live.com/blog/cns!9321DA57338F36BA!3428.entry 必应地图Tile System原理及加载自定义图层
其实,通过必应地图SilverLight控件显示中国地图并没有想象的那么困难,我们先看一下1)交互式SDK中所介绍的一个例子,User Tile Layers-->Add a tile layer using C#。这个例子告诉我们如何将用户自定义图层通过VESL叠加显示在上基础地图上,看到这句话是不是觉得很熟悉?这就是文章4)中所介绍的内容,其原理和本文所要介绍的是一致的。因此,我们直接分析VESL的这个例子代码:
public TutorialAddTileSourceManaged()
{ InitializeComponent(); UriBuilder tileSourceUri = new UriBuilder("http://dev.live.com/virtualearth/sdk/layers/lidar/{0}.png");
if (HtmlPage.Document.DocumentUri.Scheme.Equals(Uri.UriSchemeHttps)) { //For https, change the UriSceheme to https and change it to use the default https port. tileSourceUri.Scheme = Uri.UriSchemeHttps; tileSourceUri.Port = -1; }
tileLayer = new MapTileLayer();
LocationRectTileSource tileSource = new LocationRectTileSource( tileSourceUri.Uri.ToString(), new LocationRect(new Location(48.06282, -122.43773), new Location(47.999973, -122.37490)), new Range<double>(10, 16)); tileLayer.TileSources.Add(tileSource); tileLayer.TileWidth = 256; tileLayer.TileHeight = 256; } 这段代码中我们所需要关心的就是UriBuilder tileSourceUri = new UriBuilder("http://dev.live.com/virtualearth/sdk/layers/lidar/{0}.png");这句代码实现的功能就是初始化自定义图层的Tile Source URL,和4)中所提到的Tile Source基本一个意思。因此,还是老办法,我们用httpWatch。用httpWatch分析任何一个必应地图(中国平台)的例子,发现获取地图tile的URL格式大致如下: 于是,依样画葫芦,把那段代码改成:UriBuilder tileSourceUri = new UriBuilder("http://r3.tiles.ditu.live.com/tiles/{0}.png?g=47");
然后初始化tileSource:
LocationRectTileSource tileSource = new LocationRectTileSource(
tileSourceUri.Uri.ToString(), new LocationRect(new Location(60, 60), new Location(13, 140)), //设置显示叠加图片的区域,随便取两个值把中国区域覆盖 new Range<double>(2, 16)); //设置在哪个地图放大级别显示叠加图片
我要说的是,我们已经可以通过必应地图SilverLight控件显示中国地图了,大家去试一下吧。还是那句话: 需要注意的是,微软并不推荐本文所描述的解决方案,即直接访问tile system。因为微软可能随时更换服务器路径。
另外:大家如果开发了基于SilverLight的地图应用,记得和我联系acnchen@hotmail.com。我希望让微软总部知道中国有很多用户对SilverLight地图控件很感兴趣,这样他们就会考虑直接把中国地图加入产品中,而不需要我们额外做这些工作了。 October 12 在必应地图上加载卫星地图无数次,我不得不向客户解释为什么微软必应地图的中国平台(http://ditu.bing.com)没有卫星地图而全球平台(http://maps.bing.com)有,为什么Google的地图有。其实原因很简单,中国地图相关法律没有明文规定在中国可以发布卫星地图。我常常给大家讲一个逻辑,那就是在中国我们只可以做法律允许的事情,而在国外我们可以做法律没有规定不让做的事情。微软是一个比较保守的公司,因此我们谨慎的遵循国家的法律法规行事。
当然,这篇文章归类于“开发入门”,显然不是为了解释上面的内容。我在这篇文章中介绍如何将必应地图全球平台上的卫星地图叠加显示在中国地图平台上。下面是几篇参考性文章,有助于我们实现本文所需的解决方案:
1)http://msdn.microsoft.com/en-us/library/bb429629.aspx,介绍如何在必应地图上叠加用户自定义图层;
2)http://msdn.microsoft.com/en-us/library/bb544970.aspx,介绍VETileSourceSpecification类的tile source属性的用法,非常重要
3)http://msdn.microsoft.com/en-us/library/bb545006.aspx,进一步介绍必应地图的tile system,我们需要把Bing Maps的卫星地图作为自定义图层叠加在必应地图中国平台上;
4)最后是一个小工具,即httpWatch。
需要注意的是,微软并不推荐本文所描述的解决方案,即直接访问tile system。因为微软可能随时更换服务器路径。
鉴于公司制度,我尽量把微软所公开的资料总结整理一下,以一个地图爱好者的角度探讨本文的解决方案,而避免泄露一些核心的内容。
接下来我们循序渐进分析一下如何在必应地图上加载卫星地图。这里首先用到一个方法:VEMap.AddTileLayer(layerSource, visibleOnLoad);
这个方法很简单,也很容易理解,关键在于其中的layerSource这个输入参数,它是一个VETileSourceSpecification 类,而这个类的一个最重要的属性TileSource,用来指定自定义图片的来源。我们所需要做的就是将卫星地图作为TileSource。
接下来我们使用httpWatch这个小工具,分析任何一个必应地图(访问全球平台)的小例子,发现必应地图卫星图片的请求URL格式大致如下:
回到参考文章2)及3),
TileSource - The tile source contains a URL that points to the servers that are going to host the tiles. There are three place holder variables within this URL.
如果你觉得很难理解上面那段英文的话,那么我告诉你,在将Bing Maps的卫星照片设为自定义图层TileSource时,只需要下面的一段代码: var tileSourceSpec = new VETileSourceSpecification("china", "http://t0.tiles.virtualearth.net/tiles/a%4.png?g=213"); 或者: var tileSourceSpec = new VETileSourceSpecification("china", "http://t%2.tiles.virtualearth.net/tiles/a%4.png?g=213"); 这种形式支持访问多个地图服务器。 上面那段代码中,a%4.png,其中a表示卫星图片(aerial的首字母),当你想调用道路图的时候可以将a改为r。 到此为止,我们已经可以将Bing Maps上的卫星图片叠加在Bing Ditu上了。代码如下: function GetTiles() var tileSourceSpec = new VETileSourceSpecification("china", "http://t%2.tiles.virtualearth.net/tiles/a%4.png?g=213"); map.AddTileLayer(tileSourceSpec, true); 完整代码我就不写了,能够看懂这篇文章的朋友想必对必应地图早有研究,应该知道怎么实现。
看到这儿,有悟性的朋友已经开始琢磨,这种办法完全可以应用到微软的必应地图SilverLight Map Control中。由于必应地图SilverLight Control只能显示英文地图,因此我们可以采用本文中的解决方案,将必应地图中文道路图片叠加显示在英文地图上。就当家庭作业布置给大家吧,过几天我再公布答案。 October 07 必应地图图片系统(Tile System)之二【坐标系和地图图片编码】
为了优化地图系统性能,提高地图下载和显示速度,所有地图都被分割成256 x 256像素大小的正方形小块。由于在每个放大级别下的像素数量都不一样,因此地图图片(Tile)的数量也不一样:
必应地图图片系统(Tile System)之一微软必应地图提供了全球地图,用户可以进行平移、放大或缩小操作。但是我们可曾考虑过,地图系统的后台是怎么工作的?在进行地图操作的时候,我们会发现并不是整个地图一次性加载显示的,而是一块块的小地图分别显示。没错,为了使地图的浏览速度更快,地图交互更流畅,目前包括微软必应地图在内的几乎所有在线电子地图都事先对地图图片(Tile)进行预处理。本文主要描述地图映射、坐标系以及地图Tile编码体系,统称为必应地图图片系统(Bing Maps Tile System)。
【地图映射】
为了使地图看起来是无缝(Seamless)的,并且确保来自不同数据源的卫星照片能够完美的拼接,必须有一个统一的地图映射系统,这就是必应地图所采用的墨卡托映射(Mercator Projection)。在上一篇文章中我们已经简单介绍了Mercator Projection。通过Mercator Projection,整个地球可以展示为如下平面地图:
尽管Mercator Projection会使地球比例尺和某些区域变形,尤其在两极,它还是有不可磨灭的贡献的:
1)首先它是共形映射(Conformal Projection),即保留了物体的原有形状。这在展示卫星照片的时候很重要,因为我们所看到的正方形建筑就应该是正方形的,而不是长方形的。
2)其次它是柱状体映射,即南北极在地图的正下、上方,而东西方向处于地图的正右、左。
由于Mercator Projection在两极附近是趋于无限值得,因此它并没完整展现了整个世界,地图上最高纬度是85.05度。为了简化计算,我们采用球形映射,而不是椭球体形状。虽然采用Mercator Projection只是为了方便展示地图,需要知道的是,这种映射会给Y轴方向带来0.33%的误差。
【精度和比例尺】
为了准确显示地图,除了地图映射我们还需要指定地图精度或者比例尺。在最低地图放大级别(1级),地图是512 x 512像素。每下一个放大级别,地图的高度和宽度分别乘于2:2级是1024 x 1024像素,3级是2048 x 2048像素,4级是4096 x 4096像素,等等。通常而言,地图的宽度和高度可以由以下式子计算得到:
map width = map height = 256 * 2^level pixels 地图精度表示屏幕上每个像素所代表的实际距离,例如精度为10m,表示每个像素代表10m的距离。在每个放大级别(Xoom Level)和不同纬度下,地图的精度都是不同的。假设地球直径为6378137米,地图精度(米/像素)可以由如下式子计算得到
October 06 理解地图的比例和精度国庆赋闲在家,顺手看看几篇文章,拿来翻译并和大家分享一下。今天主要聊聊地图上的比例尺和经纬度。其实我曾经也有这样的问题,我们常常提起说必应地图(Bing Maps)提供的北京地区卫星图片的精度是1m,这到底意味着什么?我们在地图右下角经常看见一个比例尺,又代表什么意思?
我们都知道地球是圆的,确切的说还不是一个规则的全球,而我们每天看的电子地图包括纸质地图是平面的。为了方便,我们必须牺牲一定的精确性,将不规则球体映射成平面,这就是我们现在所看到的最常用的墨卡托映射(Mercator Projection),包括必应地图在内的几乎所有的电子地图都采用Mercator projection。采用Mercator projection的好处就是,假设我们在海上航行,按照罗盘的指示一直往前走,对应在平面地图上也是一条直线,虽然实际上在球体上走的是一个空间曲线。
当然Mercator Projection也会有问题,因为它采用平行的经线和纬线,这意味着经线或纬线上的一度对应的距离是相等的。但是在地球体上,赤道和两极上一度的距离显然是不等的。采用Mercator Projection的好处是它令我们可以更容易绘制和理解地图。
【如何计算分辨率】
地图的分辨率是由纬度、放大级别和常量组成的一个等式。在任何纬度和放大级别,地图精度可以由以下等式表示: Map resolution = 156543.04 meters/pixel * cos(latitude) / (2 ^ zoomlevel) 此处zoomlevel值为1至19之间的整数,latitude为-90至+90。距离两极越近,这个等式的误差越大。这正是Mercator Projection所带来的问题。从这个等式,我们大概可以计算每个放大级别下,屏幕上每个像素所代表的距离比例(赤道上): 需要注意的是,在不同的纬度下,上图的比例是会发生变化的。例如在加拿大多伦多(Toronto,维度43.65),地图放大级别为13,地图精度约为19.11 * cos(43.65)或13.8 meters/pixel。 【如何计算比例尺】 大多数时候,我们更关注地图比例尺,因为我们比较习惯于固定比例的地图,例如1:5000,即地图上1厘米对应地球上50米。为了计算比例尺,你需要知道屏幕分辨率、地图放大级别,以及维度值。并且,我们假设屏幕的分辨率是固定的,在x和y坐标方向是相等的。比例尺计算等式如下: Map scale = 1 : (ScreenRes pixels/inch * 39.37 inches/meter * 156543.04 meters/pixel * cos(latitude) / (2 ^ zoomlevel)) 例如,假设屏幕的分辨率为85/英寸,地图放大级别为13,你可以得到比例尺为1 : 85 * 39.37 * 19.11或1 : 63950。 虽然大多数时候我们不需要自己计算比例尺或地图精度,因为这通常由微软必应地图在后台完成。但是当你在做某些应用开发时可能需要考虑,比如汽车导航或计算距离。 September 24 必应地图讲座webcast微软会不定期的组织必应地图的在线讲座,介绍一些开发入门、不同行业的解决方案,甚至一些合作伙伴的demo等等。遗憾的是整个讲座都是英文的,并且通常时间都安排在回笼觉之前。不过反正是免费的,就当是练习英语听力了,顺便看图说话一下,七七八八的也能猜个大概。
下面是讲座的通告,又可以练习阅读理解了
On October 8, 2009 - the Bing Maps for Enterprise team is conducting a Level 100 webcast focused on Bing Maps as a visualization tool for SharePoint content:
Momentum Webcast: Use Bing Maps with SharePoint Server for a Better View of Your Business
Chris Pendleton will deliver this webcast with Microsoft partners - IDV Solutions, SpeakTech, and Habanero Consulting – who will demonstrate how they have integrated SharePoint and Bing Maps to deliver compelling solutions for their customers.
Please see the attached invitation for you to send to customers & prospects. We would like to invite business and technical decision makers to attend the webcast, showing the benefits of bringing business intelligence to life using Bing Maps with Sharepoint.
The webcast occurs less than two weeks before the upcoming Microsoft SharePoint Conference 2009 (10/19-22, Las Vegas). Chris Pendleton & Eric Waldman are conducting a Bing Maps session at this conference. As a prelude, please encourage your customers to register for this October 8th webcast.
· Yes, this webcast will be available on demand post 10/8 (same link as above) · Yes, the Sharepoint product team is promoting this webcast on their home page under ‘Featured News’. · www.microsoft.com/maps home page has a direct link to register for this webcast
Please let me know if you have further questions. 以上洋文大致可以翻译为:不参加这次讲座,人生就不完整了。 September 22 必应地图(Bing Maps)一些有意思的应用最近看到了一些很有意思的应用,都是基于微软必应地图(Bing Maps)的,和大家分享一下。
1)微软亚洲研究院开发的旅游指南(http://travel.msra.cn/)
这个网站采用了必应地图(Bing Maps)、必应搜索和SilverLight技术,且不说内容如何,界面就非常简洁清新。用户可以根据地点、时间搜索当地的旅游景点,美食小吃,游记攻略,旅游路线,以及酒店预订、车票预订等等。该网站目前还处于测试阶段,值得期待。
2)MapStack(http://www.web-demographics.com:8089/MapLens/)
该网站也是采用了必应地图(Bing Maps)和SilverLight技术,实现了放大镜效果。当用户移动放大镜时,该地区自动放大显示。而且该网站还可以让用户选择叠加不同的地图数据,这对我们开发别的行业应用很有启发。可以在必应地图上显示铁路路网图,河流水文图,甚至历史地图等等。
3)Drawing by SoulSolutions(http://drawing.soulsolutions.com.au/)
这个网站内容很简单,给大家提供了一个很有意思的画多边形区域和折线的方法,大家可以借鉴一下。
4)GeoDemo by SoulSolutions(http://www.minus34.com/geodemo/)
September 07 必应地图API入门讲座之十三:如何在地图上画折线推荐一个不错的网站:http://garzilla.net/vemaps/。介绍了一些必应地图(Bing Maps)的开发例子。
在以前的讲座中曾经介绍过如何在地图上显示一段固定的折线,但是很多时候用户希望通过鼠标在地图上画折线。这个需求有很多应用场景,比如自定义一条驾车路线,或者记录旅游线路等。
在上一篇讲座中介绍了如何在必应地图上加载鼠标事件,即通过鼠标拖拽一个图标。这个讲座我们将继续使用到鼠标事件,并且增加一个键盘响应事件。这个讲座所采用的例子可以实现:用户点击“画线”按钮,开始用鼠标在地图上画折线,按ESC键终止画线。
首先定义几个变量:
var polyline = null; //所要画的折线
var polylineMask = null; //画折线过程中临时产生的虚线 var points = new Array(); // var maskPoints = new Array(new VELatLong(0, 0), new VELatLong(0, 0)); // var drawing = false; //状态指示(布尔类型) 在这个例子中,我们用到三个事件:
// Attach the event handlers to the mouse
myMap.AttachEvent("onmousedown", mouseDownHandler); myMap.AttachEvent("onmousemove", mouseMoveHandler); myMap.AttachEvent("onkeypress", keyPressHandler); 如果想了解必应地图事件的详细资料,请访问http://msdn.microsoft.com/en-us/library/bb412543.aspx。
然后定义一个画折线的函数,当用户点击“画线”按钮的时候调用这个函数:
function startDrawing() {
if (polyline && !drawing) //判断polyline已经存在并且是否处于画线状态,确保将以前画的折线清除 { map.DeleteShape(polyline); polyline = null; points.length = 0; } map.vemapcontrol.EnableGeoCommunity(true); //关闭原有的地图鼠标响应功能
drawing = true; //设置进入画线状态 document.getElementById("myMap").style.cursor = 'crosshair'; //改变鼠标形状,画折线时鼠标变为十字形 document.getElementById("draw").value = 'Press ESC to exit drawing mode'; //改变按钮所显示的文字 document.getElementById("draw").disabled = true; //设置“画线”按钮不可按 } 此时进入画线状态。如果点击的是折线的第一个端点,则只需要记录改点位置;否则,画出当前点与最近一次点击的点之间的线段。定义鼠标左键按下功能的具体实现:
function mouseDownHandler(e) {
if (drawing) { currentLatLon = map.PixelToLatLong(new VEPixel(e.mapX, e.mapY)); //记录当前鼠标所点击的位置 points.push(currentLatLon); //将鼠标所点击的位置保存在堆栈中 maskPoints[0] = currentLatLon; //将当前点作为虚线的起点 if (points.length > 1) { //如果堆栈中已经记录了至少一个点,则可以画线
if (!polyline) { //如果还没有初始化polyline对象,则需要初始化 polyline = new VEShape(VEShapeType.Polyline, points); polyline.HideIcon(); map.AddShape(polyline); maskPoints[1] = currentLatLon
} else { polyline.SetPoints(points); } //如果已经初始化过polyline对象,则只需要根据堆栈中所记录的点的位置更新折线形状 } } } 在画折线的过程中,用户移动鼠标来确定下一个折线段的位置,移动过程中线段用虚线表示。鼠标移动事件的功能函数:
//onmousemove handler
function mouseMoveHandler(e) { if (drawing) { var loc = map.PixelToLatLong(new VEPixel(e.mapX, e.mapY)); //鼠标移动时,获取当前位置的经纬度 if (points.length > 0){polylineMask.Show()}; //如果堆栈中已经记录了点,则显示虚线 maskPoints[1] = loc polylineMask.SetPoints(maskPoints); } } 接下来要完成的工作是如何结束画线状态。此处我们通过按ESC键来结束,当然很多应用中也可以采用双击鼠标来终止。但是考虑到必应地图的双击功能时放大地图,所以推荐用ESC键来结束画线。键盘响应功能的具体实现: function keyPressHandler(e){ if (drawing && e.keyCode == 27 ){ //如果当前处于画线状态,且捕捉到的键盘响应代码为27(ESC键),则终止画线状态 drawing = false; //结束画线状态 map.vemapcontrol.EnableGeoCommunity(false); document.getElementById("myMap").style.cursor = ''; document.getElementById("draw").value = 'Click to begin drawing'; document.getElementById("draw").disabled = false; polylineMask.Hide(); } 本例子的完整代码比较长,就不在这儿贴出来了。有需要代码的和我联系:acnchen@hotmail.com September 03 VE Server安装测试手记有时候想办一件事还真不容易,称之为好事多磨吧。VE Server,经过了数月的Legal Issue确认,又花了数月等待总部把数据寄到中国,花了一个星期排除各种小问题,今天总算成功运行起来了。
简单解释一下什么是VE Server。可以理解为内网版本的必应地图。因为必应地图以前叫做Virtual Earth虚拟地球,所以保留了原来的名称,Virtual Earth Server即虚拟地球服务器,简称VE Server。它完全保留了必应地图的所有功能,并且可以在企业内网部署,尤其适合像中国移动、中国石油、海关、政府部门等拥有完全物理隔离内网的企业应用。
成功在自己的笔记本上运行必应地图,感觉不错,庆祝一下。我应该是全国第一个自己架设必应地图的,哈哈。虽然总部寄了1个T的数据过来,但是还是发现哪哪都没有详细地图。难怪必应地图每次更新都要几十个T,全球完整数据估计万T级别吧?
流水一下,记录已经成功测试的case:
1)显示地图,包括道路图、卫星图、混合图、3D模式。没有鸟瞰图数据,没法测试;
2)基本地图功能,例如画点、线、面等,但是没有时间测试全部API;
3)成功加载MapCruncher,意味着用户自己切割的图片也可以叠加
下一步测试任务:
1)如何将用户自有地图数据集成到VE Server中,比如ESRI、MapInfo及国内地图厂商的数据
We have been demo’ing and providing customers with 3 types of capabilities for importing 3rd party geospatial content into VE-Server. First, we can use a software package from Safe Software (www.safe.com) called FME. It has the ability to convert several hundred different formats (both vector and raster) into VE Tiles. These tiles can then be used directly within VE-Server. Second, we can use SQLServer 2008 Spatial as a back-end to VE-Server. This allows us to import and manage vector data (Shapefiles or KML) and raster data which can then be layered into VE-Server. Third, we have an OGC-compliant WMS connector which allows VE-Server to request WMS-compliant imagery from a 3rd party image database and use it in VE-Server. 2)测试Bing Maps SilverLight地图控件 August 28 必应地图(Bing Maps)最新更新微软必应地图(Bing Maps)8月数据更新is live!此次更新的卫星地图数据覆盖面积超过10万平方公里,say,101,468 square KM。中国地区只更新了两个城市,一个是兰州,另一个是Gongzhuling。上网查了查,应该是东北的公主岭吧?好吧,我以前不知道有gongzhuling这个地方。
到现在也不理解负责数据更新的那帮哥们的工作思路,提了好几次先更新那些大城市的数据,但是每次都整几个我从来没去过的地方,甚至都不知道在哪儿。看到临边的那个撮尔小国每次都更新大量数据,还有3D和航拍图片,颇为无奈。谁让人家market share大,revenue大,所以priority高。
漫游一下,想起星际争霸游戏在韩国这么流行,当时颇为不理解。后来发现星际争霸的销量在韩国居然比中国要高,但是人口总数只有中国的约1/30。老外还是比较现实的,哪儿赚钱更多就重视哪儿。
再漫游一下,中国好像也不是哪个地方都差的。平均房价/人均收入比和资本主义国家相比好像只高不低,但愿我错了;和房市并列的车市,无论是家用轿车还是限量版名车,中国市场一枝独秀;
善哉,我不该生嗔念的。与其抱怨,不如多做一些实事。少关心些政治,多听一些王若琳的歌。88年出生小姑娘,居然唱的这么沉稳。
最后漫游一下,满眼都是近90后的人,老了。 August 25 必应地图API入门讲座之十二:如何在必应地图上拖拽图标上次和联想的朋友交流了一下,提起是否可以在地图上自由移动某个兴趣点的图标。以前还真没考虑过这个问题,只记得必应地图(Bing Maps)提供鼠标事件的响应功能。于是专门找了总部的专家Chris Pendleton咨询了一下,感谢CP很快就做了答复。他以前写过这样的博客,介绍如何在必应地图上drag & drop pushpin。原文地址:http://www.bing.com/community/blogs/maps/archive/2008/10/28/draggable-pushpins-with-microsoft-virtual-earth.aspx。
如果以前看过我博客的朋友,应该不难读懂源代码。此处我稍微做一下解释。这个例子中增加了三个鼠标事件:
map.AttachEvent("onmousedown",MouseHandler); //鼠标按下事件
map.AttachEvent("onmouseup",MouseHandler); //鼠标按下后放开事件 map.AttachEvent("onmousemove",MouseHandler); //鼠标移动事件 然后,重载这三个鼠标事件的具体实现方法:
function MouseHandler(e)
{ if (e.eventName == "onmousedown" && e.elementID != null) //鼠标按下事件 { dragShape = map.GetShapeByID(e.elementID); //获得所点击的对象 return true; }else if (e.eventName == "onmouseup") { dragShape = null; }else if (e.eventName == "onmousemove" && dragShape != null) //鼠标移动事件 { var x = e.mapX; var y = e.mapY; pixel = new VEPixel(x, y); var LL = map.PixelToLatLong(pixel); //获得鼠标移动的位置 dragShape.SetPoints(LL); //将目标移动到鼠标当前位置 return true; // prevent the default action } } 为了方便中国的用户,我把源代码中的地图控件URL改成必应地图中国平台,这样可以显示直接中文地图。完整源代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html> <head> <title>Drag and Drop</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!-- saved from url=(0014)about:internet --> <script type="text/javascript" src="http://dev.ditu.live.com/mapcontrol/mapcontrol.ashx?v=6.2"></script> <script type="text/javascript"> var map = null; var dragShape = null; function MouseHandler(e) { if (e.eventName == "onmousedown" && e.elementID != null) { dragShape = map.GetShapeByID(e.elementID); return true; }else if (e.eventName == "onmouseup") { dragShape = null; }else if (e.eventName == "onmousemove" && dragShape != null) { var x = e.mapX; var y = e.mapY; pixel = new VEPixel(x, y); var LL = map.PixelToLatLong(pixel); dragShape.SetPoints(LL); return true; // prevent the default action } } function GetMap() { map = new VEMap('myMap'); map.LoadMap(); map.AttachEvent("onmousedown",MouseHandler); map.AttachEvent("onmouseup",MouseHandler); map.AttachEvent("onmousemove",MouseHandler); var shape = new VEShape(VEShapeType.Pushpin, map.GetCenter()); shape.SetDescription("点击鼠标拖拽"); map.AddShape(shape); var shape2 = new VEShape(VEShapeType.Pushpin, new VELatLong(39.616318, 116.331278)); shape2.SetDescription("我也可以移动的哦!"); map.AddShape(shape2); } </script> </head> <body onload="GetMap();">
<div id='myMap' style="position:relative; width:800px; height:600px;"></div> <div id='resultDiv' style="position:relative; width:400px;">Drag the pushpins around on the map.</div> </body> </html> August 20 必应地图(Bing Maps)控件中mkt参数的妙用写这篇文章的时候想到一句诗:无心插柳柳成荫。虽然以前知道mkt参数的用处,就是用于显示不同的语言版本,但是从来没想过在必应地图API开发中加入这个参数,并且得到了意想不到的效果。 很多朋友问我,如何在中文必应地图上显示卫星地图。因为中文必应地图不支持卫星地图,而Bing Maps全球平台又不支持中文且中国地区地图质量较差。昨天,在解答一个同事的问题的时候,偶然发现一个最简单的办法。随便打开一个必应地图的例子源代码,找到下面这行代码: <script type="text/javascript" src="http://dev.ditu.live.com/mapcontrol/mapcontrol.ashx?v=6.1"></script>。如果不做任何修改,我们看到的是如下效果: 现在我们在上面的地图控件URL中加入mkt=en-us参数,即: <script type="text/javascript" src="http://dev.ditu.live.com/mapcontrol/mapcontrol.ashx?v=6.1&mkt=en-us"></script>。运行该例子,得到如下效果: 看到差别了吗?两个例子显示的都是中国地图,但是地图工具栏发生了变化!增加mkt参数以后,工具栏变成和Bing Maps全球平台一样了!!
让我们点击一下Aerial标签,看看是否能正确显示卫星地图。很遗憾,地图区域是黑的,也就是说没法显示卫星地图。但是没关系,我们再点击3D标签,居然可以展示三维地图效果,并且能够显示卫星地图!这意味着我们还可以使用三维地图API,在中国地图平台上加载三维建筑模型。下一篇讲座中,我将会介绍一下如何在必应地图上加载自制的三维模型。
当然,有些哥们说我就想在点击Aerial标签的时候显示卫星地图。确实,地图区域黑乎乎的一片给用户的体验不好。必应地图也提供了解决办法。首先,我们可以屏蔽微软默认提供的工具栏,自己重写工具栏功能。首先,我们可以显示中文标签了,而不是显示诸如Aerial,Bird's Eye等英文单词。其次,我们可以控制只在用户点击了3D标签后才能点击Aerial标签查看卫星地图。
如果你觉得这种办法也不够好,那么我只好告诉你另一个办法。微软提供了map.AddTileLayer()方法,将用户自定义图层叠加在必应地图上面。
这个方法中的第一个输入参数是一个VETileSourceSpecification 类,这个类有一个属性是VETileSourceSpecification.TileSource ,用于指向地图tile的位置。因此,只要知道必应地图tile的URL就能将卫星图片作为自定义图层叠加在道路图上。
但是,微软可能会随时变换tile URL,因此这种方法并不可靠。微软合作伙伴可以联系我,签署NDA来使用这种解决方案。我的email: acnchen@hotmail.com。
另附交互式SDK:http://www.microsoft.com/maps/isdk/ajax/。 August 05 埃克森美孚采用必应地图(Bing Maps)API全球石油巨头埃克森美孚(ExxonMobil)采用微软的必应地图(Bing Maps)API,在其官方网站上为用户提供地图服务。ExxonMobil的用户可以查询全国任何一家美孚1号车养护店,以及到达养护店的驾车路线。套用ExxonMobil网站上的广告语:
“现在,只需选择任意一家您所需的美孚1号车养护店,即可轻松获取到达该店的清晰驾车路线。按图索骥畅达无忧,您的需求我们时刻关注,美孚1号车养护就在您的身边。”
事实上微软必应地图在全球有三个平台:中国、印度及全球。之所以在中国和印度单独设立数据中心,是根据当地政策的需要。 |
|
|