资源描述
基于Google Earth应用的学习文档
1 了解Google Earth
Google Earth是一款虚拟地球仪软件,它把卫星照片、航空照相和GIS布置在一个地球三维模型上,用户通过客户端软件可以免费方便的浏览全球各地高清晰度卫星地图和图像,还可以方便的分享和下载地标文件,与他人一起交流。
目前最新版本是Google Earth 6,它针对桌面提出了三种不同的版本: Google地球、Google地球专业版和Google地球企业版。专业版增加了一些譬如绘制线条/多边形、GPS导航、统计等功能,但它们的全球的地貌影像与3D数据都是一样的。
除了桌面版,Google还提供了Google地球插件。凭借Google地球插件,您可以使用 Google 地图以及网络中各个网站上的“地球”视图探索3D地球。
Google还提供了移动版,它让您可以在掌上探索地球。目前可在下列移动设备上使用Google地球:Nexus One、Droid、iPhone、iPod Touch和iPad。
2 Google Earth应用
Google 地球插件及其 JavaScript API 使您可以将Google 地图(一种真 3D 数字地球仪)嵌入到您的网页中。使用该 API 您可以绘制标记和折线、使图片覆盖区域、添加 3D 模型或加载 KML 文件,从而允许您构建复杂的 3D 地图应用程序。
2.1 Google Earth入门示例
要在网页中上载入Google插件,您需要进行以下操作:
a) 载入Google地球API
将以下标签置于HTML 网页的 <head> 中,用您自己的密钥(可从 ABCDEF:
<script src="
在新的<script>标签中调用:
google.load("earth", "1");
该调用告知Google将earth模块载入到google.earth命名空间,并指定版本1(API的最新稳定版本)。
b) 创建DIV元素来包含该插件
将Google地球插件载入到具有唯一ID的DIV元素中。添加DIV到网页在的body部分:
<div id="map3d" style="height: 400px; width: 600px;"></div>
c) 创建初始化插件的函数
在此步骤中,您将创建三个函数。它们将按顺序进行以下操作:
Ø 尝试创建新的插件实例
function init() {
google.earth.createInstance('map3d', initCB, failureCB);
}
Ø 在成功创建实例后调用
function initCB(instance) {
ge = instance;
ge.getWindow().setVisibility(true);
}
Ø 在未能创建实例时调用
function failureCB(errorCode) {
}
d) 网页载入后,调用该初始化函数
Google命名空间包括setOnLoadCallback()函数,在载入HTML网页和所请求的API后,该函数将调用所指定的函数。使用此函数可确保只有在网页 DOM 完全扩展后才载入插件。
google.setOnLoadCallback(init);
2.2 Google Earth API的使用
Google 为Google Earth开发者提供了JavaScript版的API文档。以下示例代码中的“ge”指的就是入门示例中成功创建插件实例后返回的实例对象。
1) 导航控制条的显示控制
该功能涉及到GENavigationControl对象,调用的方法为:
ge.getNavigationControl().setVisibility(GEVisibilityEnum visibility)。
Visibility的值可为:
GEPlugin.VISIBILITY_SHOW,显示
GEPlugin.VISIBILITY_HIDE,隐藏
GEPlugin.VISIBILITY_AUTO,当鼠标移到上面时显示,移开后隐藏
2) 添加地标
该功能涉及到KmlPlacemark对象,调用示例:
// Create the placemark.
var placemark = EARTH.ge.createPlacemark('');
//定义地标名称
placemark.setName("温州某湖边");
//自定义地标图标
var icon = EARTH.ge.createIcon('');
//设置图标URL
icon.setHref('
var style = EARTH.ge.createStyle('');
style.getIconStyle().setIcon(icon);
//设置图标大小,比例值
style.getIconStyle().setScale(0.5);
placemark.setStyleSelector(style);
// Set the placemark's location.
var point = EARTH.ge.createPoint('');
point.setlatitude(28.030127);
point.setLongitude(120.404651);
placemark.setGeometry(point);
// Add the placemark to Earth.
EARTH.ge.getFeatures().appendChild(placemark);
示例效果:
3) 定位到地图项
该功能涉及到KmlLookAt对象,代码示例为:
this.flyTo = function(fLat, fLng, fRange) {
var la = this.ge.createLookAt('');
la.set(fLat,//地图项纬度
fLng,//地图项经度
0, // altitude
this.ge.ALTITUDE_RELATIVE_TO_GROUND,
0, // heading
0, // straight-down tilt
fRange // range (inverse of zoom)
);
this.ge.getView().setAbstractView(la);
4) 显示道路
该功能涉及到KmlLayerRoot对象,示例代码:
this.ge.getLayerRoot().enableLayerById(this.ge.LAYER_ROADS, true);
可替换第一个参数,显示其他的地图项:
LAYER_TERRAIN 显示地形
LAYER_ROADS 显示道路
LAYER_BUILDINGS 显示建筑
LAYER_BUILDINGS_LOW_RESOLUTION 低分辨率下显示建筑
LAYER_BORDERS 显示边界
LAYER_TREES 显示树林
效果图:
5) 加载KML和KMZ文件
涉及到KmlNetworkLink对象,示例代码:
//strUrl为KML或者KMZ文件的链接地址,bflyToView为加载后是否定位到地图项
this.loadKml = function(strUrl, bflyToView) {
var link = this.ge.createLink('');
var networkLink = this.ge.createNetworkLink('');
link.setHref(strUrl);
networkLink.set(link, false, bflyToView);
this.addFeature(networkLink);
}
以下是加载从数据库中的读取空间数据后生成的KML文件的示例,效果图如下:
6) 为地球绑定事件
功能代码示例:
clickEvent : function() {
google.earth.addEventListener(EARTH.ge.getWindow(), 'click', EARTHManager.handlerCreatePolygonClick);
},
handlerCreatePolygonClick : function(event) {
alert("纬度:" + event.getLatitude() + " 经度:" + event.getLongitude());
},
以下是为地球绑定点击事件,并弹出点击的地球经纬度。效果图如下:
7) 画多边形
该功能涉及到KmlPoint和KmlPloygon对象,其整合了“添加地标”及“绑定事件”。
示例效果图:
以上只是部分API的使用,更多Google Earth API的使用可参考Google地球API。
2.3 KML
KML是一种文件格式,用于在地球浏览器中显示地理数据。您可以针对精确位置创建KML文件、添加地标并以新的方式展示丰富的数据。KML是由开放地理空间联盟OGC维护的国际标准。
KML使用含有嵌套的元素和属性的基于标记的结构,并符合XML标准。所有标记都区分大小写,而且完全如 KML参考中列出的那样显示。该参考指出了哪些标记是可选的。在指定元素内,标记必须按照参考中显示的顺序显示。
KML 元素的类树如下所示。在该图中,树中特定分支右侧的元素是其左侧元素的“扩展”。它包含属于“地图项”的所有元素,另外还增加了一些地标元素特有的元素。抽象元素(在该图的方框中显示的元素)实际上并不在 KML 文件中使用。它们是一种有用的方法,可让单个元素用作多个相似(但不相同)派生元素的编程基础。
GC KML标准提供了一种扩展机制-包含标准中可用信息之外信息的其他元素。随着Google地球5.0的启动,Google已经为KML提供了扩展,以支持大量新地图项(上图中的红色标签部分)。这些扩展使用gx前缀和忙下名称空间URI:xmlns:gx=" xmlns=”
xmlns:gx="
KML 文件的 MIME 类型是application/vnd.google-earth.kml+xml, KMZ 文件的MIME 类型是application/vnd.google-earth.kmz。对于 Apache,将以下行添加到“httpd.conf”文件:
AddType application/vnd.google-earth.kml+xml .kml
AddType application/vnd.google-earth.kmz .kmz
关于在 Microsoft 的 IIS 上设置 MIME 类型的详细信息,请参见 Microsoft 文档。
3 Oracle Spatial数据库
Oracle支持自定义的数据类型,你可以用数组,结构体或者带有构造函数,功能函数的类来定义自己的对象类型。这样的对象类型可以用于属性列的数据类型,也可以用来创建对象表。而oracle spatial也正是基于此种特性所开发的一套空间数据处理系统。
Spatial的自定义数据类型有很多,都在mdsys方案下,经常使用的是sdo_geometry类型。sdo_geometry表示一个几何对象,可以是点、线、面、多点、多线、多面或者混合对象。
Spatial在此数据类型的基础上,实现了R树空间索引和四叉树空间索引,还以sql函数的形式实现了多种空间分析功能。
Oracle Spatial主要通过元数据表、空间数据字段(即SDO_GEOMETRY字段)和空间索引来管理空间数据,并在此基础上提供一系列空间查询和空间分析的函数,让用户进行更深层次的GIS应用开发。Oracle Spatial使用空间字段SDO_GEOMETRY存储空间数据,用元数据表来管理具有SDO_GEOMETRY字段的空间数据表,并采用R树索引和四叉树索引技术来提高空间查询和空间分析的速度。
a) 元数据表说明
Oracle Spatial的元数据表存储了有空间数据的数据表名称、空间字段名称、空间数据的坐标范围、坐标参考信息以及坐标维数说明等信息。用户必须通过元数据表才能知道Oracle数据库中是否有Oracle Spatial的空间数据信息。一般可以通过元数据视图访问元数据表。
select * from USER_SDO_GEOM_METADATA t;
b) 空间字段解析
Oracle Spatial的空间数据都存储在空间字段SDO_GEOMETRY中,理解sdo_geometry是编写Oracle Spatial接口程序的关键。SDO_GEOMETRY按照OpenGIS规范定义的一个对象,其原始的创建方式如下所示。
Create Type Sdo_Geometry As Object(
Sdo_Gtype Number,
Sdo_SRID Number,
Sdo_Point Sdo_Point_Type,
Sdo_Elem_Info Mdsys.Sdo_Elem_Info_Array,
Sdo_Ordinates Mdsys.Sdo_Ordinate_Array);
该对象由五个部分组成,下面分别介绍这五个部分的定义方法。
(1)SDO--GTYPE
SDO_GTYPE是一个NUMBER型的数据,用来定义存储对象的类型。SDO_GTYPE是一个4个数字的整数,其格式为dltt,其中d表示几何对象的维数;l表示三维线性参考系统中的线性参考值,当d为3维或都4维时需要设置该值,一般情况下为空;tt为几何对象的类型,OracleSpatial定义了7种类型的几何类型,目前,tt使用了00到07(包括一种用户自定义类型),另外,08到99是OracleSpatial保留的数字,以备将来几何对象扩展所用。
数值
几何类型
说明
dl00
未知类型
用于存放自定义类型的几何对象,如样条曲线等
dl01
点
几何对象包含1个点
dl02
直线或者弧线
几何对象由直线段和弧线段组成
dl03
多边形
几何对象包含一个的多边形,该多边形可以含有洞
dl04
多种形状集合
点、线、多边形超集,可包含所有类型
dl05
复合点
几何对象包含1个或多个点,是点类的超集
dl06
复合线
几何对象包含1个或多个线串
dl07
复合多边形
几何对象可以包含多个外环、多个不相交的多边形
(2)SDO_SRID
SDO_SRID也是一个NUMBER型的数值,它用于标识与几何对象相关的空间坐标参考第。如果SDO_SRID为空(null),则表示没有坐标系与该几何对象相关;如果该值不为空,则该值必须为MDSYS.CS_SRS表中SRID字段的一个值,在创建含有几何对象的表时,这个值必须加入到描述空间数据表元数据的USER_SDO_GEOM_METADATA视图的SRID字段中。Oracle SPatiat规定,一个几何字段中的所有几何对象都必须为相同的SDO_SRID值。
(3)SDO_POINT
SDO_POINT是一个包含X,Y,Z数值信息的对象,用于表示几何类型为点的几何对象。如果SDO_ELEM_INFO和SDO_ORDINATES数组都为 空,则SDO--POINT中的X,Y,Z为点对象的坐标值,否则SDO_POINT的值可以忽略(用NULL表示)。
(4)SDO_ELEM_INFO
SDO_ELEM_INFO是一个可变长度的数组,每3个数作为一个元素单位,用于解释坐标是如何存储在SDO_ORDINATES数组中的。本文把组成三个元素的3个数称为3元组。一个3元组包含以下3部分:
Ø SDO_STARTING_OFFSET
表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置。它的值从1开始,逐渐增加。
Ø SDO_ETYPE
用于表示几何对象中每个组成元素的几何类型。当它的值为1,2,1003和2003时,表明这个几何元素为简单元素。如果SDO_ETYPE为1003,表明该多边形为外环,坐标值以逆时针存储;如果SDO_ETYPE为2003,青蛙该多边形为内环(第一个数为2表示内环),坐标值以顺 时针存储。
Ø SDO_INTERPRETATION
具有两层含义,具体的作用由SDO_ETYPE是否为复杂元素决定。如果SDO_ETYPE是复杂元素(4,1005和2005),则SDO_INTERPRETATION表示它后面有几个子3元组属于这个复杂元素。如果SDO_ETYPE是简单元素(1,2,1003和2003),则sdo_INTERPRETATION表示该元素的坐标值在SDO_ORDINATES中是如何排列的。
(5)SDO_ORDINATES
sdo_ordinates是一个可变长度的数组,用于存储几何对象的真实坐标,该数组的类型为NUMBER型,它的最大长度为1048576.sdo_ordinates必须与sdo_elem_info数组配合使用,才具有实际意义。sdo_ordinates的坐标存储方式由几何对象的维 数决定,如果几何对象为三大维,则sdo_ordinates的坐标以{X1,Y1,Z1,X2,Y2,Z2,....}的顺序排列,如果几何对象为二维,则sdo_ordinates的坐标以{x1,Y1,X2,Y2,....}顺序排列。
insert into bjpic.geod_country
values(
20,
mdsys.sdo_geometry(
2007,
null,
null,
mdsys.sdo_elem_info_array(1,1003,1,53,1003,1),
mdsys.sdo_ordinate_array(109.63316,18.13594,109.142250)
)
);
c) Oracle Spatial空间索引技术
Oracle Spatial提供了R树索引和四叉树索引两种索引机制提高空间查询和空间分析 的速度。用户需要根据空间数据的不同类型创建不同的索引,当空间数据类型比较复杂时,如果选择索引类型不当,将使Oracle Spatial创建索引的过程变得非常慢。
创建R树索引:
create index territory_idx on territories(territory_geom)
indextype is mdsys.spatial_index;
创建四叉树索引:
create index roads_fixed on roads(shape)
indextype is mdsys.spatial_index
parameters('SDO_LEVEL=8');
d) Oracle Spatial建表步骤:
Ø 创建空间数据表
CREATE TABLE GEOD_CITIES(
CITY_ID NUMBER Primary key,
CITY_NAME Varchar2(42),
LOCAT MDSYS.SDO_GEOMETRY);
Ø 插入空间表元数据
CREATE TABLE GEOD_CITIES(
CITY_ID NUMBER Primary key,
CITY_NAME Varchar2(42),
LOCAT MDSYS.SDO_GEOMETRY);
Ø 在空间数据字段上建立索引
create index GEOM_CITIES_IDX
on geod_cities(locat)
indextype is mdsys.spatial_index;
Ø 向空间数据表中插入数据
insert into geod_cities values(
1,
'北京',
mdsys.sdo_geometry(2001,null, mdsys.sdo_point_type(101.0001,0.989999,null), null,null));
e) 在Java中通过Oracle Spatial API来存取空间数据的示例。
Ø 获取空间数据的示例:
try {
statement = connection.createStatement();
resultSet = statement.executeQuery("select locat from geod_cities where city_id = 1");
while (resultSet.next()) {
STRUCT struct = (STRUCT) resultSet.getObject(1);
JGeometry geometry = JGeometry.load(struct);
double[] coors = geometry.getPoint();
for (int i = 0; i < coors.length; i++) {
LOGGER.info("Coors[" + i + "] = " + coors[i]);
}
}
LOGGER.debug("获取数据成功!");
} catch (SQLException e) {
LOGGER.error(" 获取数据失败!", e);
}
Ø 存储空间数据的示例
try {
PreparedStatement preparedStatement = connection.prepareStatement("insert into geod_cities values(?,?,?)");
JGeometry geometry2 = JGeometry.createPoint(new double[]{99.000001,76.000001},2,0);
STRUCT struct2 = JGeometry.store(geometry2,connection);
preparedStatement.setLong(1,4L);
preparedStatement.setString(2,"aaabb");
preparedStatement.setObject(3,struct2);
int resultRow = preparedStatement.executeUpdate();
LOGGER.debug("Row : " + resultRow);
LOGGER.debug("保存数据成功!");
}catch (SQLException e){
LOGGER.error("保存数据失败!",e);
}
4 Google Earth与Google Map
Google Maps里面有矢量图(就是我们平常所看的普通地图)和卫星照片图。卫星照片的数据来源和Google Earth完全相同,所以清晰度是完全一样的。
正因Google Earth与Google Map的数据来源一样,它们表现的数据也是一样的,不同的是表现的方式:Google Earth采用的是Google在04年收购的keyhole的KML标记语言来描述和保存地理信息;而Google Map则是采用HTML和图片的形式来表现数据的。Google Earth也是像Google Map那样当个浏览器,只不过Google Map浏览的网页是HTML格式的文件,而Google Earth浏览的是KML的压缩格式KMZ格式的文件,它们都是通过网络传输的方式传给用户的。
同时Google Earth还具有Google Map没有的功能,比如缓存,你曾经浏览过的一些地方,下一次就会快些;大量的地标,用户还可以标注自己的地标;“飞行模式”,在Google Earth里面点一个地标,地球可以飞速转动并平滑降落到那个地方。
因为两者采用的都是Ajax技术传输的地图,所以用户可以方便的在地图上放大、缩小、移动而不用再次传输数据,这就是所谓的异步,它极大地提高了用户的体验性。Google Earth和Google Map都有一个共同的缺点它们的内容都是静态的,或者说是相对静态的,不会实时更新数据。
5 相关资料
Google Earth API Reference
KML文档
Oracle Spatial 简介
Oracle Spatial Java API
Oracle Spatial开发指南
地标下载
http://vway.info/
Google Earth & Google Map ——数据存储、管理、表现及开发机制
展开阅读全文