使用pydeck的PathLayer/TripLayer绘制GeoDataFrame的LINESTRING Z轨迹
问题原因
- pydeck的PathLayer不直接接收Shapely几何对象,要求路径参数为嵌套坐标列表,格式为
[[lon1, lat1], [lon2, lat2], ...](三维的话可以加z值为[[lon1, lat1, z1], ...]) - 原代码中ViewState的经纬度参数传反:Shapely点对象的x属性为经度,y属性为纬度,原代码把x传给latitude、y传给longitude会导致视角偏移到错误位置,看不到轨迹
- 初始化Deck时layers参数重复嵌套列表:原代码中
layers变量已经是存储Layer对象的列表,传入Deck时再加一层[]会导致参数解析失败
解决步骤
- 预处理几何列,转换为pydeck可识别的坐标列表:
# 舍弃Z分量,转二维坐标列表 tracks['path'] = tracks['geometry'].apply(lambda line: [[coord[0], coord[1]] for coord in line.coords]) # 如果需要保留Z分量,用下面这行 # tracks['path'] = tracks['geometry'].apply(lambda line: list(line.coords))
- 修正PathLayer和Deck参数,调整后的完整代码如下:
layers = [ pdk.Layer( type = "PathLayer", data=tracks, get_path="path", # 改用预处理后的坐标列 width_scale=20, width_min_pixels=5, get_width=5, get_color=[180, 0, 200, 140], pickable=True, ), ] view_state = pdk.ViewState( latitude=gdf_polygon.centroid.y, # 修正经纬度参数 longitude=gdf_polygon.centroid.x, zoom=6, min_zoom=5, max_zoom=15, pitch=40.5, bearing=-27.36 ) r = pdk.Deck(layers=layers, initial_view_state=view_state) # 去掉多余的列表嵌套 return r
- 如果需要更平滑的轨迹,可以先对原始LINESTRING做插值处理,使用Shapely的
interpolate方法或样条插值函数生成更密集的坐标点后,再转换为路径列表即可。
内容的提问来源于stack exchange,提问作者DKovar
相关产品推荐
相关产品推荐

