SpatiaLite
で
KNN
===
----
-- 今日いちばんお伝えしたいこと --
# **SpatiaLite5**
### が出たよ!!

---
## みなさん、
# SpatiaLite
## 使ってますか?
---
## ていうか
# SpatiaLite
## って知ってますか?
(おずおず)
---
# SpatiaLite
## is
# 何
---
## SpatiaLite is 何
ローカル環境で使える単一ファイルのリレーショナルなデータベースであるSQLiteに、地理空間機能を拡張したものです。
---
どんな特徴?
---
一つのDBファイルに
たくさんのレイヤを格納できます

---
一つのレイヤに
複数のジオメトリ列を持つこともできます

違うタイプの地物とか
違う空間参照とか
---
SQLを使って、いろんな空間処理ができます

<div style="font-size:40%">
https://hackmd.io/pB0RlatrSk2qC6spKJsuYg
</div>
---
## **GeoPackage**
<div style="font-size:50%">
(QGISのデフォルトベクタフォーマット)
</div>
の兄弟みたいなものかも

<div style="font-size:50%">
https://www.slideshare.net/osgeojapan/geopackage-184367982
</div>
---
Geopaparazziのベクタデータでも使われてたはず

<div style="font-size:50%">
https://www.slideshare.net/osgeojapan/geopackage-184367982
</div>
---
これまでの安定版は4.3.0a
(**2015-07-01**)

QGISにも搭載されてます
---
次のバージョン**4.4**は
リリース候補版(RC1)で
開発終了。。。
---
長い沈黙の後、バージョン5のbetaが公開
(2018-08-03)
わーい
なんか色々できるようになってるらしいよ
---

<div style="font-size:50%">
(テンション上がってこんな記事書いたりしました)
</div>
---
### しかし開発者はその後沈黙…。
<br>
<div style="font-size:50%; text-align:left">
アナウンスから16ヶ月経ったけど、どうなったん…?
</div>
<br>
<div style="font-size:50%; text-align:right">
だから言っただろ、このプロジェクトはもう瀕死だよ
</div>
<br>
<div style="font-size:50%; text-align:left">
このままだとDebianのパッケージからも削除になるな
</div>
<br>
<div style="font-size:50%; text-align:right; font-weight:bold">
秋頃まで何もなかったら、GitHubに移行して有志でやっては?
</div>
---
<div style="font-size:60%">
そんな中、8/4、何の前触れもなく突然Furieriさん(開発者)から
</div>
2年止まっちゃったけど、
リリース候補版を公開できて嬉しい
<div style="font-size:60%">
とのメッセージが投下されました(生きててよかった)
</div>

---
その後、8/24についに安定版SpatiaLite5が
公開されましたー!

---
<!-- .slide: style="text-align:left" -->
### 新しいSpatiaLiteでは、
<br>
1. RasterLite2を完全統合
2. ISOトポロジーのサポート
3. PROJ6&7 のサポート
4. ストアドプロシージャのサポート
<br>
<br>
<div style="text-align:right; font-size=50%">
などがサポートされているみたいです<br>
<div style="font-size:70%">
(あまりいじれてなくてよく知らない)
</div>
</div>
---
ちなみに
なんでこんなにブランクが…?
---
いろいろあったようです。

(訴訟沙汰とか)
---
なぜ突然リリース…?
---
コロナで手が空いたから。
---
<div style="font-size:130%">
_人人人人人人人人人人人人_<br>
>コロナで手が空いたから!<<br>
 ̄YYYYYYYYYYYY ̄
</div>
---
SpatiaLite5がリリースにこぎつけたのは
<br>
## **コロナのおかげ!!**
<br>
らしいです:innocent:
---
QGISに搭載されているバージョンも、
そのうち更新されるはず。
### 楽しみに待ちましょう!

---
すみません、
もうほとんど終盤ですが、
これから本編のKNNのお話です。
---
#### KNNって?
---
### **k近傍法**
というものらしいです。
(きっと詳しい人がたくさんいるはず)
---
SpatiaLiteでは
## VirtualKNN
という機能が搭載されています。
(4.4からの機能)
---
要は、
### かなり高速に
### ある地点からの近傍点を
### 抽出することができる機能
---
#### やってみた
---
OpenStreetMapの日本全国の建物ポリゴン
をインポートしてきました

<div style="font-size:50%">
https://download.geofabrik.de/asia/japan.html
</div>
---
全ポリゴンをそれぞれ点にします
``` sql
SELECT AddGeometryColumn( -- 点のジオメトリカラムを追加
'pg_building', 'geom_pt_4326', 4326, 'POINT'
);
UPDATE "pg_building" -- ポリゴンから点を作る
SET "geom_pt_4326" = ST_PointOnSurface("Geometry");
```
---
こんなんできました

---
地物数:1400万くらい(13,926,591)

(表示するだけでQGISが落ちました)
---
それでは、
KNNで近い点の抽出をやってみます。
(細かいことは省略)
---
お隣=二番目に近い場所をさがします。
(一番は自分)
```sql
SELECT * FROM "KNN"
WHERE "f_table_name" = 'pg_building'
AND "ref_geometry" = MakePoint(
-- 山の手博物館のあるところ
141.284665, 43.071027, 4326
)
-- 最近接はここなので、ふたつめまで取る
AND "max_items" = 2
;
```
---
0.4秒

---
お隣のビルがちゃんと取れてました

---
1,024番目に近い場所をさがします。(最大値)
```sql
SELECT * FROM "KNN"
WHERE "f_table_name" = 'pg_building'
AND "ref_geometry" = MakePoint(141.284665, 43.071027, 4326)
AND "max_items" = 1024 -- 最大1024
ORDER BY "pos" DESC LIMIT 1 -- 降順の先頭
;
```
---
0.4秒

---
割とすぐ近くでした。(500mくらい)

---
というわけで、
**ご近所を秒で抽出したいニーズ**には
SpatiaLiteもお役に立てるかも
しれません!
---
おわり
{"metaMigratedAt":"2023-06-15T13:02:03.335Z","metaMigratedFrom":"YAML","title":"SpatiaLiteでKNN","breaks":true,"slideOptions":"{\"theme\":\"solarized\",\"transition\":\"fade\",\"--parallaxBackgroundImage\":\"https://i.imgur.com/E334AJH.png\"}","contributors":"[{\"id\":\"54845b3b-2db5-4a15-bb36-90b936b41d9d\",\"add\":6352,\"del\":1805}]"}