Thư viện GIS ( thư viện trung tâm của GRASS)
KHOA CNTT Ờ
ĐH KHTN
GIS Library là thư viện chắnh yếu và quan trọng nhất của hệ thống GRASS. Các
chương trình sử dụng GRASS để phát triển buộc phải sử dụng thư viện này để giao tiếp với các file CSDL.
Các hàm được cung cấp trong thư viện này theo nhĩm, khơng theo thứ tự alphabet. Các hàm này cĩ tiền tố bắt đầu là G_ (chữ G viết tắt cho Global)
Để sử dụng thư viện này trong lập trình, ta phải
#include <gis.h>
Khởi tạo: ta bắt buộc phải thực hiện thao tác khởi tạo trước khi cĩ thể sử dụng bất cứ hàm nào của thư viện GIS, bằng cách gọi hàm
intG_gisinit (char *program_name) Vắ dụ :
int main (int argc, char **argv) { G_gisinit(argv[0]); } Cơ chế báo lỗi của thư viện Hàm Chức năng int
G_fatal_error (char *message, ...) In thơng điệp báo lỗi lên màn hình và thĩat.
Nếu cĩ file GIS_ERROR_LOG trong
KHOA CNTT Ờ
ĐH KHTN
GISBASE, lỗi sẽđược ghi nhận lại trong file
int
G_warning (char *message, ...)
In thơng điệp lỗi lên màn hình và tiếp tục
Nếu cĩ file GIS_ERROR_LOG trong GISBASE, lỗi sẽđược ghi nhận lại trong file
void
G_set_error_routine (int (*handler)( ))
Thay đổi cơ chế xử lý lỗi của thư viện (nếu khơng muốn xử lý lỗi thơng qua hai hàm trên)
Người lập trình cung cấp một cơ chế xử lý lỗi thơng qua một hàm cĩ prototype :
int handler (char *message, int fatal)
fatal cĩ giá 1 (error) và 0 (Warning) message là message lỗi.
Sau đĩ truyền cho hàm như sau :
G_set_error_routine (handler); int G_unset_error_routine (void) Reset lại cơ chế xử lý lỗi cũ của thư viện ( sử dụng hai hàm G_fatal_error và G_warning) Trang 45
KHOA CNTT Ờ
ĐH KHTN
int
G_sleep_on_error (int flag)
flag = 1: in ra thơng điệp lỗi và sleep
int
G_suppress_warnings (int flag)
- Dùng để Ộtriệt hạỢ hàm G_Warning nếu muốn. (ta sử dụng lại code chương trình đã được viết trước đĩ và khơng muốn hiện thị các message lỗi)
flag = 0:G_Warning sẽ khơng cịn in ra message được nữa
flag = 1 :G_Warning sẽ in ra message được nữa
- Hàm này khơng triệt được G_fatal_error
Truy xuất biến mơi trường và thơng tin liên quan đến cơ sở dữ liệu của GRASS
Hàm Chức năng char * G_location (void) Trả vềđường dẫn đến location hiện tại của database đang làm việc. Trang 46
KHOA CNTT Ờ ĐH KHTN char * G_location_path (void) char * G_mapset (void)
Trả ra đường dẫn đến mapset đang làm việc trong location hiện tại.
char *
G_myname (void)
Trả ra dịng tiêu đề của location đang làm việc ( nĩ đọc từ file MYNAME của MAPSET
PERMANENT)
char *
G_gisbase (void)
Trả ra thư mục cài đặt GRASS.
Thư mục cài đặt GRASS sẽ cĩ các thư mục con sau
bin : Chứa các command cĩ thể gọi trực tiếp bởi các user
etc : Module và file dữ liệu được sử dụng bởi các GRASS command
txt : File hướng dẫn
menu : Những file được sử dụng bởi để tạo menu trong grass3
Vắ dụ : để gọi lệnh sroff trong thư mục etc, ta làm như sau
char command[200];
sprintf (command, "%s/etc/sroff", G_gisbase( )
KHOA CNTT Ờ ĐH KHTN ); system (command); char * G_gisdbase (void) Trả ra thư mục cài đặt các cơ sở dữ liệu của GRASS. (GRASS cĩ thể cĩ nhiều cơ sở dữ liệu nhưng chúng phải được cài đặt nằm trong thư mục chung này)
Hàm truy xuất biến mơi trường GISDBASE
int
G_getenv (char *name)
int
G_ _getenv (char *name)
truy xuất giá trị biến mơi trường của GRASS ( biến mơi trường GRASS là những biến mơi trường được quan trọng đối với thư viện và nĩ được lưu trong file .grassrc5 )
Nếu khơng truyền name là tên biến mơi trường: + G_getenv : sẽ báo lỗi và gọi exit để thốt + G__getenv : chỉ báo lỗi nhưng khơng thốt
int
G_setenv (char *name, char *value)
int
G_ _setenv (char *name, char *value)
Gán giá trị cho biến mơi trường của GRASS. Thơng tin này sẽ lập tức được ghi nhận vào file .grassrc5, để lần sau khi chạy GRASS nĩ sẽ được load lên lại.
Nếu giá trị value là NULL,việc gán biến mơi trường sẽ khơng được thực hiện.
KHOA CNTT Ờ
ĐH KHTN
Truy vấn cơ sở dữ liệu GRASS
Hàm Chức năng
char *
G_ask_old (char *prompt, char *name, char *element, char *label)
Người sử dụng được yêu cầu nhập tên của một file cơ sở dữ liệu đã cĩ.
char name[50]; char *mapset;
mapset = G_ask_old ("", name, "paint/labels", "labels");
if (mapset = = NULL)
exit(0); /* user canceled the request */
Kết quả hiện ra:
Enter the name of an existing labels file Enter 'list' for a list of existing labels files
Hit RETURN to cancel request 4
>
char *
Người sử dụng được yêu cầu nhập tên của một file cơ sở dữ liệu chưa cĩ trước
KHOA CNTT Ờ
ĐH KHTN
G_ask_new (char *prompt, char *name, char *element, char *label)
đĩ trong mapset. Tên này được dùng để
tạo mới file.
char *
G_ask_any (char *prompt, char *name, char *element, char *label, int warn)
Trả ra tên file hợp lệ.
Người sử dụng nhập vào một tên file,
Warn = 1 : nếu file đĩ đã tồn tại, người sử dụng sẽđược hỏi cĩ muốn ghi đè lên khơng ?
Warn = 0 : file đĩ được chấp nhận và khơng cĩ thơng điệp hỏi lại dù rằng trước đĩ cĩ một file đã mang tên đĩ trong mapset.
char *
G_fully_qualified_name (char *name, char *mapset)
Trả ra đường dẫn đến file cĩ tên là ỘnameỢ trong mapset.
Tìm file dữ liệu trong CSDL
KHOA CNTT Ờ
ĐH KHTN
Hàm Chức năng
char *
G_find_file (char *element, char *name, char *mapset)
Tìm một file dữ liệu của cơ sở dữ liệu char name[50]; char *mapset; if ((mapset = G_find_file("paint/labels",name,"")) == NULL) /* not found */
Kiểm tra coi file đĩ cĩ tồn tại trong mapset hiện tại hay khơng, ta làm như sau :
char name[50]; if (G_find_file("paint/labels",name,G_mapset( )) == NULL) /* not found */ int
G_legal__lename (char *name)
Kiểm tra tên file dữ liệu cĩ hợp lệ khơng. 1 : hợp lệ
-1 : khơng hợp lệ
int Mở một file dữ liệu đểđọc.
KHOA CNTT Ờ
ĐH KHTN
G_open_old (char *element, char *name, char *mapset)
File đữ liệu cĩ tên là ỘnameỢ, nằm trong ỘmapsetỢ của Location hiện tại và thuộc thành phần dữ liệu ỘelementỢ (thư mục con element của mapset) .
Hàm dùng open() để cài đặt mở file, trả ra Ờ 1 nếu khơng cĩ file, ngược lại trả ra id của file được mở.
FILE *
G_fopen_old (char *element, char *name, char *mapset)
Mở một file dữ liệu đểđọc.
Các tham số cĩ nội dung giống hàm G_open_old
Hàm này fopen() với tham số ỘrỢ để cài đặt, trả ra NULL nếu khơng cĩ file, ngược lại trả
ra con trỏ FILE đến file đã được mở. int
G_open_update (char *element, char *name)
Mở file cĩ tên name trong ỘelementỢ của mapset hiện tại theo mode cho phép đọc và ghi.
Hàm dùng open() để cài đặt mở file, trả ra Ờ 1 nếu khơng cĩ file, ngược lại trả ra id của file được mở.
KHOA CNTT Ờ
ĐH KHTN
FILE *
G_fopen_append (char *element, char *name)
Mở file cĩ tên name trong ỘelementỢ của mapset hiện tại theo mode append.
Hàm này fopen() với tham số ỘrỢ để cài đặt, trả ra NULL nếu khơng cĩ file, ngược lại trả
ra con trỏ FILE đến file đã được mở. int
G_open_new (char *element, char *name)
Tạo mới và mở file dữ liệu ỘnameỢ theo mode write only, trong thư mục ỘelementỢ của mapset hiện tại.
Dùng hàm open() để cài đặt. Trả ra Ờ1 nếu thất bại
FILE *
G_fopen_new (char *element, char *name)
Tạo mới và mở file dữ liệu ỘnameỢ theo mode write only, trong thư mục ỘelementỢ của mapset hiện tại
Dùng hàm fpen() để cài đặt. Trả ra NULL nếu thất bại
int
G_rename (char *element, char *old, char *new)
Đổi tên một file dữ liệu trong thư mục element của mapset.
Kết quả trả về
1 nếu thành cơng
KHOA CNTT Ờ
ĐH KHTN
0 nếu file old khơng tồn tại -1 nếu thất bại
int
G_remove (char *element, char *name)
Xố file trong thư mục element của mapset hiện tại. Kết quả trả về 1 nếu thành cơng 0 nếu file khơng tồn tại -1 nếu thất bại Cấp phát bộ nhớ int G_free(void *buf) Giải phĩng bộ nhớđược cấp phát bằng hàm thư viện của GRASS void *
G_realloc (void *ptr, int size)
Thay đổi kắch thước vùng nhớđã được cấp phát trước đĩ bằng hàm thư viện của GRASS
ptr trỏđến vùng nhớđã được cấp trước đĩ size kắch thước mới (tắnh theo bytes)
Kết quả trả về NULL nếu thất bại, ngược lại
KHOA CNTT Ờ
ĐH KHTN
là con trỏđến vùng nhớđã được cấp phát void *
G_calloc (int n, int size)
Cấp phát một vùng nhớ cĩ kắch thước n*size bytes, khởi tạo vùng nhớ với giá trị
0. Kết quả trả về NULL nếu thất bại, ngược lại là con trỏđến vùng nhớđã được cấp phát double * G_alloc_vector(int n) Cấp phát vùng nhớ cho một mảng số double cĩ n phần tử, khởi tạo zero cho tất cả phần tử. foat * G_alloc_fvector(int n) Cấp phát vùng nhớ cho một mảng số float cĩ n phần tử, khởi tạo zero cho tất cả phần tử. double **
G_alloc_matrix(int rows, int cols)
Cấp phát vùng nhớ cho một ma trận double cĩ rows dịng và cols cột, khởi tạo zero cho tất cả phần tử.
float **
G_alloc_fmatrix(int rows, int cols)
Cấp phát vùng nhớ cho một ma trận float cĩ rows dịng và cols cột, khởi tạo zero cho tất cả phần tử. int G_free_fmatrix(foat **m) Giải phĩng vùng nhớ cho ma trận float đã cấp int G_free_matrix(double **m) Giải phĩng vùng nhớ cho ma trận double đã cấp Trang 55
KHOA CNTT Ờ ĐH KHTN int G_free_vector(double *v) Giải phĩng vùng nhớ cho mảng double đã cấp REGION
Khái niệm về vùng (region) đã được trình bày trong phần trước, cĩ thể xem nĩ là một ma trận hai chiều với kắch thước xác định và được phân thành nhiều cell (ơ) nhỏđều nhau.
Về logic, cĩ hai loại vùng (region) khác nhau trong GRASS : loại thứ nhất là vùng (region) được xác lập cho CSDL, do người sử dụng thiết lập cho mapset hiện tại. Loại thứ hai là vùng (region) xử lý được thiết lập cho module của chương trình, nĩ sẽđiều khiển quá trình ghi và đọc dữ liệu vào file raster và file site. Những bảng đồ kiểu vector (vector map) khơng cĩ loại region xử lý được thiết lập cho module.
Thơng tin về một region được lưu trong cấu trúc Cell_header, định nghĩa trong file Ộgis.hỢ
Vùng (region) được xác lập cho CSDL
Hàm Chức năng
int
G_get_window (struct Cell_head *region)
Đọc region được lưu trong file WIND của MAPSET hiện tại vào trong struct region.
int
G_put_window (struct Cell_head
Ghi thơng tin của vùng (region) chứa trong cấu trúc region truyền cho hàm
KHOA CNTT Ờ
ĐH KHTN
*region) vào file WIND của MAPSET hiện tại int
G_get_default_window (struct Cell_head *region)
Lấy thơng tin mặc định về region của LOCATION hiện tại được chọn.
Vùng (region) được xác lập ở mức module
Được sử dụng khi cần đọc và ghi dữ liệu raster cũng như site.
Khi khởi tạo, vùng được xác lập ở mức module và vùng được xác lập cho CSDL là cùng một giá trị, tuy nhiên lập trình viên cĩ thể thay đổi tuỳ biến, thơng qua
Hàm Chức năng
int
G_set_window (struct Cell_head *region)
Thiết lập region ở mức module xử lý. Việc thiết lập này khơng làm thay đổi nội dung của file WIND lưu cấu hình của region ở mức dữ liệu. Vùng xử lý
được thiết lập này chỉ tồn tại trong quá trình xử lý của module.
int
G_get_set_window (struct Cell_head *region)
Lấy ra giá trịđã được thiết lập thơng qua hàm G_set_window bên trên
KHOA CNTT Ờ
ĐH KHTN
Cơ sở dữ liệu lưu theo kinh-vĩđộ
GRASS hỗ trợ lưu toạđộ theo kinh độ và vĩđộ. Tọa độ x là kinh độ và y là vĩ độ. Vấn đề phát sinh là việc tắnh diện tắch, chiều dài và xác lập một khu vực theo phép Euclide cho những loại dữ liệu của GRASS trước đĩ sẽ khơng cịn đúng cho loại dữ
liệu này nữa.
Trái đất thì cong và bản đồ hiện thị thì lại cĩ dạng phằng và khơng cĩ thơng tin nào để
biểu thị cho độ cong của trái đất. Hai điểm dù thuộc cùng một kinh độ hoặc vĩ độ
nhưng chưa chắc khi vẽ lên bản đồ thì chúng thuộc một đường thẳng vì lý do là độ
cong của trái đất.
GRASS cung cấp thư viện GISLIB để giải quyết các vấn đề trên
Kinh độ và vĩđộ được tắnh theo ỘđộỢ. Vĩ độ Bắc nằm từ 0 đến 90 độ, vĩđộ Nam nằm từ 0 đến Ờ 90 độ. Kinh độ thì khơng cĩ giới hạn vềđộ đo vì kinh độ xuất phát từ hai cực của trái đất.
Toạđộđược thể hiện theo định dạng ASCII và theo những mẫu sau : Vĩđộ : dd:mm:ssN hoặc dd:mm:ssS
Kinh độ : dd:mm:ssE hoặc dd:mm:ssW
Độ phân giải của lưới hiện thị (grid resolution) : dd.mm.ss Vắ dụ :
80:30:24N là toạđộ của vĩđộ, cĩ nghĩa là 80 độ (degree), 30 phút (minutes) và 24 giây (second) Bắc
120:15W là tọa độ của kinh độ, cĩ nghĩa là 120 độ (degree), 15 phút (minute) Tây của đường kinh tuyến chắnh.
KHOA CNTT Ờ
ĐH KHTN
Đĩ là phương pháp mà GRASS dùng để mã hố toạđộ theo kinh độ và vĩđộ. GRASS cung cấp trong thư viện những hàm để thực hiện sự chuyển đổi giữa toạđộ thực về toạ độ mã hố này
Hàm Chức năng
int
G_format_easting (double east, char *buf, int projection)
int
G_format_northing (double north, char *buf, int projection)
int
G_format_resolution (double
resolution, char *buf, int projection)
Chuyển toạđộđược thể hiện trong biến east về dạng ASCII và lưu trong buf. Tọa độ biến east là toạđộĐơng.
Chuyển toạđộđược thể hiện trong biến north về dạng ASCII và lưu trong buf. Tọa độ biến east là toạđộ Bắc
Chuyển độ phân giải về dạng mã hố ASCII và lưu kết quả trong buf
int
G_scan_easting (char *buf, double *easting, int projection)
int
G_scan_northing (char *buf, double *northing, int projection)
Chuyển giá trị mã hố ASCII về toạđộ
ban đầu, hàm dùng chuyển cho tọa độ Đơng
Chuyển giá trị mã hố ASCII về toạđộ
ban đầu, hàm dùng chuyển cho tọa độ
Bắc
KHOA CNTT Ờ
ĐH KHTN
int
G_scan_resolution (char *buf, double *resolution, int projection)
Chuyển dạng mã hố ASCII của độ
phân giải về giá trị ban đầu
Vắ dụ minh hoạ
double north ; char buf[50] ;
G_scan_northing(buf, north, G_projection( )); /* ASCII to double*/ G_format_northing(north, buf, G_projection( )); /* double to ASCII */ G_format_northing(north, buf, -1); /* double to ASCII */
Tắnh tốn diện tắch bản đồ kiểu RASTER
Những phép tốn hỗ trợ thực hiện việc tắnh tốn trên bản đồ kiểu raster
Dù lưới được xây dựng từ kinh độ và vĩđộ sẽ khơng chắnh xác khi thực hiện việc tắnh tốn đối với diện tắch (do trái đất cong, một điểm thuộc cùng kinh độ chưa chắc là thẳng hàng, điều tương tựđối với vĩđộ), tuy nhiên với cùng một vĩđộ, các ơ của lưới
được tạo ra bởi vĩđộđĩ và các kinh độ là bằng nhau về kắch thước.
KHOA CNTT Ờ
ĐH KHTN
Dựa vào điều này GRASS cung cấp các hàm thư viện sau
Hàm Chức năng
double
G_area_of_cell_at_row (int row)
Trả ra diện tắch (area) được tắnh bằng m2 của một ơ lưới tại một dịng. Giá trị này dùng đểđo diện tắch cho những ơ lưới thuộc cùng một dịng. int G_begin_cell_area_calculations (void)
Phải được gọi trước khi gọi hàm
G_area_of_cell_at_row
int
G_begin_zone_area_on_ellipsoid (double a, double e2, double s)
Khởi tạo cho việc tắnh diện tắch một ellipse cĩ trục nhỏ là a, tâm sai e2 và s là gia số cho biết phần ellipse sẽđược tắnh diện tắch ( s =1.0 tắnh tồn bộ, 0.5 cho một nữa ellipse..)
double
G_area_for_zone_on_ellipsoid (double north, double south)
Diện tắch nằm giữa khu vực được xác
định bởi vĩđộ Bắc và Nam, và lấy theo gia số s được truyền cho hàm
G_begin_zone_area_on_ellipsoid bên trên
KHOA CNTT Ờ ĐH KHTN int G_begin_zone_area_on_sphere (double r, double s) Khởi tạo việc tắnh diện tắch cho một mặt cầu, với r là bán kắnh và s là gia số cho phép tắnh một phần của mặt cầu đĩ (ý nghĩa s tương tự hàm G_begin_zone_area_on_ellipsoid ) double G_area_for_zone_on_sphere (double north, double south)
Tắnh diện tắch mặt cầu của khu vực nằm giữa vĩ tuyến Bắc và Nam.
Tắnh diện tắch đa giác
Cĩ một vấn đề mắc phải đối với hệ toạđộ theo kinh độ và vĩđộ mà các hệ toạđộ
phẳng khơng gặp đĩ là : đối với loai bản đồ vector chẳng hạn, dữ liệu đa giác được lưu là những toạđộ (x,y), đường thẳng tạo thành đa giác sau đĩ được phát sinh bằng cách nối liền các tọa độ này. Đối với tọa độ theo kinh độ và vĩđộ, do hình dạng trái đất trịn nên ta khơng thể sử dụng đường thẳng để nối liền các toạđộ và tạo ra đa giác. Bề