第一章 OSGEarth介紹
第二章 OSGEarth編譯環境配置
OSGEarth的編譯環境配置隨着版本的不同、運行平台的不同,也有很大的差異。本章主要以Windows XP SP3(x86)為平台,Visual Studio 2010 為編譯環境來介紹OSGEarth2.0的變異環境配置。
第一節 OSGEarth V2.0相關資源
OSGEarth的相關資源可以通過其官方網站(http://www.osgearth.org/wiki/Downloads)獲取(所有資源文件均在關盤的source文件夾中)主要資源說明和網址如下表:
資源名稱 |
版本要求 |
推薦下載 |
OpenSceneGraph |
V2.8.0以上 |
|
GDAL |
V1.6以上 |
|
CURL |
V7.21以上 |
|
GEOS |
V3.2以上 |
|
SQLite |
V3.2以上 |
|
MiniZip |
V1.0以上 |
頭文件:http://www.winimage.com/zLibDll/unzip101h.zip |
Expat |
V2.0.1以上 |
code:http://sourceforge.net/projects/expat/ exe:http://files.cnblogs.com/eaglezhao/expat-win32bin-2.0.1.rar |
OSGEarth |
V2.0 |
git://github.com/gwaldron/osgearth.git OSGEarth源代碼使用tortoisegit軟件存放,因此需要下載並安裝:1.安裝 Git-1.7.0.2-preview20100309.exe (http://msysgit.googlecode.com/files/Git-1.7.0.2-preview20100309.exe) 2.安裝ortoiseGit-1.7.4.0-32bit.msi (http://tortoisegit.googlecode.com/files/TortoiseGit-1.7.4.0-32bit.msi) |
安裝過程中可能還需要其他的資源或者程序支持,具體在安裝過程進行說明。
第二節 Open Scene Graph安裝與配置
為了提高OSGEarth在編譯過程中執行速度,降低計算機硬件要求,因此選用windows XP SP3作為測試系統平台,vs2010作為windows平台下最新的編譯軟件,具有windows平台的兼容性考慮,編譯出來的EXE文件可以順利的部署在vista,win7上。
2.1 CMake介紹與安裝
CMake 是個跨平台的自動化建構系統,它用組態檔控制建構過程(build process)的方式和 Unix 的 Make 相似,只是 CMake 的組態檔取名為 CmakeLists.txt。Cmake 並不直接建構出最終的軟件,而是產生標准的建構檔(如 Unix 的 Makefile 或 Windows Visual C++ 的projects/workspaces),然后再依一般的建構方式使用。這使得熟悉某個集成開發環境(IDE)的開發者可以用標准的方式建構他的軟件,這種可以使用各平台的原生建構系統的能力是 CMake 和 SCons 等其他類似系統的區別之處。CMake 可以編譯源代碼、制作程式庫、產生適配器(wrapper)、還可以用任意的順序建構執行檔。CMake 支援 in-place 建構(二進檔和源代碼在同一個目錄樹中)和 out-of-place 建構(二進檔在別的目錄里),因此可以很容易從同一個源代碼目錄樹中建構出多個二進檔。CMake 也支援靜態與動態程式庫的建構。
支持VS2010的CMake版本為v2.8以上,本書選擇V2.8.4。下載地址:
http://ishare.iask.sina.com.cn/f/14399926.html或者http://www.cmake.org/
關於的cmake的具體用法請參看
http://techbase.kde.org/Development/Tutorials/CMake_(zh_CN)
或者
http://www.cmake.org/Wiki/CMake。
下載完成后安裝,在安裝選項的位置選擇:
其他可選擇默認安裝。
2.2 Open Scene Graph介紹
Open Scene Graph(簡稱OSG)使用OpenGL技術開發,是一套基於C++平台的應用程序接口(API),它讓程序員能夠更加快速、便捷地創建高性能、跨平台的交互式圖形程序。它作為中間件(middleware)為應用軟件提供了各種高級渲染特性,IO,以及空間結構組織函數;而更低層次的OpenGL硬件抽象層(HAL)實現了底層硬件顯示的驅動。
2.2.1優勢
OpenGL技術為圖形元素(多邊形、線、點……)和狀態(光照、材質、陰影……)的編程提供了標准化的接口。而OSG開發的主要意義在於,將3D場景定義為空間中一系列連續的對象,以進行三維世界的管理。正是由於場景及其參數定義的特點,通過狀態轉化、繪圖管道和自定制等操作,OSG還可以用於優化渲染性能。
從系統開發人員的角度看,相比工業標准OpenGL 或其它的圖形庫,OSG的優點顯而易見。除了開源和平台無關性以外,它封裝並提供了數量眾多的提升程序運行時性能的算法、針對包括分頁數據庫在內的幾乎所有主流數據格式的直接數據接口、以及對腳本語言系統Python 和Tcl 的支持,特別的,支持腳本語言系統的意義不僅限於用戶可以使用除C++語言以外的工具進行圖形系統的開發,事實上,對弱類型計算機語言的支持將突破現有交互式圖形系統在人-機交互性能方面的最終限制。 OSG采用以下思想和工具進行構建:
1. ANSI標准C++;
2. C++標准模板庫(STL);
3. 設計模式(Designpatterns)。
這些工具使得OSG的開發者可以在自己喜好的平台上進行開發,並且依據用戶所要求的平台進行配置。
2.2.2硬件需求
如今的OSG 已經可以在多種硬件平台和操作系統上運行,並且能夠在大部分計算機系統上正常使用。 處理器:OSG 可以在大部分的CPU 上編譯通過。OSG 具備線程安全性,並且可以有效利用多處理器和雙核結構的特性。OSG 可以在32 位或者64 位處理器上運行通過。
圖形:你的計算機系統需要配置一塊AGP 或者PCI 總線的圖形顯示卡。OSG可以在大部分用於建模,仿真和游戲的專業級或大眾級圖形設備上運行。可以運行OSG 的圖形設備必須高效地支持OpenGL,因此你應當從設備商處獲得最新的OpenGL 設備驅動程序。OSG 對顯卡RAM 的需求因用戶的使用而異,但是256MB 應當足夠了。OSG 可以在多管(multi-pipe)顯示系統上運行,並且可以利用多顯卡來提升渲染速度。
RAM:最小的系統RAM 內存需求是由顯示數據的數量和類型決定的。推薦配置為1GB,大型數據集的開發可能需要更多的內存支持。
磁盤:和RAM 一樣,磁盤空間的需求大小由數據量決定。對於任何程序來說,更高速和更大容量的磁盤無疑可以減少數據讀取的時間。
2.2.3軟件需求
可以運行OSG的平台需要具備OpenGL的支持能力,以及C++的編譯環境,支持OSG的系統包括Solaris,IRIX,Windows,Mac OSX,HP-UX,Sony Platystation等等,不過XBox除外。 和OpenGL類似,OSG的核心並沒有提供窗口系統的功能。因此用戶可以自由選擇所需的圖形開發接口,如GLUT,X11/Motif,Win32,MacOS X,Qt,wxWindows,Fox等。
2.3 Open Scene Graph 安裝
Open Scene Graph安裝與編譯還需要下載兩個資源:
1. Osg第三方庫(3rdParty_VC10_x86_x64.zip),網址:
http://members.iinet.net.au/~bchrist/3rdParty_VC10_x86_x64.zip
2. 數據包(OpenSceneGraph-Data-3.0.0.zip),網址:
2.3.1建立文件地址與資源解壓
第一步:選擇一個磁盤(X),保證磁盤具有30G左右的可用空間,並創建文件夾,X:/OSG/;(作者使用了E盤,后續如果出現E盤表示選擇磁盤)。
第二步:將OpenSceneGraph-3.0.0.zip到X:/OSG/OpenSceneGraph文件夾中;3rdParty_VC10_x86_x64.zip解壓到X:/OSG/3rdParty文件夾中;OpenSceneGraph-Data-3.0.0.zip解壓到X:/OSG/OpenSceneGraph-Data文件夾中。
X:/OSG/OpenSceneGraph文件夾截圖:
X:/OSG/3rdParty文件夾截圖:
X:/OSG/OpenSceneGraph-Data文件夾截圖:
2.3.2 安裝源代碼
第一步:啟動CMake -gui.exe並設置文件地址,將編譯地址設置為E:/osg/OpenSceneGraph/vs2010。
第二步:點擊“configure”:
以此出現以下過程:
點擊“YES”:
選擇“visual studio 2010”,點擊“Finish”:
2.3.3 配置CMAKE相關設置
第一步:配置環境變量
第一步:設置基本參數
ACTUAL_3RDPARTY_DIR值:E:/OSG/3rdParty;
BUILD_OSG_EXAMPLES值:ON
CMAKE_INSTALL_PREFIX值:E:/osg/OpenSceneGraph/vs2010
第二部:點擊Configure;
(紅色標記為需要修改或設置不清楚的地方)。
第三步:將Advanced打勾,將BUILD_MFC_ EXAMPLE設置為on,然后進行最后一次的Configure配置。
第四步:點擊Generate,自此建構完成。
(只有出現了“Generating done”才表示生成完成,否則需要根據提示修改CMAKE的相關設置)
打開文件夾E:\osg\OpenSceneGraph\vs2010,可以看見:
2.3.4 編譯Open Scene Graph
第一步:用VS2010打開OpenSceneGraph.sln(此文件在E:\OSG\OpenSceneGraph\VS2010下),過程可能需要較長時間,請耐心等待。
第二步:配置VS2010的相關設置。
點擊“生成”,估計需要3-6個小時。
第三步:驗證生成的文件
在E盤新建E:\osgearth\OpenSceneGraph文件夾。(說明:E:\osgearth文件夾是用來編譯osgearth的文件夾)將E:\osg\OpenSceneGraph\vs2010下的bin,include,lib文件夾拷貝到E:\osgearth\OpenSceneGraph下(可以刪除vs2010生成的臨時文件,即bin中保留dll和exe文件,include不用處理,lib中保留lib文件),將E:\osg\OpenSceneGraph-Data下的數據拷貝到E:\ osgearth\OpenSceneGraph\data下;這幾個文件是OSG需要的。
測試文件:
1. 打開E:\ osgearth\OpenSceneGraph\bin\osgviewerMFC.exe
2. 打開E:\ osgearth\OpenSceneGraph\data文件中的.osg或者.osgt文件,使用鼠標拖動觀察程序運行情況。
如果運行正常,表明編譯已經成功,否則需要查看編譯過程中是否錯誤。在退出程序是出現下面對話框是正常現象。
第三節 CURL安裝與配置
3.1 CURL介紹
curl是利用URL語法在命令行方式下工作的文件傳輸工具。它支持很多協議:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理服務器, cookies, 用戶名/密碼認證, 下載文件斷點續傳, 上載文件斷點續傳, http代理服務器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理服務器, 通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。Windows操作系統下的網絡螞蟻,網際快車(FlashGet)的功能它都可以做到。准確的說,curl支持文件的上傳和下載,所以是一個綜合傳輸工具,但是按照傳統,用戶習慣稱curl為下載工具。
curl是瑞典curl組織開發的,您可以訪問 http://curl.haxx.se/獲取它的源代碼和相關說明。curl的最新版本是7.22.0。在http://curl.haxx.se/docs/您可以下載到UNIX格式的man幫助,里面有詳細的curl工具的使用說明。
3.2 CURL編譯
首先解壓curl-7.22.0.zip到當前文件夾。
第二步:使用vs2010打開vc6curl.dsw,出現的提示全部選擇“是”。
第三步:設置生成
編譯完成的界面顯示:
第四步:文件轉移。在E盤新建E:\osgearth\curl文件夾。(本書編譯文件夾:D:\數字地球\curl-7.22.0)將D:\數字地球\curl-7.22.0\include\curl文件夾中.h文件復制到E:\osgearth\curl\include和E:\osgearth\3rdparty\include\curl文件夾中;將D:\數字地球\curl-7.22.0\lib文件夾中(包含子文件夾)的dll和lib文件復制到E:\osgearth\curl\lib和E:\osgearth\3rdparty\lib文件夾中。
第四節 GDAL安裝與配置
4.1 GDAL介紹
GDAL(GeospatialData Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。 OGR是GDAL項目的一個分支,功能與GDAL類似,只不過它提供對矢量數據的支持。有很多著名的GIS類產品都使用了GDAL/OGR庫,包括ESRI的ArgGIS 9.2,Google Earth和跨平台的GRASS GIS系統。利用GDAL/OGR庫,可以使基於Linux的地理空間數據管理系統提供對矢量和柵格文件數據的支持。
4.1.1 GDAL
GDAL提供對多種柵格數據的支持,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas ImagineImages(img),ASCII DEM(dem) 等格式。
1) GDAL抽象數據模型
GDAL使用抽象數據模型(abstract datamodel)來解析它所支持的數據格式,抽象數據模型包括數據集(dataset),坐標系統,仿射地理坐標轉換(AffineGeoTransform), 大地控制點(GCPs),元數據(Metadata),柵格波段(Raster Band),顏色表(ColorTable),子數據集域(Subdatasets Domain),圖像結構域(Image_StructureDomain),XML域(XML:Domains)。
2) GDAL基礎類
GDALMajorObject類:帶有元數據的對象。GDALDdataset類:通常是從一個柵格文件中提取的相關聯的柵格波段集合和這些波段的元數據;GDALDdataset也負責所有柵格波段的地理坐標轉換(georeferencingtransform)和坐標系定義。
GDALDriver類:文件格式驅動類,GDAL會為每一個所支持的文件格式創建一個該類的實體,來管理該文件格式。GDALDriverManager類:文件格式驅動管理類,用來管理GDALDriver類。
4.1.2 OGR
OGR提供對矢量數據格式的讀寫支持,它所支持的文件格式包括:ESRI Shapefiles, S-57, SDTS, PostGIS,Oracle Spatial, Mapinfomid/mif , Mapinfo TAB。OGR包括如下幾部分:
Geometry:類Geometry(包括OGRGeometry等類)封裝了OpenGIS的矢量數據模型,並提供了一些幾何操作,WKB(Well KnowsBinary)和WKT(Well KnownText)格式之間的相互轉換,以及空間參考系統(投影)。
SpatialReference:類OGRSpatialReference封裝了投影和基准面的定義。
Feature:類OGRFeature封裝了一個完整feature的定義,一個完整的feature包括一個geometry和geometry的一系列屬性。
FeatureDefinition:類OGRFeatureDefn里面封裝了feature的屬性,類型、名稱及其默認的空間參考系統等。一個OGRFeatureDefn對象通常與一個層(layer)對應。
Layer:類OGRLayer是一個抽象基類,表示數據源類OGRDataSource里面的一層要素(feature)。
Data Source:類OGRDataSource是一個抽象基類,表示含有OGRLayer對象的一個文件或一個數據庫。
Drivers:類OGRSFDriver對應於每一個所支持的矢量文件格式。類OGRSFDriver由類OGRSFDriverRegistrar來注冊和管理。
4.2 GDAL編譯
第一步:將文件解壓並打開makegdal10.sln。(本書解壓文件夾為D:\數字地球\gdal-1.8.1\gdal-1.8.1)
第二步:文件轉移。
GDAL編譯完成后的文件存放於C:\warmerda\bld,包含文件bin,data,html三個子文件夾。
新建文件夾:E:\osgearth\gdal;將C:\warmerda\bld\bin和C:\warmerda\bld\data拷貝到E:\osgearth\gdal文件夾下;將D:\數字地球\gdal-1.8.1\gdal-1.8.1下得子文件夾alg,gcore,ogr和port中所有的.h文件拷貝到E:\osgearth\gdal\include下; 將D:\數字地球\gdal-1.8.1\gdal-1.8.1中所有的lib和dll文件復制到E:\osgearth\gdal\lib文件夾下。
第五節 GEOS安裝與配置
5.1 GEOS介紹
GEOS(幾何引擎——開源)是一個Java拓撲套件(JTS)的C++移植。因此,它的目的是在C++中包含完整的JTS移植。這包括了所有的OpenGIS“簡單SQL特征”:空間預測函數和空間操作員,以及具體的JTS拓撲功能
5.2 GEOS編譯
第一步:將文件解壓到D:\geos-3.3.1文件夾;
第二步:啟動CMake -gui.exe並設置文件地址,將編譯地址設置為D:/geos-3.3.1/vs2010。
第三步:點擊“configure”:
第三步:修改參數。Cmake_install_PREFIX值為D:/geos-3.3.1/vs2010.並在此點擊“configure”。
第四步:點擊“Generate”
D:/geos-3.3.1/vs2010文件夾截圖:
第五步:打開D:/geos-3.3.1/vs2010/geos.sln
設置相關參數(主要為了debug和release生成的文件名不一致)
工程名稱 |
Debug目標文件名 |
Release目標文件名 |
Geos |
Geosd |
Geos |
geos-static |
libgeosd |
libgeos |
geos_c |
geosd_c |
geos_c |
點擊“生成”->“批生成”
開始編譯,編譯結果截圖:
第六步:文件轉移。
在D:/geos-3.3.1/vs2010文件夾中搜索lib和dll文件,並將搜索到的文件復制到E:\osgearth\geos\lib文件夾中;
將D:\geos-3.3.1\include中文件復制到E:\osgearth\geos\include文件夾中。
第六節 Expat安裝與配置
6.1 Expat介紹
Expat 是一個用C語言開發的、用來解析XML文檔的開發庫,它最初是開源的、Mozilla 項目下的一個XML解析器。Expat是一個面向流的解析器。您注冊的解析器回調(或handler)功能,然后開始搜索它的文檔。當解析器識別該文件的指定的位置,它會調用該部分相應的處理程序(如果您已經注冊的一個)。該文件被輸送到解析器,會被分割成多個片斷,並分段裝到內存中。因此expat可以解析那些巨大的文件。
6.2 Expat配置
第一步:直接下載expat-win32bin-2.0.1.rar文件,解壓后安裝。
第二步:文件轉移
將C:\Program Files\Expat2.0.1\Source\lib文件夾中的h文件復制到E:\osgearth\expat\INCLUDE文件夾中;
將C:\Program Files\Expat2.0.1\Bin文件復制到E:\osgearth\expat\lib文件夾中。
第七節 SQLite安裝與配置
7.1 SQLite介紹
SQLite,是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它占用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、C#、PHP、Java等,還有ODBC接口,同樣比起MySQL、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比他們都快。SQLite第一個Alpha版本誕生於2000年5月. 至今已經有10個年頭,SQLite也迎來了一個版本 SQLite 3已經發布。
7.2 SQLite編譯與配置
第一步:解壓文件。
1.將sqlite-amalgamation-3070900.zip文件中的文件復制到E:\osgearth\sqlite\include中;
2.將sqlite-dll-win32-x86-3070900.zip中文件復制到E:\osgearth\sqlite\lib中;
3.從VS2010的安裝文件夾中的Visual Studio10/VC/bin中找到LIB.exe和Link.exe復制到E:\osgearth\sqlite\lib;
4.將 C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\mspdb100.dll復制到E:\osgearth\sqlite\lib;
第二步:編譯lib文件。
1. 打開cmd窗口,進入E:\osgearth\sqlite\lib;
2. 輸入命令:LIB/DEF:sqlite3.def。生成lib文件
編譯后E:\osgearth\sqlite\lib文件夾截圖:
第八節 Minizip安裝與配置
8.1 MiniZip介紹
ZIP,是一個計算機文件的壓縮的算法,原名Deflate(真空),發明者為菲爾·卡茨(PhilKatz)),他於1989年1月公布了該格式的資料。ZIP通常使用后綴名“.zip”,它的MIME格式為 application/zip 。目前,ZIP格式屬於幾種主流的壓縮格式之一,其競爭者包括RAR格式以及開放源碼的7-Zip格式。從性能上比較,RAR格式較ZIP格式壓縮率較高,而7-Zip由於提供了免費的壓縮工具而逐漸在更多的領域得到應用。 WinMount可以把ZIP掛載到虛擬盤,無需解壓,隨機讀取,這又是另一大創新。
ZIP是一種相當簡單的分別壓縮每個文件的存檔格式。分別壓縮文件允許不必讀取另外的數據而檢索獨立的文件;理論上,這種格式允許對不同的文件使用不同的算法。不管用何種方法,對這種格式的一個告誡是對於包含很多小文件的時候,存檔會明顯的比壓縮成一個獨立的文件(在類Unix系統中一個經典的例子是普通的tar.gz存檔是由一個使用gzip壓縮的TAR存檔組成)要大。 ZIP的規約指出文件可以不經壓縮或者使用不同的壓縮算法來存儲。然而,在實際上,ZIP幾乎差不多總是在使用卡茨(Katz)的DEFLATE算法。
ZIP支持基於對稱加密系統的一個簡單的密碼,現在已知有嚴重的缺陷,已知明文攻擊,字典攻擊和暴力攻擊。ZIP也支持分卷壓縮。在近來一段時間,ZIP加入了包括新的壓縮和加密方法的新特征,不過這些新特征並沒有被許多工具所支持並且沒有得到廣泛應用。
8.2 MiniZip的編譯與配置
將unzip101h.zip中的文件復制到E:\osgearth\minizip\include;將zlib125dll.zip中文件夾dll32和static32中的lib文件和dll文件復制到E:\osgearth\minizip\lib中。Osgearth編譯需要的minizip文件已經處理完成。
如果想對源代碼進行編譯的話,可以按照以下步驟進行:
第一步:啟動CMake -gui.exe並設置文件地址,將編譯地址設置為D:\zlib125\zlib-1.2.5\vs2010,然后“configure”
第二步:刪除文件D:\zlib125\zlib-1.2.5\zcongf.h;
設置Cmake_install_PREFIX值為D:\zlib125\zlib-1.2.5\vs2010;然后再次“configure”
“Generate”
D:\zlib125\zlib-1.2.5\vs2010截圖
第三步:打開並編譯zlib.Sln。
第九節Virtual Planet Builder安裝與配置
9.1 Virtual Planet Builder介紹
VirtualPlanetBuilder是一種地形數據庫創作工具,是能夠閱讀各種地理圖象和高程數據並建立小面積地形數據庫,乃至大規模如整個地球的龐大數據庫。這些數據庫可以上傳到互聯網,並能夠提供象在線googleearth一樣的風格漫游整個地球的數據庫,或保持對本地磁盤高速接入等所需的專業飛行模擬器。前面所講的VirtualPlanetBuilder建立的數據庫,如果要運行該數據庫產生一個可視化的場景,那么你將需要一個基於openscenegraph的應用程序。其實,VirtualPlanetBuilder本身是一個基於openscenegraph實時圖形工具箱,它可以創建基於openscenegraph的二進制的最高效率的數據庫。如果你的應用程序不是基於openscenegraph,而你要使用OSG中的數據庫的話,那么你需要寫一個后處理的工具來把該數據庫從openscenegraph的格式轉換為你自己的格式。VirtualPlanetBuilder已經從原來的傳最初的數據葉生成工具逐漸的完善了,現在它只是其中的一個部分而已!現在官方計划進一步的對它進行擴展和完善,以便有可能創建幾十千兆的數據頁,並通過網上電腦間的傳輸來創建他們,讓每台參與的工作的電腦一起來創造完整的數據庫。我們也將提供對數據庫的支持,以便優化低帶寬限制,實現基於web數據庫的三維可視化。對未來的發展詳情請看:
http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/DevelopmentPlans
相關信息配置:
http://www.openscenegraph.org/projects/osg/wiki/Support/UserGuides/osgdem
9.2 Virtual Planet Builder編譯
第一步:需要編譯完成OSG和GDAL,見osg和gdal編譯安裝部分。
第二步:下載相關的地圖文件
http://www.cc.gatech.edu/projects/large_models/ps.html
第三步:Vpb安裝需要插件下載
http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/Dependencies
squish-1.11.zip,80k
第四步:設置環境變量
第一步:下載並檢查相關的版本
1.使用SVN下載VirtualPlanetBuilder
http://www.openscenegraph.org/svn/VirtualPlanetBuilder/trunk
下載(或者更新)完成后,打開文件夾中的news.Txt:
這里的就是版本號,文件夾的標注可能有誤。
2.下載VirtualPlanetBuilder對應osg的版本。
下載相關的版本:http://www.openscenegraph.org/projects/osg/wiki/Downloads/PreviousReleases
這里需要注意,osg的相關版本可能是臨時版本,需要使用release版本。如果是使用http://www.openscenegraph.org/svn/VirtualPlanetBuilder/trunk進行下載的,可以使用最新的版本。
下載已經編譯好了的osg生成文件,注意編譯器版本和操作系統
http://openscenegraph.alphapixel.com/osg/downloads/free-openscenegraph-binary-downloads
下載debug和release兩個版本。
OpenSceneGraph-3.0.1-VS10.0.30319-x86-release-12741.7z
OpenSceneGraph-3.0.1-VS10.0.30319-x86-debug-12741.7z
重命名debug\bin文件夾中gdalxx.dll為gdalxxd.dll,libexpat.dll為libexpatd.dll。將release和debug中的bin,lib,include,share,data文件夾合並,如果出現重名,將debug中的文件名在擴展名之前加d,(123.dll=123d.dll)
查看gdal的版本,查看OpenSceneGraph-3.0.1\bin\gdalxx.dll,XX就是gdal的版本。
3.下載VirtualPlanetBuilder對應的gdal
下載編譯好的文件:
http://trac.osgeo.org/gdal/wiki/DownloadingGdalBinaries
下載源文件:
http://trac.osgeo.org/gdal/wiki/DownloadSource
處理的方法參看gdal編譯。
4.設置相關的環境變量
OSG_DIR值:E:\osg\OpenSceneGraph-x.x.x;(E:\osg\OpenSceneGraph\vs2010,在2010編輯中獲取)
GDAL_DIR值:E:\osg\gdal-1.x.x;
PATH值中添加:%GDAL_DIR%\LIB;%GDAL_DIR%\BIN;%OSG_DIR%\INCLUDE;
%OSG_DIR%\LIB;%OSG_DIR%\BIN; %OSG_DIR%\include;%OSG_DIR%\share;%OSG_DIR%\data;
注意:有些編譯環境可能需要:squish-1.11.zip,下載地址如下:
http://www.openscenegraph.org/projects/VirtualPlanetBuilder/wiki/Dependencies
5.編譯處理,CMAKE
編輯configure和generate,生成文件*.sln
打開:VIRTUALPLANETBUILDER.sln,修改下面文件:vpb項目下SpatialProperties.cpp文件
使用release編譯,debug模式編譯有錯誤。
Release編譯結果:
將VirtualPlanetBuilder-0.9.12\vs2010\lib\Relase中的vpb.dll,vpb.lib
復制到VirtualPlanetBuilder-0.9.12\vs2010\bin\Relase中。
測試編譯結果:
Cmd;
Cd x:\osg\VirtualPlanetBuilder-0.9.12\vs2010\bin\Release
Osgdem –help
出現下面的界面表明編譯成功
6. 測試地形數據
下載相關的地圖文件:
http://www.cc.gatech.edu/projects/large_models/ps.html
ps_height_16k.png,ps_texture_16k.png
使用的命令行是:
gdal_translate ps_height_16k.pngps_height_16k.tif
gdaladdo -r average ps_height_16k.tif 2 4 816 32
gdal_translate ps_texture_16k.pngps_texture_16k.tif
gdaladdo -r average ps_texture_16k.tif 2 48 16 32
osgdem --xx 10 --yy 10 -tps_texture_16k.tif --xx 10 --yy 10 -d ps_height_16k.tif -l 6 -v 0.1 -o test.ive-a test.osga
osgviewer test.ive
最后 其他資源的配置
X.1 Open Scene Graph 第三方支持庫
從http://openscenegraph.alphapixel.com/osg/downloads/openscenegraph-third-party-library-downloads
下載windows-VS10.0.30319-x86-release.7z和windows-VS10.0.30319-x86-debug.7z兩個針對VS2010的壓縮包。將兩個壓縮包的內容復制到E:\osgearth\3rdparty。
也可以下載http://members.iinet.net.au/~bchrist/3rdParty_VC10_x86_x64.zip,將x86文件中的文件復制到E:\osgearth\3rdparty。(這個壓縮包的資源相對較全)
X.2 libzip庫
Libzip 的功能與minizip相同,但由於使用的位置不同,為了后續配置osgearth,在此進行說明:
從http://files.cnblogs.com/eaglezhao/libzip(vs10).rar下載libzip(vs10).rar,將libzip(vs10).rar中的文件復制到E:\osgearth\libzip文件夾。
X.3 Osgearth資源下載
第一步:安裝Git-1.7.6-preview20110708.exe,默認安裝。
第二步:安裝TortoiseGit-1.7.4.0-32bit.msi,默認安裝。
第三步:創建一個文件夾E:\osgearth\data。
第四步:下載資源
在url中輸入:git://github.com/gwaldron/osgearth.git
點擊“ok”,下載過程可能需要較長時間。
下載完成后,將D:\osgearth文件中所有文件復制到E:\osgearth\osgearth文件夾中。同時將D:\osgearth進行壓縮備份。D:\osgearth文件將可以接收osgearth文件的更新。
從此為止,我們的osgearth環境就算搭建完成。
第三章 OSGEarth編譯
上一章我們做的所有工作都是為了配置OSGEarth,
第一節 sln生成
VS2010的sln文件生成是OSGEarth的關鍵。作者在配置出現很多錯誤,從而導致了使用VS2010編譯出現很多問題。
1.1 CMAKE配置
第一步:啟動CMake -gui.exe並設置文件地址,將編譯地址設置為E:\OSGEARTH\OSGEARTH\vs2010,然后“configure”
第二步:添加參數
參數名稱 |
類型 |
值 |
DYNAMIC_OSGEARTH |
Bool |
On |
OSG_DIR |
Path |
E:/OSGearth/OpenSceneGraph |
添加方法:點擊“Add Entry”,彈出 Add CacheEntry對話框(如下圖所示)
完成后cmake參數列表頂端出現添加的兩個參數:
第二步:設置相關參數
主要針對“*-NOTFOUND”參數值的參數。
參數名稱 |
值 |
CMAKE_INSTALL_PREFIX |
E:/osgearth/osgearth/vs2010 |
CMAKE_LINKER |
(清空) |
CURL_INCLUDE_DIR |
E:/osgearth/3rdparty/include |
CURL_LIBRARY |
E:/osgearth/3rdparty/lib/libcurl.lib |
CURL_LIBRARY_DEBUG |
E:/osgearth/3rdparty/lib/libcurld.lib |
GDAL_INCLUDE_DIR |
E:/osgearth/gdal/include |
GDAL _LIBRARY |
E:/osgearth/gdal/lib/gdal_i.lib |
GEOS_INCLUDE_DIR |
E:/osgearth/geos/include |
GEOS _LIBRARY |
E:/osgearth/geos/lib/geos.lib |
GEOS _LIBRARY_DEBUG |
E:/osgearth/geos/lib/geosd.lib |
LIBZIP_INCLUDE_DIR |
E:/osgearth/libzip/include |
LIBZIP _LIBRARY |
E:/osgearth/libzip/lib/zip.lib |
OPENTHREADS_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/OpenThreads.lib |
OPENTHREADS _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/OpenThreadsD.lib |
OSGDB_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgDB.lib |
OSGDB_LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgDBD.lib |
OSGFX_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgFX.lib |
OSGFX _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgFXD.lib |
OSGGA_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgGA.lib |
OSGGA _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgGAD.lib |
OSGMANIPULATOR_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgManipulator.lib |
OSGMANIPULATOR _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgManipulatorD.lib |
OSGSHADOW_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgShadow.lib |
OSGSHADOW _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgShadowD.lib |
OSGSIM_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgSim.lib |
OSGSIM _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgSimD.lib |
OSGTERRAIN_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgTerrain.lib |
OSGTERRAIN _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgTerrainD.lib |
OSGTEXT_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgText.lib |
OSGTEXT _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgTextD.lib |
OSGUTIL_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgUtil.lib |
OSGUTIL _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgUtilD.lib |
OSGVIEWER_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgViewer.lib |
OSGVIEWER _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgViewerD.lib |
OSGWIDGET_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osgWidget.lib |
OSGWIDGET _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgWidgetD.lib |
OSG_GEN_INCLUDE_DIR |
E:/osgearth/OpenSceneGraph/include |
OSG_INCLUDE_DIR |
E:/osgearth/OpenSceneGraph/include |
OSG_LIBRARY |
E:/osgearth/OpenSceneGraph/lib/osg.lib |
OSG _LIBRARY_DEBUG |
E:/osgearth/OpenSceneGraph/lib/osgd.lib |
OSG_VERSION_EXE |
(清空) |
SQLITE3_INCLUDE_DIR |
E:/osgearth/sqlite/include |
SQLITE3_LIBRARY |
E:/osgearth/sqlite/lib/sqlite3.lib |
ZLIB_INCLUDE_DIR |
E:/osgearth/minizip/include |
ZLIB_LIBRARY |
E:/osgearth/minizip/LIB/zlibstat.lib |
MINIZIP_INCLUDE_DIR |
E:/osgearth/minizip/include |
MINIZIP _LIBRARY |
E:/osgearth/minizip/LIB/zlibstat.lib |
如下圖:
設置完成后再次“configure”
第三步:生成vs2010文件。
點擊“Generate”,結果如下:
E:\osgearth\osgearth\vs2010文件夾截圖:
1.2 VS2010配置
第一步:使用vs2010打開E:\osgearth\osgearth\vs2010\OSGEARTH.sln文件。
第二步:打開all_build工程屬性,設置庫目錄和包含目錄。
包含目錄:
庫目錄:
保存所有文件,這樣SLN文件就可以使用了。
第二節 OSGEarth編譯與測試
2.1 OSGEarth編譯
第一步:配置系統環境變量。
新設置OSG_FILE_PATH變量,值為E:\OSGearth\OSGEARTH\data;E:\OSGearth\GDAL\data;
向PATH添加值:
E:\OSGearth\3rdParty\bin;
E:\OSGearth\OSGEARTH\bin\Debug;
E:\OSGearth\OSGEARTH\bin\Release;
第二步:使用“生成”->“批生產”,選擇all_build(debug|win32和release|win32)進行生成。
在生成的過程中會提示出現以下錯誤:
錯誤提示 |
處理方法 |
無法打開包括文件:“geos/platform.h” |
將D:\geos-3.3.1\vs2010\include\geos文件夾中的文件復制到E:\osgearth\geos\include\geos中 |
無法打開包括文件:“zlib.h” |
將D:\zlib125\zlib-1.2.5\中zlib.H文件復制到E:\osgearth\libzip\include文件夾中 |
在編譯過程中存在4個文件無法編譯成功,但是不影響正常的測試。
第三步:修改這些錯誤。
上述錯誤的問題主要出現在E:\osgearth\osgearth\src\applications\osgearth_imageoverlay\osgearth_imageoverlay.cpp文件的36-39行。
原因是OSG_MIN_VERSION_REQUIRED(2,9,6)限制了osg的版本。本文使用了v3.0.1版,因此需要添加需要添加ImageOverlayEditor文件。
(目前還沒有解決)
2.2 OSGEarth測試
測試release版本:
1.打開cmd窗口,進入E:\osgearth\osgearth\vs2010\bin\Release;
2.輸入命令: osgearth_viewer.exe E:\osgearth\osgearth\tests\gdal_tiff.earth;會出現一個提示
3.復制所需的dll到E:\osgearth\osgearth\vs2010\bin\Release文件夾中。可能需要重復好多次。
4.測試成功會出現下面界面:
第四章 OSGEarth學習
這是個人在學習osgEarth時根據體會或從別的地方看到的做的一個簡單整理,有些東東就是官方文檔翻譯過來的,都是根據自己的需要感覺需要記錄下來什么東西就隨便記錄下來了,也沒有個條理,都是用到哪記到哪,別見怪。對個人在初期使用osgEarth時有很多幫助,所以特發上來,希望對大家也有幫助
osgEarth學習筆記
1. 通過earth文件創建圖層時,可以指定多個影像數據源和多個高程數據源,數據源的順序決定渲染順序,在earth文件中處於最前的在渲染時處於最底層渲染;所以如果有高低精度不同的影響數據或者高程數據,在創建earth文件時要將粗精度的數據放在上方xml節點,高精度的放在其下面的節點;
2. osgEarth自帶多種驅動器,不同的驅動器驅動不同的數據源,自己也可以擴展驅動器讀取相應的數據;
3. 可以通過profile屬性指定數據的投影方式或者數據分頁方式以及地理空間延展;osgEarth通過profile創建數據四叉樹,每個四叉樹節點數據瓦片通過TileKey類來標示;一個地形數據能否正常工作要看創建它的驅動器是否能夠創建和對應profile兼容的數據瓦片;比如,如果要生成地球數據,就需要指定global-geodetic 或者global-mercatorprofile,相應的數據源要能夠在這種profile下生成相應的地形數據;
4. 通過earth文件,最基本的也是最主要的功能是我們可以指定生成地形的坐標屬性(地理坐標或投影坐標)影像數據、高程數據、矢量數據、模型數據、以及緩沖位置,通過這些基本要素就可以輕易生成我們想要的地形;
5. osgEarth只能使用16或32位的高程數據源;
6. 如果直接使用原始的影像、高程以及矢量數據,可以用GDAL驅動器,在這種情況下需要注意幾個性能的問題。第一,將數據源預先進行坐標變換,變換為目標地形坐標,否則osgEarth會對源數據進行坐標投影變換,這將降低數據的加載及處理速度。如果預先已經將數據源進行正確的坐標變換,osgEarth就可以省略這個步驟,從而提高其實時處理速度;第二,預先對影像數據進行瓦片處理,比如tiff格式的影像數據,它是逐行掃描存儲的,而osgEarth是每次讀取一個瓦片數據,如果預先對影像數據進行瓦片處理,在動態過程中osgEarth就不需要每次讀取整個大塊影像數據然后提取其需要的瓦片數據,而可以直接讀取相應的瓦片數據即可,這樣就大大提高了瓦片數據的讀取速度。可以通過gdal_translate工具對影像數據進行瓦片處理;第三,創建金字塔數據集可以使osgEarth讀取數據更加高效,可以用gdaladdo工具創建金字塔數據集;總之,要想提高osgEarth的處理效率,就要預先創建高效的數據瓦片結構,除了用gdal、vpb等工具外,也可以通過osgEarth的數據緩沖機制創建預處理的瓦片數據集。比如我們可以創建一個如下的earth文件將數據緩沖到指定的目錄:
<mapname="bluemarble" type="geocentric"version="2">
<!--Add a reference to the image -->
<image name="bluemarble"driver="gdal">
<url>c:/data/bluemarble.tif</url>
</image>
<options>
<!--Tell osgEarth to cache the tilesin a TMS format-->
<cache type="tms">
<path>c:/osgearth_cache</path>
<!--Tell osgEarth to cache the tilesto JPG to save disk space-->
<format>jpg</format>
</cache>
</options>
</map>
這種緩沖方式只能緩沖在執行該文件時瀏覽過的地形數據,而不能自動緩沖所有的數據,要想自動緩沖所有的數據,就需要用到osgEarth自帶的一個工具,osgearth_seed,通過osgearth_seed --max-level 7 bluemarble.earth將數據全部緩沖到指定位置,通過這種方式緩沖后,我們就擁有了一個完整的TMS數據源,我們可以直接通過文件目錄的方式訪問該數據源,也可以將該數據源拷貝到我們自己的本地web服務目錄下。詳情見http://osgearth.org/wiki/DataPreparation。除此之外還可以用MapTiler以及TileCache工具創建瓦片數據源,用它創建的瓦片數據源也可以直接在osgEarth下使用;
7. 可以通過兩種方式將osgEarth集成到我們自己的osg應用程序中,第一種就是直接通過earth文件的方式,直接將earth文件讀入作為一個osg節點加入場景即可,另外一種方式就是通過osgEarth的API。通過API的方式大體需要以下幾個步驟:創建map對象——創建影像數據層——創建高程數據層——將影像數據層以及高程數據層加入到map對象——根據前面創建的map對象創建mapNode節點——將mapNode節點加入到場景;示例見http://osgearth.org/wiki/DevelopersGuide。無論是通過earth文件創建的地形還是通過API創建的地形,我們都可以在運行時對其進行修改,如果是用earth文件創建的地形,需要先找到該earth文件對應的mapNode,通過以上兩種方式創建的mapNode,我們可以對地形進行修改操作,如添加新的影像、高程數據,移除特定的影像、高程數據,重新制定影像、高程數據的順序等;
8. 如果我們的地形用的是地心坐標系,可以會碰到當相機距離地面非常近的時候地形被裁減掉的問題,要解決這個問題我們可以通過設置相機的遠近裁剪比率或者創建AutoClipPlaneHandler來解決。AutoClipPlaneHandler可以動態監視相機,當相機距離地面很近時動態調整相機的近裁減面;
9. 在地形上放置模型對象時可以使用ObjectPlacer類,通過該類可以直接通過經緯度坐標進行模型的放置操作;
10. osgEarth的目標是能夠在osg中開發基於地理信息的應用,能夠方便地瀏覽地理模型數據,能夠與開放標准的地理數據兼容;osgEarth渲染地形的模式分為兩種:實時在線模式(直接使用原始數據渲染生成)以及離線模式(數據預處理成瓦片數據或地形數據庫);
11. osgEarth使用於以下幾種情況的應用:快速方便地運行地形地圖數據;使用開放標准的地形地圖數據,如WMS、TMS、WCS等;通過Web服務的方式集成本地存儲的地形地圖數據;系統要求以瘦客戶端的方式運行;經常處理隨着時間改變的數據;集成商業數據;
12. 在使用osgEarth自帶的漫游器EarthManipulator時,如果給漫游器設置一個矩陣或者給漫游器設置一個TetherNode然后再解除,然后再移動相機位置,這時計算出的Center會有一個跳躍,然后才正常,造成這個問題的原因是給漫游器設置了參考節點(通過SetNode函數)造成的,設置了參考節點后漫游器要根據參考節點重新計算Center和相機姿態等參數,在以上兩種情況發生時,在重新計算Center時出現了偏差,要想避免以上兩種情況下造成的移動異常,可以不讓相機結合參考節點重新計算Center,即將Pan函數中的recalculateCenter注釋掉即可;
13. Map的類型分為geocentric和projected兩種類型,即地心方式和投影方式,要建立圓形地球就用geocentric類型,用這種類型如果要制定profile,只有geodetic(WGS84投影)和mercator(墨卡托投影)兩種模式;
14. Earth文件詳解:
<!—type 屬性可以是geocentric和projected兩種模式,分別對應地心坐標系和平面投影坐標系,默認是地心坐標模式。Version是osgEarth的主版本號,必須有版本號-->
<map name=”myMap” type=”geocentric”/”projected” version=”2”>
<!—定義地圖各圖層的運行時顯示屬性-->
<options>
<!—定義數據緩沖機制,緩沖類型有三種,tms、sqlite3以及tile cache,默認是tms,如果將cache_only設為true,osgEarth將只加載緩沖的數據,不加載任何非緩沖的數據,默認是false-->
<cachetype=”tms”/”sqlite3”/”tilecache” cache_only=”false”>
<!—緩沖數據存放目標目錄,適用於tms以及tilecache 兩種類型,直接指定緩沖目錄-->
<path>C:/myCache</path>
<!—緩沖數據存放目標文件,適用於sqlite3,指定數據庫文件名-->
<path>C:/myCache.db</path>
<!—緩沖目標文件類型,適用於tms以及tilecache兩種類型,如果沒有指定類型,將默認用影像數據或高程數據的類型-->
<format>jpg</format>
<!—tms類型,僅適用於tms類型,注意如果該類型是google,索引就是反的-->
<tms_type>google</tms_type>
<!—緩沖文件最大值,單位是MB,不知道該屬性是否只是適用於sqlite3,有待確定-->
<max_size>300</max_size>
</cache>
<!—坐標投影屬性,該屬性相當於渲染數據的地理空間上下文,它決定了系統以哪種方式將世界坐標數據投影到屏幕像素。為了正確渲染影像數據以及高程數據,osgEarth需要知道數據源的profile以及渲染時的profile以進行必要的轉換。-->
<profilename=”myProfile”>
<!—空間參考系統初始化字符串,該字符串的值可以參考PROJ4或WKT,下面是用PROJ4定義的WGS84投影 profile,srs以及作用范圍的定義同樣適用於平面投影模式-->
<srs>prog=latlong+ellps=WGS84 +datum=WGS84</srs>
<!—如果只想讓該profile作用在某個區域,可以給其指定范圍-->
<xmin>-10.2</xmin>
<xmax>-10</xmax>
<ymin>20</ymin>
<ymax>30</ymax>
<!—由於WGS84比較著名,所以可以用下面的簡化方式代替上面的定義-->
<profile>global-geodetic</profile>
<!—另外一個著名的球體投影就是墨卡托投影(yahoo、google、微軟、openstreetmap都是用的這種投影方式),這種投影方式的優點是可以在任何緯度或者預留區域正確地顯示文本信息,可以用下面的簡化方式定義-->
<profile>global-mercator</profile>
<!—也可以不用簡化方式,簡化方式使用默認的橢球體,也可以通過定義srs自己定義橢球體-->
<srs>+proj=latlong+a=6800000 +b=6800000</srs>
<!—定義垂直空間參考系統,相當於垂直高程大地基准-->
<vsrs>egm96-meters</vsrs>
</profile>
<!—定義地形引擎如何渲染影像數據和高程數據-->
<terrain>
<!—定義如何從上層高程數據采集當前層需要的高程數據,比如如果影像數據可以分割到17層,而高程數據到7層,那么8-17層的高程數據就需要從第7層去采集,下面的屬性就指定了以何種方式去采集相應的高程值,一共有四種采集方式,分別是nearest(采集最近相鄰點)、bilinear(雙線插值)、average(平均值插值)、triangulate(根據相鄰的四個點插值)-->
<elevation_interpolation>nearest/bilinear/average/triangulate</elevation_interpolation>
<!—定義是否開啟地形表面的光照,默認是開啟-->
<lighting>true</lighting>
<!—定義如何加載地形數據(數據加載策略),可以定義加載模式mode,分為standard(標准加載模式)、sequential(順序加載模式)以及preemptive(優先級加載模式),默認是標准加載模式,preemptive加載模式不同於順序加載模式,當需要加載最高級瓦片時需要從最低級開始逐層加載,而preemptive模式可以直接跳過中間級直接加載最高級,同時還可以設定不同數據的加載優先級,比如可以設定優先加載影像數據而后加載高程數據等,這樣可以在視覺上得到優化處理。此外還可以指定加載數據時每個CPU創建的線程數量(loading_threads_per_core)或者加載數據使用的總的線程數量(loading_threads),以及編譯地形數據即構建地形瓦片所使用的線程數量(compile_threads),注意,加載數據時每個CPU創建的線程數量和加載數據使用的總的線程數量不能同時指定,只能指定其中一種-->
<loading_policymode=”preemptive” loading_threads_per_core=”3” compile_threads=”2”></loading_policy>
<!—定義多個影像數據疊加時如何集成最終的影像數據,一共有四種方式,分別是auto(自動)、multitexture(多重紋理)、texture_array(紋理數組)、multipass(多通道),默認是auto方式,這種方式是系統自動選擇一種紋理組合方法,它首先檢測硬件所支持的各種方法然后選擇第一種。Multitexture方式會為每個影像層指定它自己的影響紋理單元然后通過GPU進行組合,允許的最大紋理層的數量要受GPU的限制,texture_array是使用一個二維紋理數組通過GPU進行組合,multipass方式是通過創建多個渲染通道進行紋理的組合,這種方式沒有紋理層數量的限制,但會影像系統的性能,因為它要給每個紋理層創建一個渲染通道-->
<compositor>auto/multitexture/texture_array/multipass</compositor>
<!—定義地形瓦片分割的最大層數-->
<max_lod>10</max_lod>
<!—定義瓦片范圍系數,也就是瓦片Lod范圍的最大值系數,系統默認是根據瓦片的寬度與該系數相乘作為范圍最大值,該值默認是4,通過該系數可以對不同的地形圖層的lod可見范圍進行控制以提高效率,特別是對於帶有文本的圖層或者測繪標記圖層,可以將該系數設小以大大提高系統的渲染性能-->
<min_tile_range_factor>4.5</min_tile_range_factor>
<!—定義瓦片數據的采樣率,通過設定不同的采樣率以得到不同精細程度的地形瓦片,默認是1.0,詳情可參考osgTerrain-->
<sample_ratio>1.2</sample_ratio>
<!—定義地形瓦片邊緣率,osgTerrain會在不同的瓦片之間繪制邊緣以防止不同的瓦片之間出現縫隙,該值默認是0.02,如果該值太小,在不同瓦片之間就可能會出現縫隙,如果太大,可能會造成不必要的渲染而影響系統的渲染性能,對於高度變化比較大的地形或者是做了高程誇張的地形可以盡量將該值設的大一些,以免出現縫隙-->
<skirt_ratio>0.05</skirt_ratio>
<!—定義高程誇張系數,默認是1.0,也就是正常渲染高程的真實高度-->
<vertical_scale>2.0</vertical_scale>
<!—定義邊緣緩沖率,就是地形瓦片的延展率,比如將地形做鑲嵌或者重投影時為了能夠准確覆蓋到所有的瓦片數據需要將瓦片范圍進行適當的放寬,如果設定0.2,放寬的倍數就是1.02-->
<edge_buffer_ratio>0.02</edge_buffer_ratio>
</terrain>
<!—指定是否對整個map啟用光照-->
<lighting>true</lighting>
</options>
<!—指定影像數據,在同一個map中image的name必需是唯一的;在image下的子要素,有些是公共的,有些是針對特定的driver的。我們可以給影像數據指定driver(驅動器),不同的驅動器用於驅動不同的影像數據源;可以指定cacheid(影像數據緩沖標識),一個影像緩沖標示對應特定的緩沖目錄或緩沖數據庫文件,如果不指定,系統會根據驅動器創建默認的緩沖標識;可以指定影像數據細分的最小層數min_level以及最大層數max_level;可以指定可見范圍min_range以及max_range,該值是影像數據塊距離相機的距離(單位是米),當影像圖層數據塊不在該范圍內時圖層將不顯示,等同於lod節點的可見范圍;可以指定該影像數據的加載權重loading_weight,詳情可見loading_policy,權重越大,加載的優先級越高;可以指定影像瓦片數據黑名單文件名blacklist_filename,當系統請求影像數據瓦片時,如果包含該瓦片的影響文件不存在,系統就會把該請求的數據瓦片放入到一個黑名單中,這樣可以避免再次請求該無效數據,從而提高數據請求的效率。如果黑名單中沒有任何記錄,該黑名單就處於被禁用狀態,也不會影像系統性能。-->
<imagename=”myImage”>
<!—指定該影像數據使用的profile,給該數據源指定profile后將覆蓋map的全局profile,默認情況下,影像驅動器會自動判斷數據源應該使用的profile,如果我們覺得驅動器無法自動判斷得到數據源的profile時就要手動指定profile;-->
<profile>global_geodetic</profile>
<!—指定無數據頁nodata_image,某些影像數據服務器,如果客戶端請求的某些層上沒有請求的相應影像數據,就會顯示無數據提示,通過設定該屬性可以讓系統也顯示無數據的狀態提示圖片信息-->
<nodata_image>someURL</nodata_image>
<!—指定無數據信息圖片的透明背景色-->
<transparent_color>00 255 200</transparent_color>
<!—指定該圖層是否啟用數據緩沖,默認是啟用的-->
<cache_enabled>true</cache_enabled>
<!—指定緩沖數據文件格式,為該數據源指定緩沖格式后將覆蓋該map的全局緩沖格式,如果不指定,系統將默認使用源數據的文件格式-->
<cache_format>png</cache_format>
<!—指定影像數據的不透明度,默認是1.0,完全不透明,值越小越透明-->
<opacity>0.5</opacity>
<!—指定是否啟用該圖層,默認是啟用-->
<enabled>true</enabled>
<!—指定該影像數據被分割時單個瓦片的大小(像素的寬、高)-->
<tile_size>40</tile_size>
<!—指定最大瓦片緩沖個數,指定該值是為了提高瓦片拼接的效率,默認值是16-->
<l2_cache_size>20</l2_cache_size>
</image>
//特定驅動器屬性設置,驅動器分為影像/高程驅動器、模型驅動器、特征驅動器、緩沖驅動器以及地形引擎驅動器5大類;
//影像/高程驅動器
<!—agglite驅動器,該驅動器將矢量數據柵格化為位圖然后然后將其轉換為地形瓦片紋理層-->
<imagename=”myAggliteImage” driver=”agglite”>
<!—定義矢量特征(features)數據,矢量數據的屬性定義都要通過特征節點features來定義,矢量特征數據也要指定自己的驅動器,它不直接創建矢量數據幾何體,只是用來讀取矢量數據,目前矢量數據驅動器主要是ogr及GDAL,支持的矢量數據文件格式就是驅動器支持的所有文件格式 -->
<featuresname=”myWorld” driver=”ogr”>
<!—指定矢量數據源的位置-->
<url>../data/world.shp</url>
<!—指定讀取數據源的某一層,只有數據源包含多個層時才可用-->
<layer></layer>
<!—指定預處理幾何體緩沖,所有的矢量幾何體都將作為面對象進行緩沖,相當於后台緩沖,通過預先在后台多處理一部分矢量數據,從而在顯示區域發生變化時載入數據比較快,從而降低給視覺造成的數據顯示延遲-->
<bufferdistance=”0.02”/>
<!—指定驅動器要驅動的文件類型-->
<ogr_driver>ESRIShapefile</ogr_driver>
</features>
<!—指定數據繪制的風格,如顏色、透明度、紋理貼圖等等,這種風格的設置一般是用於矢量數據的繪制,osgEarth可以通過兩種方式定義風格,一種是CSS(重疊樣式表),一種是SLD(通過xml指定樣式,還在開發中),當給數據指定風格時,可以各整個數據層指定通過的風格,也可以將數據分解成多個類class,然后給每個類指定不同的風格(數據源需要能夠分解成不同的類)-->
<!—指定線的風格,顏色、寬度、透明度-->
<styletype="text/css">
element {
stroke: #FF0000;
stroke-width: 2.0;
stroke-opacity: 0.5;
}
</style>
<!—指定面的風格-->
<styletype="text/css">
element {
fill: #FF0000;
fill-opacity: 0.5;
}
</style><!—分解成不同的類分別設置不同的風格,下面是根據frence變量進行類的划分並設置不同的風格-->
<featuresname="world" driver="ogr">
<url>data/world.shp</url>
<ogr_driver>ESRIShapefile</ogr_driver>
</features>
<class name="french-speaking">
<query>
<expr>french="true" </expr>
</query>
<styletype="text/css">
world {
fill: #FFFF00;
fill-opacity: 0.5;
}
</style>
</class>
<classname="non-french-speaking">
<query>
<expr>french="false" </expr>
</query>
<styletype="text/css">
world {
fill: #FF0000;
fill-opacity: 0.5;
}
</style>
</class>
<!—指定繪制的幾何體類型,點、線、面-->
<geometry_type>line</geometry_type>
//ArcGIS驅動器,是從ESRI的服務器讀取影像數據
//復合驅動器,可以將多個影像數據源(可以使用各自不同的驅動器)復合成一個邏輯圖層,其實是一個偽裝的驅動器,不是真實的驅動器
<imagename="grouped layer" driver="composite">
<image name="component 1"driver="tms">
...
</image>
<image name="component 2"driver="wms">
...
</image>
...
</image>
//GDAL驅動器,使用該驅動器,指定源數據url時可以指定文件也可以指定某個目錄(不必將所有的文件都打包成一個文件),如果指定了目錄,還可以指定要加載該目錄下某些類型的文件(通過指定擴展名),此外,如果指定的是目錄,系統遞歸遍歷該目錄下的所有文件將要加載的文件生成一個邏輯圖層,需要注意的是,該目錄下所有的數據必須是統一的坐標系統以及同樣的波段和波段插值;基於性能的考慮,最好對源數據預先進行分塊分級處理以及坐標重投影預處理,這樣可以大大提高系統在運行時的性能。如果系統讀取到的源數據與運行時要求的投影方式不匹配,系統就會在運行時對數據進行重投影,這樣就會降低系統性能,如果想在這種情況下提高系統性能,可以讓系統緩存重投影后的數據:
<cachereproject_before_caching="true">
<path>/files/my_cache_folder</path>
</cache>
<imagename="boston_inset" driver="gdal">
<url>../data/boston-inset.tif</url>
<tile_size>256</tile_size>
</image>
//通過指定目錄的方式加載高程數據示例:
<heightfieldname="terrain" driver = "gdal">
<!--To load the files in a directory,just point the URL to a directory instead of a file-->
<url>..\data\terrain</url>
<!--Tell the GDAL driver to just lookfor tifs. Other files types will beignored.-->
<extensions>tif</extensions>
<!—對於高程數據,最好將tile_size設置為32或者64,默認情況下tile_size的值是256-->
<tile_size>32</tile_size>
</heightfield>
<!—指定數據分層的最大層數,如果不指定,系統將自動計算最大層數,這種方式特別適用於緩存自動計算的瓦片數據時-->
<max_data_level>10</max_data_level>
//osg驅動器,直接通過osg的文件讀寫插件讀取相應類型的影響數據或高程數據
//tilecache驅動器,讀取tilecache磁盤緩存數據,通過tilecache工具可以從WMS服務器創建或緩存地圖數據到磁盤,然后通過該驅動器進行離線讀取。
<imagename="world" driver="tilecache">
<url>F:/data/tilecache/mapdata</url>
<layer>world</layer>
<format>jpeg</format>
</image>
//tileservice驅動器,從NASA服務器讀取數據
//tms驅動器,通過tms服務的方式讀取數據
//wms驅動器,通過wms服務的方式讀取數據
//VPB驅動器,從vpb生成的地形數據庫讀取相應的影像和高程數據,注意,osgEarth只能讀取適用VPB使用—terrain選項創建的地形數據庫。這樣一來我們就可以同時使用vpb的地形數據庫以及原始的影像、高程數據,可以在不改變現有vpb地形數據的基礎上在已有的vpb地形上疊加另外的影像數據。
<!—指定在用vpb生成地形數據庫時(--splits選項)使用的主分割層-->
<primary_split_level>5</primary_split_level>
<!—指定在用vpb生成地形數據庫時使用的次分割層-->
<secondary_split_level>11</secondary_split_level>
<!—指定vpb地形數據使用的profile-->
<profile>global-geodetic</profile>
<!—指定vpb地形數據庫使用的目錄結構,分為nested,task, 以及 flat三種類型. 默認是 flat類型 -->
<!—指定使用vpb中影像數據層layer,默認是第0層-->
<layer>0</layer>
//模型驅動器
//feature_geom驅動器,該驅動器就是將矢量數據創建成幾何對象進行渲染
<!—定義特征數據-->
<features></features>
<!—定義風格-->
<style></style>
<!—定義分類(為不同分類指定不同的風格)-->
<class></class>
<!—定義高度偏移,生成幾何體前將數據相對海平面偏移特定高度主要是為了解決z-fighting的問題-->
<height_offset>10000</height_offset>
<!—指定生成的最大三角形的大小(三角形邊的最大長度,單位是度,僅用於地心坐標地形上),通過控制三角形大小能夠很好的將非凸多邊形構成的三角形映射成橢球體,默認值是5.0-->
//feature_overlay驅動器,該驅動器采用osgSim::OverlayNode將矢量數據作為投影紋理覆蓋到地形上。這種覆蓋節點的方式對於平面投影坐標模式是很適合的,但對於球體地心坐標來說有一定限制,通過覆蓋節點的方式將矢量數據投影成紋理只能覆蓋不到一半地球大小,而且在背面會顯示穿透效果。
<features></features>
<!—定義風格-->
<style></style>
<!—定義分類(為不同分類指定不同的風格)-->
<class></class>
<!—指定紋理單元,默認是auto-->
<texture_unit>1</texture_unit>
<!—指定覆蓋紋理的大小,默認是1024-->
<texture_size>2048</texture_size>
<!—指定覆蓋節點的基准高度,默認是0-->
<base_height>100</base_height>
//feature_stencil驅動器,該驅動器采用模板緩沖技術將矢量數據覆蓋到地形上
<features></features>
<!—定義風格-->
<style></style>
<!—定義分類(為不同分類指定不同的風格)-->
<class></class>
<!—指定擠壓距離,即在模板體的各個方向對其進行擠壓,這是為了防止對於那些覆蓋范圍比較大的幾何體容易造成z-fighting問題而做的處理,如果存在單個特征數據幾何體覆蓋的區域范圍特別大,就要增加該值,默認值是300000-->
<extrusion_distance>400000</extrusion_distance>
<!—定義高程數據,高程數據的定義屬性以及子要素基本與影像數據相同,特別需要注意的是,在定義瓦片大小時,默認值是256,這個值對於影像數據是合適的,但對於高程數據來說太大,應該將其設為比較小的值,比如32,否則會降低系統性能-->
<elevationname="srtm" driver="wms">
<url>http://localhost/cgi-bin/mapserv.exe?map=srtm30_plus.map</url>
<layers>srtm30plus</layers>
<format>tiff</format>
<tile_size>32</tile_size>
</elevation>
<!—定義模型數據,屬性包括名稱、驅動器driver、最小可視范圍值min_range(層次節點LOD范圍)、最大可視范圍值max_range、是否以覆蓋方式覆蓋到地形上overlay,對於指定的可視范圍值,如果指定了gridding,該范圍將作用於被分割的一個個的網格而不是模型幾何體本身-->
<modelname="roads" driver="feature_stencil">
<featuresname="roads" driver="ogr">
<url>../data/roads-utm.shp</url>
</features>
<!—指定網格划分,模型數據源允許我們將非地形數據圖層添加到地形地形圖上,某些驅動器可以將矢量數據或者特征數據轉換為幾何體或者覆蓋層,對於海量特征數據或者覆蓋區域范圍特別大的數據如果不對其進行優化處理,將嚴重影響系統性能,其中方式之一就是對其進行網格划分,對於不同的驅動器,網格划分實現的方式也不一樣,自帶的模型特征數據驅動器,比如feature_stencil和feature_geom驅動器就可以將幾何體數據划分為一個個的小網格-->
<!—指定一個單元格的最大值cell_size,包括寬和高;指定裁切技術,即如何決定某些數據屬於哪個單元格,共有兩種方式:crop切割方式以及centroid形心方式,crop切割方式是將幾何體根據格網進行切割,不同的部分分別屬於不同的網格即可,centroid形心方式是判斷幾何體的形心,形心落在哪個網格,就認為該幾何體屬於哪個網格-->
<griddingcell_size="1000" culling_technique="crop"/>
<styletype="text/css">
roads {
stroke: #ffff00;
stroke-width: 10;
}
</style>
<!—指定幾何體類型-->
<geometry_type>line</geometry_type>
</model>
<!—指定overlay覆蓋數據層,該層就是model的一個別名,等同於將model的overlay屬性設為true-->
<!—指定地形數據的邊緣標准化,指定該屬性是為了讓不同高程的瓦片數據之間的高程能夠准確的融合,默認是啟用的-->
<normalize_edges>true</normalize_edges>
<!—指定代理服務器地址和端口,如果想讓osgEarth通過代理服務器訪問某數據服務器,可以設定相應的代理服務器地址以及端口-->
<proxy_host>80.80.12.123</proxy_host>
<proxy_port>80</proxy_port>
</map>
Earth文件的完整示例見earthFile-template.earth文件
15. 注意,earth文件名不能有”-”橫線
OSGearth,貼近球面時鼠標無法准確的控制視點位置 (2010-11-09 21:58:15)轉載 分類: OSG
http://bbs.osgchina.org/viewthread.php?tid=2793&highlight=�ӵ�+��
osg::ArgumentParserarguments(&argc,argv);
osgViewer::Viewerviewer(arguments);
viewer.setUpViewOnSingleScreen(0);
viewer.setCameraManipulator(newosgGA::TrackballManipulator());
std::stringmodelPath =
"F:\\google.earth";
{
osg::ref_ptr<osg::Node> node =osgDB::readNodeFile(modelPath);
viewer.setSceneData(node.get());
}
//render a frame
viewer.realize();
while(!viewer.done())
{
viewer.frame();
}
使用的googleearth的圖層信息,拉近了發現鼠標操作的高度似乎要低於實際圖層所高度,低視角轉動地球時無法准確控制找到自己所需的位置。
哪位大俠幫忙告訴一下,在哪里設置鼠標控制點跟球面視角高度保持一致啊?
Trackball不太適合用來瀏覽地球,可以考慮用TerrainManipulator或者osgEarth自帶的EarthManipulator
用EarthManipulator解決了鼠標和滾輪的問題!
是這樣解決的:
std::string modelPath =
"F:\\word_wind.earth";
{
// create an osgEarth node. Add it tothe scene graph and let the ref pointer go out of scope.
osg::ref_ptr<osg::Node> node =osgDB::readNodeFile(modelPath);
viewer.setSceneData(node.get());
}
manip->getSettings()->bindMouseDoubleClick(
osgEarthUtil::EarthManipulator::ACTION_GOTO,
osgGA::GUIEventAdapter:EFT_MOUSE_BUTTON);
// add our fly-to handler
viewer.addEventHandler(newFlyToViewpointHandler( manip ));
// add some stock OSG handlers:
viewer.addEventHandler(newosgViewer::StatsHandler());
viewer.addEventHandler(newosgViewer::WindowSizeHandler());
viewer.addEventHandler(newosgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
原文鏈接:OSGEARTH三維地形開源項目
一休大師的CSDN博客:OSGEARTH三維地形開源項目