カタツムリは陸域に分布する巻貝を指し、日本には800種類以上が分布することが知られています。関東以北のヒダリマキマイマイやアオモリマイマイ、関東や中部地方のミスジマイマイ、中部から近畿にかけて分布するイセノナミマイマイ、近畿のクチベニマイマイやナミマイマイ、瀬戸内海周辺のセトウチマイマイ、四国南部で見られる日本最大のアワマイマイ、山陰地方にはサンインマイマイが分布しています。
少し移動するだけで別種のカタツムリが分布しているのは「地理的隔離」と呼ばれる現象です。カタツムリは自ら移動して分散する能力に乏しいため、山や海を隔てた地域の個体群どうしの遺伝子交流が妨げられ別種に分化します。
カタツムリは近縁な種間では外形的な差が不明瞭で、解剖しないと分からないことも多いです。従って生息域はカタツムリの種を同定する上で重要な情報になります。盲信は禁物ですが、既知の生息域の情報に基づいて種を同定することは比較的容易です。
最近 iNaturalist というアプリにカタツムリの写真を投稿して楽しんでいます。 iNaturalist は投稿された生き物の写真(あるいは動画や音声などのコンテンツ)に対してコミュニティベースの “Social Identification” を付与するすることで、種の同定を通してユーザーが交流することができる SNS です。 また、機械学習により投稿した写真から同定結果の候補が提示する機能もあります。比較的メジャーな動物や植物に対してはかなり高い精度の予測をしますが、カタツムリはまだまだです。
写真を投稿すると EXIF に記録された緯度経度が地図上にプロットされて、種ごとの分布を地図上で確認したりすることができます。
iNaturalist は API を提供しています。 あるカタツムリの分布域をざっくりと確認したいことがよくあるので、iNaturalist API をラップして大まかな生息域のポリゴンを生成する CLI ツールを作成しました。
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 "タイワンリス"
位置情報を標準入出力で扱うワークフローが好きで、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 を標準入出力するお気に入りのライブラリがあったら皆さんもぜひ教えてください。