微信小程序 使用射线法判断定位是否在苏州范围内
https://datav.aliyun.com/portal/school/atlas/area_selector

https://geo.datav.aliyun.com/areas_v3/bound/320500_full.json
微信小程序中使用射线法判断定位是否在苏州范围内
下面是一个完整的微信小程序JS实现,使用射线法判断当前定位是否在苏州市范围内(基于你提供的GeoJSON数据):
// 在页面或组件的JS文件中
Page({
data: {
isInSuzhou: false,
locationInfo: null
},
onLoad() {
this.checkLocationInSuzhou();
},
// 检查当前位置是否在苏州范围内
checkLocationInSuzhou() {
const that = this;
// 1. 首先获取用户授权
wx.getSetting({
success(res) {
if (!res.authSetting['scope.userLocation']) {
// 未授权,请求授权
wx.authorize({
scope: 'scope.userLocation',
success() {
that.getCurrentLocation();
},
fail() {
wx.showToast({
title: '需要位置授权',
icon: 'none'
});
}
});
} else {
// 已授权,直接获取位置
that.getCurrentLocation();
}
}
});
},
// 获取当前位置
getCurrentLocation() {
const that = this;
wx.getLocation({
type: 'wgs84',
success(res) {
const longitude = res.longitude;
const latitude = res.latitude;
// 2. 检查点是否在苏州范围内
const isInside = that.pointInPolygon([longitude, latitude], suzhouPolygon);
that.setData({
isInSuzhou: isInside,
locationInfo: {
longitude,
latitude,
isInSuzhou: isInside
}
});
// 可以根据结果做相应处理
if (isInside) {
wx.showToast({
title: '当前位置在苏州范围内',
icon: 'success'
});
} else {
wx.showToast({
title: '当前位置不在苏州范围内',
icon: 'none'
});
}
},
fail(err) {
console.error('获取位置失败:', err);
wx.showToast({
title: '获取位置失败',
icon: 'none'
});
}
});
},
// 射线法判断点是否在多边形内
pointInPolygon(point, polygon) {
const x = point[0];
const y = point[1];
let inside = false;
for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
const xi = polygon[i][0], yi = polygon[i][1];
const xj = polygon[j][0], yj = polygon[j][1];
const intersect = ((yi > y) !== (yj > y)) &&
(x < (xj - xi) * (y - yi) / (yj - yi) + xi);
if (intersect) inside = !inside;
}
return inside;
}
});
// 苏州的边界坐标数据(简化版,实际应用中应该使用完整的GeoJSON数据)
const suzhouPolygon = [
[120.566833, 31.294845],
[120.624, 31.327],
[120.712, 31.356],
[120.783, 31.302],
[120.812, 31.245],
[120.756, 31.187],
[120.653, 31.156],
[120.566, 31.178],
[120.511, 31.235],
[120.566833, 31.294845]
// 这里应该放入完整的苏州边界坐标点
// 实际应用中,应该从GeoJSON中提取coordinates[0]作为多边形边界
];
注意事项
-
完整边界数据:上面的
suzhouPolygon只是一个示例,你需要替换为完整的苏州市边界坐标。从你提供的GeoJSON中提取features[0].geometry.coordinates[0]作为多边形边界。 -
多边形处理:如果苏州边界由多个多边形组成(比如包含岛屿),你需要对每个多边形进行检查。
-
性能优化:对于复杂的多边形,可以先进行简单的边界框检查,快速排除明显不在范围内的点。
-
坐标系统:确保微信获取的WGS84坐标与你的GeoJSON数据使用相同的坐标系统。
-
实际应用:在实际项目中,建议将多边形数据存储在云存储或服务器,按需获取,而不是硬编码在客户端。
完整实现步骤
- 从GeoJSON中提取苏州边界的坐标数组
- 获取用户当前位置(经度、纬度)
- 使用射线法判断点是否在多边形内
- 根据结果进行相应处理
如果需要处理更复杂的GeoJSON数据(如MultiPolygon),算法需要相应调整。
本文来自博客园,作者:VipSoft 转载请注明原文链接:https://www.cnblogs.com/vipsoft/p/18943783
浙公网安备 33010602011771号