KML服务

本文介绍KML的基础知识和MapGuide如何通过KML服务与Google Earth集成,实现地图数据的共享与展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


目录(?)[+]

本章首先对KML的语法进行了简单的介绍了,然后介绍了KML服务,展示了如何将MapGuide的数据导出为KML,使Google Earth成为MapGuide的客户端。

1.1  KML

Google Earth是Google公司开发的虚拟地球软件,它可以带您飞往地球上的任何地方,您可以在 Google Earth上看到卫星图像、地图、地形和 3D 建筑等。而且,Google Earth支持使用KML将外部数据叠加在自身的数据上,KML定义了如何将外部的向量和图像数据动态地加载和显示在Google Earth中。

1.1.1  KML简介

KML全称是Keyhole Markup Language KML,是一个基于XML语法和文件格式的文件,用来描述和保存地理信息如点、线、图片、折线并在Google Earth客户端之中显示,KML提供以下功能:

l  指定一个地点的图标和标注来区分每一个地点。

l  为每一个视图指定明确的视角来创建不同的特写镜头。

l  使用指定到屏幕或地理位置的图片标注。

l  为特定种类的标注定义显示样式。

l  为标注指定基于简单HTML语法的描述,支持超级链接和图片的显示。

l  使用目录(folders)对标注进行树形的分类管理(为了便于理解和符合习惯,将“folder”翻译为“目录”,实际上是代表一组地理标注)。

l  基于时间戳记的标注可以用来进行动态的播放。

l  从本地或远程的网络地址动态的加载KML文件。

l  当Google Earth客户端视图变化时,自动将视图信息发送给指定的源服务器并从服务器获取相关的标注信息。

KML被Google Earth显示的过程和HTML网页被浏览器处理差不多,而且和HTML一样,KML也使用一种基于标签(名称和属性)的语法格式来描述地里标注信息,可以说,Google Earth是一个KML文件浏览器。

将MapGuide中的地图导出为KML时,我们希望导出的KML数据在Google Earth中能够有MapGuide一致的显示效果和行为,所以导出的KML应该保持和MapGuide中原始地图相同的地图数据、类似的地图样式和浏览行为,为此MapGuide用到了许多KML的高级功能,如Region。

1.1.2  地标

地标是 Google 地球中最常用的地图项之一。它使用黄色图钉作为图标,在地球表面标记出位置。最简单的地标只包含一个 <Point> 元素,它指定地标的位置。您可以指定地标的名称和自定义图标,还可以为地标添加其他几何元素。

在 Google 地球中打开 KML Samples 文件,并展开“Placemarks”子文件夹。该文件夹包含三种不同类型的地标:“简单”、“浮动”和“凸出”。简单地标的 KML 代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

<Placemark>

<name>Simple placemark</name>

<description>

Attached to the ground. Intelligently places itself at

the height of the underlying terrain.

</description>

<Point>

<coordinates>-122.0822035425683,37.42228990140251,0</coordinates>

</Point> 

</Placemark>

</kml>

该文件的结构分解如下:

l  XML 标头。这是每个 KML 文件的第 1 行。该行前面不能有空格或其他字符。

l  KML 名称空间声明。这是每个 KML 2.2 文件的第 2 行。

l  包含以下元素的地标对象:

Ø  用于标识地标的“名称”。

Ø  附着到地标的“气泡框”中显示的“说明”。

Ø  指定地标在地球表面位置的“点”-“经度”、“纬度”及“高度”(可选)。

用户通常认为的 Google Earth中的“地标”,实际上是 KML 中的 <Placemark> 元素,包含一个 <Point> 子元素。点地标是您在 Google Earth的三维查看器中绘制图标和标签的唯一途径。默认情况下,该图标是您熟悉的黄色图钉。在 KML 中,<Placemark> 可包含一个或多个几何元素,例如 LineString、Polygon 或 Model。但只有具有点的 <Placemark> 可以有图标和标签。点用于放置图标,但点本身并无图形表示。

1.1.3  地标中的描述性 HTML

