Đây là kiểu truy vấn phức tạp hơn cả vì lúc này một khung bao chữ nhật sẽ không đảm bảo tính chính xác của kết quả (hình 4-3). Một ví dụ dễ thấy là với truy vấn “khách sạn ở trên đường Nam Kỳ Khởi Nghĩa”, nếu ta dùng một khung bao chữ nhật cho câu truy vấn trên thì các kết quả sẽ có luôn cả những kết quả ở rất xa đường Nam Kỳ Khởi Nghĩa trong phần lớn trường hợp. Thay vào đó, trong trường hợp này, theo phương pháp tiếp cận truyền thống của các ứng dụng GIS, một vùng đệm (buffer) của đường sẽ được tạo ra dùng để làm vùng giới hạn tìm kiếm (hình 4-4) sẽ giúp cho các kết quả tìm thấy có tính hợp lý cao hơn. Lúc này, chi phí để tạo ra vùng đệm cho một đường là lớn hay nhỏ sẽ ảnh hưởng nhiều hay ít đến tốc độ tìm kiếm của hệ thống.
Hình 4-3: Minh họa 1 đoạn đường và khung bao chữ nhật của nó.
Hình 4-4: Minh họa 1 đoạn đường và vùng đệm của nó.
M. Zadravec [18], đã đề xuất một thuật toán tạo vùng đệm với độ phức tạp là O(nlogn). Với độ phức tạp đó cùng với kết quả thực nghiệm của tác giả (bảng 4-1) đã cho thấy một điều rằng phương pháp tạo vùng đệm này chỉ tốt cho các ứng dụng GIS chứ không thể áp dụng tốt trong bài toán tìm kiếm trên đường của hệ GIR vì nó chiếm quá nhiều
thời gian so với tiêu chuẩn của một hệ tìm kiếm và hơn nữa độ chính xác của kết quả sẽ phụ thuộc khá nhiều vào mức độ mịn của các cung tròn ở hai đầu vùng đệm.
Số lượng vector Thời gian thực hiện (giây)
300 0,1
600 0,4
900 0,5
1200 0,9
Bảng 4-1: Bảng kết quả thuật toán tạo vùng đệm của M. Zadravec.
Tuy nhiên, ngoài cách lấy vùng đệm trên cũng còn có một số phương pháp khác để giải quyết bài toán tìm kiếm trên đường này, luận văn đã áp dụng một phương pháp Heuristic với độ phức tạp kiểm tra nhỏ hơn rất nhiều so với cách lấy vùng đệm và tính chính xác của kết quả cũng cao hơn do không phụ thuộc vào mức độ mịn của cung tròn ở hai đầu vùng đệm. Điều đó giúp hệ thống đảm bảo về mặt tốc độ tìm kiếm lẫn kết quả tìm kiếm.
Ý tưởng của phương pháp đề nghị này là xây dựng khung bao cho câu truy vấn theo đường chính là vùng đệm của nó với bán kính r nhưng đặc biệt ở đây, phương pháp này sẽ không thực hiện công việc tạo ra vùng đệm vì chi phí thời gian quá lớn.
Thay vào đó, phương pháp này sẽ tận dụng lợi thế tìm kiếm nhanh của cấu trúc R-Tree trên từng vector của đường để tạo ra một tập hợp các ứng cử viên trên đoạn vector đó. Tập ứng viên này sau đó sẽ được kiểm tra lại một lần nữa để xác định các tài liệu (đối tượng) thật sự nằm trong vùng đệm của đường thông qua một hàm đánh giá (hình 4-5). Cuối cùng, các kết quả trên từng vector của đường sẽ được sắp xếp theo độ tăng dần của khoảng cách so với đường và hội với nhau để có kết quả sau cùng.
Hình 4-5: Minh họa ý tưởng tìm kiếm theo đường.
Các bước của phương pháp trên có thể được cụ thể hóa bằng đoạn mã giả sau:
V := Tập các vector thuộc đường; r := Bán kính tìm kiếm.
ForeachVi in VDo
VRect := Khung bao chữ nhật cho Vi
Rect : = Khung bao VRect mở rộng theo chiều dọc và chiều ngang 1 khoảng = r D := Tập tài liệu thỏa mãn nội dung truy vấn và có khung bao giao với Rect lResultTemp := {Di D | Vị trí của Di Rect}
ForeachlResultTempi in lResultTempDo
IfIsCircleClip(lResultTempi, Vi, r)Then
lResult := lResult lResultTempi
End If
End Foreach
End Foreach
Trong thuật toán trên, điểm đáng chú ý chính là hàm đánh giá IsCircleClip với chức năng kiểm tra một đối tượng có nằm trong phần vùng đệm bán kính r của đường hay không bằng cách kiểm tra đường tròn có tâm là đối tượng đó, bán kính r có giao nhau với đường hay không. Đây chính là hàm Heuristic của phương pháp đề nghị này. Ý tưởng của Heuristic này là nếu một điểm là tâm của một đường tròn bán kính r cắt với một đoạn thẳng thì điểm đó sẽ nằm trong phần vùng đệm bán kính r của đoạn thẳng đó. Từ đó, ta có thể kiểm tra nếu một đường tròn có tâm là p bán kính r cắt vector Vi của đoạn đường V thì khi đó p sẽ nằm trong vùng đệm bán kính r của V. Lúc này, ta có thể lọc ra các tài liệu nào trong tập ứng cử viên thật sự thỏa điều kiện nằm trong vùng giới hạn của câu truy vấn mà không phải tốn chi phí tạo ra vùng đệm của câu truy vấn đó. Vậy từ đây, vấn đề là hàm đánh giá IsCircleClip trên có độ phức tạp như thế nào so với độ phức tạp của việc tạo ra vùng đệm của câu truy vấn. Thật may mắn là theo [19], hàm IsCircleClip này chỉ là một phép toán số học và có độ phức tạp là O(1). Hàm
IsCircleClipcó thể được xây dựng theo các bước như [19] đã làm nhưng sẽ được sửa đổi một chi tiết là thay vì xét giữa đường tròn và đường thẳng thì ở đây sẽ xét giữa đường tròn và đoạn thẳng:
Ta có:
dirx = x2 – x1. diry = y2 – y1. diffx =centerx – x1. diffy =centery – y1.
t = (diffx * dirx + diffy * diry)/(dirx2 + diry2). Nếu t<0 t = 0. Nếu t>1 t = 1. closestx = x1 + (t * dirx). closesty = y1 + (t * diry). dx = centerx – closestx. dy = centery – closesty. dr = dx2 + dy2. Nếu: dr <= r2 : đường tròn cắt đoạn thẳng. dr > r2 : đường tròn không cắt đoạn thẳng.
Ta thấy rằng với phép toán trên, chi phí để kiểm tra 1 điểm có thật sự nằm gần đường hay không chỉ là O(1). Lúc này ta giả sử rằng chi phí để kiểm tra 1 điểm có nằm trong phần vùng đệm (thực chất là 1 đa giác) hay không cũng đạt độ phức tạp là O(1) (thực tế rất khó, ngoại trừ đã tốn 1 chi phí khá lớn trong tiền xử lý) thì cách tiếp cận mới này vẫn đạt tốc độ tìm kiếm nhanh hơn do không phải mất chi phí lấy vùng đệm của đường.