with('markets')->whereIn('id',$cityIds)->get(); foreach ($res as &$v){ foreach ($v->markets as &$m) { $m->Distance = $this->getDistance($m->lng,$m->lat,108.370333,22.813527); } } return $res; } public function searchMarket($keywords,$cityId = 2163) { $res = Market::query()->where([ ['name','like','%'.$keywords.'%'], ['city_id','=',$cityId] ]) ->get(); foreach ($res as &$v){ $v->Distance = $this->getDistance($v->lng,$v->lat,108.370333,22.813527); } return $res; } public function getDistance($lng1, $lat1, $lng2, $lat2, $unit = 2, $decimal = 2) { $EARTH_RADIUS = 6370.996; // 地球半径系数 $PI = 3.1415926535898; $radLat1 = $lat1 * $PI / 180.0; $radLat2 = $lat2 * $PI / 180.0; $radLng1 = $lng1 * $PI / 180.0; $radLng2 = $lng2 * $PI / 180.0; $a = $radLat1 - $radLat2; $b = $radLng1 - $radLng2; $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))); $distance = $distance * $EARTH_RADIUS * 1000; if ($unit === 2) { $distance /= 1000; } return round($distance, $decimal); } //获取服务站信息 function getMarketsInfo() { return Market::where('status',1)->get(); } //获取骑行距离 public function getDistanceByTencent($lng1, $lat1, $lng2, $lat2) { $url = 'https://apis.map.qq.com/ws/direction/v1/'; /** * $tyep driving 驾车 walking 步行 bicycling 骑行 transit 公交 */ $type = 'bicycling'; $key = 'GB3BZ-7W2CU-LW3VH-B7ZIF-XRKSF-D3FOL'; $result = file_get_contents($url.$type.'/?from='.$lat1.','.$lng1.'&to='.$lat2.','.$lng2.'&output=json&key='.$key); $resultArr = json_decode($result,true); if($resultArr['status'] > 0) { throw new ErrorCodeException(ErrorCode::LOCATION_ERROR,$resultArr['message']); } $distance = $resultArr['result']['routes'][0]['distance']; return $distance; } }