如果您想在 <description> 标签内编写标准的 HTML,可将它放在 CDATA 标签内。如果不放在 CDATA 标签内,必须写上尖括号作为实体引用,以避免 Google Earth错误地对 HTML 进行语法解析(例如,符号 > 写为 >,符号 < 写为 <)。这是 XML 的标准功能,不是 Google Earth所特有的。

请考虑具有 CDATA 标签和不具有 CDATA 标签的 HTML 标记的不同。请先查看下面具有 CDATA 标签的 <description>:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Document>

    <Placemark>

      <name>CDATA example</name>

      <description>

        <![CDATA[

          <h1>CDATA Tags are useful!</h1>

          <p><font color="red">Text is <i>more readable</i> and

          <b>easier to write</b> when you can avoid using entity

          references.</font></p>

        ]]>

      </description>

      <Point>

        <coordinates>102.595626,14.996729</coordinates>

      </Point>

    </Placemark>

  </Document>

</kml>

下面是不具有 CDATA 标签的 <description>,这样特殊字符必须使用实体引用:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Document>

    <Placemark>

      <name>Entity references example</name>

      <description>

               &lt;h1&gt;Entity references are hard to type!&lt;/h1&gt;

               &lt;p&gt;&lt;font color="green"&gt;Text is

          &lt;i&gt;more readable&lt;/i&gt;

          and &lt;b&gt;easier to write&lt;/b&gt;

          when you can avoid using entity references.&lt;/font&gt;&lt;/p&gt;

      </description>

      <Point>

        <coordinates>102.594411,14.998518</coordinates>

      </Point>

    </Placemark>

  </Document>

</kml>

1.1.4  地面叠加层

通过地面叠加层,可在 Google 地球的地形上“叠加”图像。<Icon> 元素包含了指向叠加图像“.jpg”文件的链接。以下是 KML Samples 文件中的地面叠加层示例,展示了 2001 年喷发的埃特纳火山:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Folder>

    <name>Ground Overlays</name>

    <description>Examples of ground overlays</description>

    <GroundOverlay>

      <name>Large-scale overlay on terrain</name>

      <description>Overlay shows Mount Etna erupting

          on July 13th, 2001.</description>

      <Icon>

        <href>http://code.google.com/apis/kml/documentation/etna.jpg</href>

      </Icon>

      <LatLonBox>

        <north>37.91904192681665</north>

        <south>37.46543388598137</south>

        <east>15.35832653742206</east>

        <west>14.60128369746704</west>

        <rotation>-0.1556640799496235</rotation>

      </LatLonBox>

    </GroundOverlay>

  </Folder>

</kml>

该示例使用文件夹(名为“Ground Overlays”)作为对其内容进行分组和标记的机制。请注意在您将 KML Samples 文件载入 Google 地球中时,该文件夹在“位置”面板中是如何显示的。

地面叠加层的定位由 <LatLonBox> 标签控制。边框值以南纬、北纬和东经、西经形式给出。此外,旋转值是针对 y 轴与网格北端不重合的图像给出的。该示例为叠加层使用 JPEG 图像。Google 地球还支持 BMP、GIF、TIFF、TGA 和 PNG 格式。

1.1.5  路径

