日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

谷歌地球API开发者指南(高级)

發布時間:2025/4/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谷歌地球API开发者指南(高级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
谷歌地球API開發者指南(高級)

??? 作者感慨:Google Earth真是一個好東東,而其愛好者更是天才啊。我們與老美在科技上的差距,不是我們以環境、資源為代價的粗放式快速增長的GDP所能掩蓋的

??? Google Earth API開發者指南(高級)

??? 創建地面覆蓋


??? 地面覆蓋,允許您在Google Earth的地表上放置圖像。其中,圖像源自網絡,圖片的URL包含在“Icon”對象內。

var groundOverlay = ge.createGroundOverlay( );groundOverlay.setIcon(ge.createIcon( ))groundOverlay.getIcon().setHref("http://www.google.com/intl/en_ALL/images/logo.gif");groundOverlay.setLatLonBox(ge.createLatLonBox( ));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 = center.getLongitude() - .55;var rotation = 0;var latLonBox = groundOverlay.getLatLonBox();latLonBox.setBox(north, south, east, west, rotation);ge.getFeatures().appendChild(groundOverlay);
??? 此例中,Google的logo被疊放在加州總部山景城的位置。

??? 地面覆蓋的特點是始終吸附在地表,無論圖像放在山脈還是河谷,如下圖所示:

??? 創建屏幕覆蓋


??? 屏幕覆蓋是指圖片固定在屏幕上,不像地面覆蓋那樣跟隨地表起伏而變化。屏幕覆蓋通常用來做logo、商標、圖例等,其長寬尺寸由size屬性決定。圖像位置(screenXY屬性)由圖中的安置點(overlayXY屬性)控制,其旋轉角度由rotationXY屬性決定。下列代碼將用Google標志圖來創建一個屏幕覆蓋,并傾斜一定角度。

var screenOverlay = ge.createScreenOverlay( );screenOverlay.setIcon(ge.createIcon( ));screenOverlay.getIcon().setHref("http://www.google.com/intl/en_ALL/images/logo.gif");// Set screen position in pixelsscreenOverlay.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().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().setY(75);// Rotate 45 degreesscreenOverlay.setRotation(45);ge.getFeatures().appendChild(screenOverlay);
??? 效果如下圖所示:

??? 樣式地圖


??? 樣式地圖在一般情況為地標下提供兩種狀態:普通狀態和高亮狀態,分別由兩種圖標來表示,當用戶在Google Earth中用鼠標在地標圖案上經過時,圖案會自動切換至高亮狀態。

??? 下例代碼中,地標在普通狀態時,圖案為三角形,當鼠標在地標上方經過時,其圖案變為矩形。

map = ge.createStyleMap( styleMap + counter);// Create icon normal for style mapnormal = ge.createIcon( );normal.setHref( http://maps.google.com/mapfiles/kml/shapes/triangle.png );iconNormal = ge.createStyle( styleIconNormal + counter);iconNormal.getIconStyle().setIcon(normal);? // Create icon highlight for style maphighlight = ge.createIcon( );highlight.setHref( http://maps.google.com/mapfiles/kml/shapes/square.png );iconHighlight = ge.createStyle( styleIconHighlight + counter);iconHighlight.getIconStyle().setIcon(highlight);// Set normal and highlight for stylemapmap.setNormalStyleUrl( #styleIconNormal + counter);map.setHighlightStyleUrl( #styleIconHighlight + counter);// Apply to placemarkplacemark.setStyleUrl( #styleMap + counter);}

??? 管理地形、道路、邊界


??? 當瀏覽器窗口加載Google Earth插件時,地形特征將被作為默認選項被顯示,無需手動干預。并不是所有Google Earth圖層特性被顯示出來,如果要在瀏覽器內顯示,那么下列JavaScript代碼將教您怎么做:

??? 顯示建筑三維模型

??? ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, true);

??? 隱藏建筑三維模型

??? ge.getLayerRoot().enableLayerById(ge.LAYER_BUILDINGS, false);

??? 顯示邊界

??? ge.getLayerRoot().enableLayerById(ge.LAYER_BORDERS, 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 pentagon = ge.parseKml(<?xml version="1.0" encoding="UTF-8"?> +<kml xmlns="http://earth.google.com/kml/2.1"> +<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> );ge.getFeatures().appendChild(pentagon);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的全名是“COLLAborative 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().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 );model.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功能一樣。當程序切換到天空模式時,界面也會自動切換。所有星空數據均被放置在虛擬圓形地球的內部,我們的視角切換到球形核心,抬頭仰望便可一覽蒼穹。

??? 坐標


??? 星空坐標由赤經和赤緯組成。

