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",
)

评论

此博客中的热门博文

Rstudio 使用代理

ShadowsocksR Plus 就回来了~