【问题标题】:Laravel, MySQL Spatial Point distance: orderBy and get distanceLaravel、MySQL 空间点距离:orderBy 和获取距离
【发布时间】:2017-01-19 19:07:13
【问题描述】:

谁能帮我正确查询这个问题。

我有一个 Concert 模型和另一个 Location 模型。音乐会属于一个位置。位置表有空间点字段。

我需要做三件事:

  • 按与用户位置的距离排序
  • 显示与用户位置的距离
  • 获取距用户位置一定距离的音乐会

到目前为止,我已经成功地设置了数据库并将音乐会与用户保持一定距离:

$condition = ($lat != null && $lon != null && $distance != null);
Concert::when($condition, function ($query) use ($distance,$lat,$lon) {
      return $query->whereHas('location', function($query) use ($distance,$lat,$lon) {
          $query->whereRaw('st_distance(location,POINT('.$lat.','.$lon.')) < '.$distance);
      });
  })
->get();

你能帮我在视图中显示这个st_distance吗?

如何按距离订购?

当我在文档中读到st_distance 以度为单位时,获得$distance 英里/公里的正确方法是什么?

【问题讨论】:

    标签: mysql laravel distance spatial


    【解决方案1】:

    您可以选择ST_DISTANCEST_DISTANCE_SPHERE (MySQL Spatial Convenience Functions) 然后:

    $raw = 'SELECT
      ST_X(location) AS longitude,
      ST_Y(location) AS latitude,
      ST_DISTANCE_SPHERE(location, POINT(?, ?)) AS dist
    FROM
      concerts,
      locations
    WHERE
      concerts.id = locations.id
    HAVING
      dist < ?
    ORDER BY
      dist';
    $pointsWithDist = DB::select($raw, [$lon, $lat, $distance]);
    

    注意事项:

    • 将经度存储为POINT 空间函数的第一个参数,将纬度存储为第二个参数
    • ST_DISTANCEST_DISTANCE_SPHERE 默认返回距离以为单位

    您可以使用谷歌地图显示数据

    【讨论】:

      猜你喜欢
      • 2022-01-06
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2015-09-03
      相关资源
      最近更新 更多