在这个分为两部分的系列文章中,您将为房地产经纪公司开发一个应用程序,将所有的公寓列表显示为 Google Maps 中可点击的 Placemark 对象。在 第 1 部分中,已经创建了应用程序的前半部分,从用户中收集公寓列表信息,使用 Google Geocoder Web 服务将街道地址转换为它的地理坐标(经度/纬度),并将地理坐标和地址信息存储在数据库中。在第 2 部分中,您将使用这些数据生成 KML 覆盖图文档,并在 Google Maps 和 Google Earth 中显示。首先,在 MySQL 中使用存储过程生成 XML 数据,然后利用 XSLT 和一种叫做 Muenchian 分组的技术,将 XML 数据转化为包含覆盖图信息的 KML 文档 —— 一个 Placemark 对象对应一座公寓大楼。每个 Placemark 对象的弹出气球显示那座楼房中的公寓列表。最后,使用 Google Maps API 在 Web 站点嵌套的 Google Map 中显示 KML 覆盖图。
![]() |
|
前面已经在数据库中存储了所有的地址信息和对应的经度和纬度坐标。首先,可以用 XML 格式表示这些数据,然后使用 XSLT 样式表生成最终的 KML 数据。有多种解决方案可供选择。在本例中,数据库查询只返回单个表的行,您也许要编写一个 PHP 小函数对 XML 标记中的每一列进行打包。对于更复杂的数据,另外一种解决方案是使用 Erik Wetterberg 提出的针对 MySQL 的巧妙存储过程,可以从 Mysql Forge 下载。它允许直接在 SQL 查询中构造复杂的分级 XML 元素(参阅 参考资料 获得链接)。
Wetterberg 的解决方案使用 3 种存储过程:xml_tag()
、xml_escape()
和 xml_attr()
。这 3 种存储过程从 select
语句的其余列构造一棵 XML 树。xml_tag()
包含四个参数:标记名称、标记值(查询中数据库的列)、标记属性和标记的子元素。标记的属性和子元素都是单个字符串,因此,可以使用 concat()
函数连接它们。清单 1 说明如何使用这些存储过程来生成每行的 XML 元素字符串,每个字符串包含每列的一个元素。您也可以很轻松地将子元素转换为行的属性。
清单 1. 在 PHP 中使用存储过程以 XML 元素的形式获取 MySQL 结果
|
SQL 查询使用存储过程为每行返回数据创建一个 XML 列表元素,同时传递 null 作为列以获取值,因为它的值就是它的子元素。通用,也为参数 attributes
传递 null 值。最后,subelements
参数传入一组子元素标记(每个都由进一步调用 xml_tag()
来生成),其中以一个选定的列作为标记的值,以 null 作为属性和子元素参数的值。
这样,在结果集中生成每行的 XML 标记,但是没有创建顶层元素。为简化顶层元素的创建过程,fetchMysqlXml()
函数接收顶层聚合元素的名称和查询的名称(它可能使用这些存储过程来生成 XML 元素字符串)。然后,在查询结果中,连接这些行中的字符串,以生成包含每行的子元素的聚合 XML 元素。如清单 2 所示。
清单 2. 转换为 XML 的数据库数据
本文转自IBM Developerworks中国