2013-09-02 2 views
0

먼저이 기능과 관련된 질문에 대한 답변이 있으며 대부분을 살펴본 결과 내가 찾던 답변을 찾을 수 있음을 알고 있습니다. 나는 아주 간단하게 이미지로 설명 할 수있는 일을하려고하고 무엇 : PHP 최소 및 최대 반경을 기준으로 한 거리

image diagram of php distance function http://stokemandevelopment.com/pictures/image1.JPG

지금이 이미지에 약간의 이야기를 추가 할 수 있습니다. MySQL에서 데이터베이스에서 모든 공항에 대한 공항까지의 거리를 계산합니다. 반경 A와 반경 B 사이에있는 경우 해당 위치에 배열을 추가하여 나중에.

function distance($lat1, $lon1, $lat2, $lon2, $unit) { 
    $theta = $lon1 - $lon2; 
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta)); 
    $dist = acos($dist); 
    $dist = rad2deg($dist); 
    $miles = $dist * 60 * 1.1515; 
    $unit = strtoupper($unit); 

    if ($unit == "K") { 
    return ($miles * 1.609344); 
    } else if ($unit == "N") { 
    return ($miles * 0.8684); 
    } else { 
     return $miles; 
     } 
} 

이것은 내 계산을 수행하기 위해 현재 사용하고 있지만 php로되어 있으며 매우 느립니다. mysql 서버가 계산을 수행하도록 코드를 업그레이드하려고합니다. PHP PDO에서이 모든 작업을 수행하려고합니다. 아무도 나를 도울 수 없으면 크게 감사하겠습니다.

+0

코드를 복사하고 강조 표시 한 다음 '코드'버튼을 누르기 만하면 코드의 마크 다운 형식 인 네 개의 공백이 들여 쓰여집니다. – halfer

+0

[가능한 한 가장 짧은 거리 얻기] (http://stackoverflow.com/questions/18420419/get-the-shortest-distance-from-a-point) – Bytemain

+0

@Phpdna - 아니요. –

답변

0

옵션 1 : GeoIP를 지원하는 데이터베이스로 전환하여 데이터베이스를 계산하거나 MySQL의 기본 GeoIP 기능을 사용하십시오.

옵션 2 : 가 데이터베이스에서 계산을 수행합니다 당신은 MySQL을 사용하고, 그래서 당신은 당신의 데이터베이스에 위도와 경도에 대한 인덱스가있는 경우 다음 저장 프로 시저 당신이 할 수있는,

CREATE FUNCTION distance (latA double, lonA double, latB double, LonB double) 
    RETURNS double DETERMINISTIC 
BEGIN 
    SET @RlatA = radians(latA); 
    SET @RlonA = radians(lonA); 
    SET @RlatB = radians(latB); 
    SET @RlonB = radians(LonB); 
    SET @deltaLat = @RlatA - @RlatB; 
    SET @deltaLon = @RlonA - @RlonB; 
    SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) + 
    COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2); 
    RETURN 2 * ASIN(SQRT(@d)) * 6371.01; 
END// 

을 도움이 될 것입니다 PHP ($ minLat, $ maxLat, $ minLong 및 $ maxLong)의 초기 경계 상자를 계산하고이를 기반으로 항목의 하위 집합으로 행을 제한하여 계산해야하는 계산 수를 줄입니다 (WHERE 위도와 $ minLat 및 $ maxLat와 경도 사이의 $ minLong 및 $ maxLong). 그런 다음 MySQL은 행의 하위 집합에 대한 거리 계산 만 실행하면됩니다.

skv (또는 거리를 계산하는 저장 프로 시저)가 제공하는 SQL 문을 사용하는 경우 SQL은 데이터베이스의 모든 레코드를 조사하고 데이터베이스의 모든 레코드에 대한 거리를 계산해야합니다 행을 반환할지 아니면 버릴 지 결정하기 전에

계산이 비교적 느리기 때문에 계산해야하는 행 집합을 줄이고 필요한 거리를 벗어나는 행을 제거하여 우리가 실행하는 것이 더 낫습니다. 적은 수의 행에 대한 값 비싼 계산.

기본적으로지도에서 원점을 그리며 시작점을 중심으로 거리가 반경 인 것을 고려하면됩니다. 이 수식은 어떤 행이 해당 원에 속하는지를 간단히 식별하지만 ... 여전히 모든 단일 행을 확인해야합니다.

경계 상자 사용은지도에서 중심점에서 적절한 거리에있는 왼쪽, 오른쪽, 위쪽 및 아래쪽 가장자리가있는 사각형을 먼저 그리는 것과 같습니다. 그러면 서클의 원은 상자의 테두리에 닿는 원의 Northmost, Eastmost, Southmost 및 Westmost 점과 함께 해당 상자 내에서 그려집니다. 일부 행은 해당 상자 외부에 있으므로 SQL은 해당 행의 거리를 계산하는 것을 방해하지 않습니다. 테두리 상자 안에있는 행의 거리를 계산하여 원 안에 포함되는지 확인합니다.

PHP에서 우리는 거리에 따라 최소 및 최대 위도와 경도를 계산하는 매우 간단한 계산을 사용하여 SQL 문에서 WHERE 절에 값을 설정할 수 있습니다. 이것은 사실상 우리의 상자이며, 그 바깥에있는 모든 것은 실제로 거리를 계산할 필요없이 자동으로 버려집니다.

Movable Type website에있는이 (PHP 코드 포함)에 대한 설명은 PHP에서 지오 사이트 작업을 수행하려는 사람에게 필수적인 내용입니다.

+0

좋아, 명확히하기 위해, 사용자가 제공하는 최소 거리와 최대 거리 내에있는 포인트 간의 거리를 계산할 수 있습니까? –

+0

당신은 약간의 작업을해야 할 것입니다. 바운더리 박스를 사용하여 바깥 쪽 원을 만들고 SQL의 WHERE 절에서 설정합니다. SQL 쿼리 선택 목록에서 결과의 해당 하위 집합에 대한 거리를 계산 한 다음 계산 된 거리가 내부 원 반경과 외부 원 반경 사이에 있는지 테스트하는 HAVING 절 –