(1) Bài toán Hiển thị tọa độ - Ý nghĩa:
Trong một hệ thống thông tin địa lý, việc hiển thị toạ độ của các điểm trên bản đồ là rất quan trọng. Nó giúp ta biết được vị trí chính xác của các đối tượng trên bản đồ để từ đó phục vụ cho các thao tác phân tích phức tạp tiếp theo.
- Mô tả bài toán:
Chương trình hiển thị một mảnh bản đồ ba chiều, yêu cầu khi người dùng click chuột trên bản đồ thì chương trình sẽ tự động hiển thị tọa độ của điểm trên bản đồ tương ứng với vị trí click của con trỏ chuột. Tọa độ hiển thị là tọa độ trong hệ thống UTM.
- Thuật toán:
Tư tưởng thuật toán rất đơn giản: khi người dùng nhấn chuột trên bản đồ thì bộ cảm biến sự kiện sẽ lưu giữ một xâu gồm các giá trị toạ độ theo các định dạng khác nhau tuỳ theo hệ toạ độ và khung tham chiếu không gian đang dùng là gì. Chúng ta chỉ cần lấy các giá trị đó, thực hiện việc tách xâu và in lên màn hình kết quả.
function print(value) { var s = value.split(' ',3); var s2 = s[2]; print(\"Co-ordinate:\") print(\"Lat()= \" + s[0]); print(\"Lon()= \" + s[1]); print(\"ELev()= \" + s[2]); }
Hình 1.16: Hiển thị tọa độ địa lý
(2) Bài toán Phóng to và thu nhỏ địa hình - Ý nghĩa:
Chúng ta có thể quan sát các đối tượng ở các tỷ lệ độ cao khác nhau và như vậy làm cho thế giới trở nên giống thật hơn. Trong phần này, chúng ta sẽ thực hiện việc tăng giảm tỷ lệ độ cao của đối tượng hay phóng to hoặc thu nhỏ đối tượng.
- Mô tả bài toán:
Cho một bản đồ 3D. Hãy thiết kế nút để tăng hoặc giảm độ cao của đối tượng.
- Thuật toán:
Chúng ta thiết kế đối tượng hình cầu và gắn cho chúng sự kiện: Nếu ấn vào nút này thì sẽ đổi trạng thái phóng to hay thu nhỏ, sau đó ấn vào một vị trí bất kỳ trên bản đồ thì sẽ thực hiện một trong hai kiểu sau:
+ Hình cầu “tăng”: tỷ lệ= tỷ lệ + 1 hoặc + Hình cầu “giảm”: tỷ lệ= tỷ lệ - 1
Sau đó tiến hành cập nhật lại khung cảnh theo tỷ lệ mới sửa đổi.
Hình 1.17: Phóng to hoặc thu nhỏ địa hình
(3) Tính khoảng cách gấp khúc - Ý nghĩa:
Việc đo khoảng cách có ý nghĩa quan trọng trong GIS. Nó cho chúng ta biết được độ dài giữa các điểm trong thế giới thực là bao nhiêu. Khoảng cách gấp khúc được định nghĩa là một dãy (x1, x2, x3,…, xn) trong đó các đoạn (xi, xj) là các đoạn thẳng (tính theo đường chim bay). Trong thực tế, người ta rất hay đo khoảng cách gấp khúc này.
- Mô tả bài toán:
Cho một bản đồ 3D. Chúng ta tạo đường thẳng gấp khúc bằng cách nhấn vào một điểm trên bản đồ rồi nhấn tiếp vào điểm thứ hai để tạo đoạn thẳng thứ nhất. Tiếp tục nhấn vào điểm thứ ba trên bản đồ và điểm này sẽ được nối với điểm thứ hai để tạo thành đoạn thẳng thứ hai. Cứ tiếp tục như vậy cho đến khi kết thúc. Đoạn thẳng tổng hợp nhận được gọi là đoạn thẳng gấp khúc.
Câu hỏi đặt ra là: Tính khoảng cách gấp khúc đó như thế nào?
- Thuật toán:
Tư tưởng thuật toán rất đơn giản. Xuất phát từ công thức: với 2 điểm trong không gian 3 chiều: A có tọa độ (x1,x2,x3) và B có tọa độ (y1,y2,y3) thì khoảng cách giữa 2 điểm này là:
Distance = (x1y1)2(x2y2)2(x3y3)2
Để tính khoảng cách gấp khúc, ta cộng dồn các khoảng cách đoạn thẳng là: TotalLength = distance
Để làm đơn giản thuật toán, chúng ta chỉ cần lưu giữ 2 biến d cho khoảng cách đoạn thẳng và td cho khoảng cách gấp khúc. Tương tự, cũng chỉ cần lưu giữ 2 điểm (x1,x2,x3) và (y1,y2,y3). Mỗi lần người dùng nhấn vào một điểm trên bản đồ, chúng ta thực hiện tính toán khoảng cách và vẽ các đường nối các điểm lại. Thuật toán có thể được viết như sau:
function tinh_khoang_cach () { var t; if (chuột được nhấn) { Toạ_độ_điểm_cuối = coords; t = coords.split(' ',3); i++; if (i%2==1) { x0=t[0]; x1=t[1]; x2=t[2];
if (i>1) “vẽ đường thẳng nối 2 điểm”
} if (i%2==0)
{
y0=t[0]; y1=t[1]; y2=t[2];
if (i>1) “vẽ đường thẳng nối 2 điểm”
} // Tính khoảng cách d=Math.sqrt((x0-y0)*(x0-y0)+(x1-y1)*(x1-y1)+(x2-y2)*(x2-y2)); if (i==1) {d=0; td=0;} td = td+d; print(\"Distance()= \" + d); print(\"Total length = \" + td); } } Kết quả:
Hình 1.18: Tính khoảng cách gấp khúc.
Chú ý: Để có thể vẽ đường thẳng lên bản đồ ta cần phải chuyển đổi hệ toạ độ theo toạ độ của điểm nhìn hiện tại (GeoViewPoint). Cách thức quy đổi ta đã đề cập trong phần đầu của Chương này.
(4) Tính độ dài đường đi thực địa - Ý nghĩa:
Khoảng cách gấp khúc còn khá đơn giản. Trong thực tế, đôi khi ta muốn xấp xỉ độ dài đường đi trên thực địa theo mặt địa hình. Điều này có ý nghĩa vì các đường đi trong thực tế không phải lúc nào cũng ở dạng đoạn thẳng mà đôi khi là dạng đường cong.
- Mô tả bài toán:
Cho một bản đồ 3D. Chúng ta bắt đầu bằng cách nhấn vào một điểm trên bản đồ. Sau đó, mỗi khi con trỏ chuột di chuyển tới một vị trí nào đó thì hệ thống sẽ tự động hiển thị tọa độ con trỏ chuột và khoảng cách từ đó tới vị trí của con trỏ chuột trước đó, cho đến khi chúng ta nhấn vào một điểm trên bản đồ. Khoảng cách từ điểm nhấn đầu tiên và cuối cùng được gọi là độ dài đường đi thực địa. Câu hỏi: Tính độ dài đường đi thực địa đó?
- Thuật toán:
Thực chất của bài toán này là việc tính độ dài của tập các đường cong liên tiếp. Đường cong đó có thể là đoạn thẳng như đoạn (a, b) hay (c, d) trong ví dụ bên dưới hay là một parabol (b,c). Khoảng cách đường đi thực địa bằng tổng khoảng
cách các đoạn con. Thực tế, các đường con này có thể ở dạng bậc 1, 2, 3… nên rất phức tạp.
Hình 1.19: Mô tả về đường đi gấp khúc
Để đơn giản hóa bài toán, ta xuất phát từ nhận xét sau: Thực tế, các điểm a, b, c hay d ở hình vẽ trên chính là vị trí của con chuột trong các thời điểm t khác nhau: t0, t1, t2, t3. Do các thời điểm t này là tương đối gần nhau (cách nhau vài phần trăm mili giây) cho nên các khoảng cách a,b,c,d là khá sát nhau. Do vậy, chúng ta có thể xấp xỉ các đường cong bậc cao trở về đường cong bậc 1 tức là đoạn thẳng. Và do vậy, khoảng cách theo đường đi thực địa bằng tổng các đoạn thẳng liên tiếp.
Td = D ([a,b]) + D([b,c]) + D([c,d])
Đến đây, bài toán này lại trở về bài toán tính khoảng cách gấp khúc mà chúng ta đã xét ở trên.
Chúng ta thiết kế một hàm cal_distance để tính khoảng cách cập nhật và liên tục. Hàm này bao gồm hàm tinh_khoang_cach() đã đề cập trong phần trước và thêm phần vẽ đường thẳng giữa 2 điểm lên bản đồ. Khi vẽ phải chú ý tới việc chuyển hệ toạ độ GeoVRML.
Để mỗi khi ta đưa con trỏ chuột đến vị trí nào thì hàm cal_distance được gọi, ta kết nối các sự kiện:
ROUTE GEOTOUCH.hitGeoCoord_changed TO S.cal_distance ROUTE S.new_child TO GEOLOC_Trans.addChildren
Hình 1.20: Tính khoảng cách thực địa.
(5) Tính toán độ dốc - Ý nghĩa:
Độ dốc để xác định độ nghiêng của bề mặt và những vị trí có độ dốc thấp phục vụ sản xuất hay xây dựng; còn những vị trí có độ đốc lớn để ngăn chặn xói mòn hay trượt lở đất.
- Mô tả bài toán:
Cho một bản đồ 3D. Kẻ một đoạn thẳng từ hai điểm bất kỳ trên bản đồ, giả sử là A và B.
Câu hỏi: Xác định độ dốc trung bình của vùng giới hạn bởi 2 điểm A và B theo phần trăm thay đổi hay góc lệch thay đổi.
Hình 1.21: Tính toán độ dốc .
Độ dốc được định nghĩa là tỷ số của trục Y đối với trục X giữa 2 điểm (đạo hàm bậc 1):
Hình 1.22. Mô tả độ dốc địa hình
Trong ví dụ trên thì độ dốc giữa 2 điểm A - có tọa độ là (1, 2) và B - có toạ độ là (5, 4) là: 2 1 2 1 Y Y 4 2 2 m 50% X X 5 1 4 Nếu tính theo góc lệch thì: arctan (0.5) = 26.5650
Đây chỉ là ví dụ trong không gian 2 chiều. Đối với bản đồ 3D, ta có thuật toán để xác định độ dốc như sau:
- Tính khoảng cách giữa A và B (độ dài thực tế): dAB
- Xác định tổng độ cao thay đổi dọc theo đoạn AB: AB hmaxhmin
- Khi đó, phần trăm độ dốc thay đổi là:
AB AB a % d
- Góc lệch thay đổi là: b = arctan (a)
Điều này có nghĩa là, cứ 100 feet đoạn thẳng nằm trong bề mặt giới hạn bởi A, B thì độ cao lại tăng lên (giảm xuống) a*100 feet.
Chú ý:
- Có thể có cả trường hợp độ dốc không thay đổi. Đó là khi ta xét độ dốc trên một mặt núi với các điểm có độ cao như nhau. Trong trường hợp này, thuật toán vẫn chạy tốt và sẽ cho thông báo "Độ dốc không đổi".
- Để xác định tổng độ cao thay đổi dọc theo đoạn AB, ta có thể tính theo tọa độ của 2 điểm A và B. Bởi vì trong 2 điểm, sẽ có một điểm có độ cao nhỏ nhất và điểm còn lại sẽ có độ cao lớn nhất. Nghĩa là:
AB hmax hmin hA hB
Tuy nhiên, ở đây có thể A và B không là các điểm lưới mà chỉ nằm trong một ô lưới nào đó thôi. Do vậy, để xác định độ cao của A và B, ta phải xác định xem nó nằm trong ô lưới nào. Sau đó, tìm hình chiếu của điểm này lên ô lưới và tính độ cao. Thuật toán này đã được mô tả trong bài toán "Tính độ cao tối thiểu của ngọn hải đăng".
- Để tính khoảng cách giữa 2 điểm A và B, ta tham khảo thuật toán "Tính khoảng cách gấp khúc".
- Trong bản đồ 2D, để xác định tổng độ cao thay đổi dọc theo một đoạn, ta phải xác định độ cao của những điểm mà AB cắt ngang qua đường bình độ. Cách này hơi khác so với trên bản đồ 3D. Nói chung, việc xác định độ dốc trên cả bản đồ 2D và 3D đều có ý nghĩa trong thực tế.
Hình 1.23: Tính độ dốc trong bản đồ 2D
CHƢƠNG 2.
HỆ THỐNG WEBGIS MÃ NGUỒN MỞ
Bằng cách kết hợp nhiều công cụ mã nguồn mở khác nhau, ta có thể được một môi trường phát triển để xây dựng ứng dụng Web GIS. Dưới đây là các thành phần trong hệ thống và vai trò của chúng.
- Sử dụng Minesota MapServer để đưa bản đồ lên Web
- Sử dụng CSDL PosgreSQL và phần mở rộng postGIS để quản trị các dữ liệu thuộc tính và một số kiểu đối tượng hình học.
- Tăng cường trang Web bằng applet Rosa để cung cấp các chức năng tìm kiếm, truy vấn, phóng to, thu nhỏ.
Với kiến trúc hệ thống như trên, sự cộng tác của các chuyên gia phát triển khung ứng dụng, cộng đồng người sử dụng đồng thời như là các cộng tác viên góp phần cung cấp dữ liệu, cho phép xây dựng ứng dụng GIS trên mạng Internet phục vụ lợi ích cộng đồng
Tuy nhiên, mỗi phần mềm trên do các tập thể khác nhau phát triển và việc liên kết chúng để xây dựng một hệ thống hoàn chỉnh là không đơn giản và dễ dàng như với môi trường Window.
Có một tổ chức chuyên lo về phát triển các hệ thống GIS nguồn mở, đặc tả giao diện, các khuyến cáo, các chuẩn để phát triển GIS mở, sao cho sản phẩm của các nhà sản xuất khác nhau có thể cộng tác với nhau là OGC - OpenGIS consortium Inc.
OGC đã đưa ra một số chuẩn như
- Fundamental Geometric Features; - GML – geographical markup language,
WebMap technology: Các đặc tả OpenGIS hỗ trợ các giải pháp cộng tác (interoperable) làm cho Web thành "geo-enable".
Dưới đây giới thiệu những vấn đề cần quan tâm trong mỗi công cụ nói trên khi xây dựng ứng dụng WebGIS.