国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

在Oracle數(shù)據(jù)庫XE上構(gòu)建Google Earth接口

2024-08-29 13:35:22
字體:
供稿:網(wǎng)友
2006 年 8 月發(fā)布     我們看待數(shù)據(jù)的方式形成了我們對世界的看法。在這之前,我們中的大多數(shù)人仍會忽略位置,因為我們?nèi)鄙佾@取、治理以及顯示數(shù)據(jù)空間組件所需的工具(或使用這些工具的能力)。這意味著,在我們的個人經(jīng)歷中缺失了地理空間這一環(huán)節(jié)。 而我們所做、所思、所經(jīng)歷的每一件事都是有地點的。     迄今為止,通過可視化引擎連接支持空間的數(shù)據(jù)庫仍是一件十分復(fù)雜的事情:例如,將我們的客戶(以及整個供給鏈)置于地圖上。現(xiàn)在,這個問題得到了解決。在本文中,您將了解空間數(shù)據(jù)的概念,探究向現(xiàn)有數(shù)據(jù)添加空間屬性的方法,以及學(xué)習(xí)如何使用免費的 Google Earth 程序“俯瞰”包含數(shù)據(jù)的航拍圖像。    這些技術(shù)中的某些部分有點難于使用,這是因為我們剛開始接觸地理空間可視化和分析工具,而且并非專業(yè)人士。其中一些工具令人贊嘆,例如能夠使用 Google Sketch Up 向 Google Earth 添加任意特征的 3D 模型,而且是免費的!但是,有些時候這些工具會缺少一些“常見”功能,例如,支持交叉標簽的報表編寫器不能處理多級匯總。然而,正如處于起步階段的所有技術(shù)一樣,在標準不完善以及某些工具仍然難以上手的情況下,花費時間來學(xué)習(xí)該技術(shù)的領(lǐng)航者將獲得最豐厚的回報。    要使用空間工具,需要向數(shù)據(jù)添加空間屬性。空間屬性就是具有位置或空間組件的任何信息。有關(guān)空間坐標系統(tǒng)的細節(jié)數(shù)不勝數(shù),包括使用的晶洞(地球外形的模型)、基準點(所選 X-Y-Z 軸的原點位置)以及地球曲面在平面地圖上的投影(支持將球體曲面顯示在平面地圖上)。這個研究課題博大精深、令人著迷,但現(xiàn)在我們可以暫且將其忽略。     我們的目的是利用緯度和經(jīng)度來表示地球上的某個位置。圍繞地球的緯度線就像多層結(jié)婚蛋糕,底部那一層(或者說緯度 0)就是赤道。從赤道到北極或南極,緯度共有 90 度。每一緯度大概是 69 英里。赤道以北稱為北緯,赤道以南稱為南緯。    經(jīng)度以南北極為軸將地球分割開,就像切開的桔瓣一樣。赤道是一種自然地物,而經(jīng)線則是從人為定義的本初子午線(穿過英格蘭格林威治)開始。經(jīng)線在靠近兩極時逐漸靠近,最終匯聚在一起。每一經(jīng)度在赤道上大約相距 69 英里,在南極或北極則為零距離。    為了簡化這些事物的計算機表示,習(xí)慣上將赤道以南的緯度和本初子午線以西的經(jīng)度表示為負數(shù)。緯度和經(jīng)度通常表示為度、分、秒,甚或是十進制度數(shù)。十進制度數(shù)處理起來更為簡便,因此本文將使用該單位。    例如,Oracle 總部位于 500 Oracle Parkway,Redwood Shores,CA 94065,或“大概”在 37.529526,-122.263969(北緯 37.529526 度,西經(jīng) 122.263969 度)。     這個示例過于精確了!標識一棟建筑物不需要在地理坐標中精確到小數(shù)點后 6 位數(shù)字。但是,到底需要精確到多少位呢?我們知道一緯度是 69 英里。因此,一度的十分之一是 6.9 英里,一度的百分之一是 .69 英里,以此類推(參見下表)。假如我們只是用一個點來標記該棟建筑物,則精確到小數(shù)點后四位足矣。在Oracle數(shù)據(jù)庫XE上構(gòu)建Google Earth接口
點擊查看大圖
接下來,讓我們看看空間數(shù)據(jù)的三種主要形式:點、線和多邊形。    點很簡單:一條緯線和一條經(jīng)線就可以標記一個點。線和多邊形就是一系列相連的點。線用于線狀地物,例如道路與河流,而多邊形是由若干條線組成,其中的線首尾相連,最終定義一個區(qū)域。送貨卡車使用的路線可能是條線,而銷售區(qū)域可能就是上述的多邊形?,F(xiàn)在,我將具體說明如何使用免費的 Oracle 數(shù)據(jù)庫 XE 數(shù)據(jù)庫來嘗試存儲、治理和分析空間數(shù)據(jù)。

