hillyspring
銀牌會員
發(fā)短消息
關(guān)注Ta
積分 3152
帖子 435
威望 5490 個
禮品券 406 個
專家指數(shù) 563
注冊 2006-5-9 專業(yè)方向
2G4G優(yōu)化
回答問題數(shù) 0
回答被采納數(shù) 0
回答采納率 0%
|
大
中
小
發(fā)表于 2012-01-15 12:09:37
只看樓主
|
在MapInfo中,無論是文本信息,還是圖形信息,均以表的形式組織,因而表是MapInfo 的主要操作對象。
MapBasic語言提供給了豐富的對某個MapInfo的表進行操作的函數(shù)和語句。在MapBasic應用程序中可以使用Alter Table語句改變表的結(jié)構(gòu),或者用Fetch語句定位到表的某一行。還可以用Import語句將文本文件(或其他格式的數(shù)據(jù)文件)轉(zhuǎn)換成MapInfo的表;而用Export語句又可以將MapInfo的表按不同的格式進行轉(zhuǎn)換輸出。本章介紹MapBasic語言管理MapInfo表的主要操作命令和方法。
表的組成
一個MapInfo的表是由多個文件組成的,有包含表結(jié)構(gòu)(字段名、字段類型、字段長度、索引字段名等)的文件;有包含行(記錄)和列(字段)數(shù)據(jù)值的文件。此外,還有包含圖形對象的文件(如果有圖形對象),索引文件等。
含有行列值的數(shù)據(jù)文件可以是MapInfo支持的任何格式的文件,這些格式包括DBF、Lotus、WKS或WK1、無格式的ASCII文件以及XLS文件格式等。通常MapInfo的表主要由以下幾種文件組成:
filename.tab:描述表的結(jié)構(gòu)
filename.dat或filename.dbf等包含表的數(shù)據(jù)
filename.map:表的圖形對象
filename.id:包含表的地理索引
filename.ind:包含表中的列索引
[attach]215222[/attach]
其中 TAB,DAT與ID當我們生成表或者注冊表后就會自動生成,而MAP文件只有對表進行map化之后才會生成。
應該注意的是:由于每一個表由多個文件組成,當重命名一個表時必須特別小心。重命名一個表,選擇MapInfo的Table > Maintenance > Rename Table菜單命令,或者應用MapBasic的Rename Table語句。
用MapBasic打開表
一個表在被MapBasic應用程序訪問之前必須已經(jīng)打開,使用Open Table語句可以打
開一個表。
Open Table filename [ As tablename ] [ Hide ] [ ReadOnly ] [ Interactive ] [ Password pwd ] [ NoIndex ] [ View Automatic ] [ DenyWrite ] [ VMGrid | VMRaster | VMDefault ]
例如,下面語句的作用是打開表cell;
0pen Table “ C:\MapInfo\cell”
一旦打開了一個表,那么位于Open Table語句之后的MapBasic語句可以用一個別名來指定這個表,例如:
Open Table “ C:\MapInfo\cell”
Browse * From cell
請注意,在上面的例子中有兩個語句,在第二個語句中使用了打開表的別名” cell” , 而根本不是用該表的全名” C:\MapInfo\cell” 。
在默認情況下,MapBasic用表的文件名作為它的別名。但是我們也可以用Open Table語句中的As子句來給打開的表指定一個別名,例如下面的語句給表指定了一個別名site。
Open Table “ C:\MapInfo\cell” As site
Browse * From site
如果在0pen Table語句中包括可選的Interactive子句,那么當要打開的表在指定的目錄中找不到時,MapInfo會顯示一個對話框,讓你定位這個表。如果沒有包括Interactive子句,那么當指定的表在指定目錄中無法定位時格產(chǎn)生一個錯誤。
有時我們不能知道想要打開的文件名稱,那么就必須要TableInfo()函數(shù)取得名稱后然后通過變量代替文件名或者表名,例如:
Include "MAPBASIC.DEF"
Dim s_tab As String
Open Table "C:states" Interactive
s_tab = TableInfo(0, TAB_INFO_NAME)
Browse * From s_tab
Map From s_tab
我們先打開名為states的表,然后通過TableInfo(0, TAB_INFO_NAME)獲得當前打開表的名稱,然后賦值給s_tab變量,之后我們只需對s_tab進行操作就可以了,不用去關(guān)心原表的名稱,這么做可以大大提高程序的通用性。TableInfo()說明如下:
TableInfo( table_id, attribute )
‘table_id is a string representing a table name, a positive integer table number, or 0 (zero).
‘a(chǎn)ttribute is an integer code indicating which aspect of the table to return.
‘Return Value
‘String, SmallInt, or logical, depending on the attribute parameter specified.
要檢測打開的表的數(shù)量,調(diào)用函數(shù)NumTables()即可。要獲得有關(guān)當前所有打開表的信息,調(diào)用TableInfo()函數(shù)即可。
MapBasic還可以把一些非MapInfo表格或文件(如:dBASE、FoxBASE、Lotus、Excel或文本文件)作為表來訪問,但是在訪問之前,必須先注冊這些文件。當你注冊一個文件時,MapInfo為該文件建立一個表(.tab文件)。
Register Table source_file
{ Type "NATIVE" |
Type "DBF" [ Charset char_set ] |
Type "ASCII" [ Delimiter delim_char ][ Titles ][ CharSet char_set ] |
Type "WKS" [ Titles ] [ Range range_name ] |
Type "WMS" Coordsys...
Type "WFS" [ Charset char_set ] Coordsys... [ Symbol... ]
[ Linestyle Pen(...) ] [ Regionstyle Pen(...) Brush(...) ]
[Editable]
Type "XLS" [ Titles ] [ Range range_name ] [ Interactive ] |
Type "Access" Table table_name [ Password pwd ] [ CharSet char_set ]}
Type ODBC
Connection { Handle ConnectionNumber | ConnectionString }
Toolkit toolkitname
Cache { ON | OFF }
[ Autokey { ON | OFF }]
Table SQLQuery
[ Versioned { ON | OFF }]
[ Workspace WorkspaceName ]
[ ParentWorkspace ParentWorkspaceName ]
Type "GRID" | Type "RASTER"
[ ControlPoints ( MapX1, MapY1 ) ( RasterX1, RasterY1 ),
( MapX2, MapY2 ) ( RasterX2, RasterY2 ),
( MapX3, MapY3 ) ( RasterX3, RasterY3 )
[, ... ]
]
[ CoordSys ... ]
Type "FME" [ Charset char_set ]
CoordSys...
Format format type
Schema featuretype
[ Use Color ]
[ Database ]
[ SingleFile ]
[ Symbol...]
[ Linestyle Pen(...) ]
[ Regionstyle Pen(...) Brush(...) ]
[ Font ... ]
Settings string1 [, string2 .. ]
Type "SHAPEFILE" [ Charset char_set ] CoordSys auto
[ PersistentCache { ON | OFF } ]
[ Symbol...] [ Linestyle Pen(...) ]
[ Regionstyle Pen(...) Brush(...) ]
[ Into destination_file ]
以后你就可以把它作為一個MapInfo的表來使用,例如下面的語句是注冊一個dBASE文件:
Registor Table
“ income.dbf”
Type “ DBF”
注冊了該文件之后,它就可以被認為是一個表了,所以可以用Open Table語句打開這個表:
Open Table “ income” interactive
MapInfo訪問表的能力不受表的格式限制。可以使用SQL查詢語句從一個表中獲取數(shù)據(jù),而不管該表是數(shù)據(jù)庫或其他的電子表格文件。但是MapInfo更改表的能力則與表的格式有關(guān)。如果表是dbf文件,MapInfo能更改這類表,甚至可以建立一個新的該類型的表。但是,MapInfo不能更改電子表格或文本文件。如果確實需要更改這類表,使用Commit Table...As語句,復制一個可更改的表格式,再使用這個備份文件。
所以,當我們導入非DBF格式的表時,如果想對此表進行修改操作就必須另存該文件。
訪問表的指定行列
MapBasic程序能訪問表的指定行列的值,其具體步驟如下:
1)用Fetch語句指定你想要查詢的行。事實上這個動作是設(shè)置哪一行為當前行。
2)用表達式引用(如tablename.columname)去訪問當前行的指定列。
下面的例子是讀取World表中第一行Country列的內(nèi)容:
Dim s_name As String
Open Table “ World” Interactive
Fetch First From World
S_name = World.Country
每個打開的表都有一個當前行,當前行由行標指出,使用Fetch語句可以將行標定位到某一特殊行。Fetch語句有幾種不同的方法來定位行標,可以一次向前或向后移動一行、將行標移到指定行,也可以將行標移到表的第一行或最后一行。其語法如下:
Fetch [First | Last | Next | Prev | Rec n ] From table
如果行標已定位在最后一行,F(xiàn)etch語句還試圖向前移動行標,那么函數(shù)EOT()的值為TRUE。該函數(shù)可以用來判斷行標是否已經(jīng)超過表的范圍。
MapBasic可以用三種不同類型的表達式來訪問指定列的值,第一種是以形式tablename.columname來訪問指定列,其中tablename是指表名,columname是指列名。
MapBasic語言能夠識別3種不同類型的列值參數(shù)表達式:
列表達式 舉例
tablename.columnnameWorld.Country
tablename.colnworld.col1
tablename.col(n) world.col(1)
例如上例中的s_name = World.Country,是將World表當前行Country列的值賦給變量s_name。第二種是以形式tablename.coln來訪問指定列,其中coln是指表的第n列。
例如:
S_name = world.col1
第三種是以形式tablename.col(n)來訪問指定列,這里的n是一個數(shù)值表達式,例如:
Dim i As Integer
I = 1
S_name = world.col(i)
個人認為使用tablename.columnname的通用性強一些,應為可以不用考慮表中列的順序,只要有該列就可以正常操作。如果是利用tablename.coln的話,表的格式與順序就必須一致才能不會出錯。日常我們使用的一些插件要求格式,如:seesite等表中列的順序有要求,如果順序錯或者某列不對就會出錯。當然利用tablename.coln可以簡化一些程序的復雜程度,各有利弊吧。
如果你的語句中已經(jīng)包括了一個表名,那么用這個語句訪問表的指定列時,列名前不必再加上表名,例如下例中的Browse語句:
Select Country, Population/1000000 From World
Browse Country,Col2 From Selection
在一個表中增加一個新行可以用Insert語句。例如:
Insert Into customers
Values(“ Mary Ryan” , “ 23 Main St” , “ Dallas” , “ TX” )
避免表名和列名錯誤
MapBasic在編譯程序時不能檢測表和列參數(shù)的正確性。例如,在程序中指定的列表達式是states.pop, MapBasic編譯器不能確定表states中是否確有一個名為pop的列。這就意味著在列表達式中的輸入錯誤在編譯時不會產(chǎn)生編譯報錯。然而,如果列pop不存在,在程序運行時就會產(chǎn)生錯誤。
想盡量減少這種錯誤:
一、在Open Table語句中使用Interactive從語,這樣如果指定的表未找到,就會顯示一對話框提示用戶指定一個表的位置。
二、盡量不用打開表的默認別名,可以在Open Table語句之后,調(diào)用TableInfo(0,TAB_INFO_NAME)取得表明,然后賦予該表的新名,程序中利用新名進行操作。
創(chuàng)建一個新表
用Create Table語句創(chuàng)建一個新的空表,用Creatr Index語句給一個表增加索引,還可以用Create Map語句使一張表可地圖化。
Create Table table( column columntype [ , ... ] ) | Using from_table }
[ File filespec ]
[ { Type NATIVE |
Type DBF [ CharSet char_set ] |
Type { Access | ODBC } database_filespec [ Version version ]
Table tablename
[ Password pwd ] [ CharSet char_set ]
} ]
[ Version version ]
下面的例子是創(chuàng)建一個可地圖化的表Cust,該表有以下域:Name、Addrss、City、Amount、OrderDate和CustID。其中對Name和CustID域進行索引。
Create Table Cust
(Name char(20),Address char(30),City char(30),Amount Decimal(5,2),OrderDate Date,CustID Integer)
File “ C:\customer\cust.tab”
Create Map for Cust Coordsys Earthy
Create Index on Cust(CustID)
Create Index On Cust(Name)
修改表結(jié)構(gòu)
每個表都有一個結(jié)構(gòu),結(jié)構(gòu)指出了諸如表的列數(shù),哪一列被索引等信息,MapInfo用戶可以通過選擇[表]>[維護]>[表結(jié)構(gòu)]菜單命令來修改表的結(jié)構(gòu)。MapBasic程序則可以通過使用Alter Table語句和Create Index語句來修改表的結(jié)構(gòu)。
Alter Table table (
[ Add columnname columntype [, ...] ]
[ Modify columnname columntype [, ...] ]
[ Drop columnname [, ...] ]
[ Rename oldcolumnname newcolumnname [, ...] ]
[ Order columnname, columnname [,...] ] )
[ Interactive ]
作為一個規(guī)則,當一個表還沒保存當前編輯時,這個表的結(jié)構(gòu)不能被修改。如果你向一個表中增加了一個行,但還沒有保存這個表,就稱這個表還沒有保存當前編輯。如果這樣,那么在修改這個表的結(jié)構(gòu)之前你應該先保存這個編輯(用Commit語句),或放棄當前編輯(用Rollback語句)。
Alter Table語句可以修改一個表的結(jié)構(gòu)。下面的例子是將Address列改名為ShipAddress;將Name列的長度改為25個字符;刪除Amount列;增加兩個新列Zipcode和Discount,并重新排序所有列的次序。
Alter Table Cust
(Rename Address ShipAddress
Modify Name char(25)
Drop Amount
AddZipcode char(10)
Discount Decimal(4,2)
Order Name, ShipAddress, City, Zipcode,
Orderdate, CustID,Discount)
“Obj”列
MapInfo表的Obj列是一個特殊的列,它指定了地圖化表中行數(shù)據(jù)對應的圖形對象。任意一個具有圖形對象的表都有一個Obj列,該列在瀏覽窗口中并不顯示出來。如果一行數(shù)據(jù)沒有對應的圖形對象,該行的Obj 列就為空。下列語句選擇了沒有圖形對象的所有行:
Select * From Sites Where Not Obj
這條語句是非常有用的。如果對一個表進行地理編碼,但有一些行由于某種原因沒有地理化,在這鐘情況下使用這條語句可以將那些沒有地理化的行全部選擇出來。下面的例子從表中取出一個圖形對象,并將它賦予一個對象變量:
Dim O_var As Object
Fetch First From Sites
O_var=sites.Obj
關(guān)于圖形對象的詳細內(nèi)容,以后會有詳細介紹。
[ 本帖最后由 hillyspring 于 2012-1-15 12:41 編輯 ]
掃碼關(guān)注5G通信官方公眾號,免費領(lǐng)取以下5G精品資料
1、回復“YD5GAI”免費領(lǐng)取《中國移動:5G網(wǎng)絡(luò)AI應用典型場景技術(shù)解決方案白皮書》
2、回復“5G6G”免費領(lǐng)取《5G_6G毫米波測試技術(shù)白皮書-2022_03-21》
3、回復“YD6G”免費領(lǐng)取《中國移動:6G至簡無線接入網(wǎng)白皮書》
4、回復“LTBPS”免費領(lǐng)取《《中國聯(lián)通5G終端白皮書》》
5、回復“ZGDX”免費領(lǐng)取《中國電信5G NTN技術(shù)白皮書》
6、回復“TXSB”免費領(lǐng)取《通信設(shè)備安裝工程施工工藝圖解》
7、回復“YDSL”免費領(lǐng)取《中國移動算力并網(wǎng)白皮書》
8、回復“5GX3”免費領(lǐng)取《 R16 23501-g60 5G的系統(tǒng)架構(gòu)1》
共獲得 2 次點評 我要點評
cmccmario 專家指數(shù) +1
· 加分,很好的文章
詳細..
發(fā)表與:2012-1-26 18:56:39
道家書生 專家指數(shù) +2 , 威望 +20 個
· 辛苦了,如果效果理想,可以整理本連載 ...
詳細..
發(fā)表與:2012-1-16 13:39:41
| |