2009-07-26 98 views
75

Tôi có một số điểm tọa độ tập trung vào trái đất được cho là vĩ độ và kinh độ (WGS-84).Chuyển đổi từ kinh độ vĩ độ sang tọa độ Descartes

Làm cách nào tôi có thể chuyển đổi chúng thành tọa độ Descartes (x, y, z) với nguồn gốc ở trung tâm của trái đất?

+0

Bạn đã quản lý để chuyển đổi kinh độ WGS-84 và vĩ độ thành tọa độ Descartes ?. Tôi cũng có độ cao. Tôi đã thử câu trả lời được chấp nhận ở đây, nhưng nó không cho tôi câu trả lời đúng. Tôi đã so sánh kết quả của mình với trang web này: http://www.apsalin.com/convert-geodetic-to-cartesian.aspx. – Yasmin

Trả lời

33

Gần đây tôi đã thực hiện điều gì đó tương tự như thế này bằng cách sử dụng "Công thức Haversine" trên dữ liệu WGS-84, là một dẫn xuất của "Luật người Haversines" với kết quả rất thỏa mãn.

Có, WGS-84 giả định Trái đất là một ellipsoid, nhưng tôi tin rằng bạn chỉ gặp lỗi trung bình 0,5% khi sử dụng cách tiếp cận như "Công thức Haversine", có thể là một số lỗi chấp nhận được trong trường hợp của bạn. Bạn sẽ luôn luôn có một số lỗi trừ khi bạn đang nói về một khoảng cách của một vài feet và thậm chí sau đó có độ cong về mặt lý thuyết của Trái Đất ... Nếu bạn yêu cầu phương pháp tiếp cận tương thích WGS-84 cứng nhắc hơn, hãy kiểm tra "Công thức Vincenty"."

Tôi hiểu nơi mà starblue đến từ, nhưng kỹ thuật phần mềm tốt thường là về thương mại, vì vậy tất cả phụ thuộc vào độ chính xác bạn cần cho những gì bạn đang làm. Ví dụ: kết quả tính từ" Khoảng cách Manhattan Công thức "so với kết quả từ" Công thức Khoảng cách "có thể tốt hơn cho một số trường hợp nhất định vì nó ít tốn kém hơn. Hãy suy nghĩ" điểm nào gần nhất? "Trong trường hợp bạn không cần đo khoảng cách chính xác.

"Công thức Haversine" dễ thực hiện và rất tốt vì nó sử dụng "Lượng giác cầu" thay vì cách tiếp cận dựa trên phép đo lượng giác hai chiều, do đó bạn có được lance của độ chính xác trên phức tạp.

Một quý ông bằng tên của Chris Veness có một trang web tuyệt vời tại http://www.movable-type.co.uk/scripts/latlong.html giải thích một số khái niệm bạn quan tâm và thể hiện triển khai chương trình khác nhau; điều này cũng nên trả lời câu hỏi chuyển đổi x/y của bạn.

+1

lỗi 0.5% - 0.5% số tiền? Trong bối cảnh của câu hỏi này nó có thể là bán kính của trái đất, vì vậy 0,5% có thể là 30 km :) – MarkJ

+1

Kiểm tra liên kết của bạn. Trích dẫn 0,5% là do lỗi trong khoảng cách vòng tròn lớn giữa hai điểm nên không liên quan chặt chẽ đến câu hỏi này. Tôi sẽ nghĩ khi chuyển đổi vĩ độ dài sang tọa độ Descartes với nguồn gốc ở trung tâm của trái đất, các lỗi từ giả định một quả cầu có thể là đáng kể. Nó không rõ ràng những gì người hỏi muốn ** làm ** với các tọa độ Descartes. Hoặc là nó chỉ thuận tiện hơn để làm việc trong chúng vì một số lý do kỳ lạ, hoặc có lẽ nó là một số yêu cầu cho việc xuất dữ liệu? Nếu sau này, độ chính xác sẽ là quan trọng. – MarkJ

92

Dưới đây là câu trả lời tôi thấy:

Chỉ cần để làm cho định nghĩa hoàn chỉnh, trong hệ tọa độ Descartes:

  • trục x đi qua dài, lat (0,0), do đó kinh độ 0 đáp ứng đường xích đạo;
  • trục y đi qua (0,90);
  • và trục z đi qua các cực.

Việc chuyển đổi là:

x = R * cos(lat) * cos(lon) 

