SpatiaLite で KNN === ---- -- 今日いちばんお伝えしたいこと -- # **SpatiaLite5** ### が出たよ!! ![](https://i.imgur.com/E334AJH.png =30%x30%) --- ## みなさん、 # SpatiaLite ## 使ってますか? --- ## ていうか # SpatiaLite ## って知ってますか? (おずおず) --- # SpatiaLite ## is # 何 --- ## SpatiaLite is 何 ローカル環境で使える単一ファイルのリレーショナルなデータベースであるSQLiteに、地理空間機能を拡張したものです。 --- どんな特徴? --- 一つのDBファイルに たくさんのレイヤを格納できます ![](https://i.imgur.com/zfB6Z9r.png =50%x50%) --- 一つのレイヤに 複数のジオメトリ列を持つこともできます ![](https://i.imgur.com/4uwAIQy.png =50%x50%) 違うタイプの地物とか 違う空間参照とか --- SQLを使って、いろんな空間処理ができます ![](https://i.imgur.com/pZzB9KC.png =50%x50%) <div style="font-size:40%"> https://hackmd.io/pB0RlatrSk2qC6spKJsuYg </div> --- ## **GeoPackage** <div style="font-size:50%"> (QGISのデフォルトベクタフォーマット) </div> の兄弟みたいなものかも ![](https://i.imgur.com/yZMjdDK.png =50%x50%) <div style="font-size:50%"> https://www.slideshare.net/osgeojapan/geopackage-184367982 </div> --- Geopaparazziのベクタデータでも使われてたはず ![](https://i.imgur.com/ySCZUV9.png) <div style="font-size:50%"> https://www.slideshare.net/osgeojapan/geopackage-184367982 </div> --- これまでの安定版は4.3.0a (**2015-07-01**) ![](https://i.imgur.com/EcTUOkZ.png =60%x60%) QGISにも搭載されてます --- 次のバージョン**4.4**は リリース候補版(RC1)で 開発終了。。。 --- 長い沈黙の後、バージョン5のbetaが公開 (2018-08-03) わーい なんか色々できるようになってるらしいよ --- ![](https://i.imgur.com/udVJH84.png =50%x50%) <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> ![](https://i.imgur.com/vZasKrX.png =50%x50%) --- その後、8/24についに安定版SpatiaLite5が 公開されましたー! ![](https://i.imgur.com/wkFuOKr.png =75%x75%) --- <!-- .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> --- ちなみに なんでこんなにブランクが…? --- いろいろあったようです。 ![](https://i.imgur.com/EZnLXdh.png) (訴訟沙汰とか) --- なぜ突然リリース…? --- コロナで手が空いたから。 --- <div style="font-size:130%"> _人人人人人人人人人人人人_<br> >コロナで手が空いたから!<<br>  ̄YYYYYYYYYYYY ̄ </div> --- SpatiaLite5がリリースにこぎつけたのは <br> ## **コロナのおかげ!!** <br> らしいです:innocent: --- QGISに搭載されているバージョンも、 そのうち更新されるはず。 ### 楽しみに待ちましょう! ![](https://i.imgur.com/E334AJH.png =30%x30%) --- すみません、 もうほとんど終盤ですが、 これから本編のKNNのお話です。 --- #### KNNって? --- ### **k近傍法** というものらしいです。 (きっと詳しい人がたくさんいるはず) --- SpatiaLiteでは ## VirtualKNN という機能が搭載されています。 (4.4からの機能) --- 要は、 ### かなり高速に ### ある地点からの近傍点を ### 抽出することができる機能 --- #### やってみた --- OpenStreetMapの日本全国の建物ポリゴン をインポートしてきました ![](https://i.imgur.com/YYlmaLx.png =70%x70%) <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"); ``` --- こんなんできました ![](https://i.imgur.com/DdZcgwv.png) --- 地物数:1400万くらい(13,926,591) ![](https://i.imgur.com/n9nmWko.png =80%x80%) (表示するだけで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秒 ![](https://i.imgur.com/vkxNWNr.png) --- お隣のビルがちゃんと取れてました ![](https://i.imgur.com/iarlLpH.png) --- 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秒 ![](https://i.imgur.com/1y2j78V.png) --- 割とすぐ近くでした。(500mくらい) ![](https://i.imgur.com/EFZXbyH.png =70%x70%) --- というわけで、 **ご近所を秒で抽出したいニーズ**には 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}]"}
    1044 views