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?
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?
Câu trả lời:
Đố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 # của tôi :
Sau đây chuyển đổi tọa độ cartesian thành vĩ độ / kinh độ (tính theo độ): Loại bỏ các RAD2DEG
hằ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.
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.
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.