중심점에서 반경 500m거리 쿼리 맞는지 확인해주세요 0 5 4,964

by 손님 [SQL Query] [2011.07.06 09:47:42]



select * from 테이블
where 1=1
and x_axis between x_axis-500 and x_axis+500
and y_axis between y_axis-500 and y_axis+500
and sqrt((x_axis-x_axis)*(x_axis+x_axis)+(y_axis-y_axis)*(y_axis+y_axis))<=500
by 마농 [2011.07.06 10:49:12]
x_axis 가 여러번 나오는데 같은 값으로 체크하는게 이상하네요?
1,2 라인은 무조건 참일수밖에 없겠죠.
자기자신에서 500 뺀거랑 500 더한거 사이에 자기자신이 있을 수 밖에 없죠
3번라인은 자기자신의 값을 빼면(x_axis-x_axis) 무조건 0 이 나오죠.

by 손님 [2011.07.06 11:02:34]
그럼어떻게해야되나요>

by 마농 [2011.07.06 11:02:47]
혹시 여러번 나오는 x_axis 가 하나는 테이블의 컬럼이고 하나는 중심점의 좌표라면?
똑같이 표현하시면 안되죠...
중심점의 좌표를 변수로 입력받는다면 변수명을 달리 하셔야 합니다.
중심점의 좌표 변수를 v_x_axis, v_y_axis 로 바꿔 보면
AND x_axis BETWEEN v_x_axis - 500 AND v_x_axis + 500
AND y_axis BETWEEN v_y_axis - 500 AND v_y_axis + 500
AND SQRT(POWER(x_axis - v_x_axis, 2) + POWER(y_axis - v_y_axis, 2)) <= 500

by 허재영 [2011.07.06 11:11:08]
중심점좌표를 x,y 로 보고 어느 한점 좌표가 x_axis, y_axis 이면

삼각함수의 정의를 이용해서 빗변의 길이가 곧 두점사이의 거리가 됩니다.

x - x_axis 밑변 길이(제곱하니까 부호 상관없음)
y - y_axis 높이 길이(제곱하니까 부호 상관없음)

빗변 = (루트 ((밑변제곱) + (높이제곱)))

select * from 테이블
where sqrt(power(x - x_axis,2) + power(y - y_axis,2)) <= 500


주의 할점은 x, y 좌표가 GPS 위도 경도이면 실제 우리가 사용하는 거리와 차이가 존재합니다.

by 마농 [2011.07.06 11:24:51]
1,2,3 라인의 조건중 실제로 필요한 조건은 3라인의 조건이죠.
3라인의 조건만으로도 원하는 자료를 얻을 수 있습니다.
그러나 이 조건만 있다면 전체자료를 모두 읽어와 계산하게 됩니다.
1,2, 라인의 역할은 인덱스를 이용해 우선 계산범위를 줄여주는 것입니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입