關(guān)于簡單性

     存儲經(jīng)度和緯度的最簡單方法是在數(shù)域中進行存儲。使用數(shù)域存儲坐標可以很好地通過點處理簡單事物。需要擴充時可使用 Locator(定位器),這是完整 Oracle Spatial 工具(隨附在 Oracle 商業(yè)產(chǎn)品中)的 XE 子集。通過 Locator,您可以從使用簡單的經(jīng)/緯度轉(zhuǎn)向使用“幾何結(jié)構(gòu)”。sdo_geometry 數(shù)據(jù)類型可以存儲點、線、多邊形以及更為復(fù)雜的幾何圖形,例如多點、多線和多個多邊形。您還可以使用操作符,用于計算幾何圖形之間距離、查找最近的相鄰物體,以及確定兩個幾何圖形是否交叉(“州際公路 70 是否進入科羅拉多州?”)。    假如您的操作不僅僅是將點置于地圖上,那么 Locator 十分適用,但對于簡單問題,可以使用簡單工具。    Oracle 數(shù)據(jù)庫 XE(可以從 Oracle 技術(shù)網(wǎng)下載)具有 Windows 和 linux 兩種版本。對于 Linux 安裝,請下載 RPM,然后進行安裝:rpm –ivh oracle-xe-10.2.0.1-1.0.i386.rpm
    我在安裝中碰到了兩個小問題。首先,我沒有足夠的交換空間。我遵循 Red Hat 說明設(shè)置并激活了更多的交換空間,而不是在硬盤上創(chuàng)建一個較大的交換分區(qū)。簡言之,您需要創(chuàng)建一個用于交換的文件,并將其指定為交換文件,然后將其打開。這組命令如下:dd if=/dev/zero of=/path-to-swap/swapfile bs=1024 count=1200000
