문제

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 기능이 있습니다.

http://dev.mysql.com/doc/refman/en/gis-introduction.html

MySQL은 지리 공간적으로 행을 색인화 할 수 있습니다. 이 수학을 직접 수행 할 필요가 없을 수도 있습니다 (MySQL에 두 GEO 객체 사이의 거리를 계산하고 정렬하도록 요청할 수 있습니다.)

보다: http://forums.mysql.com/read.php?23,159205,159205

방금이 주제를 교차했습니다. 어쩌면 누군가 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

전체 목록: http://www.geonames.org/export/ws-overview.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top