程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 在 Oracle XE構建 Google Earth 接口

在 Oracle XE構建 Google Earth 接口

編輯:Oracle數據庫基礎

了解空間數據,探究向現有數據添加空間屬性的方法,以及學習如何使用 Google Earth“俯瞰”包含該數據的航拍圖像。

我們看待數據的方式形成了我們對世界的看法。在這之前,我們中的大多數人仍會忽略位置,因為我們缺少獲取、管理以及顯示數據空間組件所需的工具(或使用這些工具的能力)。這意味著,在我們的個人經歷中缺失了地理空間這一環節。而我們所做、所思、所經歷的每一件事都是有地點的。

迄今為止,通過可視化引擎連接支持空間的數據庫仍是一件十分復雜的事情:例如,將我們的客戶(以及整個供應鏈)置於地圖上。現在,這個問題得到了解決。在本文中,您將了解空間數據的概念,探究向現有數據添加空間屬性的方法,以及學習如何使用免費的 Google Earth 程序“俯瞰”包含數據的航拍圖像。

這些技術中的某些部分有點難於使用,這是因為我們剛開始接觸地理空間可視化和分析工具,而且並非專業人士。其中一些工具令人驚歎,例如能夠使用 Google Sketch Up 向 Google Earth 添加任意特征的 3D 模型,而且是免費的!但是,有些時候這些工具會缺少一些“常見”功能,例如,支持交叉標簽的報表編寫器不能處理多級匯總。然而,正如處於起步階段的所有技術一樣,在標准不完善以及某些工具仍然難以上手的情況下,花費時間來學習該技術的領航者將獲得最豐厚的回報。

要使用空間工具,需要向數據添加空間屬性。空間屬性就是具有位置或空間組件的任何信息。有關空間坐標系統的細節數不勝數,包括使用的晶洞(地球形狀的模型)、基准點(所選 X-Y-Z 軸的原點位置)以及地球曲面在平面地圖上的投影(支持將球體曲面顯示在平面地圖上)。這個研究課題博大精深、令人著迷,但現在我們可以暫且將其忽略。

我們的目的是利用緯度和經度來表示地球上的某個位置。圍繞地球的緯度線就像多層結婚蛋糕,底部那一層(或者說緯度 0)就是赤道。從赤道到北極或南極,緯度共有 90 度。每一緯度大概是 69 英裡。赤道以北稱為北緯,赤道以南稱為南緯。

經度以南北極為軸將地球分割開,就像切開的桔瓣一樣。赤道是一種自然地物,而經線則是從人為定義的本初子午線(穿過英格蘭格林威治)開始。經線在靠近兩極時逐漸靠近,最終匯聚在一起。每一經度在赤道上大約相距 69 英裡,在南極或北極則為零距離。

為了簡化這些事物的計算機表示,習慣上將赤道以南的緯度和本初子午線以西的經度表示為負數。緯度和經度通常表示為度、分、秒,甚或是十進制度數。十進制度數處理起來更為簡便,因此本文將使用該單位。

例如,Oracle 總部位於 500 Oracle Parkway,Redwood Shores,CA 94065,或“大概”在 37.529526,-122.263969(北緯 37.529526 度,西經 122.263969 度)。

這個示例過於精確了!標識一棟建築物不需要在地理坐標中精確到小數點後 6 位數字。但是,到底需要精確到多少位呢?我們知道一緯度是 69 英裡。因此,一度的十分之一是 6.9 英裡,一度的百分之一是 .69 英裡,以此類推(參見下表)。如果我們只是用一個點來標記該棟建築物,則精確到小數點後四位足矣。

接下來,讓我們看看空間數據的三種主要形式:點、線和多邊形。

點很簡單:一條緯線和一條經線就可以標記一個點。線和多邊形就是一系列相連的點。線用於線狀地物,例如道路與河流,而多邊形是由若干條線組成,其中的線首尾相連,最終定義一個區域。送貨卡車使用的路線可能是條線,而銷售區域可能就是上述的多邊形。

