1、2008-07-09Google Earth API 开发者指南(高级)(2008-07-10 12:43:39)标签:google earth 开发 应用 财经 分类:学海拾贝感慨:Google Earth 真是一个好东东,而其爱好者更是天才啊。我们与老美在科技上的差距,不是我们以环境、资源为代价的粗放式快速增长的 GDP 所能掩盖的。Google Earth API 开发者指南(高级)-摘自 Godeyes 创建地面覆盖地面覆盖,允许您在 Google Earth 的地表上放置图像。其中,图像源自网络,图片的 URL包含在“Icon”对象内。var groundOverlay = ge.c
2、reateGroundOverlay( );groundOverlay.setIcon(ge.createIcon( )groundOverlay.getIcon().setHref(“http:/ );var center = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);var north = center.getLatitude() + .85;var south = center.getLatitude() - .85;var east = center.getLongitude() + .55;var west =
3、 center.getLongitude() - .55;var rotation = 0;var latLonBox = groundOverlay.getLatLonBox();latLonBox.setBox(north, south, east, west, rotation);ge.getFeatures().appendChild(groundOverlay);此例中,Google 的 logo 被叠放在加州总部山景城的位置。地面覆盖的特点是始终吸附在地表,无论图像放在山脉还是河谷,如下图所示:创建屏幕覆盖屏幕覆盖是指图片固定在屏幕上,不像地面覆盖那样跟随地表起伏而变化。屏幕覆盖通
4、常用来做 logo、商标、图例等,其长宽尺寸由 size 属性决定。图像位置(screenXY 属性)由图中的安置点(overlayXY 属性)控制,其旋转角度由 rotationXY 属性决定。下列代码将用 Google 标志图来创建一个屏幕覆盖,并倾斜一定角度。var screenOverlay = ge.createScreenOverlay( );screenOverlay.setIcon(ge.createIcon( );screenOverlay.getIcon().setHref(“http:/ Set screen position in pixelsscreenOverlay
5、.getOverlayXY().setXUnits(ge.UNITS_PIXELS);screenOverlay.getOverlayXY().setYUnits(ge.UNITS_PIXELS);screenOverlay.getOverlayXY().setX(400);screenOverlay.getOverlayXY().setY(200);/ Rotate around object s center pointscreenOverlay.getRotationXY().setXUnits(ge.UNITS_FRACTION);screenOverlay.getRotationXY
6、().setYUnits(ge.UNITS_FRACTION);screenOverlay.getRotationXY().setX(0.5);screenOverlay.getRotationXY().setY(0.5);/ Set object s size in pixelsscreenOverlay.getSize().setXUnits(ge.UNITS_PIXELS);screenOverlay.getSize().setYUnits(ge.UNITS_PIXELS);screenOverlay.getSize().setX(300);screenOverlay.getSize()
7、.setY(75);/ Rotate 45 degreesscreenOverlay.setRotation(45);ge.getFeatures().appendChild(screenOverlay);效果如下图所示:样式地图样式地图在一般情况为地标下提供两种状态:普通状态和高亮状态,分别由两种图标来表示,当用户在 Google Earth 中用鼠标在地标图案上经过时,图案会自动切换至高亮状态。下例代码中,地标在普通状态时,图案为三角形,当鼠标在地标上方经过时,其图案变为矩形。map = ge.createStyleMap( styleMap + counter);/ Create ico
8、n normal for style mapnormal = ge.createIcon( );normal.setHref( http:/ );iconNormal = ge.createStyle( styleIconNormal + counter);iconNormal.getIconStyle().setIcon(normal);? / Create icon highlight for style maphighlight = ge.createIcon( );highlight.setHref( http:/ );iconHighlight = ge.createStyle( s
9、tyleIconHighlight + counter);iconHighlight.getIconStyle().setIcon(highlight);? / Set normal and highlight for stylemapmap.setNormalStyleUrl( #styleIconNormal + counter);map.setHighlightStyleUrl( #styleIconHighlight + counter);? / Apply to placemarkplacemark.setStyleUrl( #styleMap + counter);管理地形、道路、
10、边界当浏览器窗口加载 Google Earth 插件时,地形特征将被作为默认选项被显示,无需手动干预。并不是所有 Google Earth 图层特性被显示出来,如果要在浏览器内显示,那么下列JavaScript 代码将教您怎么做:显示建筑三维模型ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true);隐藏建筑三维模型ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, false);显示边界ge.getLayerRoot().enableLayerById(ge.LAYER_B
11、ORDERS, true);隐藏边界ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, false);显示地形ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, true);隐藏地形ge.getLayerRoot().enableLayerById(ge.LAYER_TERRAIN, false);KML 分析如果您手上有一段 KML 代码,那么就可以让 Google Earth 插件对其进行分析用ge.parseKml 对象把 KML 转换成 JavaScript。示例代码如下:var p
12、entagon = ge.parseKml(+The Pentagon +1 +relativeToGround +-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.872532598928
13、24,100 +-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 +);ge.getFeatures().appendChild(pentagon)
14、;var la = ge.createLookAt( );la.set(38.867, -77.0565, 500, ge.ALTITUDE_RELATIVE_TO_GROUND, 0, 45, 900);ge.getView().setAbstractView(la);上述代码效果如下图所示:察看模型Google Earth 插件支持立体模型(三维场景)。把三维模型导入 Google Earth 后,会自动转换格式、旋转角度、伸缩大小,以适应 Google Earth 的坐标系统。下列代码将加载一个 Collada 模型,并将其显示出来。(注:COLLADA 的全名是“COLLAborati
15、ve Design Activity”,是用来建立 3D 互动程序的一个文件格式,而此格式就叫做“dae”,全名是“digital asset exchange”。COLLADA 主要定义一个开放式的XML Schema 标准。也就是说,你在 3D 软件所建好的模型,只要透过 COLLADA 的外挂软件就可以输出成dae的档案,而这个档案所包含的内容就是以 XML 文字数据的形式来描述的。)placemark = ge.createPlacemark( );placemark.setName( model );model = ge.createModel( );ge.getFeatures()
16、.appendChild(placemark);loc = ge.createLocation( );model.setLocation(loc);link = ge.createLink( );/ A textured model created in Sketchup and exported as Collada.var href = window.location.href;var pagePath = href.substring(0, href.lastIndexOf( / ) + / ;link.setHref(pagePath + splotchy_box.dae );mode
17、l.setLink(link);la = ge.getView().copyAsLookAt(ge.ALTITUDE_RELATIVE_TO_GROUND);loc.setLatitude(la.getLatitude();loc.setLongitude(la.getLongitude();placemark.setGeometry(model);la.setRange(300);la.setTilt(80);ge.getView().setAbstractView(la);察看太空您可以创建程序来观察天空星星、月亮、星座、星系就像 Google Earth 里的 Sky功能一样。当程序切换
18、到天空模式时,界面也会自动切换。所有星空数据均被放置在虚拟圆形地球的内部,我们的视角切换到球形核心,抬头仰望便可一览苍穹。坐标星空坐标由赤经和赤纬组成。赤经:从春分点沿着天赤道向东到天体时圈与天赤道的交点所夹的角度,成为该天体的赤经。赤经与时角不同,时角是由天子午圈向西量,而赤经是由春分点向东量,两者方向相反。赤经(Right ascension, RA; 符号:希腊字母 ),天文学名词。指赤道坐标系的经向坐标,过天球上一点的赤经圈与过春分点的二分圈所交的球面角。天球上相当于地球经线的线,通过天球两极并与天赤道垂直。以时、分、秒表示。赤纬:从天赤道沿着天体的时圈至天体的角度称为该天体的赤纬。以
19、天赤道为赤纬 0,向北为正,向南为负,分别从 0到 90。日赤纬的变化范围在2327 +2327 之间,而月赤纬的最大变化范围为2836 +2836 .赤纬常用 表示。在第二赤道坐标系中,天体的位置根据规定用经纬度来表示,称作赤经()、赤纬()。赤纬就是天体的位置与天赤道位置的差,在天赤道以北多少度就为正多少度,反之,在天赤道以南多少度为负多少度。赤纬的取值为-90 度到+90 度,南天极的赤纬为-90 度,北天极的赤纬为+90 度,天赤道的赤纬为 0 度。天球赤道坐标系的纬度规定与地球纬度类似。只是不称作“南纬”和“北纬”,天球赤纬以北纬为正,以南为负。用 set 方法把地球界面切换至天空:
20、ge.getOptions().setMapType(ge.MAP_TYPE_SKY);反之,把界面从天空切换回地球:ge.getOptions().setMapType(ge.MAP_TYPE_EARTH);计算 LookAt 对象里的 Range 值当您使用 LookAt 对象来处理星空数据时,必须用下列公式计算出 r 的距离。r = R*(k*sin(/2) - cos(/2) + 1)公式中各参数说明如下:r:即 range 的值,由标签指定。R:为假设星空球体的半径。在这里,星空球面为地球内表面,“ Center of Earth”为地球核心,因此 R 值实为地球半径 6.37810
21、6。k:等于 1 / tan ( 2 / ),或者用近似数替代:1.1917536:是一个角度范围(Using Google Earth API with the Maps APIfunction initialize() var map = new GMap2(document.getElementById(“map“);map.setCenter(new GLatLng(37.4419, -122.1419), 13);map.addMapType(G_SATELLITE_3D_MAP);map.addControl(new GHierarchicalMapTypeControl();/
22、Uncomment the following line to start the map with 3D enabled./ map.setMapType(G_SATELLITE_3D_MAP);/ Obtain a pointer to the Google Earth instance attached to/ your map.map.getEarthInstance(getEarthInstanceCB);var ge;function getEarthInstanceCB(object) ge = object;/ You can now manipulate ge using t
23、he full Google Earth API.大家从以上代码可以看出,在已有地图中添加新类型,只需调用gMap.addMapType(G_SATELLITE_3D_MAP)。如果您的地图上有按钮条,那么上述代码就会在按钮条中新增一项“Earth”,当用户点击它,地球窗口就会显示出来,各种标记、图形、文本等提示框,均能在地球窗口内正常显示。除了 addMapType,您还可以用 gMap.setMapType(G_SATELLITE_3D_MAP)直接把地图切换至Google Earth。同样,调用 gMapType.setMapType()可以隐藏 Google Earth 窗口,地图切换到其他类型。