2009-07-10 42 views
9

hiện tôi đang xử lý dữ liệu gps kết hợp với đo độ cao chính xác. Tôi muốn tính khoảng cách giữa hai điểm liên tiếp. Có rất nhiều thông tin ngoài kia về cách tính khoảng cách giữa hai điểm bằng cách sử dụng hình elip WGS84 và vân vân. Tuy nhiên,Đo độ cao khi tính toán khoảng cách trắc địa

tuy nhiên, tôi không tìm thấy bất kỳ thông tin nào cần Độ cao thay đổi tính toán cho việc tính toán khoảng cách này.

có ai biết về một số trang web, giấy tờ, sách, v.v. mô tả phương pháp như vậy không? cảm ơn

chỉnh sửa: Tiện ích mở rộng địa lý Sql Server 2008 cũng bỏ qua thông tin độ cao khi tính khoảng cách.

+0

Tôi đã không nhìn vào phương trình WGS84, vì vậy đang không viết những dòng này như một câu trả lời. Điều đó nói rằng, có vẻ như với tôi rằng bạn sẽ có thể tinh chỉnh bán kính hoặc hai để làm cho các điểm đo của bạn là bề mặt "mới". Điều này có lẽ sẽ hoạt động tốt nhất nếu các phép đo độ cao của bạn dựa trên GPS; nếu dựa trên các phương tiện cơ học (ví dụ, áp suất không khí), thì "mực nước biển" có thể có rất ít mối quan hệ với mô hình Geoid. – kdgregory

+0

Bạn đã bao giờ nghĩ ra một giải pháp tốt cho điều này? – lnafziger

Trả lời

0

Tôi sẽ đề nghị rằng trên bất kỳ khoảng cách nào khi sử dụng WGS84 sẽ cung cấp cho bạn độ chính xác tốt hơn đáng kể rằng sự khác biệt về độ cao sẽ không thành vấn đề. Và trên bất kỳ khoảng cách nào mà sự khác biệt về độ cao quan trọng bạn có lẽ chỉ nên sử dụng xấp xỉ đường thẳng.

0

Để thực hiện việc này, vấn đề đầu tiên bạn phải giải quyết là cách xác định thay đổi về độ cao. Các phương trình bình thường hoạt động vì chúng nằm trên bề mặt hai chiều, tuy nhiên việc thêm chiều thứ ba có nghĩa là định nghĩa đơn giản của khoảng cách ngắn nhất không còn áp dụng được nữa, ví dụ như kích thước thrid là 'đang phát'. ellipsoid. Đó là một chút nhanh chóng và bẩn, nhưng giải pháp tốt nhất của bạn có thể giả định rằng tỷ lệ thay đổi của tất cả là không đổi dọc theo đường dẫn 2D ban đầu trên ellipsoid. Sau đó bạn có thể tính toán khoảng cách 2D là chiều dài, tính tốc độ thay đổi độ cao và sau đó chỉ cần sử dụng Pythagoras để tính toán độ dài tăng với một cạnh của tam giác là khoảng cách 2D và độ cao là chiều dài thứ hai.

6

Tôi đã triển khai hàm khoảng cách WGS84 bằng cách sử dụng mức trung bình của độ cao bắt đầu và kết thúc làm độ cao không đổi. Nếu bạn chắc chắn rằng sẽ có sự thay đổi độ cao tương đối nhỏ dọc theo con đường của bạn, công trình này chấp nhận tốt (lỗi liên quan đến chênh lệch độ cao của hai điểm LLA của bạn).

