2014-07-08 12 views
6

나는 지금 실내지도 네비게이션 응용 프로그램을 만들고 있는데 내가하려는 것은 건물에지도 지점의 데이터베이스를 구축하는 것입니다.PostGis Distance Calculation

내가 사용하는 모든 좌표는 Google지도 (EPSG는 3857 임)에서 가져온 것입니다. 와 처음 2 행에 대해

SELECT ST_DISTANCE(
ST_GeomFromText('POINT(' || StartLon || ' ' || StartLat || ')',3857), 
ST_GeomFromText('POINT(' || EndLon || ' ' || EndLat || ')',3857)) 
FROM i3_building.floordata; 

: 내가 지금해야 할 것은 미터의 거리를 찾을뿐만 아니라 내가 2 점 사이의 거리를 추출 할 때 m

을에 D_Within을 사용하는 것입니다

주어진
Start: 103.776047 1.292149; End: 103.77607 1.292212 (3 meters away) 
Start: 103.776070 1.292212; End: 103.77554 1.292406 (50 meters away) 

결과는 다음과 같습니다

2.59422435413724e-005 
4.11096095831604e-005 

가, 방사선의 두 번째 재 비록 sult는 첫 번째 것보다 두 배나 높습니다. 그래서 그것은 나를 혼란스럽게 만듭니다. 그럼 난 미터로 출력하려고 :

SELECT ST_DISTANCE(
    ST_GeographyFromText('POINT(' || StartLon || ' ' || StartLat || ')'), 
    ST_GeographyFromText('POINT(' || EndLon || ' ' || EndLat || ')')) 
FROM i3_building.floordata; 

같은 행에 주어진 결과는 다음과 같습니다 나뿐만 아니라 무엇을 기대하지

2.872546829 
4.572207435 

. Postgis와 SRID에 익숙하지 않아서이 질문이 간단 해 보이지만 도와 주시면 감사하겠습니다. @@

답변

11

좌표 참조 시스템 (CRS)은 4326, lat/lon입니다. 이것은 Google Maps와의 혼란의 일반적인 원인입니다. 3857은 Google Maps에서 타일로 사용되는 CRS이며 구형 지구를 기반으로 한 계량 투영입니다. Google지도에 추가 된 벡터 소스 (KML 데이터, GPS 덤프 등)는 위도/경도 (4326)로 표시되는데 이는도 단위로 측정되어 즉시 변환됩니다.

두 위도/경도 점 사이의 거리를 미터로 표시하려면 ST_Distance_Sphere을 사용하십시오. 예를 들어, 첫 번째 점 집합에 대해

select st_distance_sphere(st_makepoint(103.776047, 1.292149),st_makepoint(103.77607, 1.292212)); 

이것은 7.457 미터입니다. 두 번째 점 집합은 동일한 쿼리를 기반으로 서로 62.74 미터 떨어져 있습니다.

참고 세 번째 매개 변수 인 측정 회전 타원체, 즉 지구의 모양을 근사하는 ST_Distance_Spheroid도 있습니다. 이것은 잠재적으로 더 정확할 것이지만, 아마도 작은 거리에 대해서는 중요하지 않을 것입니다.

ST_Distance는 예상 좌표에서 거리를 제공합니다. 아마 위도/경도 값을 연결하는 이상한 결과가 나옵니다.

+0

답장을 보내 주셔서 감사합니다. 나는 4326도 시도했지만 3857과 많이 다르지 않았다. 첫 번째 세트와의 거리는 3 미터 떨어져 있기 때문에 내 사무실에 있으므로 잘 알고있다. 나는 또한 여기에서 그것을 산출하는 것을 시도한다 : http://boulter.com/gps/distance/ - 동일한 결과, 3 미터. –

+0

별로 다르지 않은 점은 무엇입니까? 나는 7.45 미터와 62.74가 상당히 다르다고 말할 것이다. 그것은 st_distance_sphere가 문제이지만, 이것은 st_distance가 투영 된 좌표에서 거리를 취하는 lat/lon에서 입력을 취하기 때문에 문제입니다. 3857과 4326은 각각 미터와 각도가 다르지만 근본적으로 다릅니다. 올바른 답을 얻기 위해서는 올바른 기능을 사용해야합니다. D –

+0

죄송합니다. 나가서 측정을 시도하십시오. 약 7 미터가 정확합니다.도와 줘서 고마워. –