php算法,将所有坐标从2D正方形中收集到阵列中


php algorithm that collects all coordinates into array from within 2D square

我有一张地图,上面有位置。这些位置的坐标以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'

我意识到这不是你在这个问题上的想法,但对我来说,这似乎是一条路。

编辑:

使用instr()通过调用:来处理lat和long的可变精度

 CAST( CONCAT_WS('.', LEFT( lat, INSTR(lat,',')-1),SUBSTRING( lat, INSTR(lat,',')+1 ) ) AS BINARY )

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