Dưới đây là mã của tôi (C#):

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

Trên thực tế chúng tôi nhận thấy rằng sự khác biệt độ cao hiếm khi làm cho một sự khác biệt lớn, con đường của chúng tôi thường 1-2km dài với độ cao khác nhau về trình tự 100m và chúng ta thấy trung bình ~ 5m thay đổi so với sử dụng elliptic WGS84 chưa sửa đổi.

Edit:

Để thêm vào đó, nếu bạn làm điều mong đợi thay đổi độ cao lớn, bạn có thể chuyển đổi WGS84 bạn phối để ECEF (đất làm trung tâm trái đất cố định) và đánh giá con đường thẳng như thể hiện ở dưới cùng của tôi chức năng. Chuyển đổi một điểm đến ECEF là đơn giản để làm:

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

Chỉnh sửa 2:

tôi được hỏi về một số các biến khác trong mã của tôi:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer là một lớp học tôi đã sử dụng để chuyển đổi từ tọa độ LatLonAlt sang tọa độ ECEF và xác định các hằng số ở trên.

+0

Tôi không nghĩ rằng người hỏi đã hỏi về các tình huống nơi độ cao có hiệu quả không đổi. Tôi nghĩ rằng vấn đề là để tìm ra khoảng cách theo vòng tròn lớn giữa hai điểm mà độ cao khác nhau đáng kể giữa hai điểm. – jprete

+0

Có lẽ tôi đã không làm rõ, nhưng giải pháp của tôi trung bình độ cao của hai điểm và gọi đó là hằng số. Đánh giá khoảng cách trắc địa bằng cách sử dụng hai độ cao riêng biệt là tốn thời gian và khó khăn đặc biệt là khi một xấp xỉ đạt được kết quả rất tốt. –

+0

Tôi tin rằng người hỏi ban đầu muốn nắm bắt sự thay đổi nhỏ về khoảng cách do những thay đổi về độ cao; đó là lý do tại sao sử dụng trung bình, hoặc tối đa alt, hoặc min alt, không phải là một giải pháp. khoảng cách đường thẳng không phải là một giải pháp cho vấn đề độ cao-khác biệt trong hai, bởi vì các đường thẳng như vậy không có hồ sơ cá nhân leo/gốc thích hợp mà bạn mong chờ từ nói: "Tôi đã đi 60 dặm và thay đổi độ cao của 20000 feet mà thời gian". Ví dụ. nếu điểm cuối cùng của bạn ở dưới đường chân trời, thì điều đầu tiên mà đường đi làm là đường hầm dưới mặt đất. – jprete

0

Để bắt đầu, bạn cần một mô hình cho bạn biết độ cao thay đổi trên đường giữa hai điểm. Nếu không có một mô hình như vậy, bạn không có bất kỳ định nghĩa nhất quán nào về khoảng cách giữa hai điểm.

Nếu bạn có mô hình tuyến tính (đi 50% khoảng cách giữa các điểm cũng có nghĩa là bạn đã đi lên trên 50% độ cao), thì bạn có thể giả vờ rằng toàn bộ vật là tam giác vuông; tức là bạn hành động như thể thế giới phẳng cho mục đích xác định mức độ thay đổi ảnh hưởng đến khoảng cách như thế nào. Khoảng cách dọc theo mặt đất là cơ sở, sự thay đổi độ cao là chiều cao của tam giác, và cạnh huyền là khoảng cách đi lại ước tính thực của bạn từ điểm này sang điểm khác.

Nếu bạn muốn tinh chỉnh thêm, thì bạn có thể lưu ý rằng mô hình ở trên là hoàn toàn tốt cho khoảng cách infinitesimal, có nghĩa là bạn có thể lặp qua các vùng riêng biệt của khoảng cách, kiểu tính toán, mỗi lần sử dụng độ cao hiện tại để tính toán khoảng cách mặt đất và sau đó sử dụng cùng một tỷ lệ lượng giác để tính toán sự đóng góp thay đổi theo chiều cao cho khoảng cách đi. Tôi có thể làm điều này trong một vòng lặp for() với 10 đến 100 phần của phân đoạn, và có thể do thử và sai tìm ra số lượng các mảnh cần thiết để nhận được trong vòng epsilon của giá trị thực. Nó cũng sẽ có thể làm việc ra tích phân dòng để tìm ra khoảng cách thực tế giữa hai điểm theo mô hình này.

0

Bạn có thể không quan tâm đến độ cao cho khoảng cách 2D lớn. Vì vậy, nếu các bạn nhận được là hơn nói 20 (hoặc có lẽ 50) km, sau đó những người quan tâm về độ cao khác biệt (phụ thuộc vào trường hợp nhu cầu của bạn). Theo nói 20km, thức ăn trong việc bổ sung pythagore đơn giản cho sự khác biệt độ cao. Nuôi nó trong suốt.

Distance between two geo-points?

Các vấn đề liên quan