??? 赤經:從春分點沿著天赤道向東到天體時圈與天赤道的交點所夾的角度,成為該天體的赤經。赤經與時角不同,時角是由天子午圈向西量,而赤經是由春分點向東量,兩者方向相反。赤經(Right ascension, RA; 符號:希臘字母α),天文學名詞。指赤道坐標系的經向坐標,過天球上一點的赤經圈與過春分點的二分圈所交的球面角。天球上相當于地球經線的線,通過天球兩極并與天赤道垂直。以時、分、秒表示。

??? 赤緯:從天赤道沿著天體的時圈至天體的角度稱為該天體的赤緯。以天赤道為赤緯0°,向北為正,向南為負,分別從0°到90°。日赤緯的變化范圍在-23°27 ~+23°27 之間,而月赤緯的最大變化范圍為-28°36 ~+-28°36 .赤緯常用δ表示。在第二赤道坐標系中,天體的位置根據規定用經緯度來表示,稱作赤經(α)、赤緯(δ)。赤緯就是天體的位置與天赤道位置的差,在天赤道以北多少度就為正多少度,反之,在天赤道以南多少度為負多少度。赤緯的取值為-90度到+90度,南天極的赤緯為-90度,北天極的赤緯為+90度,天赤道的赤緯為0度。天球赤道坐標系的緯度規定與地球緯度類似。只是不稱作“南緯”和“北緯”,天球赤緯以北緯為正,以南為負。

??? 用set方法把地球界面切換至天空:

??? 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的值,由<LookAt>標簽指定。

??? R:為假設星空球體的半徑。在這里,星空球面為地球內表面,“ Center of Earth”為地球核心,因此R值實為地球半徑6.378×106。

??? k:等于1 / tan ( 2 / α),或者用近似數替代:1.1917536

??? α:是一個角度范圍(β<α<180°)。當觀察點向地球原點移動時所形成的夾角。

??? β:用戶所需星空圖像兩邊與地球原點的夾角(單位:秒)。

??? 與Google Maps相結合


??? 如果您是一位Google Maps開發者,想把網絡地圖移植到Google Earth插件里以增強互動效果,現在變得輕而易舉。Google Maps API為Gmap2類增加了一個新方法,為Gmap類型增加了一個新常量,允許你在已有的網絡地圖中增加Google Earth三維功能。

??? 下例中,網頁中的Google Map新增了一個“Earth”按鈕,可以隨時在Map與Earth之間切換。

Google Earth谷歌地球API開發者指南(高級)

??? 當您點擊“Earth”按鈕時,窗口切換至Google Earth,地點未變。

Google Earth谷歌地球API開發者指南(高級)

??? 示例代碼如下:
?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml"xmlns:v="urn:schemas-microsoft-com:vml"><head><title>Using Google Earth API with the Maps API</title><script src="http://maps.google.com/maps?file=api&v=2.x&key=abcdefg" type="text/javascript"></script>function 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());// 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 the full Google Earth API.}</script></head><body οnlοad="initialize()" onunlaod="GUnload"><div id="map" class="map" style="width:500px;height:350px"></div></body></html>

??? 大家從以上代碼可以看出,在已有地圖中添加新類型,只需調用gMap.addMapType(G_SATELLITE_3D_MAP)。如果您的地圖上有按鈕條,那么上述代碼就會在按鈕條中新增一項“Earth”,當用戶點擊它,地球窗口就會顯示出來,各種標記、圖形、文本等提示框,均能在地球窗口內正常顯示。

??? 除了addMapType,您還可以用gMap.setMapType(G_SATELLITE_3D_MAP)直接把地圖切換至Google Earth。同樣,調用gMapType.setMapType()可以隱藏Google Earth窗口,地圖切換到其他類型。

轉自

http://www.d3dweb.com/Documents/201203/17-17562793368.html


