生き物の名前で生息地のポリゴンを生成するツールを作りました

Posted by kamataryo on November 25, 2022 · 4 mins read

カタツムリは陸域に分布する巻貝を指し、日本には800種類以上が分布することが知られています。関東以北のヒダリマキマイマイやアオモリマイマイ、関東や中部地方のミスジマイマイ、中部から近畿にかけて分布するイセノナミマイマイ、近畿のクチベニマイマイやナミマイマイ、瀬戸内海周辺のセトウチマイマイ、四国南部で見られる日本最大のアワマイマイ、山陰地方にはサンインマイマイが分布しています。

少し移動するだけで別種のカタツムリが分布しているのは「地理的隔離」と呼ばれる現象です。カタツムリは自ら移動して分散する能力に乏しいため、山や海を隔てた地域の個体群どうしの遺伝子交流が妨げられ別種に分化します。

瀬戸内海、男木島で見つけたセトウチマイマイ。Geolonia の合宿にて

カタツムリは近縁な種間では外形的な差が不明瞭で、解剖しないと分からないことも多いです。従って生息域はカタツムリの種を同定する上で重要な情報になります。盲信は禁物ですが、既知の生息域の情報に基づいて種を同定することは比較的容易です。

iNaturalist

最近 iNaturalist というアプリにカタツムリの写真を投稿して楽しんでいます。 iNaturalist は投稿された生き物の写真(あるいは動画や音声などのコンテンツ)に対してコミュニティベースの “Social Identification” を付与するすることで、種の同定を通してユーザーが交流することができる SNS です。 また、機械学習により投稿した写真から同定結果の候補が提示する機能もあります。比較的メジャーな動物や植物に対してはかなり高い精度の予測をしますが、カタツムリはまだまだです。

写真を投稿すると EXIF に記録された緯度経度が地図上にプロットされて、種ごとの分布を地図上で確認したりすることができます。

https://www.inaturalist.org/taxa/466603-Euhadra-subnimbosa

inat-convex で生物の生息域ポリゴンを生成する

iNaturalist は API を提供しています。 あるカタツムリの分布域をざっくりと確認したいことがよくあるので、iNaturalist API をラップして大まかな生息域のポリゴンを生成する CLI ツールを作成しました。

kamataryo/inat-convex is a CLI tool to generate GeoJSON polygons that enclose the convex hull of species distribution areas.

Node.js がインストールされた環境で npm install するか、 npx コマンドでツールを即時実行できます。 第1引数に生物の種名あるいは学名を渡すと、その種の大まかな分布域のポリゴンが生成され GeoJSON フォーマットで出力されます。iNaturalist の観察記録の凸包(全ての点を含む多角形、convex)を生成しているだけなので、詳細な分布域を反映していないことに留意してください。

# インストールして使用
$ npm install @kamataryo/inat-convex -g
$ inat-convex セトウチマイマイ

# npx コマンドで使用
$ npx @kamataryo/inat-convex "Nipponia nippon" # トキ

iNaturalist API に対して秒間 1 回で最大 5 回のリクエストを行うため、ポリゴンの生成には 5 秒以上かかる場合があります。観察記録が少ないマイナーな分類群はすぐ結果が得られます。

npm 以外にも Deno でコンパイルした実行可能ファイルを各アーキテクチャ向けに用意していて、これらを使うと Node.js や Deno がなくてもプログラムを実行できます。M1 Mac、Intel Mac、Windows、Linux 用の実行可能ファイルが GitHub のリリースページからダウンロードできます。 Intel Mac しか動作を確認していないのでそれ以外のアーキテクチャで不具合があれば Issue などで教えていただけますと嬉しいです。

リリースページ - https://github.com/kamataryo/inat-convex/releases

# Mac 上でコンパイル済みプログラムをダウンロードして実行する例
$ wget https://github.com/kamataryo/inat-convex/releases/download/v1.0.15/x86_64-apple-darwin.zip
$ unzip x86_64-apple-darwin.zip
$ x86_64-apple-darwin/inat-convex "タイワンリス"

GeoJSON を標準入出力する TIPs

