Hình 2 .11 Tách dữ liệu metadata từ GeoTiff để hỗ trợ overlay lên Google Map
Hình 2.15 Đọc dữ liệu AOT trên Google Map theo công thức quy đổi điểm ảnh
2.4.2. Thuật toán đọc giá trị AOT từ điểm thuộc đa giác vùng chọn
Để có thể thống kê được các điểm AOT nằm trong đa giác thuộc vùng chọn thì đầu tiên ta cần kiểm tra xem điểm đó có nằm trong đa giác này hay khơng. Bởi vì ta khơng biết được điểm nào là điểm thuộc đa giác nhưng ta biết rằng với mọi đa giác có thể tạo ra 1 hình chữ nhật bao bên ngoài (minX = min(x1, x2,...xn) với x thuộc Polygon), minY = min(y1, y2,...yn) với y thuộc Polygon, maxX = max(x1, x2,...xn) với x thuộc Polygon, maxY = max(y1, y2,...yn) với y thuộc Polygon.
Như vậy, ta sẽ giới hạn khơng gian tìm kiếm là: duyệt tất cả các điểm thuộc hình chữ nhật bao quanh đa giác và kiểm tra xem nó có nằm trong đa giác Polygon khơng (thay vì duyệt tồn bộ ma trận điểm ảnh mà khơng giới hạn vùng tìm kiếm). Để làm được điều đó, ta sử dụng thuật toán Ray Casting - một thuật toán được sử dụng rất
rộng rãi trong đồ họa máy tính, GIS,...để kiểm tra 1 điểm thuộc hay không thuộc đa giác (tên khác là Point in Polygon - PIP).
Tư tưởng của thuật toán là: nếu điểm A cắt các cạnh của đa giác tại các điểm với số lần là lẻ thì là ở trong đa giác, cịn nếu số lần là chẵn thì ở ngồi đa giác.
Ví dụ ở đây là điểm A nằm trong đa giác vì số giao điểm với đa giác là 3, còn điểm B nằm ngồi đa giác vì số giao điểm với đa giác là 4.
Hình 2.16. Thuật tốn Ray Casting xác đỉnh điểm thuộc đa giác
Như vậy, để nhận biết điểm A (xA, yA) bất kỳ có thuộc trong đa giác cần xét thì ta sẽ đi kiểm tra mối liên hệ của phương trình đường thẳng đi qua A, y = xA và phương trình đường thẳng đi qua từng cặp cạnh của đa giác.
Tại mỗi bước, lấy ra 2 đỉnh Pi(x1, y1) và Pi +1(x2, y2) của đa giác liền kề nhau, viết phương trình đường thẳng đi qua 2 đỉnh này và kiểm tra mối liên hệ giao cắt với phương trình đường thẳng đi qua điểm A (y = xA).
Ta có phương trình đường thẳng đi qua pi(x1, y1) và pi + 1(x2, y2) bất kỳ dạng tổng quát như sau:
y = k.x + m với
Sau khi tính được hệ số góc k, ta có thể tính m với cơng thức: m = y1 – k.x1. Thay k và m ở 2 biểu thức trên ta có được phương trình đi qua 2 đỉnh của đa giác: y = k.x + m.
Theo Hình 2.17. các trường hợp xét điểm thuộc đa giác chia làm 4 trường hợp:
Điểm A nằm ngồi đa giác (P1) nếu nó nằm ngồi hình chữ nhật bao đa giác: kết quả là không nằm trong đa giác, không cần xét tiếp các trường hợp khác.
Điểm A thuộc 1 đỉnh của đa giác (P2): chỉ cần duyệt dẫy các đỉnh của đa giác, kết quả là nằm trong đa giác, không cần xét tiếp các trường hợp khác.
Điểm A thuộc 1 cạnh của đa giác (P3) hoặc điểm A nằm trong đa giác (P4): lần lượt xét phương trình đường thẳng y = xA với các phương trình đường thẳng đi qua các cặp cạnh của đa giác (AB, BC, CD, DA). Đặt biến kiểm tra inside = False, nếu y = xA cắt đường thẳng đi qua 2 đỉnh Pi(x1, y1) và Pi + 1(x2, y2) tại điểm P (xp, yp) với điều kiện:
(xp >= x1 và xp <= x2) và (yA <= max(y1, y2)) và (yA <= k.xA + m)
Tại vì ta chỉ xét điểm P được y = xA cắt cạnh pipi +1 tại điểm P thuộc cạnh này, và chỉ xét trường hợp là xét điểm A: y = xA cắt cạnh ở trên nó, khơng xét trường hợp y = xA cắt cạnh ở bên dưới nó. Nếu thỏa mãn điều kiện trên thì inside = not inside, lặp lại đến khi xét hết các cặp cạnh của đa giác, nếu inside = True (số lẻ lần cắt cạnh thì nằm
trong đa giác), nếu biến inside = False (số chẵn lần cắt cạnh thì nằm ngồi đa giác). Thuật toán được cài đặt trong 1 Python script với đầu vào là dẫy các điểm thuộc Polyon và các cặp tọa độ của hình chữ nhật bao quanh đa giác (có 1 hàm PHP có nhiệm vụ tìm hình chữ nhật bao quanh 1 đa giác bất kỳ để giới hạn khơng gian tìm kiếm). Và chương trình Python này sẽ duyệt lần lượt các điểm trong hình chữ nhật từ trên xuống dưới, trái qua phải, mỗi điểm sẽ kiểm tra xem là điểm này có nằm trong Polygon trên khơng. Nếu có thì lấy giá trị AOT của nó để thống kê, nếu khơng thì bỏ qua điểm này và xét các điếm tiếp theo đến khi duyệt hết điểm trong hình bao ngồi.
Giả mã của thuật tốn Point In Polygon:
// n là số đỉnh của đa giác bool inside = false;
for ( int i = 0; i < n; i++ ) {
/* Kiểm tra điều kiện điểm P(xp, yp) có thể cắt được phương trình đi qua 2 điểm Pi(x[i], y[i]) và P(i + 1)(x[i+1], y[i+1]) */
if ( xp > x[i] && xp <= x[i+1] && (yp <= max(y[i], y[i+1] )) { /* Tìm phương trình đường thẳng đi qua PiPi + 1: y = k.x + m */ float dx = x[i + 1] - x[i]; // delta X
float dy = y[i + 1] - y[i]; // delta Y float k = dy / dx; // hệ số góc k
float m = y[i] - k * x[i]; // tham số m
// Kiểm tra xem y = yA có cắt y = k.x + m (cạnh PiP(i + 1) ở phía trên điểm A) float Y = k*x + m;
if ( yp <= Y ){
inside = not inside; }
} // endif }// endfor
return inside;
Thuật toán thực hiện với thời gian khá nhanh vì đã tối ưu khi giới hạn khơng gian tìm kiếm và giới hạn trường hợp tìm kiếm. Tuy nhiên, với ảnh viễn thám MODIS 4 Level 2 nếu Polygon vùng chọn tìm kiếm là dạng quốc gia thì số điểm (latitude, longtitude) sau khi chuyển sang (x, y) bị trùng nhau liên tiếp rất nhiều. Ví dụ: 1000, 1000, 1000,...,1001, 1001,...1002,...Vì vậy có 1 hàm PHP để làm nhiệm vụ là lọc bỏ các điểm trùng nhau liên tiếp này do chúng chỉ làm chậm thuật tốn, tăng số điểm đầu vào dẫn đến vịng lặp duyệt các đỉnh thuộc đa giác tăng lên và khơng có tác dụng gì khác.
2.4.3. Thuật tốn đọc giá trị AOT từ điểm thuộc đoạn thẳng được chọn
Trong trường hợp người dùng muốn thống kê giá trị AOT trên 1 đoạn thẳng – Polyline trên ảnh viễn thám, với 2 điểm biết tọa độ là điểm đầu và điểm cuối dạng (latitude, longtitude) trên Google Map thì cách thực hiện sẽ khác thuật toán đọc giá trị theo vùng. Trong đồ họa máy tính thì, 1 đoạn thẳng vẽ qua 2 điểm không phải là 1 đoạn thẳng hình học liền nét mà nó cho phép có những điểm gấp khúc. Bởi vì ma trận điểm ảnh khơng có các tọa độ dạng số thập phân (chỉ có số nguyên) nên đoạn thẳng vẽ trên màn hình khi mà phương trình đường thẳng khác y = x là 1 đoạn thẳng gấp khúc.
Hình 2.18. Biểu diễn đoạn thẳng AB trong đồ họa máy tính
Chính vì vậy, ta hồn tồn khơng biết được giữa 2 điểm A, B có bao nhiêu điểm và tọa độ của các điểm đó là gì. Để thực hiện điều này thì có 1 thuật tốn cho phép xây dựng 1 đoạn thẳng đi từ điểm A đến điểm B sao cho các điểm trên đường đi này gần
với phương trình đường thẳng nhất, tên là: thuật toán MidPoint. Khi sử dụng thuật
tốn này thì ta có thể liệt kê ra được các điểm nằm trên đoạn thẳng nối từ A đến B và từ đó lấy ra được các giá trị AOT tại từng điểm tương ứng.
Tư tưởng của thuật toán là: giả sử ta đã biết 2 điểm đầu mút A, B và điểm liền trước P của điểm thứ i hiện tại. Theo Hình 2.19. ta có thể chọn 1 trong 2 điểm liền kề tiếp theo điểm P (xp, yp) là NE hoặc E thơng qua sự liên hệ giữa phương trình đường thẳng: f(x) = Ax + By + C = 0 (phương trình đi qua 2 điểm A (x0, y0) và B(xn, yn)) và điểm M (midpoint) có tọa độ M là: (xi + 1, yi + 0.5). Ở đây, các tham số là:
A = dy = yn – y0, B = dx = xn – x0, C = xny0 – x0yn
Tọa độ của 2 điểm sau điểm P để lựa chọn đưa vào đoạn thẳng là: E (xi + 1, yi) và NE (xi + 1, yi +1).
Theo lý thuyết về đồ thị hàm số thì 1 điểm C (xc, yc) bất kỳ có mối liên hệ với 1 phương trình đường thẳng f(x, y) = Ax + By + C = 0 là:
Nằm bên trên đường thẳng: nếu f(xc, yc) < 0
Thuộc đường thẳng: nếu f(xc, yc) = 0
Nằm bên dưới đường thẳng: nếu f(xc, yc) > 0
Hình 2.19. Thuật tốn MidPoint tìm điểm gần với đường thẳng nhất18
Như vậy ta có thể lựa chọn điểm NE hoặc E tiếp theo điểm P dựa vào việc xét dấu của hàm số pi = F(M) = f (xi + 1, yi + 0.5). Ta có 2 trường hợp:
F(M) <0: tức là M nằm trên phương trình đường thẳng, nên ta chọn E.
F(M) >= 0: tức là M nằm dưới phương trình đường thẳng, nên ta chọn NE.
Mặt khác, pi + 1 = f(xi + 1 + 1, yi + 1 + 0.5), nên:
pi + 1 – pi = f(xi + 1 + 1, yi +1 + 0.5) – f(xi + 1, yi + 0.5)
= A(xi + 1 + 1) + B(yi + 1 + 0.5) + C – A(xi + 1) – B(yi + 0.5) – C = A(xi + 1 – xi) + B(yi + 1 – yi)
= A + B(yi + 1 – yi) (do xi + 1 – xi = 1) Kết quả là: pi + 1 = pi + A + B(yi + 1 – yi) (*)
Như vậy, ta có công thức xét điểm tiếp theo dựa vào điểm trước là (*), nhận xét:
Nếu pi < 0: chọn E nên yi + 1 = yi. Do đó: pi + 1 = pi + A = pi + dy
Nếu pi >= 0: chọn NE nên yi + 1 = yi + 1. Do đó: pi + 1 = pi + A + B= pi + dy - dx
Riêng trường hợp tại đầu mút A, ta có:
p1 = f(x1 + 1, y1 + 0.5) = A(x1 + 1) + B(y1 + 0.5) + C = Ax1 + A + By1 + 0.5B + C = A + 0.5B = dy - 0.5dx
(do Ax1 + By1 + C = 0) vì điểm A thuộc phương trình đường thẳng
Nhận xét, ta có ban đầu ở điểm A: d = dy + 0.5dx, để giảm phức tạp tính tốn khi thực hiện phép chia thập phân (0.5dx) thì nhân với 2 (khơng làm đổi dấu), kết quả là:
d = 2dy - dx. Tương tự, dE = pi + dy = pi + 2dy, dNE = pi + dy – dx = pi + 2(dy – dx). Giả mã của thuật toán vẽ đoạn thẳng thuật toán MidPoint là:
void line(int x0, int y0, int xn, int yn)
{
// Thuật toán Bresenham's midpoint
int dx = xn – x0, dy = yn – y0, x, y = 0; int x=x0, y=y0, d=2*dy-dx;
int dE=2*dy, dNE=2*(dy-dx);
// Duyệt từ điểm bắt đầu A đến điểm kết thúc B while (x<xn+1) {
drawpixel(x,y); // vẽ điểm tại vị trí đang xét x++; // xét điểm tiếp theo
if (d<=0) // xét dấu của d để chọn điểm E hoặc NE d+=dE; // chọn điểm tiếp theo là E
else { y++; d+=dNE; }; // chọn điểm tiếp theo là NE }
}
Thuật toán này được áp dụng để thống kê giá trị AOT trên đoạn thẳng cắt các ảnh viễn thám tại nhiều vị trí khác nhau (ứng với từng ảnh) với việc là dùng chương trình Python với đầu vào là ảnh viễn thám, tọa độ 2 điểm của đoạn thẳng. Chương trình sẽ tìm tất cả các điểm thuộc đoạn thẳng này, và lấy ra giá trị AOT, thống kê các dữ liệu
AOT và trả về hàm PHP đã gọi. Số điểm ảnh của ảnh viễn thám MODIS 10km ít hơn nhiều so với số điểm ảnh MODIS 1 km nên khi lập biểu đồ thống kê 2 loại ảnh này có thể thấy sự chênh lệch lớn về số lượng, giá trị AOT tại đoạn thẳng cần thống kê.
2.5. Kết luận
Chương này giới thiệu chi tiết về các công nghệ, kỹ thuật được sử dụng trong việc xây dựng và phát triển hệ thống WebGIS hỗ trợ trực quan hóa, quản lý và phân tích dữ liệu AOT từ ảnh viễn thám MODIS. So với chương 1 là tổng quan về các kiến thức lý thuyết chung thì chương này hướng đến những kiến thức thực tế, kỹ thuật mà được sử dụng để xây dựng các tính năng cho hệ thống. Đây là các kiến thức được tổng hợp lại trong quá trình tìm hiểu và phát triển hệ thống một cách cô đọng và cơ bản nhất, những vấn đề mang tính mới được liệt kê chi tiết, trong khi những vấn đề phổ biến được nêu ra một cách sơ lược. Dựa trên những kiến thức này, tơi sẽ tìm hiểu bài tốn thực tế thơng qua khảo sát, phân tích, đặc tả các chứng năng, xây dựng kiến trúc hệ thống trong chương sau.
Chương 3. XÂY DỰNG HỆ THỐNG WEBGIS 3.1. Mơ tả bài tốn 3.1. Mơ tả bài tốn
Qua quá trình tìm hiểu các Website cung cấp nguồn dữ liệu viễn thám của NASA, các trang Web về lĩnh vực GIS và một số hiện trạng nghiên cứu, tìm hiểu về AOT. Tơi nhận thấy rằng chưa có 1 hệ thống có khả năng cung cấp và hỗ trợ phân tích, thống kê dữ liệu AOT với nhiều tính năng và tiện ích trên nền tảng Web có thể triển khai miễn phí rộng rãi. Hiện tại người sử dụng phụ thuộc chủ yếu vào công cụ thương mại ENVI để đọc ảnh MODIS và trích xuất dữ liệu AOT, hoặc sử dụng Giovanni của NASA để lập các biểu đồ thống kê dữ liệu AOT theo thời gian và khơng gian tìm kiếm.
Nhìn chung, các tính năng này chưa được kết hợp trong 1 hệ thống hoàn chỉnh mà phụ thuộc nhiều vào các hệ thống khác nhau, phân tán khả năng và phức tạp trong việc sử dụng đối với người dùng mới bắt đầu tìm hiểu, nghiên cứu về ảnh viễn thám. Nhu cầu thực tế là cần một hệ thống đơn giản, phong phú tiện ích và có khả năng triển khai rộng rãi trên nền tảng Web với những tính năng, yêu cầu chủ yếu là:
Hệ thống WebGIS nguồn mở: cho phép nhiều người sử dụng nghiên cứu về dữ liệu AOT từ ảnh khí tượng có thể truy cập và xử lý cùng lúc. Ngồi ra, do là nguồn mở và miễn phí nên có thể triển khai rộng rãi nhiều nơi và tùy biến theo các mục đích sử dụng khác nhau không chỉ là ảnh AOT.
Quản lý cơ sở dữ liệu (người quản trị): cung cấp giải pháp để đưa dữ liệu ảnh download được vào cơ sở dữ liệu, từ đó người dùng có thể sử dụng cơng cụ tìm kiếm để tìm ra được các ảnh phù hợp với tiêu chí tìm kiếm. Lưu trữ dữ liệu về các quốc gia, vùng lãnh thổ, tỉnh thành của Việt Nam để hiển thị thông tin, cho phép truy vấn không gian dạng vector trên bản đồ nền Google Map.
Trực quan hóa (người dùng): hỗ trợ truy vấn tìm kiếm ảnh với các tham số đầu vào là theo không gian (theo vùng chọn hoặc theo quốc gia) và thời gian. Cho phép lấy ra các tập dữ liệu ảnh viễn thám MODIS 1km và MODIS 10km, thể hiện sự giống và khác nhau giữa 2 loại ảnh. Từ đó, người sử dụng có thể tìm kiếm các ảnh phù hợp và chồng lớp lên bản đồ trực tuyến Google Map, lấy dữ liệu AOT tại các vị trí latitude, longtitude một cách dễ dàng. Thống kê được dữ liệu AOT tại các vùng chọn, xem các loại ảnh output từ ảnh viễn thám gốc hoặc chồng xếp các ảnh này. Cung cấp nhiều cơng tụ tiện ích tương tác với bản đồ Google Map để thống kê, đo đạc, thay đổi vùng hiển thị,…
Phân tích, thống kê (người dùng): xây dựng các cơng cụ lập biểu đồ để thể hiện các dữ liệu AOT theo nhiều loại khác nhau. Giúp người dùng so sánh sự thay đổi và sự
biến đổi của dữ liệu AOT theo thời gian. Cung cấp nhiều loại biểu đồ và thống kê theo dạng vùng chọn hoặc thống kê theo quốc gia, tỉnh thành Việt Nam.
Dựa trên những yêu cầu thực tiễn và tổng thể như vậy, bài toán đặt ra là “xây
dựng một hệ thống WebGIS trực quan hóa, hỗ trợ quản lý và phân tích dữ liệu ảnh viễn thám dựa trên nền tảng mã nguồn mở”.
3.2. Các công nghệ, kỹ thuật được sử dụng để xây dựng hệ thống
Dựa trên sự tìm hiểu về tính năng, khả năng hỗ trợ và cung cấp của các giải pháp Web GIS Server nguồn mở và miễn phí, tơi đã chọn cơng nghệ Google Map API vì khả năng hỗ trợ lớn từ cộng đồng, nhà cung cấp và sự gần gũi, dễ sử dụng đối với người dùng. Hơn nữa, việc xây dựng một hệ thống bản đồ số phạm vi thế giới với các thơng tin chính xác và có thể chồng lớp ảnh viễn thám lên là một vấn đề phức tạp (phát triển trên nền tảng Map Server / Geo Server), vì vậy thay vì phát triển 1 hệ thống từ đầu thì tơi tiếp cận cơng nghệ Google Map API và tìm hiểu về các tính năng của nó.
Sau đó, tơi có thể tùy biến các tính năng và cơng nghệ Google cung cấp để tạo nên các công cụ tương tác với bản đồ trực tuyến một cách hiệu quả và chính xác. Kết quả là có thể rút ngắn rất nhiều thời gian phát triển GIS Map Server và có thể tập trung vào việc xây dựng các tính năng trực quan hóa, quản lý, phân tích, thống kê dữ liệu AOT từ ảnh viễn thám MODIS. Và dễ dàng bổ sung thêm các tính năng mới dựa trên nền