2014-09-16 14 views
0

postgreSQL/postGIS 사용에 대한 질문이 있습니다.PostgreSQL/PostGIS 요청을 통해 두 점 사이의 미터법 거리를 구하십시오.

지도에서 (데이터베이스에 저장되어있는) 사용자로부터 멀리 떨어져있는 표시 자 (요청에 지정된 좌표)를 표시하고 싶습니다.

마커 필드의 유형은 POINT (위도/경도 저장)입니다. 사용자 위치는 Google Map API에 의해 결정됩니다. 기능이 ST_Distance는 마커와 사용자의 위치 사이도 나에게 거리를 제공한다는 나는 km의 거리를 테스트하는 것이 내가 아는

SELECT * FROM geo_points WHERE ST_distance(ST_SetSRID(geo_points.coords::geometry,4326),ST_GeomFromEWKT('SRID=4326;POINT(45.0653944 4.859764599999996)')) > 65 

(인터넷에서 몇 가지 조사 후) : 여기

는 실제 요청입니다 .

메트릭 좌표의 점을 변환하려면 함수 ST_tranform을 사용해야한다고 생각합니다.

내 질문은 다음과 같습니다. - 프랑스의 SRID는 무엇입니까 - 사용자 위치에 따라 어떻게 전 세계에서이를 동적으로 만들 수 있습니까?

또한 함수 ST_within이 존재하며이를 수행 할 수 있다고 말합니다. 그러나 나는 나중에 그 거리가 필요할 것이라고 예상한다. 다른 게시물에 솔루션 어쩌면이 있습니다,하지만 난 내 연구 중에 발견 한 모든 답변은 정말 내 요구를 충족하지 않은 :

어떤 도움이 크게

PS를 감상 할 수있다.

+0

(http://postgis.refractions.net/docs/ST_Distance.html을), ST_Distance - Geometry 유형의 경우 투영 단위의 두 Geometry 간의 2 차원 직교 좌표계 최소 거리 (공간 참조 기준)를 리턴하십시오. –

+0

try [ST_Distance_Sphere] (http://postgis.refractions.net/docs/ST_Distance_Sphere.html) –

답변

1

먼저 PostGIS에서 사용되는 좌표의 축 순서에주의하십시오. 긴/위도이어야합니다. 현재 you are searching in Somalia입니다. 좌표로 스와핑 you would be searching in France.

geography type과 함께 측지선 계산을 사용하거나 ST_Distance_Spheroid과 같은 측지 함수를 사용할 수 있습니다. 지리 유형을 사용하면 더 높은 성능을 위해 ST_DWithin을 사용할 수 있습니다. 여기

geo_points 65m 떨어진 이하 프랑스 (하지 소말리아)에 대한 관심의 관점에서이다 : 그러나

SELECT * FROM geo_points 
WHERE ST_Distance_Spheroid(
    ST_Transform(geo_points.coords::geometry, 4326), 
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326), 
    'SPHEROID["WGS 84",6378137,298.257223563]') < 65.0; 

, 그것은 모든 geo_points까지의 거리를 찾을 필요가 있기 때문에 그것은 매우 느린 것, 퍼포먼스에 신경을 쓰지 않고 몇 천 포인트도 채 안되면 그렇게하십시오.

변경 및 경도/위도 geography 유형으로 (WGS84) 저장 geo_points.coords 변형 경우

[이]에 기초
SELECT * FROM geo_points 
WHERE ST_DWithin(
    geo_points::geography, 
    ST_SetSRID(ST_MakePoint(4.859764599999996, 45.0653944), 4326)::geography, 
    65.0);