2015-01-19 6 views
0

나는 특정 lon/lat의 너무 많은 마일 내에있는 모든 고객을 찾고 어레이의 해당 고객 목록을 반환하는 문제에 대해 작업하고 있습니다. 저는 Haversine 수식과 MySQL에서 경계를 가지고 그렇게하는 옛 방식에 꽤 정통합니다. 그러나 MySQL 버전 5.6으로 업데이트하면 ST_WITHIN() 함수를 사용하여 동일한 결과를 얻으려고합니다.ST_WITHIN() 결과를 반환하지 않습니다.

http://rutweb.com/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/

내 코드는 지금까지 그렇게 다음과 같습니다 :

$lat = 40.2808380; 
$lon = -111.6573890; 
$distance = $row['RadialMiles']; // radius of bounding circle in miles 

$rlon1 = $lon - $distance/abs(cos(deg2rad($lat))*69); 
$rlon2 = $lon + $distance/abs(cos(deg2rad($lat))*69); 
$rlat1 = $lat - ($distance/69); 
$rlat2 = $lat + ($distance/69); 

$query = "SELECT astext(Position), Firstname, Lastname FROM Account 
WHERE systemAccountID = '$systemAccountID' 
AND st_within(Position, envelope(linestring(point(:rlon1, :rlat1), point(:rlon2, :rlat2))))"; 

    try { 
     $stmt = $con->prepare($query); 
     $stmt->execute(array('rlon1' => $rlon1,'rlon2' => $rlon2,'rlat1' => $rlat1,'rlat2' => $rlat2)); 
     $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } catch (PDOException $e) { 
     throw $e; 
    } 

    print_r($result); 

는 현재 배열이 빈 결과를 생성, 내가 그것을 알고

나는 튜토리얼은 여기에 게시 다음 해요 2 개의 결과를 반환해야합니다.

참고로 내 테이블에는 이름, 성 및 위치라는 3 개의 열이 있다고 가정 할 수 있습니다. 위치는 타입 포인트이고 다음과 같은 것을 포함합니다 : POINT (38.8026085 -116.4193878)

저는 하루 종일이 작업을하고 있으며 공간 함수를 사용하여 저를 위해 좌절했습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

위치가 포인트 데이터 유형이어야 할 수도 있습니다. –

+0

astext() 함수를 제거하려는 경우 (이미 열이 유형으로 점을 가짐), 그렇게 했으므로 아무런 차이가 없습니다. –

답변

1

mysql의 ST spacial 기능을 위해이 튜토리얼을 사용하고자하는 모든 사람들에게, 튜토리얼은 (lat, lon) 대신에 (lon, lat) 형식으로 포인트를 나열한다는 것을 알고 있어야한다. 이것이 반환 값을 얻는 데 어려움이있는 이유입니다.

관련 문제