65.9K
CodeProject 正在变化。 阅读更多。
Home

适用于 Windows Vista 的虚拟地球幻灯片小工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (13投票s)

2007年3月31日

CPOL

6分钟阅读

viewsIcon

100284

downloadIcon

1035

Mobilis Immobile 是一个适用于 Windows Vista 的虚拟地球幻灯片小工具。

引言

"Mobilis Immobile" 是一个用于 Windows Vista 的虚拟地球幻灯片小工具。有了 "Mobilis Immobile"(简称 "Mobim"),您无需离开屏幕,就可以游览世界各地您最喜欢的地方!顺便说一句,"Mobilis Immobile" 这个句子在拉丁语中的意思正是 "旅行而不移动"。

安装和使用小工具

要安装 Mobim 小工具,只需将其从侧边栏或桌面的小工具库中拖出即可。

停靠或浮动

Mobim 可以显示三种不同的视图

  • 停靠:停靠视图是指小工具在侧边栏中显示。
  • 浮动:浮动视图是指小工具在桌面上显示。此视图比停靠视图更大,可让您查看当前幻灯片的完整描述。
  • 弹出:弹出视图结合了停靠和浮动视图。在此视图中,停靠视图和浮动视图并排显示。当您单击停靠视图时,会显示弹出视图。

以下是每种视图的屏幕截图

Screenshot - mobim1.jpg Screenshot - mobim2.jpg
停靠视图 浮动视图
Flyout view
弹出视图

设置

Mobim 小工具拥有增强的设置窗口。见下文

Screenshot - mobim4.jpg

每个选项的含义如下

  • URL:URL 是当前显示的提要或集合的网址。
  • 粘贴:粘贴按钮会将 Windows 剪贴板的内容粘贴到 URL 字段中。
  • 显示间隔:选择每张幻灯片之间的经过时间。
  • 默认视图:默认地图样式(航空、街道、混合或鸟瞰),当幻灯片描述中未设置值时使用。
  • 默认缩放:当幻灯片描述中未设置值时使用的默认缩放级别。
  • 随机播放:选中时随机播放幻灯片,未选中时按提要或集合的顺序显示。
  • 显示标记:选中时为每个项目显示一个图钉。
  • 显示描述:选中时显示每张幻灯片的标题(或较大视图中的标题和描述)。

选择您的提要

Mobim 小工具可以显示两种类型的幻灯片

  • 实时集合:可以使用 Microsoft 的 Live 网站创建实时集合,或者在 Collections.live.com 上选择。要显示个人集合或共享集合,只需将集合的完整地址粘贴到设置窗口的 URL 字段中。URL 地址应类似于 "http://maps.live.com/...&cid=..." 或 "http://local.live.com/...&cid=..."。

Screenshot - mobim5.jpg

  • GeoRSS 提要:GeoRSS 是标准 XML RSS 格式的扩展。实际上,GeoRSS 只是在标准 RSS 项目中添加了两个 XML 元素:<geo:lat> 和 <geo:long>。当然,<geo:lat> 用于纬度坐标,<geo:long> 用于经度坐标。下面是一个 GeoRSS 提要的示例。要在 Mobim 中使用 GeoRSS,只需粘贴托管 GeoRSS 提要的地址或网站。它可以是本地或远程网站,也可以是静态 XML 或动态生成的 XML 的链接。
 <?xml version="1.0" encoding="utf-8" ?> 
 <rss version="2.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
 xmlns:georss="http://www.georss.org/georss" xmlns:gml=
   "http://www.opengis.net/gml">
 <channel>
 <title>Perpignan</title> 
 <link /> 
 <description>Famous place in Perpignan, France</description> 
  <item>
  <title>Castillet</title> 
  <description>[mode@o][zoom@1][sceneid@10995771]Castillet Castle built 
    in 1368.</description> 
  <geo:lat>42.70069438573455</geo:lat> 
  <geo:long>2.893863466593684</geo:long> 
  </item>
  <item>
  <title>Dames de France</title> 
  <description>[mode@o][zoom@1][sceneid@10995756]</description> 
  <geo:lat>42.6985786771285</geo:lat> 
  <geo:long>2.888311216990704</geo:long> 
  </item>
 </channel>
 </rss>

播放幻灯片

当您将 Mobim 拖到侧边栏/桌面上时,或者退出设置窗口并确认您的选择时,幻灯片就会开始播放。

一个控制条可以帮助您更精确地控制幻灯片。当您将鼠标光标移到小工具上时,控制条会自动出现。使用暂停按钮,您可以暂停/恢复幻灯片;使用下一张或上一张按钮,您可以移动到下一张或上一张幻灯片。

Screenshot - mobim6.jpg

请注意,控制条在弹出视图中也可以使用。在这种情况下,较小视图的控制条可以同时控制较大和较小的视图。

自定义视图

Mobim 允许您使用通用设置或为每张幻灯片使用设置来定制幻灯片。要做到这一点,您需要使用特殊模式将设置编码在您的集合或提要的描述字段中。

可以使用三个参数

  • [mode@X] :设置此幻灯片的视图。X 的允许值为:a 表示航空,r 表示街道,h 表示混合,o 表示鸟瞰。
  • [zoom@N] :设置此幻灯片的缩放级别。允许值为 1 到 19。
  • [sceneid@X] :设置此幻灯片的 sceneID。此值由虚拟地球内部用于标识场景的摄影。此值仅在鸟瞰视图中有意义。

