Lời Cảm Ơn
Lời Cảm Ơn
(cid:87) (cid:88) Luận văn của chúng em sẽ rất khó hoàn thành nếu không có sự truyền đạt kiến
thức quí báu và sự hướng dẫn tận tình của Thầy Dương Anh Đức. Chúng em xin chân
thành cám ơn sự chỉ bảo của các thầy.
Chúng con xin gửi tất cả lòng biết ơn, sự kính trọng đến ông bà, cha mẹ, cùng
toàn thể gia đình, những người đã nuôi dạy, đã cho chúng con niềm tin và nghị lực để
vượt qua mọi khó khăn.
Chúng em xin trân trọng cám ơn quý Thầy cô trong Khoa Công nghệ thông tin
trường Đại học Khoa học Tự nhiên Tp.Hồ Chí Minh đã tận tình giảng dạy, truyền đạt
những kiến thức quý báu và tạo điều kiện cho chúng em được thực hiện luận văn này.
Xin chân thành cám ơn sự giúp đỡ, động viên và chỉ bảo rất nhiệt tình của các
anh chị đi trước và tất cả bạn bè. Các anh chị, các bạn luôn có mặt trong những thời
điểm khó khăn nhất, tiếp thêm động lực và ý chí, giúp chúng tôi hoàn thành được luận
văn.
Mặc dù đã cố gắng nỗ lực hết sức mình, song chắc chắn luận văn không khỏi
còn nhiều thiếu sót. Chúng em rất mong nhận được sự thông cảm và chỉ bảo tận tình
của quý Thầy cô và các bạn.
Tp.HCM, 7/2004
Nhóm sinh viên thực hiện
Trang 1
Nguyễn Quý Minh – Phạm Anh Vũ
Lời nói đầu
Lời Nói Đầu (cid:91) (cid:92)
Ngày nay, trong tất cả các lãnh vực của đời sống kinh tế, xã hội, công nghệ
thông tin được xem là một trong những ngành công nghệ mũi nhọn, đóng vai trò hết
sức quan trọng, có thể tạo ra những bước đột phá mạnh mẽ.
Các ứng dụng GIS ngày càng phát huy vai trò quan trọng trong việc hỗ trợ quản
lý, qui hoạch đặc biệt là đối với các tổ chức, chính phủ. Vấn đề qui hoạch ở Việt Nam,
cũng như ở nhiều quốc gia khác, đang gặp rất nhiều khó khăn, tốn nhiều thời gian và
tiền bạc, nhất là đối với các thành phố lớn, trọng điểm như TP Hồ Chí Minh, Hà Nội,
Hải Phòng ... Giải pháp cần thiết là một ứng dụng GIS hỗ trợ. Việc bắt tay xây dựng từ
đầu một ứng dụng GIS cần rất nhiều thời gian, tiền bạc và công sức nhưng chưa chắc
thành công. Trên thị trường cũng có những ứng dụng GIS thương mại, cho phép xây
dựng ứng dụng trên nền thư viện cung cấp sẵn như ArcView GIS, ArcGIS .. , tuy nhiên
sẽ phải đối mặt với vấn đề bản quyền, tốn rất nhiều tiền bạc khi triển khai trên diện
rộng.
GRASS là một phần mềm GIS có chức năng, sức mạnh bằng hoặc vượt các sản
phẩm thương mại nhưng điều đặc biệt là một ứng dụng mã nguồn mở, tức người sử
dụng có thể tự mình tòan quyền cài đặt, sữa chữa phù hợp với nhu cầu và đặc điểm
riêng của mình mà không phải trả chi phí bản quyền phần mềm. Điều hạn chế hiện nay
là GRASS chỉ được phát triển trên nền UNIX. Nếu có thể chuyển đổi GRASS sang
Windows, ta có thể xây dựng được nhiều ứng dụng GIS với chi phí rẻ, phù hợp để phổ
biến trên diện rộng do Windows là hệ điều hành dễ sử dụng, thân thiện và có số lượng
người dùng nhiều nhất hiện nay.
Với ý tưởng trên, chúng em đã tập trung thực hiện đề tài “NGHIÊN CỨU
Trang 2
CHUYỂN ĐỔI PHẦN MỀM GRASS TỪ NỀN UNIX LÊN WINDOWS”.
Lời nói đầu
Nội dung của luận văn được chia làm 5 chương:
Chương 0: Mở đầu giới thiệu chung về đề tài, ý nghĩa và các mục tiêu của đề
tài; trình bày các giải pháp và hướng nghiên cứu đã được thực hiện trong và ngoài
nước.
Chương 1: .OpenGIS – Khái niệm chung và Các mô hình dữ liệu, giới thiệu
chung về các khái niệm GIS, OpenGIS, các mô hình dữ liệu trên GIS.
Chương 2: Hệ Thống Hỗ trợ Phân tích Tài nguyên Địa lý, trình bày về phần
mềm mã nguồn mở GRASS, cách thức cài đặt và khởi tạo, cách thức sử dụng và lập
trình trên GRASS.
Chương 3: Quá trình chuyển đổi GRASS từ Unix lên môi trường Window,
các kỹ thuật cài đặt trong GRASS, mô hình và cấu trúc chi tiết của GRASS, các bộ thư
viện trung tâm.
Chương 4: Tổng kết tóm tắt lại các vấn đề đã được đặt ra trong luận văn, cách
Trang 3
giải quyết, kết quả đạt được và đề ra một số hướng phát triển trong tương lai.
Mục lục
Mục Lục
Lời Cảm Ơn ................................................................................................................................ 1 Lời Nói Đầu ................................................................................................................................ 2 Mục Lục...................................................................................................................................... 4 Danh sách các hình vẽ ................................................................................................................ 6 Chương 0 : Mở Đầu .................................................................................................................... 7 Chương 1 : OpenGIS – Khái niệm chung và Các mô hình dữ liệu .......................................... 8 1.1 Giới thiệu về GIS .............................................................................................................. 8 1.1.1 Định nghĩa GIS .......................................................................................................... 8 1.1.2 Các thành phần của GIS........................................................................................... 10 1.1.3 Các mô hình dữ liệu của GIS.................................................................................. 11 1.1.4 Vấn Đề Dữ Liệu Đối Với GIS ................................................................................. 12 1.2 Khái Quát Về OpenGIS .................................................................................................. 14 1.2.1 Tổ chức OGC........................................................................................................... 14 1.2.2 Định nghĩa OpenGIS ............................................................................................... 16 Chương 2 : Hệ Thống Hỗ trợ Phân tích Tài nguyên Địa lý..................................................... 17 2.1 Sơ lược về GRASS ......................................................................................................... 17 2.2 Kiến trúc GRASS............................................................................................................ 19 2.3 Định dạng dữ liệu .......................................................................................................... 20 2.4 Tổ chức lưu trữ dữ liệu của GRASS............................................................................... 23 2.4.1 GISDBASE :............................................................................................................ 23 2.4.2 LOCATION :........................................................................................................... 23 2.4.3 MAPSETS ............................................................................................................... 24 2.4.4 REGION và MASK ................................................................................................ 29 2.4.5 Các biến môi trường sử dụng trong GRASS ........................................................... 31 2.5 Dữ liệu RASTER ............................................................................................................ 32 2.5.1 Ý niệm sơ lược......................................................................................................... 32 2.5.2 Hệ thống tập tin raster............................................................................................. 34 2.5.3 Các thao tác quan trọng ........................................................................................... 34 2.6 Dữ liệu VECTOR (VECTOR DATA)............................................................................ 35 2.6.1 Ý niệm sơ lược......................................................................................................... 35 2.6.2 Hệ thống tập tin vector............................................................................................ 36 2.6.3 Các thao tác quan trọng ........................................................................................... 37 2.7 Dữ liệu điểm (POINT/SITE DATA) .............................................................................. 38 2.7.1 Ý niệm sơ lược......................................................................................................... 38 2.7.2 Hệ thống tập tin site ................................................................................................ 39 2.7.3 Các thao tác quan trọng ........................................................................................... 40 2.8 Các thư viện được cung cấp bởi GRASS (src/libes)....................................................... 41 2.8.1 Danh sách................................................................................................................. 41 2.8.2 Giới thiệu sơ bộ hàm và thư viện............................................................................. 43 2.9 Cơ chế bổ sung và quản lý mã nguồn của GRASS......................................................... 95
Trang 4
Mục lục
2.9.1 Mã nguồn chính thức (thư mục src)......................................................................... 96 2.9.2 Mã nguồn ALPHA (thư mục src.alpha)................................................................... 96 2.9.3 Mã nguồn đóng góp (thư mục src.contrib) .............................................................. 96 2.9.4 Mã nguồn có liên quan (thư mục src.related) .......................................................... 97 2.9.5 Mã nguồn GARDEN (src.garden) ........................................................................... 97 2.9.6 Các script (src/script/shell) ...................................................................................... 97 2.10 Hướng dẫn cài đặt và sơ lược cách sử dụng ................................................................. 97 2.10.1 Cài đặt GRASS trên LINUX ................................................................................. 97 2.10.2 Cài đặt GRASS trên Windows thông qua giả lập Cygwin .................................... 99 Chương 3 : Quá trình chuyển đổi GRASS5 từ Linux lên Windows..................................... 101 3.1 Sự khác biệt giữa Windows và Unix/Linux.................................................................. 101 3.1.1 Tổng quan về hệ điều hành Windows.................................................................... 101 3.1.2 Tổng quan về hệ điều hành UNIX ......................................................................... 103 3.1.3 So sánh tổng quát về lập trình đa nhiệm trên hai môi trường................................ 105 3.1.4 So sánh về hệ thống file của hai môi trường ......................................................... 109 3.1.5 Giao diện người dùng ............................................................................................ 112 3.1.6 Shell và script......................................................................................................... 113 3.2 Sơ lược về phần mềm GRASS ..................................................................................... 113 3.3 Sơ lược về mã nguồn của GRASS 5.0.2....................................................................... 114 3.4 Môi trường sử dụng để chuyển đổi GRASS5 ............................................................... 115 3.5 Các vấn đề chính khi chuyển đổi lên Windows........................................................... 116 3.5.1 Khởi tạo các biến môi trường cần thiết................................................................. 116 3.5.2 Dữ Liệu GRASS và Cấu trúc của dữ liệu GRASS ............................................... 119 3.5.3 Cấu trúc chung của source code GRASS.............................................................. 121 3.5.3.1 Cài đặt bộ thư viện trung tâm ............................................................................. 122 3.5.3.2 Cài đặt các nhóm lệnh xử lý của Grass............................................................... 124 3.5.3.3 Các Driver dùng để hiển thị của Display............................................................ 129 3.5.3.4 Cơ chế SendMessage trong GRASS5................................................................ 132 3.5.3.5 Khái niệm hệ thống đồ họa XWindow trong Linux .......................................... 143 3.5.3.6 Cài đặt và sử dụng các hàm X (Xlib) trên Window32....................................... 147 Chương 4 : Tổng Kết .............................................................................................................. 152 4.1 Kết Luận ....................................................................................................................... 152 4.2 Hướng Phát Triển ......................................................................................................... 152 Tài Liệu Tham Khảo............................................................................................................... 153 Phụ Lục ................................................................................................................................... 154
Trang 5
Danh sách các hình vẽ
Danh sách các hình vẽ
Hình 1 - 1 Minh họa về GIS ..................................................................................... 11 Hình 2 - 1 Mô hình kiến trúc GRASS ...................................................................... 20 Hình 2 - 2 Minh họa cấu trúc lưu trữ của GISDBASE trên đĩa................................ 23 Hình 2 - 3 Minh họa cấu trúc lưu trữ của LOCATION trên đĩa............................... 24 Hình 2 - 4 Minh họa cấu trúc lưu trữ của MAPSET trên đĩa.................................... 25 Hình 2 - 5 Minh họa cơ chế MASK của GRASS ..................................................... 31 Hình 2 - 6 Minh họa dữ liệu điểm – POINT/SITE ................................................... 39 Hình 2 - 7 Hình ảnh sử dụng GRASS5 trên Linux................................................... 99 Hình 2 - 8 Hình ảnh sử dụng GRASS5 trên Windows thông qua giả lập Cygwin. 100 Hình 3 - 1 Kiến trúc của hệ điều hành Windows theo họ NT................................ 103 Hình 3 - 2 Các dòng hệ điều hành phát triển trên nền UNIX ................................ 104 Hình 3 - 3 Kiến trúc của hệ điều hành UNIX ........................................................ 105 Hình 3 - 4 Mô hình minh họa cơ chế Send Event trong GRASS5 ........................ 138 Hình 3 - 5 Kiến trúc thư viện XLIB....................................................................... 151
Trang 6
Chương 0: Mở đầu
Chương 0 : Mở Đầu
Các ứng dụng GIS ngày càng phát huy vai trò quan trọng trong việc hỗ trợ quản
lý, qui hoạch đặc biệt là đối với các tổ chức, chính phủ. Vấn đề qui hoạch ở Việt Nam,
cũng như ở nhiều quốc gia khác, đang gặp rất nhiều khó khăn, tốn nhiều thời gian và
tiền bạc, nhất là đối với các thành phố lớn, trọng điểm như TP Hồ Chí Minh, Hà Nội,
Hải Phòng ... Giải pháp cần thiết là một ứng dụng GIS hỗ trợ. Từ nhu cầu nói trên,
chúng em đã đầu tư xây dựng đề tài “NGHIÊN CỨU CHUYỂN ĐỔI PHẦN MỀM
GRASS TỪ NỀN UNIX LÊN WINDOWS”.
Đề tài phải giải quyết một số công việc chính:
Nghiên cứu GIS và chuẩn OpenGIS. •
Nghiên cứu sự khác nhau giữa hệ điều hành Unix và Windows. •
Dựa vào những hiểu biết này, xem xét việc xây dựng một ứng dụng GIS •
trên nền phần mềm mã nguồn mở GRASS.
Triển khai việc chuyển đổi GRASS từ môi trường Unix sang môi trường •
Trang 7
Windows.
Chương 1: OpenGis – Các khái niệm
Chương 1 : OpenGIS – Khái niệm chung và Các mô hình dữ liệu
Chương này trình bày khái quát về GIS và những vấn đề tồn tại liên quan đến trao đổi
dữ liệu GIS trong môi trường mạng dẫn đến nhu cầu xuất hiện OpenGIS. Các khái
niệm và chủ đề liên quan đến OpenGIS, vai trò của tổ chức OGC (Open GIS
Consortium), mô hình tham chiếu ORM (OpenGIS Refrerence Model), và các bộ đặc
tả về OpenGIS được đề xuất bởi OGC là những phần chính được đề cập đến trong
chương này.
1.1 Giới thiệu về GIS
1.1.1 Định nghĩa GIS
Hệ thống thông tin địa lý, gọi tắt là GIS (Geographic Information System) ra đời từ đầu
thập niên 60. Tuy nhiên mãi đến thập niên 80, GIS mới thực sự được phát triển nhanh
chóng. Cho đến nay, tuỳ theo cách tiếp cận mà người ta có nhiều định nghĩa khác nhau
về GIS. Những định nghĩa này bổ sung cho nhau giúp ta hiểu đầy đủ hơn các khía cạnh
của GIS. Sau đây là một số định nghĩa của GIS được trích theo Peter & Rachael
(1998):
GIS là một tập các công cụ mạnh dùng cho việc thu nhập, lưu trữ cũng như •
truy tìm, biến đổi và hiển thị các dữ liệu không gian từ thế giới thực (Burrough,
1986)
GIS là một hệ thống dùng cho việc nắm bắt, kiểm tra, thao tác, phân tích và •
hiển thị các dữ liệu qui chiếu không gian liên quan đến Trái đất (Department of
Environment, 1987)
Trang 8
GIS là công nghệ thông tin cho phép lưu trữ, phân tích, và hiển thị cả dữ liệu •
Chương 1: OpenGis – Các khái niệm
không gian lẫn dữ liệu phi không gian (Parker, 1988)
GIS là hệ thống cơ sở dữ liệu trong đó phần lớn dữ liệu biểu thị không gian, và •
tập các thủ tục thao tác trên những dữ liệu này nhằm trả lời những truy vấn về
các thực thể không gian chứa trong cơ sở dữ liệu (Smith et al,. 1987)
GIS là tập các thủ tục thủ công hoặc dựa trên máy tính được dùng để lưu trữ và •
thao tác các dữ liệu tham chiếu địa lý (Aronoff, 1989)
GIS là tập các chức năng được thực hiện một cách tự động nhằm cung cấp •
những năng lực cấp cao đối với sự lưu trữ, truy tìm, thao tá và hiển thị các dữ
liệu vị trí địa lý (Ozemoy, Smith, & Sicherman, 1981)
GIS là một thực thể tổ chức, phản ánh cấu trúc tổ chức cho phép tích hợp công •
nghệ với cơ sở dữ liệu và các chuyên gia, và tổ chức này liên tục hỗ trợ tài
chính (Carter, 1989)
GIS là hệ thống hỗ trợ quyết định liên quan đến sự tích hợp dữ liệu quy chiếu •
không gian trong một môi trường giải quyết vấn đề (Cowen, 1988)
Thông qua các định nghĩa trên, ta thấy được ba khía cạnh quan trọng của một •
hệ thống GIS bao gồm:
Tập các công cụ hoặc thủ tục cho phép thực hiện các chức năng lưu trữ, truy •
tìm, biến đổi, phân tích và hiển thị dữ liệu không gian địa lý.
Cơ sở dữ liệu là thành phần quan trọng chức các dữ liệu không gian kết hợp dữ •
liệu phi không gian.
Tổ chức nhằm phối hợp kỹ thuật và con người để có thể duy trì và phát triển hệ •
Trang 9
thống nhằm đưa ra những quyết định hợp lý.
Chương 1: OpenGis – Các khái niệm
1.1.2 Các thành phần của GIS
Có nhiều mô hình GIS tuỳ theo nhu cầu của người dùng. Mô hình đầy đủ của GIS bao
gồm sáu thành phần: phần cứng, phần mềm, dữ liệu, qui trình, con người và tổ chức.
Những thành phần này cần phải kết hợp cân đối nhau để hệ thống làm việc hiệu quả.
Phần cứng GIS bao gồm hệ thống máy tính hoặc mạng máy tính cho phép •
nhập, xuất, lưu trữ, truyền và hiển thị dữ liệu không gian.
Phần mềm GIS bao gồm những công cụ thực hiện năm chức năng chính là •
nhập và kiểm tra dữ liệu, lưu trữ quản lý dữ liệu, xuất và thể hiện dữ liệu, biến
đổi phân tích dữ liệu, và giao tiếp với người sử dụng.
Dữ liệu GIS bao gồm dữ liệu không gian và dữ liệu phi không gian với dung •
lượng rất lớn, cần được thu nhập và lưu trữ theo một cấu trúc chuẩn để thuận
tiện cho việc trao đổi và bảo quản.
Các qui trình xử lý được xác lập trong quá trình phân tích và thiết kế hệ thống •
GIS cho một tổ chức với các mục tiêu cụ thể. Khả năng xây dựng và triển khai
các qui trình ảnh hưởng đến tính hữu hiệu của hệ thống GIS.
Con người là yếu tố quyết định sự thành công của hệ thống GIS. Con người •
bao gồm các kỹ thuật viên, chuyên viên công nghệ thông tin, nhà quản trị hệ
thống và người sử dụng các kết quả của GIS để ra quyết định.
Tất cả những thành phần trên cần được đặt trong một tổ chức thích hợp, có các •
Trang 10
cơ chế, chính sách và qui trình hợp lý.
Chương 1: OpenGis – Các khái niệm
Hình 1 - 1 Minh họa về GIS
1.1.3 Các mô hình dữ liệu của GIS
Trong GIS, các thực thể trong thế giới thực có thể được biểu diễn bằng những mô hình
dữ liệu khác nhau nhằm mô tả các thuộc tính, vị trí, thời gian và quan hệ không gian
giữa chúng. Các thực thể khi được biểu diễn trong mô hình dữ liệu thường được gọi là
các đối tượng. Để biểu diễn vị trí và quan hệ của các đối tượng trong không gian địa lý,
người ta dùng mô hình vector hoặc mô hình raster. Mô hình phân cấp, mô hình mạng
hoặc mô hình quan hệ thì được dùng để biểu diễn các thuộc tính của các đối tượng.
Trong cơ sở dữ liệu địa lý, các thuộc tính sẽ được liên kết với các đối tượng tương ứng
trong mô hình vector hoặc raster. Mỗi một mô hình đều có ưu điểm và nhược điểm
riêng, và có thể có nhiều cấu trúc dữ liệu, mỗi cấu trúc dữ liệu có thể được lưu trữ bằng
Trang 11
nhiều định dạng khác nhau.
Chương 1: OpenGis – Các khái niệm
Mô hình vector
Trong mô hình vector, mỗi đặc trưng địa lý trên mặt đất được xác định bằng những
điểm, đường và vùng trong mặt phẳng toạ độ Descartes. Mỗi điểm được xác định bởi
cặp toạ độ (x,y), mỗi đường được tuyến tính hoá thành nhiều đoạn biểu diễn bằng một
chuỗi những cặp toạ độ (xi, yi), mỗi vùng được xác định bởi một đường khép kính và
được biểu diễn bằng một chuỗi các cặp tọa độ (xi, yi) có các tọa độ điểm đầu và điểm
cuối trùng nhau.
Mô hình raster
Trong mô hình raster, không gian được chia thành những phần tử nhỏ còn được gọi là
tế bào. Mỗi tế bào được xem như đồng nhất, cùng một thuộc tính và được biểu diễn
như một điểm. Kích thước của mỗi tế bào được đặc trưng bởi độ phân giải.Có thể hình
dung dữ liệu raster như là một tấm lưới phủ lên một địa thế nào đó trong thế giới thực,
và mỗi ô trong lưới có một mã số đặc trưng cho một ý nghĩa nào đó của vùng nằm bên
trong ô đó.
Một đặc điểm của cấu trúc raster là một lưới raster như vậy chỉ biểu diễn được một
thuộc tính àno đó của đối tượng thôi, vì mỗi tế bào trong lưới chỉ được gán bởi duy
nhất một giá trị thuộc tính. Do vậy, người ta thường tạo nhiều lớp lưới raster khác nhau
để biểu diễn nhiều thuộc tính cho cùng một đối tượng, mỗi lớp cho mỗi thuộc tính.
1.1.4 Vấn Đề Dữ Liệu Đối Với GIS
Hiện nay trên thị trường có rất nhiều sản phẩm phần mềm GIS. Một số phần mềm GIS
được xây dựng trên mô hình dữ liệu vector (mô hình thông dụng), một số khác xây
dựng trên mô hình raster, và một số khác nữa xây dựng trên cả hai mô hình. Với mỗi
mô hình được chọn, các hãng sản xuất phần mềm GIS lại có những biễu diễn vật lý
Trang 12
riêng của mình ở thiết kế bên trong nhằm tối ưu hóa việc lưu trữ, xử lý cũng như hiển
Chương 1: OpenGis – Các khái niệm
thị dữ liệu. Bên cạnh đó, các tổ chức cũng đưa ra những dạng thức riêng của họ để
thuận tiện cho việc ghi nhận và trao đổi dữ liệu địa lý của tổ chức.
Để lưu trữ dữ liệu không gian địa lý theo kiểu vector, phần mềm GIS ArcInfo dùng
dạng thức tập tin .shp, AutoCAD dùng .dwg, Autodesk Map dùng .dxf, MapInfo dùng
.mif, MicroStation dùng .dng, … Còn tổ chức US Geological Survey dùng dạng thức
DLG (Digital Line Graph), Chính phủ US dùng SDTS (Spatial Data Transfer System),
tổ chức US Census Bureau dùng TIGER (Topologically Integrated Geographic
Encoding and Referencing Files), … (có thể tham khảo thêm tại Đặng Văn Đức, 2001,
trang 202-204).
Tương tự với kiểu raster, nhiều dạng thức tập tin khác nhau cũng được sử dụng cho
việc lưu trữ dữ liệu, đặc biệt là những dữ liệu bản đồ được số hóa từ các thiết bị chuyên
dụng hoặc từ các ảnh chụp viễn thám. Chẳng hạn, các dạng thức PCX (PC PaintBrush
Exchange), TIFF (Tagged Image File Format) thường được dùng cho các ảnh raster tạo
được từ máy quét hoặc các chương trình vẽ PC, dạng thức ADRG (Arc Digitized
Raster Graphics) được dùng bởi Quân đội US lưu các ảnh raster của bản đồ giấy, dạng
thức BIL (Band Interleaved by Line) và BIP (Band Interleaved by Pixel) được dùng
cho các hệ thống viễn thám.
Về việc liên kết dữ liệu không gian địa lý với dữ liệu thuộc tính (còn gọi là dữ liệu phi
không gian) trong hệ GIS cũng có nhiều mô hình khác nhau. Chẳng hạn, MapInfo lưu
dữ liệu không gian vào tập tin dạng .mif, dữ liệu thuộc tính vào tập tin dạng .mid, và cả
hai tập tin này đều thuộc về MapInfo. Kiểu lưu trữ này của MapInfo được xem là kiến
trúc tích hợp của hệ GIS (Đặng Văn Đức, 2001, trang 202). Còn ArcInfo lưu dữ liệu
không gian vào tập tin dạng .dhp, và dùng tập tin dang .dbf vay mượn từ cơ sở dữ liệu
quan hệ thương mại để lưu dữ liệu thuộc tính. Đây được xem là kiến trúc đối ngẫu của
hệ GIS (Đặng Văn Đức, 2001, trang 199). Ngoài ra, một mẫu kiến trúc tích hợp khác
Trang 13
của hệ GIS nữa là một số cơ sở dữ liệu quan hệ thương mại truyền thống nay được mở
Chương 1: OpenGis – Các khái niệm
rộng thêm để có thể hỗ trợ việc lưu trữ và xử lý dữ liệu không gian địa lý. Ví dụ cơ sở
dữ liệu Oracle nay có thêm phần Oracle Locator và Oracle Spatial.
Sự đa dạng về mô hình và cấu trúc dữ liệu dùng trong GIS một mặt cho thấy được sự
sáng tạo của con người nhằm đáp ứng nhu cầu sử dụng và phát triển các ứng dụng GIS,
nhưng mặt khác cũng kéo theo những khó khăn nhất định trong việc truyền thông, trao
đổi cũng như tích hợp dữ liệu GIS.
Để giải quyết vấn đề trao đổi dữ liệu GIS, một cách truyền thống người ta thường xây
dựng thêm các thành phần phần mềm làm nhiệm vụ chuyển đổi giữa các dạng thức dữ
liệu, thường được gọi là các bộ chuyển đổi (converter). Các bộ chuyển đổi này hoặc
được tích hợp trực tiếp vào các phần mềm GIS thương mại và thể hiện ở các chức năng
import/export, hoặc được cung cấp bởi một bên “thứ ba” trung gian nào đó.
Ngày này với sự phát triển của mạng máy tính nói chung và mạng Internet nói riêng,
các nhu cầu thừa kế, trao đổi, tích hợp và khai thác dữ liệu GIS từ nhiều nguồn khác
nhau giữa các tổ chức, cộng đồng và quốc gia trong môi trường mạng ngày càng gia
tăng và có ý nghĩa. Việc thi hành các tác vụ chuyển đổi dữ liệu theo kiểu truyền thống
không được xem là hiệu quả và thuận tiện cho lắm đối với người sử dụng. Người ta cần
tìm ra giải pháp mang tính hệ thống và chuẩn mực hơn nhằm đêm lại sự thuận lợi lâu
dài và bền vững cho những người khai thác GIS.
1.2 Khái Quát Về OpenGIS
1.2.1 Tổ chức OGC
Tổ chức Liên hiệp OpenGIS, gọi tắt là OGC (Open GIS Consortium), là một tổ chức
phi lợi nhuận và mang tính quốc tế, được thành lập vào nằm 1994 nhằm giải quyết các
vấn đề liên quan đến sự trao đổi chia sẽ các dữ liệu không gian địa lý và khả năng làm
việc phối hợp giữa các phần mềm GIS. Các hoạt động của OGC tạo ra những ảnh
Trang 14
hưởng có ý nghĩa đến cộng đồng GIS và việc thiết kế các hệ thống GIS trong tương lai.
Chương 1: OpenGis – Các khái niệm
Nhận xét về vấn đề dữ liệu đối với GIS, OGC cho rằng:
“Hiện trên Web và trong các kho lưu trữ độc lập có nhiều dữ liệu không gian địa lý,
nhưng chúng quá phức tạp, không đồng nhất và không tương thích nhau. Người dùng
cần phải có kiến thức chuyên môn và các phần mềm GIS chuyên biệt để bao phủ hoặc
kết hợp các lớp bản đồ khác nhau của cùng một vùng địa lý. Việc chuyển đổi dữ liệu
thường nặng nề và mất nhiều thời gian, nhưng kết quả lại không được như ý. Chỉ có
giao tiếp chung là cách cho phép sự bao phủ và kết hợp các loại thông tin địa lý phức
tạp khác nhau xảy ra một cách tự động trên Internet, bất chấp những khác biệt nằm
phía dước các hệ thống phần mềm GIS. OGC cung cấp cấu trúc hình thức để đạt được
sự thống nhất về các giao tiếp chung này.” (David Blasby)
Trên cơ sở nhận định này, mục tiêu bao trùm và dài hạn của OGC là:
“The full integration of geospatial data and geoprocessing resources into mainstream
computing and the widespread use of interoperable geoprocessing software and
geodata products throughtout the information infrastructure.” (Open GIS Consortium
Inc., 1999, Topic 0)
Tạm dịch:
“Tích hợp hoàn chỉnh các dữ liệu không gian địa lý và các cách xử lý thông tin địa lý
vào một luồng tính toán chính, và sử dụng phổ biến các sản phẩm dữ liệu địa lý và
phần mềm xử lý thông tin địa lý trong suốt cơ sở hạ tầng về thông tin.” (Open GIS
Consortium., 1999, Topic 0)
Theo ESRI (2003), việc tích hợp vào luồng tính toán chính mang ý nghĩa mở rộng
phạm vi trao đổi ứng dụng GIS ở mức tổ chức lớn hơn, chia sẽ dữ liệu không gian địa
lý không chỉ giữa các công nghệ GIS mà còn với các ứng dụng không phải GIS trên
những nền tảng khác nhau, và khả năng làm việc phối hợp giữa các chuẩn GIS với các
Trang 15
chuẩn IT công nghiệp.
Chương 1: OpenGis – Các khái niệm
Công việc của OGC là xây dựng và công bố các đặc tả mang tính mở cho các giao tiếp,
lược đồ và kiến trúc nhằm thúc đẩy khả năng tương thích giữa các kho dữ liệu không
gian địa lý, các ứng dụng và dịch vụ GIS không đồng nhất.
1.2.2 Định nghĩa OpenGIS
Các đặc tả mở được tạo bởi OGC được gọi là các đặc tả OpenGIS (Open GIS
Specifications). Vậy Open GIS là gì?
OpenGIS được định nghĩa là:
“Open and interoperable geoprocessing” or “The ability to share heterogeneous
geodata and geoprocessing resources transparently in a networked environment.”
(David, 2000)
Tạm dịch:
“Việc xử lý dữ liệu địa lý phải có tính mở và có khả năng làm việc liên thông” hoặc
“Khả năng chia sẻ một cách trong suốt các dữ liệu địa lý không đồng nhất và các tài
nguyên xử lý về mặt địa lý trong môi trường mạng.” (Dương Anh Đức)
Hai khái niệm “mở” (open) và “khả năng làm việc liên thông” (interoperability) là hai
khái niệm trung tâmcủa OpenGIS.
Mở được hiểu là nhiều thành phần tham gia soạn thảo các đặc tả, và các kết •
quả đặc tả được tự do tham khảo và sử dụng.
• Khả năng làm việc liên thông là khả năng tương thích của các ứng dụng nhằm
khắc phục những trở ngại do sự không dồng nhất các môi trường xử lý cũng
như sự không đồng nhất về dữ liệu.
Tóm lại, có thể nói rằng các đặc tả OpenGIS được xây dựng nhằm giúp cho việc truy
cập các dữ liệu không gian địa lý và các dịch vụ xử lý dữ liệu trở nên trong suốt trong
Trang 16
môi trường làm việc mạng.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Chương 2 : Hệ Thống Hỗ trợ Phân tích Tài nguyên Địa lý
Chương 2 giới thiệu về phần mềm GRASS (The Geogaphic ResourcesAnalysis
Support System), là một hệ thống hỗ trợ phân tích tài nguyên địa lý. Đề cập một cách
khái quát về khía cạnh sử dụng cũng như trong lãnh vực lập trình .
2.1 Sơ lược về GRASS Là một hệ thống thông tin địa lý (GIS – Geographic information system), phát triển
theo chuẩn của OpenGIS, nguyên gốc được thiết kế và phát triển bởi những nhà nghiên
cứu tại Phòng Thí nghiệm Xây dựng của quân đội Mỹ (US Army Construction
Engineering Research Laboratory - USACERL) và ngày nay, nó được hỗ trợ bởi nhóm
phát triển GRASS có tổng hành dinh tại ITC-irst, Trento Italy) và Đại học Baylor,
Waco (Mỹ).
GRASS là một phần mềm mã nguồn mở (GNU – General Public Licence), được phát
hành lần đầu năm 1985. Phát triển trong hơn 20 năm qua, kích thước GRASS vào
khoảng 100 MB và là một bộ thư viện lớn để phục vụ việc xây dựng các ứng dụng
GIS. GRASS được viết bằng ngôn ngữ C (khoảng 1,5 triệu dòng mã lệnh) và có thể
được biên dịch trên các hệ điều hành phát triển trên nền Unix như SUN Solaris,
SunOS, HP, SCO, Linux, DEC Alpha v.v.. và có thể chạy trên Windows thông qua môi
trường giả lập Cygwin (chương trình giả lập LINUX/UNIX trên nền Windows)
GRASS có khả năng lưu trữ, phân tích và hiển thị một cách sinh động dữ liệu không
gian đã được số hoá. Hiện tại, phiên bản GRASS đã ra đến 5.x và là một trong mười
phần mềm mã nguồn mở có qui mô lớn nhất hiện nay . Đã có nhiều tổ chức, chính phủ,
trường học và công ty sử dụng thư viện GRASS để phát triển những ứng dụng chuyên
Trang 17
biệt cho riêng mình.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Những đối tượng GRASS hướng đến là các nhà qui hoạch, sinh thái học, địa chất học,
địa lý học và những kỹ sư trắc địa vẽ bản đồ, tuy nhiên người sẽ trực tiếp sử dụng
GRASS lại là các lập trình viên. Hầu hết các đối tượng GRASS hướng đến đều có
trình độ tin học hạn chế, họ tự mình không thể xây dựng một chương trình tin học phức
tạp liên quan đến GIS để phục vụ công việc của bản thân, tuy rằng công việc chuyên
môn rất cần sự hỗ trợ của những phần mềm tin học như vậy. GRASS cung cấp một bộ
hàm), và bản thân GRASS cũng dựa trên bộ thư viện này để phát triển một số chức
thư viện để xây dựng ứng dụng GIS tương đối đầy đủ gọi là GISLIB (khoảng trên 800
năng cơ bản về GIS. Việc xây dựng một hệ GIS thật sự rất phức tạp nếu bắt tay từ đầu,
và vì thế, nhờ sự hỗ trợ của bộ thư viện này lập trình viên sẽ có thể nhanh chóng xây
dựng được các ứng dụng GIS hỗ trợ cho các đối tượng người dùng trên một cách dễ
dàng và nhanh chóng.
GRASS được thiết kế và phát triển cho nhiều mức độ sử dụng khác nhau, ở thời điểm
hiện tại có thể phân chia như sau :
• Mức chuyên biệt hoá : cho những người dùng mới học cách sử dụng, trình
độ tin học không cao. GRASS hiện tại hỗ trợ giao tiếp người dùng thông
qua giao diện đồ họa được viết bằng script TCL/TK. Cho phép xây dựng
nên các command truy vấn thông qua menu, dialog. Giao diện này thực chất
là lớp vỏ bọc cho những command chuyên biệt bên dưới.
• Mức command, gõ lệnh trực tiếp : đây là mức thông dụng nhất và được sử
dụng nhiều nhất. Trên môi trường LINUX/UNIX việc gõ command sẽ giúp
thao tác nhanh với hệ điều hành rất nhiều so với giao tiếp giao diện đồ họa.
GRASS ở mức giao tiếp này hỗ trợ người dùng gõ command trực tiếp để
truy vấn và sử dụng.
• Mức lập trình : đây là những developer, có trình độ tin học cao. Sử dụng
Trang 18
những bộ thư viện được cung cấp sẵn của GRASS để phát triển nên những
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
ứng dụng cho bản thân. Ràng buộc là các developer phải sử dụng những
hàm đã được hỗ trợ (nếu có) để mở rộng và phát triển, không viết lại những
gì đã có để tránh trùng lắp và bug
• Mức xây dựng thư viện : đây là công việc của nhóm phát triển GRASS đang
làm. Họ có trách nhiệm duy trì sự ổn định, phát hiện sửa chữa những lỗi và
đảm bảo một nền tảng thư viện hàm tốt để các ứng dụng được phát triển và
mở rộng trên đó.
GRASS hỗ trợ các chức năng chính yếu :
• Phân tích dữ liệu Raster (Raster Analysis)
• Phân tích dữ liệu Vector (Vector Analysis)
• Phân tích dữ liệu Điểm (Point Analysis)
• Xử lý hình ảnh (Image Process)
• Phân tích DTM ( DTM – Analysis)
• Hiển thị thông tin (Screen Displaying)
• Tạo lập bảng đồ (map creation)
• Hỗ trợ SQL ( PostgreSQL, MySQL ..)
• Các module khác (được các nhóm khác xây dựng và gắn vào)
2.2 Kiến trúc GRASS Ở mức độ tổng quan, có thể mô tả kiến trúc của bộ thư viện GRASS như hình vẽ sau :
Trang 19
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
GRASS GIS LIB
Lôùp 0
Lôùp 1
Döõ lieäu RASTER
Döõ lieäu VECTOR
Döõ lieäu POINT
Lôùp 2
Xöû lyù hình aûnh
Phaân tích DTM
Quaûn lyù cô sôû döõ lieäu
Nhöõng module khaùc
Hình 2 - 1 Mô hình kiến trúc GRASS
GRASS được viết theo bằng C nên hoàn toàn không có yếu tố hướng đối tượng trong
kiến trúc. Các chức năng được đóng lại thành các gói. Theo chiều mũi tên, các gói
được phân thành kiến trúc lớp như trên, những gói thuộc lớp cao sẽ sử dụng các chức
năng do các gói ở lớp thấp cung cấp.
Những module khác có thể là các hỗ trợ phụ thêm cho GRASS như giao tiếp ODBC
với hệ quản trị cơ sở dữ liệu Postgres, cung cấp nơi lưu trữ, truy vấn cho cơ sở dữ liệu
không gian...
2.3 Định dạng dữ liệu GRASS lưu trữ dữ liệu theo một tổ chức thư mục được phân cấp được qui ước và mỗi
loại dữ liệu có định dạng lưu trữ xác định. Dữ liệu vector (vector data) được lưu theo
định dạng nhị phân, dữ liệu điểm (site / point data) được lưu theo định dạng ASCII và
dữ liệu ảnh (raster/imagery data) được lưu theo định dạng nhị phân và được nén. Về
phương diện lập trình GRASS được cung cấp thư viện GIS Library dùng để giao tiếp
với cơ sở dữ liệu của GRASS. Thư viện GIS Library cung cấp đủ các hàm khiến cho
Trang 20
lập trình viên có thể không cần phải hiểu cấu trúc của CSDL lưu bên dưới. Thư viện
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
GRASS dùng các biến môi trường (environment variable) để thiết lập các thông số cho
các hàm thư viện GIS Library truy xuất.
GRASS hỗ trợ 3 định dạng dữ liệu :
(cid:153) Dữ liệu Raster : là kiểu dữ liệu dạng pixel, có thể là các ảnh TIFF, GIF, PPM, ảnh
chụp vệ tinh …
Hỗ trợ import các định dạng :
(X Y Z , Z trong khoảng -2E7 đến 2 E7) 1. ASCII
2. TIFF (8 bit)
3. GIF (8 bit)
4. PPM (24 bit)
5. SUN Raster (8 bit)
6. NHAP ( ảnh không gian)
7. BIL/BSQ (ảnh vệ tinh)
8. LANDSAT TM, MSS (ảnh vệ tinh)
9. SPOT (ảnh vệ tinh)
Hỗ trợ kết xuất từ Raster ra các định dạng như :
1. ASCII (X Y Z , Z trong khoảng -2E7 đến 2 E7)
2. PPM (24 bit)
3. PPM/3 (24 bit)
4. TGA (24 bit)
Trang 21
5. TIFF (8 bit)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
(cid:153) Dữ liệu Vector : dữ liệu thể hiện hình dạng vật lý bên ngoài của đối tượng như :
dòng sông, đường xá, hồ nước hoặc cánh đồng … Được định dạng theo kiểu vector.
Hỗ trợ import các định dạng như :
1. ASCII vectorformat
2. ARC/INFO (các file có phần mở rộng .arc, .line, .point và .textlabel )
3. DXF
4. DXF3D
5. DLG
6. IDRISI
7. TIGER
Hỗ trợ kết xuất từ dữ liệu vector ra các định dạng
1. ASCII vectorformat
2. ARC/INFO
3. DXF
4. IDRISI
5. MOSS
(cid:153) Dữ liệu điểm (Point data): trong GRASS được gọi là “sites”. Dữ liệu điểm có thể là
độ cao, lượng mưa ở một toạ độ xác định. Gọi là điểm vì thông tin thể hiện cho một toạ
độ xác định trên bản đồ
Trang 22
Định dạng hỗ trợ import và kết xuất là : ASCII format
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.4 Tổ chức lưu trữ dữ liệu của GRASS
2.4.1 GISDBASE :
Cơ sở dữ liệu trong GRASS sử dụng kiến trúc thư mục kiểu UNIX. Mức cao nhất được
gọi là GISDBASE, người dùng phải cung cấp thông tin này khi đăng nhập sử dụng
GRASS và thông tin sẽ được chứa trong biến môi trường GISDBASE. Truy xuất lại
thông tin này, ta dùng hàm G_gisdbase
2.4.2 LOCATION :
Thư mục con của GISDBASE là Location, có thể xem Location là những cơ sở dữ liệu
độc lập nhau của các vùng khác nhau và GISDBASE là tập các cơ sở dữ liệu mà
GRASS hiện đang được dùng để quản lý.
Người dùng phải xác lập Location sẽ làm việc khi đăng nhập sử dụng GRASS, thông
tin này sau đó sẽ được chứa trong biến môi trường LOCATION_NAME, và được trả
về khi sử dụng hàm G_location để truy vấn.
Trong một phiên làm việc, GRASS chỉ có thể làm việc với một Location duy nhất
GISDBASE
LOCATION .4
LOCATION .1
LOCATION .2
LOCATION .1
trong số những Location mà GISDBASE quản lý.
Hình 2 - 2 Minh họa cấu trúc lưu trữ của GISDBASE trên đĩa
Trang 23
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.4.3 MAPSETS
Thư mục con của Location là mapset (tập bản đồ). Người dùng phải đăng ký mapset sẽ
sử dụng trong Location cho GRASS khi đăng nhập. Mapset được chọn sẽ đựơc lưu
trong biến môi trường MAPSET và giá trị biến môi trường này được truy xuất thông
LOCATION
PERMANENT
….
MAPSET .2
MAPSET .1
qua G_mapset
Hình 2 - 3 Minh họa cấu trúc lưu trữ của LOCATION trên đĩa
Người dùng chỉ được sửa đổi đối với những mapset được tạo ra bởi chính người dùng.
Đối với những mapset khác, người dùng chỉ có thể xem nhưng không được thực hiện
việc sửa đổi (tuy nhiên, nếu chủ nhân của mapset không cho xem, bằng cách đặt quyền
sử dụng file thông qua Unix File System, thì ta cũng không xem được các mapset này).
Vậy đường dẫn đến một Mapset là : GISDBASE/LOCATION/MAPSET. Thông tin
này có thể lấy ra thông qua hàm G_location_path
Cấu trúc Mapset bao gồm : các file và các thư mục con khác (được gọi là các element,
Trang 24
trong sơ đồ các element được vẽ với dấu /).
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
MAPSET
SEARCH_PATH
WIND
cats/
cell/
paints/
….
Hình 2 - 4 Minh họa cấu trúc lưu trữ của MAPSET trên đĩa
Các file trong mapset
• GROUP : nhóm hình ảnh hiện tại (current imagery group), được dùng bởi
các hàm xử lý hình ảnh (imagery function).
• SEARCH_PATH : đường dẫn tìm kiếm của Mapset (mapset search path),
đựơc tạo và sửa đổi bởi lệnh g.mapsets. Nó chứa bên trong danh sách các
mapset có thể được sử dụng để tìm kiếm các file cơ sở dữ liệu. Khi người
dùng gõ vào tên một một file cơ sở dữ liệu mà không ghi rõ thuộc mapset
nào, thông tin đó sẽ được tìm kiếm trong file SEARCH_PATH này.
: khu vực hiện tại (current region), file được tạo và sửa đổi bởi • WIND
lệnh g.region, nội dung của WIND được lấy ra bởi lệnh G_get_window.
• Các ELEMENTS : Các element này không được tạo khi mapset được tạo
mà các command của GRASS sẽ tạo động khi nó tham chiếu đến (ví dụ :
g.ask). Vì các element không chắc chắn đã tồn tại, nên ta phải luôn kiểm tra
Trang 25
sự hiện diện của nó trước khi thực hiện các thao tác.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Các elements Chức năng
cell file nhị phân raster (số nguyên – INT)
fcell file nhị phân raster (số thực –
FLOAT/DOUBLE)
cellhd file header cho các raster map
cats Thông tin được phân loại của các raster
map (category raster map information)
colr Bảng màu của raster map
colr2 Bảng màu thứ hai của raster map
cell_misc Những file linh tinh khác phục vụ cho
raster map
hist File lưu các thông tin “lịch sử” của
raster map
dig Dữ liệu nhị phân vector (binary vector
data)
dig_ascii Dữ liệu dưới dạng ascii của vector (ascii
vector data)
dig_att các thuộc tính vector được hỗ trợ
Trang 26
(vector attribute support)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
dig_cats danh mục các label của vector được hỗ
trợ (vector category label support)
dig_plus đồ hình vector được hỗ trợ (vector
topology support)
reg các đăng ký (registration)
arc các file ARC/INFO là những file không
được tạo tự động. Dùng cho việc trao
đổi dữ liệu (data-exchange)
bdlg File nhị phân dlg, dùng cho việc trao
đổi dữ liệu
dlg file ascii dlg, dùng cho việc trao đổi dữ
liệu
dxf file ascii DXF, dùng cho việc trao đổi
dữ liệu
camera dùng bởi hàm i.ortho.photo, là file đặc
tả camera
icons những file biểu tượng, được dùng bởi
hàm p.map
group dữ liệu hỗ trợ cho các nhóm hàm xử lý
Trang 27
hình ảnh
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
site_lists danh sách các site của module liên quan
Windows vùng được định nghĩa trước (predefine
region)
COMBINE dùng trong script r.combine
WEIGHT dùng trong script r.weight
Mỗi location đều có những dữ liệu mapset thuộc loại cố định (PERMANENT
MAPSET). Mapset này chứa các file dữ liệu raster và vector nguyên gốc không được
phép sửa đổi và các file đặc biệt khác.
• MYNAME : mô tả thông tin về location. Có thể truy xuất thông qua hàm
G_myname
• DEFAULT_WIND : mô tả region mặc định cho location, được trả về thông
qua hàm G_get_default_window. File này được dùng để khởi tạo WIND file
khi GRASS tạo mới một mapset trong Location.
• PROJ_INFO : chứa các thông tin về project
• PROJ_UNITS : chứa thông tin về các unit của project
Ràng buộc khi sử dụng cơ sở dữ liệu mapset
Dựa trên ba ràng buộc cơ bản :
1. Người sử dụng chỉ được chọn mapset đó để làm việc nếu đó là chủ nhân của
mapset đó
Trang 28
2. GRASS chỉ tạo và sử đổi file chỉ trên mapset hiện tại được chọn
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
3. Tất cả các file trong các mapset đều có thể được đọc bởi những người sử dụng
không phải chủ nhân của nó (thông qua MAPSET SEARCH_PATH để truy
xuất), nếu chủ nhân của các mapset này “chia sẻ” , cho phép các user khác được
xem (thông qua cơ chế UNIX file permission)
2.4.4 REGION và MASK
GRASS cung cấp hai cơ chế cho phép người dùng lựa chọn khu vực sẽ quan sát và
phân tích dữ liệu của họ, được gọi là lựa chọn theo kiểu “khu vực” (region) và lựa chọn
theo kiểu “mặt nạ” (mask). Người sử dụng định nghĩa một khu vực hình chữ nhật để
tạo ra một “lựa chọn theo kiểu khu vực” (region) và sau đó có thể tuỳ ý giới hạn lại bớt
khu vực được chọn đó bằng một “mặt nạ” (mask). Dữ liệu về region và mask sẽ được
tự động lưu trữ vào cơ sở dữ liệu GRASS trong MAPSET hiện tại được người sử dụng
chọn lựa.
Các module của GRASS tự động làm việc với những dữ liệu nằm trong region đã được
chọn, nếu có thêm mask thì chỉ những dữ liệu trong region sau khi vượt được qua lớp
“mặt nạ“ sẽ được chọn để xử lý.
(cid:132) REGION
Để chọn khu vực làm việc, người sử dụng thao tác qua lệnh g.region, hoặc d.zoom, và
những thông tin này sau đó được lưu trong file WIND của MAPSET. File này không
chỉ xác lập sự giới hạn của khu vực địa lý được chọn trong một khuôn viên hình chữ
nhật mà dựa trên độ phân giải của khu vực đó, một cách ngầm định GRASS sẽ phân
khu vực thành những cell hình chữ nhật có cùng kích thước.
File WIND chứa những thông tin sau :
north: 4660000.00
south: 4570000.00
Trang 29
east : 770000.00
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
west : 710000.00
e-w resol: 50.00
n-s resol: 100.00
rows: 900
cols: 1200
proj: 1
zone: 18
north, south, east, west : tọa độ bốn góc định ra khu vực làm việc
rows, cols : số lượng dòng và cột được chia ra trong khu vực làm việc
e-w resol, n-s resol : Độ phân giải theo chiều rộng và chiều dài của khu vực làm việc.
Đây chính là kích thước của mỗi cell được chia nhỏ ra từ khu vực làm việc ban đầu. e-
w resol là chiều dài của cell và n-s resol là chiều rộng của cell.
proj, zone :
proj giúp xác định loại toạ độ được sử dụng :
0 : không sử dụng tọa độ (x,y), loại bản đồ image
1 : UTM
2 : State Plane
3 : Kinh độ, vĩ độ (Latitude Longitude)
Trang 30
zone xác định trường của proj, trong ví dụ trên là zone 18
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
(cid:132) MASK
Bên cạnh việc chọn khu vực làm việc (region), người sử dụng có thể dùng lệnh r.mask
để tạo mặt nạ. Mặt nạ này sẽ được lưu thành file MASK trong thư mục MAPSET hiện
tại của người dùng.
INPUT
MASK
OUTPUT
3 4 4
0 4 4
0 1 1
3 3 4
3 3 0
1 1 0
+
=
2 3 3
2 0 0
1 0 0
Mặt nạ hoạt động như một bộ lọc khi đọc dữ liệu từ file raster.
Hình 2 - 5 Minh họa cơ chế MASK của GRASS
GRASS 5 Không hỗ trợ mặt nạ dấu chấm động..
2.4.5 Các biến môi trường sử dụng trong GRASS
Các module của GRASS được viết độc lập với cơ sở dữ liệu được sử dụng bởi người
dùng, cơ sở dữ liệu đó được lưu ở đâu, cũng như vị trí các module làm việc của
GRASS .. Các thông tin này cũng rất cần cho quá trình xử lý, GRASS sẽ tạo các biến
môi trường để ghi nhận và lấy ra khi cần thiết.
Khi được khởi động bằng lệnh grass5.0, GRASS lập tức khởi tạo thông tin cho các
biến môi trường sau
• GISBASE : là đường dẫn tuyệt đối đến thư mục chứa cài đặt của GRASS.
• 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 (khoá) của chương trình.
• 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
Trang 31
.grassrc5 để khởi tạo các biến môi trường khác được lưu trong đó.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
• GISDBASE: biến này ghi nhận đường dẫn đến thư mục cài đặt cơ sở dữ
liệu của GRASS, thông tin biến này được đọc lên từ file .grassrc5 và được
GRASS khởi tạo thành biến môi trường
• LOCATION_NAME: biến này ghi nhận đường dẫn đến thư mục
LOCATION sẽ làm việc, thông tin biến này được đọc lên từ file .grassrc5
và được GRASS khởi tạo thành biến môi trường.
• MAPSET : biến này ghi nhận đường dẫn đến thư mục MAPSET sẽ làm
việc, thông tin biến này được đọc lên từ file .grassrc5 và được GRASS khởi
tạo thành biến môi trường.
• MONITOR : Monitor đang được chọn để hiện thi hiện tại
• PAINTER : thiết bị hiện thị đang được chọn
• DIGITIZER : digitizer đang được chọn
Các biến môi trường được lưu trong .grassrc5 được gọi là biến môi trường GRASS và
được thao tác thông qua hai hàm thư viện : G_getenv và G_setenv. Hai hàm này đảm
bảo các thông tin biến môi trường GRASS được lưu xuống file khi có sự thay đổi.
2.5 Dữ liệu RASTER
2.5.1 Ý niệm sơ lược
Dữ liệu dạng này có thể xem là được kết hợp lại từ một ma trận các ô. Nó có thể là một
bản đồ giấy, một ảnh vệ tinh, hoặc một bản đồ có được do tổng hợp từ nhiều bản đồ
khác.
Bản đồ được phân rã thành ma trận, gồm nhiều ô, mỗi ô được gọi là một grid cell. Ô
grid cell là đơn vị nguyên tố của bản đồ, thể hiện một dữ liệu đã được qui ước và đánh
số thành danh mục.
Trang 32
Ví dụ : Raster map sau
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2
3
3
3
4
4
2
2
3
3
4
4
2
2
3
3
4
4
3
3
1
1
3
4
3
1
1
1
3
4
3
3
1
1
4
4
Raster map về sự phân bố đất đai
Với danh mục được qui định là
1 : Thành thị
2 : Đồng cỏ
3 : Rừng
4 : Đầm lầy
Mỗi ô, bên cạnh dữ liệu thể hiện tọa độ, còn đi kèm theo dữ liệu thể hiện ý nghĩa của
cell (trong bản đồ ví dụ bên trên là các giá trị 1, 2, 3, 4). Người dùng có thể gán màu
sắc tương ứng cho từng lọai giá trị cell tùy thích (trong ví dụ trên màu đen cho giá trị
1). Từ đó sẽ có hai khả năng xảy, hoặc là ta giữ nguyên màu sắc nguyên thủy của ô từ
bản đồ gốc được đưa vào để hiện thị, hoặc là ta gán giá trị màu thể hiện cho từng giá trị
ô (điều này có thể làm thay đổi hình ảnh được hiện thị lên của bản đồ so với bản đồ gốc
Trang 33
được nhập vào).
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.5.2 Hệ thống tập tin raster
Để phục vụ cho một bản đồ raster map, thông tin được phân rã và lưu trên nhiều file.
Các file này có tên giống nhau nhưng được chứa trong những thư mục khác nhau trong
thư mục mapset ( tên thư mục sẽ thể hiện nội dung thông tin phân rã của file đó).
Thư mục Thông tin
cell File nhị phân thể hiện thông tin của các raster cell ( được thể
hiện bằng số nguyên int)
fcell File nhị phân thể hiện thông tin của các raster cell ( được thể
hiện bằng số thực float/double)
cellhd các file header của raster
Danh mục (category information) của các raster map cats
colr bảng màu của raster map
colr2 bảng màu thay thế của raster map
hist File lưu vết, lịch sử của raster map
cell_mísc Những thông tin khác (linh tinh, không thật sự quan trọng)
Ví dụ : raster map về đất đai (soils), có thể có các file sau : cell/soils, cellhd/soils,
colr/soils, và cats/soils.
Những thư mục phân rã này được gọi là các “thành phần dữ liệu” (database elements).
2.5.3 Các thao tác quan trọng
(cid:153) Nhận dữ liệu từ một tập tin bên ngoài (import data)
Trang 34
Tùy theo lọai dữ liệu, ta dùng các lệnh sau
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Dữ liệu là file ảnh định dạng ppm
$d.in.ppm
Dữ liệu là file ảnh định dạng ASCII
$d.in.ascii
(cid:153) Kết xuất dữ liệu (export data)
Tùy theo lọai dữ liệu muốn kết xuất, ta dùng các lệnh sau
Dữ liệu kết xuất là file ảnh định dạng ppm
$d.out.ppm
Dữ liệu kết xuất là file ảnh định dạng ppm
$d.out.ascii > textfile.asc
(cid:153) Hiện thị dữ liệu raster
d.rast
2.6 Dữ liệu VECTOR (VECTOR DATA)
2.6.1 Ý niệm sơ lược
Dữ liệu vector được sử dụng đối với những đối tượng có kiến trúc và hình thể, nghĩa là
trong thực tế các đối tượng này có hình dạng và kích thước xác định. GRASS sử dụng
dữ liệu vector để “mã hoá” đường biên bao bọc hình dạng của kiến trúc hoặc vật thể
cần thể hiện.
Ví dụ : những đối tượng mà dữ liệu vector có thể dùng để “mã hoá” là hệ thống
đường xá, cầu cống, núi non, hồ nước, cánh đồng, sơ đồ qui hoạch thành phố ...
Nói chung, những đối tượng dạng này có đặc điểm là hình dạng của chúng có
Trang 35
thể dùng những đường liền nét để thể hiện.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.6.2 Hệ thống tập tin vector
Bản đồ Vector trong GRASS được lưu trữ thành các cung. Cung được tạo thành từ một
loạt toạ độ (x, y). Hai điểm đầu cuối của một cung được gọi là nốt ( node). Hai cặp
(x,y) kề nhau trong cung được gọi là một phân đoạn (segment) của cung.
(cid:153) Những cung có thể biệt lập hoặc kết hợp với nhau tạo nên những hình thể trên
bản đồ : đường thẳng ( sông ngòi, đường xá ...) , các khu vực ..
(cid:153) Các cung tạo nên những đường liền nét (sông ngòi, đường xá .. ) được gọi là các
“đường liền” (lines)
(cid:153) Các cung phân ranh nên một vùng, khu vực được gọi là các “đường ranh bao
bọc” (area lines).
Mỗi loại thông tin hiện thị trên bản đồ vector được gán với một con số nguyên gọi là số
chỉ mục tương tự kỹ thuật dùng cho raster map layer (category number).
Thông tin của một bản đồ vector trong GRASS được chứa trong nhiều file dữ liệu.
Tương tự như raster map layer, các file này có tên trùng nhau nhưng được chứa trong
các thư mục con khác nhau trong thư mục mapset, mỗi file này biểu thị cho một thông
tin đã được phân rã.
Thư mục Chức năng
dig file nhị phân, chứa thông tin cung
dig_ascii file ascii, chứa thông tin cung
dig_att file phân loại các thuộc tính ( category
attribute file)
Trang 36
dig_cats Tên các danh mục phân loại của vector
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
(vector category labels)
dig_plus File chỉ mục của dữ liệu vector
vector pointer/ index file
reg digitizer registration points : những
điểm đã được đăng ký
Ví dụ: bản đồ vector về đất đai (soils) có thể được lưu trữ theo cấu trúc sau : dig/soils,
dig_plus/soils, dig_ascii/soils, dig_cats/soils và reg/soils ..
Vector file còn được gọi là file số hoá (digit file), vì nó được tạo và thao tác bởi thư
viện các hàm digit : v.digit ..
2.6.3 Các thao tác quan trọng
(cid:153) Nhận dữ liệu từ một tập tin bên ngoài (import data)
Dùng lệnh
$v.in.arc
(cid:153) Kết xuất dữ liệu (export data)
(cid:145) Theo định dạng ARC/INFO
Dùng lệnh
$v.out.arc
và trả lời các tham số cho lệnh
(cid:145) Theo định dạng DFX
Trang 37
Dùng lệnh
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
$v.out.dfx
và trả lời các tham số cho lệnh
(cid:153) Hiện thị dữ liệu vector
Dùng lệnh
$d.vect
và trả lời các tham số cho lệnh
(cid:153) Kết xuất sang các định dạng dữ liệu khác của GRASS
Ta dùng lệnh sau để kết xuất sang dữ liệu định dạng vector
$v.to.vect
Ta dùng lệnh sau để kết xuất sang dữ liệu định dạng vector
$v.to.rast
2.7 Dữ liệu điểm (POINT/SITE DATA)
2.7.1 Ý niệm sơ lược
Trong nghiên cứu về môi trường, có những loại dữ liệu chỉ liên quan đến một vị
trí hay một khu vực rất nhỏ : số liệu về lượng mưa ghi nhận được một trạm quan
sát, số liệu về độ cao đo được tại một điểm ... Khi biểu hiện lên trên bản đồ,
người ta dùng một chấm để thể hiện, kèm theo đó là màu sắc và các số liệu.
Những dữ liệu dạng này được gọi là dữ liệu điểm (point data) và GRASS có
thêm một tên gọi khác là dữ liệu nơi chốn (site data). Loại dữ liệu này có thể
hiểu một cách nôm na là dữ liệu “không có hình thể”, tức là trong thực tế nó
Trang 38
không có hình dạng cụ thể và ta qui ước dùng một điểm để biểu diễn nó.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Hình 2 - 6 Minh họa dữ liệu điểm – POINT/SITE
2.7.2 Hệ thống tập tin site
Dữ liệu điểm được lưu trong các tập tin định dạng ASCII, gọi là các tập tin site
hoặc tập tin danh sách (list file). Những tập tin này được xử lý bởi các mô-đun
xử lý dữ liệu nơi chốn (module sites) trong thư viện GRASS.
Trường name : Dòng này chứa tên của file site, và được in trên tất cả các báo
cáo được tạo bởi module s.menu. Chữ name phải được viết thường. Dòng thông
tin name này có thể được để trống vì s.menu sẽ tự động thêm tên mặc định là tên
của file site.
Trường desc : Dòng này chứa mô tả về file site, chữ desc buộc phải viết
thường. Dòng thông tin này sẽ được in trên tất cả các báo cáo được tạo bởi
module s.menu. Nó có thể được bỏ qua, trong trường hợp này, file site sẽ không
có mô tả
Các trường point : Những dòng còn lại là những record point. Mỗi site được
mô tả bởi một record point và cấu trúc của một record như sau
east|north[|dim]...|#cat %double [%double] @string [@string]
hoặc mô tả về ngày giờ như sau :
Trang 39
east|north[|dim]...|time %double [%double]
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Ví dụ :
name | sample
desc | sample site list
728220 | 5182440 | #27 %1.34 %23.13 @"pH 7.1"
727060 | 5181710 | #28 %2.32 %22.21 @"pH 6.8"
725500 | 5184000 | #29 %4.73 %17.34 @"pH 5.5"
719800 | 5187200 | #30 %3.65 %27.79 @"pH 6.2"
2.7.3 Các thao tác quan trọng
(cid:153) Nhận dữ liệu từ một tập tin bên ngoài (import data)
Ta dùng lệnh sau :
$s.in.ascii
File dữ liệu file theo định dạng UNIX ASCII ( nghĩa là ký tự phân cách dòng
sẽ là \r thay vì \r\n như trong DOS ASCII). Nếu sử dụng file DOS ASCII, ta
có thể dùng lệnh của UNIX để convert lại như sau :
$dos2unix file.asc
(cid:153) Kết xuất dữ liệu ra tập tin dạng text ASCII
Ta dùng lệnh
$s.out.ascii > file.asc
Trong lệnh trên, có một chỉ thị rất LINUX/UNIX đó là “>” dùng để chuyển
nội dung vào một file.
(cid:153) Hiện thị dữ liệu điểm
Trang 40
Ta dùng lệnh
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
$d.sites
(cid:153) Kết xuất sang các định dạng dữ liệu khác của GRASS
Ta dùng lệnh sau để kết xuất sang dữ liệu định dạng vector
$s.to.vect
Ta dùng lệnh sau để kết xuất sang dữ liệu định dạng raster
$s.to.rast
2.8 Các thư viện được cung cấp bởi GRASS (src/libes)
2.8.1 Danh sách
Tên thư viện Ý nghĩa
D Thư viện hiển thị
bitmap Thư viện xử ly bitmap cho X Windows
Bitmap
btree Xử lý b-cây
bwidget Thư viện tcl/tk mở rộng
coorcnv Thư viện hỗ trợ chuyển đổi toạ độ và dữ
liệu
datetime Thư viện xử lý ngày giờ
dbmi Giao diện làm việc với các driver của
Trang 41
các hệ quản trị cơ sở dữ liệu
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
dig_atts Thư viện để đọc và ghi từ các file thuộc
tính của bản đồ (attribute files)
digitizer Thư viện “thô”, đơn giản nhất cung cấp
xử lý chung cho digitizer
Thư viện hiện thị của driver CELL display
Thư viện xử lý cho các file DLG dlg
Thư viện các file hiện thị G3D dspf
Tính toán hình học (geometrical geom
calculations), tính toán cho các phép
toán số nguyên lớn (long –interger), ..
Thư vịên GIS chính yếu của GRASS gis
Các chức năng xử lý tính toán chung gmath
(ma trận, fft ..)
B Cây cho xử lý số nguyên (phát triển ibtree
từ thư viện btree)
Thư viện xử lý các biểu tượng (icon). icon
Thư viện xử lý hình ảnh imagery
Mở rộng của thư viện imagery image3
Trang 42
Thư viện xử lý hình ảnh , hỗ trợ save libimage
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
ảnh ở dạng SGIs RGB.
Thư viện hỗ trợ xây dựng, quản lý danh linkm
sách liên kết (linked-list)
Cơ chế khoá của GRASS đối với các lock
monitor dùng hiện thị và các file
Được chuyển từ thư viện gsurf, cần cho ogsf
NVIZ
Thư viện quản lý project proj
Thư viện hỗ trợ xử lý dữ liệu raster của raster
GRASS
row in/out library rowio
Thư vịên segment segment
Thư viện quản lý curses vask
Thư viện làm việc với dữ liệu vector vect32
Thư viện làm việc với dữ liệu vector vect32_64
32/64 bit của GRASS, được phát triển
trên nền vect32
2.8.2 Giới thiệu sơ bộ hàm và thư viện
Trang 43
(cid:153) Thư viện GIS ( thư viện trung tâm của GRASS)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
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
(cid:145) 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
int G_gisinit (char *program_name)
Ví dụ :
int main (int argc, char **argv)
{
G_gisinit(argv[0]);
}
(cid:145) Cơ chế báo lỗi của thư viện
Chức năng Hàm
int
G_fatal_error (char *message, ...) In thông điệp báo lỗi lên màn hình và
thóat.
Trang 44
Nếu có file GIS_ERROR_LOG trong
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
GISBASE, lỗi sẽ được ghi nhận lại
trong file
int In thông điệp lỗi lên màn hình và tiếp
tục G_warning (char *message, ...)
Nếu có file GIS_ERROR_LOG trong
GISBASE, lỗi sẽ được ghi nhận lại
trong file
void 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 G_set_error_routine (int (*handler)(
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 Reset lại cơ chế xử lý lỗi cũ của thư
viện ( sử dụng hai hàm G_fatal_error G_unset_error_routine (void)
Trang 45
và G_warning)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int flag = 1: in ra thông điệp lỗi và sleep
G_sleep_on_error (int flag)
int - Dùng để “triệt hạ” hàm G_Warning
nếu muốn. (ta sử dụng lại code chương G_suppress_warnings (int flag)
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
(cid:145) 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 * Trả về đường dẫn đến location hiện tại của
Trang 46
database đang làm việc. G_location (void)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
char *
G_location_path (void)
char * Trả ra đường dẫn đến mapset đang làm việc
trong location hiện tại. G_mapset (void)
char * Trả ra dòng tiêu đề của location đang làm việc (
nó đọc từ file MYNAME của MAPSET G_myname (void)
PERMANENT)
char * Trả ra thư mục cài đặt GRASS.
Thư mục cài đặt GRASS sẽ có các thư mục con G_gisbase (void)
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];
Trang 47
sprintf (command, "%s/etc/sroff", G_gisbase( )
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
);
system (command);
char * 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 G_gisdbase (void)
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 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 G_getenv (char *name)
trường được quan trọng đối với thư viện và nó
được lưu trong file .grassrc5 )
int Nếu không truyền name là tên biến môi trường:
G_ _getenv (char *name) + G_getenv : sẽ báo lỗi và gọi exit để thoát
+ G__getenv : chỉ báo lỗi nhưng không thoát
int 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 G_setenv (char *name, char
.grassrc5, để lần sau khi chạy GRASS nó sẽ *value)
được load lên lại. int
Nếu giá trị value là NULL,việc gán biến môi G_ _setenv (char *name,
Trang 48
trường sẽ không được thực hiện. char *value)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
(cid:145) Truy vấn cơ sở dữ liệu GRASS
Hàm Chức năng
Người sử dụng được yêu cầu nhập tên char *
của một file cơ sở dữ liệu đã có. G_ask_old (char *prompt, char
*name, char *element, char *label)
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
>
Người sử dụng được yêu cầu nhập tên
Trang 49
của một file cơ sở dữ liệu chưa có trước char *
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
đó trong mapset. Tên này được dùng để G_ask_new (char *prompt, char
tạo mới file. *name, char *element, char *label)
char * Trả ra tên file hợp lệ.
Người sử dụng nhập vào một tên file, G_ask_any (char *prompt, char
*name, char *element, char *label,
int warn) 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.
Trả ra đường dẫn đến file có tên là char *
“name” trong mapset. G_fully_qualified_name (char *name,
char *mapset)
Trang 50
(cid:145) Tìm file dữ liệu trong CSDL
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Hàm Chức năng
Tìm một file dữ liệu của cơ sở dữ liệu char *
char name[50]; G_find_file (char *element, char
*name, char *mapset) 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 */
Kiểm tra tên file dữ liệu có hợp lệ không. int
1 : hợp lệ G_legal__lename (char *name)
-1 : không hợp lệ
Trang 51
Mở một file dữ liệu để đọc. int
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
File đữ liệu có tên là “name”, nằm trong G_open_old (char *element, char
“mapset” của Location hiện tại và thuộc *name, char *mapset)
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ở.
Mở một file dữ liệu để đọc. FILE *
Các tham số có nội dung giống hàm G_fopen_old (char *element, char
G_open_old *name, char *mapset)
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ở.
Mở file có tên name trong “element” của int
mapset hiện tại theo mode cho phép đọc và G_open_update (char *element,
ghi. char *name)
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
Trang 52
file được mở.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Mở file có tên name trong “element” của FILE *
mapset hiện tại theo mode append. G_fopen_append (char *element,
char *name)
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ở.
Tạo mới và mở file dữ liệu “name” theo int
mode write only, trong thư mục “element” G_open_new (char *element, char
của mapset hiện tại. *name)
Dùng hàm open() để cài đặt. Trả ra –1 nếu
thất bại
Tạo mới và mở file dữ liệu “name” theo FILE *
mode write only, trong thư mục “element” G_fopen_new (char *element, char
của mapset hiện tại *name)
Dùng hàm fpen() để cài đặt. Trả ra NULL
nếu thất bại
Đổi tên một file dữ liệu trong thư mục int
element của mapset. G_rename (char *element, char
Kết quả trả về *old, char *new)
Trang 53
1 nếu thành công
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
0 nếu file old không tồn tại
-1 nếu thất bại
int Xoá file trong thư mục element của mapset
hiện tại. G_remove (char *element, char
Kết quả trả về *name)
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ớ
Giải phóng bộ nhớ được cấp phát bằng hàm int
thư viện của GRASS G_free(void *buf)
Thay đổi kích thước vùng nhớ đã được cấp void *
phát trước đó bằng hàm thư viện của G_realloc (void *ptr, int size)
GRASS
ptr trỏ đến vùng nhớ đã được cấp trước đó
size kích thước mới (tính theo bytes)
Trang 54
Kết quả trả về NULL nếu thất bại, ngược lại
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
là con trỏ đến vùng nhớ đã được cấp phát
Cấp phát một vùng nhớ có kích thước void *
n*size bytes, khởi tạo vùng nhớ với giá trị G_calloc (int n, int size)
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 * 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 G_alloc_vector(int n)
tử.
foat * 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 G_alloc_fvector(int n)
tử.
double ** 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 G_alloc_matrix(int rows, int cols)
tất cả phần tử.
Cấp phát vùng nhớ cho một ma trận float có float **
rows dòng và cols cột, khởi tạo zero cho tất G_alloc_fmatrix(int rows, int cols)
cả phần tử.
int Giải phóng vùng nhớ cho ma trận float đã
cấp G_free_fmatrix(foat **m)
int Giải phóng vùng nhớ cho ma trận double đã
Trang 55
cấp G_free_matrix(double **m)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int Giải phóng vùng nhớ cho mảng double đã
cấp G_free_vector(double *v)
(cid:153) 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”
(cid:145) Vùng (region) được xác lập cho CSDL
Chức năng Hàm
Đọc region được lưu trong file WIND int
của MAPSET hiện tại vào trong struct G_get_window (struct Cell_head
region. *region)
Ghi thông tin của vùng (region) chứa int
Trang 56
trong cấu trúc region truyền cho hàm G_put_window (struct Cell_head
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
vào file WIND của MAPSET hiện tại *region)
int Lấy thông tin mặc định về region của
LOCATION hiện tại được chọn. G_get_default_window (struct
Cell_head *region)
(cid:145) 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
Chức năng Hàm
Thiết lập region ở mức module xử lý. int
Việc thiết lập này không làm thay đổi G_set_window (struct Cell_head
nội dung của file WIND lưu cấu hình *region)
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.
Lấy ra giá trị đã được thiết lập thông int
qua hàm G_set_window bên trên G_get_set_window (struct Cell_head
Trang 57
*region)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
(cid:145) 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)
Trang 58
Tây của đường kinh tuyến chính.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Đó là phương pháp mà GRASS dùng để mã hoá 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ã hoá này
Hàm Chức năng
Chuyển toạ độ được thể hiện trong biến int
east về dạng ASCII và lưu trong buf. G_format_easting (double east, char
Tọa độ biến east là toạ độ Đông. *buf, int projection)
Chuyển toạ độ được thể hiện trong biến int
north về dạng ASCII và lưu trong buf. G_format_northing (double north,
Tọa độ biến east là toạ độ Bắc char *buf, int projection)
Chuyển độ phân giải về dạng mã hoá int
ASCII và lưu kết quả trong buf G_format_resolution (double
resolution, char *buf, int projection)
Chuyển giá trị mã hoá ASCII về toạ độ int
ban đầu, hàm dùng chuyển cho tọa độ G_scan_easting (char *buf, double
Đông *easting, int projection)
Chuyển giá trị mã hoá ASCII về toạ độ int
Trang 59
ban đầu, hàm dùng chuyển cho tọa độ G_scan_northing (char *buf, double Bắc *northing, int projection)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Chuyển dạng mã hoá ASCII của độ int
phân giải về giá trị ban đầu G_scan_resolution (char *buf, double
*resolution, int projection)
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 */
(cid:145)Tính toán diện tích bản đồ kiểu RASTER
Những phép toán hỗ trợ thực hiện việc tính toá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
toá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
Trang 60
được tạo ra bởi vĩ độ đó và các kinh độ là bằng nhau về kích thước.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Dựa vào điều này GRASS cung cấp các hàm thư viện sau
Chức năng Hàm
double
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ị G_area_of_cell_at_row (int row)
này dùng để đo diện tích cho những ô
lưới thuộc cùng một dòng.
Phải được gọi trước khi gọi hàm int
G_area_of_cell_at_row G_begin_cell_area_calculations
(void)
Khởi tạo cho việc tính diện tích một int
ellipse có trục nhỏ là a, tâm sai e2 và s G_begin_zone_area_on_ellipsoid
là gia số cho biết phần ellipse sẽ được (double a, double e2, double s)
tính diện tích ( s =1.0 tính toàn bộ, 0.5
cho một nữa ellipse..)
Diện tích nằm giữa khu vực được xác double
định bởi vĩ độ Bắc và Nam, và lấy theo G_area_for_zone_on_ellipsoid
gia số s được truyền cho hàm (double north, double south)
G_begin_zone_area_on_ellipsoid bên
Trang 61
trên
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Khởi tạo việc tính diện tích cho một mặt int
cầu, với r là bán kính và s là gia số cho G_begin_zone_area_on_sphere
phép tính một phần của mặt cầu đó (ý (double r, double s)
nghĩa s tương tự hàm
G_begin_zone_area_on_ellipsoid )
double
Tính diện tích mặt cầu của khu vực G_area_for_zone_on_sphere (double
nằm giữa vĩ tuyến Bắc và Nam. north, double south)
(cid:145) 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 đa giác cần tính có thể xem là nằm trên bề mặt của một ellipse xác định.
GRASS cung cấp những hàm để tính diện tích cho những đa giác cả trong trường hợp
dùng toạ độ phẳng và toạ độ theo kinh độ - vĩ độ.
Hàm Chức năng
int Khởi động việc tính diện tích cho một
đa giác G_begin_polygon_area_calculations
Trang 62
double Tính diện tích cho một đa giác.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Kết quả trả về có đơn vị tính là mét G_area_of_polygon (double *x,
vuông. double *y, int n)
Truyền vào mảng các toạ độ x, mảng
các toạ độ y và n là số cặp điểm (x,y)
đựơc truyền vào.
Khởi động việc tính diện tích cho một int
ellipse có trục chính là a và tâm sai là G_begin_ellipsoid_polygon_area
e2 (double a, double e2)
double Tính diện tích của đa giác được định n
cặp điểm theo toạ độ kinh độ vĩ độ, G_ellipsoid_polygon_area (double
được truyền vào riêng biệt theo hai *lon, double *lat, int n)
mảng lat (vĩ độ) và long (kinh độ)
Đơn vị của kết quả tính là met vuông
(cid:145)Tính khoảng cách
Việc tính khoảng cách giữa hai điểm cũng gặp khó khăn như đối với tính diện tích bên
trên khi dùng toạ độ theo kinh độ và vĩ độ. GRASS cung cấp hàm để làm việc cho cả
toạ độ phẳng và toạ độ theo kinh độ và vĩ độ
Hàm Chức năng
int Khởi động việc tính toán khoảng cách
Trang 63
G_begin_distance_calculations (void)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Trả ra khoảng cách giữa hai điểm có toạ double
độ là x1,y1 và x2,y2. Đơn vị tính là mét G_distance (double x1, y1, x2, y2)
int Bắt đầu việc tính toán dựa trên một
ellipse có trục lớn a và tâm sai e2. Chỉ G_begin_geodesic_distance (double a,
dùng tính đối với toạ độ theo kinh độ và double e2)
vĩ độ.
double Đo khoảng cách giữa hai toạ độ được
tính theo kinh độ và vĩ độ. Đơn vị tính G_geodesic_distance (double lon1,
của khoảng cách là mét. double lat1, double lon2, double lat2)
(cid:145)Xử lý đối với file dữ liệu RASTER
File dữ liệu RASTER là trái tim và linh hồn của GRASS (heart and soul). Do đó mà
GRASS cung cấp cả một thư viện hàm để xử lý cho raster file, bao gồm :
• Xác định file dữ liệu raster sẽ được xử lý (do người dùng xác lập đường dẫn
hay được module tự xác định)
• Định vị file raster trong cơ sở dữ liệu.
• Mở file raster
• Cấp phát buffer để giao tiếp IO
• Các thao tác mở , ghi , đọc và đóng
• Hỗ trợ tạo lập file raster
Trang 64
File raster là file nhị phân chứa cấu trúc CELL (được định nghĩ trong file header gis.h)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Hàm Ý nghĩa
Yêu cầu người dùng nhập vào tên của char *
file raster đã tồn tại trong bất kỳ mapset G_ask_cell_old (char *prompt, char
nào trong cơ sở dữ liệu *name)
char * Yêu cầu người dùng nhập vào tên của
file raster đã tồn tại trong mapset hiện G_ask_cell_in_mapset (char
tại trong cơ sở dữ liệu *prompt, char *name)
Yêu cầu người dùng nhập vào tên của char *
file raster chưa có trong mapset hiện tại G_ask_cell_new (char *prompt, char
trong cơ sở dữ liệu *name)
Tìm file raster có tên là “name” trong char *
một “mapset”. Biến mapset là “” sẽ có ý G_find_cell (char *name, char
nghĩa là tìm kiếm trong toàn bộ các *mapset)
mapset hiện hữu trong CSDL. Nếu tìm
thấy trả ra đường dẫn đến mapset đó,
không thì trả ra NULL.
char name[50];
char *mapset;
if ((mapset = G_find_cell(name,"")) =
= NULL)
Trang 65
/* not found */
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
FILE * Tạo lập và mở theo mode write một file
raster mới. G_open_cell_new (char *name)
CELL * Cấp phát bộ nhớ cho một cấu trúc
CELL. Cấu trúc này là cấu trúc dùng để G_allocate_cell_buf (void)
ghi/đọc vào/từ file raster.
int
Gán giá trị 0 cho tất cả các trường trong G_zero_cell_buf (CELL *buf)
CELL
Đọc một row từ file raster int
G_get_map_row (int fd, CELL *cell,
int row)
Đọc một row từ file raster và không sử int
dụng “mặt nạ”. G_get_map_row_nomask (int fd,
CELL *cell, int row)
Ghi vào file raster int
int fd, row, nrows, ncols; G_put_map_row (int fd, CELL *buf)
CELL *buf;
fd =G_open_cell_new(name);
if (fd < 0) ERROR}
Trang 66
buf = G_allocate_cell_buf();
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
ncols =G_window_cols();
nrows = G_window_rows();
for (row = 0; row < nrows; row++)
{
/* prepare data for this row into buf */
/* write the data for the row */
G_put_map_row(fd, buf);
}
Đóng một file raster int
G_close_cell (int fd)
Nếu có lỗi phát sinh trong quá trình xử int
lý, ta dùng hàm này để đóng file raster G_unopen_cell (int fd)
lại.
(cid:145) Các xử lý khác dành cho RASTER
Như đã đề cập bên trên, một bản đồ có nhiều file dữ liệu khác nhau, có cùng tên với
bản đồ phối hợp với nhau để thể hiện, dữ liệu raster cũng vậy. Những file này được gọi
là những “file hỗ trợ”, supported files, đối với RASTER những file hỗ trợ bao gồm :
• File header
• File danh mục (category)
Trang 67
• File lưu bảng màu
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
• File lưu vết (history)
• File lưu phạm vi (range file)
• File histogram
Mỗi loại file hỗ trợ trên có cấu trúc khác nhau và được thao tác bằng những nhóm hàm
khác nhau thiết kế chuyên biệt cho chúng
Ví dụ : file header có hàm
int G_get_cellhd (char *name, char *mapset, struct Cell_Head *cellhd)
dùng để đọc một cấu trúc header
Một số hàm dùng thao tác với các file hỗ trợ :
Ý NGHĨA HÀM
int
Đọc thông tin header của file raster có G_get_cellhd (char *name, char
tên là name trong mapset vào cấu trúc *mapset, struct Cell_Head *cellhd)
Cell_Head
Viết header của bản đồ có tên là name char *
trong mapset hiện tại vào file header. G_put_cellhd (char *name, struct
Cell_Head *cellhd)
Đọc thông tin của file danh mục int
(category files) name trong mapset vào G_read_cats (char *name, char
Trang 68
trong cấu trúc cats. *mapset, struct Categories *cats)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int Viết thông tin trong cấu trúc cats vào
cho file raster có tên name. G_write_cats (char *name, struct
Categories *cats)
char * Tìm trong cấu trúc cats, tại danh mục n
và trả ra con trỏ đến một chuỗi qui ứơc G_get_cat (CELL n, struct
của danh mục đó. Categories *cats)
int Để tạo mới một danh mục, trước hết nó
phải được khởi tạo bằng hàm này. G_init_cats (CELL n, char *title,
struct Categories *cats)
int Đặt chuỗi qui ước (label) cho danh mục
n trong cấu trúc cats (cấu trúc quản lý G_set_cat (CELL n, char *label,
các danh mục) struct Categories *cats)
int Giải phóng vùng nhớ được cấp phát cho
cấu trúc cats. G_free_cats (struct Categories *cats)
int Đọc bảng màu của file raster có tên
name của mapset vào biến cấu trúc G_read_colors (char *name, char
dùng quản lý bảng màu colors. *mapset, struct Colors *colors)
Ghi biến cấu trúc colors dùng quản lý int
bản màu cho file raster name của G_write_colors (char *name, char
Trang 69
mapset *mapset, struct Colors *colors)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int Lấy ra mảng màu cho mảng các giá trị
raster. Hàm nhận vào một mảng (n phần G_lookup_colors (CELL *raster,
tử) các giá trị raster (CELL *raster) và unsigned char *red, unsigned char
trả ra mảng các màu ( 3 mảng) tương *green, unsigned char *blue, set, int
ứng cho các giá trị này. n, struct Colors *colors)
Tìm trong cấu trúc quản lý màu colors int
của file raster và lấy ra 3 thành phần G_get_color (CELL cat, int *red, int
màu RGB : red, green, và blue tương *green, int *blue, struct Colors
ứng cho một giá trị CELL *colors)
int Khởi tạo cho cấu trúc colors.
G_init_colors (struct Colors *colors)
int Giải phóng bộ nhớ được cấp phát cho
cấu trúc colors. G_free_colors (struct Colors *colors)
int Đọc thông tin lưu vết (history info) của
một file raster trong mapset vào cấu trúc G_read_history (char *name, char
quản lý lưu vết history. *mapset, struct History *history)
Viết thông tin lưu vết (history info) của int
một file raster trong mapset vào cấu trúc G_write_history (char *name, struct
Trang 70
quản lý lưu vết history. History *history)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Đọc thông tin về phạm vi của một file int
raster trong mapset và lưu vào cấu trúc G_read_range (char *name, char
range. *mapset, struct Range *range)
Ghi thông tin về phạm vi của một file int
raster trong mapset và lưu vào cấu trúc G_write_range (char *name, struct
range. Range *range)
Khởi tạo cho một cấu trúc range int
G_init_range (struct Range *range)
Khởi tạo cho cấu trúc trạng thái của một int
cell trong bản đồ raster Cell_stats G_init_cell_stats (struct Cell_stats
*s)
Giải phóng vùng nhớ được cấp cho int
Cell_stats G_free_cell_stats (struct Cell_stats
*s)
Cập nhật mảng data (có n giá trị) vào int
cấu trúc quản lý Cell_stats. G_update_cell_stats (CELL *data,
int n, struct Cell_stats *s)
Trang 71
(cid:145) Xử lý cho file Vector
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Thư viện GIS chứa một vài phương thức phục vụ cho việc xử lý file vector. Những
hàm này cung cấp các chức năng cho phép người sử dụng quản lý, xác định file vector
trong cơ sở dữ liệu, và một số chức năng khác..
Ý NGHĨA HÀM
Đọc thông tin danh mục của file vector int
tên là name trong mapset vào cấu trúc G_read_vector_cats (char *name,
quản lý danh mục cats name *mapset, struct Categories
*cats)
Ghi thông tin danh mục của file vector int
tên là name trong mapset vào cấu trúc G_write_vector_cats (char *name,
quản lý danh mục cats struct Categories *cats)
Tạo mới một file vector trong mapset FILE *
hiện tại G_fopen_vector_new (char *name)
FILE * Mở một file vector đã có trước đó trong
mapset hiện tại. G_fopen_vector_old (char *name,
char *mapset)
Tìm một file vector có tên là name int
trong mapset được chỉ định. G_find_vector (char *name, char
char name[50]; *mapset)
Trang 72
char *mapset;
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
if ((mapset = G_find_vector(name,î î))
= = NULL)
/* not found */
(cid:145) Xử lý cho file SITES
Các file site chứa các record mô tả thông tin liên quan đến “điểm”.
Có ba loại record : record ghi chú (comment record), header record, và record dữ liệu
(data record). Những record được ghi trong những file sử dụng bảng mã ASCII và
phân cách nhau bằng ký tự newline của bẳng mã ASCII (0x0A, tương đương ký tự
‘\n’).
Các record được chia làm hai phần, phần 1 chứa thông tin location (2, hoặc 3 field) và
phần 2 chứa các thông tin thuộc tin của vùng location này. Các field có chiều dài
không cố định nên do đó kích thước của các record có thể khác nhau.
Trong phần 1, các field được phân cách bằng ký tự pipe ( | ) có mã ASCII là 0x7c. Ký
tự pipe cuối cùng trong record là ký tự phân cách giữa phần 1 và phần 2
Trong phần 2, tùy vào loại thuộc tính sẽ sử dụng ký tự phân cách khác nhau
• Thuộc tính danh mục (Category attribute) : sử dụng ký tự # làm tiền tố, số
chỉ mục là số nguyên.
• Thuộc tính thập phân (decimal attribute) : sử dụng ký tự % làm tiền tố.
• Thuộc tính chuỗi (String attribute) : sử dụng tiền tố @ và chuỗi được bao
trong ngoặc kép “
• Thuộc tính mặc định : nếu không có các tiền tố #,@ và %, kiểu của thuộc
tính mặc định là chuỗi (string)
Trang 73
Ví dụ :
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
name|time
desc|Example of using time as an attribute
time|Mon Apr 17 14:24:06 EST 1995
10.8|0|9.8|Fri Sep 13 10:00:00 1986 %31.4
11|5.5|9.9|Fri Sep 14 00:20:00 1985 %36.4
5.1|3.9|10|Fri Sep 15 00:00:30 1984 %28.4
Với dữ liệu trên, mỗi record dữ liệu
Trong phần I có 3 thuộc tính xác lập toạ độ của vùng Location. (record 1 : 10.8 | 0 | 9.8
)
Trong phần 2 có 5 thuộc tính chuỗi, và 1 thuộc tính thập phân ( record 1 : 5 thuộc tính
được hiểu mặc định là chuỗi là : Fri, Sep, 13, 10:00:00 và 1986; thuộc tính thập phân là
3.14)
HÀM Ý NGHĨA
Yêu cầu người sử dụng nhập vào tên char *
của một file site trong danh sách các file G_ask_sites_old (char *prompt,
site đã có sẵn. char *name)
char *mapset;
char name[50];
mapset = G_ask_sites_old("Enter site
Trang 74
list file to be processed", name);
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
if (mapset == NULL)
exit(0);
Tạo mới file site FILE *
G_sites_open_new (char *name)
Mở một file site đã có sẵn FILE *
G_sites_open_old (char *name, char
*mapset)
Cấp phát bộ nhớ, tạo mới một cấu trúc Site *
Site G_site_new_struct
(RASTER_MAP_TYPE c, int n, int s,
int d)
Giải phóng vùng nhớ đã được cấp phát void
trước đó. G_site_free_struct (Site *site)
Đọc một site record từ file đã được mở. int
G_site_get (FILE *fd, Site *s)
Ghi một site record vào . int
G_site_put (FILE *fd, Site *s)
(cid:145) Các hàm dùng vẽ cơ bản
Thư viện GIS còn cung cấp các hàm dùng để thực hiện các thao tác vẽ đường thẳng và
Trang 75
đa giác cơ bản . Sau đây là một số hàm :
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Ý NGHĨA HÀM
Hàm vẽ đường thẳng, sử dụng thuật int
toán Breshenham. G_bresenham_line (int x1, int y1, int
Trong đó, hàm dùng để vẽ 1 point phải x2, int y2, int (*point)( ) )
tự cài đặt và truyền vào thông qua con
trỏ hàm
int (*point)()
Hàm khởi tạo cho một quá trình vẽ. int
Hàm này phải được gọi trước khi bắt G_setup_plot (double t, double b,
đầu gọi bất cứ hàm nào có tên theo mẫu double l, double r, nt (*Move)( ), int
G_plot_* (*Cont)( ))
t,b,l và r là tọa độ các điểm top, bottom,
left và right của vùng vẽ.
Hàm nhận vào hai con trỏ hàm đến hai
hàm được người dùng tự cài đặt :
Move(x, y) di chuyển đến toạ độ (x,y)
Cont(x, y) vẽ đến toạ độ x,y từ toạ độ
trước đó.
Hàm này chịu trách nhiệm “xén” nếu
(x,y) nằm ngoài vùng được phép vẽ.
int Vẽ một đường thẳng, truyền vào toạ độ
Trang 76
tính theo kinh độ và vĩ độ. G_plot_line (double east1, double
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
north1, double east2, double north2)
int Vẽ đa giác n cạnh, truyền vào toạ độ
tính theo kinh độ và vĩ độ G_plot_polygon (double *east, double
*north, int n)
(cid:145) Sử dụng file tạm
Đôi khi trong quá trình xử lý của mình, các module cần lưu các thông tin tạm vào một
file. Sau khi module đó được xử lý xong, các thông tin tạm đó không cần nữa và file
lưu các thông tin tạm sẽ được xoá đi. Vấn đề cần giải quyết ở đây là cơ chế cung cấp
tên file dùng để lưu các thông tin tạm này, tên file này buộc phải là duy nhất nghĩa là
không được trùng với các file cũng dùng các thông tin tạm khác. GRASS cung cấp một
hàm đảm bảo điều này :
Trả ra một tên file dùng lưu dữ liệu tạm char *
G_temp_le ( )
GRASS dựa vào id của process đang chạy để cung cấp tên cho file tạm, khi process
này không còn chạy nữa, tiến trình quản lý cơ sở dữ liệu của GRASS sẽ tự động xoá
những file tạm này đi.
(cid:145) Hỗ trợ các lệnh command
Mỗi lệnh (command) trong GRASS có thể sẽ đòi hỏi truyền các tham số vào. Người
dùng có tràch nhiệm phải cung cấp đầy đủ các tham số này, nếu không, “lệnh” sẽ
Trang 77
không thực hiện được và sẽ cung cấp hướng dẫn sử dụng kèm theo thông báo lỗi.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Để chuẩn hoá qui trình cung cấp thông tin và kèm theo thông báo lỗi khi người dùng
cung cấp các tham số không đúng, GRASS hỗ trợ một số hàm cho lập trình viên và
khuyến cáo các lập trình viên nên tận dụng nó khi viết các lệnh mới.
Sử dụng hai cấu trúc
struct Option *opt; /* mô tả các tùy chọn của lệnh */
Chi tiết :
opt->key Tên của tùy chọn
opt->description Dòng mô tả cho user về tùy chọn này
opt->type Kiểu dữ liệu user sẽ cung cấp cho tùy chọn này
opt->required Lệnh có bắt buộc phải có option này ?
struct Flag *flag; /* Các cờ hiệu */
Chi tiết :
flag->key Một ký tự đơn dùng làm cờ hiệu
flag->description Thông tin về cờ cho user
Hàm Ý nghĩa
struct Option * Cấp phát bộ nhớ cho một cấu trúc
option G_define_option ( )
struct Flag * Cấp phát bộ nhớ cho một cấu trúc flag
Trang 78
G_define_flag ( )
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int Phân tích các tham số do user truyền
vào. Trả ra 0 nếu thoả mãn yêu cầu về G_parser (int argc, char *argv[ ])
các tham số của lệnh.
int In thông tin hướng dẫn sử dụng lệnh
cho user. Khi check G_parser không G_usage ( )
thành công, lập trình viên có thể gọi
hàm này để hướng dẫn người sử dụng
(cid:145) Làm việc với UNIX/LINUX
Vì thư viện GRASS được phát triển và hỗ trợ mạnh cho LINUX/UNIX, nên nó cung
cấp một số hàm chuyên biệt để lập trình trên hệ điều hành này.
Lập trình đa tiến trình :
LINUX/UNIX cung cấp hàm fork() để tạo tiến trình con là một bản sao của tiến trình
cha. Việc tạo tiến trình con thông thường dùng để chuyển các công việc của module về
“hậu trường”.
Kỹ thuật thường dùng trong LINUX/UNIX là gọi fork() để tạo ra một tiến trình con,
khi tiến trình con được tạo lập thành công, tiến trình cha lập tức gọi exit() để thoát và
từ đó trở đi, tiến trình con chạy “hậu trường” độc lập.
Tuy nhiên, GRASS gặp một vấn đề nhỏ với điều này, đó là trong UNIX/LINUX người
dùng có thể sử dụng các thao tác bàn phím để kill một process đang chạy và vì thế có
khả năng một module xử lý quan trọng đang làm việc ở “hậu trường” sẽ không đảm
bảo thực hiện đầy đủ nhiệm vụ được giao. GRASS giải quyết vấn đề này bằng cách
Trang 79
cung cấp hàm G_fork().
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
pid_t G_fork ( ) : Tạo một process con và trả ra id của nó. Hàm sẽ chuyển process con
được tạo ra vào một group process, đảm bảo không bị vô ý kill bởi người dùng khi
chưa hoàn thành nhiệm vụ.
Lập trình với socket trong UNIX
Các hàm cung cấp bởi GRASS cho công việc này đều có dạng G_sock_*, đóng gói
việc lập trình socket trên UNIX, đơn giản hóa các thao tác cho lập trình viên
Ý nghĩa Hàm
Nhận vào name của kênh truyền dẫn và char *
trả ra đường dẫn full đến socket file G_sock_get_fname (char *name)
dùng để truyền dẫn.
Truyền vào name là đường dẫn full đến int
socket file của kênh truyền dẫn, kiểm G_sock_exists (char *name)
tra xem socket đó có tồn tại
Kết nối với một socket file. int
G_sock_bind (char *name)
“Nghe” trên một socket int
G_sock_listen (int fd, unsigned int
queue)
Chấp nhận một kết nối, tham số fd là int
Trang 80
kết quả trả về của G_sock_listen G_sock_accept (int fd)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
int
Socket client tìm cách connect với G_sock_connect (char *name)
socket server
(cid:153) Thư viện VASK
VASK - viết tắt của cụm từ visual ask. Thư viện cung cấp một cách thức đơn giản để
giao tiếp với người sử dụng. Một trang màn hình chứa các thông tin cùng các câu hỏi
được hiện thị và người dùng được yêu cầu nhập các thông tin cần thiết cho chúng.
Cách thức giao tiếp với người dùng này thường thấy ở các module chương trình của
GRASS.
VASK là một thư viện hỗ trợ lập trình viên tạo ra sự giao tiếp này. Các hàm của thư
viện có tiền tố bắt đầu là V_*
Ý nghĩa Hàm
Khởi tạo int
V_clear ()
Viết một dòng text tại dòng num. Dòng int
có giá trị từ 0 đến 22. Dòng 0 là dòng V_line (int num, char *text)
trên cùng của màn hình
Ctype có kiểu là integer, long, float, int
Trang 81
double hoặc char. V_const (Ctype *value, char type, int
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Type dùng các ký tự để xác định kiểu row, int col, int len)
dữ liệu của con trỏ value : ‘i’ (integer),
‘d’ (double), ‘f’ (float), ‘l’ (long) hoặc int ‘s’ (char string).
V_ques (Ctype *value, char type, int Row có giá trị từ 0 .. 22 row, int col, int len)
Col có giá trị từ 0 .. 79
Người dùng được yêu cầu nhập liệu, ô
nhập liệu nằm tại vị trí col, row và có
chiều dài len. Nội dung nhập liệu của
người dùng chứa trong biến value
Giao tiếp với người sử dụng. int
Khi được gọi, nó sẽ lau màn hình và V_call ()
hiện thị các nội dung đã đựơc chỉ định
bởi V_line, V_ques và V_const.
# define LEN 15
..
/* các biến*/
int i ;
foat f ;
char s[LEN] ;
Trang 82
Ví dụ minh họa :
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
/*Khởi tạo giá trị các biến */
i=0;
f = 0.0 ;
*s = 0 ;
/* khởi tạo vask info*/
V_clear( ) ;
/* Vùng text hiện thị */
V_line( 5, “ Enter an Integer “) ;
V_line( 7, “ Enter a Decimal “) ;
V_line( 9, “ Enter a character string “) ;
/* Vùng yêu cầu người dùng nhập liệu*/
V_ques ( &i, 'i', 5, 30, 5) ;
V_ques ( &f, 'f', 7, 30, 5) ;
V_ques ( s, 's', 9, 30, LEN - 1) ;
/* Hiện thị các thông tin bên trên và chờ thao tác nhập liệu của người dùng*/
if (!V_call( ))
Trang 83
(cid:153) Thư viện làm việc với các bản đồ kiểu VECTOR
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Thư viện này cung cấp các hàm để làm việc với các file nhị phân lưu thông tin của các
bản đồ kiểu vector.
Các hàm có tiền tố bắt đầu là Vect_ hoặc V1_ hoặc V2_ hoặc dig_.
Để sử dụng thư viện, ta phải thực hiện
#include
vào module cần sử dụng.
Các vector có dữ liệu được mã hoá theo ba cấu trúc : LINE, AREA và DOT được định
nghĩa trong “dig_define.h” và file này được tự động include trong file “Vect.h”.
Có hai mức truy xuất đối với các file thông tin của bản đồ VECTOR :
• Mức 1 : các thông tin giới hạn như thông tin các cung của bản đồ vector.
Các thông tin đồ hình, danh mục .. không được truy xuất ở mức này.
• Mức 2 : Hỗ trợ truy xuất toàn diện tất cả các thông tin. Cần nhiều bộ nhớ,
xử lý và tốn nhiều thời gian hơn.
Ý nghĩa Hàm
Mở bản đồ vector có tên là name trong int
mapset . Mở để đọc. Vect_open_old (struct Map_info
*Map, char *name, char *mapset)
Mở bản đồ vector có tên là name trong int
mapset hiện tại . Mở để ghi Vect_open_new (struct Map_info
*Map, char *name)
Xác lập mức truy xuất ( như đã trình int
Trang 84
bày bên trên, chúng ta có 2 mức truy
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
xuất đối với dữ liệu bản đồ vector) Vect_set_open_level (int level)
Đóng bảng đồ lại int
Vect_close (struct Map_info *Map)
int Kết quả trả về là –2 : EOF, -1 : Lỗi.
Đây là hàm chính để thao tác, nó đọc Vect_read_next_line (struct
dòng tiếp theo từ Map vào Point. Map_info *Map, struct line_pnts
*Points)
Ghi vào bảng đồ vector. long
Phải được mở bằng Vect_open_new Vect_write_line (struct Map_info
trước đó. *Map, int type, struct line_pnts
*Points)
struct line_pnts * Khởi tạo, cấp phát bộ nhớ cho một
struct line Vect_new_line_struct (void)
int Huỷ bộ nhớ đã cấp trước đó cho struct
line. Vect_destroy_line_struct (struct
line_pnts *Points)
#include “Vect.h” /* new include file */
struct Map_info Map;
/* Map info */
Trang 85
Ví dụ :
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
struct line_pnts *Points;
/* Poly-Line data */
G_gisinit (argv[0]);
/* init GIS lib */
if (Vect_open_old (&Map, name, mapset) < 0 ) /* open file */
G_fatal_error (“Cannot open vector file”);
Points = Vect_new_line_struct (‘h'|209350u');
while ( Vect_read_next_line (&Map, Points) > 0 ) /* loop reading*/
{
/* each line */
/* do something with Points */
}
Vect_destroy_line_struct (Points); /* remove allocation */
Vect_close (&Map); /* close up */
(cid:153) Thư viện đồ họa cho RASTER (RASTER GRAPHICS LIBRARY)
Mọi giao tiếp đồ hoạ đều thông qua thư viện này trực tiếp hay gián tiếp. Thư viện này
được thiết kế độc lập với thiết bị đồ hoạ, nó thực hiện chức năng đồ hoạ bằng cách gọi
một tập hàm được đặt tả và loại thiết bị đồ hoạ buộc phải có một driver, cài đặt tập hàm
theo đặc tả trên. Thiết bị đồ hoạ ở đây có thể hiểu là môi trường dùng hiện thị, vì
GRASS phát triển trên nền UNIX/LINUX nên không có khái niệm device contex (DC)
như trong Windowx, thiết bị hiện thị vì thế tách bạch rõ có thể là một máy in, màn hình
máy tính , có thể là hiện thị trên Windows, hoặc trên XWindows .. Dù hiện thị trên
thiết bị nào, thiết bị hiện thị đó buộc phải cung cấp driver (tập hàm giao tiếp) theo đặc
Trang 86
tả của thư viện.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Một số điều cần lưu ý :
• Thư viện vẫn duy trì khái niệm vị trí hiện tại (current position). Mặc dù trên
màn hình hiện thị, vị trí hiện tại không có dấu hiệu gì đặc biệt nhưng có rất
nhiều hàm đồ họa sử dụng thông tin vị trí hiện tại để thực hiện tác vụ đồ hoạ
của nó.
• Thư viện vẫn duy trì khái niệm màu hiện tại được chọn (current chosen
color).
Lập trình viên phải định nghĩa tọa độ trên màn hình một cách tường minh cho một tác
vụ đồ hoạ. Góc toạ độ của màn hình được xác định là góc trái trên cùng (top left
corner). Các thông tin về vùng hiện thị có thể được lấy thông qua hàm R_screen_left,
R_screen_rite, R_screen_top và R_screen_bot.
Kết nối với driver hiện thị
int
Hàm Chức năng
Trước khi thực hiện bất cứ tác vụ đồ
hoạ nào, ta phải kết nối với driver hiện
R_open_driver ( )
thị.
Hàm này được gọi trong lệnh d.mon và
chỉ một ứng dụng được phép kết nối với
int
một driver hiện thị tại một thời điểm.
Đóng driver
R_close_driver ( )
Trang 87
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Bảng màu
Có hai chế độ màu :
• Bảng màu cố định (fixed color) : Dùng bảng màu được thiết lập theo bảng
màu thiết bị hiện thị và không cho phép thay đổi.
• Bảng màu thay đổi được : Cũng dùng bảng màu được thiết lập theo bảng
màu thiết bị hiện thị nhưng cho phép thay đổi, tùy biến thông qua lệnh
d.color.
Hàm Chức năng
int Chọn sử dụng bảng màu cố định cho
những tác vụ đồ họa đi theo sau. R_color_table__fixed ( )
int Chọn sử dụng bảng màu có thể thay đổi
cho những tác vụ đồ họa đi theo sau. R_color_table_float ( )
int Định nghĩa màu có thứ tự num trong
bảng màu R_reset_color (unsigned char red,
unsigned char green, unsigned char
blu, int num)
int Chọn màu color sẽ sử dụng cho những
tác vụ đồ hoạ đi theo sau. R_color (int color)
int Khi loại bảng màu có thể thay đổi được
Trang 88
lựa chọn, lời gọi hàm này sẽ chọn màu R_RGB_color (int red, int green, int
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
gần với màu được yêu cầu nhất cho blue)
những tác vụ đồ hoạ đi theo sau.
Giá trị red, green và blue là 0..255
Các hàm vẽ cơ bản
Hàm Ý nghĩa
int Trả ra chỉ số dòng pixel của cạnh dưới
cùng màn hình hiện thị. R_screen_bot ( )
Trả ra chỉ số dòng pixel của cạnh trên int
cùng màn hình hiện thị. R_screen_top ( )
Trả ra chỉ số dòng pixel của cạnh bên int
trái màn hình hiện thị. R_screen_left ( )
Trả ra chỉ số dòng pixel của cạnh bên int
phải màn hình hiện thị. R_screen_rite( )
Di chuyển vị trí hiện tại đến x,y int
Trang 89
R_move_abs (int x, int y)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Vẽ một đường thẳng từ vị trí hiện tại int
đến x,y R_cont_abs (int x, int y)
Vẽ và tô màu một hình chữ nhật. Màu int
tô là màu hiện tại R_box_abs (int x1, int y1, int x2, int
y2)
Xoá màn hình int
R_erase ( )
Đồng bộ hoá việc hiện thị. int
Gửi tất cả các lệnh đồ hoạ còn tồn đến R_stabilize ( )
driver và buộc các lệnh còn tồn phải
được driver thực hiện
Vẽ một loạt điểm có toạ độ x,y được int
truyền cho hàm, num là số điểm phải R_polydots_abs (int *x, int *y, int
vẽ. num)
Toạ độ của vị trí hiện tại sẽ được cập
nhật thành điểm cuối cùng được vẽ của
hàm
Màu sử dụng là màu hiện tại
Vẽ một đa giác đóng. Num là số đỉnh
của đa giác. Toạ độ của các đỉnh là hai int
mảng x, y được truyền cho hàm. R_polygon_abs (int *x, int *y,int
Trang 90
Toạ độ của vị trí hiện tại sẽ được cập
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
nhật thành điểm cuối cùng được vẽ của num)
hàm
Màu sử dụng là màu hiện tại
int Vẽ một loạt đường theo các toạ độ được
chỉ định, các đường này không tạo R_polyline_abs (int *x, int *y, int
thành đa giác đóng. num)
Toạ độ của vị trí hiện tại sẽ được cập
nhật thành điểm cuối cùng được vẽ của
hàm
Màu sử dụng là màu hiện tại
int
Vẽ raster R_raster (int num, int nrows, int
withzero, int *raster) Bắt đầu tại vị trí hiện tại, tham số num
thể hiện số màu tương ứng với giá trị
trong mảng raster, được dùng để vẽ
nrows dòng pixel liên tục nhau. Tham
số withzero xác định liệu giá trị 0 có
thể xem là một màu hay là bỏ qua
Xác định cái khung hiện thị text int
R_set_window (int top, int bottom,
Trang 91
int left, int right)
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Chọn Font chữ . int
Các Font chữ được phép chọn R_font (char *font)
Xác lập kích thước text int
R_text_size (int width, int height)
Dùng Font, màu, kích thước text và vị int
trí hiện tại, xuất một text ra. R_text (char *text)
Chọn một location bằng mouse. int
Trước hết, cursor sẽ được đặt tại vị trí R_get_location_with_pointer (int *nx,
nx, ny được truyền vào. Sau đó khi int *ny, int *button)
button chuột được nhấn, vị trí chuột
được ghi nhận vào nx, ny và thông tin
button nhấn được ghi nhận vào button.
Dựa vào nx , ny ban đầu và nx,ny trả về
ta xác định được location được chọn
Tương tự như trên nhưng lần này một int
line cố định một đầu tại x,y và vị trí R_get_location_with_line (int x, int y,
nx,ny được xác định khi mouse được int *nx, int *ny, int *button)
nhấn.
Tương tự như trên nhưng lần này một int
rectangle thay vì một line, cố định một R_get_location_with_box (int x, int y,
Trang 92
đầu tại x,y và vị trí nx,ny được xác định
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
khi mouse được nhấn int *nx, int *ny, int *button)
(cid:153) Thư viện hiện thị đồ họa (DISPLAY GRAPHICS LIBRARY)
Cung cấp các hàm đồ họa bao bọc ở một mức cao hơn, các hàm này sử dụng các hàm
được cung cấp từ thư viện đồ họa raster để thực hiện các tác vụ đồ hoạ. Có thể xem các
hàm đồ hoạ của thư viện đồ họa raster là các hàm đồ hoạ chính yếu, còn các hàm đồ
họa của thư viện này phối hợp các hàm chính yếu đó để tạo ra những hàm chuyên dụng
cho GRASS.
Các hàm được thiết kế theo 4 hướng :
• Tạo lập và quản lý các cửa sổ hiện thị.
• Chuyển đổi toạ độ.
• Hiện thị các raster.
• Các tác vụ linh tinh khác: popup menu, xén hình ...
Các hàm của thư viện có tiền tố bắt đầu là D_*
Hàm Ý nghĩa
Khởi tạo cho một cửa sổ hiện thị hiện int
tại. D_setup (int clear)
clear = 1 : xoá toàn bộ nội dung trên
cửa sổ
Trang 93
int Tạo mới một cửa sổ hiện thị.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
D_new_window (char *name, int top,
int bottom, int left, int right)
Chọn cửa sổ hiện thị có tên được xác int
lập trong tham số name làm cửa sổ hiện D_set_cur_wind (char *name)
thị hiện tại.
Lấy ra tên của cửa sổ được chọn hiện int
tại. D_get_cur_wind (char *name)
Vẽ viền (outline) cửa sổ hiện tại với int
màu được chọn là color. D_show_window (int color)
Danh sách màu được định nghĩa trong
file color.h
Lấy ra toạ độ của cửa sổ hiện thị, lưu int
vào bốn tham số : top, bottom, left và D_get_screen_window (int *top, int
right. *bottom, int *left, int *right)
Xoá nội dung đang hiện thị trên màn int
hình D_erase_window ( )
Xoá tất cả thông tin liên quan đến cửa int
sổ hiện thị hiện tại, bao gồm các thông D_clear_window ( )
tin về vùng bản đồ hiện thị và nội dung
danh sách hịên thị của cửa sổ.
Trang 94
Thêm một lệnh (command) vào danh int
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
sách hiện thị của cửa sổ D_add_to_list (char *string)
Lưu trữ tên của bản đồ raster thành int
thông tin đi kèm với cửa sổ hiện thị D_set_cell_name (char *name)
hiện tại.
int
Xác lập tên bản đồ vector trong danh sách
Lấy ra tên bản đồ đã được lưu với cửa D_get_cell_name (char *name) sổ hiện thị hiện tại trước đó.
hiện thị
int
Lấy ra tên bản đồ vector được hiện thị
D_set_dig_name (char *name)
int
Xác lập tên bản đồ site trong danh sách
D_get_dig_name (char *name)
hiện thị
int
D_set_site_name (char *name)
Lấy ra tên bản đồ site được hiện thị int
Xoá thông tin danh sách hiện thị của cửa sổ
D_get_site_name (char *name)
int
D_clear_window ( )
2.9 Cơ chế bổ sung và quản lý mã nguồn của GRASS Vì GRASS là một dự án mở, có sự đóng góp từ nhiều lập trình viên, tổ chức .. do đó, nó phải có cơ chế thống nhất để quản lý và phát triển mã nguồn.
Trang 95
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.9.1 Mã nguồn chính thức (thư mục src)
Một mã nguồn muốn vào được thư mục src, tức trở thành mã nguồn chính thức của GRASS, nó phải vượt qua được những yêu cầu khắc khe sau :
1. Ổn định, ít thay đổi thường xuyên
2. Khả năng có thể “sống sót” đã được chứng minh – mã nguồn đó phải sống sót trong phiên bản ALPHA của GRASS ít nhất 1 năm. Một cách tương đối nhằm đảm bảo tất cả các bug đã được tìm thấy và sửa chữa.
3. Vượt qua các yêu cầu nghiêm ngặt đối với một phiên bản ALPHA
4. Được OGI chứng nhận, OGI ( Office of GRASS Integration) là Cơ quan chuyên lo chuyện tích hợp và chứng nhận các mã nguồn mới của GRASS.
Tóm lại, những mã nguồn đã sống sót qua một năm ở phiên bảng ALPHA mới đủ tư cách xem xét để nâng lên phiên bản chính thức.
2.9.2 Mã nguồn ALPHA (thư mục src.alpha)
Một mã nguồn muốn vào được thư mục src, tức trở thành mã nguồn chính thức của GRASS, nó phải vượt qua được những yêu cầu khắc khe sau :
1. Chứng tỏ là hữu ít và cần thiết. Nghĩa là, nó không được viết ra chỉ nhằm để
thoả mãn cho một yêu cầu trong phạm vi của một khu vực, một tổ chức hay một ứng dụng nào đó.
2. Thoả mãn được các tiểu chuẩn về lập trình và tài liệu hướng dẫn do GRASS đề ra.
3. Có được sự chứng nhận là hữu dụng bởi ít nhất 3 nơi sử dụng độc lập.
4. Được đảm bảo sẽ có được sự hỗ trợ phát triển lâu dài.
Tóm lại, src.alpha sẽ là nơi chứa đựng những mã nguồn mới nhất, hay nhất và hấp dẫn nhất được cung cấp cho GRASS bởi cộng đồng mã nguồn mở.
2.9.3 Mã nguồn đóng góp (thư mục src.contrib)
Trang 96
Những mã nguồn loại này được thiết kế và cài đặt để thoả mãn cho một yêu cầu trong phạm vi của một tổ chức, khu vực hay một ứng dụng cụ thể nào đó.
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
2.9.4 Mã nguồn có liên quan (thư mục src.related)
Những mã nguồn này không được sự chứng nhận của OGI, nó thoã mãn cho một nhóm người dùng xác định nào đó.
2.9.5 Mã nguồn GARDEN (src.garden)
Tập hợp những phần mềm được phát triển để kết nối GRASS với những phần mềm khác có liên quan.
2.9.6 Các script (src/script/shell)
Chức các shell script dùng làm việc với GRASS. GRASS được phát triển trên UNIX và các script này là một cơ chế lập trình đơn giản nhưng đặc biệt quan trọng đối với GRASS.
2.10 Hướng dẫn cài đặt và sơ lược cách sử dụng
2.10.1 Cài đặt GRASS trên LINUX
GRASS5 có thể được tìm thấy ở dạng gói RPM của LINUX tại địa chỉ: http://ftp.gwdg.de/pub/misc/freegis/intevation/freegis/gnu-linux-i586/ để install gói này, ta dùng lệnh rpm của Linux :
rpm –i [ fileName ]
GRASS5 cũng có thể được download dạng binary dùng cho việc cài đặt tại website http://grass.itc.it/download.html ( bản binary này được biên dịch và nén theo dạng gzip tar của Linux, chỉ chạy được với Red Hat 7.0 trở lên) Để cài đặt bản binary này ta chỉ cần chạy script sh đi kèm trong phần download ( script sh là 1 dạng file giống file .bat trong Windows). Cụ thể script đi kèm để cài đặt có tên là grass5_i686-pc-linux- gnu_install.sh và gói binary có tên là grass5.0.0_linuxbin.tar.gz. Ta chỉ việc chạy script là xong ( nó sẽ tự động install vào vị trí default, nếu muốn lựa chọn chính xác thư mục để install, ta có thể customize script sh ) :
sh grass5_i686-pc-linux-gnu_install.sh grass5.0.0_linuxbin.tar.gz
Sau khi đã cài đặt thành công, ta khởi động GRASS bằng lệnh: Grass5 Để có được hướng dẫn trợ giúp, ta dùng lệnh Grass5 – help Để chạy GRASS5 với giao diện đồ hoạ TCLTK, ta dùng lệnh : tcltkgrass&
Trang 97
Để có thể sử dụng GRASS5, ta cần phải có thêm một thứ quan trọng khác là cơ sở dữ liệu. Trên website http://grass.itc.it/download.html có cung cấp 1 số dữ liệu mẫu như : leics.tar (dữ liệu vùng leceister ở nước Anh), global_grass5data.tar.. Ta chỉ việc giải
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
nén (gunzip) file dữ liệu vào một thư mục định sẳn, sau đó khai báo cho khi khởi động GRASS5 là xong.
Grass5 hỗ trợ 2 chế độ :
(cid:153) Chế độ Command line : Người sử dụng gõ lệnh trực tiếp để điều khiển. Lệnh được sử dụng là những lệnh của GRASS được xây dựng sẵn và được phân thành từng nhóm riêng biệt
g.* Nhóm các lệnh dùng cho việc quản lý file (general file manipulation command)
d.* Nhóm các lệnh dùng hiện thị (display on screen)
i.* Nhóm các lệnh xử lý hình ảnh (image processing)
r.* Nhóm các lệnh xử lý dữ liệu import là raster
v.* Nhóm các lệnh xử lý dữ liệu import là vector
s.* Nhóm các lệnh xử lý dữ liệu import là site (point)
Trang 98
(cid:153) Chế độ đồ hoạ : Hỗ trợ tương tác với GRASS-GIS bằng giao diện đồ hoạ. Dựa trên tập hợp lệnh đã có sẵn của GRASS, giao diện đồ hoạ được xây dựng bằng script TCL/TK khá đơn giản .
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Hình 2 - 7 Hình ảnh sử dụng GRASS5 trên Linux
2.10.2 Cài đặt GRASS trên Windows thông qua giả lập Cygwin
Grass5 có thể chạy được trên WindowsNT/2000/XP nhờ trình giả lập Cygwin, là một trình giả lập môi trường Linux/Unix, cho phép các ứng dụng của Unix/Linux có thể chạy được trên Windows. Có thể xem download miễn phí Cygwin tại www.cygwin.com
Grass5 phải được cài trên partition NTFS và Cygwin yêu cầu phải có XFree86 (giả lập XWindow của Linux/Unix). Bản GRASS5 giành cho Cygwin được download tại http://grass.itc.it/download.html .
Các bước cài đặt hoàn toàn giống với cài đặt trên Linux
• Cài đặt GRASS5 trên Cygwin
Các bước sử dụng GRASS tương tự trên môi trường Linux ( vì thật chất GRASS lúc này chạy được trên nền Cygwin giả lập Linux)
Trang 99
• Một số hình ảnh sử dụng GRASS5 trên nền Cygwin
Chương 2: Hệ thống hỗ trợ phân tích tài nguyên địa lý
Ta phải khởi động XServer trước khi khởi động Grass5 bằng lệnh ./startxwin.bat
Sau khi chạy XServer thành công, ta sẽ thấy chữ X ở taskbar và màn hình giao tiếp command với Cygwin trong chế độ XWindows. Lưu ý là do sự không tương thích, ta phải tắt các chương trình AntiVirus, Firewall … trước khi gọi lệnh khởi động XServer ( theo thông báo bug của Cygwin, thì ta phải uninstall các chương trình này ra khởi máy và ngay cả đối với việc install cũng không đảm bảo XServer sẽ hoạt động bình thường .. Khi thử nghiệm, chúng em phải gọi startxwin.bat vài lần thì XServer mới chịu hoạt động)
Gõ lệnh Grass5 để khởi động GRASS, xác lập cơ sở dữ liệu sẽ làm việc
Dùng các lệnh được cung cấp trong thư viện của GRASS để giao tiếp qua chế độ command line (gõ lệnh trực tiếp)
Hình 2 - 8 Hình ảnh sử dụng GRASS5 trên Windows thông qua giả lập Cygwin
Trang 100
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Chương 3 : Quá trình chuyển đổi GRASS5 từ Linux lên Windows
Chương 3 trình bày khái quát sự khác biệt giữa Windows và Linux, các khái niệm cần thiết
cùng với các kỹ thuật dùng để tái tổ chức phần mềm Grass từ hệ điều hành Linux sang hệ
điều hành Windows.
3.1 Sự khác biệt giữa Windows và Unix/Linux Phần này trình bày về những khác biệt cơ bản giữa môi trường UNIX và Windows.
3.1.1 Tổng quan về hệ điều hành Windows
Hình 3 - 0: Sơ đồ về sự phát triển của hệ điều hành windows
Trang 101
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Kiến trúc Windows NT có hai mức truy xuất hệ thống : User Mode và Kernel Mode
• User Mode : là một tập các hệ thống con được kiểm soát (protected subsystem)
của hệ điều hành và các tiến trình ứng dụng (mỗi ứng dụng khi chạy được xem là
một tiến trình). Các subsystem này cung cấp các giao tiếp với kernel của hệ thống
cho các ứng dụng trên Win, trong số đó subsystem quan trọng nhất là Win32
Subsystem cung cấp hầu hết các khả năng lập trình cho các ứng dụng trên nề
Windows 32 bit. Các ứng dụng lập trình trên Win thông qua các hàm API và các
hàm API đến lượt mình sẽ gọi các dịch vụ tương ứng được cung cấp từ các
subsystem bên dưới.
• Kernel mode : là một mức xử lý đặc biệt của hệ thống, bao gồm executive và
kernel. Kernel điều khiển hệ điều hành giao tiếp với bộ vi xử lý, thực hiện các tác
vụ hệ thống như : điều phối (sheduling), đồng bộ hóa đa tiến trình,và cung cấp
những dịch vụ cho phép executive có thể sử dụng và cung cấp ngược lại cho các
ứng dụng.
Executive cung cấp các dịch vụ cơ bản để các subsystem được kiểm soát có thể sử
Trang 102
dụng như : các tác vụ xử lý file, giao tiếp I/O và các tác vụ đồng bộ hóa.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Hình 3 - 1 Kiến trúc của hệ điều hành Windows theo họ NT
3.1.2 Tổng quan về hệ điều hành UNIX
Năm 1969, phòng thí nghiệm Bell phát triển hệ điều hành đa nhiệm UNIX, phiên bản
cài đặt đầu tiên được viết bằng ngôn ngữ assembly. Sau đó, cùng với việc sáng chế ra
ngôn ngữ C, BELL đã thiết kế và viết lại UNIX bằng ngôn ngữ này. UNIX từ đó trở
thành một hệ điều hành thông dụng do khả năng có thể chạy tốt trên nhiều lọai máy từ
máy tính cá nhân PC đến máy tính cỡ lớn như mainframe. Ngày nay, có rất nhiều dòng
hệ điều hành được phát triển trên nền UNIX, như :
• AIX của IBM
• Solaris của SUN Microsystem.
• HP-UX và Tru64 của Hewlett Packard
• UnixWare của Caldera
Trang 103
• Linux và FreeBSD, là hai hệ điều hành mã nguồn mở.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Hình 3 - 2 Các dòng hệ điều hành phát triển trên nền UNIX
Về kiến trúc, hệ điều hành UNIX có thể phân thành 3 lớp chức năng : mức thấp nhất là
kernel, cung cấp việc quản lý tài nguyên, các tác vụ điều phối, và vấn đề bảo mật
(security). Mức kế tiếp là shell, thông dịch các lệnh do người dùng đưa vào và khởi
Trang 104
động các ứng dụng. Mức cao nhất là utilities, cung cấp những ứng dụng hỗ trợ.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Hình 3 - 3 Kiến trúc của hệ điều hành UNIX
3.1.3 So sánh tổng quát về lập trình đa nhiệm trên hai môi trường
Đặc điểm Windows UNIX
Cơ chế chính, hỗ trợ mạnh Tiểu trình (thread) Tiến trình (process)
Hỗ trợ tiến trình Có Có
Hỗ trợ tiểu trình Có Có, nhưng cài đặt khác biệt
Tiểu trình Fiber Có Không
Điểm mạnh Hỗ trợ tốt việc tạo lập tiểu Hỗ trợ tốt đối với việc tạo
Trang 105
trình (thread) lập tiến trình (process)
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Cấu trúc phân cấp tiến trình Không Có
Kế thừa các “cờ” bảo mật Có Có ( trừ lệnh setuid)
của tiến trình cha
(cid:153) Vấn đề quản lý các tiến trình
Các hệ điều hành đa nhiệm như Windows và UNIX phải quản lý và điều khiển nhiều
tiến trình cùng một lúc. Mỗi tiến trình có dữ liệu, tài nguyên hệ thống, trạng thái … của
riêng nó. Tài nguyên bao gồm không gian bộ nhớ ảo, các tập tin và các đối tượng điều
phối. Các tiểu trình là một phần của một tiến trình, mỗi tiến trình có thể có một hoặc
nhiều hơn một tiểu trình chạy bên trong nó. Giống tiến trình, một tiểu trình cũng có tài
nguyên và trạng thái của riêng nó. Hệ điều hành Windows và UNIX đều hỗ trợ tiến
trình và tiểu trình nhưng có cách quản lý khác nhau.
(cid:153) Vấn đề đa nhiệm
UNIX được thiết kế với chiến thuật điều phối độc quyền truy xuất (preemptive
multitasking) thích hợp cho người dùng tạo ra nhiều tiến trình chạy đồng thời tại một
thời điểm. Do đó, lập trình viên trên UNIX thường tạo ra một tiến trình mới mỗi khi
cần tạo các xử lý đồng thời trong ứng dụng.
Việc tạo lập một tiến trình mới trên Windows, ngược với UNIX, tiêu tốn rất nhiều tài
nguyên và bản thân chiến thuật điều phối của Windows không thích hợp nên lập trình
viên trên Windows thường tạo lập các tiểu trình (thread) mỗi khi cần xử lý đồng thời.
Trang 106
Windows cũng có một lọai thread đặc biệt là Fiber mà UNIX không có, đây được gọi
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
là thread “nhẹ” (lightweight thread) , thích hợp cho các ứng dụng phải phục vụ một số
lớn người dùng như hệ thống cơ sở dữ liệu ..
Đây là khác biệt quan trọng giữa Windows và các hệ điều hành phát triển trên nền
UNIX.
(cid:153) Cấu trúc phân cấp của tiến trình
Khi một ứng dụng UNIX tạo lập một tiến trình (process), tiến trình mới trở thành tiến
trình con của tiến trình tạo lập. Cấu trúc phân cấp này thường quan trọng và hệ thống
sẽ có những chỉ thị lệnh để quản lý các tiến trình con này.
Tiến trình trong Windows không hoàn toàn sử dụng cấu trúc phân cấp như UNIX. Khi
tạo lập tiến trình, ta nhận được handle và cả ID của tiến trình, việc tạo lập cấu trúc
phân cấp như UNIX là tùy chọn đối với ứng dụng nếu nó thật sự cần.
(cid:153) Vấn đề signals, exceptions, và events
UNIX và Windows đều có cơ chế giúp tiến trình xử lý một sự kiện hay một lỗi xảy ra.
Trong UNIX cơ chế này gọi là signal, trong Windows thì có cơ chế exception trong đó
Windows sử dụng Cấu trúc Xử lý ngoại lệ (Structured Exception Handling – SEH) để
xử lý.
(cid:153) Vấn đề bộ lọc (filter) và ống dẫn (pipes)
UNIX giới thiệu một kiến trúc khác biệt trong lập trình là : bộ lọc và ống dẫn. Một
chương trình trong UNIX có thể xem như một “bộ lọc nước”, nó nhận dữ liệu vào từ
một “dòng nhập liệu chuẩn” (input stream) và sau khi xử lý nó sẽ cho dữ liệu “chảy” ra
Trang 107
một “dòng kết quả chuẩn” (output stream). Ống dẫn cho phép ta nối các bộ lọc nước
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
này lại với nhau, nghĩa là “dòng kết quả” của bộ lọc này lại tiếp tục được “lọc” qua
một bộ lọc nước khác trước khi ra ngoài, hay sẽ có nhiều “bộ lọc” nối tiếp nhau trong
việc xử lý dữ liệu đầu vào.. Đây là điểm đặc biệt của UNIX mà Windows không có.
(cid:153)Tiến trình Daemons và Windows Services
Trong UNIX, một tiến trình deamon là tiến trình được hệ thống khởi động để cung cấp
một dịch vụ nào đó cho những ứng dụng khác. Thông thường, tiến trình deamon không
giao tiếp với người sử dụng. UNIX sẽ khởi động tiến trình deamon lúc boot máy trong
đoạn script khởi tạo.
Khái niệm tiến trình deamon trong UNIX tương đương với khái niệm Windows
Services trong Windows. Các services hoàn toàn giống deamon về vai trò nhiệm vụ và
cũng được khởi động ở giai đoạn boot máy, các service được điều khiển thông qua Bộ
điều khiển Service ( Service Control Manager – SCM), ta phải giao tiếp khi lập trình
với SCM để quyết định việc khởi tạo, dừng và cài đặt cho Service.
(cid:153) Vấn đề giao tiếp giữa các tiến trình
Các hệ điều hành đa nhiệm phải cung cấp cơ chế cho phép các ứng dụng (tiến trình)
giao tiếp và chia sẻ dữ liệu với nhau. Cơ chế này gọi là giao tiếp liên tiến trình
(Interprocess Communication – IPC)
Đối với UNIX : Bộ nhớ được chia sẻ, pipe, và hàng đợi message (message queue)
Đối với Windows : bên cạnh Bộ nhớ được chia sẻ, pipe, và hàng đợi message
Trang 108
(message queue) nó còn có thêm clipboard, COM, DDE, và cơ chế send message.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153) Đồng bộ hoá
Cả UNIX và Windows đều có cơ chế đồng bộ hoá thông qua semaphores, mutex và
miền găng (critical section).
Semaphore để kiểm soát sự truy cập vào tài nguyên đòi hỏi phải giới hạn số lượng user
truy cập xác định.
Mutex dùng để tạo cơ chế độc quyền truy xuất, chỉ cho một user được sử dụng tài
nguyên tại một thời điểm.
Miền găng là một phiên bản thu nhỏ của mutex, chỉ thực hiện điều phối trong phạm vi
một tiến trình, giữa các tiểu trình (thread) tranh chấp tài nguyên của tiến trình với nhau.
Tại một thời điểm, chỉ cho một tiểu trình sử dụng tài nguyên của tiến trình.
3.1.4 So sánh về hệ thống file của hai môi trường
Đặc điểm Windows UNIX
Phân cấp và đa cây Phân cấp và đơn cây Cấu trúc tổng quát
Có (C,D) Không, mọi thứ được Có phân biệt ổ đĩa và thư mục
mount vào cây quản lý.
\ / Ký tự phân cách đường dẫn
Có Phân biệt chữ hoa và chữ thường Không
Trang 109
SMB NFS Hệ thống file mạng
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Không Có Tập tin thiết bị
Không Có Thiết lập ID của User quản lý
cho tập tin/ thư mục
ACLs Simple bit permissions Security
(cid:153) Tập tin thiết bị (device file) : trong UNIX, thiết bị phần cứng được đại diện bằng
những tập tin, thường chứa trong thư mục /dev. Nhờ đặc điểm này, ta có thể chạy một
chương trình nhưng hông thèm nhận kết quả trả về của nó bằng cách chuyển hướng kết
quả (redirect - tức dùng ký tự ‘>’ hoặc ‘<’ ) kết xuất của chương trình ra null device,
/dev/null. Dùng kỹ thuật tương tự, ta có thể gửi dữ liệu trực tiếp ra cổng song song
(serial port) ..
(cid:153) Hệ thống file mạng (Network File System)
Đối với UNIX, đó là Network File System – NFS, phát triển bởi Sun
Microsystems.Tóm gọn cơ chế như sau : NFS server sẽ cung cấp một thư mục cho
phép chia sẻ, và NFS client có quyền mount thư mục đó vào cây thư mục của mình.
Trên nền MS-DOS, việc chia sẻ tài nguyên được thực hiện thông qua NetBIOS
(Network Basic Input Output System), tự động chuyển đến thư mục/tập tin trên máy
tính khác khi yêu cầu I/O đến những thư mục/ tập tin này được chấp thuận. NetBIOS
sử dụng giao thức Server Message Block (SMB), ngày nay giao thức này được phát
triển thêm để có thể ứng dụng trên Internet và được gọi tên mới là Common Internet
Trang 110
File System (CIFS).
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153) Mô hình bảo mật của UNIX
UNIX gán quyền hạn truy cập của user trực tiếp lên file. Mô hình này làm việc tốt vì
UNIX sử dụng file để đại diện cho thiết bị, bộ nhớ và ngay cả tiến trình. User có thể là
người dùng đã đang nhập thành công vào hệ thống hoặc có thể là một service của hệ
thống. Mỗi USER thuộc về một GROUP và có một UID (User ID). Mỗi GROUP có
nhiều USER và có một GID (Group ID). Mỗi tiến trình đều thuộc về một UID và một
GID xác định.
(cid:153) Mô hình bảo mật của Windows
Trong mô hình trên
user : Người dùng đăng nhập thành công vào hệ thống.
objects : là những tài nguyên yêu cầu bảo mật của hệ thống. Ví dụ như tập tin, các
đối tượng đồng bộ hoá, các đối tượng kernel ...
Access Token : là một cấu trúc dữ liệu đi kèm với mỗi tiến trình , xác định người
dùng khởi động tiến trình này là ai, thuộc nhóm security nào. Mỗi Access Token
Trang 111
được định danh trong hệ thống thông qua một SID (Security Identifiers)
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Security Descriptor : thông tin mô tả thuộc tính bảo mật của mỗi tài nguyên.
Thông tin này bao gồm người chủ (owner) của object này là ai, và một danh sách
các quyền hạn cho phép truy cập DACL (Discretionary Access Control List ).
Danh sách này có thể bao gồm nhiều quyền, mỗi quyền được được gọi là một đơn
vị quyền hạn truy cập ACE ( Access Control Entry), trong ACE sẽ chứa danh sách
các SID được phép đối với quyền này.
Mô tả :
Khi một tiến trình truy xuất vào một tài nguyên có yêu cầu bảo mật, hệ thống sẽ
kiểm tra trong danh sách DACL của tài nguyên đó, cụ thể là ở mỗi ACE xem có SID
của tiến trình này có được phép không. Kết thúc quá trình này, hệ thống sẽ xác định
được những quyền hạn mà tiến trình được phép thực hiện đối với tài nguyên này và
dựa vào đó quyết định từ chối hay chấp nhận yêu cầu của tiến trình.
3.1.5 Giao diện người dùng
UNIX dựa trên giao tiếp lệnh là chính, người dùng gõ lệnh trực tiếp trong khi đó
Windows sử dụng hoàn toàn giao tiếp đồ hoạ (dù rằng vẫn hỗ trợ giao tiếp lệnh một
cách hạn chế). Lý do là khi UNIX được xây dựng, khả năng đồ hoạ của máy tính còn
rất hạn chế, đến giai đoạn Windows ra đời thì điều này đã được cải thiện.
Để cung cấp khả năng giao tiếp thông qua giao diện đồ hoạ tương tự Window cho
Trang 112
UNIX, một hệ thống hỗ trợ được gọi là XWindows, được phát triển bởi đại học MIT.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
3.1.6 Shell và script
Shell là một công cụ thông dịch các lệnh được nhập vào bởi người dùng và sau đó
“chạy” và thể hiện kết quả của các lệnh đó. Ngoài việc chạy các chương trình ra, shell
còn hỗ trợ thêm các đặc điểm cao cấp khác như cho phép gọi lại những lệnh đã được
thực hiện gần đó, và cung cấp một ngôn ngữ lập trình dạng script để có thể viết những
chương trình đơn giản.
Trên nền Windows, lệnh cmd.exe sẽ mở shell của Windows cho phép chạy các
command. Trên nền Windows, các script có thể kể đến là VBScript, JScript chạy được
nhờ Windows Script Host (WSH).
Trên nền UNIX : có nhiều kiểu shell
• Bourne Shell (sh) là shell đơn giản nhất và là shell mặc định, có thể gọi một
chương trình, tạo pipe nhưng không có bộ nhớ lệnh.
• C Shell (Csh) : có bộ nhớ lệnh và ngôn ngữ script tương tự như ngôn ngữ lập trình
C
• Korn Shell (Ksh) : có bộ nhớ lệnh và khả năng xây dựng script. Được phát triển
lên từ Bourne Shell.
UNIX giao tiếp với người dùng phần lớn thông qua gõ lệnh trực tiếp, nên các shell đóng vai
trò quan trọng. Bên cạnh các shell, một loại ngôn ngữ lập trình đơn giản khác cũng được hỗ
trợ là script : Python, Perl, TCL/TK ..
3.2 Sơ lược về phần mềm GRASS Phiên bản GRASS mới nhất (tính đến thời điểm 8/7/2004) là version 5.7
Trang 113
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
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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 toà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
Bên cạnh đó, hệ thống xử lý đồ họa trong Linux cũng hoàn toà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
Trang 114
bộ thư viện cơ bản nhất là XLIB, sẽ được xem xét kỹ hơn vào phần sau )
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Ngoà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ẽ
Trang 115
báo lỗi “Unexpected end of file ….”
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
+ 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ư
// đoạn code bằng C++ #ifdef __cplusplus extern "C" { #endif //.................. // đoạn code bằng C //.................. #ifdef __cplusplus
sau:
}
#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 ngoài Window bằng cách chọn
Trang 116
Property của MyComputer (cid:206) tab Advanced (cid:206) EnviromentVariable (cid:206) New)
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
- Danh sách các biến môi trường mà GRASS sử dụng:
Tên Biến Ý Nghĩa
Đường dẫn tuyệt đối đến thư mục cài đặt GISBASE
project GRASS .
(Ví dụ: c:\projects\grassProject )
Đường dẫn đến thư mục chứa database của GISDBASE
GRASS. (Ví dụ: c:\grassdata )
Đường dẫn đến thư mục dữ liệu làm việc của LOCATION_NAME
GRASS. (Ví dụ: c:\grassdata\spearfish )
Đường dẫn đến thư mục mapset mà GRASS sẽ MAPSET
làm việc.
(Ví dụ: c:\grassdata\spearfish\permanent )
Monitor đang được chọn để hiển thị hiện tại MONITOR
Chỉ đến thư mục lưu trữ file .grassrc5, là file GISRC
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 đó.
Biến này ghi nhận đường dẫn đến file GIS_LOCK
gis_lock, là file GRASS dùng để đảm bảo cơ
Trang 117
chế lock (khoá) của chương trình (chỉ chạy
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
một instance duy nhất ).
Thiết bị hiển thị đang được chọn. PAINTER
digitizer đang được chọn. DIGITIZER
Chiều rộng hiện tại của cửa số XWindow GRASS_WIDTH
(Monitor) đang được chọn .
Chiều cao hiện tại của cửa sổ Xwindow GRASS_HEIGHT
(Monitor) đang được chọn.
Lưu ID của Window (monitor) đang hiển thị. XDRIVER_WINDOW
Xác định Xdriver có sử dụng chế độ true color XDRIVER_TRUECOLOR
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”);
Ngoà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ớ
Trang 118
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:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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
(cid:153) 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,
Trang 119
(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
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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
(cid:153) Cấu trúc của Grass Database :
như lập trình viên)...
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:
(cid:198) Spearfish: C:\GRASSDATA\SPEARFISH\
(cid:198) Slovakia: C:\GRASSDATA\SLOVAKIA\
(cid:198) 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
Trang 120
thư mục không có file nào thì có nghĩa là Mapset không có Raster files nào.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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
Trang 121
GRASS được phân cấp từ thấp đến cao:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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 toá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
Trang 122
Display, nhưng ở mức thấp hơn. (được các hàm
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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 toán “toán học”.
SRC\LIBES\IBTREE\ Bộ thư viện về khác về BTREE
Trang 123
…….. …còn nhiều nữa.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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 toán, phân tích, thuật toá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 (
ứ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
Trang 124
1) Nhóm lệnh D.*
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Đượ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
....
Trang 125
Ghi chú:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:198) 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 ngoà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 hoàn toà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ó
Trang 126
EVENT nào được gửi tới cho MONITOR xi hay không? Nếu có thì thực hiện hành
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
độ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 toán thì sẽ tính toán để trả kết quả về bằng cách ghi kết quả vào
file fifo.ib ).
(cid:206) 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:
tra EVENT lại bằng cách gửi EVENT có tên là • Đóng Process kiểm
“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
Trang 127
• Đóng cửa sổ MONITOR xi đang mở lại (XDestroyWindow(..))
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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 ngoà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 hoàn toà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:
Trang 128
• Phân tích cú pháp để lấy ra “raster_name”
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
• 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 toá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 \
Trang 129
::any terminal
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:198) 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ả
Trang 130
Driver này dùng để điều khiển kết quả XDRIVER
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
xuất ra màn hình XWindow
Xuất ra file dạng CELL CELL
Xuất ra file dạng Webpage HTML HTMLMAP
Xuất ra dạng file ảnh PNG PNGDRIVER
- 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 (cid:197)(cid:198) fifo.1b
x1 XDRIVER fifo.2a (cid:197)(cid:198) fifo.2b
x2 XDRIVER fifo.3a (cid:197)(cid:198) fifo.3b
x3 XDRIVER fifo.4a (cid:197)(cid:198) fifo.4b
x4 XDRIVER Fifo.5a (cid:197)(cid:198) fifo.5b
x5 XDRIVER Fifo.6a (cid:197)(cid:198) fifo.6b
x6 XDRIVER Fifo.7a (cid:197)(cid:198) fifo.7b
Trang 131
CELL CELL Fifo.8a (cid:197)(cid:198) fifo.8b
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
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
Để có thể trao đổi thông tin qua lại giữa người sử dụng (hoặc lập trình viên) với thiết bị
Driver, Grass thiết lập một cơ chế Send Event được mô tả tổng quát như sau:
Khi người sử dụng các hàm của thư viện Display (có tiền tố là D_ ), hoặc các hàm thư •
viện của Raster (có tiền tố là R_ ), để thực hiện một công việc gì đó, giả sử là vẽ ra màn
hình một hình chữ nhật chẳng hạn, (hàm R_Box_Abs()… chẳng hạn), thì hàm này sẽ
không trực tiếp thực hiện vẽ mà nó sẽ gửi một EVENT là có tên là “hình chữ nhật”
chẳng hạn,… đến cửa sổ MONITOR hiển thị hiện tại, Driver của Monitor này sẽ bắt lấy
EVENT “hình chữ nhật” này, và thực hiện yêu cầu của EVENT là “vẽ hình chữ nhật” ra
màn hình MONITOR.
Nếu EVENT gửi đi có yêu cầu nhận kết quả trả về thì Driver sẽ tính toán kết quả cần •
thiết để trả về cho người dùng.
Các EVENT được xử lý theo nguyên tắc FIFO (First In First Out), EVENT tới trước •
Trang 132
được xử lý trước….
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Mô hình phác họa:
Programmer/User (cid:197)(cid:198) Display (cid:197)(cid:198) Raster (cid:197)(cid:198) Drivers
(cid:153)Cách thức Send một EVENT & nhận kết quả trả về:
- Mỗi monitor xi bất kỳ đều có 2 file fifo.ia, fifo.ib dùng để nhận và xử lý EVENT (xác
định trong file monitorcap ).
- Send một EVENT tới monitor xi đơn giản chỉ là mở file fifo.ia của monitor xi đó ra để ghi
EVENT vào
- Chú ý:
Các EVENT đã được quy định sẵn, EVENT được ghi vào file theo 1 định dạng cấu trúc đã
được quy định. Cấu trúc khi ghi 1 EVENT vào file như sau:
COMMAND_ESC EVENT_NAME PARAMETER1, PARAMETER2,…
Trong đó,
COMMAND_ESC : là EVENT đặc biệt, đã được quy định sẵn (mã là 127), dùng để
thể hiện sự bắt đầu của một EVENT mới
EVENT_NAME : tên của EVENT cần gửi đi
PARAMETER1,PARAMETER2, ….. : Các thông tin tham số gửi kèm theo event đó,
tùy theo loại event được gửi đi mà các tham
số này có thể có hoặc không.
Ví dụ:
Khi cần yêu cầu vẽ một hình chữ nhật với các tọa độ là (5, 10), (50, 25) ra màn hình, Grass
sẽ ghi vào file fifo.ia nội dung như sau:
Trang 133
COMMAND_ESC BOX_ABS 5 10 50 25
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Ghi chú:
Hàm dùng để ghi EVENT vào file fifo.ia là: _send_ident(“event”);
Hàm này bao gồm cả ghi vào COMMAND_ESC + EVENT
Các hàm dùng để ghi thông tin tham số vào thường dùng là:
_send_int(int*);
_send_char(char*);
_send_float(float*);
_send_text(char *text);
_send_int_array(int, int*);
_send_char_array(int, char*);
Trước khi ghi event vào file bằng hàm _send_ident(..) trên, chúng ta phải mở kết nối đến
Driver của Monitor hiện hành bằng hàm: R_Open_Driver()
// mở kết nối đến file fifo
// Send sự kiện BOX_ABS
// các thông tin tham số kèm theo, …left
// …top
// …right
int t; _send_ident(BOX_ABS); t = 5; _send_int(&t); t = 10; _send_int(&t); t = 50; _send_int(&t); t = 25; _send_int(&t);
// …bottom
if (R_Open_Driver()) { }
Lấy ví dụ trên, yêu cầu vẽ một hình chữ nhật:
Sau khi gửi EVENT đi, nếu là EVENT có yêu cầu nhận kết quả trả về thì kết quả trả về sẽ
Trang 134
được ghi vào file fifo.ib, chỉ cần đọc lên kết quả yêu cầu tương ứng.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
_get_int(int*); _get_float(float*); _get_text(char*); char*_get_text2(void); _get(char*, int);
Các hàm dùng để nhận kết quả trả về thông dụng là: (đọc từ file fifo.ib)
Lấy ví dụ gửi một EVENT có yêu cầu kết quả trả về, chẳng hạn là event SCREEN_TOP,
// mở kết nối đến file fifo
// biến lưu kết quả trả về
int Result; _send_ident(SCREEN_TOP);// Send sự kiện SCREEN_TOP _get_int(&Result);
// nhận kết quả trả về sau khi send y/c
if (R_Open_Driver()) { }
event này khi được gửi đi sẽ yêu cầu trả về tọa độ bên trên của màn hình hiện hành :
Result sẽ chứa kết quả trả về sau khi gửi yêu cầu SCREEN_TOP.
(cid:153) Cách thức nhận & xử lý một EVENT:
(cid:198) Các hàm trên đều cài đặt ở trong file src\ libes\ raster\ io.c
EVENT chỉ được xử lý khi có có ít nhất một MONITOR xi đang chạy (d.mon start=xi ) •
• Khi một MONITOR xi được khởi tạo bằng lệnh d.mon start=xi (i = 0, 1, 2…6), nó cũng
sẽ khởi động một process chạy song song liên tục, process này sẽ mở file fifo.ia để đọc
và kiểm tra liên tục các EVENT đang được ghi trong file này. Nó sẽ bắt lấy các EVENT
đó, và dựa vào EVENT đó là gì mà sẽ đọc tiếp cấu trúc các tham số truyền theo event và
đưa ra các xử lý thích hợp. (như vẽ ra màn hình, v.v…).
Chú ý là EVENT + tham số truyền ghi vào làm sao thì khi đọc lên phải đọc theo đúng •
Trang 135
cấu trúc như vậy. Ví dụ: khi nhận được event BOX_ABS thì phải đọc tiếp theo đúng 4
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
số liên tiếp nữa để lấy tiếp toạ độ cần vẽ của BOX_ABS. Không được đọc ít hay nhiều
hơn…Sẽ gây sai hoàn toàn hệ thống.
Nếu EVENT nhận được là event có yêu cầu trả về kết quả, thì kết quả sẽ được tính toán •
và trả về bằng cách ghi vào file fifo.ib tương ứng.
Ghi chú:
- Hàm đọc event từ file fifo.ia lên là : get_command(char*);
- Các hàm thường dùng để đọc thông tin các tham số kèm theo event là:
(đọc từ file fifo.ia - có sự tương ứng với các hàm ghi thông tin tham số ở trên)
read1(char*) get1(char*) REC(a, b) RECTEXT(x, s)
- Các hàm thường dùng để gửi trả lại kết quả cho User (đối với các event có yêu cầu kết
quả) là: ( ghi vào file fifo.ib )
SEND(a, b) SENDTEXT(x) RESULT(int)
// đọc event trong file fifo.1a
Ví dụ:
… char *event; get_command(&event); switch (event) {
case BOX_ABS:
REC(&l, sizeof l); REC(&t, sizeof t); REC(&r, sizeof r);
// nếu là yêu cầu vẽ hình chữ nhật // thì đọc tiếp 4 tọa độ vẽ kèm theo // … top // … right
Trang 136
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
// … bottom // thực hiện vẽ hcn ra màn hình
REC(&b, sizeof b); Box_abs(l, t, r, b); break;
// biến index
case SCREEN_TOP: // nếu yêu cầu tính tọa độ scr_top Screen_top(&index); // thì tính tọa độ scr_top gán cho SEND(&index, sizeof index); // trả kết quả index về cho User break;
}
(cid:153)Cấu trúc của file fifo.ia
(cid:198) Các hàm trên đều được cài đặt trong file src\ display\ devices\ lib\ command.c
Là một dãy các cấu trúc sự kiện, mỗi cấu trúc sự kiện có định dạng như đã nói là:
COMMAND_ESC EVENT_NAME [ PARAMETER1, PARAMETER2,… ]
(cid:153)Cấu trúc của file fifo.ib
trong đó, parameter là optional, tùy sự kiện được send mà có thể có hoặc không.
Là một dãy các kết quả được trả về tương ứng với sự kiện trong file fifo.ia, kết quả trả về
tuân theo nguyên tắc fifo, và kết quả trả về có thể là một, hoặc nhiều kết quả.
Trang 137
RESULT1 RESULT2 RESULT3 ……
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153)Mô Hình Minh Họa Tổng Thể Cho Cơ Chế Send Event
Window MONITOR
Event Receive
[ Send Result ]
Fifo.1a
Fifo.1b
[ Receive Result ]
Event Request
DISPLAY REQUEST (Display/Raster)
Hình 3 - 4 Mô hình minh họa cơ chế Send Event trong GRASS5
Trang 138
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153)Danh sách các EVENT:
Tên EVENT Mục Đích
BEGIN
Dùng để phát tín hiệu bắt đầu sẵn sàng nhận event (khi mở Driver fifo.ia)
RESPOND
GET_NUM_COLORS Event này dùng để lấy về số màu đang dùng để hiển thị window
STANDARD_COLORS Event này dùng để truyền thiết lập màu chuẩn cho window MONITOR.
COLOR Event này dùng để sử dụng màu color mới cho MONITOR
RGB_COLOR
Event này giống như COLOR, nhưng tham số màu được truyền với 3 thành phần là : Red, Green, Blue !
COLOR_TALBE_FIXED Tính toán bảng màu của XWindow và trả về trong biến NCOLORS
COLOR_TABLE_FLOAT với nhưng
Giống COLOR_TABLE_FLOAT, kết quả trả về là số thực.
Thiết lập giá trị color_offset mới COLOR_OFFSET
Thiết lập giá trị color_print mới COLOR_PRINT
CONT_ABS Event này yêu cầu vẽ đường thẳng tới 2 điểm x, y cho trước
CONT_REL Giống với CONT_ABS, nhưng vẽ từ điểm hiện tại
Trang 139
BOX_ABS Event này yêu cầu vẽ hình chữ nhật với toạ độ 4 điểm cho trước.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
BOX_REL Giống với BOX_ABS nhưng vẽ từ điểm hiện tại.
ERASE
bằng send
MONITOR khi nhận được event này sẽ thực hiện việc xoá toàn bộ màn event cách hình BOX_ABS với toạ độ hình chữ nhật là toạ độ màn hình.
GET_LOCATION_WITH_BOX
Sử dụng thiết bị chuột để lấy về trạng thái của các nút chuột và vị trí toạ độ mới của MONITOR.
GET_LOCATION_WITH_LINE Tương tự với GET_LOCATION_WITH_BOX
GET_LOCATION_WITH_POINTER Tương tự như trên
GRAPH_CLOSE
Khi MONITOR nhận được EVENT này thì nó sẽ đóng MONITOR và kết thúc process kiểm tra EVENT.
LINE_MOD
MOVE_ABS Di chuyển vị trí toạ độ hiện tại trên màn hình sang toạ độ mới
MOVE_REL Giống với MOVE_ABS, nhưng di chuyển tự vị trí hiện tại
… RASTER_CHAR
… RASTER_INT
… RGB_RASTER
… RGB_COLORS
POLYGON_ABS Yêu cầu MONITOR vẽ ra hình Polygon với toạ độ cho trước
Trang 140
Giống với POLYGON_ABS nhưng POLYGON_REL
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
vẽ từ vị trí toạ độ hiện tại.
POLYLINE_ABS Yêu cầu MONITOR vẽ ra hình Polyline với tập điểm cho trước
POLYLINE_REL Giống với POLYLINE_ABS, nhưng vẽ từ vị trí toạ độ hiện tại.
POLYDOTS_ABS Yêu cầu MONITOR vẽ ra hình tập điểm với tập điểm cho trước
POLYDOTS_REL Giống với POLYDOTS_ABS, nhưng vẽ từ vị trí toạ độ hiện tại.
Reset lại colors, có tính đến min, max RESET_COLORS
RESET_COLOR Reset lại colors, không tính đến min, max
SCREEN_LEFT Yêu cầu trả về giá trị của toạ độ TRÁI của MONITOR
SCREEN_TOP Yêu cầu trả về giá trị của toạ độ TRÊN của MONITOR
SCREEN_RITE Yêu cầu trả về giá trị của toạ độ PHẢI của MONITOR
SCREEN_BOT Yêu cầu trả về giá trị của toạ độ DƯỚI của MONITOR
SET_WINDOW Thiết lập lại vị trí (top, left, right, bottom) của MONITOR
GET_TEXT_BOX Lấy về giá trị text trong box có vị trí toạ độ (t, l, r, b)
FONT Khởi tạo font và trả về ID của font khởi tạo
Trang 141
TEXT Định dạng lại đoạn Text cho trước bằng hàm soft_text(…)
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
TEXT_SIZE Trả về kích thước của đoạn Text cho trước.
Quay một đoạn text cho trước. TEXT_ROTATION
PANEL_SAVE Save một Panel cho trước (một vùng Region trên màn hình) vào file
PANEL_RESTORE Load một Panel đã xây trước đó lên màn hình.
Huỷ một Panel đã lưu. PANEL_DELETE
Tạo một PAD mới vào xâu pad_list PAD_CREATE
Ghi chú: Các định nghĩa về PAD sẽ được nói rõ hơn ở phần sau.
Trả về PAD đang sử dụng hiện tại PAD_CURRENT
PAD_DELETE Huỷ một PAD cho trước ra khỏi xâu pad_list
Trả về ID của PAD cho trước PAD_INVENT
Trả về con trỏ đầu xâu pad_list PAD_LIST
PAD_SELECT Chọn một PAD cho trước làm PAD hiện hành.
PAD_GET_ITEM Trả về xâu Item của một PAD cho trước
PAD_SET_ITEM Thiết lập xâu Item của một PAD cho trước.
Thêm Items vào một PAD cho trước PAD_APPEND_ITEM
Xoá Items của một PAD cho trước. PAD_DELETE_ITEM
Trang 142
PAD_LIST_ITEMS Liệt kê xâu Items của một PAD cho trước.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
3.5.3.5 Khái niệm hệ thống đồ họa XWindow trong Linux
Trong Unix, màn hình (display) được quản lý bởi một chương trình duy nhất là server,
server sẽ nhận những yêu cầu vẽ và xóa từ những chương trình cần sử dụng màn hình
(được gọi là client). Giao tiếp giữa client và server được thực hiện thông qua giao thức
X (X protocol). Giao thức này có những đặc điểm sau:
(cid:153) Server và client có thể cùng nằm trên một máy, hoặc cũng có thể nằm trên
nhiều máy, liên lạc nhau thông qua một mạng máy tính.
(cid:153) Chỉ có server là bị phụ thuộc vào phần cứng máy tính (màn hình), còn giao
thức X lại không phụ thuộc vào phần cứng, vì vậy chương trình client có thể
chạy và sử dụng màn hình của một máy tính khác từ xa
(cid:153) Server có thể xử lý nhiều yêu cầu của nhiều client cùng lúc trên cùng một
màn hình, các client này cũng có thể giao tiếp với nhau thông qua server
(cid:153) Một client có thể nối kết với nhiều server
Mỗi client gửi yêu cầu tạo ra hoặc bỏ đi một hoặc nhiều cửa sổ trên màn hình. Các cửa
sổ được tổ chức theo dạng cây, đầu tiên là cửa sổ gốc của màn hình, mỗi client sẽ tạo
ra ít nhất một cửa sổ top-level của mình, những cửa sổ còn lại sẽ là con của cửa sổ top-
level này. Khi một cửa sổ con vượt ra ngoài giới hạn của cửa sổ cha, phần vượt quá sẽ
bị cắt bỏ.
Ðối với server, cửa sổ cũng như tất cả những đối tượng vẽ khác đều là resource, trong
đó có một số resource quan trọng:
(cid:153) Pixmap: là một vùng chữ nhật vẽ được, nhưng không nằm trên màn hình,
pixmap được tạo thành từ những đơn vị nhỏ nhất là pixel. Mỗi pixel có một
độ sâu, được biểu diễn bằng một số bit (còn gọi là plane). Vì vậy mỗi pixel
có một giá trị phụ thuộc vào độ sâu của vùng vẽ. Một pixmap có độ sâu là
Trang 143
một bit được gọi là bitmap, từng pixel trong một bitmap có 2 giá trị: 0 và 1
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153) Colormap là cách xác định màu từ các giá trị của pixel, mỗi màu được tổ
hợp từ 3 giá trị mức độ đỏ (red), xanh dương (green) và xanh lá cây (blue)
(RGB). Mỗi cửa sổ có một colormap được xác định màu của từng pixel.
(cid:153) Font
(cid:153) Cursor là một đối tượng chứa thông tin cần thiết để biểu diễn đồ họa cho
con trỏ chuột. Nó bao gồm một source bitmap, một shape bitmap, một
hotspot (vị trí hiện thời của con trỏ), và 2 màu.
(cid:153) Graphic context (GC) là một tập hợp các thuộc tính để xác định cách các
tác vụ trên một vùng vẽ sẽ ảnh hưởng đến vùng này. Mỗi tác vụ sẽ sử dụng
một GC do client cung cấp, ví dụ một vài thuộc tính của GC là foreground
pixel, background pixel, bề dày đường, vùng cắt bỏ (clip).
(cid:153) Property là một cấu trúc dữ liệu có tên của một cửa sổ, các client dùng
property để giao tiếp với nhau.
Mỗi client nối kết với một hoặc nhiều server, chúng trao đổi các request (yêu cầu),
reply (trả lời), error (báo lỗi), event (sự kiện). Client gửi request đến server để yêu cầu
vẽ hoặc xóa, server gửi reply lại nếu client có yêu cầu thông tin, khi gặp lỗi server sẽ
gửi thông báo error cho client. Server sẽ gửi event để thông báo các thay đổi trạng thái,
như khi có một phím được nhấn hoặc con trỏ chuột bị di chuyển.
Các chương trình giao tiếp với X Server như thế nào ?
Các chương trình không trực tiếp giao tiếp với X server, chúng sẽ sử dụng các thư viện
có sẵn để giao tiếp. Có 3 thư viện như vậy là Xlib, X Toolkit Intrinsics (Xt), và Motif.
i) Thư viện Xlib
X protocol có sẵn một interface được giao tiếp với X server, được gọi là Xlib. Các
Trang 144
chức năng chính của Xlib có như sau:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153) Các lệnh để tạo ra và quản lý các resource của server, bao gồm cửa sổ, pixmap,
font, cursor, GC, và property
(cid:153) Lệnh để thêm chữ và hình ảnh vào các vùng vẽ
(cid:153) Cấu trúc dữ liệu được chứa các event, lệnh để chọn và đọc các event
(cid:153) Lệnh để sử dụng các colormap
(cid:153) Lệnh đọc và ghi chữ
(cid:153) X resource manager (Xrm) là một cơ sở dữ liệu các tùy chọn được xác định bởi
người sử dụng chương trình.
Xrm là ý tưởng chủ đạo của X: người sử dụng và chương trình phải tự điều khiển hình
dáng, cách tương tác và màu sắc của đối tượng đồ họa. Những yếu tố này được biểu
diễn bằng các resource, một chương trình sẽ có các giá trị mặc định cho những
resource này, và người sử dụng sẽ sửa lại nếu cần thiết
Resource là một bộ ba gồm tên, class, và giá trị. Một class có thể chứa một tập các
resource khác tên nhau. Resource có thể được tổ chức phân cấp trong một chương
trình. Tên hoặc class đầy đủ của một resource sẽ là tên bắt đầu từ tên hoặc class của
chương trình và kết thúc bằng tên hoặc class của resource
Resource manager cho phép một chương trình hoặc người sử dụng xác định các
resource: trong một file, trên dòng lệnh, hoặc gọi một lệnh Xrm trong chương trình.
ii) Thư viện Xt
Mặc dù Xlib đã cung cấp các phương tiện cơ bản được giao tiếp với X server, những
lệnh này là rất cơ bản và sẽ bắt lập trình viên viết rất nhiều
X cũng kèm theo một thư viện, X Toolkit Intrinsics (Xt), để cung cấp một số hàm mức
Trang 145
độ cao hơn. Các thành phần quan trọng nhất là:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
(cid:153) Các đối tượng, còn gọi là widget, dùng để chứa dữ liệu và interface đối với
người sử dụng
(cid:153) Quản lý hình dáng các widget
(cid:153) Phân phối và xử lý các event
Widget
Widget class là một tập hợp các procedure và cấu trúc dữ liệu dùng chung cho tất cả
widget thuộc cùng class. Một đối tượng widget chứa các procedure và dữ liệu riêng của
mình. Xt có sẵn và đặt tên sẵn cho các class widget, người lập trình sẽ tạo ra và đặt tên
cho các đối tượng widget.
iii) Thư viện Motif
Motif cung cấp thêm nhiều lệnh để tạo ra các widget phục vụ cho những mục đích khác
nhau khi giao tiếp với người sử dụng. Sau đây là tóm tắt các chức năng này:
Kiểu dáng trực quan
Các widget của Motif đều có các kiểu dáng trực quan, các đường biên có màu sắc khác
nhau tạo cảm giác widget nổi lên hoặc chìm sâu xuống so với nền. Một widget đang là
đối tượng tác động của bàn phím sẽ có đường biên được tô sáng. Khi con trỏ chuột trên
một button và người sử dụng nhấn nút Btn1, màu của button sẽ thay đổi tạo cảm giác
được nhấn. Tất cả các màu sắc hình dáng của widget đều được chọn mặc định, người
sử dụng hoặc chương trình cũng có thể chọn riêng cho mình màu sắc hoặc ảnh pixmap.
Motif có một cơ chế kéo và thả rất đầy đủ để truyền dữ liệu, dữ liệu được kéo từ một
điểm bằng nút Btn2 sang điểm đích, khi người sử dụng thả chuột, dữ liệu sẽ được
Trang 146
chuyển, sao chép hoặc liên kết đến đích.
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Sử dụng Xlib, Xt và Motif
Xt được xây dựng trên Xlib, và Motif lại được xây dựng trên Xt. Tuy nhiên Xt không
thay thế hết các interface của Xlib, và Motif cũng không thay thế hết các interface của
Xt. Bất kỳ chương trình Motif nào cũng phải sử dụng các lệnh Xt cơ bản được khởi
tạo, quản lý các widget, xử lý các resource, tạo ra các hàm callback, và để vào vòng lặp
xử lý event.
Theo quy ước, tên của các hàm và cấu trúc dữ liệu của Xlib bắt đầu bằng ‘X’, của Xt
bắt đầu bằng ‘Xt’, của Motif bắt đầu bằng ‘Xm’.
Ðể viết chương trình sử dụng Motif, lập trình viên trước hết phải quen với các chương
trình Xt đơn giản và hiểu biết về Xlib.
3.5.3.6 Cài đặt và sử dụng các hàm X (Xlib) trên Window32
Để thực hiện các thao tác đồ họa trên MONITOR, Grass sử dụng hệ thống thư viện cơ
bản nhất của Unix, đó là XLIB. Hệ thống hàm X của Xlib nói theo nghĩa nào đó, tương
tự như các hàm đồ họa API trên hệ điều hành Window.
Khi MONITOR được yêu cầu vẽ cái gì đó ra màn hình thì Driver của nó sẽ sử dụng thư
viện các hàm vẽ của nó mà bao bọc bên trong đó là thư viện các hàm X.
int draw_line (int cur_x, int cur_y, int x, int y) { …………………….. XDrawLine(dpy, bkupmap, gc, cur_x, cur_y, x, y); needs_flush = 1; return 0; }
Trang 147
Ví dụ:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Cấu trúc dữ liệu của các hàm X rất phức tạp, được tổ chức theo nhiều xâu kép nối với
nhau, tạo thành một dãy các phần tử NT_WINDOW, cùng với các khái niệm Display,
Screen v.v…
Ngoài ra, còn phải xử lý chuyển các sự kiện của XWindow sang sự kiện của Window,
xử lý cấu trúc dữ liệu của các cửa sổ….
Vì thế, việc viết lại hệ thống các hàm X của XWindow trên nền MS Window là một
công việc vô cùng phức tạp, khó khăn nếu không muốn nói là nan giải (!).
Tuy nhiên, không phải bài toán khó nào cũng không có lời giải. Rất may mắn cho
chúng ta, nhóm phát triển dự án Cygwin, trong nỗ lực cố gắng xây dựng một môi
trường giả lập Linux thật hoàn hảo trên Window, cùng với mong muốn Grass5 cũng có
thể chạy trên nền Window thông qua Cygwin, đã phát triển hệ thống các hàm thư viện
giả lập hệ thống XLIB của Unix trên Window. (Open Source)
Source code nằm trong thư mục src\ display\ devices\ windows\ libW11\
Trong thư mục này có các thư mục con sau:
X11\ : Chứa các file tiêu đề (.h) mô tả thư viện Xlib
Muốn sử dụng Xlib, chỉ cần include các file này.
w32\ : Chứa source code chính của các thư viện Xlib, sẽ được dịch thành DLL
wrap\ : là thư mục chứa lớp bao bọc của xlib, chúng ta sẽ sử dụng các hàm X
thông qua lớp này, không gọi trực tiếp xuống thư viện Xlib
Tuy nhiên, mặc dù các hàm thư viện xlib này được viết bằng WinAPI, nhưng chúng
chỉ được xây dựng để chạy trên nền Cygwin, và chúng chỉ là bộ thư viện cơ sở cấp
thấp. Chúng được viết giả lập lại các hàm X trên Unix, nhưng chúng ta không thể gọi
Trang 148
sử dụng trực tiếp các hàm này được. Muốn sử dụng được, chúng ta phải cần đến một
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
lớp bao bọc bên trên các hàm này, lớp này sẽ xử lý, khởi tạo sơ bộ những yếu tố cần
thiết để sẵn sàng gọi đến bộ thư viện X này.
Cụ thể là, source code bộ thư viện xlib.c sẽ được chúng ta chủ động đóng gói lại thành
một thư viện động DLL tên là libG11.dll, sau đó chúng ta sẽ dùng các file khác cài đặt
lại prototype của các hàm X, có xử lý sơ bộ trước khi lại gọi xuống chính các hàm X
đó trong thư viện động libG11.dll.
Ví dụ:
Thư viện Xlib.c (đã xây dựng thành libG11.dll) có hàm XopenDisplay(int a, int b, int
c);
Để sử dụng hàm này, ta không gọi trực tiếp từ thư viện libG11.dll mà ta phải xây dựng
một hàm khác cùng tên, làm các xử lý sơ bộ, trước khi gọi làm hàm thật sự của Xlib,
void XOpenDisplay(int a, int b, int c) {
// Các xử lý sơ bộ int test = Set_Atom(_register_class(..)); //chỉ là ví dụ //Sau đó mới gọi các hàm Xlib trong libG11.dll LoadDLL_XOpenDisplay(a, b, c);
}
như sau:
Trên đây chỉ là minh họa thuật giải, còn cụ thể, xem trong các file wrap\wrap.c &
wrap\xwrappers.gen
Ghi chú:
Load một hàm thư viện từ DLL ngoài cách sử dụng file .lib trong Setting của VC++, ta
còn có thể load trực tiếp từ file .DLL mà không cần file .lib, bằng các hàm sau:
LoadLibrary();
Trang 149
GetProcAddress();
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Ví dụ:
// load thư viện libG11.dll // đọc con trỏ hàm “name”
void *f = NULL; _lib = LoadLibrary(“libG11.dll”); f = GetProcAddress(_lib,name); return f; // trả về con trỏ hàm của hàm “name”
static void* _lib; // hàm sau load một hàm tên “name” trong DLL lên để sử dụng void* _loadfunc(char *name) { }
Load một hàm thư viện:
//khai báo dạng thức hàm của hàm XOpenDisplay trong thư viện typedef Display * (proto_XOpenDisplay)(const char *name); //khai báo con trỏ hàm XOpenDisplay static proto_XOpenDisplay *func_XOpenDisplay = NULL; Display * XOpenDisplay(const char *name) {
//load hàm thư viện XOpenDisplay lên
func_XOpenDisplay=(proto_XOpenDisplay *)_loadfunc("XOpenDisplay");
//gọi thực hiện nó return (func_XOpenDisplay)(name);
}
Trang 150
Gọi thực hiện một hàm thư viện:
Chương 3: Quá trình chuyển đổi GRASS5 từ Unix lên Windows
Mô Hình Xây Dựng Thư Viện XLIB:
USER / GRASS
XLIB LIBRARY
Wrap.c
libG11.dll
ntutil.c
xlib.c
event.c
Hình 3 - 5 Kiến trúc thư viện XLIB
Trang 151
Chương 4: Tổng kết
Chương 4 : Tổng Kết
4.1 Kết Luận Với GRASS5, chúng em đã chuyển đổi được hầu hết các thư viện (gis, display, raster,
bitmap, v.v…) và dịch vụ nền cơ bản, các xử lý tính toán, và một phần nhỏ của nhóm
lệnh hiển thị bên trên (d.mon, d.rast … ). Điểm nhấn của dự án là đã khởi động và hiển
thị được cửa sổ MONITOR của GRASS với XWindow trên môi trường Windows.
Khối lượng mã nguồn của GRASS5 tuy đồ sộ và phức tạp, nhưng với những gì đã đạt
được, chúng em tin rằng có thể tiếp tục chuyển đổi được hết những khối lệnh còn lại.
Nếu có nhiều thời gian hơn nữa, dự án chắc chắn sẽ thành công rực rỡ.
4.2 Hướng Phát Triển Trong thời gian vừa qua, chúng em đã đặt được cái nền cơ bản, tạo nền tảng vững chắc
để phát triển tiếp sau này. Với khối lượng mã nguồn đã chuyển được, chương trình có
thể được phát triển tiếp, chuyển đổi nhiều hơn nữa các chức năng mạnh mẽ của
GRASS5, phần mềm mà đến bây giờ đã được phát triển đến phiên bản 5.7, một cách
Trang 152
trọn vẹn.
Tài liệu tham khảo
Tài Liệu Tham Khảo Albrecht, J. : GTZ-handbook GRASS. Vechta, Germany, 1992 Hoặc xem tại địa chỉ sau: http://www.laum.uni-hannover.de/iln/grass/ Byars, B.W., Clamons, S.F. : GRASS 4.2 Reference Manual. Waco, U.S.A, 1997 Hoặc xem tại địa chỉ sau: http://www.baylor.edu/~grass/ Fox, J. : RIM database system. Installers manual. University of Washington, 1989 Fox, J. : RIM database system. Users manual. University of Washington, 1989 Harmon, V., Shapiro, M. : GRASS tutorial: Image processing. CERL, Champaign, Illinois, 1992 Jensen, J. R. : Introductory Digital Image Processing: A remote sensing perspective. Second Edition. New Jersey, 1996 Larson, M., Shapiro, M., Tweddale, S. : Performing map calculations on GRASS data : r.mapcalc programming tutorial. CERL, Champaign, Illinois, 1991 Hoặc xem tại địa chỉ sau: http://www.laum.uni-hannover.de/iln/grass/ Lillesand, Th. M., Kiefer, R. W. : Remote sensing and image interpretation. New York, 1994. Neidig, C.A., Gerdes, D., Kos, Ch. : GRASS 4.0 map digitizing manual: v.digit. CERL, Champaign, Illinois, 1991. Neteler, M. : Das GRASS Handbuch. Ein problemorientierter Leitfaden. 3. Auflage, Hannover, Germany, 1998. Phiên bản trước có tại: http://www.laum.uni-hannover.de/iln/grass/handbuch/ Shapiro, M., Westerveld, J. : GRASS programmer's manual. CERL, Champaign, Illinois, 1991. Shapiro, M., Westerveld, J. : GRASS user's manual. CERL, Champaign, Illinois, 1991.
Trang 153
Phụ lục
Phụ Lục
Một số kỹ thuật chuyển đổi
(cid:198) Kỹ thuật ReDirect Output Stream
Kỹ thuật này dùng để chuyển hướng lại output, thay vì xuất ra dòng stdout, chúng ta sẽ
chuyển hướng sang một ListBox. Sử dụng kỹ thuật này chủ yếu để bắt lấy output của
các hàm printf(..), fprintf(..), tạo dễ dàng cho việc xử lý.
Chi tiết của kỹ thuật này, xem trong mã nguồn chương trình.
(cid:198) Kỹ thuật xử lý PAD của GRASS
Khi tạo hay xử lý trên cửa sổ XWindow thì GRASS có sử dụng xâu liên kết đôi
PAD...(cấu trúc xâu PAD và các xử lý trên xâu đó được định nghĩa độc lập trong 2 file
pad.h và pad.c trong thư mục device/lib)
Khi cần thao tác trên cửa sổ XWindow, các hàm R_xxx_Pad sẽ được gọi.
Các hàm R_xxx_Pad này sẽ thực hiện bằng cách gửi sự kiện cùng với tham số dữ liệu
kèm theo sự kiện đó vào file fifo.1a, khi đó, bộ xử lý command (thread) sẽ đón lấy sự
kiện và dữ liệu kèm theo này để xử lý bằng cách gọi lại các hàm PAD chuẩn đã được
định nghĩa ở trên như create_pad(), find_pad() v.v... để thực hiện và trả kết quả xử lý
được về (bằng cách ghi vào file fifo.1b).
PAD chẳng qua là một xâu kép như sau:
Trang 154
pad1 <=> pad2 <=> pad3 <=> ...<=> pad n
Phụ lục
Mỗi PAD có một tên định danh riêng, và một danh sách liên kết ITEM
Mỗi danh sách liên kết ITEM lại nắm giữ một xâu LIST, mỗi phần tử LIST có giá trị
riêng.
Bởi vậy, thường hay có câu sau đây:
"...duyệt hết các Item của Pad này "
"...duyệt hết các List của Item này "
Ở đây, xâu này bắt đầu bằng biến con trỏ toàn cục "padlist" trong file pad.c
Và pad được khởi tạo ban đầu create_pad("").
Hàm create_pad (char *name) :
Để tạo ra một PAD mới có tên là name, rồi gắn nó vào đầu xâu
pad_mới <=> pad1 <=> pad2 <=> ...<=> pad n
Hàm find_pad (char *name) :
Trả về con trỏ đến một phần tử pad có tên là name trong xâu, nếu có.
Sự Kiện PAD_GET_ITEM:
Để lấy giá trị của toàn bộ danh sách LIST trong ITEM của PAD hiện tại (currentPad).
Cụ thể là sau khi gửi sự kiện PAD_GET_ITEM với tham số là tên của Item (chẳng hạn
Trang 155
như là "cur_w" )
Phụ lục
//gửi tiếp tham số là tên của Item.
_send_ident(PAD_GET_ITEM); //gửi sự kiện _send_text("cur_w"); _get_char(&result); // ghi thực sự vào file và nhận lại kết quả ................................................................................................. // Tới đây thì thread chạy ngầm bên kia của chúng ta // sẽ bắt lấy và xử lý Sự Kiện này RECTEXT(text, text_size); /* đọc lên tham số được kèm theo:
tên của Item, cụ thể ở đây là chuỗi "cur_w" */
// của current pad items có tên là // text
if (curpad == NULL){ // nếu không tồn tại Pad hiện tại RESULT(NO_CUR_PAD); // thì trả về kết quả error break;
} item = find_item(curpad, text); // tìm trong danh sach Items if (item == NULL) { RESULT(NO_ITEM); // nếu không tìm thấy thì // trả về kết quả error
break; } RESULT(OK); // đã tìm thấy Item có tên như thế,
//trả về kết quả OK trước!
// ghi liên tục vào file chuỗi // danh sách các giá trị của List
for (list = item->list; list != NULL; list = list->next) //duyệt List if (*list->value) //của Item vừa tìm thấy SENDTEXT(list->value); SENDTEXT(""); // kết thúc bằng ký hiệu rỗng ""
/* Tới đây thì kết thúc Thread bắt sự kiện này */ .................................................................................................
if (result == OK) // nếu mà kết quả trả về là OK
get_list(list, count); // lấy lên danh sách giá trị của List vừa được
// ghi vào hồi nãy ở trên ....
Trang 156
D_New_Window(name, top, bottom, left, right):
Phụ lục
Hàm này dùng để tạo ra một pad mới có tên là "full_screen", sau đó chọn nó là Pad
hiện hành, sau đó, thiết lập giá trị ITEM có tên "d_win" của nó các giá trị top,
bottom, right, left của cửa sổ cần tạo. Sau đó, gọi hàm D_Show_Window để show ra
màn hình.....
Các hàm khác đều tương tự….
Trang 157
HẾT