PHP/MySQL:선택 가까운 위치 지정된 위치에서 DB
-
23-08-2019 - |
문제
PHP 에서,나는 다음과 같은 계산하기 위한 코드 사이의 거리를 두 위치:
<?php
function distance($lat1, $long1, $lat2, $long2) {
// DEGREE TO RADIAN
$latitude1 = $lat1/180*pi();
$longitude1 = $long1/180*pi();
$latitude2 = $lat2/180*pi();
$longitude2 = $long2/180*pi();
// FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS
$distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371;
return $distance;
}
echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE
?>
그러나 지금,나는 원하는 위치를 선택하려면 가까운 위치를 통해 PHP 에서 내 MySQL 데이터베이스:
- 사용자가 자신의 고향
- 내 스크립트가 위도/경도 값을 통해 Google API
- 내 데이터베이스에서,나는 약 200 위치 필드를 위도 값과 분야에 대한 경도 값
- 가 필요한 코드에 대한 PHP and MySQL 을 선택합 10 위치 있는 가장 가까운 사용자의 고향
나는 당신이 나를 도울 수 있습니다.사전에 감사합니다!
해결책
MySQL Great Circle 거리 (Haversine Formula) 필요한 것을 정확하게 수행합니다.
그러나 200 개의 레코드만으로도 모든 것을로드하여 코드로 확인할 수도 있습니다. 데이터 세트는 실제로 너무 작아서 데이터베이스 대 코드 또는 기타 최적화에 대해 너무 걱정할 수 없습니다.
PHP의 우편 번호 사이의 거리를 계산합니다 이 알고리즘에 대한 몇 가지 PHP 구현이 있습니다.
지리적 근접 검색 당신이 가진 똑같은 문제입니다.
다른 팁
어쩌면
SELECT field1, field2, ...,
ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
또는
SELECT field1, field2, ...,
ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
ORDER BY distance ASC;
(PHP 코드에서 직접 번역)
:1
그리고 :2
~이다 $lat2/180*pi()
그리고 $long2/180*pi()
각기.
는 하버 사인 공식입니다.번역할 수 있습니다 PHP 직접 그래서 SQL 쿼리할 수 있는 데이터베이스는 공간적으로(대안을 끌어 모든 레코드의 DB 및 실행을 통해 데이터 PHP).MySQL 제공하는 모든 수학 함수는 당신이 필요합니다.
나는 이에 대한 상업적인 웹사이트를 제공하는 게시물/우편 번호 거리를 기반으로 검색,그래서 그것은 확실히 가능하지 않고 특정 GIS 함수입니다.
이것을 정확하게 수행 할 수있는 MySQL 기능이 있습니다.
MySQL은 지리 공간적으로 행을 색인화 할 수 있습니다. 이 수학을 직접 수행 할 필요가 없을 수도 있습니다 (MySQL에 두 GEO 객체 사이의 거리를 계산하고 정렬하도록 요청할 수 있습니다.)
방금이 주제를 교차했습니다. 어쩌면 누군가 MySQL 5.7에서 테스트 된이 기능에 관심이있을 수도 있습니다.
create function GetDistance(lat1 real, lng1 real, lat2 real, lng2 real) returns real no sql
return ATAN2(SQRT(POW(COS(RADIANS(lat2)) * SIN(RADIANS(lng1 - lng2)), 2) +
POW(COS(RADIANS(lat1)) * SIN(RADIANS(lat2)) - SIN(RADIANS(lat1)) *
COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)), 2)),
(SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) *
COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)))) * 6372.795;
부름:
select GetDistance(your_latitude, your_longitude, table_field_lat,
table_field_lng) as dist from [your_table] limit 5;
왜 당신이 사용하 MySQL 의 지리 특징...?아니,그냥 농담이 아니에요.
는 경우에는 200 개의 레코드가 실제 장소 같은 도시,등 그에 대한 대안으로 사용할 수 있 geonames 을'API?
다음과 같은 웹 서비스를 제공할 것이 10 가장 가까운 위치를 lat 및 lng 제공:
http://ws.geonames.org/findNearby?lat=47.3&lng=9
출처: http://www.geonames.org/export/web-services.html#findNearbyPlaceName