karaGR's memo

FOSS4G R python さんぽ

FOSS4G Hokkaido mini #01 で「FOSS4Gで気候予測データもかんたん!」というネタを発表してきました。

お久しぶりです。(5年ぶり?)
KaraGRです。

コロナが落ち着いてきて、先週土曜日にチョー久しぶりにFOSS4G Hokkaidoのオフラインイベント「FOSS4G Hokkaido mini #01」が開催されました。

半分以上LTのつもりで「FOSS4Gで気候予測データセットもかんたん!」というネタを発表してきました。

当日のスライドをUPします。
Let’s Try!! (試してみてくださいね~)

P1
P2
P3
P4
P5
P6
P7
P8
P9
P10


ちなみに"FOSS4Gでチョー簡単”はこれです(ボリュームに注意)。なつかし~。

www.youtube.com

JpnStdMeshImportプラグインをQGIS3.0で動くように修正しました

どもkaraGRです。

QGIS3.0がリリースされてしばらくたちました。
これまで作りっぱなしで放置していたプラグインも対応せねばということで、
まずはJpnStdMeshImportプラグインをQGIS3.0で動くようにしました。

https://github.com/karaGR/JpnStdMeshImport3.git

試してみてくださいね~~

______________________________________

QGIS3.0ではプラグインのインストールフォルダがかわっています。
C:\Users\ユーザー名\AppData\Roaming\QGIS\QGIS3\profiles\default\python\plugins


あと、プラグインの管理WidgetでZipからインストールできるらしいです。

→Zip化してこれを使えばいいのか??

______________________________________

以下修正作業のメモ
・PyQGISのアップデートによる修正
 →QgsMapLayerRegistryはQgsProjectに統合されたらしい

from qgis.core import QgsVectorLayer,QgsProject

...
def load_wkt_csv(self):
  ...
  if self.vlayer.isValid():
    QgsProject.instance().addMapLayer( self.vlayer )

・Python3.6へ移行したことによる修正
 →同じフォルダにあるモジュールをインポートするには、"."をつけなけばならないらしい。

from .mesh_wkt import mesh_wkt

→numpyのgenfromtxtでdtype=np.strが通らなくなったので、dtype="S20"に修正

class myFileDialog(QgsEncodingFileDialog):
  ...
  def accept(self):
     ...
     try:
       dat_str = np.genfromtxt(self.filename,delimiter=",",dtype="S20")
  ...

・PyQt5に移行したことによる修正
→モジュールのインポート行をPyQt4→PyQt5に変更
 QDialogとかUI系のクラスはQtGuiからQtWidgetsに移った。

from PyQt5.QtWidgets import QAction, QDialog
from PyQt5.QtWidgets import QVBoxLayout,QHBoxLayout,QGridLayout
from PyQt5.QtWidgets import QLabel,QDialogButtonBox,QCheckBox
from PyQt5.QtWidgets import QLineEdit,QPushButton,QSpinBox,QComboBox
from PyQt5.QtWidgets import QMessageBox, QTableView
from PyQt5.QtGui import QStandardItemModel,QStandardItem

→QUrlのメンバ関数だったaddQueryItemが廃止され,QUrlQueryというクラスが導入された。
 QUrlQuery()のインスタンスにクエリアイテムを入れてから、QUrlのインスタンスに登録

from PyQt5.QtCore import QUrl,QUrlQuery

def load_wkt_csv(self):
    url = QUrl.fromLocalFile(self.outfile_qstr)
    q = QUrlQuery()
    q.addQueryItem("type","csv")
    q.addQueryItem("delimiter",",")
    q.addQueryItem("wktField","1")
    q.addQueryItem("encoding",self.EF_dia.encoding())
    ・・・
    url.setQuery(q)

グループ化したレイヤの紙芝居プラグインを作りました

ども、karaGRです。

FOSS4G Advent Calendar 2017 13日目の記事です。
https://qiita.com/advent-calendar/2017/foss4g


これまでの”標準地域メッシュ”はネタ切れ&凝ったことをしている時間が取れず・・・
ということで、ほんのちょっとだけQGISを便利にできればと、
グループ化したレイヤの紙芝居プラグインを作りました。
https://github.com/karaGR/GroupLayerSlideShow

