`
fly1206
  • 浏览: 57102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自制基于地图的 mashup

阅读更多

自制基于地图的 mashup

从 ESRI shapefile 数据创建一个 KML 服务

Shyam Sundar Nagarajan, 架构师, Cognizant Technology Solutions

 

简介: 近来,基于地图的 mashup 大量出现。Mashup 要求服务必须能被聚合。基于位置的 mashup 需要能够提供边界信息的服务。借助基于 Web 的地图提供商,您只需很少的投资甚至无需投资,就能创建基于地图的 mashup。在本文中,了解如何从 ESRI shapefile 创建一个 KML 边界服务以便用于 mashup。

<!-- <p class="ibm-no-print"> <div id="dw-tag-this" class="ibm-no-print"></div> <div id="interestShow" class="ibm-no-print"></div> </p> -->

发布日期: 2010 年 3 月 01 日
级别: 中级 其他语言版本: 英文 <!-- <br /><b>建议:</b>&nbsp;<span id="nCmts"><img alt="" src="//www.ibm.com/developerworks/i/circle-preloader.gif" height="12" width="50" /><img alt="" src="//www.ibm.com/i/gif" height="14" width="1" /></span> --><!-- Rating_Area_Begin --><!-- Ensure that div id is based on input id and ends with -widget -->

1 star2 stars3 stars4 stars5 stars 平均分 (共 2 个评分 )
<script type="text/javascript"></script><!-- Rating_Area_End -->

 

<!-- dW_Summary_Area_END --><!-- CONTENT_BODY -->
<!-- MAIN_COLUMN_BEGIN -->
<!-- Related_Searches_Area_And_Overlays_Begin --><!-- Related_Searches_Area_Begin --> <script type="text/javascript"></script>
<!-- START : HTML FOR ARTICLE SEARCH --><!-- END : HTML FOR ARTICLE SEARCH --><!-- START : HTML FOR CODE SEARCH --><!-- END : HTML FOR CODE SEARCH -->
<!-- Related_Searches_Area_End --><!-- MAIN_COLUMN_CONTAINER_BEGIN --><!-- MAIN_COLUMN_CONTENT_BEGIN -->

简介

时下,基于地图的 mashup 无处不在,很大程度上是因为可被聚合的服务现在广泛可用。对于一个基于地图的 mashup,一般需要能够提供地理边界的服务。美国人口局发布的州、县和 Zip 编码分界采用的是 Environmental Systems Research Institute (ESRI) shapefile 格式。在本文中,了解如何创建一个简单的服务来通过开源软件从 ESRI shapefile 交付 KML 文件。


技术和软件产品

GIS — 地理信息系统

KML — Keyhole markup 语言

Mashup — 一种混合的 Web 应用程序,能将来自多个源的数据综合成一个集成体验

TIGER — 拓扑地集成图形编码和引用(Topologically integrated geographic encoding and referencing)

现在已经有很多商业的和开源的工具和产品可供您用来处理空间坐标数据和创建 mashup。本文中的示例使用了开源软件:作为数据库的 PostGIS、GeoTools Java™ 库、OpenLayers 地图库以及作为应用服务器的 Apache Tomcat。

PostGIS
一个对开源关系数据库 PostgresSQL 的空间扩展。PostGIS 支持由 OpenGIS Simple Features Specification for SQL 标准描述的空间数据类型和函数。
GeoTools
一个 Java 库,用来执行空间数据的处理。 GeoTools 包括:
  • 对各种空间数据格式(比如 ESRI shapefile、Geography Markup Language (GML)、MapInfo Interchange Format (MIF))的支持以及空间坐标转换。
  • 来自 Vivid Solutions 的 Java Topology Suite (JTS),定义了 Java 类来表示空间数据。

这个示例解决方案对空间坐标转换使用 GeoTools,为将 BLOB(binary large object)数据从数据库数据转变为几何(geometry)数据使用了 JTS。

OpenLayers
一个开源 JavaScript 地图库,让您可以向 Web 页面添加动态地图。您可以覆盖基础地图之上的标记、线条和多边形。本文中的例子使用了 OpenLayer 的一个功能,即从 KML 文件在基础地图之上添加一个层。
Apache Tomcat
本例中使用的一个开源 J2EE JSP 和 servlet 容器,用来部署服务。

下载 本文中使用的示例代码。要获得本例中使用的软件,参见 参考资料


做好准备

本节讨论了创建本文中的这个示例所需做的准备。

逻辑架构

图 1 给出了这个示例解决方案的逻辑架构。


图 1. 逻辑架构
 
 

边界数据

美国人口局使用了 Topologically Integrated Geographic Encoding and Referencing (TIGER) 格式和数据库来描述和发布地面属性,比如道路、建筑、河流、湖泊和普查地段。TIGER 数据库包含的数据集包括由州、县、城市和 ZIP 编码组成的地理边界。这个数据集使用 ESRI shapefile 格式(参见 参考资料)。本例使用的是 ESRI shapefile 格式的州边界。

获得数据

美国人口局提供的州边界的数据集是 ARC/INFO Export (.e00)、ARC/INFO Ungenerate 和 ESRI shapefile (.shp) 格式的。本文只使用了其中的 ESRI shapefile 格式。每个州都有各自的州边界,所有的州边界则包括在一个 shapefile 中。本例就使用了这个包含所有州边界的 shapefile (st99_d00_shp.zip)。

将 st99_d00_shp.zip 文件的内容解压缩以得到 st99_d00.shp shapefile 及关联文件(st99_d00.shx 和 st99_d00.dbf)。

将数据导入 PostGIS

PostGIS 并不提供实用工具来直接将 ESRI shapefile 格式的数据导入到数据库(像 IBM® DB2® 那样)。将数据导入 PostGIS,必须执行如下两步骤:

  1. PostGIS 提供了 shp2pgsql 工具,可用来将 ESRI shapefile 转变为适合 SQL 的 INSERT 语句。要使用此工具从 shapefile 创建一个具有 SQL INSERT 语句的文件,可以使用命令 shp2pgsql st99_d00.shp testdb.state_bounds > statebounds.sql。这个命令,如果没有命令行选项,将会将 SRS ID 设置为默认的值 -1。对于本文的目的而言,这没有问题,因为您将为反向投影使用 GeoTools,坐标转换则不使用数据库特性。
  2. 确保数据库启动后,就可以运行 psql 命令来执行此脚本了。

默认地,由 shp2pgsql 工具创建的 SQL 文件将会包含 table create 和用以将 geometry 列添加到表中的语句。您可以使用此工具的各种命令行选项来不创建这个表。(相关的 PostGIS 文档,请参见 参考资料。)

验证导入

您可以使用类似 pgAdmin III 的管理工具或是通过在此表上执行 SQL SELECT 语句来验证这个导入。您可以在 geometry 列内尝试使用 PostGIS 函数,比如 AsText()AsBinary(),以确保导入成功。


应用程序

用来从刚刚导入的数据创建 KML 的应用程序是一个 J2EE servlet。这个 servlet 将会:

  • 接收状态 FIPS 代码作为输入。
  • 查询这个数据库。
  • 执行坐标转换。
  • 使用数据创建一个 KML。

理解数据

针对一个给定的州的 FIPS 码,导入到数据库内的数据可以具有多个行。一个州有可能由多个非连续的地块组成。例如阿拉斯加州就包括多个岛屿。为了简化我们的应用程序,我们将只选择面积最大的那个地块。

查询数据库并读取 geometry

地理数据可以用两种格式表示:Well Known Binary (WKB) 及 Well Known Text (WKT)。PostGIS 提供了 AsBinary()AsText() 函数来将 geometry 列分别转变为数据的 WKB 和 WKT 表示。查询数据的 SQL 语句如清单 1 所示。


清单 1. 用来检索 WKB 格式的州边界的查询
				
String stateBoundsSql = "SELECT AsBinary(the_geom), name FROM state_bounds WHERE 
   state = '"	+ stateCd + "' ORDER BY area DESC LIMIT 1";
            

GeoTools 库是 Java Topology Suite (JTS) 自带的,它具有类 WKBReader,能将 geometry 的 WKB 表示转变为代表这个 geometry 的 Java 对象。我们使用它将州边界数据转变为 MultiPolygon Java 对象,它是另一个 JTS 类。清单 2 给出了一个例子。


清单 2. 将 geometry 读入一个 JTS Java 对象
				
WKBReader wkbRead = new WKBReader();
Geometry geom = wkbRead.read(resultSet.getBytes(1));
MultiPolygon multiPolygon = (MultiPolygon) geom;
            

坐标转换

从美国人口局导入的数据使用基于 North American Datum 1983 (NAD83) 的空间参照系统。它将地球视为一个近似的椭圆体。基于 Web 的地图库,比如 OpenLayers、Google Maps 和 Microsoft® Bing,均基于 World Geodetic System (WGS) 数据。为了简化在基于 Web 的地图上显示数据所涉及的计算,这些库均认为地球是球体,而非椭圆体。因此,数据需要在转换后才能覆盖在基于 Web 的地图上。可以使用由 GeoTools 库提供的转换函数,如清单 3 所示。


清单 3. 创建转换对象
				
String SOURCE_WKT = "GEOGCS[\"GCS_North_American_1983\",DATUM[\"D_North_American_1983\",
   SPHEROID[\"GRS_1980\",6378137.0,298.257222101]],PRIMEM[\"Greenwich\",0.0],UNIT[
   \"Degree\",0.0174532925199433]], AXIS[\"Latitude\",NORTH]]";

String TARGET_WKT = "GEOGCS[\"WGS 84\",DATUM[\"World Geodetic System 1984\",SPHEROID[
   \"WGS 84\", 6378137.0, 298.257223563, AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",
   \"6326\"]],PRIMEM[\"Greenwich\", 0.0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",
     0.017453292519943295],AXIS[\"Geodetic latitude\", NORTH],AXIS[\"Geodetic longitude\",
    EAST],AUTHORITY[\"EPSG\",\"4326\"]]";

CRSFactory crsFactory = FactoryFinder.getCRSFactory(null);
CoordinateReferenceSystem sourceCRS = crsFactory
					.createFromWKT(SOURCE_WKT);
CoordinateReferenceSystem targetCRS = crsFactory
					.createFromWKT(TARGET_WKT);
Hints hint = new Hints(Hints.LENIENT_DATUM_SHIFT, true);
CoordinateOperationFactory coFactory = FactoryFinder.getCoordinateOperationFactory(hint);
CoordinateOperation co = coFactory.createOperation(sourceCRS,targetCRS);
MathTransform transform = co.getMathTransform();
            

有了用来执行坐标转换的对象后,就可以传递坐标对并逐个对之进行转换。清单 4 给出了一个例子。


清单 4. 转换坐标
				
Coordinate[] coordinates = multiPolygon.getCoordinates();
for (int i = 0; i < coordinates.length; i++) {
	Coordinate coordinate = coordinates[i];
	double x = coordinate.x;
	double y = coordinate.y;
	DirectPosition point = new GeneralDirectPosition(x, y);
	point = transform.transform(point, point);
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
..
}
            

创建 KML

转换坐标后,现在只需要使用它们构造一个 KML 文档(参见 参考资料 获得 KML 文档)。一个用来表示多边形数据的 KML 文档所具有的布局应该如下所示。


清单 5. 用来表示多边形数据的示例 KML
				
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
	<Document>
		<Placemark>
			<MultiGeometry>
				<Style>
					<PolyStyle>
						<color>66FF0000</color>
						<colorMode>normal</colorMode>
						<fill>1</fill>
						<outline>0</outline>
					</PolyStyle>
				</Style>
				<Polygon>
					<LinearRing>
						<coordinates>-109.045,36.99,0
							-109.0451,36.967,0
							-109.0452,36.968,0
							-109.0452,36.958,0
							-109.045,36.99,0
						</coordinates>
					</LinearRing>
				</Polygon>
			</MultiGeometry>
		</Placemark>
	</Document>
</kml>
            

为了保持本文中的代码尽量简单,我们将不会使用 XML 解析器或 JAXB 来构造这个 KML 文档,而是通过追加字符串构造这个 KML,如清单 6 所示。


清单 6. 创建 KML 文档
				
String kmlHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><kml
    xmlns=\"http://earth.google.com/kml/2.0\"><Document><Placemark><MultiGeometry>
<Style><PolyStyle>
   <color>66FF0000</color><colorMode>normal</colorMode><fill>1</fill>
<outline>0</outline></PolyStyle></Style><Polygon><LinearRing><coordinates>";
String kmlFooter = "</coordinates></LinearRing></Polygon></MultiGeometry></Placemark>
   </Document></kml>";
String kmlBody = "";
for (int i = 0; i < coordinates.length; i++) {
	..
	double lat = point.getOrdinate(0);
	double lng = point.getOrdinate(1);
	kmlBody += lng + "," + lat + "," + 0 + "\n";
}
            

查看 KML

提供一个描述州边界的 KML 文档的服务已经准备好了。下一步是创建一个 Web 页面来使用此服务通过 OpenLayers 显示地图上的边界。


清单 7. 使用 KML 服务来覆盖地图形状的 JavaScript
				
map.addLayer(new OpenLayers.Layer.GML("KML",
 "http://localhost:8080/OpenKML/StateKml?stateCd=04", 
   {
	format: OpenLayers.Format.KML, 
	formatOptions: {
	extractStyles: true, 
	extractAttributes: true,
	maxDepth: 2
   }
}));
            

如下所示的图 2 显示了亚利桑纳州的 KML 覆盖,在来自 Metacarta 的基础地图上使用了 OpenLayer。


图 2. OpenLayers 地图上的 KML 覆盖
OpenLayers 地图上的 KML 覆盖 


结束语

借助 mashup,企业就可以开启所有数据类型的潜能。您现在能够提供给用户创建位置应用程序的能力,而成本只是传统应用程序开发范型的很小一部分。

位置智能 mashup 以及基于地图的 mashup 是非常流行的 mashup 类别。随着基于 Web 的地图提供商的出现,现在用较少的资金投入(甚至无需资金投入)就可以很容易地创建基于地图的 mashup。在本文中,您了解了如何使用开源软件来从 ESRI shapefile 创建一个可用在 mashup 内的 KML 边界服务。

<!-- CMA ID: 470202 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

下载

描述 名字 大小 下载方法
示例代码 os-kmlservice-SourceFiles.zip 11KB HTTP
  • 大小: 23.9 KB
  • 大小: 34.4 KB
分享到:
评论

相关推荐

    基于Mashup的推荐书目服务的实现

    ### 基于Mashup的推荐书目服务的实现 #### 一、Mashup在图书馆应用背景 Mashup作为一种新兴的网络应用模式,诞生于Web2.0时代,其核心理念在于通过整合来自不同来源的数据和服务,创造出新的应用形式。这种模式...

    地图Mashup基础信息平台研究与实现.pdf

    网络上有很多资源可以用来构建基于Mashup技术的地理信息服务平台,包括数据服务及实现不同功能的服务,如将含有空间位置信息的数据或元数据与空间数据进行关联,就可以实现地图标注显示或查询等数据服务,此外地理...

    基于移动网络的聚合应用(Mashup)

    基于移动网络的聚合应用(Mashup)是一种创新的软件应用模式,它将来自不同来源的数据和服务集成在一起,形成一个统一的、功能更加强大的新应用。这种应用模式在中国移动研究院的文档中得到了深入探讨,揭示了Mashup在...

    AJAX支持的GOOGLE地图MASHUP教程

    火龙果软件工程技术中心 编辑注:本教程是Dev2DevTechDays2007的附赠品,Dev2DevTechDays2007今年的主题是“构建企业Mashup”。这次研讨会的议题是如何在企业内部有效地使用mashup,会上详细讨论了本教程阐述的技术...

    论文研究-一种基于Mashup的服务聚合模型的研究与设计 .pdf

    这种服务聚合模型首先确定了层次结构,随后又提出了基于Mashup的服务聚合平台,进一步阐述了该模型。 文章所提及的基金项目涉及了多个国家级项目,显示了该研究工作得到了政府和学术机构的支持,并且是当前科技研究...

    孙朝晖-基于开放平台与Mashup 技术环境的Web App设计方法

    根据给定的信息,本文将详细探讨“基于开放平台与Mashup技术环境的Web App设计方法”。该主题由孙朝晖提出,他是飞信互联网产品的首席架构师。 ### Web应用的发展路线 随着互联网技术的不断进步,Web应用也在经历...

    Mashup案例。基于Amazon.com。需要用VS2008打开。

    在这个案例中,我们看到的是一个基于Amazon.com的Mashup项目,这意味着它可能涉及到从Amazon的商品数据库中获取信息,并将其与其他数据或界面元素融合,以提供独特的用户体验。 Amazon作为全球最大的在线零售商,...

    Google map+yahoo!weather-天气查询-mashup

    Weather - 天气查询 Mashup”就是这样一个例子,它巧妙地结合了谷歌地图(Google Map)和雅虎天气(Yahoo! Weather)的服务,为用户提供了实时的地理位置天气查询功能。 首先,让我们了解一下谷歌地图(Google Map...

    基于Oracle Spatial及APEX的Mashup应用的研究与实现.pdf

    Oracle Spatial 技术,构建地图Mashup应用的方法。Oracle APEX 是Oracle公司提供的一款快速应用开发工具,它允许开发者使用Web界面创建交互式的数据驱动应用。Oracle Spatial是Oracle数据库的一个扩展,专门用于处理...

    Foundations of Rapid Mashup Development

    自2005年起,随着Web 2.0技术的发展,Mashup开始受到广泛关注,因其能快速集成各种在线服务,如地图、天气预报、新闻等,形成新的有价值的应用。 ### 2. 快速混合开发的重要性 在当今快速变化的技术环境中,快速...

    web 2.0 mashup开发实践

    Google地图、Flickr、YouTube、Amazon等众多开放平台的涌现,使我们能够方便地将海量的外部Web数据灵活有序地结合起来,创建出各种奇妙的 Web Mashup(混搭)程序,从而大大拓展Web应用的广度和深度。事实上,Google...

    基于Android平台Mashup多服务通信系统的研究与实现.pdf

    "基于Android平台Mashup多服务通信系统的研究与实现" Android 移动操作系统的安全性原理: Android 移动操作系统的安全性原理是指在 Android 平台上,如何保障用户数据和应用程序的安全。 Android 的安全性原理...

    Ajax支持的Google地图Mashup教程

    火龙果软件工程技术中心 本文中将使用工具轻松构建终极的HelloWorldmashup:Google地图mashup……Web开发的新纪元达到了顶峰,这一阶段称为Web2.0。这一时期迎来了新一批原型化Web应用程序,包括blog、wiki和mashup...

Global site tag (gtag.js) - Google Analytics