ST_Distance_Sphere의 기본 지구 반경은 어디에서 제공됩니까?


15

MySQL은 문서에서 ST_Distance_Sphere

계산에는 구형 지구와 구성 가능한 반경이 사용됩니다. 선택적 반경 인수는 미터 단위로 제공해야합니다. 생략하면 기본 반경은 6,370,986 미터입니다. 반경 인수가 있지만 양수가 아닌 경우 ER_WRONG_ARGUMENTS오류가 발생합니다.

PostGIS 는의 문서에서 말합니다 ST_Distance_Sphere( 문서는 더 이상 정확하지 않지만 ).

6370986 미터의 구형 지구와 반경을 사용합니다.

기본 6,370,986 미터는 어디서 얻었습니까? WGS84 는 장축 반경이 6,378,137.0m라고 말합니다. 현재 평균 반경을 사용하는 PostGIS는 기본적으로 6371008을 사용합니다.

코드를 보면

#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)

그것의 의미는

-- 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

최신 버전은 효율성이 떨어지고 복잡하며 Pro4j를 사용하지만 동일한 기능을 수행하는 것으로 보입니다.

아직도 6370986은 어디에서 왔습니까?


1
그것은 평균 지구 반경, 표현 되어야한다 (2*minorAxis+majorAxis)/3 WGS84에 대한 그 값은 여전히 몇 미터 더 큰 (6,371,008.771) 비록 ...
JGH

그렇습니다. 그것이 불일치 인 이유입니다.
Evan Carroll

2
일부 개발자가 인터넷에서 찾아 봤습니까? postgis 소스에 약간의 불이 붙을 수 있습니다
Ian Turton

2
@IanTurton 대부분의 버그는 "일부 개발자가 무언가를했고 소스가 빛을 발할 수 있습니다"로 축소 될 수 있습니다. 나는 아무도 그 이야기를 모른다면 그것이 될 것이라고 생각하면서 그 일을하려고했다. 아래 답변을 참조하십시오.
Evan Carroll

1
어쩌면 오타가 있었으며 6370996을 의미했습니다. 이것은 Clarke 1866의 정식 반지름에 매우 가깝습니다.
mkennedy 2014

답변:


21

좋아, 이것은 hilarriuusss 입니다. 나는 이것을 추적했다. lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4 의 오래된 사본 에서 이것을 볼 수 있습니다.

/*
 * 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;

의 문서로 이동 earthdistance하면 다음을 찾을 수 있습니다.

모듈의 큐브 기반 부분과는 달리 단위는 여기에 고정되어 있습니다. earth()기능을 변경해도이 연산자의 결과에는 영향을 미치지 않습니다.

그리고 그 고정 배선 번호 : EARTH_RADIUS여기에서 볼 수 있습니다

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

그래서 당신은 간단하게 할 수 있습니다.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

그리고 당신은 6370986.884258304. 물론 그냥 잘라서 long왜 저장 하지 않습니까?

그래서 본질적으로, MySQL은 반경되었다 PostGIS와에서 게으른 복사 - 직장에서 해제 미터 마일 반경을 변환 A로부터 무명의 일정에서 무작위로 20 세의 PostgreSQL의 모듈 .

earth_distanceBruce Momjian의 사전 PostGIS 모듈입니다. 나는 이에 따라 Bmomjian Constant : 6370986을 선포합니다. 아마 오래되지는 않았지만 .


2
그러나 그 정확한 그림 3958.747716은 어디에서 왔습니까? 내가 찾을 수있는 가장 가까운 미국의 수 3958.74795입니다 설문 조사 ,,, 6,371km의 마일 만에 그 여전히 잎 (37)에 대한 cm 불명
hmakholm 모니카에 걸쳐 왼쪽

1
@HenningMakholm은 좋은 싸움을 계속하고 있습니다. ;)
Evan Carroll

2
아주 좋은 발견!
폴 램지 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.