基于CSV坐标的空间映射报错及边界坐标过滤求助
地图轨迹绘制报错修复与坐标过滤方案
错误根源分析
报错TypeError: 'bool' object is not subscriptable的直接原因是BBox变量被错误赋值为布尔值:
你原代码中用>运算符把数据经纬度极值和预设边界做了比较,导致BBox变成了一个判断结果(True/False),而非预期的边界元组,自然无法通过下标[0]访问元素。
修复步骤
1. 修正BBox定义
直接用你预设的地图边界定义BBox,不要加比较运算符:
# 格式:(最小经度, 最大经度, 最小纬度, 最大纬度) BBox = (-74.5514, -74.5040, 40.9036, 40.9228)
2. 过滤边界外的坐标
用pandas布尔索引筛选出在预设范围内的数据,避免无效点干扰绘图:
# 拆分边界变量,更清晰 lon_min, lon_max = BBox[0], BBox[1] lat_min, lat_max = BBox[2], BBox[3] # 过滤数据:仅保留经纬度在边界内的记录 df_filtered = df[ (df["longitude"].between(lon_min, lon_max)) & (df["latitude"].between(lat_min, lat_max)) ]
3. 修正绘图轴范围
原代码中set_ylim误用了经度范围,matplotlib里y轴对应纬度,x轴对应经度,需调整:
ax.set_xlim(lon_min, lon_max) # x轴:经度范围 ax.set_ylim(lat_min, lat_max) # y轴:纬度范围
完整修复后代码
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv("/home/hk385/Research_Practice_2023/test_movement.csv") df = pd.DataFrame(data, columns=["longitude", "latitude"]) # 定义地图边界 BBox = (-74.5514, -74.5040, 40.9036, 40.9228) lon_min, lon_max = BBox[0], BBox[1] lat_min, lat_max = BBox[2], BBox[3] # 过滤边界外数据 df_filtered = df[ (df["longitude"].between(lon_min, lon_max)) & (df["latitude"].between(lat_min, lat_max)) ] ruh_m = plt.imread("/home/hk385/Research_Practice_2023/map.png") fig, ax = plt.subplots(figsize=(8,7)) # 使用过滤后的数据绘图 ax.scatter(df_filtered.longitude, df_filtered.latitude, zorder=1, alpha=0.2, c='b', s=10) ax.set_title('Plotting Spatial Data on I-80') ax.set_xlim(lon_min, lon_max) ax.set_ylim(lat_min, lat_max) ax.imshow(ruh_m, zorder=0, extent=BBox, aspect='equal') plt.show()
错误排查技巧
- 打印变量类型:执行
print(type(BBox)),快速确认是否因赋值错误导致类型异常 - 检查数据极值:用
print(df.longitude.describe(), df.latitude.describe())查看数据范围,对比预设边界确认是否存在越界点 - 核对轴对应关系:始终牢记matplotlib中x轴对应经度(东西方向),y轴对应纬度(南北方向)
内容的提问来源于stack exchange,提问作者Hyun Kim
相关产品推荐
相关产品推荐

