Phiên bản GRASS mới nhất (tắnh đến thời điểm 8/7/2004) là version 5.7
Phiên bản GRASS mà chúng em đang chuyển đổi vào thời điểm nhận luận văn là 5.0.2
KHOA CNTT Ờ
ĐH KHTN
Source Grass5 (phiên bản các loại) cĩ thể download tại http://grass.itc.it/download.html Source được nén theo kiểu .tar, cĩ tên như sau: grass5.0.2_src.tar
Chú ý:
Source Grass cĩ 2 phiên bản, phiên bản chạy trên Linux và phiên bản chạy trên CygWin (là một trình giả lập mơi trường Linux chạy trên Windows)
3.3 Sơ lược về mã nguồn của GRASS 5.0.2
Kắch thước tổng cộng của Source Grass trên xấp xỉ gần 100 MB, số lượng file tổng cộng là
19777 files, nằm trong 2860 folder.
Trong đĩ, thư mục SRC là thư mục phát triển chắnh yếu, thư mục này chứa tồn bộ source code cần thiết tối thiểu nhất để chạy chương trình. Các thư mục cịn lại chỉ là các package kèm theo, các tools, các tài liệu, cùng với các source phát triển khác cịn dang dở như:
src.contrib, src.garden, src.todo v.vẦ
Source Grass được viết bằng ngơn ngữ C trên Linux (tạm gọi là C-Linux), là ngơn ngữ
giống với ANSI C trên Window, nhưng cĩ sử dụng nhiều thư viện hệ thống khác mà trên Window khơng cĩ, vắ dụ như thư viện #include <unistd.h>, <sys/time.h>, <sys/wait.h>, <pwd.h>, <zlib.h>, <rpc/Ầ> v.vẦ
Bên cạnh đĩ, hệ thống xử lý đồ họa trong Linux cũng hồn tồn khác với MS Window, C- Linux sử dụng hệ thống đồ họa là các hàm X, để tương tác với hệ thống giao diện đồ họa
XWindow của Linux.
(Ghi chú thêm: Bộ thư viện lập trình đồ họa trên Linux (giống như bộ thư viện GDI của Windows) bao gồm 3 thư viện là: XLIB, XTOOLKIT, và MOTIF, trong đĩ GRASS sử dụng bộ thư viện cơ bản nhất là XLIB, sẽđược xem xét kỹ hơn vào phần sau )
KHOA CNTT Ờ
ĐH KHTN
Ngồi source code C/Linux ra, source Grass cịn được viết bằng các tập tin Shell Script
(*.sh Ờ là một tập tin thực thi giống như file .bat trên Window), các Script này sẽđược gọi
để hỗ trợ cho source CẦ
3.4 Mơi trường sử dụng để chuyển đổi GRASS5
Chúng em sử dụng mơi trường chuyển đổi là VISUALệ C++ 6.0 Service Pack 5
Phương châm chuyển đổi:
+Để tiết kiệm thời gian và cơng sức, chúng em đề ra phương châm là:
ỘẦHạn chế sửa đổi mã nguồn của GRASS đến mức thấp nhấtỢ
Một sốđiều kiện cần thiết:
+ Do Source Grass được viết theo kiểu lập trình hướng thủ tục cổđiển
(procedure oriented programming), khơng sử dụng lập trình hướng đối tượng, nhưng vẫn sử
dụng cơ chế include prototype (cĩ nghĩa là sẽ cĩ 2 file, 1 file .h chứa các hàm prototype, 1 file .c sẽ chứa các cài đặt của các hàm mơ tả trong file .h đĩ, chẳng hạn, ...) nên khi sử dụng kiểu include như vậy trên Visual C++ thì phải chỉnh lại Setting như sau:
Bấm tổ hợp Alt+F7 để vào Setting
− − − −
Chọn tab C/C++
Chọn Category là PreCompiled Headers
Chọn option ỘAutomatic use of precompiled headersỢ
Nếu khơng thiết lập như trên thì khi add vào 1 file .h, 1 file .c thì VC++ sẽ khơng hiểu và sẽ
báo lỗi ỘUnexpected end of file Ầ.Ợ
KHOA CNTT Ờ
ĐH KHTN
+ Do Source Grass được viết bằng C, mà trình biên dịch VC++ lại dịch theo kiểu C++, (cĩ nghĩa là file .cpp gọi hàm trong file .c sẽ khơng được), nên chúng ta phải sử dụng một số chỉ
thị tiền xử lý (pre-compiler directive) để định hướng lại biên dịch khi gọi hàm ANSI C như
sau: // đoạn code bằng C++ #ifdef __cplusplus extern "C" { #endif //... // đoạn code bằng C //... #ifdef __cplusplus } #endif // đoạn code bằng C++
3.5 Các vấn đề chắnh khi chuyển đổi lên Windows
3.5.1 Khởi tạo các biến mơi trường cần thiết
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Ợ.