Grass khi chạy cần phải được thiết lập một số biến mơi trường mới cĩ thể thực hiện, các biến này được set trong các script init.sh .
Trong VC++, chúng ta sẽ khởi tạo các biến mơi trường bằng hàm:
_putenv(Ộtênbiến=giátrịỢ) Vắ dụ:
// tạo và gán biến mơi trường GISDBASE là Ộc:\grassdataỢ
_putenv(ỘGISDBASE=c:\\grassdata\\Ợ);
( Hoặc chúng ta cĩ thể tạo biến mơi trường trực tiếp ngồi Window bằng cách chọn Property của MyComputerĨ tab AdvancedĨEnviromentVariableĨNew)
KHOA CNTT Ờ
ĐH KHTN
- Danh sách các biến mơi trường mà GRASS sử dụng:
Tên Biến Ý Nghĩa
GISBASE Đường dẫn tuyệt đối đến thư mục cài đặt project GRASS .
(Vắ dụ: c:\projects\grassProject )
GISDBASE Đường dẫn đến thư mục chứa database của GRASS. (Vắ dụ: c:\grassdata )
LOCATION_NAME Đường dẫn đến thư mục dữ liệu làm việc của GRASS. (Vắ dụ: c:\grassdata\spearfish )
MAPSET Đường dẫn đến thư mục mapset mà GRASS sẽ
làm việc.
(Vắ dụ: c:\grassdata\spearfish\permanent )
MONITOR Monitor đang được chọn để hiển thị hiện tại
GISRC Chỉ đến thư mục lưu trữ file .grassrc5, là file chứa thơng tin về tất cả các biến mơi trường. Khi được khởi động, GRASS sẽ đọc từ file
.grassrc5 để khởi tạo các biến mơi trường khác được lưu trong đĩ.
GIS_LOCK Biến này ghi nhận đường dẫn đến file gis_lock, là file GRASS dùng để đảm bảo cơ
chế lock (khố) của chương trình (chỉ chạy
KHOA CNTT Ờ
ĐH KHTN
một instance duy nhất ).
PAINTER Thiết bị hiển thịđang được chọn.
DIGITIZER digitizer đang được chọn.
GRASS_WIDTH Chiều rộng hiện tại của cửa số XWindow (Monitor) đang được chọn .
GRASS_HEIGHT Chiều cao hiện tại của cửa sổ Xwindow (Monitor) đang được chọn.
XDRIVER_WINDOW Lưu ID của Window (monitor) đang hiển thị.
XDRIVER_TRUECOLOR Xác định Xdriver cĩ sử dụng chế độ true color hay khơng
XDRIVER_PRIVATE_CMAP ẦẦ
ẦẦ.
Sau này khi muốn lấy lại giá trị của một biến mơi trường nào đĩ, ta chỉ cần gọi hàm:
getenv(ỘTênbiếnỢ)
Vắ dụ:
char *gisbaseName = getenv(ỘGISBASEỢ);
Ngồi cách sử dụng _putenv, getenv các biến mơi trường theo cách trên, GRASS cịn xây dựng riêng cho mình một hệ thống biến mơi trường để sử dụng riêng, các biến này được lưu trong file .grassrc5. Grass sẽ sử dụng một mảng 2 chiều (dạng bảng) để lưu trong bộ nhớ
các biến mơi trường cục bộ của nĩ, các biến này được truy xuất bằng các hàm gis sau:
KHOA CNTT Ờ
ĐH KHTN
G__getenv(ỘTênBiếnỢ) Lấy giá trị của biến mơi trường trong bảng mơi trường riêng của nĩ (trong bộ nhớ).
Cụ thể là hàm này sẽ search trong bảng mơi trường, lấy ra giá trị của tên biến truyền vào tương ứng.
G__setenv(ỘTênBiếnỢ, ỘGiá TrịỢ) Hàm này thiết lập lại giá trị của biến mơi trường trong bảng mơi trường.
BẢNG MƠI TRƯỜNG Biến Giá Trị Biến1 Giá Trị 1 Biến 2 Giá Trị 2 ẦẦ ẦẦ 3.5.2 Dữ Liệu GRASS và Cấu trúc của dữ liệu GRASS Grass Database :
Grass khi chạy cần phải cĩ cơ sở dữ liệu database tạo sẵn, các database này được tạo riêng, (chúng ta chưa cần quan tâm đến cách tạo như thế nào), và dựa vào dữ liệu đĩ, Grass mới
KHOA CNTT Ờ
ĐH KHTN
thực hiện các thao tác hiển thị, phân tắch, truy vấn để trả kết quả về cho người sử dụng (cũng như lập trình viên)...
Cấu trúc của Grass Database :
Database của Grass được chứa trong một thư mục (gọi là GISDBASE) GISDBASE cĩ thể chứa nhiều database khác nhau.
Vắ dụ: GISDBASE = C:\GRASSDATA\ Giả sử cĩ chứa các database:
ẳSpearfish: C:\GRASSDATA\SPEARFISH\
ẳSlovakia: C:\GRASSDATA\SLOVAKIA\
ẳGlobal: C:\GRASSDATA\GLOBAL\ Mỗi database cịn được gọi là một LOCATION
Vắ dụ, với cấu trúc trên thì thư mục Spearfish là một Location, thư mục Slovakia là một Location, v.vẦ
Trong Location cĩ nhiều một hoặc nhiều thư mục khác nhau, mỗi thư mục đĩ là một MAPSET.
Vắ dụ, trong thư mục C:\GRASSDATA\SPEARFISH\ cĩ thư mục PERMANENT thì cĩ nghĩa là database SPEARFISH cĩ 1 MAPSET tên là PERMANENT.
Các Element của Mapset: (cĩ 8 map layer, dùng để liệt kê trong hàm g.list)
1) Raster Files
- Files dạng Raster, được chứa trong thư mục CELL. Nếu khơng tồn tại thư mục này hoặc thư mục khơng cĩ file nào thì cĩ nghĩa là Mapset khơng cĩ Raster files nào.
KHOA CNTT Ờ
ĐH KHTN
2) Binary Vector Files
- Files dạng Vector, được chứa trong thư mục DIG. Nếu khơng tồn tại thư mục này hoặc thư mục khơng cĩ file nào thì cĩ nghĩa là Mapset khơng cĩ Binary Vector Files nào.
3) Paint Icon Files 4) Paint Label Files
- Các files dạng Paint Label, được chứa trong thư mục PAINT/LABEL. Nếu khơng tồn tại thư mục này hoặc thư mục khơng cĩ file nào thì cĩ nghĩa là Mapset khơng cĩ Paint Lable Files nào.
5) Site List Files
- Files dạng SITE, được chứa trong thư mục SITE_LISTS. Nếu khơng tồn tại thư mục này hoặc thư mục khơng cĩ file nào thì cĩ nghĩa là Mapset khơng cĩ Site List Files nào.
6) Region Definition Files
- Files dạng REGION, được chứa trong thư mục WINDOWS. Nếu khơng tồn tại thư mục này hoặc thư mục khơng cĩ file nào thì cĩ nghĩa là Mapset khơng cĩ Region Definition Files nào.
7) Imagery Group Files 8) 3D View Parameters
3.5.3 Cấu trúc chung của source code GRASS
Thư mục SRC là thư mục code chắnh của Grass5.0.2. Trong thư mục này, sẽ cĩ các thư
mục con chứa cài đặt của GRASS, sau đây là một số diễn giải về cấu trúc mã nguồn của GRASS được phân cấp từ thấp đến cao:
KHOA CNTT Ờ
ĐH KHTN
3.5.3.1 Cài đặt bộ thư viện trung tâm
Thư Mục SRC\ LIBES
i) Cấu trúc
- Grass đã xây dựng một bộ thư viện nền để làm nền tảng cơ sở cho việc phát triển tiếp sau này, cĩ thể nĩi đây là phần cốt lõi (kernel) của GRASS, bộ thư viện này nằm trong thư mục:
SRC\LIBES\
- Bộ thư viện này bao gồm tập hợp các thư viện chắnh sau:
Tên Thư Viện Ý Nghĩa
SRC\LIBES\GIS\ GIS LIB: Thư viện trung tâm xử lý GIS. Module này bao gồm các hàm phân tắch, tắnh tốn cần thiết của GIS.
Các hàm thuộc thư viện này thường cĩ tiếp đầu ngữ là G_xxx
Vắ dụ: G_GisInit(Ầ), G_Parser(..)
SRC\LIBES\DISPLAY\ DISPLAY LIB: Thư viện các hàm xử lý tương tác với driver đồ hoạ (XWindow).
Các hàm trong Display thường cĩ tiền tố là D_xxx
Vắ dụ: D_new_window(Ầ), D_clear(Ầ)
SRC\LIBES\RASTER\ RASTER LIB: Thư viện các hàm xử lý tương tác với driver đồ hoạ (XWindow). Giống với thư viện Display, nhưng ở mức thấp hơn. (được các hàm
KHOA CNTT Ờ
ĐH KHTN
của Display gọi lại )
Các hàm trong Raster thường cĩ tiền tố là R_xxx
Vắ dụ: R_Pad_Create(Ầ), R_Polygon_rel(...) SRC\LIBES\BITMAP\ Thư viện chứa các xử lý Bitmap
SRC\LIBES\BTREE\ Thư viện chứa các xử lý trên cây nhị phân SRC\LIBES\D\ Thư viện chứa các hàm Display mở rộng SRC\LIBES\DATETIME\ Thư viện ngày giờ Ầ
SRC\LIBES\DBMI\ Bộ thư viện dùng cho việc kết nối và xử lý trên Database
SRC\LIBES\DIG_ATTS\ Bộ thư viện dùng để đọc và ghi vào file cĩ dạng thuộc tắnh (attribute files format)
SRC\LIBES\DIGITIZER\ Ầ
SRC\LIBES\G3D\ Thư viện chứa các xử lý Graphics 3D
SRC\LIBES\GMATH\ Thư viện chứa các hàm tắnh tốn Ộtốn họcỢ. SRC\LIBES\IBTREE\ Bộ thư viện về khác về BTREE
ẦẦ.. Ầcịn nhiều nữa.
KHOA CNTT Ờ
ĐH KHTN
Chú ý là các bộ thư viện trên đan xen lẫn nhau, thư viện này gọi thư viện khác để cài đặt, người sử dụng khơng nên quan tâm đến cài đặt bên trong mà chỉ quan tâm đến các hàm mơ tả trong file .h
- Sử dụng bộ thư viện LIBES bằng cách #include các file .h trong thư mục
SRC\INCLUDE\
Vắ dụ:
Để sử dụng các hàm do GIS cung cấp (thư viện GIS LIB), ta chỉ cần khai báo #include Ộgis.hỢ
Để sử dụng các hàm vẽ được cung cấp bởi thư viện DISPLAY LIB, ta khai báo #include Ộdisplay.hỢ
ii) Các vấn đề khi convert libes
- Đây là bộ thư viện trung tâm chỉ để dùng trong xử lý, tắnh tốn, phân tắch, thuật tốn, nên việc convert phải được thực hiện chắnh xác. Các vấn đề ở đây là khi convert, chúng ta gặp phải một số thư viện khơng tồn tại trên Win32, chẳng hạn như unistd.h, pwd.h, Ầ. , đối với các thư viện này thì chúng em cĩ thể tìm hiểu ý nghĩa của chúng để thay thế lại bởi các hàm trong thư viện này bởi các hàm tương ứng bên Windows. Duy đặc biệt cĩ 2 thư viện là
ZLIB (<zlib.h>) và RPC ( <rpc/types.h>, <rpc/xdr.h>) hồn tồn khơng cĩ các hàm tương
ứng bên Window để thay thế, vì thế, chúng em phải bỏ cơng sức để tìm kiếm source code cho 2 bộ thư viện trên, và một dự án open source đang phát triển trên Net khác đã giúp chúng em đạt được kết quả.
3.5.3.2 Cài đặt các nhĩm lệnh xử lý của Grass
1) Nhĩm lệnh D.*
KHOA CNTT Ờ
ĐH KHTN
Được cài đặt trong thư mục SRC\DISPLAY
Bằng cách sử dụng lại các hàm thư viện được cung cấp trong LIBES, các lệnh thuộc nhĩm Display sau được cài đặt :
a. Lệnh d.mon
Lệnh này cĩ các tham số: start, stop, select, status, release, list, which Vắ dụ: d.mon start=x0 sẽ khởi tạo cửa sổđồ họa monitor x0
d.mon select=x0 sẽ chọn cửa sổ x0 là cửa sổ mặc định
i) Cấu trúc
o Nằm trong thư mục SRC \ DISPLAY \ D.MON \
o Khi gọi thực hiện lệnh này thì hàm main() trong thư mục D.MON \ CMD \ sẽđược thực hiện đầu tiên, nĩ phân tắch cú pháp của chuỗi lệnh được nhập vào, rồi dựa vào tham số được phân tắch ra để quyết định gọi thực hiện module nào trong thư mục D.MON \ PGMS \
o Thư mục D.MON \ PGMS \ sẽ cài đặt các module khác nhau của ham d.mon và các module này sẽ được dịch độc lập ra đối tượng riêng lẻ .obj , để sau này các hàm khác gọi thực hiện chúng (trong Linux)
Vắ dụ:
- Lệnh d.mon start=x0 sẽđược cài đặt trong file PGMS\start.c
- Lệnh d.mon stop=x0 sẽđược cài đặt trong file PGMS\stop.c
.... Ghi chú:
KHOA CNTT Ờ
ĐH KHTN
ẳ Hàm d.mon start là các hàm rất đặc biệt, nĩ thực hiện mở một cửa số monitor bằng cách mở XDRIVER, là một giao thức (protocol) để giao tiếp với
XWindow của Linux. Cách thức chạy của nĩ dựa vào cơ chế SendMessage riêng, sẽđược trình bày trong phần sau.
Cịn thư mục D.MON \ INTER \ chỉ để cài đặt giao diện trực quan (Visual) dùng để tương tác với người dùng, nĩ cũng phải gọi lại các module được cài đặt trong thư mục PGMS trên.
ii) Cách thức chuyển đổi d.mon
- Do đây khơng phải là thư viện, và cách thức biên dịch cũng khác với Win32 (gọi thực hiện một command obj bên ngồi), nên cách chuyển đổi của chúng em ở đây là đọc hiểu cơ chế thực hiện của chương trình, mơ hình hĩa cơ chế đĩ, sau đĩ viết lại hồn tồn cơ chếđĩ trên Win32
- Mơ tả sơ bộ cách thức hoạt động của hàm d.mon start:
Khi hàm d.mon start=xi được gọi (xi = x0, x1, x2, Ầ, là danh sách các monitorname nằm t trong file monitorcap Ờ xem phần sau), chương trình sẽ làm các cơng đoạn sau:
Ớ Tựđộng gọi thực hiện module d.mon select=xi
Ớ Cập nhật biến mơi trường MONITOR=xi .
Ớ Khởi tạo cửa sổ Driver XWindow ỘxiỢ
Ớ Duyệt trong file monitorcap để mở ra 2 file fifo tương ứng. (thường là : dev/fifo.ia, dev/fifo.ib )
Ớ Gọi chạy một process song song để kiểm tra file input là fifo.ia liên tục, xem coi cĩ EVENT nào được gửi tới cho MONITOR xi hay khơng? Nếu cĩ thì thực hiện hành
KHOA CNTT Ờ
ĐH KHTN
động đáp ứng tương ứng với EVENT nhận được. (Cụ thể là nếu EVENT gọi vẽ ra màn hình XWindow ỘxiỢ thì dùng các hàm X để vẽ, cịn nếu EVENT yêu cầu trả về
một kết quả tắnh tốn thì sẽ tắnh tốn để trả kết quả về bằng cách ghi kết quả vào file fifo.ib ).
Ĩ Cơ chế này sẽ được trình bày chi tiết hơn ở phần sau: Cơ chế SendMessage trong GRASS
- Mơ tả sơ bộ cách thức hoạt động của hàm d.mon select:
Khi hàm d.mon select=xi được gọi (xi = x0, x1, x2, Ầ.), chương trình sẽ thực hiện các cơng đoạn sau:
Ớ Kiểm tra xem cửa sổ MONITOR xi cĩ đang được chọn
Ớ Nếu khơng thì chọn (select) cửa sổđĩ (lấy cửa sổđĩ là cửa sổ hiện hành )
- Mơ tả sơ bộ cách thức hoạt động của hàm d.mon stop:
Khi hàm d.mon stop=xiđược gọi (xi = x0, x1, x2, Ầ.), chương trình sẽ thực hiện các cơng đoạn sau:
Ớ Đĩng Process kiểm tra EVENT lại bằng cách gửi EVENT cĩ tên là ỘGRAPH_CLOSEỢ tới MONTOR xi, Process Check Event khi bắt được EVENT này thì sẽ tựđộng End Process lại ..
Ớ Đĩng 2 file kết nối fifo.ia, fifo.ib lại
Ớ Đĩng cửa sổ MONITOR xi đang mở lại (XDestroyWindow(..))
KHOA CNTT Ờ
ĐH KHTN
b. Lệnh d.rast
Lệnh này sử dụng để hiển thị thơng tin của raster chỉ định lên màn hình MONITOR Graphics Windows.
Vắ dụ: Lệnh: d.rast aspect
sẽ hiển thị lên màn hình xi hiện tại thơng tin của raster ỘaspectỢ.
i)Cấu trúc
Nằm trong thư mục SRC\ DISPLAY\ D.RAST\
Ớ
Khi gọi thực hiện lệnh này thì hàm main() trong thư mục D.RAST \ CMD \ sẽđược thực hiện đầu tiên, nĩ phân tắch cú pháp của chuỗi lệnh được nhập vào, rồi dựa vào tham sốđược phân tắch ra để xác định tên của Raster cần hiển thị.
Ớ
ii) Cách thức chuyển đổi
- Do đây cũng khơng phải là thư viện, và cách thức biên dịch cũng khác với Win32 (gọi thực hiện một command obj bên ngồi), nên cách chuyển đổi của chúng em ở đây là đọc hiểu cơ
chế thực hiện của chương trình, mơ hình hĩa cơ chếđĩ, sau đĩ viết lại hồn tồn cơ chếđĩ trên Win32
- Mơ tả sơ bộ cách thức hoạt động của hàm d.rast :
Khi hàm d.rast Ộraster_nameỢ được gọi, chương trình sẽ thực hiện các cơng đoạn cơ bản sau:
Ớ Phân tắch cú pháp để lấy ra Ộraster_nameỢ
KHOA CNTT Ờ
ĐH KHTN
Ớ Kiểm tra xem Ộraster_nameỢ yêu cầu cĩ tồn tại khơng trong Location hay khơng?
Ớ Nếu cĩ thì nĩ sẽ đọc biến mơi trường MONITOR hiện hành ra, mở 2 file fifo.ia, fifo.ib tương ứng với monitor.
Ớ Yêu cầu vẽ ra window MONITOR bằng cách gửi EVENT vào file fifo.ia, nếu EVENT cĩ yêu cầu kết quả trả về thì sẽ nhận kết quả trả về trong file fifo.ib (đọc file fifo.ib )
Ầ Ầ
3.5.3.3 Các Driver dùng để hiển thị của Display
- Các Driver là các trình dùng đểđiều khiển cách thức hiển thị kết quả tắnh tốn (kết xuất ra màn hình, máy in, files các loại, chẳng hạnẦ.). Tùy theo loại MONITOR mà người dùng khởi tạo mà Grass sử dụng Driver tương ứng. (dựa vào cấu trúc MON trong file DISPLAY\DEVICE\MONITORCAP\monitorcap )
- Cấu trúc file monitorcap:
File monitorcap là file ghi danh sách các biến MONITOR mà grass sử dụng (vắ dụ: x0, x1,Ầ), mỗi monitor name đều cĩ một Driver, một cặp file ghi biến cố, và nhiều trường (field) khác v.vẦtương ứng. (mỗi trường cách nhau bởi dấu hai chấm Ổ:Ỗ )
Vắ dụ:
Xét 1 dịng trong file monitorcap:
x0:driver/XDRIVER:X-windows graphics display: \ dev/fifo.1a dev/fifo.1b \
::any terminal
KHOA CNTT Ờ
ĐH KHTN
ẳ Dịng trên cĩ nghĩa là Grass cĩ hỗ trợ một monitor tên là x0, monitor này sử dụng driver là XDriver, mơ tả driver Xdriver là X-windows graphics display, và monitor này cĩ 2 file xử lý ghi nhận Event là fifo.1a và fifo.1b (trong thư mục ỘdevỢ), v.vẦ
Ý nghĩa các trường (field) trong cấu trúc file Monitorcap:.
STT Mơ Tả
1 Monitor name 2 Driver tương ứng 3 Mơ tả về Driver đĩ
4 Tên của 2 file fifo dùng để giao tiếp các event Ầ
5 Tên đầy đủ của terminal tty mà device
được khởi tạo
6 Thơng báo mà người dùng sẽ nhận được nếu driver được bắt đầu từ một tty khơng
đúng.
- Grass5 hỗ trợ các Driver sau đây:
Tên Driver Mơ Tả
XDRIVER Driver này dùng để điều khiển kết quả
KHOA CNTT Ờ
ĐH KHTN
xuất ra màn hình XWindow CELL Xuất ra file dạng CELL
HTMLMAP Xuất ra file dạng Webpage HTML PNGDRIVER Xuất ra dạng file ảnh PNG
- Danh sách các cửa sổ MONITOR mà Grass5.0.2 hỗ trợ:
Dựa vào file monitorcap, Grass cung cấp một danh sách các monitor mà nĩ hỗ trợ cùng với các thuộc tắnh đi kèm của monitor (xem trong file monitorcap)
Tên Driver File FiFo giao tiếp
(trong thư mục Dev) x0 XDRIVER fifo.1a Ăẳ fifo.1b x1 XDRIVER fifo.2a Ăẳ fifo.2b x2 XDRIVER fifo.3a Ăẳ fifo.3b x3 XDRIVER fifo.4a Ăẳ fifo.4b x4 XDRIVER Fifo.5a Ăẳ fifo.5b x5 XDRIVER Fifo.6a Ăẳ fifo.6b x6 XDRIVER Fifo.7a Ăẳ fifo.7b CELL CELL Fifo.8a Ăẳ fifo.8b
KHOA CNTT Ờ
ĐH KHTN
2. Nhĩm lệnh G.*
Được cài đặt trong thư mục SRC\GENERAL
a. Lệnh g.ask b. Lệnh g.parser c. Lệnh g.version Ầ. 3. Nhĩm lệnh R.* (chưa thực hiện chuyển đổi ) 4. Nhĩm lệnh S.* (chưa thực hiện chuyển đổi)
3.5.3.4 Cơ chế SendMessage trong GRASS5