位置情報を標準入出力で扱うワークフローが好きで、inat-convex のような細かいツールをよく作っています。

標準出力された GeoJSON を jq に入力して処理したり、

$ inat-convex "キタキツネ" | jq
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "totalObservations": 145,
        "scannedObservations": 141,
        "urls": [
          "https://www.inaturalist.org/observations.json?q=キタキツネ&page=1&per_page=200"
        ],
        "title": "キタキツネ"
      },
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              140.6669044828,
              41.9840279575
            ],
            [
              140.672402498,
              41.9813342025
            ],
            [
              145.0604804421,
              43.0870199809
            ],
            [
              145.8121728892,
              43.3847387445
            ],
            [
              146.8941935153,
              43.8253276097
            ],
            [
              142.9391701515,
              53.6159652914
            ],
            [
              140.3588814028,
              43.3269095451
            ],
            [
              140.6669044828,
              41.9840279575
            ]
          ]
        ]
      }
    }
  ]
}

tippecanoe に入力することでベクトルタイルを生成できます。

$ inat-convex "キタキツネ" | tippecanoe -z4 -Z0 --output=./キタキツネ.mbtiles
# 中を確認
$ sqlite3 キタキツネ.mbtiles "select * from tiles;"
0|0|0|?
1|1|1|?
2|3|2|?
3|7|5|?
4|14|10|?

また、@geolonia/view-geojson はローカルサーバーを起動して Geolonia Maps 上で GeoJSON をプレビューする npm で、このツールも GeoJSON の標準入力をサポートしていてます。

$ inat-convex "ホンドギツネ" | npx @geolonia/view-geojson

次のスクリーンショットは、上記のコマンドでホンドギツネの分布域を取得して Geolonia Maps 上でプレビューした例です。ブラキストン線(津軽海峡の生物境界)を跨いだ本州以南に分布しているのが表現できています。

ホンドギツネの分布域

inat-convex では title プロパティとして問い合わせに使った生物名をそのまま保存しているため、@geolonia/view-geojson コマンドにデータを渡した際に Simplestyle としてパースされ、特に Maplibre GL JS のスタイルを記述することなく Geolonia Maps 上で種名がラベルとして表示されます。


最後に、日本で見ることができるカタツムリの分布図をワンライナーで作ってみました。 以下のツールをインストールして、

# 必要なライブラリをインストール。 npx で渡すと yes/no のプロンプトで止まってしまうため
$ npm i @kamataryo/inat-convex jqf @geolonia/view-geojson -g

以下のコマンドを実行すると北海道から沖縄で見られる 9 種類のカタツムリの簡易的な分布図を作成して Geolonia Maps 上に表示できます。出来栄えはあまり美しくはありませんが、それでもどの地方にどんな名前のカタツムリが分布しているかおおむね見て取れるのではないでしょうか。

$ cat \
  <(inat-convex ヒメマイマイ) \
  <(inat-convex シュリマイマイ) \
  <(inat-convex サンインマイマイ) \
  <(inat-convex タカチホマイマイ) \
  <(inat-convex ナミマイマイ) \
  <(inat-convex アオモリマイマイ) \
  <(inat-convex セトウチマイマイ) \
  <(inat-convex ミスジマイマイ) \
  <(inat-convex ツルガマイマイ) \
  <(inat-convex ヒダリマキマイマイ) | \
    jqf '(...args) => ({
      type: "FeatureCollection",
      features: args.flatMap(arg => arg.features),
    })' | view-geojson

この処理では、inat-convex から標準出力された複数の GeoJSON を jqf コマンドで統合し最終的に @geolonia/view-geojson に渡しています。 jqf は、JavaScript で書ける jq ライクな JSON プロセッシングツールで、複数の JSON のストリーム入力を統合して処理したりすることができます。

JSON や GeoJSON を標準入出力するお気に入りのライブラリがあったら皆さんもぜひ教えてください。



Geolonia Maps を無料で試してみる

Geolonia では、ウェブ地図や位置情報を利用したウェブアプリケーションや、モバイルアプリケーションの開発を承っています。

お問い合わせ