polars_st 绘制地图
import polars as pl
import polars_st as st
import altair as alt
import json
alt.data_transformers.enable("vegafusion")
luis=st.read_file('/mnt/c/Users/xuefliang/Downloads/tl_2023_22_prisecroads/tl_2023_22_prisecroads.shp')
features = [
{"type": "Feature", "geometry": json.loads(r.pop("geometry")), "properties": r}
for r in luis.st.to_geojson().to_dicts()
]
chart = alt.Chart(alt.Data(values=features)).mark_geoshape(
filled=False,
stroke='steelblue',
strokeWidth=1
).properties(
width=800,
height=600,
title="Louisiana Primary Roads Map"
).project(
type='mercator'
)
chart
# 使用命名空间名称 'map'
@pl.api.register_dataframe_namespace("map")
class GeoPlotter:
def __init__(self, df: pl.DataFrame):
self._df = df
def plot(self, title="Map", stroke='black', stroke_width=1, simplify=None):
"""执行转换并绘制 Altair 地图"""
working_df = self._df
# 1. 可选的几何简化
if simplify is not None:
working_df = working_df.with_columns(
pl.col("geometry").st.simplify(simplify)
)
# 2. 转换为 GeoJSON 字符串列
geojson_df = working_df.st.to_geojson()
# 3. 构造 Features 列表
features = [
{
"type": "Feature",
"geometry": json.loads(row.pop("geometry")),
"properties": row
}
for row in geojson_df.to_dicts()
]
# 4. 构建 Altair 图表
chart = alt.Chart(alt.Data(values=features)).mark_geoshape(
filled=False,
stroke=stroke,
strokeWidth=stroke_width
).properties(
title=title
).project(
type='mercator'
).interactive()
return chart
chart = luis.map.plot(
title="Louisiana Primary Roads",
stroke="black",
)
评论
发表评论