Tính toán tọa độ kinh độ và vĩ độ trung bình


19

Làm cách nào tôi có thể tính trung bình giữa một số điểm vĩ độ và kinh độ?

Tôi có nên tính trung bình số học cho cả lat và lng không?


3
Tôi nghĩ rằng sự phù hợp của tính trung bình phụ thuộc vào trường hợp sử dụng của bạn. Nếu bạn chỉ phân cụm các địa điểm nhà hàng thành phố cho một bản đồ web, chắc chắn tính trung bình sẽ hoạt động hầu hết thời gian. Tuy nhiên, bạn sẽ gặp lỗi ở một số nơi .. đối với một ứng dụng nguyên mẫu hoặc ngân sách thấp có thể không ổn. Tuy nhiên, nếu bạn đang làm một cái gì đó nghiêm trọng hơn hoặc bao phủ một khu vực rộng thì có lẽ bạn cần phải tính đến các sắc thái chiếu.
Glenn

1
Làm thế nào những điểm này được thu thập? Thay vì hỏi làm thế nào để tính trung bình các tọa độ, có thể hỏi nếu tính trung bình là một cách thích hợp để bù cho sai số đo. Ebook này có rất nhiều định nghĩa lỗi.
Kirk Kuykendall

Chỉ cần lưu ý rằng có một số trường hợp cạnh mà 'điểm trung bình' không được xác định rõ: ví dụ: bất kỳ nơi nào dọc theo đường xích đạo có thể hình dung là "trung bình" của hai cực N. và S.
Dan S.

Câu trả lời:


15

Đối với một ý nghĩa đơn giản, bạn không muốn trung bình các tọa độ kinh độ và vĩ độ. Điều này có thể hoạt động khá tốt ở các vĩ độ thấp hơn, nhưng ở các vĩ độ cao hơn, nó sẽ bắt đầu cho kết quả kém và phá vỡ hoàn toàn gần các cực.

Phương pháp tôi đã sử dụng cho loại điều này là chuyển đổi tọa độ kinh độ / vĩ độ thành tọa độ cartesian 3d (x, y, z). Trung bình những cái này (để đưa ra một vectơ cartesian), và sau đó chuyển đổi lại. Lưu ý rằng bạn có thể không cần bình thường hóa vectơ, vì vậy quá trình trung bình thực tế có thể là một tổng đơn giản.


Chỉnh sửa, đây là mã của tôi :

Sau đây chuyển đổi tọa độ cartesian thành vĩ độ / kinh độ (tính theo độ): Loại bỏ các RAD2DEGhằng số cho radian.

Latitude = MPUtility.RAD2DEG * Math.Atan2(z, Math.Sqrt(x * x + y * y));
Longitude = MPUtility.RAD2DEG * Math.Atan2(-y, x);

Và ở đây, chúng tôi tính toán tọa độ cartesian từ vĩ độ / kinh độ (được chỉ định bằng radian):

private void CalcCartesianCoord()
{
    _x = Math.Sin(LatitudeRadians) * Math.Cos(LongitudeRadians);
    _y = Math.Sin(LatitudeRadians) * Math.Sin(LongitudeRadians);
    _z = Math.Cos(LatitudeRadians); 
}

Cả hai đều được cắt và dán từ mã thực, do đó, pha trộn giữa độ và radian. Có các thuộc tính ở đây thực hiện một số chuyển đổi (ví dụ:LatitudeRadians là một thuộc tính trả về giá trị radian).

Lưu ý rằng tối ưu hóa là có thể: ví dụ, tính toán sin trùng lặp. Ngoài ra các tính toán trig có thể được lưu trong bộ nhớ cache nếu bạn gọi chúng nhiều.


1
điểm tuyệt vời. Tôi không thể tin rằng tôi đã quên đề cập đến điều đó .. trung bình gần các cực và dòng ngày đã cắn tôi trước đó.
Glenn

3
(+1) Vấn đề không bị giới hạn ở các cực và kinh tuyến + -180 độ: khi vĩ độ của các điểm được tính trung bình thay đổi đáng kể, trung bình thẳng của tọa độ lat / lon tương đương với việc sử dụng phép chiếu mảng Carree giới thiệu một biến dạng số liệu thay đổi tăng theo vĩ độ. Không có vấn đề về số nhưng trung bình chỉ đơn giản là ở vị trí sai. Vì lý do này, các tính toán lat / lon được đề xuất trong câu trả lời của @ Glenn hiếm khi được chấp nhận ngoại trừ các vùng không phân cực tương đối nhỏ.
whuber

@winwaed cảm ơn, bạn có thể đề xuất một số đoạn mã (Java) hoặc hướng dẫn tốt để làm điều này không?
aneuryzm