GEHelper.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text;public static class GEHelper{#region// Keep an angle(角度) in [-180,180]/*** Keep an angle in the [-180, 180] range* @param {number} a Angle in degrees* @return {number} The angle in the [-180, 180] degree range*/private static Double fixAngle(double a){while (a < -180)a += 360;while (a > 180)a -= 360;return a;}/*** Converts degrees(角度) to radians(弧度)* @param {number} d Degrees* @return {number} Radians*/private static decimal deg2rad(decimal d){return d * Convert.ToDecimal(Math.PI) / Convert.ToDecimal(180.0);}/*** Converts radians(弧度) to degrees(角度)* @param {number} r Radians* @return {number} Degrees*/private static double rad2deg(double r){return r * 180.0 / Math.PI;}/** 計算兩點之間的方位* Calculates the heading/bearing between two locations. Taken from the formula* provided at http://mathforum.org/library/drmath/view/55417.html* @param {google.maps.LatLng} loc1 The start location* @param {google.maps.LatLng} loc2 The destination location* @return {number} The heading from loc1 to loc2, in degrees*/public static double getHeading(GeMode ge1, GeMode ge2){decimal lat1; decimal lon1; decimal lat2; decimal lon2;lat1 = deg2rad(ge1.lat);lon1 = deg2rad(ge1.lng);lat2 = deg2rad(ge2.lat);lon2 = deg2rad(ge2.lng);var heading = fixAngle(rad2deg(Math.Atan2(Math.Sin(Convert.ToDouble(lon2 - lon1)) * Math.Cos(Convert.ToDouble(lat2)),Math.Cos(Convert.ToDouble(lat1)) * Math.Sin(Convert.ToDouble(lat2)) - Math.Sin(Convert.ToDouble(lat1)) * Math.Cos(Convert.ToDouble(lat2)) *Math.Cos(Convert.ToDouble(lon2 - lon1)))));return heading;}/// <summary>/// //找到兩點之間的中間/*** Calculates an intermediate lat/lon, (100 * f)% between loc1 and loc2* @param {google.maps.LatLng} loc1 The start location* @param {google.maps.LatLng} loc2 The end location* @return {google.maps.LatLng} An intermediate location between loc1 and loc2*//// </summary>/// <param name="ge1"></param>/// <param name="ge2"></param>/// <param name="f"></param>/// <returns></returns>public static GeMode interpolateLoc(GeMode ge1, GeMode ge2, decimal f){//decimal d = Convert.ToDecimal(getHeading(ge1, ge2));decimal lat = ge1.lat + f * (ge2.lat - ge1.lat);decimal lng = ge2.lng + f * (ge2.lng - ge1.lng);GeMode ge = new GeMode(lat, lng);return ge;}#endregion#region/*** 經線方向長度轉化成緯度* @param {leng} 經線向量長度(米)* @return 返回緯度差*/private static decimal lenToLat(decimal leng){var L = 10002150; // 半個經線長度(經線圈的1/4),對應90°緯度var angle = 90 * leng / L; return angle;}/*** 緯線方向長度轉化成經度* @param {lat} 緯度值 * @param {leng} 緯線向量長度(米)* @return 返回精度差*/private static decimal lenToLng(decimal lat, decimal leng){var L = 20037508; // 赤道一半長度(半圈,對應180°經度)var latL = Convert.ToDecimal(L * Math.Cos(Math.PI / 180 * Convert.ToDouble(lat))); // 指定緯度對應的緯線長度(半圈)var angle = 180 * leng / latL;return angle;}/// <summary>/// 根據已知相鄰3點,求中點的等距平行點經緯度/// </summary>/// <param name="p0">@param {p0, p1, p2} 相鄰三個LatLng點</param>/// <param name="p1"></param>/// <param name="p2"></param>/// <param name="t">@return {t} 待求平行點到線段的垂直距離</param>/// <returns></returns>public static GeMode getParallelPoint(GeMode p0, GeMode p1, GeMode p2, double t){// 經緯度分別轉換成長度單位decimal y12 = p2.lat - p1.lat;decimal x12 = p2.lng - p1.lng;decimal y01 = p1.lat - p0.lat;decimal x01 = p1.lng - p0.lng;double a, b;if (x12 == 0){a = Math.PI / 2;if (y12 < 0)a = -a;}else{a = Math.Atan(Convert.ToDouble(y12 / x12));}if (x01 == 0){b = Math.PI / 2;if (y01 < 0)b = -b;}else{b = Math.Atan(Convert.ToDouble(y01 / x01));}//alert(b);// 關鍵核心處if (p2.lng < p1.lng){a += Math.PI;}if (p1.lng < p0.lng){b += Math.PI;}var k = (b - a - Math.PI) / 2;var r = a + k;var d = t / Math.Sin(k);var sinr = Math.Sin(r);var cosr = Math.Cos(r);// alert(d * sinr);var d_lat = lenToLat(Convert.ToDecimal(d * sinr));var d_lng = lenToLng(p1.lat, Convert.ToDecimal(d * cosr));d_lat = p1.lat + d_lat;d_lng = p1.lng + d_lng;GeMode g = new GeMode(d_lat, d_lng);return g;// addMark(obj);}#endregionpublic class GeMode{/// <summary>/// /// </summary>/// <param name="lat">緯度</param>/// <param name="lng">進度</param>public GeMode(decimal lat, decimal lng){_lat = lat;//_lng = lng;//}private decimal _lat;private decimal _lng;public decimal lat{set { _lat = value; }get { return _lat; }}public decimal lng{set { _lng = value; }get { return _lng; }}}}



總結

以上是生活随笔為你收集整理的谷歌地球API开发者指南(高级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。