現在,我將詳細說明如何使用免費的 Oracle 數據庫 XE 數據庫來嘗試存儲、管理和分析空間數據。

關於簡單性

存儲經度和緯度的最簡單方法是在數域中進行存儲。使用數域存儲坐標可以很好地通過點處理簡單事物。需要擴充時可使用 Locator(定位器),這是完整 Oracle Spatial 工具(隨附在 Oracle 商業產品中)的 XE 子集。通過 Locator,您可以從使用簡單的經/緯度轉向使用“幾何結構”。sdo_geometry 數據類型可以存儲點、線、多邊形以及更為復雜的幾何圖形,例如多點、多線和多個多邊形。您還可以使用操作符,用於計算幾何圖形之間距離、查找最近的相鄰物體,以及確定兩個幾何圖形是否交叉(“州際公路 70 是否進入科羅拉多州?”)。

如果您的操作不僅僅是將點置於地圖上,那麼 Locator 十分適用,但對於簡單問題,可以使用簡單工具。

Oracle 數據庫 XE(可以從 Oracle 技術網下載)具有 Windows 和 Linux 兩種版本。對於 Linux 安裝,請下載 RPM,然後進行安裝:

rpm –ivh Oracle-xe-10.2.0.1-1.0.i386.rpm

我在安裝中遇到了兩個小問題。首先,我沒有足夠的交換空間。我遵循 Red Hat 說明設置並激活了更多的交換空間,而不是在硬盤上創建一個較大的交換分區。簡言之,您需要創建一個用於交換的文件,並將其指定為交換文件,然後將其打開。這組命令如下:

dd if=/dev/zero of=/path-to-swap/swapfile bs=1024 count=1200000 
mkswap /path-to-swap/swapfile
swapon /path-to-swap/swapfile

您將通過 Web 界面配置和使用(大多數時候)Oracle 數據庫 XE。如果在本地計算機上安裝了 XE,則將浏覽器指向 http://127.0.0.1:8080/apex。如果是在遠程服務器上進行的安裝,您可能會遇到一個小問題,因為默認情況下 Web 浏覽器只為本地客戶端提供服務。

您可以使用 Web 界面的 Administration(管理)部分啟用對遠程客戶端的訪問。(或者,可以編輯位於 /etc/init.d/Oracle-xe 的 XE 配置文件。)但是,這種方法存在兩個問題。一個是,它公開數據庫管理的方式會引發更多安全問題。另一個更為重要的問題是,為了支持對 Web 界面的遠程訪問,您需要擁有本地 Web 訪問權限。這對於遠程無頭服務器而言是個挑戰。

一種解決方法是使用 Linux 和 Macintosh OSX 隨附的 Open SSH 程序。Open SSH 包含一個內置的 Socks 4 代理。您可以使用以下命令連接遠程服務器:

ssh -D1080 [email protected]

之後,看起來您像是設置了一個到服務器的普通 ssh 連接,但幕後的 SSH 將監聽端口 1080,並將所有請求傳送至遠程服務器。這還意味著,現在所有的 HTTP 通信都將進行加密直至到達您的服務器。在無法保證安全的公共網絡上工作時,這是一個非常有用的特性

最後一步是設置浏覽器代理。在 Firefox 中,選擇 Preferences->General->Connection。將您的 Socks 主機設置為端口 1080 上的本地主機,選擇 Socks v4,確保其針對遠程 127.0.0.1 和本地主機為 no proxy for。

這樣,就可以使用 Web 界面來執行幾乎所有可以通過數據庫完成的操作了。因為業務數據(通常)是空間數據,所以來看一個向地址添加緯度和經度的示例。

通過 Web 界面的 SQL 部分創建一個地址表。

create table address (name varchar(128), 
address1 varchar(128),  address2 varchar(128),
 city varchar(128), state char(2),  zip char(9), 
latitude number(7,5), longitude number(8,5))

