查找附近的邮政编码myquery优化

时间:2015-06-16 11:42:02

标签: php mysql google-maps

我需要在google地图中找到附近的点邮编, 我正在使用SQL - Haversine公式。 以下是我的查询

 $query = $this->db->query("SELECT Postcode,latitude,longtitude, ACOS(COS(RADIANS(latitude)) *
    COS(RADIANS(longtitude)) * COS(RADIANS($latitude)) * COS(RADIANS($longtitude)) +
    COS(RADIANS(latitude)) * SIN(RADIANS(longtitude)) * COS(RADIANS($latitude)) * 
    SIN(RADIANS($longtitude)) + SIN(RADIANS(latitude)) * SIN(RADIANS($latitude))) * 
    3963.1 AS Distance
    FROM postalscheme   
    HAVING Distance <= 4  "); 

使用此查询正确获取数据,但我的问题是需要很长时间才能获取数据[获取2万到6万个数据需要3到5分钟]。

请帮我优化此查询并快速工作。

1 个答案:

答案 0 :(得分:0)

当您将纬度/经度值限制为附近的值时,您可以限制计算距离所需的数据范围。 (来自these slides (page 12ff)的公式 当你按里程计算时,这是有效的...否则你必须调整&#34; 69&#34;具有正确的千米价值。

1° of latitude ~= 69 miles 
1° of longitude ~= cos(latitude)*69

如果要计算较小矩形的经度和纬度,可以使用(使用上面的变量):

$dist = 4; // the distance from your query above
$lon1 = $longtitude - $dist / abs(cos(deg2rad($latitude))*69);
$lon2 = $longtitude + $dist / abs(cos(deg2rad($latitude))*69);
$lat1 = $latitude - ($dist / 69);
$lat2 = $latitude + ($dist / 69);

然后你修改你的查询:

$query = $this->db->query("SELECT Postcode,latitude,longtitude, ACOS(COS(RADIANS(latitude)) *
    COS(RADIANS(longtitude)) * COS(RADIANS($latitude)) * COS(RADIANS($longtitude)) +
    COS(RADIANS(latitude)) * SIN(RADIANS(longtitude)) * COS(RADIANS($latitude)) * 
    SIN(RADIANS($longtitude)) + SIN(RADIANS(latitude)) * SIN(RADIANS($latitude))) * 
    3963.1 AS Distance
    FROM postalscheme   
    WHERE longitude BETWEEN $lon1 AND $lon2 
    AND latitude BETWEEN $lat1 AND $lat2
    HAVING Distance <= $dist  ");

这可以大大提高整体速度。