Mục đích chính là từ 1 đa giác P mà người dùng vẽ lên trên bản đồ, ta cần hiển thị tất cả các ô chứa giá trị của loại dữ liệu khí tượng được chọn nằm trong vùng đa giác đó. Từ tập các giá trị này, về sau ta có thể phân tích và đánh giá trong khu vực đó có những đặc điểm nổi bật nào không, chẳng hạn tính toán giá trị trung bình nhiệt độ trong vùng đó, sự phân bổ có đồng đều không…
Phương pháp xử lý ở đây là: sử dụng hàm giao giữa 2 polygon mà postgis hỗ trợ là ST_Intersection để xác định từng hàng trong đa giác sẽ giao với với bản đồ tại các khu vực nào [22]. Từ những khu vực đó, sử dụng bảng giá trị và bảng chỉ số trong cơ sở dữ liệu để xác định chính xác giá trị của dữ liệu. Cụ thể các bước như sau:
Bước 1, cần xác định extent(xMin, yMin, xMax, yMax) của đa giác đã vẽ trên bản đồ. Bởi vì ta không biết được ô nào là ô thuộc đa giác nhưng ta biết rằng với mọi đa giác có thể tạo ra một hình chữ nhật bao bên ngoài, ta gọi là extent(minX = min(x1, x2,...xn, minY = min(y1, y2,...yn), maxX = max(x1, x2,...xn), maxY = max(y1, y2,...yn) với x, y thuộc Polygon). Làm như vậy, ta đã giới hạn được không gian tìm kiếm.
Hình 3.16 Extent của đa giác được vẽ trên bản đồ
Bước 2, từ giá trị yMin, yMax, đối chiếu với bảng giá trị trong CSDL, chúng ta sẽ xác định được số lượng hàng chúng ta cần quan tâm. Có 1 lưu ý ở đây là trục tọa độ y của ảnh tiff sẽ ngược so với trục y của tọa độ bản đồ.
Với từng hàng i:
Thiết lập được extent(xMini, yMini, xMaxi, yMaxi) cho từng hàng, từ đó ta hình thành nên một polygon cho hàng i, ta gọi là Pi
Xác định được n tập các đa giác giao giữa 2 đa giác là Pi với đa giác P, gọi là {P’1, P’2,…,P’n}
Với từng polygon thu được P’j, với j ∊ {0, n-1}:
Xác định extent(xMin’j, yMin’j, xMax’j, yMax’j) của P’j
Từ xMin’j, xMax’j, xác định được phạm vi tập k ô liên tiếp nhau của hàng i trên ảnh tiff, gọi tập k ô liên tiếp nhau bắt đầu từ startCellIndex đến endCellIndex
Xét tập k từ các ô liên tiếp nhau startCellIndex đến endCellIndex, ta xác định được chỉ số thực sự trong tập hợp giá trị, gọi là startIndex và endIndex. Việc lấy giá trị lúc này đơn giản là lấy các giá trị liên tiếp nhau đã được lưu trong cột Giá trị của bảng dữ liệu. Tuy nhiên cần lưu ý vấn đề về chỉ số, với mỗi hàng i, chỉ số startCellIndex và endIndex cần phải được lấy bằng:
startIndex = (tổng số lượng các phần tử có giá trị mà cellIdex < startCelIndex) + (startCellIndex - from_cell_index_hàng_i)
endIndex = (tổng số lượng các phần tử có giá trị mà cellIdex < endCelIndex) + (endCelIndex - from_cell_index_hàng_i)
Hình 3.17. Lấy giá trị theo các ô liên tiếp nhau
Ví dụ, cho 1 polygon P có tọa độ sau: POLYGON((105.777 20.25, 105.804 20.766, 105.804 20.766, 105.804 20.766, 105.812 20.749, 105.795 20.74, 105.777 20.25)) , lần lượt đi theo các bước ở trên, ta có:
- Extent của đa giác thu được là (105.77727018847, 20.25, 105.81261144615505, 105.81261144615505, 20.7663549949599)
- Từ extent, thu được tập các hàng từ 193 đến 214
- Với từng polygon thu được từ việc giao các hàng của ảnh tiff (từ hàng 193 đến hàng 214) với polygon P, xét hàng i:
- Xác đinh được giá trị startIndex = 1870, endIndex = 1972 - Xác định được chỉ số từ - chỉ số đến trong tập dữ liệu - Xác định được tập dữ liệu từ cột Giá trị theo tập chỉ số
Cột từ Cột đến Số lượng Chỉ số từ Chỉ số đến
startCellIndex endCellIndex startIndex endIndex
1726 1791 66 0 65 1793 1828 36 66 101 1830 1926 97 102 198 1870 1926 142 198 1928 1943 16 199 214 1928 1943 199 214 1947 1958 12 215 226 1947 1958 215 226 1971 1973 3 227 229 1971 1972 227 228
Giả mã của thuật toán có thể tham khảo tại Phụ lục 3.
Thuật toán thực hiện với thời gian rất nhanh vì đã tối ưu khi giới hạn không gian tìm kiếm, giới hạn trường hợp tìm kiếm và khi lấy giá trị tập dữ liệu sẽ lấy là một dải liên tục chứ không cần phải xác định để lấy dữ liệu cho từng ô tìm được.