0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

polarsで地理データを扱う

Last updated at Posted at 2025-01-01

Polars には plugin という、拡張機能を簡単に開発できるものがあります1

plugin のひとつとして、polars_st という地理空間情報について扱えるものがあります。本記事では polars_st の簡単な使い方を紹介します。

image.png

まだalpha版なのでちょっと使い勝手は良くないですが、早速使ってみました。

インストール

pip install polars-st
import polars as pl
import polars_st as st

データ読み込み

  • GeoJSONを読みます
    • たぶん他の地理データファイル形式でも同様に行けるはず
  • CRSの設定は適当にしてます

若干の修正

インストールしたままだとエラーを吐くので、一部修正してしまいます。

※なお、google colabでやってます

GeoJSON読むときにおこるエラーへの一次的な対処
%%writefile /usr/local/lib/python3.10/dist-packages/polars_st/utils/srid.py

from __future__ import annotations

from logging import warning

from polars_st._lib import get_crs_auth_code


def get_crs_srid_or_warn(crs: str) -> int | None:
    try:
        _auth, code = get_crs_auth_code(crs)
        if code.isdigit():
            return int(code, base=10)
        # warning.warn(
        #     f"Found an authority for {crs} but couldn't"
        #     f'convert code "{code}" to an integer srid. ',
        #     "The geometries SRID will be set to 0.",
        # )
    except ValueError:
        # warning.warn(
        #     f'Couldn\'t find a matching crs for "{crs}". The geometries SRID will be set to 0.'
        # )
        pass
    return None

1.兵庫県のWiFiデータ2

url_wifi = "https://www.geospatial.jp/ckan/dataset/06f57e8f-4abf-4d06-a499-62230a7968b5/resource/f4728608-efb7-4f72-a3d1-c90c74e0b431/download/lan.geojson"

# データ読み込み
df = st.read_file(url_wifi)

# 座標参照系の設定
df = df.with_columns(st.set_srid(srid=4326))

2.日本の都道府県の地図3

!curl -L -o japan.geojson https://raw.githubusercontent.com/dataofjapan/land/master/japan.geojson
df_ja = st.read_file("/content/japan.geojson")
df_ja = df_ja.with_columns(st.set_srid(srid=4326))

データ確認

geometry 列に地理情報が入る。binary で持つのでやや見にくい。

image.png

plot 機能もありそうでしたが、使い方分からなかったので geopandas に変換して描画しています。

重ねるとこんな感じ。

fig, ax = plt.subplots(figsize=(6, 6))

df_ja.filter(pl.col("nam_ja")=="兵庫県").st.to_geopandas().plot(ax=ax, color="grey")
df.st.to_geopandas().plot(ax=ax);

geometryをいじる

  • Point を中心にした半径の円を作成する:st.buffer
  • 他のデータとのJOIN: st.sjoin
    • JOIN の条件はいろいろ指定できるけど、デフォルトは intersection(重なってるものをジョイン)
    • 結合後は geometry に相当するカラムが複数できるので、そこでミスが起きそう
df_joined = df.st.sjoin(df_ja)
  • 色々合わせてやってみる
    • 結合したジオデータフレームについて、
    • 右側(兵庫県の地図)に対して以下とのアンドのエリアを取得
      • WiFiの位置を中心に半径nで作った円
    • それをグラフにする
(
    df_joined.select(
        pl.col("geometry_right").st.intersection(
            pl.col("geometry").st.buffer(0.1)
        )
    )
    .rename({'geometry_right': "geometry"})
    .st.to_geopandas().plot()
)

その他

チートシート

geopolarsとの関係

おわりに

まだドキュメントなど未整備な部分多そうですが、調べながらであれば使えそうです。引き続き追っていきたいと思います。ではでは!

  1. pluginについてはこちら。 https://docs.pola.rs/api/python/stable/reference/plugins.html 少し前ですがいろんな便利ツールやプラグインについて紹介した記事があるので、そちらも一緒にどうぞ! https://qiita.com/_jinta/items/e135c48676e08c993c92

  2. 兵庫県作成の公衆無線LAN(HYOGO Free Wi-Fi)の設置施設一覧を使用しています: https://www.geospatial.jp/ckan/dataset/lan/resource/f4728608-efb7-4f72-a3d1-c90c74e0b431

  3. 地球地図日本( http://www.gsi.go.jp/kankyochiri/gm_jpn.html ) を変換したデータを使用させていただいています: https://github.com/dataofjapan/land

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?