SQL 데이터베이스에서 위도와 경도를 사용하여 가장 가까운 위치를 찾는 방법은 무엇입니까?
다음 데이터베이스 테이블에서 가장 가까운 위치를 찾고 싶습니다.
Address Latitude longitude
Kathmandu 44600, Nepal 27.7 85.33333330000005
Los, Antoniterstraße 37.09024 -95.71289100000001
Sydney NSW, Australia 49.7480755 8.111794700000019
goa india 15.2993265 74.12399600000003
Google 지도에서 모든 데이터를 가져왔습니다.여기서 가장 가까운 곳을 찾아야 해요.내가 수르케트에 있다고 가정하면 그것의 위도는 28.6이고 경도는 81.6인데, 어떻게 수르케트에서 가장 가까운 곳을 찾을 수 있을까요?
MySQL을 사용하여 인근 위치 찾기
다음은 37,122 좌표에서 반경 25마일 이내에 있는 가장 가까운 20개 지점을 찾는 SQL 문입니다.해당 행의 위도/경도 및 목표 위도/경도를 기준으로 거리를 계산한 다음 거리 값이 25 미만인 행만 요청하고 거리별로 전체 쿼리를 정렬한 후 결과를 20개로 제한합니다.마일 대신 킬로미터 단위로 검색하려면 3959를 6371로 대체합니다.
표 구조:
id,name,address,lat,lng
참고 - 위도 = 37 & 경도 = -180입니다.그러니까 넌 그냥 네 것을 지나쳐.
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) *
cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) *
sin( radians( lat ) ) ) ) AS distance FROM your_table_name HAVING
distance < 25 ORDER BY distance LIMIT 0 , 20;
자세한 내용은 이쪽에서 확인하실 수 있습니다.
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;
가까운 위치를 찾으려면 지오코더 클래스를 사용합니다.지오포인트(위도 및 경도)가 있으므로 역 지오코딩을 사용할 수 있습니다.역 지오코딩은 (위도, 경도) 좌표를 (부분) 주소로 변환하는 과정입니다.자세한 내용은 여기를 참조하십시오.
SELECT latitude, longitude, SQRT(
POW(69.1 * (latitude - [startlat]), 2) +
POW(69.1 * ([startlng] - longitude) * COS(latitude / 57.3), 2)) AS distance
FROM TableName HAVING distance < 25 ORDER BY distance;
여기서 [starlat]와 [startlng]는 거리 측정을 시작하는 위치이고 25는 kms 단위의 거리입니다.
결과를 찾기 위해 많은 행을 검사하기 때문에 쿼리를 사용하기 위한 저장 프로시저를 만드는 것이 좋습니다.
SQL에 문제가 있습니다.표:
`ubicacion` (
`id_ubicacion` INT(10) NOT NULL AUTO_INCREMENT ,
`latitud` DOUBLE NOT NULL ,
`longitud` DOUBLE NOT NULL ,
PRIMARY KEY (`id_ubicacion`) )
id_ubicacion은 사용 시 다음과 같이 변경됩니다.
SELECT `id_ubicacion` , ( 3959 * ACOS( COS( RADIANS( 9.053933 ) ) * COS( RADIANS( latitud ) ) * COS( RADIANS( longitud ) - RADIANS( - 79.421215 ) ) + SIN( RADIANS( 9.053933 ) ) * SIN( RADIANS( latitud ) ) ) ) AS distance
FROM ubicacion
HAVING distance <25
ORDER BY distance
LIMIT 0 , 20
sesach : ( 3959 * acos( cos( radians('.$_REQUEST['latitude'].') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$_REQUEST['longitude'].') ) + sin( radians('.$_REQUEST['latitude'].') ) * sin( radians( latitude ) ) ) ) <='.$_REQUEST['mile'];
방법이 수행되어야 할 때는 먼저 위도와 경도를 필터링한 다음 대략적인 거리의 제곱을 계산하는 것이 좋습니다.북유럽 국가들의 경우 1000km 이내에서 약 0.3퍼센트 할인될 것이다.
따라서 거리를 계산하는 대신 다음과 같이 계산하십시오.
dist_Sphere = r_earth * acos ( sin (lat1) * sin (lat2) + cos(lat1)*cos(lat2)*cos(lon 2 - lon 1)
다음과 같이 대략적인 값을 계산할 수 있다(lat = lat 1이 lat 2에 가깝다고 가정함).
const cLat2 = cos lat ^ 2
const r_earth2 = r_earth ^ 2
dist_App ^2 = r_earth2 * ((lat 2 - lat 1) ^2 + clat2 *(lon 2 - lon 1) ^2)
Dist_App 2로 주문하고 결과에서 제곱근을 빼면 됩니다.
모든 값을 거리로 표시하는 경우
lat long을 큰따옴표(" " )로 바꿉니다.
쿼리에 25km 거리 데이터만 표시되므로 값이 더 높아집니다.
SELECT *, SQRT(
POW(69.1 * (lat - "YOUR LATITUDE VALUE"), 2) +
POW(69.1 * ("YOY LONGITUDE VALUE" - lon) * COS(lat / 57.3), 2)) AS distance FROM moms HAVING distance < 25 ORDER BY distance;
언급URL : https://stackoverflow.com/questions/11112926/how-to-find-nearest-location-using-latitude-and-longitude-from-sql-database
'programing' 카테고리의 다른 글
JavaScript에서 문자열의 대시 후 모든 항목 가져오기 (0) | 2022.11.03 |
---|---|
JavaScript에서 문자열을 float로 변환하는 방법 (0) | 2022.11.03 |
MySQL 서버 시작 오류 'PID 파일을 업데이트하지 않고 서버가 종료되었습니다' (0) | 2022.11.03 |
'상수'를 공유하기 위한 Java 정적 필드가 있는 인터페이스 (0) | 2022.10.25 |
#ifdef #ifndef(자바어) (0) | 2022.10.25 |