微信小程序 使用射线法判断定位是否在苏州范围内
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号
浙公网安备 33010602011771号