Screenshot - mobim7.jpg

请注意,在详细视图的描述字段中,参数值不会显示出来。

工作原理

当然,Mobim 依赖于虚拟地球的功能。虚拟地球可以加载 GeoRSS 或实时集合并将其用作图钉。不幸的是,虚拟地球将所有项目视为一个图层,您无法控制图层首次显示的方式。此外,您也无法访问项目的全部特性。因此,对于 Mobim,我从头重写了 GeoRSS 提要和实时集合的加载。以下是方法:

加载幻灯片

Mobim 的核心是构建一个集合,其中每个项目都是一张幻灯片及其特征。这个过程在启动时通过一个名为 loadItems 的函数中的 AJAX 调用来完成。以下是该函数的一个摘录
function loadItems(callback) 
{
    ...
    collection = new Array();
    ...
    
    afterLoad = callback;
    httpreq = new ActiveXObject("Microsoft.XMLHTTP");
    httpreq.open("GET", urltocall, true);
    httpreq.onreadystatechange = processRequest;
    httpreq.send(null);
}

当请求完成时,Mobim 必须处理响应以填充 collection 数组。处理过程取决于集合的类型:GeoRSS 或实时集合。这正是 processRequest 函数所做的。参见此处

function processRequest() 
{
    // only if req shows "loaded"
    if (httpreq.readyState == 4) 
    {
        // only if "OK"
        if (httpreq.status == 200) 
        {
            if (islive)
                processLiveCollection();
            else
                processGeoRSS(); 

            if (collection.length > 0) 
            {
                if (shuffle)
                    shuffleCollection();
                afterLoad();
            } 
            else
                System.Debug.outputString("no feed available\n"); 
        } 
        else 
        {
            System.Debug.outputString("error reading feed\n");
        }
    }
}

今天,要判断一个 URL 是实时集合还是 GeoRSS 提要,我们只需对 URL 的前缀进行测试(实时集合以 "http://maps.live.com/" 或 "http://local.live.com/" 开头)。

处理 GeoRSS 提要

处理 GeoRSS 非常简单,它只是一个 XML 文本,Mobim 会逐个节点进行解析。

function processGeoRSS() 
{
    var items = httpreq.responseXML.getElementsByTagName("item");
    var title_string;
    var description_string;
    var link_string;
    var point;

    for (var i = 0; i < items.length; i++) 
    {
        title_string = getElementText("title", items[i]);
        description_string = getElementText("description", items[i]);
        link_string = getElementText("link", items[i]);
        point = findPoint(items[i]);
        if (point != null)
            collection.push(new MobimRSSItem(title_string, 
                description_string, link_string, point));
    }
}

处理实时集合

坏消息:目前没有 API 可以获取实时集合。所以我需要使用一个技巧来查找如何检索和解析它。使用 IE HTTP Analyzer,我发现虚拟地球在检索实时集合图层时,内部使用此 HTTP 调用
http://maps.live.com/UserCollections.aspx?action=RetrieveAllAnnotations&cid=
    XXXX&mkt==en&mapguid=1111111111111&contextid=2222222222222
其中 XXXX 是初始 URL 中的集合 ID,而 11111111111112222222222222 是上下文数字,在这里无关紧要。作为对此调用的响应,Live 服务器返回一个 JSON 响应,如下所示
VEMap._GetMapFromGUID('1111111111111')._lm.RetrieveAllAnnotationsCallback(
    [
     new VE_Annotation('D4783333CD255A28!116','Statue of Liberty, New York, 
          USA','http://www.nps.gov/stli/','','01/01/0001 00:00:00',
          'Located on a 12 acre island, the Statue of Liberty ...[zoom@16]',
          '40.6892944466626','-74.0444612503052','0','0','',
          '01/01/0001 00:00:00',[]),
     new VE_Annotation('D4783333CD255A28!117','Key West, Florida, USA',
          'http://en.wikipedia.org/wiki/Key_West,_Florida','',
          '01/01/0001 00:00:00','Key West is a city and an island...',
          '24.5553986767496','-81.7980194091797','0','1','',
          '01/01/0001 00:00:00',[]),
     ...
    ],'2222222222222');

嵌入数组的每个项目都正是我所需要的:实时集合中所有项目的特征。经过一些替换和调用 eval 后,现在可以轻松检索到一个数组

function processLiveCollection() 
{
    var response = httpreq.responseText; 

    // Compute start
    var start = response.indexOf("([new VE_Annotation(");
    if (start == -1) 
        return;

    // Compute end
    var end = response.indexOf(")],'2222222222222');", start);
    if (end == -1)
        return;

    // Extract from start to end
    var strarray = response.substring(start+1, end+2);
    strarray = strarray.replace(/VE_Annotation/g, "MobimLiveMarker");
    
    // Eval collection
    collection = eval(strarray);
}

创建您自己的幻灯片

随时创建您自己的实时集合或 GeoRSS 提要,并使用 Mobim 查看。一个找到世界各地有趣地方的好起点是 Bird's Eye Tourist 网站。另外,关注 Virtual Earth blog Team,那里列出了许多虚拟地球的技巧和窍门。以下是我最喜欢的几个集合(将 URL 拖放到 URL 字段中并使用推荐的设置)

请随时就错误、问题或意见与我联系。

© . All rights reserved.