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