programing

SQL 데이터베이스에서 위도와 경도를 사용하여 가장 가까운 위치를 찾는 방법은 무엇입니까?

itsource 2022. 11. 3. 22:02
반응형

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로 주문하고 결과에서 제곱근을 빼면 됩니다.

1

모든 값을 거리로 표시하는 경우

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

반응형