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