導航:首頁 > 文件管理 > idl文件如何使用

idl文件如何使用

發布時間:2023-03-24 07:36:36

Ⅰ 如何用IDL處理Shapefile數據

如何用IDL處理Shapefile數據
使用IDL處理shapefile格式,需要了解IDLffShape對象,IDL幫助中有一些說明和代碼,但過於簡單,不熟悉的人很難上手,現對幾個關鍵點進行說明:感和GIS不分家,IDL擅長處理遙感數據,但偶爾也需要用來處理一些GIS數據,不過還好IDL能處理Shapefile數一、讀取shapefile文件1.首先要打開文件
我們用Arcview帶的數據做例子吧,就用那個國界數據吧。
創建和銷毀idlffshape分別使用的是IDL處理對象的通用命令OBJ_new和Obj_Destroy,每建立一個對象都要記著要銷毀,否則會出現內存不足問題。

pro readshapefile
shapefile='C:\ESRI\ESRIDATA\WORLD\country.shp' ;定義shape文件位置
oshp=Obj_New('IDLffShape',filename)
print oshp
;中間處理代碼
Obj_destroy,oshp ;銷毀一個shape對象
end

如果讀取錯誤,oshp會返回-1,否則得話返回的就是一個結構體。
2.獲取整體描述信息
讀完shape對象後,就需要讀幾何數據和屬性表數據了。Shapefile數據由幾何體(或實體Entity)和屬性表兩部分組成,而幾何體一般又包括點(point)、線(polyline)和多邊形(polygon)(當然也有其它類型,但不常用)。屬性表包括屬性表結構、欄位個數和記錄個數,屬性表記錄數與實地必須一一對應,屬性表的結構又包含欄位名,欄位類型,欄位長度和精確度。
在IDL讀取數據前,需要了解一些全局屬性,知道有多少個幾何體和記錄,屬性表中有多少個欄位,就需要用GetProperty方法,它查詢shape文件的屬性,包括實體類型,實體個數,屬性表結構,屬性表欄位個數,記錄數等,代碼如下:

pro readshapefile
shapefile='C:\ESRI\ESRIDATA\WORLD\country.shp' ;定義shape文件位置
oshp=Obj_New('IDLffShape',filename)
oshp->getproperty,n_entities=n_ent,Attribute_info=attr_info,n_attributes=n_attr,Entity_type=ent_type
print,'實體個數:'n_ent
print,'屬性表欄位數:',n_attr
print,'實體類型代碼:',ent_type
Obj_destroy,oshp ;銷毀一個shape對象
end

3.再了解幾個概念
bouns
存儲的是每個實體的范圍,是一個有8個元素的數組([x0,x1,x2,x3,x4,x5,x6,x7]),其中
x0 —最小x值,x1 —最小y值,x2最小z值(高度),x3 — 最小M值(測量值,一般不用)x4-x7就是最大值了。注意,這里是每個實體的范圍,而不是整個地圖的范圍,所以如果要求整個地圖的范圍,還需要整個再求一遍最大值和最小值。
bounds還有一個作用,就是存儲點的坐標,點類型數據沒有安排另外的對象來存儲,直接用bounds來管理。
VERTICES
線和面實體的所有坐標都存在這裡面,是一個指針型數組,存儲的是實體的所有拐點.讀的時候比較容易,寫入的時候,需要先建一個指針變數將坐標賦值到指針變數,然後將指針變數賦值給vertices.數組結構如下:
[[x,y],[x,y],[x,y],[x,y],[x,y],[x,y]](如果是2維的話)
[[x,y,z],[x,y,z],[x,y,z],[x,y,z],[x,y,z],[x,y,z]](如果是3維的話)
N_VERTICES
拐點的個數,不需要解釋了.
N_PARTS和Parts
處理復雜對象的需要注意了,如有內環的多邊形。所有的拐點坐標都存在vertices中,Parts也是一個指針數組,存儲的是每個弧段的起始索引值。N_PARTS表示有幾個弧段.
ISHAPE
表示實體的序號,是一個整形變數,讀取的時候一般不需要注意,寫的時候需要定義,序號不能重復。
4.開始讀坐標了
如果要一次性讀取全部實體,可以用ent=oshp->getentity(/all),但大部分時間都需要一個個的處理,就需要用循環