mkswap /path-to-swap/swapfile
swapon /path-to-swap/swapfile
    您將通過 Web 界面配置和使用(大多數(shù)時候)Oracle 數(shù)據(jù)庫 XE。假如在本地計算機上安裝了 XE,則將瀏覽器指向 http://127.0.0.1:8080/apex。假如是在遠程服務(wù)器上進行的安裝,您可能會碰到一個小問題,因為默認情況下 Web 瀏覽器只為本地客戶端提供服務(wù)。     您可以使用 Web 界面的 Administration(治理)部分啟用對遠程客戶端的訪問。(或者,可以編輯位于 /etc/init.d/oracle-xe 的 XE 配置文件。)但是,這種方法存在兩個問題。一個是,它公開數(shù)據(jù)庫治理的方式會引發(fā)更多安全問題。另一個更為重要的問題是,為了支持對 Web 界面的遠程訪問,您需要擁有本地 Web 訪問權(quán)限。這對于遠程無頭服務(wù)器而言是個挑戰(zhàn)。  一種解決方法是使用 Linux 和 Macintosh OSX 隨附的 Open SSH 程序。Open SSH 包含一個內(nèi)置的 Socks 4 代理。您可以使用以下命令連接遠程服務(wù)器: ssh -D1080 username@yourserver.com    之后,看起來您像是設(shè)置了一個到服務(wù)器的普通 ssh 連接,但幕后的 SSH 將監(jiān)聽端口 1080,并將所有請求傳送至遠程服務(wù)器。這還意味著,現(xiàn)在所有的 HTTP 通信都將進行加密直至到達您的服務(wù)器。在無法保證安全的公共網(wǎng)絡(luò)上工作時,這是一個非常有用的特性。     最后一步是設(shè)置瀏覽器代理。在 Firefox 中,選擇 PReferences->General->Connection。將您的 Socks 主機設(shè)置為端口 1080 上的本地主機,選擇 Socks v4,確保其針對遠程 127.0.0.1 和本地主機為 no proxy for。    這樣,就可以使用 Web 界面來執(zhí)行幾乎所有可以通過數(shù)據(jù)庫完成的操作了。因為業(yè)務(wù)數(shù)據(jù)(通常)是空間數(shù)據(jù),所以來看一個向地址添加緯度和經(jīng)度的示例。通過 Web 界面的 SQL 部分創(chuàng)建一個地址表。 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')
   向其他數(shù)據(jù)添加經(jīng)度和緯度的過程稱為地理編碼 (geocoding)。Oracle Spatial 的完整版包括支持地理編碼的 SDO_GCDR 程序包。通過 Oracle 數(shù)據(jù)庫 XE,您可以使用 Geocoder.us Web 服務(wù)為地址添加地理編碼。假如只有兩個地址,可能只需查看坐標并手動進行更新即可,但絕對不會只有兩個地址!    Geocoder.us 提供了數(shù)個 Web 服務(wù)接口,用于獲取地址并返回坐標。最簡單的是逗號分隔 (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 進行調(diào)用。該代碼將從命令行獲取地址,調(diào)用 geocoder.us,然后返回坐標:<?PHP
$address = $argv[1];
echo "query address: $address /n";
$url = "http://rpc.geocoder.us/service/csv?address=" . (urlencode($address));
$w = fopen($url,"r");
$result = fgetcsv($w,8000);
fclose($w);

$latitude = $result["0"];
$longitude = $result["1"];

echo "latitude $latitude longitude $longitude/n";
?>
    包括地址并從命令行進行調(diào)用。(在從命令行調(diào)用 PHP 時,可以添加 –q 開關(guān)以取消普通 http 內(nèi)容類型標題):
php -q ./php_work.php '1600 pennsylvania ave, washington, dc' 這將返回如下結(jié)果:query address: 1600 pennsylvania ave, washington, dc
latitude 38.898748 longitude -77.037684
   這是與 Geocoder.us 連接最簡單的情況。下一步就是從數(shù)據(jù)庫獲取地址,然后通過 geocoder.us 返回的經(jīng)度和緯度更新數(shù)據(jù)庫。      首先,需要結(jié)合使用 PHP 與 Oracle,請參閱這些說明。我按照這些說明使用的“gotcha”是不在默認位置的 apxs 副本,因此在配置時,我將 --with-apxs2=/usr/local/apache/bin/apxs 替換為 --with-apxs2=/usr/sbin/apxs。以下代碼將讀取我們的地址表,對每個地址進行地理編碼,然后用經(jīng)度和緯度更新該表。 <?PHP

# create a connection to the database instance on localhost. If you
# have not done anything 'clever' the username 'system' will work
# with the passWord that you defined at installation
$conn=oci_connect('username','password', "http://127.0.0.1/XE");

# Query our address table
$sql = "SELECT name, address1, city, state, zip from address";

# oci_parse is part of the Oracle PHP library to parse the SQL statement
$stmt = oci_parse($conn, $sql);

# oci_execute not surprisingly executes the statement we parsed in the previous line
oci_execute($stmt);

# This loads the associative array $row with the values of each row in our
# database in turn
while ( $row = oci_fetch_assoc($stmt) ) {
# print_r dumps a variable, including all of the keys for an associative array
print_r($row);
# assemble the query variable for our call to geocoder.us
$address = $row["ADDRESS1"] . "," . $row["CITY"] . "," . $row["STATE"] . " " . $row["ZIP"];
# pull the name out of the associative array
$name = $row["NAME"];
# the url to the free service of geocoder.us to return the data in CSV format
$url = "http://rpc.geocoder.us/service/csv?address=" . (urlencode($address));
# open the url
$w = fopen($url,"r");
#parse the CSV returned from the page into the array $result
$result = fgetcsv($w,8000);
fclose($w);

$latitude = $result["0"];
$longitude = $result["1"];

# query to update the address table with the lat/long we got from geocoder.us
# granted it is poor database design to have sUCh an uncertain key as 'name'
# be our primary key…I'll leave it as an exercise to the reader to implement
# this code in a way that doesn't make DBA's cry.
$sqlu = "update address set =$latitude, =$longitude where NAME='$name'";
echo "sqlu $sqlu/n";
# as before, parse the SQL statement
$stmtu = oci_parse($conn, $sqlu);
# and execute the statement
oci_execute($stmtu);
}
?> 
 

無需幫手的三維地圖


     所有努力都是為了向您提供包含空間數(shù)據(jù)的數(shù)據(jù)庫。現(xiàn)在,您可以清楚地了解客戶所在的位置!利用該信息,您可以完成很多事情,例如,分析市場,計劃宣傳活動、銷售路線以及送貨路線,但首當(dāng)其沖的是我們要在地圖上看到這些數(shù)據(jù)。兩年以前,在地圖上顯示數(shù)據(jù)十分困難,您必須使用昂貴且專業(yè)的工具,或使用學(xué)習(xí)起來異常困難的復(fù)雜工具。幸運的是,這一切都成為了過去。    Google Earth 是一個適用于 Windows 和 Mac 的桌面應(yīng)用程序,其用途不僅限于地圖,還提供了一個 3D 世界模型。在城鎮(zhèn)數(shù)量不斷增加的今日,它還包括了多個 3D 建筑物輪廓。您還可以使用 Google Sketch Up 將自己的 3D 模型添加到顯示中。    Google Earth 可從 http://earth.google.com 獲得。這是一個免費版本,但對于 Google Earth Plus,您每年需支付 20 美元,對于 Google Earth Pro,您每年需支付 400 美元。付費版本增加了諸如全球定位系統(tǒng) (GPS) 集成之類的功能。(單擊此處了解各個版本的不同之處。)網(wǎng)站說明非常簡單,請立即下載使用吧!剛開始,您會看到一個從太空視角拍攝的地球視圖。然后,可將視圖放大來搜索位置、探索世界,就像 Lewis 和 Clark(當(dāng)今探險軍團的成員)一樣。    活躍的 Google Earth 社區(qū)會發(fā)布一些空間信息文件。例如,單擊此處閱讀并下載有關(guān) 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     打開該文件后,您將發(fā)現(xiàn)它只不過是一個 xml 文件。好吧,或許并不是十分簡單,但易于閱讀。請深入閱讀 Google Earth KML 文檔! 例如,以下是描述 Camp Disappointment地標。<Placemark>
<description><![CDATA[
<a >
Click to read entry</a>]]></description>
<name>17: Camp Disappointment</name>
<LookAt>
<longitude>-112.820632</longitude>
<latitude>48.716670</latitude>
<range>1000.000</range>
<tilt>0</tilt>
<heading>0</heading>
</LookAt>
<styleUrl>root://styles#khStyle929</styleUrl>
<Point>
<coordinates>-112.820632,48.716670,0</coordinates>
</Point>
</Placemark>
    當(dāng)您調(diào)出 Lewis and Clark 文件后,您將看到 Google Earth 是如何呈現(xiàn)該 Camp Disappointment 描述的。     <name> 元素以點元素的 <coordinates> 元素中指定的 X, Y, Z 坐標形式顯示在地圖上(經(jīng)度 = X,緯度 = Y,海拔 = Z,在本例中為 0)。單擊該點時,會彈出一個描述球,其中顯示了名稱和描述元素的內(nèi)容,以及到此處去或從此點出發(fā)的選項。    請非凡注重,描述可以包含 URL。因此,假如該地標描述了您的一個客戶,那么就可以在調(diào)出中包含有關(guān)該客戶的其他屬性,然后在您的 CRM 系統(tǒng)中嵌入一個指向客戶頁面的鏈接。
    <styleURL> 元素包含一個指向標記該位置的“圖釘”URL 的鏈接。在本例中,該樣式包含在本地文件系統(tǒng)上。樣式描述還可以包含在 KML 文檔內(nèi)或外部 URL 中。    最后,看一下 <LookAt> 元素。雙擊地標,您會到達 <LookAt> 元素中指定的經(jīng)度和緯度,并看到由 <heading>、<tilt> 以及 <range> 元素描述的視圖點。這答應(yīng)您在指定視圖點的地方創(chuàng)建地標。例如,以下是一個完整的 KML 文件,其內(nèi)容為“前往舊金山的 Crissy Field 觀賞金門大橋”:<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Placemark>
<name>crissy field</name>
<LookAt>
<longitude>-122.4592370657115</longitude>
<latitude>37.8050682478946</latitude>
<altitude>0</altitude>
<range>1000.275193579794</range>
<tilt>90</tilt>
<heading>315</heading>
</LookAt>
<styleUrl>root://styles#default</styleUrl>
<Point>
<coordinates>-122.4592370657115,37.8050682478946,0</coordinates>
</Point>
</Placemark>
</kml>
為了簡單起見,您可以除去其中一些屬性。以下是這兩個明確地點的最簡單、有用的 KML 描述: <?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Folder>
<Placemark>
<name>First Place</name>
<Point>
<coordinates>-122.5,37.8,0</coordinates>
</Point>
</Placemark>
<Placemark>
<name>Random Place</name>
<Point>
<coordinates>-122.6,37.9,0</coordinates>
</Point>
</Placemark>
</Folder>
</kml>
以下是抓取地理編碼地址并生成 KML 文件的 PHP 程序:<?PHP

$conn=oci_connect('username','password', "http://127.0.0.1/XE");
$sql = "SELECT name, address1, city, state, zip, latitude, longitude from address a";
$stmt = oci_parse($conn, $sql);
oci_execute($stmt);

print '<?xml version="1.0" encoding="UTF-8"?>' . "/n";
print '<kml xmlns="http://earth.google.com/kml/2.0">' . "/n";
print '<Folder>' . "/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 "<Placemark>/n";
print " <name>$name</name>/n";
print " <description>$address</description>/n";
print " <Point>/n";
print " <coordinates>$longitude,$latitude,0</coordinates>/n";
print " </Point>/n";
print "</Placemark>/n";
}
print '</Folder>' . "/n";
print '</kml>' . "/n";
?>
    這是 caveman coder 版本,使用了專門用于顯示所有細節(jié)的打印語句。在實際操作中,您可能需要使用 XML 庫。請參閱以下位置的 Pear/XML/sql2xml 類說明文檔:http://php.chregu.tv/sql2xml/。此外,通過使用動態(tài) URL 參數(shù)和變量,我們可以輕松地在該查詢(或其他查詢)中添加所需內(nèi)容,這樣我們的空間分析用途將更為廣泛。

