You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.5 KiB
62 lines
1.5 KiB
<?php
|
|
|
|
|
|
namespace App\Service\v3\Implementations;
|
|
use App\Service\v3\Interfaces\LocationServiceInterface;
|
|
use App\Model\v3\Area;
|
|
use App\Model\v3\Market;
|
|
class LocationService implements LocationServiceInterface
|
|
{
|
|
|
|
public function do()
|
|
{
|
|
// TODO: Implement do() method.
|
|
}
|
|
|
|
public function check()
|
|
{
|
|
// TODO: Implement check() method.
|
|
}
|
|
|
|
public function undo()
|
|
{
|
|
// TODO: Implement undo() method.
|
|
}
|
|
|
|
public function getMarketListByLocation($cityIds)
|
|
{
|
|
$res = Area::query()->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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|