php 限制奖励下发区域

最近在开发微信公众号的小项目时候,遇到了一个需求。就是下发奖励时候要限制业务区域,比如说我是在北京搞业务,那么我的一些用户必须定位在北京,达到奖励下发条件的时候才能下发奖励,业务区域之外的不能下发奖励,这样才能得到本业务区域中的精准流量。


思路分析

一想到地图的业务,第一反应是需要对接高德地图的经纬度解析的接口。大体思路是,公众号中通过jssdk授权获取用户的经纬度信息。将经纬度信息存储到用户个人信息中。当用户需要下发奖励时候,通过用户个人信息的经纬度,请求高德地图的经纬度转换,获取到的具体省份信息进行业务判断即可。但是就这么一个小项目,还得对接高德,申请key创建应用啥的。作为开发者肯定是不愿自己去倒腾的,所以对客户那边肯定是直接说,地图业务太复杂,搞不了这个。(不愿搞就是搞不了)

但是老板那边给予压力,说这是客户的最基本要求,必须搞。(不搞就扣你工资)

无奈必须得整的需求,那就想想简单的实现方法。在地图上圈出一组经纬度的区域,然后用一个坐标通过计算,判断当前坐标是否在区域内即可。就完美避开了对接高德的这个问题。

实现方法

  1. 公众号通过jsskd下发经纬度
javascript 复制代码
jssdk_config(window.location.href)
.then(res=>{
	let _this = this
	jWeixin.error((err) => {console.error(err);});
	jWeixin.config(res.data);
	jWeixin.ready(function(){
		wx.getLocation({
			type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
			success: function (res1) {
			var latitude = res1.latitude; // 纬度,浮点数,范围为90 ~ -90
			var longitude = res1.longitude; // 经度,浮点数,范围为180 ~ -180。
			var speed = res1.speed; // 速度,以米/每秒计
			var accuracy = res1.accuracy; // 位置精度
				//后续业务
			},
			fail:function(e){
				console.log('location_err',e)
				uni.showToast({
				icon:'none',
				title:'获取位置失败,请确定是否开启手机位置开关'
				})
			}
		});
	})
})

其中 jssdk_config方法是从服务端下发jsskd配置信息的接口,参数是当前页面的url。jWeixin是uniapp中模块化的jssdk。此时在公众号中就能获取用户的位置信息

  1. 在地图中圈出业务区域的坐标 在地图圈点中查找业务的坐标区域即可。
  1. 通过php的方法,计算当前坐标是否在上方的划定的区域中。
bash 复制代码
//使用射线法或点在多边形内部判断方法
function pointInPolygon($lng,$lat, $polygon) {
    $count = count($polygon);
    $inPolygon = false;

    for ($i = 0, $j = $count - 1; $i < $count; $j = $i++) {
        $polyLngI = $polygon[$i][0];
        $polyLatI = $polygon[$i][1]; 
        $polyLngJ = $polygon[$j][0];
        $polyLatJ = $polygon[$j][1];

        if (((($polyLngI <= $lng) && ($lng < $polyLngJ)) || (($polyLngJ <= $lng) && ($lng < $polyLngI))) && ($lat < ($polyLatJ - $polyLatI) * ($lng - $polyLngI) / ($polyLngJ - $polyLngI) + $polyLatI)) {
            $inPolygon = !$inPolygon;
        }
    }

    return $inPolygon;
}

这样就通过一个简单的方法,实现了区域的计算逻辑。

相关推荐
子兮曰2 小时前
把 649 种文件格式塞进一个网页里:一个「文件不出浏览器」的预览器
前端·javascript·后端
全栈弄潮儿5 小时前
Python实战第2期: 变量与数据类型
后端·python·agent
码事漫谈5 小时前
五道题,测测你有没有真的入门 AI
后端
蜗牛互联网6 小时前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端
大侠归来7 小时前
Spring Boot 2.1 → 3.5 迁移推演:从实战出发的完整路线图
java·spring boot·后端
海马8 小时前
Spring Boot 开发知识整理
java·spring boot·后端
谢亮_vipxieliang8 小时前
Spring Boot 3.x 从零开始——环境搭建与第一个 REST 项目
java·spring boot·后端
念何架构之路8 小时前
go-grpc核心抽象接口
开发语言·后端·golang
FYKJ_20108 小时前
django个性化新闻推荐35173-计算机课程设计、毕业设计
java·spring boot·后端·python·架构·django·课程设计