保持關(guān)注


    現(xiàn)在,您已經(jīng)能夠創(chuàng)建地址數(shù)據(jù)庫,通過地理編碼向該數(shù)據(jù)添加經(jīng)度和緯度,然后將數(shù)據(jù)導(dǎo)出以便可以在 Google Earth 上查看數(shù)據(jù)(假設(shè)您仍未閱讀 Lewis 與 Clark 以及探險之旅的定期發(fā)布信息,并且沉迷于愉快的探險中)。
Rich Gibson (http://mappinghacks.com) 是一位地圖繪制、地理空間和地理編碼方面的顧問,與人合著了 Mapping Hacks:Tips & Tools for Electronic Cartography (O’Reilly, 2005) 和 Google Maps Hacks (O'Reilly, 2006)。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 瓮安县| 襄樊市| 六安市| 内江市| 通海县| 泸溪县| 镇赉县| 玉屏| 新民市| 嘉鱼县| 尤溪县| 古蔺县| 同仁县| 沙田区| 扎兰屯市| 平江县| 通山县| 余姚市| 河津市| 保定市| 武邑县| 米脂县| 喀喇| 博爱县| 克拉玛依市| 台中市| 雅安市| 古交市| 西乌珠穆沁旗| 晋中市| 秀山| 伊吾县| 张北县| 依兰县| 日照市| 威宁| 平遥县| 通榆县| 海盐县| 米脂县| 宜兰市|