Thuật toán Vincenty 85

Một phần của tài liệu tính toán xấp xỉ với các truy vấn liên quan đến khoảng cách trong cơ sở dữ liệu không gian (Trang 85 - 89)

2. Tính toán khoảng cách trong hệ tọa độ địa lý theo khoảng cách Vincenty 82

2.2Thuật toán Vincenty 85

Thuật toán Vincenty thể hiện nhiều ưu điểm trong việc tính toán khoảng cách địa lý do ưu thế vềđộ chính xác khá cao. Tuy nhiên, việc triển khai thuật toán này là khác phức tạp, bao gồm nhiều phép toán trung gian và các vòng lặp lồng nhau, do đó đề tài không đi sâu vào nghiên cứu và phân tích chi tiết thuật toán Vincenty. Trong giới hạn nghiên cứu của luận văn, tác giả chỉ dừng ở mức tham khảo giả mã của thuật toán với tính chất tra cứu khi cần sử dụng.

2.2.1 Cài đặt thuật toán Vincenty sử dụng hệ tọa độ ellipsoid WGS - 84

Dưới đây là đoạn mã JavaScript thực hiện thuật toán Vincenty sử dụng các thông số tính toán của hệ tọa độ WGS-84

/* Tính toán khoảng cách địa lý giữa hai điểm có tọa độ (kinh độ, vĩ độ) cho trước (ở dạng độ thập phân) sử dụng công thức Vincenty cho trái đất dạng elip tròn xoay*/

function distVincenty(lat1, lon1, lat2, lon2) {

var a = 6378137, b = 6356752.3142, f = 1/298.257223563; /* WGS-84 ellipsiod */

var L = (lon2-lon1).toRad();

var U1 = Math.atan((1-f) * Math.tan(lat1.toRad())); var U2 = Math.atan((1-f) * Math.tan(lat2.toRad())); var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1); var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2); var lambda = L, lambdaP = 2 * Math.PI;

var iterLimit = 20;

while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0) {

var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda); var sinSigma = Math.sqrt (( cosU2 * sinLambda) * (cosU2 * sinLambda)

+ (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) * (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda ) );

if (sinSigma==0) return 0; // co-incident points

var cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda; var sigma = Math.atan2(sinSigma, cosSigma);

var sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma; var cosSqAlpha = 1 – sinAlpha * sinAlpha;

var cos2SigmaM = cosSigma – 2 * sinU1 * sinU2/cosSqAlpha; if (isNaN(cos2SigmaM)) cos2SigmaM = 0; /* equatorial line: cosSqAlpha = 0 */

var C = f/16 * cosSqAlpha * (4 + f * (4 – 3 * cosSqAlpha)); lambdaP = lambda;

lambda = L + (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (

cos2SigmaM + C * cosSigma * ( 1 + 2 * cos2SigmaM * cos2SigmaM ) ) );

}

if (iterLimit==0) return NaN // formula failed to converge var uSq = cosSqAlpha * (a*a - b*b) / (b*b);

var A = 1 + uSq/16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq))); var B = uSq/1024 * (256 + uSq * (-128 + uSq * (74 – 47 * uSq)));

var deltaSigma = B * sinSigma* (cos2SigmaM + B/4 * (cosSigma * (- 1 + 2 * cos2SigmaM * cos2SigmaM ) - B/6 * cos2SigmaM * ( 3 + 4 * sinSigma * sinSigma ) * ( -3 + 4 * cos2SigmaM * cos2SigmaM) ) );

var s = b * A * (sigma - deltaSigma); s = s.toFixed(3); // round to 1mm precision return s;

}

Như vậy, với hệ thống tham số chuyển tọa độđã quy định ở trên, ta hoàn toàn có thểứng dụng thuật toán Vincenty vào bài toán tính khoảng cách địa lý trên lãnh thổ Việt Nam trong hệ tọa độ VN-2000 tương ứng mà không ảnh hưởng đến độ chính xác của thuật toán cũng như cơ sở hạ tầng bản đồ địa lý đã xây dựng dựa trên VN-2000 của nước ta.

2.2.2 Sử dụng hàm tính toán Vincenty trong truy vấn tìm khoảng cách địa lý

Trở lại với ví dụ trong phần 1.2 – Chương 4 về khoảng cách Haversine, ta tính toán khoảng cách giữa hai điểm này theo thuật toán Vincenty và so sánh độ chính xác tính toán của hai phương pháp trên dựa vào đại lượng great- circle distance (khoảng cách vòng cung lý tưởng) - C đã có ở trên.

VD1: Hai điểm A & B với kinh độ, vĩđộ tương ứng, tọa độ có dạng độ/phút/giây và hậu tố chỉ một trong bốn hướng địa lý: N-Bắc/S-Nam/E- Đông/W-Tây.

B (520 12’ 17”N; 0000 08’ 26” E) Ù B (52,20470; 0,14060) Với hệ quy đổi: 10 = 60’; 1’ = 60”

Ö Ta có dVincenty = AB = 156,067 km (adsbygoogle = window.adsbygoogle || []).push({});

Theo trên ta có : dHaversine = AB = 170,2 km

& Khoảng cách mặt cầu lý tưởng là C = 105,8 km

Dễ dàng nhận thấy với cùng tọa độ điểm, thuật toán Vincenty cho khoảng cách chính xác hơn tuy mất nhiều thời gian tính toán hơn.

VD2: Sử dụng thuật toán Vincenty tính toán khoảng cách giữa hai khu vực tại Australia theo hệ tọa độ WGS-84: Khoảng cách giữa trung tâm hai thành phố Flinder Peak và Buninyong, với tọa độ tương ứng là:

Flinder Peak (370 57’ 03”S; 1440 25’ 29” E) Buninyong (370 39’ 10” S; 1430 55’ 35” E)

ÖdVincenty = 54,959 km

Chú ý: Độ chính xác của thuật toán Vincenty còn phụ thuộc rất nhiều vào hệ tọa độ elip tròn xoay mà nó được sử dụng cũng như vị trí địa lý khu vực áp dụng thuật toán, độ chính xác nằm trong khoảng 0.5mm (tương đương sai số tọa độ là 0,00015”) chỉ đúng trên lý thuyết elip, đại lượng sai số này sẽ thay đổi khi áp dụng vào các Geiod (bề mặt cầu xây dựng dựa trên mực nước biển trung bình) trên bề mặt trái đất trong thực tế.

Với các vùng lãnh thổ địa lý khác nhau việc sử dụng các hệ tọa độ phù hợp là rất quan trọng, nó quyết định độ chính xác tính toán về khoảng cách của thuật toán Vincenty. Tỉ lệ sai số khác nhau trong từng trường hợp là do sử dụng các geoid khác nhau ( như WGS-84, GRS-80, Airy…. ).

Bằng thực nghiệm đã cho thấy, sử dụng thuật toán Vincenty tính khoảng cách tại vị trí địa lý có độ cao so với mặt nước biển trung bình là 2km, sai số tính được khoảng 0,03% (lớn hơn so với khoảng cách thực tế). Giả sử thực hiện đo đạc tại nước Anh sử dụng hệ tọa độ WGS-84, thu được kết quả tính toán của thuật toán Vincenty với sai số là 28m (tương đương 0.003%) – lớn

hơn khi sử dụng hệ tọa độ elip tròn xoay Airy, là hệ tọa độđược xây dựng phù hợp dựa trên đặc thù địa lý và lãnh thổ nước Anh.

Một phần của tài liệu tính toán xấp xỉ với các truy vấn liên quan đến khoảng cách trong cơ sở dữ liệu không gian (Trang 85 - 89)