在 Google Earth中可以创建多种不同类型的路径,并且可轻松地利用您的数据充分发挥创造力。在 KML 中,路径是用 <LineString> 元素创建的。看一看 Paths 文件夹中的“Absolute Extruded”示例,您就会明白如何用以下代码来生成形状:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Document>

    <name>Paths</name>

    <description>Examples of paths. Note that the tessellate tag is by default

      set to 0. If you want to create tessellated lines, they must be authored

      (or edited) directly in KML.</description>

    <Style id="yellowLineGreenPoly">

      <LineStyle>

        <color>7f00ffff</color>

        <width>4</width>

      </LineStyle>

      <PolyStyle>

        <color>7f00ff00</color>

      </PolyStyle>

    </Style>

    <Placemark>

      <name>Absolute Extruded</name>

      <description>Transparent green wall with yellow outlines</description>

      <styleUrl>#yellowLineGreenPoly</styleUrl>

      <LineString>

        <extrude>1</extrude>

        <tessellate>1</tessellate>

        <altitudeMode>absolute</altitudeMode>

        <coordinates>

          -112.2550785337791,36.07954952145647,2357

          -112.2549277039738,36.08117083492122,2357

          -112.2552505069063,36.08260761307279,2357

          -112.2564540158376,36.08395660588506,2357

          -112.2580238976449,36.08511401044813,2357

          -112.2595218489022,36.08584355239394,2357

          -112.2608216347552,36.08612634548589,2357

          -112.262073428656,36.08626019085147,2357

          -112.2633204928495,36.08621519860091,2357

          -112.2644963846444,36.08627897945274,2357

          -112.2656969554589,36.08649599090644,2357

        </coordinates>

      </LineString>

    </Placemark>

  </Document>

</kml>

该代码生成的其实只是高于地面的一条线。<tessellate> 标签把线切成小段,而 <extrude> 标签将线向下延伸到地面。

1.1.6  多边形

您可以使用多边形来创建简单的建筑物及其他形状。有关示例,请查看 KML Samples 文件中的“Polygons”文件夹。

五角大楼的示例是通过绘制简单的内外壳,然后将它们向下凸出到地面生成的。代码如下:

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Placemark>

    <name>The Pentagon</name>

    <Polygon>

      <extrude>1</extrude>

      <altitudeMode>relativeToGround</altitudeMode>

      <outerBoundaryIs>

        <LinearRing>

          <coordinates>

            -77.05788457660967,38.87253259892824,100

             -77.05465973756702,38.87291016281703,100

             -77.05315536854791,38.87053267794386,100

             -77.05552622493516,38.868757801256,100

             -77.05844056290393,38.86996206506943,100

             -77.05788457660967,38.87253259892824,100

          </coordinates>

        </LinearRing>

      </outerBoundaryIs>

      <innerBoundaryIs>

        <LinearRing>

          <coordinates>

            -77.05668055019126,38.87154239798456,100

             -77.05542625960818,38.87167890344077,100

             -77.05485125901024,38.87076535397792,100

             -77.05577677433152,38.87008686581446,100

             -77.05691162017543,38.87054446963351,100

             -77.05668055019126,38.87154239798456,100

          </coordinates>

        </LinearRing>

      </innerBoundaryIs>

    </Polygon>

  </Placemark>

</kml>

1.1.7  几何图形样式

如果您在 KML 文档开头定义了样式,并定义了它的 ID,就可以在文档其他地方定义的几何图形、地标和叠加层中使用该样式。因为可有多个元素使用同一个样式,因此以这种方式定义和使用的样式称为“共享样式”。您只需定义指定样式一次,即可用 <styleUrl> 元素多次引用它。如果样式定义位于同一文件内,请在样式 ID 前加 # 号。如果样式定义位于外部文件中,请在 <styleUrl> 元素中包含完整的网址。

