zoukankan      html  css  js  c++  java
  • 查找附近的坐标

    圆形内的坐标(圆心与半径组成的圆形范围,返回距圆心距离)

    $juli = getDistance($loc1[1], $loc1[0], $loc2[1], $loc2[0]);
    $pipeline[] = ['$geoNear' => [
        'near'=>$loc1, // 当前坐标
        'spherical'=>true, // 计算球面距离
        'distanceMultiplier'=>6378137, // 地球半径,单位是米,那么的除的记录也是米
        'maxDistance'=>($juli+1)/6378137, // 过滤条件200000米内,需要弧度
        'distanceField'=>'distance'
    ]];
    $pipeline[] = ['$project' => ['_id' => 1, 'uid' => 1, 'loc' => 1, 'state' => 1, 'close' => 1, 'hezuo_type' => 1, 'distance' => 1]];
    $pipeline[] = ['$match' => ['state' => ['$in' => [1, -2, 0]]]];
    $pipeline[] = ['$limit' => 3];
    
    $result = $db->aggregate(COLLECTION_USERCOMPANY_SET, $pipeline);
    echo json_encode($result);
    View Code

    圆形内的坐标(圆心与半径组成的圆形范围,不返回距圆)

    $loc1 = [112.53362699029492, 33.01046814237027]; // 我的位置
    $loc2 = [112.53385881284048,33.001754496370701]; // 最远的位置
    $maxDistance = sqrt(pow($loc2[0] -$loc1[0], 2) + pow($loc2[1] -$loc1[1], 2));
    echo $maxDistance;
    $filter_store['loc'] = ['$near' => $loc1, '$maxDistance' => $maxDistance];
    $projection = ['_id' => 1, 'uid' => 1, 'loc' => 1, 'state' => 1, 'close' => 1, 'hezuo_type' => 1];
    $result = $db->find(COLLECTION_USERCOMPANY_SET, $filter_store, [], $projection);
    echo json_encode($result);
    View Code

    计算距离

    function getDistance($lat1, $lng1, $lat2, $lng2)
    {
        // define('PI',3.1415926535898);
        $pi = 3.1415926535898;
        //define('EARTH_RADIUS',6378.137);
        $earth = 6378.137;
        $radLat1 = $lat1 * ($pi / 180);
        $radLat2 = $lat2 * ($pi / 180);
    
        $a = $radLat1 - $radLat2;
        $b = ($lng1 * ($pi / 180)) - ($lng2 * ($pi / 180));
    
        $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
        $s = $s * $earth;
        $s = round($s * 10000) / 10000;
        return $s * 1000;
    }
    View Code

     矩形平面内的坐标(左下角位置与右上角位置组成的矩形范围)

    $filter['loc'] = ['$within' => ['$box' => [$lb_loc, $rt_loc]]];
    $filter['$or'] = [['state' => 1], ['state' => -2]]; // 正常营业与停业中
    if (trim($data['search']) !== "") {
        $filter["company_name"] = array('$regex' => $data["search"]);
    }
    $projection = ['_id' => 1, 'uid' => 1, 'company_name' => 1, 'company_logo' => 1, 'loc' => 1, 'company_address' => 1,
        'ctype' => 1, 'top_id' => 1, 'state' => 1, 'close' => 1, 'hezuo_type' => 1];
    $results = $db->queryPage(COLLECTION_USERCOMPANY_SET, $filter, array("_id" => -1), $data["page"], $data["pagenum"], $projection);
    View Code

    备注:

    1、https://github.com/mongodb/mongo-php-driver

    2、创建2d索引

    $db->createIndex(COLLECTION_USERCOMPANY_SET, ['loc' => '2d'], ['min' => -180 , 'max' => 180, 'bits' => 26 ]);

     3、参考:https://blog.csdn.net/zxjiayou1314/article/details/50844489

    4、$filter_store['loc'] = ['$within' => ['$box' => [$lb_loc, $rt_loc]]];在旋转地图的情况下,返回的结果不准确。

  • 相关阅读:
    IoC在ASP.NET Web API中的应用
    Web API 异常处理
    WEB API Filter的使用以及执行顺序
    WebAPI2使用Autofac实现IOC属性注入完美解决方案
    Web API 源码剖析之默认配置(HttpConfiguration)
    Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
    Web API源码剖析之HttpServer
    Web API 源码剖析之全局配置
    初步认识AutoMapper
    Linux中ctrl+z 、ctrl+c、 ctrl+d差别
  • 原文地址:https://www.cnblogs.com/shixm/p/10148292.html
Copyright © 2011-2022 走看看