问题现象描述
在使用Bokeh库的polygons方法绘制地理多边形时,开发者经常遇到ValueError或TypeError异常,提示坐标数据格式不符合要求。典型的错误信息包括:
- "patches must be numeric sequences of numbers"
- "expected a list of lists, got..."
- "invalid polygon vertex data"
根本原因分析
该问题主要由三个方面的原因导致:
- 数据结构不匹配:Bokeh要求多边形坐标必须是嵌套列表结构,而实际提供的可能是扁平化数组或错误格式的GeoJSON
- 维度不一致:多边形内外环的坐标维度(2D/3D)不统一
- 数值类型错误:坐标值包含字符串或其他非数值类型
解决方案
1. 标准化数据结构
# 错误示例
flat_coords = [x1,y1,x2,y2,x3,y3]
# 正确转换
correct_coords = [[x1,y1],[x2,y2],[x3,y3]]
2. 处理GeoJSON数据
对于从GeoJSON提取的多边形数据:
import json
with open('map.geojson') as f:
geojson = json.load(f)
polygons = [
feature['geometry']['coordinates'][0]
for feature in geojson['features']
if feature['geometry']['type'] == 'Polygon'
]
3. 数据类型验证
添加类型检查确保所有坐标都是数值:
def validate_coords(coords):
return [
[float(x), float(y)]
for x,y in coords
]
完整示例代码
from bokeh.plotting import figure, show
from bokeh.models import ColumnDataSource
# 准备正确格式的数据
polygons = [
[[1,1], [1,2], [2,2], [2,1]], # 正方形
[[3,3], [3,5], [5,5], [5,3]] # 长方形
]
source = ColumnDataSource(data=dict(
xs=[[x for x,y in poly] for poly in polygons],
ys=[[y for x,y in poly] for poly in polygons]
))
p = figure(title="Polygons Example")
p.patches('xs', 'ys', source=source,
fill_color=['red', 'blue'],
line_color='black')
show(p)
性能优化建议
处理大型多边形数据集时:
- 使用NumPy数组替代原生Python列表
- 考虑使用datashader进行大数据量渲染
- 对静态数据启用webgl加速
调试技巧
当遇到坐标问题时:
- 先用
print(type(coords[0][0]))检查数据类型 - 绘制单个简单多边形验证基本功能
- 使用
len()检查每个多边形的顶点数量