Animation 谷歌地球插件中的有效动画

Animation 谷歌地球插件中的有效动画,animation,google-earth-plugin,Animation,Google Earth Plugin,一些背景 在GE plugin中,有几种方法可以制作动画。我能想到: 使用批处理API调用在“frameend”事件中移动内容。 由于这些调用在某些浏览器中相当缓慢。在帧速率下降到不可接受的低水平之前,我们可以触发大约150个API调用/帧。这还不够 要节省昂贵的API调用,请为整个帧生成KML,并在“frameend”中将其添加/删除到GE。 这就是我目前所做的。 性能也不太好。我相信这是由于对象重建开销造成的 使用KML中的“更新”来更新每个帧中的对象,而不是重新创建对象。 根据“包含Net

一些背景

在GE plugin中,有几种方法可以制作动画。我能想到:

  • 使用批处理API调用在“frameend”事件中移动内容。 由于这些调用在某些浏览器中相当缓慢。在帧速率下降到不可接受的低水平之前,我们可以触发大约150个API调用/帧。这还不够

  • 要节省昂贵的API调用,请为整个帧生成KML,并在“frameend”中将其添加/删除到GE。 这就是我目前所做的。 性能也不太好。我相信这是由于对象重建开销造成的

  • 使用KML中的“更新”来更新每个帧中的对象,而不是重新创建对象。 根据“包含NetworkLink控件的文件必须已由NetworkLink加载”。此外,parseKml不接受NetworkLinkControl。因此,这种方法似乎需要服务器交互,因此无法提供所需的平滑度和交互性(是的,我确实从服务器下载了一些原始数据,但动画是基于处理的数据和用户交互在客户端完成的)。我甚至想用本地网络服务器来愚弄GE

  • 巡回演出。 这就是我目前正在调查的。 我没有发现如何隐藏TourPlayer控件,并计划使用“iframe shim”技术在其上添加一些内容。 现在,我一直在玩parseKml解析的巡演。如果由fetchKml加载,则播放效果良好-摄影机和placemarks移动。但是,通过parseKml加载的同一个教程只移动摄影机,而不移动位置标记。这里似乎应用了与#3相同的限制

  • 这是我的密码:

    <script src="https://www.google.com/jsapi"></script>
    <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
    <script>
    
    google.load("earth", "1")
    
    var originalUrl = 'http://localhost/original.xml'
    var tourUrl     = 'http://localhost/tour.xml'
    
    var ge
    $(function() {
        google.earth.createInstance('ge', function(instance) {
            ge = instance
            google.earth.fetchKml(ge, originalUrl, function(o) {
                ge.getFeatures().appendChild(o)
            })
        })
    })
    
    function tour(t) {
        ge.getTourPlayer().setTour(t)
        ge.getTourPlayer().play()
    }
    
    function fetchKml() {
        google.earth.fetchKml(ge, tourUrl, tour)
    }
    
    function parseKml() {
        $.get(tourUrl, function(kml) {
            tour(ge.parseKml(kml))
        }, 'text')
    }
    
    </script>
    <div id="ge"></div>
    <button onclick="fetchKml()">fetchKml</button>
    <button onclick="parseKml()">parseKml</button>
    
    
    google.load(“地球”,“1”)
    原始值http://localhost/original.xml'
    var-tourl=http://localhost/tour.xml'
    var ge
    $(函数(){
    google.earth.createInstance('ge',函数(实例){
    ge=实例
    google.earth.fetchKml(ge,originalUrl,function(o){
    ge.getFeatures().appendChild(o)
    })
    })
    })
    功能游览(t){
    ge.getTourPlayer().setTour(t)
    ge.getTourPlayer().play()
    }
    函数fetchKml(){
    google.earth.fetchKml(ge、tourUrl、tour)
    }
    函数parseKml(){
    $.get(URL,函数(kml){
    巡回赛(通用电气公司/公里/公里)
    }(“文本”)
    }
    fetchKml
    parseKml
    
    original.xml:

    <Folder>
        <Placemark><name>A</name><Point id="a"></Point></Placemark>
        <Placemark><name>B</name><Point id="b"></Point></Placemark>
    </Folder>
    
    
    A.
    B
    
    和tour.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2">
        <gx:Tour>
            <gx:Playlist>
                <gx:FlyTo>
                    <gx:duration>2</gx:duration>
                    <LookAt><range>50</range></LookAt>
                </gx:FlyTo>
                <gx:AnimatedUpdate>
                    <gx:duration>10</gx:duration>
                    <Update>
                        <targetHref>http://localhost/original.xml</targetHref>
                        <Change>
                            <Point targetId="b"><coordinates>0.0001,0.0001,0</coordinates></Point>
                        </Change>
                    </Update>
                </gx:AnimatedUpdate>
                <gx:FlyTo>
                    <gx:duration>10</gx:duration>
                    <LookAt><range>50</range><latitude>0.0001</latitude><longitude>0.0001</longitude></LookAt>
                </gx:FlyTo>
            </gx:Playlist>
        </gx:Tour>
    </kml>
    
    
    2.
    50
    10
    http://localhost/original.xml
    0.0001,0.0001,0
    10
    500.00010.0001
    
    按“fetchKml”将B移出A,相机跟随-正确。 按“parseKml”仅移动摄像头,A和B保持原位-不正确

    还有我的问题

    问题1。我的代码是否有问题,或者#4在没有服务器交互的情况下无法工作

    问题2。我在#1#4中告诉你的有错误吗

    第三季度。还有什么其他的动画方法可以尝试

    第四季度。有什么建议吗

    谢谢。

    Q1-是的

    使用
    parseKml
    将不起作用,原因很简单,即创建的元素将不再引用您指定的目标href

    解释-当您通过
    fetchKml
    将数据加载到插件中时,每个对象的id都是唯一的,方法是将其附加到加载kml的url中。因此,在您的示例中,点ID将是
    http://localhost/original.xml#b

    但是,您将kml作为文本加载,然后解析到插件中,因此从插件的角度来看,数据不是来自
    http://localhost/original.xml
    -这些对象是使用API创建的,与调用
    createPoint
    非常相似,因此点ID只是
    b

    这意味着
    http://localhost/original.xml
    错误-因为数据不是来自
    http://localhost/original.xml
    它来自于对某个文本调用parseKml——插件未知的url

    实际上,您正在尝试更新
    http://localhost/original.xml#b
    但该对象不存在-因为该对象不是从该URL创建的

    问题2-是的

    “…parseKml不接受NetworkLinkControl。”

    无法通过
    parseKml
    创建NetworkLinkControl,因为无法在api中创建NetworkLinkControl对象。没有
    KmlNetworkLinkControl
    这样的东西,因此,如果解析包含NetworkLinkControl的kml文件,则没有要创建的对象。它与“服务器交互”无关

    第三季度和第四季度


    至于一般建议-使用API简单地更新对象的几何体是设置对象动画的最简单方法之一,在
    executeBatch
    中包装对API的调用可以大大降低此过程的处理成本。

    感谢您的响应。问题1。正如您在上面的代码中所看到的,我通过
    fetchKml
    加载
    original.xml
    。所以你的解释在这里不适用。在获取的KML中找到的NetworkLinkControl不起作用。因此,它只是没有通过API公开。真正的问题是:我可以使用这个w/o服务器吗?第3和第4个问题。我从这个选项(批处理API调用)开始解释。还说这还不够好。说我找到了一个更好的。这也不够好。。因此,我仍在寻求一些帮助/意见/考虑。谢谢。Q1-对不起,是的,不幸的是,由于稍有不同的原因,它将无法工作。AFAIK kml更新必须来自与原始数据相同的域。Q2-不确定您的观点是什么。您可以使用NetworkLinkControl“获取Kml”,但不能使用NetworkLinkControl“解析Kml”。