pro readshapefile
shapefile='C:\ESRI\ESRIDATA\WORLD\country.shp' ;定義shape文件位置
oshp=Obj_New('IDLffShape',filename)
oshp->getproperty,n_entities=n_ent,Attribute_info=attr_info,n_attributes=n_attr,Entity_type=ent_type
FOR i=0,n_ent-1 do begin ;循環
ent=oshp->getentity(i) ;讀取第i個實體
bounds=ent.bounds ;讀取實體的邊界
n_vert=ent.n_vertices ;實體中包括拐點或頂點的個數,只有polyline和polygon具有該屬性
vert=*(ent.vertices) ;實體的頂點,只有polyline和polygon具有該屬性
n_parts=ent.parts ;只有polygon具有該屬性
part=*(ent.parts) ;part坐標
;輸出幾何體范圍
print,'min x=',bounds[0]
print,'min y=',bounds[1]
print, 'max x=',bound[3]
print, 'max y=',bound[4]
;如果是點的話,輸出點坐標
print,bounds[0],bounds[1]
;如果是線或面的話,輸出點坐標
for index in n_vert-1 do begin
print vert[index][0],vert[index][1]
endfor
endfor
Obj_destroy,oshp ;銷毀一個shape對象
end

4.讀屬性屬性表的結構
屬性表結構存儲在Attribute_info中,前面代碼已經獲得了這個結構體(attr_info),下面的代碼是列印每一個欄位的結構

pro readshapefile
shapefile='C:\ESRI\ESRIDATA\WORLD\country.shp' ;定義shape文件位置
oshp=Obj_New('IDLffShape',filename)
oshp->getproperty,n_entities=n_ent,Attribute_info=attr_info,n_attributes=n_attr,Entity_type=ent_type
FOR i=0,n_attr-1 do begin ;循環
PRINT, '欄位序號: ',i
PRINT, '欄位名: ', attr_info[i].name
PRINT, '欄位類型代碼: ', attr_info[i].type
PRINT, '欄位寬度: ', attr_info[i].width
PRINT, '精度: ', attr_info[i].precision
endfor
Obj_destroy,oshp ;銷毀一個shape對象
end

讀屬性表中的值
讀屬性表,跟讀取實體有些類似,用GetAttributes方法

pro readshapefile
shapefile='C:\ESRI\ESRIDATA\WORLD\country.shp' ;定義shape文件位置
oshp=Obj_New('IDLffShape',filename)
oshp->getproperty,n_entities=n_ent,Attribute_info=attr_info,n_attributes=n_attr,Entity_type=ent_type
FOR i=0,n_ent-1 do begin ;循環,n_ent跟記錄數是一樣的
attr=oshp->GetAttributes(i) ;讀取第i個記錄
for index in n_attr-1 do begin
print attr.(index)
endfor
endfor
Obj_destroy,oshp ;銷毀一個shape對象
end

二、寫入shapefile數據
寫入shapefile的一半過程是,首先初始化idlffshape對象,定義屬性表結構,定義實體類型,寫入坐標值,寫入屬性值,最後銷毀對象
初始化
寫入數據也用Obj_new初始化,不過需要設置輸出實體的類型,並設置該數據可寫,這裡面重要的就是需要知道實體的類型代碼,我們常用的就是1,3和5
Point 1
PolyLine 3
Polygon 5
MultiPoint 8
PointZ 11
PolyLineZ 13
PolygonZ 15
MultiPointZ 18
PointM 21
PolyLineM 23
PolygonM 25
MultiPointM 28
MultiPatch 31
對象初始化的代碼如下:

pro writeshapefile
shapefile='d:\data\citys.shp'
oshp=obj_new('IDLffshape',new_shapefile,Entity_type=3,/update)
;;其他代碼
obj_destroy,oshp

創建屬性表結構和實體類型
對所有類型的實體,創建屬性表的方法都已一樣的。用AddAttribute方法,一般用法為:

oshp->AddAttribute, 欄位名稱,欄位類型,欄位寬度[, PRECISION=integer]
精度只有浮點和雙精度等情況下採用,字元和整形可以預設,也可以設置為0
關鍵的還是需要知道常用的幾種欄位類型
3 Longword integer
5 Double-precision floating-point
7 String
沒錯只有三種,這不是idl的錯,shapefile只定義了這三種
定義實體類型的方法比較簡單:

entNew = {IDL_SHAPE_ENTITY}
entNew.SHAPE_TYPE = 1 ;1為實體類型,表示點

寫入實體和屬性
這兩個過程一般同時進行的,用代碼表示吧:

