Teknologian jakaminen

tp laskee etäisyyden ja suodattaa yritykset 0-10 kilometrin etäisyydeltä

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

$field_lat = 'lat';// 数据库字段名 - 纬度  -90°到90°
$field_lng = 'lng';// 数据库字段名 - 经度  -180°到180°
$lat       = $params['lat'];// 数据库字段名 - 纬度  -90°到90°
$lng       = $params['lng'];// 数据库字段名 - 经度  -180°到180°

//lausunto

$field           = "(6378.138 * 2 * asin(sqrt(pow(sin(({$field_lng} * pi() / 180 - {$lng} * pi() / 180) / 2),2) + cos({$field_lng} * pi() / 180) * cos({$lng} * pi() / 180) * pow(sin(({$field_lat} * pi() / 180 - {$lat} * pi() / 180) / 2),2))) * 1000)";

Tiedustella:

  1. //距离筛选0-10km
  2. if ($params['distance']) {
  3. //0-10 数字
  4. $distance = $this->getParams($params['distance'], '-');
  5. $min_distance = $distance[0] * 100;//初始km
  6. $max_distance = $distance[1] * 100;//结束km
  7. //查询数据
  8. $result = $ShopModel
  9. ->where($where)
  10. ->field("*")
  11. ->field("{$field} as distance")
  12. ->where("{$field} BETWEEN {$min_distance} AND {$max_distance}")
  13. ->order('distance asc,id desc')
  14. ->paginate(["list_rows" => $params["page_size"] ?? $this->PageSize, "query" => $params])
  15. ->each(function ($item, $key) use ($params) {
  16. //处理公共数据
  17. if ($item['distance']) $item['distance_km'] = round($item['distance'] / 100, 2) . 'km';
  18. return $item;
  19. });
  20. } else {
  21. //算出距离,排序
  22. $result = $ShopModel
  23. ->where($where)
  24. ->field("*")
  25. ->field("{$field} as distance")
  26. ->order('distance asc,id desc')
  27. ->paginate(["list_rows" => $params["page_size"] ?? $this->PageSize, "query" => $params])
  28. ->each(function ($item, $key) use ($params) {
  29. //处理公共数据
  30. if ($item['distance']) $item['distance_km'] = round($item['distance'] / 100, 2) . 'km';
  31. return $item;
  32. });
  33. }