KML Samples 文件包含许多共享样式,每个样式都在文件开始时使用 ID 进行定义。请注意,您的 ID 最好是描述性的字符串,因为这样您可以很容易地判断其作用。以下是一个样式的示例(“transBluePoly”),它将多边形面定义为透明蓝色,将多边形边的线宽定义为 1.5(默认颜色为白色)。Google 园区 41 号楼的示例会使用该样式(在“Polygons”文件夹中):

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://www.opengis.net/kml/2.2">

  <Document>

    <Style id="transBluePoly">

      <LineStyle>

        <width>1.5</width>

      </LineStyle>

      <PolyStyle>

        <color>7dff0000</color>

      </PolyStyle>

    </Style>

    <Placemark>

      <name>Building 41</name>

      <styleUrl>#transBluePoly</styleUrl>

      <Polygon>

        <extrude>1</extrude>

        <altitudeMode>relativeToGround</altitudeMode>

        <outerBoundaryIs>

          <LinearRing>

            <coordinates>

              -122.0857412771483,37.42227033155257,17

              -122.0858169768481,37.42231408832346,17

              -122.085852582875,37.42230337469744,17

              -122.0858799945639,37.42225686138789,17

              -122.0858860101409,37.4222311076138,17

              -122.0858069157288,37.42220250173855,17

              -122.0858379542653,37.42214027058678,17

              -122.0856732640519,37.42208690214408,17

              -122.0856022926407,37.42214885429042,17

              -122.0855902778436,37.422128290487,17

              -122.0855841672237,37.42208171967246,17

              -122.0854852065741,37.42210455874995,17

              -122.0855067264352,37.42214267949824,17

              -122.0854430712915,37.42212783846172,17

              -122.0850990714904,37.42251282407603,17

              -122.0856769818632,37.42281815323651,17

              -122.0860162273783,37.42244918858722,17

              -122.0857260327004,37.42229239604253,17

              -122.0857412771483,37.42227033155257,17

            </coordinates>

          </LinearRing>

        </outerBoundaryIs>

      </Polygon>

    </Placemark>

  </Document>

</kml>

1.1.8  网络链接

网络链接包含用于载入文件且带有 <href>(超链接引用)的 <Link> 元素。<href> 可指定为本地文件或绝对网址。除了名称外,<NetworkLink> 不需要从网络载入文件。

链接中的 <href> 可指定以下任意对象的位置:

l  图标样式、地面叠加层和屏幕叠加层中图标使用的图像文件

l  <Model> 元素中使用的模型文件

l  网络链接载入的 KML 或 KMZ 文件

指定的文件可以是本地文件,也可以是远程服务器上的文件。网络链接的最简单形式是将一个大的 KML 文件分割为同一台计算机上较小且更易于管理的多个文件。

1.1.9  区域

“区域”是一个强大的 KML 地图项,通过它您可以向 Google 地球添加大型数据集,而性能却不会降低。只有当数据位于用户视图内且占据一定的屏幕时,才会载入并绘制该数据。使用区域,您可以为数据提供单独的细节级别,因此只有当数据占据了部分足够显示细节的屏幕时,才会载入微妙的细节。

区域具有定义数据边框的 <LatLonAltBox>。“边框”是包围一组对象或数据点的范围。与 GroundOverlay 中的 <LatLonBox> 类似,区域中的 <LatLonAltBox> 具有北 (North)、南 (South)、东 (East) 和西 (West) 边界。如果区域包含的数据为三维或二维海拔高度,那么该区域的 <LatLonAltBox> 还需要包含最小海拔高度 <minAltitude> 和最大海拔高度 <maxAltitude>。

当区域出现在视图中,并且<LatLonAltBox> 的投影屏幕大小位于该区域指定的像素范围内时,将绘制与此边框关联的对象。当满足这两个条件时,区域被认为是“活动的”。

与区域关联的另一个概念是“细节级别”,简称“LOD”。由于计算机屏幕的空间有限,因此最有效的方式是激活区域,以便只有当像素足以充分显示数据时才载入大量数据。当区域占据屏幕相当小的一部分(可能因为用户正在从远处查看,或从倾斜角度查看平面区域)时,LOD 机制允许您(KML 编写者)指定低分辨率的数据集来替代全分辨率数据。此低分辨率数据集载入的速度更快,但由于它还是占用了屏幕的一小部分,因此用户可能无法辨别其差异。

在区域中,<minLodPixels> 和 <maxLodPixels> 元素允许您指定屏幕的区域(以正方形像素为单位)。当数据投影到屏幕上时,所占据的屏幕区域必须大于 <minLodPixels> 且小于 <maxLodPixels> 才能显示。区域的投影大小超出这些限制后,投影将不再可见,区域会变为非激活状态。

在特殊情况下,当您希望数据激活到无限大时,可以为 <maxLodPixels> 指定 −1(默认值)。

1.2       KML服务