加載幾個地址: 

  
insert into address (name, address1, city, state, zip) 
values ('Oracle', '500 Oracle Parkway', 'Redwood Shores', 'CA', '94065')
insert into address (name, address1, city, state, zip) 
values ('OReilly Media ', '1005 Gravenstein Highway North',
 'Sebastopol', 'CA', '95472')

向其他數據添加經度和緯度的過程稱為地理編碼 (geocoding)。Oracle Spatial 的完整版包括支持地理編碼的 SDO_GCDR 程序包。通過 Oracle 數據庫 XE,您可以使用 Geocoder.us Web 服務為地址添加地理編碼。如果只有兩個地址,可能只需查看坐標並手動進行更新即可,但絕對不會只有兩個地址!

Geocoder.us 提供了數個 Web 服務接口,用於獲取地址並返回坐標。最簡單的是逗號分隔 (Comma Separated Values,CSV) 接口。您可以在浏覽器中輸入一個 URL 並獲取坐標。該地址是:

http://rpc.geocoder.us/service/csv?address=500 Oracle Parkway,Redwood Shores,CA,94065

返回:

37.529526,-122.263969,500 Oracle Pky,Redwood City,CA,94065

還可以從 PHP 進行調用。該代碼將從命令行獲取地址,調用 geocoder.us,然後返回坐標:

包括地址並從命令行進行調用。(在從命令行調用 PHP 時,可以添加 –q 開關以取消普通 http 內容類型標題):

php -q ./php_work.PHP '1600 pennsylvania ave, washington, dc'

這將返回如下結果:

query address: 1600 pennsylvania ave, washington, dc latitude 38.898748 longitude -
77.037684

這是與 Geocoder.us 連接最簡單的情況。

下一步就是從數據庫獲取地址,然後通過 geocoder.us 返回的經度和緯度更新數據庫。

首先,需要結合使用 PHP 與 Oracle,請參閱這些說明。我按照這些說明使用的“gotcha”是不在默認位置的 apxs 副本,因此在配置時,我將 --with-apxs2=/usr/local/apache/bin/apxs 替換為 --with-apxs2=/usr/sbin/apxs。

以下代碼將讀取我們的地址表,對每個地址進行地理編碼,然後用經度和緯度更新該表。

無需幫手的三維地圖

所有努力都是為了向您提供包含空間數據的數據庫。現在,您可以清楚地了解客戶所在的位置!利用該信息,您可以完成很多事情,例如,分析市場,計劃宣傳活動、銷售路線以及送貨路線,但首當其沖的是我們要在地圖上看到這些數據。兩年以前,在地圖上顯示數據十分困難,您必須使用昂貴且專業的工具,或使用學習起來異常困難的復雜工具。幸運的是,這一切都成為了過去。

Google Earth 是一個適用於 Windows 和 Mac 的桌面應用程序,其用途不僅限於地圖,還提供了一個 3D 世界模型。在城鎮數量不斷增加的今日,它還包括了多個 3D 建築物輪廓。您還可以使用 Google Sketch Up 將自己的 3D 模型添加到顯示中。

Google Earth 可從 http://earth.google.com 獲得。這是一個免費版本,但對於 Google Earth Plus,您每年需支付 20 美元,對於 Google Earth Pro,您每年需支付 400 美元。付費版本增加了諸如全球定位系統 (GPS) 集成之類的功能。(單擊此處了解各個版本的不同之處。)網站說明非常簡單,請立即下載使用吧!剛開始,您會看到一個從太空視角拍攝的地球視圖。然後,可將視圖放大來搜索位置、探索世界,就像 Lewis 和 Clark(當今探險軍團的成員)一樣。

活躍的 Google Earth 社區會發布一些空間信息文件。例如,單擊此處閱讀並下載有關 Lewis 和 Clark 探險之旅的 Google Earth 文件:29917-lewis_and_clark_expedition.kmz。您會注意到,Google Earth 文件的擴展名為 KML(即 Keyhole 標記語言,Google Earth 在以前稱為 Keyhole)或 KMZ(通過 gzip 壓縮的 Keyhole 標記語言)。KMZ 文件可通過 WinZip 或 Stuffit Expander 進行解壓縮。