使い方

紙芝居(スライドショー)したいレイヤをグループ化します。

ここでは国土数値情報からDLした北海道のDID人口集中地区データを使っています。

"GroupLayerSlideShow"プラグインをインストールしたQGISで、
"プラグイン"メニュー→"レイヤスライドショー"の
"レイヤスライドショー"を呼び出すと次の窓が開きます

紙芝居するグループを選択し、”SET”をクリック。

表示される窓のボタンをクリックすることで、表示レイヤを切り替えられます。

"Top":一番上のレイヤを表示
"Up":1つ上のレイヤを表示
”Down":1つ下のレイヤを表示
”Bottom":一番下のレイヤを表示

処理について

レイヤグループの排他的選択機能を利用して、単純に表示を入れ替えているだけです・・・

QgsLegendInterface.groups()でロードされているグループのリストを取得しておいて、

def run(self):   
    myLegendInterface = self.iface.legendInterface()              
    myGroupList = myLegendInterface.groups()

QCombobox.addItems()でコンボボックスに設定。

self.CoB_group.addItems(groupList)

グループとレイヤの関連性リストをQgsLegendInterface.groupLayerRelationship()で取得。
そこから内包表記を使ってレイヤ名のリストを取得。
選択したグループをQgsLayerTreeGroup.setIsMutuallyExclusive(True)で排他的に設定し、

def setButtonAction(self):
      groupName = self.CoB_group.currentText()
      layerNameList = [mylist[1] for mylist in QgsLegendInterface.groupLayerRelationship() if mylist[0] == groupName][0]
        
      if len(layerNameList) > 1:
          self.myLayerTreeView.setCurrentLayer(QgsMapLayerRegistry.instance().mapLayer(layerNameList[0]))
          self.myLayerTreeView.currentGroupNode().setIsMutuallyExclusive(True)

QgsLegendInterface.setLayerVisible(QgsMapLayerRegistry.mapLayer(レイヤ名))で、表示することにより、排他的に切り替えています。

def moveTop(self):
    self.myLegendInterface.setLayerVisible(QgsMapLayerRegistry.instance().mapLayer(self.layerNameList[0]),True)
    self.layerId = 0
        
def moveBottom(self):
    self.myLegendInterface.setLayerVisible(QgsMapLayerRegistry.instance().mapLayer(self.layerNameList[-1]),True)
    self.layerId = len(self.layerNameList)-1
        
def moveDown(self):
    self.resetLayerId()
    if self.layerId < len(self.layerNameList)-1:
        self.layerId += 1
        self.myLegendInterface.setLayerVisible(QgsMapLayerRegistry.instance().mapLayer(self.layerNameList[self.layerId]),True)
            
def moveUp(self):
    self.resetLayerId()
    if self.layerId > 0:
        self.layerId -= 1
        self.myLegendInterface.setLayerVisible(QgsMapLayerRegistry.instance().mapLayer(self.layerNameList[self.layerId]),True)             

おわりに

UbuntuのQGIS2.14.21環境以外ではテストしてません。
他の環境でのテスト&修正は追々やります。スミマセン。
→昨年も同じことを書いた・・・成長してない

もうじきQGIS3もでるようですが、
とりあえずいじってみてくださいね〜

標準地域メッシュCSVをQGISに直接追加するプラグインを作りました

ども、karaGRです。

FOSS4G Advent Calendar 2016 8日目の記事です。
http://qiita.com/advent-calendar/2016/foss4g

昨年に続き標準地域メッシュネタで。
メッシュコードの記入されているCSVQGISに直接追加するプラグインを作りました。
GitHub - karaGR/JpnStdMeshImport

使い方

まずは標準地域メッシュコードの入ったcsvを用意します。
ここではe-statの地図で見る統計(統計GIS) 政府統計の総合窓口 GJ01000001から、
"平成22年国勢調査国勢調査世界測地系250mメッシュ) 2010/10/01"の
"男女別人口総数及び世帯総数(東京都特別区部、政令指定都市及び県庁所在地)"の
1次メッシュコード:6441のデータをダウンロードしました。