Pro writepoint
shapefile='d:\test\citys.shp'
oshp=OBJ_NEW('IDLffshape',shapefile,Entity_type=1,/update)
;定義實體類型
entNew = {IDL_SHAPE_ENTITY}
entNew.SHAPE_TYPE = 1 ;1為實體類型,表示點
;添加坐標,加那個地方呢,我愛北京天安門吧
entNew.ISHAPE=0
entNew.BOUNDS[0] = 116.391188
entNew.BOUNDS[1] = 39.904546
entNew.BOUNDS[2] = 0.00000000
entNew.BOUNDS[3] = 0.00000000
entNew.BOUNDS[4] = 116.391188
entNew.BOUNDS[5] = 39.904546
entNew.BOUNDS[6] = 0.00000000
entNew.BOUNDS[7] = 0.00000000
entNew.N_VERTICES = 1
;加屬性了
;先定義屬性表結構
oshp->AddAttribute,'id',3,8,PRECISION=0
oshp->AddAttribute,'name',7,20,PRECISION=0
oshp->AddAttribute,'longitude',5,8,PRECISION=4
oshp->AddAttribute,'latitude',5,8,PRECISION=4
;還要把實體寫入到shp對象中
oshp -> PutEntity, entNew
;獲得屬性表結構對象
new_attr = oshp ->GetAttributes(/ATTRIBUTE_STRUCTURE)
new_attr.ATTRIBUTE_0 = 1
new_attr.ATTRIBUTE_1 = '北京天安門'
new_attr.ATTRIBUTE_2 = 116.3911
new_attr.ATTRIBUTE_3 = 39.904546
;把屬性寫入到shp對象中
oshp -> SetAttributes,0,new_attr;這裡面的0是指實體的索引值,等於entNew.ISHAPE
;再加一個吧,就蘭州了
entNew.BOUNDS = [103.867694,36.048088,0,0,103.867694,36.048088,0,0]
new_attr.(0)=2
new_attr.(1)='蘭州'
new_attr.(2)=103.8676
new_attr.(3)=36.0480
oshp -> PutEntity, entNew
oshp -> SetAttributes,1,new_attr;
OBJ_DESTROY,oshp
print,'end'
End

以上是加入點類型的數據,比較簡單,來個復雜點的,加兩個多邊形吧

pro writepolygon
shapefile='d:\test\Forbidden_City.shp'
oshp=obj_new('IDLffshape',shapefile,Entity_type=5,/update)
;定義實體類型
entNew = {IDL_SHAPE_ENTITY}
entNew.SHAPE_TYPE = 5
;添加坐標
coor=[[116.3852041484393,39.9214192520002],$
[116.3856922399481,39.91151453640624],$
[116.3960721525212,39.9118040463524],$
[116.3955102491546,39.92183809311693],$
[116.3852041484393,39.9214192520002]]
entNew.ISHAPE=0
entNew.BOUNDS[0] = min(coor[0,*])
entNew.BOUNDS[1] = min(coor[1,*])
entNew.BOUNDS[2] = 0.00000000
entNew.BOUNDS[3] = 0.00000000
entNew.BOUNDS[4] = max(coor[0,*])
entNew.BOUNDS[5] = max(coor[1,*])
entNew.BOUNDS[6] = 0.00000000
entNew.BOUNDS[7] = 0.00000000
pvertice=coor
entNew.VERTICES=PTR_NEW(pvertice,/no_)
entNew.N_VERTICES = 5
;還要把實體寫入到shp對象中
oshp -> PutEntity, entNew
;加屬性
;先定義屬性表結構
oshp->AddAttribute,'id',3,8,PRECISION=0
oshp->AddAttribute,'name',7,20,PRECISION=0
;獲得屬性表結構對象
new_attr = oshp ->GetAttributes(/ATTRIBUTE_STRUCTURE)
new_attr.ATTRIBUTE_0 = 1
new_attr.ATTRIBUTE_1 = 'river'
;把屬性寫入到shp對象中
oshp -> SetAttributes,0,new_attr;這裡面的0是指實體的索引值,等於entNew.ISHAPE
coor=[[116.3858622895445,39.92099455865304],$
[116.3863498312803,39.9119734286],$
[116.3952884054441,39.91246510632352],$
[116.3948307781919,39.92118603918453],$
[116.3858622895445,39.92099455865304]]
entNew.ISHAPE=1
entNew.BOUNDS = [min(coor[0,*]),min(coor[1,*]),0,0,max(coor[0,*]),max(coor[1,*]),0,0]
pvertice=coor
entNew.VERTICES=PTR_NEW(pvertice,/no_)
entNew.N_VERTICES = (size(coor))[2]
entNew.N_Parts=2
P_parts=[0,5,9]
entNew.Parts=Ptr_new(P_parts,/no_)
;還要把實體寫入到shp對象中
oshp -> PutEntity, entNew
;加屬性
new_attr.ATTRIBUTE_0 = 1
new_attr.ATTRIBUTE_1 = 'Forbidden_City'
;把屬性寫入到shp對象中
oshp -> SetAttributes,1,new_attr;這裡面的0是指實體的索引值,等於entNew.ISHAPE
obj_destroy,oshp
print,'end'
end