我喜歡我的 GUI,除非要嘗試進行腳本編寫,因此從 OSX 終端命令行,您可以輸入以下命令:

gunzip -S ".kmz" 29917-lewis_and_clark_expedition.kmz

打開該文件後,您將發現它只不過是一個 XML 文件。好吧,或許並不是十分簡單,但易於閱讀。請深入閱讀 Google Earth KML 文檔!

例如,以下是描述 Camp Disappointment 的地標。


 

  17: Camp Disappointment
  
 -112.820632
 48.716670
 1000.000
 0
 0
 
 root://styles#khStyle929
 
 -112.820632,48.716670,0
 
 
  
當您調出 Lewis and Clark 文件後,您將看到 Google Earth 是如何呈現該 Camp Disappointment 描述的。
元素以點元素的 元素中指定的 X, Y, Z 坐標形式顯示在地圖上(經度 = X,緯度 = Y,海拔 = Z,在本例中為 0)。單擊該點時,會彈出一個描述球,其中顯示了名稱和描述元素的內容,以及到此處去或從此點出發的選項。
請特別注意,描述可以包含 URL。因此,如果該地標描述了您的一個客戶,那麼就可以在調出中包含有關該客戶的其他屬性,然後在您的 CRM 系統中嵌入一個指向客戶頁面的鏈接。

元素包含一個指向標記該位置的“圖釘”URL 的鏈接。在本例中,該樣式包含在本地文件系統上。樣式描述還可以包含在 KML 文檔內或外部 URL 中。
最後,看一下 元素。雙擊地標,您會到達 元素中指定的經度和緯度,並看到由 、 以及 元素描述的視圖點。這允許您在指定視圖點的地方創建地標。例如,以下是一個完整的 KML 文件,其內容為“前往舊金山的 Crissy FIEld 觀賞金門大橋”:
  


 crissy fIEld
 
 -122.4592370657115
 37.8050682478946
 0
 1000.275193579794
 90
 315
 
 root://styles#default
 
 -122.4592370657115,37.8050682478946,0
  

為了簡單起見,您可以除去其中一些屬性。以下是這兩個明確地點的最簡單、有用的 KML 描述:





 First Place
 
 -122.5,37.8,0
 


 Random Place
 
 -122.6,37.9,0
 


以下是抓取地理編碼地址並生成 KML 文件的 PHP 程序:

' . "\n";
print '' . "\n";print '' . "\n";
while ( $row = oci_fetch_assoc($stmt) ) { 
  $address = $row["ADDRESS1"] . "," . $row["CITY"] . "," . $row["STATE"] . " " . $row["ZIP"]; 
  $name = $row["NAME"]; 
  $latitude = $row["LATITUDE"];
  $longitude = $row["LONGITUDE"];
  print "\n";
  print " $name\n"; 
  print " $address\n";
  print " \n"; 
  print " $longitude,$latitude,0\n"; 
  print " \n"; 
  print "\n";
}
print '' . "\n";
print '' . "\n";
?>

這是 caveman coder 版本,使用了專門用於顯示所有細節的打印語句。在實際操作中,您可能需要使用 XML 庫。請參閱以下位置的 Pear/XML/sql2XML 類說明文檔:http://PHP.chregu.tv/sql2XML/。此外,通過使用動態 URL 參數和變量,我們可以輕松地在該查詢(或其他查詢)中添加所需內容,這樣我們的空間分析用途將更為廣泛。

保持關注

現在,您已經能夠創建地址數據庫,通過地理編碼向該數據添加經度和緯度,然後將數據導出以便可以在 Google Earth 上查看數據(假設您仍未閱讀 Lewis 與 Clark 以及探險之旅的定期發布信息,並且沉迷於愉快的探險中)。

Rich Gibson (http://mappinghacks.com) 是一位地圖繪制、地理空間和地理編碼方面的顧問,與人合著了 Mapping Hacks:Tips & Tools for Electronic Cartography (O’Reilly, 2005) 和 Google Maps Hacks (O'Reilly, 2006)。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved