我有一张地图上有地方。这些地方的坐标在MySQL中保存为纬度/经度字符串(" 3456,789")。我正在尝试编写一个函数,它会给我一个以坐标为中心点的正方形形状的所有坐标数组。然后我将点击数据库以查看是否有任何其他地方在此数组中有坐标。
我可以定义正方形的角点,并且可以编写一个笨重的函数,用一个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"
答案 0 :(得分:1)
您似乎需要选择范围内的所有数据库点。
没有表数据就不可能为你编写一个完整的SQL查询,但是我有一个小提琴并为你生成了以下内容,它应该将字符串转换为浮点值,然后你可以比较它们。如果所有字符串都是相同的格式,它应该工作,否则你可以使用instr()来选择逗号的位置。
SELECT CAST( CONCAT_WS('.', LEFT( '1234,567', 4 ), RIGHT( '1234,567', 3 ) ) AS BINARY )
有了这个,你可以尝试在php中计算你期望的最小和最大纬度和长度,然后将它们插入到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()。