三、獲得完整示例代碼
行文倉促,文中的代碼可能有誤,撰寫了3個較為完整的示例代碼,放在了我的代碼庫中,感興趣的話可以到googleCode上下載。下載地址為:
http://code.google.com/p/datatools/source/browse/#svn/trunk/IDL/Shapefile
3個示例代碼的名稱分別為:

readshapefile.pro
writepoint.pro
writepolygon.pro

另外,大家還從該站點獲得利用IDL創建aster圖像索引圖的程序.
四、後記
用IDL處理矢量數據,始終比較復雜,能夠處理的格式也有限。如果跟矢量數據大交道比較多的話,建議嘗試Python

Ⅱ 如何利用IDL單獨讀取壓縮包中的某一個文件

ID,還單獨需要做包衣,你要做包衣給文件,你打開它進行解壓就行了

Ⅲ VC中使用MIDL編譯IDL文件

1、在工團沒程中找到IDL文件,右塌譽納鍵-編譯

2、在項目-屬性-MIDL-輸出界面可以虛跡看到編譯後生成了哪些文件

Ⅳ 如何在C++編寫的DLL中引用idl文件

為了實現與其他語言的集成開發,IDL擁有以下幾個技術: 1) 調用外部程序 IDL調用其他語言功能的最簡單的方法就是調拿明好用外部程序,即使用SPAWN方槐嫌式。SPAWN產生一個子進程來執行一個命令或一系列的命令,調用時可以根據需消鉛要添加一系列關鍵字。

Ⅳ IDL的簡介

IDL是用來描述軟游櫻局件組件介面的一種計算機語言。IDL通過一種中立的方式來描述介面,使得在不同平台上運行的對象和用不同語言編寫的程序可以相互通信交流;比如,一個組件用C++寫成,另一個組件用Java寫成。
IDL通常用於遠程調用軟體。 在這種情況下,一般是由遠程客戶終端神讓調用不同操作系統上的對象組件,並且這些對象組件可能是由不同計算機語言編寫的。IDL建立起了兩個不同操作系統間通信的橋頌橡梁。
從本質上講,OMG IDL介面定義語言不是作為程序設計語言體現在CORBA體系結構中的,而是用來描述產生對象調用請求的客戶對象和服務對象之間的介面的語言。OMG IDL文件描述數據類型和方法框架,而服務對象則為一個指定的對象實現提供上述數據和方法。
OMG IDL文件描述了伺服器提供的服務功能,客戶機可以根據該介面文件描述的方法向伺服器提出業務請求。在大多數CORBA產品中都提供IDL到相關編程語言的編譯器。程序設計人員只需將定義的介面文件輸入編譯器,設定編譯選項後,就可以得到與程序設計語言相關的介面框架文件和輔助文件。IDL文件應用過程如圖1所示 。

Ⅵ idl中怎樣對齊兩幅圖

1.我們先使用文字工具,拖拽一個文本框插入圖片。
2、然後再拖入一張圖片素材,使用選擇工具將其全部選中。
3、拖拽ID的窗口,能夠看到出現隱藏的按鈕,點擊水平居中按鈕。

4、這樣兩張圖片都居掘虛模中對齊了,不過這是文本框對齊,如果文本框不適合就需要適合文本框。

5、點擊對象——合適——是譽斗框架適合文本框。
6、這樣兩張圖片都是契合文本框的,我們再次點擊居中對齊,這判緩就是真正的兩張圖片對齊了。

Ⅶ 如何直接導入idl文件

如果格式比較簡單的話比較容易,以讀TXT為例
file = DIALOG_PICKFILE(FILTER='*.txt')

OPENR, lun, file, /GET_LUN

B=FLTARR(50,20);這個行列自行決定,先列後行,FLTARR是浮點型其他數據類型查找幫助文檔

READF,lun,B
FREE_LUN,lun

如果是比較復雜格式的TXT,建議用read_ascii讀取,方法幫助文檔很詳細,大致分兩部,一個是設置格式,一個是按存好的格式讀取,當裡面夾雜著大量的文字,各種不同數據類型的時候很好用,可讀成結構體
;設定ASCII格式
;filetemplate=ascii_template(filepth)
;save,filetemplate,filename='**.sav'
;根據事先存好的模板讀取

data=read_ascii(filepth,delimiter=',',template=filetemplate)

閱讀全文

與idl文件如何使用相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接