我需要在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分钟]。
请帮我优化此查询并快速工作。
答案 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 ");
这可以大大提高整体速度。