我正在使用KML加载图像叠加,然后我尝试使用NetworkLinkControl更改摄像机视图值,例如高度。我的NetworkLinkControl更新都没有反映在GE插件中。我对这个问题进行了很多研究但无济于事。任何帮助将不胜感激。
以下是详细信息:
该过程从加载NetworkLink KML文件开始:
google.earth.fetchKml(ge, href, function(kmlObject) { ...
其中.appendChild()
就是这样做的:
walkKmlDom(kmlObject, function() {
if(this.getType().match('KmlNetworkLink')) {
ge.getFeatures().appendChild(this);
//There are 2 NetworkLinks
if(this.getLink().getHref().match('nodesc')) {
networkLinkPhoto = this;
}
else if(this.getLink().getHref().match('control')){
networkLinkControl = this; //will use this for updates later
}
}
});
上面的.fetchKml()
加载以下KML 1:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Photos</name>
<open>1</open>
<Style id="photoStyle">
<IconStyle>
<Icon>
<href>http://hostname/images/ge_icon.png</href>
</Icon>
</IconStyle>
<BalloonStyle>
<text>$[description]</text>
</BalloonStyle>
</Style>
<Folder>
<name>My Photo</name>
<open>1</open>
<visibility>1</visibility>
<NetworkLink>
<name>My Photo</name>
<open>1</open>
<Link>
<href>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&nodesc=1</href>
</Link>
</NetworkLink>
<NetworkLink>
<name>Updater</name>
<Link>
<href>http://hostname/placements/10000244/control?auth_key=e34962fce2df4829b0e86870c9e834da</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>
</Folder>
</Document>
</kml>
两个NetworkLink中的每一个都通过<Link>
中定义的URL加载自己的KML文件。
第一个是我的照片(叠加)KML 2:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Photos</name>
<open>1</open>
<Style id="photoStyle">
<IconStyle>
<Icon>
<href>http://hostname/images/ge_icon.png</href>
</Icon>
</IconStyle>
<BalloonStyle>
<text>$[description]</text>
</BalloonStyle>
</Style>
<PhotoOverlay id="image_10000244">
<name>My Photo</name>
<Snippet maxLines="1">
<![CDATA[<a href="#image_10000244">Enter Photo</a>]]>
</Snippet>
<Camera>
<longitude>-122.668</longitude>
<latitude>45.5069</latitude>
<altitude>1.0</altitude>
<heading>66.0</heading>
<tilt>90.0</tilt>
<roll>0.0</roll>
</Camera>
<styleUrl>#photoStyle</styleUrl>
<color>feffffff</color>
<Icon>
<href>http://hostname/get_ge_tile/10000244/$[level]/$[y]/$[x]?auth_key=e34962fce2df4829b0e86870c9e834da</href>
</Icon>
<rotation>0.0</rotation>
<ViewVolume>
<leftFov>-17.5</leftFov>
<rightFov>17.5</rightFov>
<bottomFov>0.0</bottomFov>
<topFov>17.5</topFov>
<near>550.0</near>
</ViewVolume>
<ImagePyramid>
<tileSize>256</tileSize>
<maxWidth>16000</maxWidth>
<maxHeight>8000</maxHeight>
<gridOrigin>upperLeft</gridOrigin>
</ImagePyramid>
<Point>
<coordinates>-122.668,45.5069</coordinates>
</Point>
<shape>sphere</shape>
</PhotoOverlay>
</Document>
</kml>
第二个是Updater KML 3:
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Photos</name>
<open>1</open>
<Style id="photoStyle">
<IconStyle>
<Icon>
<href>http://hostname/images/ge_icon.png</href>
</Icon>
</IconStyle>
<BalloonStyle>
<text>$[description]</text>
</BalloonStyle>
</Style>
<NetworkLinkControl>
<Update>
<targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&nodesc=1</targetHref>
<Change>
<PhotoOverlay targetId="image_10000244">
<Camera></Camera>
<ViewVolume></ViewVolume>
<Point></Point>
</PhotoOverlay>
</Change>
</Update>
</NetworkLinkControl>
</Document>
</kml>
GE插件现在加载了KML,地标位于 指定的坐标,双击地标进入照片 查看模式。
要更改照片的海拔高度,javascript API会请求更新:
var updateHref='http://http://hostname/netlinkcontrol/10000244?&altitude=55&auth_key=e34962fce2df4829b0e86870c9e834da'
networkLinkControl.getLink().setHref(updateHref);
服务器使用KML 4响应(在服务器日志中指示):
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Photos</name>
<open>1</open>
<Style id="photoStyle">
<IconStyle>
<Icon>
<href>http://hostname/images/ge_icon.png</href>
</Icon>
</IconStyle>
<BalloonStyle>
<text>$[description]</text>
</BalloonStyle>
</Style>
<NetworkLinkControl>
<Update>
<targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&nodesc=1</targetHref>
<Change>
<PhotoOverlay targetId="image_10000244">
<Camera>
<altitude>55</altitude>
</Camera>
<ViewVolume></ViewVolume>
<Point></Point>
</PhotoOverlay>
</Change>
</Update>
</NetworkLinkControl>
</Document>
</kml>
这应该有效,因为:
<refreshMode>onChange</refreshMode>
已为KML 1中的更新程序<NetworkLink>
设置,networkLinkControl.getLink().setHref()
正在进行更改。<PhotoOverlay targetId="image_10000244">
正确定位KML 2中的<PhotoOverlay id="image_10000244">
<targetHref>
定位KML 1中的正确<href>
GE插件不显示高度变化。我试过改变 这个值通过javascript API,有效。但为什么不是KML 方法工作?任何想法都将不胜感激。
答案 0 :(得分:1)
尝试定位Camera元素本身,而不是PhotoOverlay父级。当您尝试从目标父级更改几级时,Google地球中的KML更新看起来效果不佳。
换句话说,我会尝试这个:
KML 1
<PhotoOverlay id="image_10000244">
<name>My Photo</name>
<Snippet maxLines="1">
<![CDATA[<a href="#image_10000244">Enter Photo</a>]]>
</Snippet>
<Camera id="image_10000244_camera">
<longitude>-122.668</longitude>
<latitude>45.5069</latitude>
<altitude>1.0</altitude>
<heading>66.0</heading>
<tilt>90.0</tilt>
<roll>0.0</roll>
</Camera>
<ViewVolume id="image_10000244_viewvol" />
</PhotoOverlay>
然后在你的networklinkupdate中:
<NetworkLinkControl>
<Update>
<targetHref>http://hostname/images/10000244.kml?auth_key=e34962fce2df4829b0e86870c9e834da&nodesc=1</targetHref>
<Change>
<Camera targetId="image_10000244">
<altitude>55</altitude>
</Camera>
</Change>
<Change>
<ViewVolume targetId="image_10000244_viewvol">
<!-- new values -->
</ViewVolume>
</Change>
</Update>
</NetworkLinkControl>
通常,最好定位要更改的简单元素的直接父元素。级联更新效果不佳。
我还建议您在Google地球本身的纯KML中试用它,看它是否有效。然后,在执行NLC更新后,您可以复制PhotoOverlay并将代码粘贴到编辑器中,看看是否正确应用了更改。
如果有效,请告诉我......