반응형
특정 지리적 위치 내에서 무언가를 찾으려고하는 쿼리가 있지만 결과가 조금 ... 이상합니다.
내 데이터는 위도 / 경도 37.780182, -122.517349
가있는 샌프란시스코시를 둘러싸고 있습니다.
검색어 :
SELECT
id,
hike_title,
lat,
lng,
( 3959 * acos( cos( radians(37) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(37.780182) )
+ sin( radians(-122.517349) ) * sin( radians( lat ) )
)
) AS distance
FROM
my_awesome_table
HAVING
distance < 10000
ORDER BY
distance
LIMIT
0 , 50
보시다시피 반경을 10000으로 설정하더라도 여전히 많이 찾지 못하므로 내 쿼리가 꺼져 있는지 궁금합니다. 결과 중 일부는 lat / lng에 대해 0,0도 가지고 있는데, 이는 해당 레코드에 lat / lng가 없음을 나타내는 내 방식입니다.
공식은 다음과 같습니다.
SELECT
id,
( 3959 * acos( cos( radians(37) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(-122) )
+ sin( radians(37) ) * sin( radians( lat ) )
)
) AS distance
FROM
markers
HAVING
distance < 25
ORDER BY
distance
LIMIT
0 , 20;
고맙고 긴 질문에 대해 죄송합니다! 그건 그렇고, 나는 MySQL을 사용하고 있습니다.
흠,
방금 제공 한 정확한 쿼리로 시도했으며 50 % 정확도로 작동했습니다. 다음은 데이터 세트의 샘플입니다.
lat lng
| 37.223465 | -122.090363 |
| 39.320980 | -111.093735 |
| 38.031715 | -84.495132 |
| 37.787144 | -122.493263 |
| 52.975361 | -1.458620 |
| 40.848557 | -111.906883 |
| 40.572498 | -111.859718 |
이제 쿼리는 멀리 떨어진 모든 항목을 반환했지만 100 마일 미만 떨어진 항목은 반환하지 않았습니다. 이 항목 (37.787144, -122.493263)은 출발지에서 약 50 마일 떨어져 있어도 반환되지 않았습니다. 그 이유를 알고 계십니까?
해결 방법
중심점의 위도 (37.780182)와 경도 (-122.517349)를 반대로 바꾼 것 같습니다.
select
id,
hike_title,
lat,
lng,
( 3959 * acos( cos( radians(37) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(-122.517349) )
+ sin( radians(37.780182) ) * sin( radians( lat ) )
)
) AS distance
FROM
my_awesome_table
HAVING
distance < 10000
ORDER BY
distance
LIMIT
0 , 50
참조 페이지 https://stackoverflow.com/questions/4697624
반응형
'MySql' 카테고리의 다른 글
MySQL DATETIME-날짜 만 변경 (0) | 2020.10.22 |
---|---|
MySQL mysql 데이터의 행 / 열을 배열에 저장하는 방법 (0) | 2020.10.22 |
MySQL에서 두 개의 하위 쿼리 결합 (0) | 2020.10.22 |
MySQL mysqli query not working when variable inserted (0) | 2020.10.22 |
MySQL How does MySQL process ORDER BY and LIMIT in a query? (0) | 2020.10.22 |
댓글