MySQL - 从数据库中查找半径范围内的点
MySQL - Find points within radius from database
我有一个 table,它有一个 POINT
列,其中包含各个位置的纬度和经度。
然后我还有一个来自浏览器中地理位置的用户位置。
我需要做的是找到 table 中 POINT
值在 10 公里半径(或 X 公里半径)内的所有记录,按距离排序从最近的开始。
我的 table 在 POINT
列上有一个 SPATIAL
索引。
可能对你有帮助,
https://ru.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL
对于 Django,我使用这个
dist = 20 #дистанция 20 км
mylon = 51.5289156201 # долгота центра
mylat = 46.0209384922 # широта
lon1 = mylon-dist/abs(math.cos(math.radians(mylat))*111.0) # 1 градус широты = 111 км
lon2 = mylon+dist/abs(math.cos(math.radians(mylat))*111.0)
lat1 = mylat-(dist/111.0)
lat2 = mylat+(dist/111.0)
profiles = UserProfile.objects.filter(lat__range=(lat1, lat2)).filter(lon__range=(lon1, lon2))
搜索20km范围内的所有用户。
我目前正在进行一个项目,我正在计算多个位置之间的距离。我正在使用以下查询来选择给定半径内的 object_id。
SELECT id,
( 6371 *
ACOS(
COS( RADIANS( db_latitude ) ) *
COS( RADIANS( $user_latitude ) ) *
COS( RADIANS( $user_longitude ) -
RADIANS( db_longitude ) ) +
SIN( RADIANS( db_latitude ) ) *
SIN( RADIANS( $user_latitude) )
)
)
AS distance FROM the_table HAVING distance <= $the_radius ORDER BY distance ASC"
我无法解释 ACOS 公式本身,因为我是从研究中得到的。
db_latitude = database latitude field
db_longitude = database longitude field
$user_latitude = browser latitude coördinate
$user_longitude = browser longitude coördinate
$the_radius = the radius that you want to search in
这是以公里为单位。
下面的查询实际上对我有用:
$query = "SELECT *,
( 6371 *
acos(
cos( radians( ".$user_lat." ) ) *
cos( radians( lat ) ) *
cos( radians( lng ) -
radians( ".$user_lng." ) ) +
sin( radians( ".$user_lat." ) ) *
sin( radians( lat ) ) ) )
AS distance FROM parkings
HAVING distance <= ".$radius." ORDER BY distance ASC";
$stmt = $conn->execute($query);
$rows = $stmt->fetchAll('assoc');
其中:
$user_lat 和 $user_lng 是浏览器的纬度和经度,
$半径 = 10,
table 名称是 parkings
我有一个 table,它有一个 POINT
列,其中包含各个位置的纬度和经度。
然后我还有一个来自浏览器中地理位置的用户位置。
我需要做的是找到 table 中 POINT
值在 10 公里半径(或 X 公里半径)内的所有记录,按距离排序从最近的开始。
我的 table 在 POINT
列上有一个 SPATIAL
索引。
可能对你有帮助, https://ru.scribd.com/presentation/2569355/Geo-Distance-Search-with-MySQL
对于 Django,我使用这个
dist = 20 #дистанция 20 км
mylon = 51.5289156201 # долгота центра
mylat = 46.0209384922 # широта
lon1 = mylon-dist/abs(math.cos(math.radians(mylat))*111.0) # 1 градус широты = 111 км
lon2 = mylon+dist/abs(math.cos(math.radians(mylat))*111.0)
lat1 = mylat-(dist/111.0)
lat2 = mylat+(dist/111.0)
profiles = UserProfile.objects.filter(lat__range=(lat1, lat2)).filter(lon__range=(lon1, lon2))
搜索20km范围内的所有用户。
我目前正在进行一个项目,我正在计算多个位置之间的距离。我正在使用以下查询来选择给定半径内的 object_id。
SELECT id,
( 6371 *
ACOS(
COS( RADIANS( db_latitude ) ) *
COS( RADIANS( $user_latitude ) ) *
COS( RADIANS( $user_longitude ) -
RADIANS( db_longitude ) ) +
SIN( RADIANS( db_latitude ) ) *
SIN( RADIANS( $user_latitude) )
)
)
AS distance FROM the_table HAVING distance <= $the_radius ORDER BY distance ASC"
我无法解释 ACOS 公式本身,因为我是从研究中得到的。
db_latitude = database latitude field
db_longitude = database longitude field
$user_latitude = browser latitude coördinate
$user_longitude = browser longitude coördinate
$the_radius = the radius that you want to search in
这是以公里为单位。
下面的查询实际上对我有用:
$query = "SELECT *,
( 6371 *
acos(
cos( radians( ".$user_lat." ) ) *
cos( radians( lat ) ) *
cos( radians( lng ) -
radians( ".$user_lng." ) ) +
sin( radians( ".$user_lat." ) ) *
sin( radians( lat ) ) ) )
AS distance FROM parkings
HAVING distance <= ".$radius." ORDER BY distance ASC";
$stmt = $conn->execute($query);
$rows = $stmt->fetchAll('assoc');
其中: $user_lat 和 $user_lng 是浏览器的纬度和经度, $半径 = 10, table 名称是 parkings