복붙노트

[SQL] PHP / MySQL의 우편 번호의 근접 검색

SQL

PHP / MySQL의 우편 번호의 근접 검색

난 그냥 이렇게하는 가장 좋은 방법에 대한 제안을 찾고 있어요 ...

내가 검색 기능을 만들 필요가 우편 번호의 50 마일 반경 내에서 "사용자"에 대한 검색 것을. 나는 모든 미국이 자신의 위도 / 경도와 코드를 압축하지만 난 그냥 구조에 가장 좋은 방법은 알아 내려고 노력하고 쿼리 내 데이터있어이 포함 된 우편 번호 테이블이 ...

나는 주어진 우편 번호의 반경 내에서 사용자가 모든 사용자 테이블 및 쿼리 그것에 위도 / 경도의 열을 추가해야 하는가? 아니면 내가 다음 결과 (ZIP 코드)로 모든 사용자를 사용자 테이블을 쿼리 반경 내에있는 모든 우편 번호의 우편 번호 테이블을 쿼리해야합니까? 또는 ... ??? 나는이 시점에서 어떤 제안에 열려입니다!

감사!

해결법

  1. ==============================

    1.여기 내가 찾은 가장 좋은 방법입니다. 물론 그것은 당신이 데이터베이스에 된 우편 번호 위도 / 경도 인코딩을 모두 가지고 필요합니다.

    여기 내가 찾은 가장 좋은 방법입니다. 물론 그것은 당신이 데이터베이스에 된 우편 번호 위도 / 경도 인코딩을 모두 가지고 필요합니다.

    // get all the zipcodes within the specified radius - default 20
    function zipcodeRadius($lat, $lon, $radius)
    {
        $radius = $radius ? $radius : 20;
        $sql = 'SELECT distinct(ZipCode) FROM zipcode  WHERE (3958*3.1415926*sqrt((Latitude-'.$lat.')*(Latitude-'.$lat.') + cos(Latitude/57.29578)*cos('.$lat.'/57.29578)*(Longitude-'.$lon.')*(Longitude-'.$lon.'))/180) <= '.$radius.';';
        $result = $this->db->query($sql);
        // get each result
        $zipcodeList = array();
        while($row = $this->db->fetch_array($result))
        {
            array_push($zipcodeList, $row['ZipCode']);
        }
        return $zipcodeList;
    }
    

    당신은이 기능에 드롭 할 수 있어야한다. $ 위도를 통과하고, 대한 반경을 원하는 우편 번호의 $ 경도는 옵션 반경을 포함, 다시 된 우편 번호의 목록을 얻을.

    당신은 아주 쉽게 곳 우편 번호 IN (radius_sql) 및 얻을 목록의 사용자가 다시 모든 사용자를 얻기 위해 이것을 수정할 수 있습니다.

    코딩 해피!

  2. ==============================

    2.http://www.micahcarrick.com/04-19-2005/php-zip-code-range-and-distance-calculation.html

    http://www.micahcarrick.com/04-19-2005/php-zip-code-range-and-distance-calculation.html

    나는이 매우 멋진을 발견했다.

    "그 결과 모든 사용자 (ZIP 코드) 사용자 테이블을 쿼리 반경 내에있는 모든 우편 번호의 우편 번호 테이블을 쿼리"

    나는 이것이 당신이 구글 맵에 사용자를 넣을 필요가없는 그것을 할 수있는 가장 좋은 방법입니다 발견했다. 당신은 단지 주행 거리에있는 사용자를 나열하는 경우 그 다음 그 된 우편 번호의 모든 사용자를 선택 참아의 목록 (클래스를 사용하여) 데이터베이스를 쿼리 꽤 쉽게해야합니다 다양합니다.

    Select * from Users where zip_code IN (19125,19081,19107.........);
    

    그게해야한다.

  3. ==============================

    3.내가 먼저 대상의 반경에있는 모든 된 우편 번호에 대한 검색을 할 것입니다. 그런 다음 사용자 테이블 된 우편 번호로 모든 반환 된 우편 번호를 비교합니다. 일치하는 사용자를 잡아 당깁니다.

    내가 먼저 대상의 반경에있는 모든 된 우편 번호에 대한 검색을 할 것입니다. 그런 다음 사용자 테이블 된 우편 번호로 모든 반환 된 우편 번호를 비교합니다. 일치하는 사용자를 잡아 당깁니다.

    그것은 반경에 된 우편 번호를 찾을 수 있습니다,이 MySQL의 호출을 발견 :

    $query = 'SELECT zzip FROM ' . table . 
                ' WHERE (POW((69.1*(zlongitude-"' . 
                $long . '")*cos(' . $long . 
                '/57.3)),"2")+POW((69.1*(zlatitude-"' . 
                $lat . '")),"2"))<(' . $radius . 
                '*' . $radius . ')';
    

    MySQL은 당신을 위해 모든 계산을 수행합니다.

    내가 여기를 사용하는 클래스를 발견 : http://www.nucleusdevelopment.com/code/do/zipcode

    희망이 도움이.

  4. ==============================

    4.여기에서 시작하지만,이 솔루션은 매우 빠르지 있습니다 :

    여기에서 시작하지만,이 솔루션은 매우 빠르지 있습니다 :

    PHP의 우편 번호 범위 및 거리 계산

    이제 빨리 만들려면 - 우리가 공간 인덱스를 사용하는 조회를 교체하려고 :)

  5. ==============================

    5.아웃 근접 검색 여기에 기능을 확인하십시오 :

    아웃 근접 검색 여기에 기능을 확인하십시오 :

    Google지도에 PHP / MySQL을 사용

    데이터가 (즉,이 호출 무엇이든) 같은 표기 / 투사 / 형식 인 경우, 그것은 당신을 위해 작동 할 수 있습니다.

  6. ==============================

    6.나는 두 번째 단계로 반경에 대한 걱정 후, 첫 번째 사각형 경계와 후보자의 수를 감소 생각 하는데요. 그런 다음 / 이하 기준보다 단순한 이상을 사용하여 해당 상자에서 긴 / 위도 4 개 방향으로 50 마일, 다음 선택한 경우에만 후보를 계산의 우편 번호의 좌표로 시작. 사용자 기반이 잘 퍼져 경우이 당신 만 "코너"를 제거하기 위해 벡터 거리 계산을해야 할, 상당히 후보 세트를 줄일 수 있습니다.

    나는 두 번째 단계로 반경에 대한 걱정 후, 첫 번째 사각형 경계와 후보자의 수를 감소 생각 하는데요. 그런 다음 / 이하 기준보다 단순한 이상을 사용하여 해당 상자에서 긴 / 위도 4 개 방향으로 50 마일, 다음 선택한 경우에만 후보를 계산의 우편 번호의 좌표로 시작. 사용자 기반이 잘 퍼져 경우이 당신 만 "코너"를 제거하기 위해 벡터 거리 계산을해야 할, 상당히 후보 세트를 줄일 수 있습니다.

  7. ==============================

    7.위도 / 경도 각 우편 번호에 대한 권리, 그 우편에 대한 지리적 중심습니까? 당신이 처음 50 마일 이내 지역 센터와 우편 코드를 찾을 그렇다면, 그 우편 번호의 사용자는 쉽게 50 마일 떨어진 이상의 사용자를 반환 할 수 있습니다. 당신은 그런 식으로 일을 몇 가지 정확성을 희생 것 그래서.

    위도 / 경도 각 우편 번호에 대한 권리, 그 우편에 대한 지리적 중심습니까? 당신이 처음 50 마일 이내 지역 센터와 우편 코드를 찾을 그렇다면, 그 우편 번호의 사용자는 쉽게 50 마일 떨어진 이상의 사용자를 반환 할 수 있습니다. 당신은 그런 식으로 일을 몇 가지 정확성을 희생 것 그래서.

    당신이 (더 우편 코드의 수보다) 많은 사용자가있는 경우 먼저 작은 우편 번호 테이블에 대해 쿼리 것 때문에 그러나, 이것은 빠른 것입니다. 그리고 당신은 인덱스 너무 빨리 될 것 특정 우편 번호와 사용자를 찾는 사용자 테이블에 코드를 압축 할 수있다.

    그냥 몇 가지 생각! 당신은 많은 사용자 50 마일 반경을 기대한다면, 나는 다음 50 마일 이내에 그 우편 번호 내에서 사용자를 우편 코드를 찾을 것, 정확하게 할 필요가 없습니다.

  8. from https://stackoverflow.com/questions/2410529/php-mysql-zip-code-proximity-search by cc-by-sa and MIT license