php算法,该算法从二维正方形中收集所有坐标到数组中

php算法,该算法从二维正方形中收集所有坐标到数组中,php,mapping,coordinates,Php,Mapping,Coordinates,我有一张上面有地方的地图。这些位置的坐标以lat/lon字符串(“3456789”)的形式保存在MySQL中。我正试图写一个函数,它将给我一个正方形形状的所有坐标的数组,以我的坐标为中心点。然后我将点击数据库,看看是否有其他地方在这个数组中有坐标 我可以定义正方形的角点,也可以编写一个笨拙的函数,用for循环或类似的东西一个接一个地用所有坐标填充数组,但我想知道是否有一个聪明的算法可以为我解决这个问题。具有预期输出的以下示例: function getNearbyPlaces($distance

我有一张上面有地方的地图。这些位置的坐标以lat/lon字符串(“3456789”)的形式保存在MySQL中。我正试图写一个函数,它将给我一个正方形形状的所有坐标的数组,以我的坐标为中心点。然后我将点击数据库,看看是否有其他地方在这个数组中有坐标

我可以定义正方形的角点,也可以编写一个笨拙的函数,用for循环或类似的东西一个接一个地用所有坐标填充数组,但我想知道是否有一个聪明的算法可以为我解决这个问题。具有预期输出的以下示例:

function getNearbyPlaces($distance = 4){
   $radius = $distance / 2;
   $coords = explode(",",$object->metadata["Coordinates"]["value"]); // array("3456","789")
   $topLeft = array($coords[0] - $radius,$coords[1] - $radius);
   $topRight = array($coords[0] + $radius,$coords[1] - $radius);
   $botLeft = array($coords[0] - $radius,$coords[1] + $radius);
   $topRight = array($coords[0] + $radius,$coords[1] + $radius);

   // calculate all coords within square here

   // Expected output
   // array("3454,787","3455,787","3456,787","3457,787","3458,787","3454,788","3455,788","3456,788","3457,788","3458,788","3454,789","3455,789","3456,789","3457,789","3458,789","3454,790","3455,790","3456,790","3457,790","3458,790","3454,791","3455,791","3456,791","3457,791","3458,791");
}
有人知道这样做的简单方法吗

为了尽早回答一些潜在的问题,坐标必须作为lat/lon字符串存储在数据库中,目前没有办法解决这个问题。这与谷歌地图无关

非常感谢

编辑 为方便起见,添加了基本SQL查询:

"SELECT * FROM ".$database_table_prefix."user_objects_metadata WHERE..."
// the coordinates are saved in column "value"

似乎您需要的是选择范围内的所有数据库点

如果没有表数据,就不可能为您编写完整的SQL查询,但是我有一个小技巧,为您生成了以下内容,它应该将字符串转换为浮点数,然后您可以进行比较。如果所有字符串的格式都相同,那么它应该可以工作,否则可以使用instr()选择逗号的位置

SELECT CAST( CONCAT_WS('.', LEFT( '1234,567', 4 ), RIGHT( '1234,567', 3 ) ) AS BINARY ) 
有了它,您可以尝试在php中计算预期的最小值和最大值lat和long,然后将它们插入vis:

SELECT lat,long FROM locations WHERE
CAST( CONCAT_WS('.', LEFT( lat, 4 ), RIGHT( lat, 3 ) ) AS BINARY ) >= '$minlat' AND
CAST( CONCAT_WS('.', LEFT( lat, 4 ), RIGHT( lat, 3 ) ) AS BINARY ) <= '$maxlat' AND
CAST( CONCAT_WS('.', LEFT( long, 4 ), RIGHT( long, 3 ) ) AS BINARY ) >= '$minlong' AND
CAST( CONCAT_WS('.', LEFT( long, 4 ), RIGHT( long, 3 ) ) AS BINARY ) <= '$maxlong'

您确实需要使用SUBSTRING()方法,而不是RIGHT()。

嗨,罗伯特,谢谢您的建议。是的,我正在寻找范围内的任何数据库点。我可以理解您的SQL查询是如何工作的,我当然可以通过一个特殊的调用来实现这一点。唯一的障碍是coords格式可能并不总是(4,3)。我不使用小数,但它可以是(3,3),(3,4),(4,4),所以我对您提到的使用instr()感兴趣。我已经用一个适合的SQL查询更新了我的问题。@Allerion-您请求的更改已添加到答案中。我已经用5,3和7,6格式测试过了,它应该可以用任何格式。玩得高兴这将是很酷的使用一些向量数学,使您的半径圆形…感谢更新我已经尝试过它和一些事情,但似乎没有得到任何东西,即使它应该。我使用的代码如下:“value”是我必须搜索的列名。我正在通过mysqli绑定参数。
$stmt=$mysqli->prepare(“从“$db_table_prefix”中选择*。”用户对象_元数据,其中类型_id=?和强制转换(CONCAT_WS('.',,左(值,INSTR(值,',')-1),子字符串(值,INSTR(值,',')+1))作为二进制)>=?和强制转换(CONCAT_WS('.',,左(值,INSTR(值,','))-1),子字符串(值,INSTR值,',')+1))作为二进制)=?并将(CONCAT_WS('.',LEFT(值,INSTR(值,',')-1),子字符串(值,INSTR(值,',')+1))转换为二进制)
 CAST( CONCAT_WS('.', LEFT( lat, INSTR(lat,',')-1),SUBSTRING( lat, INSTR(lat,',')+1 ) ) AS BINARY )