如何使用Python从KML服务器获取数据?

问题描述

本质上,我试图从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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...