tag:blogger.com,1999:blog-67023872155272665392024-03-13T08:47:57.693+09:00chizuwotaPEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.comBlogger7125tag:blogger.com,1999:blog-6702387215527266539.post-7990971366974303292021-08-11T03:25:00.005+09:002021-08-11T03:25:45.453+09:00Windows 10 で CAPS LOCK を CTRL にする<div>A キーの隣は CTRL であってほしいタイプです。</div>以前は xkeymacs の付属のツールでキー配置を変えたりしていたんですが、メンテされていないようなので、レジストリをいじって CAPS LOCK と CTRL を入れ替えます。<div><br /></div><div><div><ol style="text-align: left;"><li>レジストリエディタを開く</li><li>[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] を選択</li><li>[Scancode Map] という名前でバイナリ値を作成</li><li>以下の値を設定する</li></ol></div><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLm0yd4-7T3_dMuWoBh8S5UNJzqpQZm-WUFJmGdFBfkb6iw3_9HkcrV31oMHidGah972b6I1LrWRmWFdlYMdMNApLdJbtFp4jHsgm8LeV_rzqc_fz9paA4P8lvU1EWyq9osmnvCzMCGXA/s616/regedit_ctrl_caps.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="378" data-original-width="616" height="196" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLm0yd4-7T3_dMuWoBh8S5UNJzqpQZm-WUFJmGdFBfkb6iw3_9HkcrV31oMHidGah972b6I1LrWRmWFdlYMdMNApLdJbtFp4jHsgm8LeV_rzqc_fz9paA4P8lvU1EWyq9osmnvCzMCGXA/s320/regedit_ctrl_caps.png" width="320" /></a></div></div>PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com3tag:blogger.com,1999:blog-6702387215527266539.post-87738382477142651052018-04-15T00:53:00.000+09:002018-04-15T01:05:04.933+09:00Windows で Node.js の開発環境を作るここからパクッてる。<br />
<a href="http://tyru.hatenablog.com/entry/2017/03/13/162318">http://tyru.hatenablog.com/entry/2017/03/13/162318</a><br />
<br />
<h2>
nodist のインストール</h2>
<div>
Pyenv のようなもの。ちなみに Pyenv は好きじゃないので使ってない。</div>
<div>
<a href="https://github.com/marcelklehr/nodist">https://github.com/marcelklehr/nodist</a></div>
<br />
nodist をインストールできたら安定板の node.js をインストールする。<br />
<pre><code class="cmd">nodist + 8
nodist 8.11.1</code></pre>
<h2>
windows-build-tools のインストール</h2>
<div>
npm を使用するうえで c++ のコンパイラや python のランタイムがいるらしい。へぇ。<br />
Administrator として起動した PowerShell で以下コマンドを実行。cmd でやってエラーをいただいた。<br />
<pre><code class="cmd">npm install --global --production windows-build-tools</code></pre>
</div>
<div>
<br /></div>
PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com1tag:blogger.com,1999:blog-6702387215527266539.post-39626951382387376642018-03-05T00:58:00.001+09:002018-03-05T00:59:31.213+09:00Windows Subsystem for Linux の Ubuntu に GIS 環境を整備するWSL (Windows Subsystem for Linux) 使ってますか?<br />
<div>
msys2 やら古くは cygwin やらいろいろ Unix ライクな環境を Windows 上に作ろうと苦労してきましたが、最近は WSL の Ubuntu で落ち着いております。</div>
<div>
<br /></div>
<div>
さて、基本はコマンドラインでのお仕事に使ってるわけですが、gdal ぐらいは使いたくなるわけなんですよ。その手順です。って Ubuntu なんで WSL 固有の操作なんてないんですけどね・・・。</div>
<div>
<pre><code class="bash">$ sudo add-apt-repository -y ppa:ubuntugis/ubuntugis-unstable
$ sudo apt update
$ sudo apt install gdal-bin </code></pre>
<br /></div>
<div>
<br /></div>
PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com1tag:blogger.com,1999:blog-6702387215527266539.post-44747525908031634192018-01-30T14:39:00.000+09:002018-02-21T12:19:47.816+09:00Mac で GIS 環境を整える<h3>
python</h3>
<pre><code class="bash">brew install python
brew install python3</code></pre>
<h3>
geos</h3>
<pre><code class="bash">brew install geos</code></pre>
<h3>
proj</h3>
<div>
<pre><code class="bash">brew install proj --with-vdatum</code></pre>
</div>
<h3>
gdal/ogr</h3>
<pre><code class="bash">brew install gdal --with-libkml --with-postgreql --with-python3 --with-complete --with-opencl</code></pre>
<h3>
postgis</h3>
<div>
<pre><code class="bash">brew install postgresql
brew install postgis --with-protobuf-c
</code></pre>
<h3>
gdal/ogr2</h3>
<pre><code class="bash">brew tap osgeo/osgeo4mac
brew install gdal2 --with-postgresql --with-sfcgal --with-complete --with-libkml --with-opencl</code></pre>
</div>
<h3>
grass7</h3>
<pre><code class="bash">brew install grass7 --with-netcdf --with-postgresql</code></pre>
<h3>
qgis2</h3>
<pre><code class="bash">brew install qgis2
pip2 install psycopg2 matplotlib pyparsing requests future jinja2 pygments
brew linkapps qgis2</code></pre>
PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com0tag:blogger.com,1999:blog-6702387215527266539.post-87623095079688883312016-12-14T04:20:00.000+09:002017-02-01T19:15:31.966+09:00GeoPackage で ポータブル OSM<span style="font-size: large;"><a href="http://blog.chizuwota.net/2016/12/geopackage-osm.html" target="_blank">FOSS4G Advent Calendar 2016</a> 14 日目の記事です!</span><br />
<br />
Advent Calendar でしか更新されないブログへようこそ。<br />
<a href="http://www.openconcierge.org/" target="_blank">NPO法人 オープンコンシェルジュ</a> とか <a href="http://osgeo.jp/">OSGeo.JP</a> の松浦です。<br />
<br />
みなさんは GIS データをどんな形式で保存していますか?<br />
私のようなリッチメンは家計簿兼暖房用に購入した <a href="http://www.oracle.com/jp/engineered-systems/exadata/overview/index.html" target="_blank">Oracle Exadata</a> に Oracle Locator のSDO_Geometry と SDO_Georaster で管理していますが(真っ赤なウソ)、大抵の場合は Shapefile じゃないでしょうか。<br />
<br />
Shapefile は米国Esri 社が開発した空間データを格納するフォーマットで、仕様が公開されていることもあり多くの GIS ソフトウェアで使用可能です。<br />
ただ、ハードウェア、ソフトウェアの急速な進化に伴って、いろいろ不都合が生じてきました。<br />
<br />
<h2>
Shapefile の闇</h2>
<h3>
<br />1. なんかファイルいっぱい必要</h3>
<b><br /></b>
<b>「データ添付しました。ご査収ください。」っていうメールが来て確認したら、満を持して登場する【データ.shp】。「どうも、一人できました。てへっ」つって。</b><br />
<b>開けねーよ。ご査収できねぇよ。</b><br />
<br />
なんて経験、ありますよね?<br />
Shapefile は最低でも .shp, .dbf, .shx という 3 つのファイルが必要です。<br />
必須以外にも、.prj、.sbn、.shp.xml、.cpg などなどいろいろ構成員がいらっさいます。これら合わせて 1 つの Shapefile です。<br />
<br />
<h3>
2. なんか、もう文字コードがつらい</h3>
<br />
最近はソフトウェアが頑張るのでましですが、たいてい CP932 の Shapefile は一発目化ける。<br />
<br />
<h3>
3. 容量制限</h3>
<br />
今時<b> 2 GB </b>って・・・<br />
まぁ 2 GB のベクターデータって結構でかいんですがね。<br />
とはいっても、TB を超えるディスクが 1, 2 万で買える時代に 2 GB はきつい。<br />
<br />
<h3>
4. 属性名足りない、短いよ...</h3>
<br />
<b>10 バイト</b>まで (UTF-8 だと 3 文字とか・・・)。なので「都道府県」という属性名にしたくても「<b>都道府</b>」になってしまうという・・・<br />
<br />
<br />
とまぁきりがないのですが、決して Shapefile を陥れたいわけでもディスりたいわけでもないんです。<br />
このフォーマットが GIS の普及やソフトウェアのデータ相互運用性の確保に大きく貢献をしたことは言うまでもありません。<br />
<br />
そう、ただ次の時代がやってきただけです。<br />
<br />
<h2>
GeoPackage を使おう</h2>
<div>
<br /></div>
<div>
じゃぁ、ポスト Shapefile はなんでしょう。</div>
<div>
<strike>個人的には、PostgreSQL にぶっこんどけばよくない?とか思うけど。おらの捕まえたGISデータを交換とかする友達いねーし。</strike></div>
<br />
ファイル形式で、追加ソフトやライブラリがいらなくて、大容量に対応していて仕様がオープンなフォーマットって考えたとき、脳内には GeoPackage しか残りませんでした。<br />
ほかにあるのかもしれないけど。<br />
<br />
GeoPackage はベクターデータおよびタイル化されたラスターデータを格納できますが、その実態は <b>SQLite データベース</b>です。空間インデックス(R-Tree)にも対応しています。<br />
<br />
単一ファイル (.gpkg) で構成されますが、データベースですので 1 つの GeoPackage 内に複数のスキーマの異なるベクターデータやタイル化されたラスターデータを格納できます。この点は Shapefile と大きく異なります。<br />
<br />
また、<a href="http://www.opengeospatial.org/" target="_blank">OGC (Open Geospatial Consortium) に</a>よって定義されており、すでに GDAL/OGR や QGIS や ArcGIS などの地理空間データを扱うソフトウェアが対応しています。<br />
<br />
<a href="http://www.geopackage.org/" target="_blank">詳しくはこちら</a>(私が言っていることと違うことが書いてあったら、こちらのサイトのほうを信じてください)。<br />
<br />
<h2>
GeoPackage に Planet.osm をぶっこむ</h2>
<div>
はい。やっと本題。</div>
<div>
結局でかいデータを高パフォーマンスで扱えるかなんてやってみなきゃわからんのだよ。</div>
<div>
ってことで恒例の <b>Planet.osm</b> 登場。</div>
<div>
<br /></div>
<div>
Planet.osm は <a href="https://openstreetmap.jp/" target="_blank">Open Street Map</a> の地図描画用の元データで、全世界の道路や建物、POI、行政界、国境などが含まれます。</div>
<div>
OSM より提供されており Protocol Buffers 形式で 35 GB 強あります。通常は全球データを落として 1 ファイルにするなんてクレイジーなことはせず、PostgreSQL などの RDBMS に展開して使用します。たぶん。</div>
<div>
ちなみに PostgreSQL に展開すると、ぼんやりした記憶ですがインデックスこみこみで 200 GB 前後になったと思います。ポリゴンデータは 2 億レコードを超え、ラインでも軽く 1 億レコード越えです。</div>
<div>
<br /></div>
<div>
さて、冒頭で Exadata の話をしましたが、現実世界の私の家にはおそらく Exadata の筐体より小さな冷蔵庫ぐらいしかないので、データ作成はクラウドを活用することにします。</div>
<div>
AWS? え? あれもえもえしないので今回は <a href="https://www.conoha.jp/" target="_blank">Conoha</a> でいきます。</div>
<div>
Conoha な理由は、root ディスク、データディスクすべてSSDで、時間で課金形式だけどデータ転送量の課金がなく、最大コストを見積もりやすいからです。庶民の味方。(GMOさん、宣伝したからなんかちょうだい)</div>
<div>
<br /></div>
<div>
今回はメモリ 4GB の Arch Linux のインスタンスに 500 GB の追加 SSD をつけてデータ作成を実施しました。</div>
<div>
<br /></div>
<div>
結論から言うと、ほぼ弊害なさくっと Planet.osm から、ポリゴン、ライン、ポイント を含んだ GeoPackage を作成することができました。</div>
<div>
<br /></div>
<div>
以下は簡単な手順と、それぞれにかかった時間です。</div>
<div>
<br /></div>
<div>
<ol>
<li>GDAL/OGR の導入<br />以下コマンドを実行<br /><b><br /><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;"># pacman -S gdal</span><br /><br />処理時間: 1分</b></li>
<li>Planet.osm のダウンロード<br />今回はお隣、台湾のサーバーからダウンロード。<br />Planet の情報は <a href="http://wiki.openstreetmap.org/wiki/Planet.osm">http://wiki.openstreetmap.org/wiki/Planet.osm</a> 参照。<br /><br /><b><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">nohup
/usr/bin/time curl -O <a href="http://free.nchc.org.tw/osm.planet/pbf/planet-161205.osm.pbf">http://free.nchc.org.tw/osm.planet/pbf/planet-161205.osm.pbf</a>
> download_planet.log 2>&1 &</span><br />処理時間: 53 分</b></li>
<li>ogr2ogr で変換<br /><br />GDAL/OGR の ogr2ogr で変換。<br /><br /><b><span style="font-family: "helvetica neue" , "arial" , "helvetica" , sans-serif;">nohup /usr/bin/time ogr2ogr --config CPL_TMPDIR /data/osmtest/tmp -progress -f GPKG planet_osm.gpkg planet-161205.osm.pbf > ogr2ogr.log 2>&1 &</span><br /><br />処理時間: <span style="font-size: large;">22 時間 30 分<br />GeoPackage サイズ: 170 GB</span><br />Conoha 利用料: (なんだかんだ 3 日間くらいあーだこーだして) <span style="background-color: #ffe599;">1000</span>円弱</b><br /><br />ポイントは --config CPL_TMPDIR オプションで、処理の一時ファイルの出力先に空き領域に余裕のあるディレクトリを指定すること。<br />最初の数回はここでは待ってディスク不足で処理が止まりました。<br /><br />あと、メモリも 4GB ぐらいはあったほうがいいみたい。最初 512 MB のインスタンスに swap 積んでやったんですが out of memory でお亡くなりになりました。<br /><br />ちなみに上記処理は空間インデックスの作成も含みます。その他のカラムに対するインデックスは張られていません。</li>
<li>gpkg のダウンロード<br /><br />これが予想外に時間がかかった・・・<br />nginx をたてて、HTTPでダウンロードしましたが、4時間以上かかりましたよ・・・。そしてこの時間ですよ。</li>
</ol>
</div>
<div>
予想外に処理時間が短く済みましたし、容量も 170 GB という現実的な数字に収まりました(もはや麻痺)。</div>
<div>
<br /></div>
<div>
あとはこれが現実的な速度で使用できるかということです。</div>
<div>
<br /></div>
<h2>
QGIS で描画してみる</h2>
<div>
QGIS の出番です。</div>
<div>
意気揚々と「ベクタレイヤの追加」ボタンから作成した planet_osm.gpkg を追加したら・・・ <b>15分以上沈黙・・・</b> その後レイヤ選択のウィンドウが出てきてデータ追加できました。<br />
ただ、毎回これじゃぁ・・・ ねぇ?</div>
<div>
<br /></div>
<div>
これ、レイヤのプロパティ用にすべてのレイヤに対して<b> select count(*) </b>的なクエリを流してフィーチャ数を毎回カウントしているからだと思われます。</div>
<div>
<br /></div>
<div>
なんとかこのプロセスを端折る方法はないか10秒程度悩んだんですが、1個だけありました。<br />
<br />
<span style="font-size: x-large;">VRT (http://www.gdal.org/drv_vrt.html</span><span style="font-size: x-large;">)</span></div>
<div>
<br />
VRTは仮想的なレイヤを定義する XML 形式のデータフォーマットです。通常は複数のデータをあたかも1つのデータとして扱うためなどに使われます。</div>
<div>
VRTの定義の中にメタ情報的な要素もあり、その中に <b>FeatureCount</b> という要素があったことを思い出しました。神がかってます。</div>
<div>
<br /></div>
<div>
こんな感じで定義しました。</div>
<div>
<script src="https://gist.github.com/PEmugi/1393b5f22ee09e8c56f4924f6aac60ac.js"></script>
</div>
<div>
<br />
これを poly.vrt として保存し、QGIS で開くと、<span style="color: #e06666; font-size: x-large; font-weight: bold;">さくっ!</span>といきましたよ。同じ要領でポイント、ラインの VRT も作成しました。<br />
フィーチャ数は適当に2億にしておきましたw ちゃんと数える場合は sql で直接カウントしてください。<br />
ちなみにポリゴンのレイヤは <span style="font-size: large;"><b>247647486 </b></span>フィーチャあります。<br />
<br />
描画速度も<b>実用に耐えうる</b>もので、ある程度拡大していればさくさくと行きます。<br />
<br />
<h3>
東京</h3>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXeosPm436bCh9X7fefE97rLoivN6I6x9cplb0tc8wiryf34HepG-fcS5pxaZb0Oq_rJ9is9MnFIw7BGY1yJrBhXB2GEbhXx8aBHyiEKqz912OZyksGNHo-4gTWngUAiD48jkJSGdGvL8/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+%25281%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="356" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXeosPm436bCh9X7fefE97rLoivN6I6x9cplb0tc8wiryf34HepG-fcS5pxaZb0Oq_rJ9is9MnFIw7BGY1yJrBhXB2GEbhXx8aBHyiEKqz912OZyksGNHo-4gTWngUAiD48jkJSGdGvL8/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+%25281%2529.png" width="640" /></a></div>
<div>
<br /></div>
<h3>
New York</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTcXYSYzk62rFOuyJgxxzRhgzbimFpoznhEZSpmH1DJ9tCHHZjQTImWTm4Sv3rL5YMEHNV8brCivVzcDTvZWXPmDiZncvKKPBEkRI4v0yjA_cIf0BPqkA12Akk8g1A95ZNgHNlsmY56Ac/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+%25282%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="358" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTcXYSYzk62rFOuyJgxxzRhgzbimFpoznhEZSpmH1DJ9tCHHZjQTImWTm4Sv3rL5YMEHNV8brCivVzcDTvZWXPmDiZncvKKPBEkRI4v0yjA_cIf0BPqkA12Akk8g1A95ZNgHNlsmY56Ac/s640/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+%25282%2529.png" width="640" /></a></div>
<div>
多すぎるのでポイントは非表示</div>
<div>
<br /></div>
<h2>
結論</h2>
<span style="color: #cc0000; font-size: x-large;">GeoPackage 使える。<br /><br />想像してみてください。<br />全球の地図データをポケットに入れて持ち運べる時代がきたんですよ?</span><br />
<span style="color: #cc0000; font-size: x-large;">興奮しませんか?</span><br />
<br />
<br />
よいお年を。<br />
<br />
※深夜および過労気味で文章のテンションがおかしく、かつ文も乱れております。詳細をお聞きになりたい方は私の実態を捕まえるか、SNSで連絡ください。<br />
twitter: <complete id="goog_2055797523"><a href="https://twitter.com/PEmugi2" target="_blank">@PEmugi2</a></complete><br />
<br />
<h4>
注意点なぐりがき</h4>
<div>
<ul>
<li>データの細部まで検証してないので、中身がすべてまともにインポートできてるかは謎。</li>
<li>Conoha の料金は参考値</li>
<li>空間インデックスしか張ってないので、たとえば国境ポリゴンを表示させようと admin_level in ('0', '1') とかやっても、インデックスは空間的な絞り込みにしか聞かないので小縮尺ではえらい時間かかります。フィルタとかする場合は適切にインデックスを追加しましょう。</li>
<li><a href="http://www.gdal.org/drv_osm.html" target="_blank">ogr2ogr の osm に関する情報はこちら</a></li>
<li>デフォルトで属性として取り込まれる osm のタグは限られます。たとえばname:jaなどはその他のタグとしてまとめられます。この設定を変えるには上記のogr2ogrのページの <a href="http://svn.osgeo.org/gdal/trunk/gdal/data/osmconf.ini">osmconf.ini</a> で定義します。</li>
</ul>
</div>
PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com0tag:blogger.com,1999:blog-6702387215527266539.post-17723447289110448522015-12-11T03:50:00.004+09:002015-12-11T03:56:49.682+09:00QGIS GEOHEX Plugin<a href="http://www.openconcierge.org/" target="_blank">NPO法人 オープンコンシェルジュ</a> の松浦です。<br />
<br />
この記事は <a href="http://qiita.com/advent-calendar/2015/foss4g" target="_blank">FOSS4G Advent Calendar 2015</a> の 12/11 の記事でっす。<br />
<br />
みなさん GEOHEX ってご存知ですか?<br />
GEOHEX は @sa2da 氏が開発した世界地図を隙間なく敷き詰める六角形(ヘックス)です。<br />
<br />
GeoHash やタイルスキーマの六角形版のようなものをイメージしてもらえればいいと思います。<br />
<br />
<a href="http://geohex.net/" target="_blank">こちら</a>で @sa2da 氏作成のデモが見られます。<br />
<br />
GEOHEX の詳しい仕様については<a href="https://sites.google.com/site/geohexdocs/" target="_blank">公式ページ</a>をご参照ください。<br />
<br />
で、本題に入りますが、GEOHEX は見た目もかっこいいし、便利に使えると思うので多くの人に使ってほしいのですが、簡単に GEOHEX を作成するようなツールがありません。<br />
GEOHEX を扱うためのライブラリは多くの言語に対して実装されていますが、できることなら GUI でサクッと作りたいですよね。<br />
<br />
というわけで QGIS の Plugin にしてみました。<br />
2年前に Python 用のライブラリを書いていたのでそれを使用してやっつけで作りました。<br />
(Python ライブラリもライセンスを定義しないまま放置していたので MIT ライセンスをこの機会に設定・・・)<br />
<br />
<h2>
使ってみよう</h2>
QGIS にこの Plugin を入れると、下のように緑の六角形のアイコンが追加されます。アイコンがダサいのは許して。<br />
これをぽちっと押すとダイアログが出て、GEOHEX のレベル(サイズ)と作成範囲の元となるレイヤを設定します。<br />
<br />
レベルは 0 から数字が大きくなるにつれて GEOHEX のサイズは小さくなります。キャプチャの表示範囲でレベル 9 とか 10 にすると QGIS 様が沈黙しやがりますので注意してください。<br />
<br />
作成範囲 (Set extent from:) はレイヤを選択するとそのレイヤを内包する最小の四角形の範囲と重なる GEOHEX がすべて生成されます。リストの最後の "Current Map Window" を選択すると表示されている範囲を六角形が埋め尽くします。やってみよう。<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmN45SzbKE_4IwxWYbmWGnm5sVHzYpLHNpm5lCPj40khJIGqmMbk065tz4Y4UHNY8_DaBIOsqyL0ay9Uz33tZjyYrjmRXOEJkCENBN9WazH8ToBNtUYVt5LRYPs763ovwRVt_tZYOl-_k/s1600/qgeohex1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgmN45SzbKE_4IwxWYbmWGnm5sVHzYpLHNpm5lCPj40khJIGqmMbk065tz4Y4UHNY8_DaBIOsqyL0ay9Uz33tZjyYrjmRXOEJkCENBN9WazH8ToBNtUYVt5LRYPs763ovwRVt_tZYOl-_k/s640/qgeohex1.png" width="640" /></a><br />
<br />
<div style="text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: start;">これでレベル 5 です。次にちょうど地図の中央に見えるポイントレイヤー(室蘭市公開のAED設置場所を示すオープンデータ)を内包する範囲で作成します。レベル 9 で!</span></div>
<div class="separator" style="clear: both; text-align: center;">
<span style="text-align: start;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqhZPoS0g9-KhKERLX_qKwUS_ZlkJV4hNzCymAGpw_tpnOOTIq_L50E5BigKijGBDupNbWXdlM4Z-2yYk5LDTPuVX_FmDfBKYDoGmhauPdWOXMsXCjYx7PbIx-UllKw9Vipwqiu6g32M8/s1600/qgeohex2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="359" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqhZPoS0g9-KhKERLX_qKwUS_ZlkJV4hNzCymAGpw_tpnOOTIq_L50E5BigKijGBDupNbWXdlM4Z-2yYk5LDTPuVX_FmDfBKYDoGmhauPdWOXMsXCjYx7PbIx-UllKw9Vipwqiu6g32M8/s640/qgeohex2.png" width="640" /></a></div>
<br />
<br />
かなり拡大しましたが、それでも細かいw<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisfsTLBmijidrTBE9-_Ov-3SliT6l0XWYDc_eEDnpI-53ZBpO9OJWyXkN-4ojyU8oKJ0gNM0WJx9qmspBtrnCPCq5G5y8oZCDbOh2RxENcCD0EeEjxfMoe-9-YJ0Sl58-bCqiKOFhHbR8/s1600/qgeohex3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisfsTLBmijidrTBE9-_Ov-3SliT6l0XWYDc_eEDnpI-53ZBpO9OJWyXkN-4ojyU8oKJ0gNM0WJx9qmspBtrnCPCq5G5y8oZCDbOh2RxENcCD0EeEjxfMoe-9-YJ0Sl58-bCqiKOFhHbR8/s640/qgeohex3.png" width="640" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqhZPoS0g9-KhKERLX_qKwUS_ZlkJV4hNzCymAGpw_tpnOOTIq_L50E5BigKijGBDupNbWXdlM4Z-2yYk5LDTPuVX_FmDfBKYDoGmhauPdWOXMsXCjYx7PbIx-UllKw9Vipwqiu6g32M8/s1600/qgeohex2.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><br /></a>
<br />
<h2>
Plugin の入手とインストール</h2>
現在この Plugin は QGIS の公式 Plugin レポジトリに登録中ですが、まだ許可?が出ていないので QGIS の Plugin ツールからインストールすることはできません。<br />
そしてやっつけのコードで許可してもらえるのか怖いw<br />
<br />
というわけで使ってみたいという方は以下のリンクからダウンロードしてください。<br />
<a href="https://onedrive.live.com/redir?resid=F359D930199F0E64!1592&authkey=!AFTJ10mLaGzO4Ys&ithint=file%2czip">https://onedrive.live.com/redir?resid=F359D930199F0E64!1592&authkey=!AFTJ10mLaGzO4Ys&ithint=file%2czip</a><br />
<br />
ダウンロードしたら zip ファイル内の「GEOHEX」フォルダを QGIS の Plugin ディレクトリにフォルダごとコピーしてください。<br />
Windows の場合は「C:\Users\ユーザー名\.qgis2\python\plugins」、Unix 系 OS の場合は 「~/.qgis2/python/plugins」ですかね?。<br />
コピー後に QGIS を再起動すればインストール完了です。<br />
<br />
<h2>
その他注意事項など</h2>
<h3>
GEOHEX レイヤーの保存先</h3>
<div>
作成された GEOHEX レイヤーはメモリ上に保存されます。なので、広範囲で細かい HEX を発生せるとメモリを圧迫するので気を付けてください。</div>
<div>
また、メモリ上に保存されていますので QGIS を終了すると消えます。保存したい場合は Shape File や sqlite あたりにエクスポートしてください。<br />
<br /></div>
<h3>
GEOHEX レイヤーの空間参照</h3>
<div>
そもそも GEOHEX は Web Mercator 前提の仕様ですが、ミクロなスケールでは他の座標系でも使えると思っています。なので現状この Plugin では範囲指定に使用したレイヤーの空間参照を引き継ぎます。</div>
<div>
"Current Map Window" を設定した場合には QGIS で現在表示されている地図の空間参照を引き継ぎます。</div>
<h3>
無謀なレベル設定はやめよう</h3>
<div>
えっと、たとえば地理院地図を表示して、Extent の対象に選んでしまうと全世界を埋める GEOHEX が作成されます。この時にレベル 0 とかならまだしも 10 とかやっちゃうと高確率でレスポンスが途絶えます。マシンスペックにもよりますが。</div>
警告とか出さずに愚直に六角形を紡いでいく真面目な Plugin なのでユーザー様が気を付けていただければ幸いです。<br />
<br />
<h3>
まだ beta1 です</h3>
<div>
せっかく作ったので、拡張したりバグをつぶしたりしていく予定です。</div>
<div>
直近の課題としては、GEOHEX の最新バージョンに対応していないので早急に対応したいです。ほとんど変わらないと思いますが、-180 度をまたぐ HEX でのコードの扱いが変わっているようでした。</div>
<br />
<h2>
まとめ</h2>
<div>
GEOHEX は本当にかっこいいし便利だとおもっているので、これからいろいろ実利用を検討していきたいなと思っています。</div>
<div>
<br /></div>
<div>
かっちょえー UI の地図アプリに表示された GEOHEX をぽちっとタップするとドローンがそこに飛んでいくとか!</div>
<br />
オープンデータの可視化とかにも使えそうですよね。<br />
<br />
以上今年の年末の一番大事な仕事を終えます。<br />
次は yuskesuzki@github さんです!PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com2tag:blogger.com,1999:blog-6702387215527266539.post-5019942579272451832014-12-13T06:02:00.002+09:002014-12-13T06:59:46.698+09:00PostgreSQL(PostGIS) でベクトルタイルを作る決意を固めたものの挫折しそうこの記事は <a href="http://qiita.com/advent-calendar/2014/foss4goss4g" target="_blank">FOSS4G Advent Calendar 2014</a> の 12/13 (土) の記事です。<br />
<br />
さて、ここ1年色々環境が変化したわけで、あまり FOSS4G 関連の場に出ていけてないそんな私ですが、今年は久しぶりに書きたいと思います。<br />
ブログもうやってなかったんですが、このために作りました。来年また使うと思います。<br />
<br />
ベクトルタイルです。ベクトルタイルですってよ。<br />
新卒で某オレンジ色のWebで地図な会社に入って、退職するまでずっと地図画像作ったり、配信していたわけですが、ベクトルタイルに関してはちょっと距離を置いていたわけです。<br />
数学的な素養がないとか、クライアントサイドでの描画を行なうための某フリーダムな言語およびデザイン等にあまり明るくないなど色々理由はあるわけですが。<br />
<br />
普段タイルタイル言ってるだけではだめだなーって。そう思ったのでベクトルタイルを作ろうと思ったんです。SQLで(オカシイ)。<br />
<br />
趣味でいじっている地理空間データはすべて PostgreSQL (PostGIS) に格納しているんですが、RDBMS 内でデータ管理からタイル生成、隙をみてタイル配信までできやしないかとふと思ったのでやってみたら挫折した記録をお届けしたいと思います。<br />
特に PostgreSQL の JSON 関連機能が最近がんがん実装されてきたりしているので、色々夢が広がったんでしょうね、数時間前の私は。<br />
<br />
ちなみに RDBMS は前職でも触ってたし、現職では RDBMS 担当なわけですが、どちらかというと DBA 的な部分の仕事が多くて実は SQL 力が低いです。<br />
<br />
すごい頑張ったんですが、結果的にはタイルの境界線を発生させる関数しか現状できていません。以下です。<br />
<br />
<script src="https://gist.github.com/pemugi/a05f0ecc846eb99d2942.js"></script><br />
引数に zoom レベルをとります。RECORD 型で zoom レベルと LineString を返します。使い方はこんな感じ。<br />
<br />
<div class="p1">
<span class="s1"><code>insert into tileline (zoom, geom) select zoom, geom from create_tileline(16) as (zoom integer, geom geometry);</code></span><br />
<span class="s1"><code><br /></code></span></div>
<div class="p1">
QGIS で表示するとこんな感じ。</div>
<div class="p1">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlYfWwumMdsLrsHPR2CcYbe1k1fL9YRD7VphYCkbn0jjLKVctasLMBtxofeLvoaAn4ygMQ6xSw6xfcty5Ofm1KLUbxt-dm0DmznqUTjNRf3Bpiy51hDv8eGOx_jWVyYL-fJJGoNDAswAE/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.35.59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlYfWwumMdsLrsHPR2CcYbe1k1fL9YRD7VphYCkbn0jjLKVctasLMBtxofeLvoaAn4ygMQ6xSw6xfcty5Ofm1KLUbxt-dm0DmznqUTjNRf3Bpiy51hDv8eGOx_jWVyYL-fJJGoNDAswAE/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.35.59.png" height="202" width="320" /></a></div>
<br /></div>
zoom レベルにはそのラインが存在する最大レベルが入ります。この値によって以下のような条件を与えれば、zoom レベルでの使い分けが可能になります。<br />
<code>select * from tileline where zoom <= 10</code><br />
上の画像は zoom レベル16のラインですが、QGISで zoom <= 13 のフィルタをかけると↓になります。<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS0TodpLXr7Frf0lr_zwpuStIRwSODvWuZhWkvU9955N8mlv8zY4qijafGAFWWlz1vZAAUZYi0JuXIOINC_eQxTTafjhwlLllO4iYhdmYph3vrxtZTJp08xdZsxsl84G_n87R3p3xGODM/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.49.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhS0TodpLXr7Frf0lr_zwpuStIRwSODvWuZhWkvU9955N8mlv8zY4qijafGAFWWlz1vZAAUZYi0JuXIOINC_eQxTTafjhwlLllO4iYhdmYph3vrxtZTJp08xdZsxsl84G_n87R3p3xGODM/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.49.14.png" height="202" width="320" /></a></div>
<br />
後は、対象のフィーチャと重なるタイルのラインを Geometry Collection か MultiLineString かなんかにして ST_Split でタイル化完了!とか思ってたんですが、ST_Split が LineString しか取れないらしいです...orz<br />
なんで MultiLine とかじゃないとダメかというと、切断に使うタイルのラインが複数ある場合一回で切らないと処理が超面倒くさそうというかこの短時間では実装できなさそうだったというだけなんですが...orz<br />
MultiLineString を ST_Union する手もあるんですが、処理時間やTempな領域とはいえ一時的にかなりリソースを食いそうだったんでやめました。<br />
やりたかったイメージ↓<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4bW4HlkEGd1FPURXnrm72l5lnFWO26qlmK8uoFdPtasnLni2UciLJDKN-qrKK5RH9LNJ06PKpKPjIupqf4KnbzeR7h8Hbw14-dJq7JiAQiwF0zdOgdACpqx59SHJGGTWqN63ZG3rMXPM/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.43.20.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4bW4HlkEGd1FPURXnrm72l5lnFWO26qlmK8uoFdPtasnLni2UciLJDKN-qrKK5RH9LNJ06PKpKPjIupqf4KnbzeR7h8Hbw14-dJq7JiAQiwF0zdOgdACpqx59SHJGGTWqN63ZG3rMXPM/s1600/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2014-12-13+6.43.20.png" height="202" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">ここで Split!!!</td></tr>
</tbody></table>
というわけでかなり道半ばですが、SQL力向上のためにも継続してやっていきたいと思います。<br />
来年は OPEN KWASAKI で地元貢献目標で頑張ります。PEmugihttp://www.blogger.com/profile/05281068638357018019noreply@blogger.com3