PHP 电子围栏状态



    /**
     * 围栏状态
     * @desc (围栏状态)
     * @return array
     * @api (int ,data,园区围栏,)
     * @api (int ,lnt,当前经度,)
     * @api (int ,lat,当前车纬度,)
     * @api (int ,type,1,)
     * @returnApi (string,p_status,0:外;1:内,)
     */
    public function mqttStatus($data, $lat, $lnt, $type = 1)
    {
        $p_status = 0;
        $distance = new Distance();
        if ($type == 1) {
            //判断是否在 园区内
            $p_status = 0;//在园区内的停车范围外 :1;园区外:2;
            $i = 0;
            $mqtt = [];
            foreach ($data['content'][0]['path'] as $value) {
                $mqtt[] = [
                    'lng' => $value[0],
                    'lat' => $value[1]
                ];
            }
            $p_mqtt_status1 = $distance->isInsidePolygon(['lat' => $lat, 'lng' => $lnt], $mqtt);
            if ($p_mqtt_status1 == true) {
                //园区内
                $p_status = 0;
                return $p_status;
            } else {
                //园区外
                $p_status = 2;
                return $p_status;
            }
        } else if ($type == 2) {
            //在园区内
            $array_stop = array_column($data['content'], 'path');
            $stop_data_er = [];
            foreach ($array_stop as $stop) {
                $stop_data = [];
                $j = 0;
                foreach ($stop as $stop_value) {
                    $stop_data[] = [
                        'lng' => $stop_value[0],
                        'lat' => $stop_value[1]
                    ];
                }
                $stop_data_er[] = $stop_data;
                $p_mqtt_status2 = $distance->isInsidePolygon(['lat' => $lat, 'lng' => $lnt], $stop_data);
                if ($p_mqtt_status2 == false) {
                    //园内 停车区外
                    $p_status = 1;
                    break;
                    return $p_status;
                }
            }
        }

        return $p_status;
    }


    /**
     * 判断是否电子围栏内
     * @param array $point 当前经纬度[]
     * @param array $polygon 围栏所有经纬度[]
     * @return bool
     */
    public static function isInsidePolygon($point, $polygon)
    {
        $n = count($polygon);
        $inside = false;
        for ($i = 0, $j = $n - 1; $i < $n; $j = $i++) {
            if (((($polygon[$i]['lat'] <= $point['lat']) && ($point['lat'] < $polygon[$j]['lat'])) ||
                    (($polygon[$j]['lat'] <= $point['lat']) && ($point['lat'] < $polygon[$i]['lat']))) &&
                ($point['lng'] < ($polygon[$j]['lng'] - $polygon[$i]['lng']) * ($point['lat'] - $polygon[$i]['lat']) / ($polygon[$j]['lat'] - $polygon[$i]['lat']) + $polygon[$i]['lng'])) {
                $inside = !$inside;
            }
        }
        return $inside;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值