Google Sheets中如何用4个GPS点划定区域筛选数据集内的点位?
Google Sheets 筛选指定GPS区域内的点位ID方案
一、公式方案(适合矩形区域,无需代码)
如果你的四个GPS点是矩形区域的对角点(比如D1、E1是西南角纬度/经度,F1、G1是东北角纬度/经度),可直接用FILTER函数实现,同时兼容经度跨180°的特殊情况:
在空白单元格(如H1)输入以下公式:
=FILTER(A1:A1000, B1:B1000 >= MIN(D1, F1), B1:B1000 <= MAX(D1, F1), IF(MAX(E1, G1) > MIN(E1, G1), AND(C1:C1000 >= MIN(E1, G1), C1:C1000 <= MAX(E1, G1)), OR(C1:C1000 >= MIN(E1, G1), C1:C1000 <= MAX(E1, G1)) ) )
公式说明:
- 纬度判断:自动取D1、F1中的最小/最大值,不管输入的是南北哪个端点,都能正确锁定纬度范围
- 经度判断:
- 若最大经度大于最小经度(常规非跨180°区域),筛选经度在两者之间的点
- 若最大经度小于最小经度(跨180°经线区域),筛选经度大于等于最小值或小于等于最大值的点
二、脚本方案(适合任意四边形区域)
如果需要用任意四个GPS点组成的不规则四边形筛选,可通过自定义函数实现:
步骤1:添加脚本
- 打开你的Google表格,点击顶部菜单栏「扩展程序」→「Apps脚本」
- 删除默认代码,粘贴以下代码:
function IN_POLYGON(pointLats, pointLons, polyLats, polyLons) { const isSingle = typeof pointLats !== 'object'; const lats = isSingle ? [pointLats] : pointLats.flat(); const lons = isSingle ? [pointLons] : pointLons.flat(); const poly = polyLats.map((lat, i) => [lat, polyLons[i]]); if (poly[0][0] !== poly[poly.length-1][0] || poly[0][1] !== poly[poly.length-1][1]) { poly.push(poly[0]); } const results = []; for (let i = 0; i < lats.length; i++) { const lat = lats[i]; const lon = lons[i]; let inside = false; for (let j = 0; j < poly.length - 1; j++) { const [lat1, lon1] = poly[j]; const [lat2, lon2] = poly[j+1]; if (isPointOnLine(lat, lon, lat1, lon1, lat2, lon2)) { inside = true; break; } const intersect = ((lat1 > lat) !== (lat2 > lat)) && (lon < (lon2 - lon1) * (lat - lat1) / (lat2 - lat1) + lon1); if (intersect) inside = !inside; } results.push(inside); } return isSingle ? results[0] : results; } function isPointOnLine(px, py, x1, y1, x2, y2) { if (Math.min(x1, x2) <= px && px <= Math.max(x1, x2) && Math.min(y1, y2) <= py && py <= Math.max(y1, y2)) { const cross = (px - x1) * (y2 - y1) - (py - y1) * (x2 - x1); return Math.abs(cross) < 1e-9; } return false; }
- 点击「保存」,给脚本命名(比如
GPSAreaFilter)
步骤2:使用自定义函数
- 将四个四边形顶点的纬度依次输入
D1、D2、D3、D4,经度依次输入E1、E2、E3、E4 - 在空白单元格(如H1)输入公式:
=FILTER(A1:A1000, IN_POLYGON(B1:B1000, C1:C1000, D1:D4, E1:E4))
- 按下回车后,即可自动筛选出所有在四边形区域内的点位ID
内容的提问来源于stack exchange,提问作者Nathanael Phillips
相关产品推荐
相关产品推荐

