Giới thiệu sơ bộ hàm và thư việ n

Một phần của tài liệu NGHIÊN CỨUCHUYỂN đổi PHẦN mềm GRASS từ nền UNIX lên WINDOWS (Trang 43 - 95)

™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ề

Một phần của tài liệu NGHIÊN CỨUCHUYỂN đổi PHẦN mềm GRASS từ nền UNIX lên WINDOWS (Trang 43 - 95)

Tải bản đầy đủ (PDF)

(157 trang)