Php 如何定义lat/lng位置周围的径向搜索区域?

Php 如何定义lat/lng位置周围的径向搜索区域?,php,mysql,google-maps,google-maps-api-3,Php,Mysql,Google Maps,Google Maps Api 3,我正在做一个项目,每个用户都有自己的坐标lat/lng,从谷歌地理编码器服务中提取 现在我想实现一个搜索功能->你可以输入半径(公里),如果有人在半径内,配置文件将弹出 当搜索区域实际上是一个正方形时,让它工作并不困难,但是我如何让它工作,用一个圆作为搜索区域 下面是构建mysql查询“搜索”部分的代码: // This is the location of the user who submitted the search function. mysql_select_db("$db_prof

我正在做一个项目,每个用户都有自己的坐标lat/lng,从谷歌地理编码器服务中提取

现在我想实现一个搜索功能->你可以输入半径(公里),如果有人在半径内,配置文件将弹出

当搜索区域实际上是一个正方形时,让它工作并不困难,但是我如何让它工作,用一个圆作为搜索区域

下面是构建mysql查询“搜索”部分的代码:

// This is the location of the user who submitted the search function.
mysql_select_db("$db_profile");
$sql = "SELECT location_lat,
            location_lng
    FROM location
    WHERE id = '$global_id'";
$sql = mysql_query($sql);   
$row = mysql_fetch_array($sql);

// The coordinates of the user.
$lat = $row['location_lat'];
$lng = $row['location_lng'];

// the entered radius in kilometers - here it is converted to degree (1° = 111km).
$x_degree = $global_search_radius_value / 111;

// define the search grid (it is a squere! but I want a circle!).
$lat_neg = $lat - $x_degree;
$lat_pos = $lat + $x_degree;

$lng_neg = $lng - $x_degree;
$lng_pos = $lng + $x_degree;

// build the search part of the mysql query
$heredoc_search_radius = <<<EOD
AND ($db_profile.location.location_lat > '$lat_neg' 
    AND $db_profile.location.location_lat < '$lat_pos'
    AND $db_profile.location.location_lng > '$lng_neg'
    AND $db_profile.location.location_lng < '$lng_pos')
EOD;
//这是提交搜索功能的用户的位置。
mysql_select_db($db_profile”);
$sql=“选择位置”,
液化天然气位置
从地点
其中id=“$global_id”;
$sql=mysql\u查询($sql);
$row=mysql\u fetch\u数组($sql);
//用户的坐标。
$lat=$row['location_lat'];
$lng=$row['location_lng'];
//输入的半径以公里为单位-此处将其转换为度(1°=111km)。
$x_degree=$global_search_radius_value/111;
//定义搜索网格(它是一个squere!但我想要一个圆!)。
$lat_neg=$lat-$x_度;
$lat_pos=$lat+x_度;
$lng_neg=$lng-$x_度;
$lng_pos=$lng+x_度;
//构建mysql查询的搜索部分

$herdoc_search_radius=要保持这一性能,最好的办法是将数据放入Apache Solr之类的系统中,这样您就可以执行开箱即用的地理空间搜索

Solr将确保您的查询速度惊人,无论您拥有多少数据点。

在mysql中,它看起来是这样的,如果ABS是必要的,理论上不应该这样

其中SQRT(功率(ABS($db_profile.location.location_lat-$lat),2)+POW(ABS($db_profile.location.location_lng-$lng),2))<$radius

如果您需要更快的搜索,请将计算的距离保留在其他表格中。但是,这将使用n^2行来存储