使用Pydeck时无法按data_count显示地图海拔高度问题求助
问题描述
我正在使用TopoJSON格式的泰米尔纳德邦地图数据,想让每个区域的海拔高度随data_count值变化,但目前所有区域高度完全一致。换成get_elevation替代get_elevation_weight时,地图直接变成2D状态(左侧区域count值659、右侧250,但视觉上海拔没差异)。
数据本身没问题——不用TopoJSON时,Pydeck能正常加载data_count并呈现正确的高度差异。代码片段如下:
with open(topojson_file) as f: topojson_data = json.load(f) # 用CSV数据中的count值编辑TopoJSON属性 for zone in topojson_data['features']: division_name = zone['properties'].get('division', 'Unknown') data_count = division_data_counts.get(division_name, 0) zone['properties']['data_count'] = data_count geojson_layer = pdk.Layer( "GeoJsonLayer", topojson_data, opacity=0.6, stroked=False, filled=True, extruded=True, get_fill_color="[data_count * 10, 150, 200]", get_elevation_weight="data_count * 100", pickable=True, auto_highlight=True, ) view_state = pdk.ViewState( latitude=data['latitude'].mean(), longitude=data['longitude'].mean(), zoom=7, pitch=60, ) r = pdk.Deck( layers=[geojson_layer], initial_view_state=view_state, tooltip={ "html": "<b>Zone:</b> {division}<br/><b>Data Count:</b> {data_count}", "style": {"color": "white"} } )
解决方法
1. 理清两个参数的区别
get_elevation_weight:是基础海拔值的乘数,Pydeck默认基础海拔仅100,若表达式写法不对或乘数比例不合适,会导致视觉上高度差异不明显。get_elevation:直接定义每个区域的海拔高度,逻辑更直观,推荐优先使用。
2. 修正代码方案
方案一:正确使用get_elevation_weight
明确指向properties中的data_count,同时可调整基础海拔放大差异:
geojson_layer = pdk.Layer( "GeoJsonLayer", topojson_data, opacity=0.6, stroked=False, filled=True, extruded=True, get_fill_color="[properties.data_count * 10, 150, 200]", elevation=100, # 可根据需要调整基础海拔 get_elevation_weight="properties.data_count", pickable=True, auto_highlight=True, )
方案二:改用get_elevation直接设置海拔
直接根据data_count计算海拔,避免依赖默认基础值:
geojson_layer = pdk.Layer( "GeoJsonLayer", topojson_data, opacity=0.6, stroked=False, filled=True, extruded=True, get_fill_color="[properties.data_count * 10, 150, 200]", get_elevation="properties.data_count * 100", # 直接定义海拔值 pickable=True, auto_highlight=True, )
方案三:函数式写法(兼容性更好)
如果字符串表达式不生效,改用lambda函数明确读取属性:
geojson_layer = pdk.Layer( "GeoJsonLayer", topojson_data, opacity=0.6, stroked=False, filled=True, extruded=True, get_fill_color=lambda feat: [feat['properties']['data_count']*10, 150, 200], get_elevation=lambda feat: feat['properties']['data_count'] * 100, pickable=True, auto_highlight=True, )
3. 额外验证步骤
循环赋值后,打印几个feature的属性,确认data_count已正确写入:
print(topojson_data['features'][0]['properties'])
内容的提问来源于stack exchange,提问作者Sree
相关产品推荐
相关产品推荐