KML服务提供了一种将Google Earth和MapGuide整合在一起的解决方案,它可以让用户将自身的数据和Google Earth丰富的数据整合在一起,假设MapGuide的数据集中包含了地下管道的信息,将这些管道信息和Google Earth卫星图片中的街道和房屋信息叠加在一起,则可以非常容易地找到那些房屋和街道在检修管道的时候会受到影响。

1.2.1  获取KML服务

KML服务由类MgKmlService提供,通过站点服务可以创建一个KML服务MgKmlService对象的实例。

// 初始化WebTier

MgInitializeWebTier('C://Inetpub//wwwroot//PhpMapAgent//webconfig.ini');

// 创建到MapGuide站点服务器的一个连接

$user = new MgUserInformation('Administrator', 'admin');

$siteConnection = new MgSiteConnection();

$siteConnection->Open($user);

// 获取KML服务

$kmlService = $siteConnection->CreateService(MgServiceType::KmlService);

1.2.2  生成地图的KML

方法MgKmlService::GetMapKml(…)用于将指定的地图导出为KML文件,参数map用于指定一个地图;参数dpi用于指定地图当前使用的分辨率,代表在1英寸里用多少个像素渲染地图,一般它的值为96;参数agentUri用于指定地图代理的URI;参数format指定导出的格式,它的值可以为“KML”、“KMZ”或“XML”。KMZ是一个经过ZIP格式压缩过的KML文件,KMZ文件用ZIP工具软件打开,然后解压缩即可得到原始KML文件。当然,KMZ文件也有自己的好处,就是KMZ文件的自身可以包含图片,这样就可以不依赖引用网络上的图片。

MgByteReader GetMapKml(

MgMap map,

double dpi,

string agentUri,

string format);

下面的代码示意了将地图导出为KML文件。

$byteReader = $kmlService-> GetMapKml ($map, 96,

“http://localhost:8008/mapguide/mapagent/mapagent.fcgi”,

“KML”);

$byteSink = new ByteSink($byteReader);

$byteSink->ToFile(“map.kml”);

假设在上面的代码中地图包含了两个图层Roads和Tracks,执行上面的代码,会生成类似如下所示的KML文件。

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://earth.google.com/kml/2.1">

  <NetworkLinkControl>

    <minRefreshPeriod>2</minRefreshPeriod>

  </NetworkLinkControl>

  <Document>

    <name><![CDATA[Sheboygan]]></name>

    <open>1</open>

    <visibility>1</visibility>

    <Region>

      <LatLonAltBox>

        <north>43.797520</north>

        <south>43.691398</south>

        <east>-87.695522</east>

        <west>-87.764987</west>

      </LatLonAltBox>

    </Region>

    <NetworkLink>

      <visibility>1</visibility>

      <name><![CDATA[Roads]]></name>

      <Link>

        <href>

          http://localhost:8008/mapguide/mapagent/mapagent.fcgi?

OPERATION=GetLayerKml&amp;VERSION=1.0.0&amp;

LAYERDEFINITION=

Library://Samples/Sheboygan/Layers/Roads.LayerDefinition&amp;

DRAWORDER=1&amp;FORMAT=KML&amp;SESSION=

7afe3eb2-79bd-102c-8000-005056c00008_en_7F0000010AFC0AFB0AFA

        </href>

        <viewRefreshMode>onStop</viewRefreshMode>

        <viewRefreshTime>1</viewRefreshTime>

        <viewFormat>

BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;

WIDTH=[horizPixels]&amp;HEIGHT=[vertPixels]</viewFormat>

      </Link>

    </NetworkLink>

    <NetworkLink>

      <visibility>0 </visibility>

      <name><![CDATA[Rail Lines]]></name>

      <Link>

        <href>

          http://localhost:8008/mapguide/mapagent/mapagent.fcgi?

OPERATION=GetLayerKml&amp;VERSION=1.0.0&amp;

LAYERDEFINITION=

Library://Samples/Sheboygan/Layers/Tracks.LayerDefinition&amp;

DRAWORDER=0&amp;FORMAT=KML&amp;SESSION=

