问题描述
本质上,我试图从Python脚本模仿Google Earth的行为,以从NetworkLink中获取数据。阅读documentation后,我发现需要使用BBox变量提供一个边界框。但是,似乎我需要在最初请求数据后再请求此请求。
关于如何在Google Earth之外请求这些数据的任何建议?
解决方法
Google Earth Pro可以被认为是一种专用的网络浏览器,除了可以获取图像外,还可以获取KML和KMZ内容,并在3D地球环境中呈现该内容。在后台,Google Earth根据当前视图和KML内容(例如NetworkLinks)构造URL。在NetworkLink中调用URL的Python代码需要模仿Google Earth调用目标URL的方式。
如果目标KML NetworkLink具有 viewFormat 或 httpQuery 元素,则将根据指定的参数更新提取的实际URL。 viewFormat 和 httpQuery 定义了一个模板,其中包含命名字段,并使用适当的值填充并附加到URL。
具有目标href和viewFormat的示例NetworkLink定义。
<NetworkLink>
<Link>
<href>http://www.example.com/kml</href>
<viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]</viewFormat>
</Link>
</NetworkLink>
字符串BBOX=[bboxWest],[bboxNorth]
是一个模板,它将替换括号中的命名参数以获得适当的值,并将结果附加到目标URL的查询字符串中。表达式[bboxWest]和[bboxEast]替换为视图边界框的最西和最东经度值,[bboxNorth]和[bboxSouth]分别替换为视图中的最大和最小纬度值。
这是需要通过HTTP GET请求获取的实际URL的示例。
http://www.example.com/kml?BBOX=-180,-90,180,90
可以显示在viewFormat元素中的参数列表。
- [lookatLon],[lookatLat]-点的经度和纬度 正在查看
- [lookatRange],[lookatTilt],[lookatHeading]-
元素使用的值(请参见
<range>
的说明,<LookAt>
KML元素中的<tilt>
和<heading>
- [lookatTerrainLon],
[lookatTerrainLat],[lookatTerrainAlt]-
<LookAt>
正在查看的地形上的点,以度/米为单位 - [cameraLon],[cameraLat],[cameraAlt]-摄像机视点的度数/米
- [horizFov],[vertFov]-摄像机的水平,垂直视场
- [horizPixels],[vertPixels]-3D查看器的像素大小
- [terrainEnabled]-指示3D查看器是否正在显示地形
同时包含viewFormat和httpClient元素的更复杂的NetworkLink示例。
<NetworkLink>
<Link>
<href>http://www.example.com/kml</href>
<viewFormat>BBOX=[bboxWest],[bboxNorth];
CAMERA=[lookatLon],[lookatLat],[lookatRange],[lookatTilt],[lookatHeading];
VIEW=[horizFov],[vertFov],[horizPixels],[vertPixels],[terrainEnabled];
LOOKAT=[lookatTerrainLon],[lookatTerrainLat],[lookatTerrainAlt]
</viewFormat>
<httpQuery>client=[clientVersion],[kmlVersion],[clientName],[language]</httpQuery>
</Link>
</NetworkLink>
这里是可以提取以容纳上述NetworkLink的URL。
http://www.example.com/kml?client=7.3.3.7786,2.2,Google+Earth+Pro,en&
BBOX=-180,90;CAMERA=0,0;VIEW=0,0;LOOKAT=0,0