"JpnStdMeshImport"プラグインをインストールしたQGISで、
"プラグイン"メニュー→"標準地域メッシュツール"の
"標準地域メッシュレイヤの追加"を呼び出すと次の窓が開きます

"参照"をクリックしてファイル選択窓を開き,
追加するCSVを選択、文字のエンコードを指定してファイルを開きます。

csvの1~10行が表示されます。

レイヤ名、スキップするヘッダ行数、フィールド名の有無を設定、

メッシュコード列、地域メッシュ種別を選択、
 

測地系を選択、

すべて設定したら、OKをクリック

レイヤとして追加されました!

後はこれを加工して好きな形式で保存するだけです。

いちをー確認。FOSS4G 2016 Hokkaidoの会場付近を拡大すると、

250mメッシュが生成されてます。

追記:そーいえば来週、同じ会場でOFF4G Hokkaidoが開催されるそうですよ。
   会場の250mメッシュコードは "6441436042" になります。
off4ghokkaido16.peatix.com


処理について

このプラグインでは、
・元csvのメッシュコードをWKT (Well-known text)に変換し
・元csvwktを追加した****_wkt.csvを作成
QGISの"デリミッドテキストレイヤの追加"で****_wkt.csvを読み込む
という処理をしています。

途中、メッシュコードのチェックとして
・数字以外の文字チェック
・桁数チェック
重複チェック
の3つを入れてます。

コードの解説は・・・追記します(年内には、、、なんとか・・)

おわりに

"とりあえず動ぐ"ところにたどり着いたのが昨日の夜だったので、
UbuntuのQGIS2.14.9環境以外ではテストしてません。
・メッシュコードのそれぞれの数字のチェックは実装できてません。
  →たとえば、2次メッシュコードの5-6桁目に8以上の数字が含まれているとか・・・
   その場合、異なる場所にメッシュが生成されるハズです。
他の環境でのテスト&修正は追々やります。スミマセン。

とりあえずいじってみてくださいね〜

QGIS2.16でTileLayerPluginが動かないぞぉ

どもkaraGRです(8ヶ月ぶり・・)

つい先日QGIS2.16がリリースされました。
みなさんインストールしました?

私のubuntu環境では半自動でUpdateし(やがり)ました(^^;)
で、TileLayerPluginを走らせようとしたところ、こんなエラーが
追記(7/19):TileLayerPluginのVersion 0.80で、バグフィックスされました\(^o^)/
プラグインを更新することでエラーは出ません。


むむむ。u'\xf8'がasciiではねられている?
これなに?ということでipythonで確認。

In [1]: print u'\xf8'
ø

øøøなんて読む??
  ※そーいやぁBOØWYのØだ。読み方はわからないままだが・・・
でもさっき見た気が・・右上!

QGISについて”にもある!

ぐぬぅぅ、ヴァージョン名にutfのøがはいっているのね。
ということで、~/.qgis2/python/plugins/TileLayerPlugin/tilelayer.py"の97行目、

self.userAgent = "QGIS/{0} TileLayerPlugin/{1}".format(QGis.QGIS_VERSION, self.plugin.VERSION)  

self.userAgent = u"QGIS/{0} TileLayerPlugin/{1}".format(QGis.QGIS_VERSION, self.plugin.VERSION)  

に書き換えたら、

動きました!
めでたしめでたし。

あくまでもPluginがUpdateされるまでの応急処置です・・・
どおぉぉ〜しても今すぐQGIS2.16でTileLayerPluginを使いたい人は試してみてくださいね。

WinやMacでは検証してません、あしからず。

補足:"標準地域メッシュ表示プラグイン"のインストール

karaGRです。

FOSS4G Advent Calendar 2015 - Qiitaの12/4のエントリー、
"標準地域メッシュ表示プラグイン"つくりました。 - karaGR's memoの補足です。

紹介した“標準地域メッシュ表示プラグイン”、公式リポジトリへのアップ予定は立っていません。(日本国内でしか使う意味はないし・・)

「じゃあどうやって使うんだゴラァ」という声が聞こえたような気がするので、インストール方法を説明します。(昼休みに慌てて書いているので、誤字脱字は勘弁してね)
まず、TileLayerPluginをインストールしておきます。
プラグインプラグインの管理とインストール