y = R * cos(lat) * sin(lon) 

z = R *sin(lat) 

đâu R là the approximate radius of earth (ví dụ 6371KM).

Nếu chức năng lượng giác của bạn mong đợi radian (mà họ có thể làm), bạn sẽ cần phải chuyển đổi kinh độ và vĩ độ của bạn thành radian trước. Bạn rõ ràng cần một biểu diễn thập phân, không phải độ \ phút \ giây (xem e.g. here về chuyển đổi).

Công thức chuyển đổi trở lại:

lat = asin(z/R) 
    lon = atan2(y, x) 

asin là tất nhiên arc sin. read about atan2 in wikipedia. Đừng quên chuyển đổi từ radian sang độ.

This page cho C# mã cho này (lưu ý rằng nó rất khác so với các công thức), và cũng có một số lời giải thích và sơ đồ tốt đẹp của lý do tại sao điều này là đúng,

+11

-1 Điều này là sai. Bạn đang giả sử trái đất là một quả cầu, trong khi WGS-84 giả định một ellipsoid. – starblue

+20

@ starblue: Tôi không chắc bạn đang ở vị trí để gắn nhãn câu trả lời đã cho "đúng" hoặc "sai". Phép tính xấp xỉ hình cầu (để có được các kiểu đồng dạng ECEF x, y, z) sử dụng các lat/lng có sẵn (được tham chiếu đến WGS-84) hoặc là "đủ" cho các yêu cầu của poster ban đầu, hoặc "không đầy đủ". Đối với ước tính khoảng cách và mang, tôi đặt cược chuyển đổi đơn giản này là tốt. Nếu anh ta phóng vệ tinh, có thể không. Xét cho cùng, bản thân WGS-84 là "sai" ... ở chỗ nó không phải là một mô hình hoàn hảo của bề mặt trái đất; tất cả các mô hình ellipsoidal là xấp xỉ. Quá tệ, OP không nói cho chúng tôi biết anh ta đang cố làm gì. –

+8

@Dan H Câu hỏi đặt ra cho WGS-84, và nếu bạn trả lời điều gì khác, ít nhất bạn nên thảo luận về sự khác biệt/lỗi, câu trả lời này không có. – starblue

6

Tại sao thực hiện một cái gì đó đã được thực hiện và Test- chứng minh?

C#, đối với một, có NetTopologySuite là cổng .NET của Suite Topology JTS.

Cụ thể, bạn có một lỗ hổng nghiêm trọng trong tính toán của mình. Trái đất không phải là một quả cầu hoàn hảo, và xấp xỉ xấp xỉ của bán kính trái đất có thể không cắt nó để đo chính xác.

Nếu trong một số trường hợp có thể chấp nhận sử dụng chức năng homebrew, GIS là một ví dụ điển hình về trường được ưu tiên sử dụng thư viện đáng tin cậy, được kiểm chứng.

+1

+1. Sử dụng thư viện đáng tin cậy là chính xác hơn chức năng homebrew và cũng ** dễ dàng hơn **. – MarkJ

+4

NetTopologySuite chuyển đổi từ bao lâu/muộn sang cartesion như thế nào? – vinayan

+1

NTS không bao gồm khả năng chuyển đổi tọa độ, có thể bạn cần Proj.NET http://projnet.codeplex.com –

3

Nếu bạn quan tâm đến việc nhận tọa độ dựa trên ellipsoid thay vì hình cầu, hãy xem http://en.wikipedia.org/wiki/Geodetic_system#From_geodetic_to_ECEF - nó cung cấp công thức cũng như hằng số WGS84 mà bạn cần cho chuyển đổi.

Các công thức ở đó cũng tính đến độ cao so với bề mặt ellipsoid tham chiếu (hữu ích nếu bạn đang nhận dữ liệu độ cao từ thiết bị GPS).

+0

Upvoting ngay cả khi bạn không đăng nội dung của liên kết tại đây. –

1
Coordinate[] coordinates = new Coordinate[3]; 
coordinates[0] = new Coordinate(102, 26); 
coordinates[1] = new Coordinate(103, 25.12); 
coordinates[2] = new Coordinate(104, 16.11); 
CoordinateSequence coordinateSequence = new CoordinateArraySequence(coordinates); 

Geometry geo = new LineString(coordinateSequence, geometryFactory); 

