使用matplotlib Path.contains_points筛选4顶点多边形内地图坐标失效求助
解决Matplotlib Path.contains_points过滤地理坐标点失效的问题
我来帮你排查代码里的问题,同时给出可行的修复方案:
问题1:遍历列表时删除元素导致的索引错位
你当前直接在遍历atlas_data时删除元素,这会导致后续元素的索引偏移,enumerate的计数器n会跳过部分元素,最终有些边界外的点没被正确清理。比如删除第n个元素后,原本的n+1号元素会前移到n的位置,但循环会直接跳到n+1,导致这个元素完全没被检查。
修复方案:用列表推导式生成过滤后的新列表,这种方式既简洁又不会出现索引混乱:
filtered_data = [item for item in atlas_data if border_path.contains_points([(item[1], item[2])])] atlas_data = filtered_data # 替换原数据集
问题2:坐标顺序与Path坐标系不匹配
Matplotlib的Path基于笛卡尔坐标系(x轴横向、y轴纵向),而地理坐标的顺序(纬度/经度)很容易和这个坐标系搞混。你的border顶点和传入的点都是(lat, lon)格式,但多数地图场景下,应该把经度作为x轴、纬度作为y轴,也就是坐标顺序调整为(lon, lat),否则contains_points会判断错误。
你可以尝试调换坐标顺序:
# 调整border的坐标顺序为(lon, lat) border = [(149.108, -35.2825), (149.118, -35.2873), (149.118, -35.2714), (149.127, -35.2758)] border_path = Path(border, closed=True) # 过滤时也传入(lon, lat)格式的点 filtered_data = [item for item in atlas_data if border_path.contains_points([(item[2], item[1])])]
问题3:多边形顶点顺序错误导致内部区域判断异常
如果你的border顶点不是按顺时针或逆时针的连续顺序排列的,Path会无法正确识别多边形的内部区域。你可以通过可视化快速验证:
import matplotlib.pyplot as plt from matplotlib.path import Path from matplotlib.patches import PathPatch fig, ax = plt.subplots() patch = PathPatch(border_path, facecolor='lightblue', alpha=0.5) ax.add_patch(patch) # 绘制所有观测点 lats = [item[1] for item in atlas_data] lons = [item[2] for item in atlas_data] ax.scatter(lons, lats, color='red', s=10) # 适配坐标范围 ax.set_xlim(min(lons)-0.01, max(lons)+0.01) ax.set_ylim(min(lats)-0.01, max(lats)+0.01) plt.show()
通过这个图,你能直观看到多边形是否覆盖了你预期的区域,以及哪些点确实在边界外。
完整修复后的代码示例
from matplotlib.path import Path # 调整坐标顺序为(lon, lat),并确保顶点按连续顺序排列 border = [(149.108, -35.2825), (149.118, -35.2873), (149.127, -35.2758), (149.118, -35.2714)] border_path = Path(border, closed=True) # 用列表推导式安全过滤数据 filtered_atlas_data = [ item for item in atlas_data if border_path.contains_points([(item[2], item[1])]) ] # 更新原数据集 atlas_data = filtered_atlas_data
内容的提问来源于stack exchange,提问作者Benjamin Stark
相关产品推荐
相关产品推荐