“全ての”タブを選択して検索窓に"TileLayer"と入力

TileLayerPluginを選択して“プラグインをインストール”し、ウィンドウを閉じます。
ここでQGISもいったん終了しておきます。

次に、GutHubの“標準地域メッシュ表示プラグイン”置き場にアクセスします。(リポジトリともいう・・・)
GitHub - karaGR/JpnStdIndexMesh
"Download Zip"をクリックしてソースをDLます。

ゲットしたJpnStdIndexMesh-master.zipを、QGISのユーザープラグインフォルダに展開します。
WindowsならC:¥Users¥(あなたのユーザー名)¥.qgis2¥python¥pluginsです

QGISを立ち上げ、プラグイン管理ウィンドウの“インストール済み”タブを選択します。

“標準地域メッシュインデックス表示ツール”にチェックを入れればOK。

プラグインメニューから
標準地域メッシュツール→インデックスマップの表示でメッシュマップが表示されるハズです。

できました?


何とか昼休み中に書き終わった!! フウゥ~

スクショに“シカツール”とか“狩猟者情報表示”とか聞きなれないプラグインが見える方へ、
それはあなたの目の錯覚だぁっ!!!!ということにしておいてください。
よろしくお願いします。

"標準地域メッシュ表示プラグイン"つくりました。

ども。FOSS4Gアドべ初参加のkaraGRです。よろしくお願いします。

半年前、QGISHackFest2015Hokkaido会場の隅っこで開発を始めた"標準地域メッシュ表示プラグイン"、
とりあえず動くものが出来ました!ということでこの機会にお披露目します。

スクショはこんな感じ。
日本全図
1次メッシュ
2次メッシュ
3次メッシュ

プログラムはGitHubにあげてあります。(実行にはTileLayerPluginが必要です)
karaGR/JpnStdIndexMesh · GitHub

エラー処理とか実装してません&ドキュメントも未整備です・・
プルリク大歓迎!ダメ出しお待ちしております。

プラグイン開発の基本については、以下のページを参考にさせていただきました。
QGISでプラグインを作成する その1 - waigani's diary
QGIS Python コトハジメ : 真田情報技術工務店

泥縄ですが・・インストール方法を書きました。
補足:"標準地域メッシュ表示プラグイン"のインストール - karaGR's memo



おまけ:Pythonコンソールでのレシピ

実際のコーディングは、Pythonコンソールで動作確認しながら進めています。
(QGIS2.12スタンドアローン版のmatplotlibは未だ1.2.1だったりする..orz)

以下、このプラグインの動作確認用スクリプトと解説です。
Pythonコンソールにコピペで動くハズなので、試してみてくださいね。


まずはサブMapCanvasを作り、メインMapCanvasの表示範囲と同期させます。

真っ白のサブMapCanvasが表示されます
これに地理院タイルを載せます。

TileLayerPluginのREADME.mdに記載されている方法を使います。

このレイヤをMapCanvasLayerに変換し、リスト化してサブMapCanvasにセットします。

地理院タイルが表示されます。


ここから本題の標準地域メッシュの作成。
以下のページを参考にさせていただきました。
月の杜工房 - QGIS API メモリプロバイダ

まずはメモリプロバイダを用いてメッシュを描画するレイヤを作成します。

このレイヤにメッシュを描画するための関数を作成します。

緯度経度からそのポイントが入っているメッシュコードを返す関数

メインMapCanvasの表示範囲に含まれるメッシュの上下左右を返す関数

表示範囲のなかで1次、2次、3次メッシュを描画する関数

表示範囲のスケールに合わせてメッシュを描画する関数

メッシュポリゴンレイヤをmesh_canvasにセットし、メインMapCanvasのトリガーに描画関数を紐付けます。

メッシュが表示されます

しーたすたす(コンパイラ) ⇒ ぱいてょん(インタプリタ)
ハードルちょと下がった!!・・・かな?

今年もあと1ヶ月を切りましたぁぁぁ....あぁ⤵
がんばっていきましょ~

FOSS4G Advent Calendar 2015  12/4のエントリー記事でした。
FOSS4G Advent Calendar 2015 - Qiita
2個目もあるよ
FOSS4G 二個目だよ Advent Calendar 2015 - Qiita