Bán kính Trái đất mặc định trong ST_Distance_Sphere đến từ đâu?


15

MySQL nói trong các tài liệu cho ST_Distance_Sphere

Tính toán sử dụng một trái đất hình cầu và bán kính cấu hình. Đối số bán kính tùy chọn nên được đưa ra bằng mét. Nếu bỏ qua, bán kính mặc định là 6.370.986 mét. Nếu đối số bán kính có mặt nhưng không tích cực, sẽ ER_WRONG_ARGUMENTSxảy ra lỗi.

PostGIS nói trong các tài liệu của ST_Distance_Sphere, (mặc dù các tài liệu không còn chính xác nữa )

Sử dụng một trái đất hình cầu và bán kính 6370986 mét.

Họ lấy 6.370.986 mét mặc định từ đâu? WGS84 cho biết bán kính trục chính là 6.378.137.0 m. PostGIS hiện sử dụng Bán kính trung bình về cơ bản sử dụng 6371008.

Nhìn vào mã

#define WGS84_MAJOR_AXIS 6378137.0
#define WGS84_INVERSE_FLATTENING 298.257223563
#define WGS84_MINOR_AXIS (WGS84_MAJOR_AXIS - WGS84_MAJOR_AXIS / WGS84_INVERSE_FLATTENING)
#define WGS84_RADIUS ((2.0 * WGS84_MAJOR_AXIS + WGS84_MINOR_AXIS ) / 3.0)

Điều đó có nghĩa là

-- SELECT 6378137.0 - 6378137.0 / 298.257223563;
WGS84_MINOR_AXIS = 6356752.314245179498
-- SELECT ( 2.0 * 6378137.0 + ( 6378137.0 - 6378137.0 / 298.257223563) ) / 3.0;
WGS84_RADIUS = 6371008.771415059833

Các phiên bản mới ít hiệu quả hơn, phức tạp hơn và sử dụng Pro4j nhưng dường như chúng cũng làm điều tương tự.

6370986 vẫn đến từ đâu?


1
Nó đại diện cho bán kính trái đất trung bình, nên (2*minorAxis+majorAxis)/3 ... mặc dù giá trị đó đối với WGS84 vẫn lớn hơn vài mét (6.371.008.771)
JGH

vâng, đó là câu hỏi tại sao sự khác biệt.
Evan Carroll

2
Một số nhà phát triển đã tìm nó trên mạng? Nguồn postgis có thể làm sáng tỏ nó
Ian Turton

2
@IanTurton Hầu hết các lỗi có thể được giảm xuống thành "một số nhà phát triển đã làm gì đó và nguồn có thể làm sáng tỏ nó." Tôi dự định thực hiện công việc, hình dung đó sẽ là những gì nó cần nếu không ai biết câu chuyện. Xem câu trả lời dưới đây.
Evan Carroll

1
Có lẽ có một lỗi đánh máy và chúng có nghĩa là 6370996 ... rất gần với bán kính tự động của Clarke 1866.
mkennedy

Câu trả lời:


21

Ok, đây là vui nhộn . Tôi theo dõi điều này xuống. Trong một bản sao cũ của lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4, bạn có thể thấy điều này,

/*
 * This algorithm was taken from the geo_distance function of the 
 * earthdistance package contributed by Bruno Wolff III.
 * It was altered to accept GEOMETRY objects and return results in
 * meters.
 */
PG_FUNCTION_INFO_V1(LWGEOM_distance_sphere);
Datum LWGEOM_distance_sphere(PG_FUNCTION_ARGS)
{
        const double EARTH_RADIUS = 6370986.884258304;

Chuyển sang các tài liệu của earthdistance, bạn sẽ tìm thấy điều này:

Lưu ý rằng không giống như phần dựa trên khối của mô-đun, các đơn vị được gắn kết ở đây: thay đổi earth()chức năng sẽ không ảnh hưởng đến kết quả của toán tử này.

Và số khó đó: EARTH_RADIUScó thể thấy ở đây

/* Earth's radius is in statute miles. */
static const double EARTH_RADIUS = 3958.747716;

Vì vậy, bạn có thể làm một cách đơn giản.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Và bạn có của bạn 6370986.884258304. Tất nhiên, chỉ cần cắt ngắn nó và lưu trữ nó trong một longlý do tại sao không.

Vì vậy, trong bản chất, bán kính trong MySQL đã được nâng lên từ một bản sao công việc lười từ PostGIS rằng chuyển đổi bán kính trong dặm để mét từ một hằng số che khuất từ một mô-đun PostgreSQL cũ ngẫu nhiên 20 năm .

earth_distancelà một mô-đun tiền PostGIS của Bruce Momjian. Tôi xin tuyên bố 6370986 Hằng số Bmomjian: một phép tính gần đúng của Trái đất tính bằng mét để thỏa mãn MySQL. Mặc dù có thể không lâu.


2
Nhưng con số 3958.747716 rất chính xác đó đến từ đâu? Gần nhất tôi có thể tìm thấy là 3958,74795, mà là số của Hoa Kỳ khảo sát dặm trong 6371 cây số, nhưng đó lá vẫn khoảng 37 cm mất tích ,,,
hmakholm còn sót lại Monica

1
@HenningMakholm tiếp tục chiến đấu tốt không có ý kiến ​​gì. ;)
Evan Carroll

2
Rất đẹp tìm thấy!
Paul Ramsey
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.