1
Toán học có tại en.wikipedia.org/wiki/Spherical_coord tọa độ theo 'Tọa độ Descartes'. (triển khai của tôi là C # và được tối ưu hóa một phần - cộng với việc tôi đang gõ cái này tại các nha sĩ !!)
winwaed 23/03

1
Tôi nghĩ đối với các trường hợp sử dụng kỹ thuật chính xác, bạn rất chính xác. Tuy nhiên, trừ khi yêu cầu độ chính xác cực cao, trung bình các tọa độ WGS84 lat, lng trong thành phố và thậm chí các khu vực hoạt động khá tốt và cho kết quả chính xác chấp nhận được đối với hầu hết các sử dụng khi sử dụng trung bình.
Glenn

3

Tùy chọn phân cụm : Tôi nghĩ rằng từ buzz khái niệm bao trùm loại hoạt động này là "phân cụm". Tính trung bình cho đến nay là đơn giản nhất để thực hiện và hoạt động tốt cho hầu hết các mục đích. Lần duy nhất tôi sẽ sử dụng một cái gì đó khác là nếu bạn lo lắng về các ngoại lệ [Chỉnh sửa] -> hoặc các cực hoặc dòng thời gian quốc tế. [Chỉnh sửa] -> cũng tính trung bình, trong khi nó sẽ cung cấp cho bạn một cái gì đó trông gần trung tâm của cụm, sẽ có một chút tắt vì sự không chính xác của phép chiếu gây ra bởi thực tế là độ trễ không phải luôn có cùng khoảng cách ngoài tại km / dặm. Diện tích trung bình bạn càng lớn thì độ méo càng lớn.

Dưới đây là so sánh của một vài tùy chọn phân cụm

Trung bình (dễ, nhanh nhất, không chính xác): chỉ cần tính tổng các giá trị lat & chia cho số đếm và làm tương tự cho các giá trị lng. Hãy chắc chắn để ý đến lỗi tràn nếu bạn đang sử dụng Int32, một số hệ thống (đáng chú ý là c #) sẽ âm thầm tràn trở lại các số thấp. Bạn có thể tránh các lỗi này bằng cách sử dụng độ chính xác của dấu phẩy động cho bộ tích lũy tổng của bạn. Một vấn đề với phương pháp này là các ngoại lệ có thể làm lệch vị trí của bạn. [Chỉnh sửa] -> Một điều nữa là toán học gần các cực và dòng ngày quốc tế không trung bình tốt và sẽ làm lệch vị trí.

Hàng xóm gần nhất (khó hơn một chút, chậm hơn, không thiên vị) Thay vì tính trung bình, bạn có thể đi với vị trí lat lng thực tế với khoảng cách trung bình nhỏ nhất cho tất cả các hàng xóm. Điều này giống như lấy một "trung vị". Mặt trái là điều này rất tốn kém vì bạn so sánh mọi điểm với mọi điểm khác và tính khoảng cách giữa chúng. Ví dụ: phân cụm 10.000 điểm sẽ yêu cầu 100 triệu tính toán khoảng cách .. không chậm nhưng chắc chắn nó không có quy mô tốt.

Grid Cell (cần thiết lập thêm một chút, nhanh hơn nhiều, không bị sai lệch ngoại lệ) Điều này tương tự với hàng xóm gần nhất nhưng nhanh hơn nhiều. Bạn có thể chọn một mức độ chính xác tùy ý, giả sử .01 độ lat lng (khoảng 1km đại khái ở các mạng dân cư) và nhóm các điểm của bạn vào các thùng 0,01 x 0,01 độ. Sau đó, bạn có thể chọn thùng có nhiều điểm nhất trong đó và lấy trung bình của các điểm đó hoặc chạy phân tích hàng xóm gần nhất trên chỉ những điểm đó. Tôi sử dụng phương pháp này rất nhiều với các bộ dữ liệu thực sự lớn (hàng trăm tỷ bản ghi) và thấy nó là một sự cân bằng tốt giữa độ chính xác và tốc độ.

Convex Hull Centroid (kết quả cứng, chậm, gọn gàng): Bạn cũng có thể vẽ một dải xung quanh các điểm của mình để xác định hình dạng bao phủ tất cả ( xem wikipedia ), sau đó tính điểm trung tâm của hình này. Các chức năng trung tâm điển hình không phải là trọng tâm, do đó bạn sẽ cần một số loại phân tích lân cận gần nhất nghịch đảo bằng cách sử dụng các điểm mẫu bên trong hình dạng của bạn cho đến khi bạn tìm thấy điểm xa nhất từ ​​các cạnh. Phương pháp này thực sự thú vị hơn vì bản thân thân lồi thay vì thuật toán tìm trung tâm thực tế không nhanh và đặc biệt chính xác .. nhưng hình dạng thân tàu có thể có các ứng dụng hữu ích khác với dữ liệu của bạn.


@winwaed đưa ra một điểm tuyệt vời về trung bình tọa độ gần các cực và tôi cũng sẽ thêm dòng ngày quốc tế. Ví dụ: nếu bạn có một điểm ở một bên và một điểm khác, bạn sẽ nhận được một số trung bình xấu (và cả các hộp giới hạn). Điều này hiếm khi xuất hiện, nhưng khi nó thực sự là một nỗi đau để gỡ lỗi
Glenn

@whuber làm cho một điểm tốt về trung tâm trôi khi bạn trung bình. Trong khi trung bình sẽ cung cấp cho bạn cái gì mà ngoại hình gần trung tâm của cụm, sẽ là một chút tắt vì sự thiếu chính xác chiếu gây ra bởi thực tế là độ lat lng không phải lúc nào Trái đất cách nhau trong km / dặm. Diện tích trung bình bạn càng lớn thì độ méo càng lớn.
Glenn

0

Không chắc chắn những gì bạn đang cố gắng đạt được, nhưng điểm có vĩ độ là trung bình của tập hợp điểm gốc và kinh độ là avg kinh độ của tập hợp điểm gốc, sẽ là điểm avg của tập hợp điểm gốc. [CẬP NHẬT]: Trong phần trên, avg là trung bình số học.


Trong câu trả lời của bạn, avg = Số học có nghĩa là gì?
aneuryzm

1
Vâng chính xác. Đó là điều tôi muốn xin lỗi vì sự thiếu rõ ràng. Tôi cập nhật câu trả lời. Nhưng tôi không chắc là tôi đang mang thứ gì đó cực kỳ hữu ích đến bàn ở đây ...
GuillaumeC
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.