7afe3eb2-79bd-102c-8000-005056c00008_en_7F0000010AFC0AFB0AFA

        </href>

        <viewRefreshMode>onStop</viewRefreshMode>

        <viewRefreshTime>1</viewRefreshTime>

        <viewFormat>

BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;

WIDTH=[horizPixels]&amp;HEIGHT=[vertPixels]

</viewFormat>

      </Link>

    </NetworkLink>

  </Document>

</kml>

从上面的KML文件中可以看到,地图中的每个图层被转换为一个KML网络链接,这个网络链接会调用方法MgKmlService::GetLayerKml(…),并将图层数据转化为KML。而且,创建了一个KML区域,这个区域的数据边框等于地图的数据边框。

1.2.3  生成图层的KML

方法MgKmlService::GetLayerKml(…)用于将指定的图层导出为KML文件,参数layer用于指定一个图层;参数extents用于指定地图的范围,它不是一个数据过滤条件,此方法总是导出图层中的所有数据;参数width和height用于设置以像素为单位的地图宽度和高度;drawOrder用于指定图层在地图中的绘制顺序,一般将此参数设置为0;参数dpi、agentUri和format与方法MgKmlService::GetMapKml(…)的含义相同。

MgByteReader GetLayerKml(

MgLayer layer,

MgEnvelope extents,

int width,

int height,

double dpi,

int drawOrder,

string agentUri,

string format);

需要注意的是参数extents的坐标使用的Google Earth的坐标系,在MapGuide中Google Earth的坐标系的Meotor代码为“LL84”,WKT如下显示:

GEOGCS[/"LL84/",

DATUM[/"WGS 84/",

SPHEROID[/"WGS 84/",6378137,298.25722293287],

TOWGS84[0,0,0,0,0,0,0]],

PRIMEM[/"Greenwich/",0],

UNIT[/"Degrees/",0.01745329252]]

参数width、height、extents和dpi让人有一点难以理解,根据MapGuide的源代码,这四个参数主要用于计算当前地图的比例尺,在导出为KML时方法GetLayerKml(…)会尽量保证KML文件中要素的样式和当前地图比例尺下要素的样式一致。对于栅格图层和制图图层,参数width和height用于指定将地图渲染为图像后的像素宽度和高度。

下面的代码示意了将地图导出为KML文件。

$extents = new MgEnvelope(-87.7398334220901,43.73822699224595,

-87.72068284176505,43.75068777906662);

$byteReader = $kmlService->GetLayerKml($layer, $extents, 796, 717, 96, 0, “KML”);

$byteSink = new ByteSink($byteReader);

$byteSink->ToFile(“layer.kml”);

执行上面的代码,会生成类似如下所示的KML文件。

<?xml version="1.0" encoding="UTF-8"?>

<kml xmlns="http://earth.google.com/kml/2.1">

  <NetworkLinkControl>

    <minRefreshPeriod>2</minRefreshPeriod>

  </NetworkLinkControl>

  <Document>

    <visibility>1</visibility>

    <NetworkLink>

      <name><![CDATA[0.000000 - 25000.000000]]></name>

      <Region>

        <LatLonAltBox>

          <north>41.889698</north>

          <south>41.818820</south>

          <east>-88.073653</east>

          <west>-88.150022</west>

        </LatLonAltBox>

        <Lod>

          <minLodPixels>1238</minLodPixels>

          <maxLodPixels>-1</maxLodPixels>

        </Lod>

      </Region>

      <open>1</open>

      <Link>

        <href>

          http://localhost:8008/mapguide/mapagent/mapagent.fcgi?

OPERATION=GetFeaturesKml&amp;VERSION=1.0.0&amp;

LAYERDEFINITION=

Library://Demos/GoogleEarth/Layers/WheatonWater.LayerDefinition&amp;

DPI=96.000000&amp;DRAWORDER=0&amp;

FORMAT=KML&amp;SESSION=

15a343da-79a1-102c-8000-005056c00008_en_7F0000010AFC0AFB0AFA

        </href>

        <viewRefreshMode>onStop</viewRefreshMode>

        <viewRefreshTime>1</viewRefreshTime>

        <viewFormat>