CoordinateReferenceSystem wgs84 = DefaultGeographicCRS.WGS84; 
CoordinateReferenceSystem cartesinaCrs = DefaultGeocentricCRS.CARTESIAN; 

MathTransform mathTransform = CRS.findMathTransform(wgs84, cartesinaCrs, true); 

Geometry geo1 = JTS.transform(geo, mathTransform); 
+0

Bạn có thể xây dựng? Tôi [tạo ra] (https://gist.github.com/2787570) một ứng dụng đơn giản mà tầng để biến đổi một tọa độ duy nhất bằng cách sử dụng cách tiếp cận của bạn. Nó luôn luôn thất bại mặc dù là kích thước của nguồn (2) và kích thước của đích (3) khác nhau, dẫn đến một ngoại lệ 'java.lang.IllegalArgumentException: kích thước phải là <= 3' – oschrenk

+0

Hmmm ... Tôi đã xem xét JTS một chút. Các dòng tối đa và bao gồm LineString mới() trông giống như JTS. Nhưng tôi không thấy công cụ CRS và Transform trong JTS. Vậy họ có ở đó không và tôi đang thiếu chúng? Có ở đó, và loại bỏ trong 1,12? Hoặc: đó là một thư viện khác? –

6

Lý thuyết cho chuyển đổi GPS(WGS84) để tọa độ Descartes https://en.wikipedia.org/wiki/Geographic_coordinate_conversion#From_geodetic_to_ECEF_coordinates

Sau đây là những gì tôi đang sử dụng:

  • Longitude GPS (WGS84) và tọa độ Descartes đều giống nhau .
  • Vĩ độ cần được chuyển đổi bởi các tham số ellipsoid WGS 84 trục bán chính là 6378137 m và
  • Đối ứng của mặt phẳng là 298.257223563.

I kèm theo một mã VB tôi đã viết:

Imports System.Math 

'Input GPSLatitude is WGS84 Latitude,h is altitude above the WGS 84 ellipsoid 

Public Function GetSphericalLatitude(ByVal GPSLatitude As Double, ByVal h As Double) As Double 

     Dim A As Double = 6378137 'semi-major axis 
     Dim f As Double = 1/298.257223563 '1/f Reciprocal of flattening 
     Dim e2 As Double = f * (2 - f) 
     Dim Rc As Double = A/(Sqrt(1 - e2 * (Sin(GPSLatitude * PI/180)^2))) 
     Dim p As Double = (Rc + h) * Cos(GPSLatitude * PI/180) 
     Dim z As Double = (Rc * (1 - e2) + h) * Sin(GPSLatitude * PI/180) 
     Dim r As Double = Sqrt(p^2 + z^2) 
     Dim SphericalLatitude As Double = Asin(z/r) * 180/PI 
     Return SphericalLatitude 
End Function 

Xin lưu ý rằng các h là độ cao trên WGS 84 ellipsoid.

Thường là GPS sẽ cung cấp cho chúng tôi H ở trên cao hơn MSL chiều cao. Chiều cao MSL phải được chuyển đổi sang chiều cao h trên WGS 84 ellipsoid bằng cách sử dụng mô hình geopotentialEGM96 (Lemoine et al, 1998).
Điều này được thực hiện bằng cách nội suy một lưới của tệp chiều cao geoid với độ phân giải không gian là 15 arc-phút.

Hoặc nếu bạn có một mức độ nào chuyên nghiệpGPS có Altitude H (MSL, heigh trên bình mực nước biển) và UNDULATION, mối quan hệ giữa geoidellipsoid (m) của chọn mốc tính toán đầu ra từ bảng bên trong. bạn có thể nhận h = H(msl) + undulation

Để XYZ theo tọa độ Descartes:

x = R * cos(lat) * cos(lon) 

y = R * cos(lat) * sin(lon) 

z = R *sin(lat) 
+0

Giá trị của R là gì? – eych

+0

Tôi đoán đó là bán kính của quả cầu, đó là 6371km cho trái đất. – Matthias

1

Phần mềm proj.4 cung cấp một chương trình dòng lệnh có thể thực hiện chuyển đổi, ví dụ

LAT=40 
LON=-110 
echo $LON $LAT | cs2cs +proj=latlong +datum=WGS84 +to +proj=geocent +datum=WGS84 

Nó cũng cung cấp C API. Cụ thể, hàm pj_geodetic_to_geocentric sẽ thực hiện chuyển đổi mà không phải thiết lập đối tượng chiếu trước tiên.

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