原創|使用教程|編輯:龔雪|2014-05-29 09:13:17.000|閱讀 2320 次
概述:本教程介紹了在MapInfo Professional中如何進行空間數據查詢,涉及范圍有對象查詢、SQL查詢、獲取單個對象的信息、通過“更新列”對話框獲取對象的信息。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
1.對象
1)點對象:點是有特定的位置,維數為零的物體。
2)線對象:是GIS中非常常用的維度為一的空間組分,表示對象和它們邊界的空間屬性,由一系列坐標表示。
3)多邊形對象:面狀實體也稱為多邊形,是對湖泊、島嶼、地塊等一類現象的描述。通常在數據庫中由一封閉曲線加內點來表示。
2.對象屬性查詢
先選擇要查詢屬性的對象,然后單擊“新建瀏覽窗口”按鈕,彈出“瀏覽表”對話框,再單擊“確定”按鈕,打開所選對象的屬性數據瀏覽器窗口。
選擇好對象的窗口
“瀏覽表”對話框
查詢結果瀏覽窗口
SQL(Structure Query Language)是結構化查詢語言,是一套強大的查詢系統。語言簡單、指令簡潔、操作簡單、功能強大,被廣泛運用在相互關聯的數據庫中,并能完成十分復雜的查詢和選擇。
1.通過“查詢”菜單上的“選擇…”命令來查詢
“選擇”對話框
2.通過“查詢”菜單上的“SQL選擇”命令來查詢
“SQL選擇”對話框
3.“SQL選擇”的操作示例
例如:查詢并顯示出人口大于3000萬的省份
“SQL選擇”對話框
執行“SQL查詢”后的地圖窗口
地圖窗口中符合條件的省區域對象被選擇,所選擇記錄的表瀏覽器按人口升序排列。
按升序排列的表瀏覽器窗口
4.SQL選擇
① 打開希望查詢的表(倘若尚未打開的話)。
② 選擇“查詢”→“SQL選擇”。
③ 打開一個地圖窗口或一個瀏覽窗口(若用戶想看到查詢結果)。
④ MapInfo自動選中結果表中所有行。
⑤ 若希望對查詢表做一個永久拷貝,選擇“文件”→“另存為”。
5.“選擇列”字段
1)計算派生列
“SQL選擇”可以計算派生列并將其保存在結果表中。
【例】顯示一個進行加法運算的派生列表達式,它將兩個數值型列相加。例中假設Purchase92和Purchase93都是數值型字段。
選擇列:Purchase 92 + Purchase 93
2)選擇顯示在結果表中的列
結果表中只包括在“選擇列”域中輸入的一個或多個列。這一點在表中有許多列,而只希望使用其中少數列(可能是因為在屏幕上一次只能顯示其中少數列)時很有用。
輸入一系列列名:
① 在“從表”域中輸入表名(若還未輸入的話)。可以直接輸入表名或是在“表”下拉式列表中選擇表名。
② 單擊“選擇列”域,該域中出現插入符。
③ 如果該域中有星號,先用〈Backspace〉鍵或〈Delete〉鍵將其刪除。“選擇列”域中可以含有一個星號或者一系列列名。
④ 在對話框右側的“列”下拉列表中選擇一個列名。MapInfo將該列名復制到“選擇列”域中。
⑤ 如果希望查詢中包含多個列,可以在“列”下拉式列表中選擇其它列名。在選擇其它列名時,MapInfo自動插入逗號以分隔列名。
3)使用“SQL選擇”對話框的“選擇列”字段
使用“選擇列”域來指定查詢結果表中應該出現哪些列。若想結果表中含有與原始表相同的列集,在“選擇列”域中輸入一個星號(*)。
若想結果表中含有的列集與原始表不同,刪除星號,并輸入用逗號分隔的一系列列名或表達式,如下所述。“選擇列”域可包含星號或一系列列表達式,但二者不可得兼。在填寫“選擇域”之前,請先填好“從表”域。
若查詢涉及多個表,每個列名前必須加上表名,用句點分開表名和列名。這樣,若你執行涉及兩個表的查詢,其中一個是“Canada”表,用戶希望查詢包括“Canada”表的“Population”列,則必須使用列表達式Canada.Population。無論何時使用兩個或多個表,“列”下拉式列表會自動將表名插入到列名前。
6.“條件”字段
1)按行序連接表
若兩個表沒有公共列,還可以按照記錄的順序進行表連接。若知道一個表的第一條記錄對應于另一個表的第一條記錄,或更一般地說,一個表的第N條記錄對應于另一個表的第N條記錄,就可以通過引用一個特殊的名為RowID的列將兩個表連接。
RowID列含有代表著表中每個記錄的行號的整數。因此,任何表的第一條記錄的RowID值為1,第二條記錄的RowID值為2,依此類推。
要連接兩個表使得MapInfo匹配兩個表的第N條記錄,指定一個如下形式的“條件”表達式。
條件: TABLE_1.RowID = TABLE_2.RowID
2)按地理關系連接表
若兩個表有圖形對象,MapInfo能根據那些對象之間的空間關系即地理運算符來連接表 。
Contains 對象A包含(Contains)對象B:B的中心在A的邊界內任一點。
Contains Entire 對象A完全包含(Contains Entire)對象B:B的邊界完全位于A的邊界之內。
Within 對象A位于(Within)對象B之內:A的中心在B的邊界之內。
Entirely Within 對象A完全位于(Entirely Within)對象B之內:對象A的邊界完全位于B的邊界之內。
Intersects 對象A與對象B相交(Intersects):它們至少有一個公共點,或一個對象完全位于另一個對象之內。
Contains和Within,與Contains Entire和Entirely Within的區別在于如何進行地理比較。對于Contains和Within,比較的是對象中心。對于Contains Entirely和Entirely Within,比較的是整個對象。
下圖說明了此點:
多邊形地理位置關系
Object A contains object B
Object A contains object B
Object A contains Entire object B
Object B within object A
Object B within object A
Object B entirely Within object A
Object A intersects object B
Object B intersects object A
3)連接兩個或多個表
MapInfo能利用公共字段將兩表連接。
4)執行子選擇
MapInfo允許SQL選擇中有子選擇。子選擇是被放在“SQL選擇”對話框中的“條件”域內的選擇語句。
【例】選擇states中超過4,000,000人的所有城市。
選擇列 *
從表 cities
條件 obj within any(select obj from states where Pop_1990 > 4000000)
5)設置過濾規則
過濾條件是常用于比較列值與其它值的邏輯表達式。例如,下面的過濾條件使用大于運算符(>)來檢查Order_Amount列的值是否大于100。
“條件”:Order_Amount > 100
如果查詢包括上述“條件”子句,MapInfo只選擇Order_Amount值大于100的行。
如果表達式被詞and或or隔開,“條件”子域可包含兩個或多個邏輯表達式。如果表達式被詞and連接,MapInfo只選擇滿足全部兩個條件的行。如果表達式被詞or連接,MapInfo選擇滿足任一條件的所有行。
7.“按列排序”字段
1)選擇升序或降序排序
缺省情形下MapInfo按升序對表進行排序。要將字段按降序排以使大數字排在小數字前,可以在“按列排序”域中將desc放在列名字前。
【例】查詢World表時,以下的Order By排序準則。按列排序:Population desc將該表按Population字段進行降序排序。
選擇列:*
從表: City_1K
按列排序 State, Population desc
2)使用“按列排序”字段排序結果表
在“SQL選擇”對話框中使用“按列排序”域,可將結果表的記錄排序。排序影響在瀏覽窗口中記錄從上而下出現的順序。
【例】按照State列對City_1K表排序。
結果表按州名排序;但是,在California組內各行中,城市并未排序,San Francisco出現在Anaheim之上。要改正這一問題,可以在“按列排序”域中輸入兩個列名:
選擇列: *
從表: City_1K
按列排序: State, City
8.“按列分組”字段
1)按列分組示例
【例】設想有一個顧客訂單表。該表中每一行表示單個訂單。表中一列包含訂貨銷售代理的名字,另一列含有顧客名字,還有一列包含訂貨量。
對每個銷售代理,可找出:
① 該代理的訂單數目。
② 該代理的平均訂貨量。
③ 該代理的總訂貨量。
以下SQL選擇查詢產生所需結果:
選擇列 Sales_Rep, count(*), average(AMOUNT), sum(AMOUNT)
從表 Orders
按列分組 Sales_Rep
2)使用“按列分組”字段分類匯總結果表
【例】若有一個顧客數據庫,并按州名列分組,MapInfo會將所有得克薩斯州的顧客放入一組,所有加利福尼亞州的顧客放入另一組,等等。然后,MapInfo計算每一組的聚合信息(總計、平均等)。
指定分類匯總標準:
① 在“按列分組”域中,輸入MapInfo用于計算分類匯總的列的列名或列號。
例如,若要按州總計顧客表,可輸入表示顧客所在州的列的列名(如StateName)。
② 在“選擇列”域中,輸入同一列名(如StateName)。
③ 在“選擇列”域中,輸入一個或多個運算符(Sum、Count Avg、Min或Max)。請記住用逗號分隔開聚合運算符。
9.聚合函數
MapInfo提供以下聚合函數:
Count(*):計算一組中記錄總數。它簡單地使用*作參數,因為它應用到整條記錄,而非某個特定字段。
Sum(表達式):計算一組中所有記錄的〈表達式〉總計值。
Avg(表達式):計算一組中所有記錄的〈表達式〉平均值。
Max(表達式):找出一組中所有記錄的〈表達式〉最大值。
Min(表達式):找出一組中所有記錄的〈表達式〉最小值。
使用“獲取信息”可以顯示地圖或布局中的選中對象(可編輯或只讀)的“區域對象”對話框。使用此對話框可以為對象設定地理屬性。條件是地圖窗口或布局被激活,且一個對象被選中。如果選中的對象可編輯(在可編輯圖層內),那么可以通過訪問該對象的屬性對話框為該對象設定屬性。對話框中的選項對于選中對象的類型是唯一的。如果對象不可編輯,那么只能訪問只讀對話框。
1.獲取區域對象信息
使用“區域對象”對話框顯示或設定區域位置、面積和周長、組成區域的線段數和多邊形數。單位可通過“工具”菜單中的“選項…”命令按鈕彈出的“地圖選項對話框”中設置。如果該區域對象可編輯,還可以設置該區域對象的區域樣式。
可編輯“區域對象”對話框
2.獲取折線對象信息
使用“折線對象”對話框顯示或設定折線的位置、總長度、線段數目、部分及平滑性。如果該對象可編輯,還可以通過單擊線樣式按鈕修改該折線對象的樣式。
不可編輯“折線對象”對話框
3.獲取點對象信息
使用“點對象”對話框顯示或設定點位置的X坐標和Y坐標。輸入點的坐標按確定按鈕后,該點對象定位在輸入的坐標位置上,可以通過“查詢”菜單中的“查找選中部分”命令將沒有在本地圖視圖中顯示改變到以該對象為中心的新地圖視圖中來。如果該對象可編輯,還可以通過單擊符號樣式按鈕修改該符號的樣式。
可編輯“點對象”對話框
執行“表”菜單上的“更新列…”命令按鈕,彈出“更新列”對話框。
“更新列”對話框
1.獲取表中圖形對象信息
1)獲取區域對象的面積:
首先修改表的數據結構,增加一個新的數值型字段,根據要求設置字段類型及小數位數,準備存放面積數據。設置面積使用的坐標類型,然后打開“更新列”對話框,選擇要更新的表和要更新的列,在從中獲得值的表中選擇與要更新的表相同的表,單擊“輔助”按鈕,彈出“表達式”對話框,選擇函數里的area()函數,修改面積單位后,按“確定”按鈕,最后再單擊“更新列”對話框中的“確定”按鈕。表中的每個區域對象的面積值將在要更新的列中顯示出來。
“表達式”對話框
設置好的“更新列”對話框
2)獲取折線對象的長度:
首先修改表的數據結構,增加一個新的數值型字段,根據要求設置字段類型及小數位數,準備存放長度數據。設置長度使用的坐標類型,然后打開“更新列”對話框,選擇要更新的表和要更新的列,在從中獲得值的表中選擇與要更新的表相同的表,單擊“輔助”按鈕,彈出“表達式”對話框,選擇函數里的ObjectLen()函數,修改距離單位后,按“確定”按鈕,最后再單擊“更新列”對話框中的“確定”按鈕。表中的每個折線對象的面長度值將在要更新的列中顯示出來。
“表達式”對話框
設置好的“更新列”對話框
2.通過連接表獲得屬性信息
要從另一表中獲得該表的一些屬性信息,兩個表必須能建立連接關系,包括用兩表中的列匹配和按兩表中圖形對象的地理關系連接兩種,如下圖所示:
“指定連接”對話框
設置好連接方式后按“確定”按鈕返回“更新列”對話框,如下圖所示
指定連接后的“更新列”對話框
選擇計算的選項count(統計表中記錄的個數)和數值兩種,如選擇了數值,則可選擇“從中獲得值的表”中的數值型字段或設置表達式,然后再單擊確定按鈕,即可將新的屬性數據按照連接關系更新到“要更新的表”中的原有選擇列或增加新的臨時列中。
MapInfo Professional下載>> MapInfo Professional視頻教程>>
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網