BBOX=[bboxWest],[bboxSouth],[bboxEast],[bboxNorth]&amp;

WIDTH=[horizPixels]&amp;HEIGHT=[vertPixels]</viewFormat>

      </Link>

    </NetworkLink>

  </Document>

</kml>

从上面的KML文件中可以看到,图层被转换为一个KML网络链接,这个网络链接会调用方法MgKmlService::GetFeaturesKml(…),并将图层数据转化为KML要素。而且,创建了一个KML区域,这个区域的数据边框等于图层的数据边框。

1.2.4  生成要素的KML

方法MgKmlService::GetFeaturesKml(…)用于将图层中指定区域的数据导出为KML文件,参数extents用于指定数据区域,只有在指定范围内的数据才会被转换为KML,其它参数的含义与方法GetLayerKml(…)相同。

MgByteReader GetFeaturesKml(

MgLayer layer,

MgEnvelope extents,

int width,

int height,

double dpi,

int drawOrder,

string format);

参数extents的坐标使用的Google Earth的坐标系,在设置extents时,需要将将查询范围的坐标值转换为坐标系“LL84”下的坐标值,如果打算将图层中的所有数据导出为KML,那么可以将extents的值设置为“LL84”的最小和最大坐标,即

MgEnvelope (-87.7398334220901,43.73822699224595,

-87.72068284176505,43.75068777906662)

下面的代码示意了将地图导出为KML文件。

$extents = new MgEnvelope(-87.7398334220901,43.73822699224595,

-87.72068284176505,43.75068777906662);

$byteReader = $kmlService->GetLayerKml($layer, $extents, 796, 717, 96, 0, “KML”);

$byteSink = new ByteSink($byteReader);

$byteSink->ToFile(“features.kml”);

执行上面的代码,会生成类似如下所示的KML文件。

 

1.2.5  拉伸要素

目前,MapGuide只支持以2D的方式显示地图数据,但是图层定义是支持2.5D的显示方式的,通过为每个要素指定一个高度可以将点、线和面进行拉伸可以构造出2.5D的实体(Solid)。在图层定义中,拉伸是由ElevationSettings元素进行设置的,它是向量图层定义的VectorScaleRange元素的子元素,Schema如图9-1所示。

l  ZOffset:用于设置基准高度,即高度为0的高度,它是一个表达式,所以可以使用图层要素类中的属性来定义。

l  ZExtrusion:用于设置要素拉伸的高度,它是一个表达式,所以可以使用图层要素类中的属性来定义。

l  ZOffsetType:用于指定ZOffset的测量方式,它可以为Absolute或RelativeToGround。Absolute测量相对于海平面的海拔高度,它会忽略地形的实际海拔高度,RelativeToGround忽略所有海拔高度值,将要素按照地形附着在地面上。

l  Unit:ZOffset和ZExtrusion值的单位。

 

Extrusion

图9-1 ElevationSettings的Schema

 

下面的向量图层定义中定义了一个ElevationSettings元素,它使用属性“HEIGHT_AGL”的值作为每个要素的高度。

<VectorLayerDefinition>

  ...

  ... 

  <VectorScaleRange>

    ...

    ...

    <ElevationSettings>

        <ZOffset>0</ZOffset>

        <ZExtrusion>HEIGHT_AGL</ZExtrusion>

        <ZOffsetType>RelativeToGround</ZOffsetType>

        <Unit>Meters</Unit>

    </ElevationSettings>

  </VectorScaleRange>

</VectorLayerDefinition>

</LayerDefinition>

在将图层导出为KML时,如果图层定义中包含了ElevationSettings元素,KML服务会将其转换为Google Earth中的拉伸,这样就可以在Google Earth中看到要素拉伸之后的效果,图9-2显示了这样的效果。

目前,MapGuide Studio没有提供任何用户界面设置ElevationSettings,所以必须通过编程的方式设置ElevationSettings。

Google Earth

图9-2 MapGuide和Google Earth集成运行的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值