首页 > 解决方案 > 如何使用 Python 从 KML 服务器获取数据?

问题描述

本质上,我试图从 Python 脚本中模仿 Google 地球的行为,以从 NetworkLink 获取数据。阅读文档,我发现我需要使用 BBOX 变量提供一个边界框。但是,似乎我需要在数据的初始请求之后请求这个。

关于如何在 Google 地球之外请求这些数据的任何建议?

标签: pythonkmlgoogle-earth

解决方案


Google 地球专业版可以被认为是一个专门的网络浏览器,除了图像之外,它还获取 KML 和 KMZ 内容,并在 3D 地球环境中呈现该内容。在幕后,Google 地球会根据当前视图和 KML 内容(例如 NetworkLinks)构建 URL。在 NetworkLink 中调用 URL 的 Python 代码需要模仿 Google 地球调用目标 URL 的操作。

如果目标 KML NetworkLink具有viewFormathttpQuery元素,则获取的实际 URL 将根据指定的参数进行更新。viewFormathttpQuery定义了一个带有命名字段的模板,这些字段用适当的值填充并附加到 URL。

具有目标 href 和 viewFormat 的示例 NetworkLink 定义。

<NetworkLink>
    <Link>
        <href>http://www.example.com/kml</href>         
        <viewFormat>BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]</viewFormat>
    </Link>
</NetworkLink>

该字符串BBOX=[bboxWest],[bboxSouth],[bboxEast],[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] - 元素使用的值(参见KML 元素中<range><tilt><heading>的描述)<LookAt>
  • [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],[bboxSouth],[bboxEast],[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,180,90;CAMERA=0,0,0,0,0;VIEW=0,0,0,0,0;LOOKAT=0,0,0

推荐阅读