QGISで、レイヤの地物数を取得するスクリプトは下記のように記述します。
1 2 |
layer = iface.activeLayer() layer.featureCount() |
実行すると選択されているレイヤの地物数がコンソールに表示されます。
地物数を取得の場合:
1 |
layer.featureCount() |
- 参考文献
QGISで、レイヤの地物数を取得するスクリプトは下記のように記述します。
1 2 |
layer = iface.activeLayer() layer.featureCount() |
実行すると選択されているレイヤの地物数がコンソールに表示されます。
地物数を取得の場合:
1 |
layer.featureCount() |
QGISで、レイヤの編集を保存するスクリプトは下記のように記述します。
1 2 3 4 5 6 |
legend = iface.legendInterface() layers = legend.layers() legend.setCurrentLayer(layers[0]) layer = iface.activeLayer() layer.commitChanges() |
実行すると1番目のレイヤの「sample01」の編集を保存します。
レイヤ編集を保存する:
1 |
layer.commitChanges() |
今日は、サーバとしてではなくアプリケーションに組み込んで利用される軽量のデータベース「SQLite」を空間データベースとして扱う拡張機能の「SpatiaLite」を紹介したいと思います。
今までSpatiaLiteは名前を知っている程度でどんなものなのか知りませんでした。サーバーにインストールしなくていい手軽さに興味があって調べてみました。
まずSpatiaLiteをダウンロードをします。「MS Windows binaries」の「current stable version」から最新版をダウンロードします。
今回は64bitを選択します。その中の「spatialite_gui-4.3.0-win-amd64.7z」をダウンロードします。
ダウンロードするファイルの、「7z」という拡張子の圧縮ファイルは特殊なので普通の解凍ソフトでは対応していない場合があります。その場合は下記の「7-Zip」を利用して解凍します。
解凍すると「spatialite_gui.exe」ができるので実行します。exeを実行なのでインストールは不要です。
実行するとまず新規にDBを作成します。
DBを作成後、「Load Shapefile」を実行してインポートしたいShapeを選択します。設定はSRID:4326 Encoding:UTF-8を選択しました。
インポートできたら「Edit table rows」でレコードが確認できます。
QGISで表示できるか確認してみます。
レイヤの追加 → SpatiaLiteレイヤの追加
新規 → DB選択 → 接続
接続するとレイヤ内容が表示されるので選択して追加
レイヤの地物が表示されました。
QGISで結構簡単に表示することができました。SpatiaLiteはインストールしなくていいので手軽です。なんだか色々なツールと連携して使えそうな気がしてきました。連携する方法や連携する場合、フロントエンドかバックエンドのどちらで処理すべきか色々と疑問はあるんですがそれについての情報が少ないようです。勉強する必要がありそうです。
SpatiaLite
OSGeo-Live 8.5 Documentation
地図とかの空間情報をSQLiteに格納するSpatiaLiteを使用してみる
日付 | 曜日 | 歩数 |
---|---|---|
2015.07.19 | 日 | 10975 |
2015.07.20 | 月 | 3817 |
2015.07.21 | 火 | 10104 |
2015.07.22 | 水 | 5475 |
2015.07.23 | 木 | 6361 |
2015.07.24 | 金 | 4324 |
2015.07.25 | 土 | 5636 |
合計 |
---|
46692 |
QGISで、レイヤを編集可能にするスクリプトは下記のように記述します。
1 2 3 4 5 6 |
legend = iface.legendInterface() layers = legend.layers() legend.setCurrentLayer(layers[0]) layer = iface.activeLayer() layer.startEditing() |
実行すると1番目のレイヤの「sample01」が編集可能になります。
レイヤ編集可能にする:
1 |
layer.startEditing() |
QGISで、レイヤを表示・非表示するスクリプトは下記のように記述します。
1 2 3 4 |
legend = iface.legendInterface() layers = legend.layers() legend.setLayerVisible(layers[0], False) |
実行すると1番目のレイヤの「sample01」が非表示になります。
表示にする場合:
1 |
legend.setLayerVisible(layers[1], True) |
2番目のレイヤが表示になります。
QGISで、選択レイヤを切替えるスクリプトは下記のように記述します。
1 2 3 4 |
legend = iface.legendInterface() layers = legend.layers() legend.setCurrentLayer(layers[0]) |
実行すると選択レイヤが1番目の「sample01」になります。
選択レイヤを変更する場合:
1 |
legend.setCurrentLayer(layers[1]) |
2番目のレイヤが選択レイヤになります。
QGISで、選択されているレイヤ名を変更するスクリプトは下記のように記述します。
1 2 |
layer = iface.activeLayer() layer.setLayerName(u"サンプル01") |
実行すると現在選択されている「sample01」のレイヤ名が「サンプル01」に変更されます。
違うレイヤ名に変更したい場合:
1 |
layer.setLayerName(u"変更レイヤ") |
QGISで、選択されているレイヤ名を取得するスクリプトは下記のように記述します。
1 2 |
layer = iface.activeLayer().name() print layer + u" レイヤが選択されています。" |
実行すると現在選択されている「sample01」のレイヤ名を取得します。
コンソールに「sample01 レイヤが選択されています。」と表示されます。
QGISで自動化などのスクリプト処理をするには、以前紹介した「QGIS #006 – プラグイン作成」がありますが、その場でおこなうようなもっと手軽にスクリプト処理をするには「Pythonコンソール」を利用します。
実行すると「Pythonコンソール」が表示されます。ここにPythonのコードを記述していきます。ちなみに左のアイコンは上から、「コンソールのクリア」・「クラスのインポート」・「コマンドの実行」・「エディタの表示」・「設定」・「ヘルプ」になっています。
下記内容でコンソールでスクリプトを実行してみます。
1 2 |
layerall = str(iface.mapCanvas().layerCount()) print layerall |
実行すると現在のプロジェクトに読み込んでいるレイヤ数がコンソールに表示されます。
次に左のアイコンの「エディタの表示」を実行すると、右側にエディタが表示されます。エディタにコードを記述するとPythonのファイルとして保存することができます。
エディッタに先ほどと同じコードを保存して「スクリプト実行」を実行します。
実行すると現在のプロジェクトに読み込んでいるレイヤ数がコンソールに表示されます。
このように、コンソールとエディタを使うことによりスクリプト処理が実行できるようになります。プラグインと使い分けて利用すると作業が効率化できそうです。
日付 | 曜日 | 歩数 |
---|---|---|
2015.07.12 | 日 | 13090 |
2015.07.13 | 月 | 12604 |
2015.07.14 | 火 | 4663 |
2015.07.15 | 水 | 5467 |
2015.07.16 | 木 | 4877 |
2015.07.17 | 金 | 7994 |
2015.07.18 | 土 | 7345 |
合計 |
---|
56040 |
プラグインで複数条件の処理を指定するためにはダイアログを作成する必要があります。ダイアログを作成するには下記の6ファイルが必要になります。
QGISのプラグインでダイアログを作成するためには下記方法でおこないます。
①ダイアログの作成
まず、QGISでダイアログを作成するためには「Qt」を利用します。以前紹介した「Python #001 – PortablePython」を利用して「Qt」を起動します。
PortablePythonの中の「QtDesigner-Portable」を実行します。
QtDesignerを利用してボタンやラベルを任意に配置します。今回はプロジェクト内にあるレイヤ数を表示するプラグインを作成します。
任意のダイアログを作成したら名前を付けて保存。拡張子が「.ui」のファイルを作成します。今回はファイル名を「Dialog01.ui」とします。
②ダイアログの変換
Qtで作成した「Dialog01.ui」を「Dialog01.py」に変換します。
「PortablePython」で変換しようと試したところ変換に必要な「pyuic4.bat」がフォルダ内に存在しない。。。色々と調べてなんとか「pyuic4.bat」を作成する方法を見つけました。
まず、「pyuic4.bat」を下記内容で「Dialog01.ui」と同じディレクトリに作成します。
※ドライブ名が違う場合は書き換えてください。今回はGドライブとしました。
1 |
@"G:\PortablePython\App\python" "G:\PortablePython\App\pyuic.py" %1 %2 %3 %4 %5 %6 %7 %8 %9 |
次に、コマンドプロンプトを実行 → 「Dialog01.ui」があるディレクトリまで移動 → 「pyuic4 Dialog01.py -o Dialog01.ui」を実行。「Dialog01.py」が作成されます。
しかし、プラグイン作成に非常に参考になる「QGISプログラミング入門」を読んでいたところもっと簡単に変換できることが判明しました。最初から確認しておけばよかった。。。QGISをインストールした際に「OSGeo4W」も入れていると下記方法でも変換可能です。
まず、すべてのプログラム → QGISフォルダ → OSGeo4Wを実行
次に、「Dialog01.ui」があるディレクトリまで移動 → 「pyuic4 -o Dialog01.py Dialog01.ui」を実行。「Dialog01.py」が作成されます。
③プラグインの作成
ここでは主に「dialog.py」を新規作成するのと、「sample.py」の一部を変更します。変換された「Dialog01.py」の記述は変更しないでそのまま利用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# -*- coding: utf-8 -*- #--------------------------------------------------------------------------- # Name: Sample Plugin03 # Purpose: レイヤ数表示プラグイン # # Author: dayjournal # # Created: 15/07/2015 # Copyright: (c) dayjournal 2015 #--------------------------------------------------------------------------- def classFactory(iface): from sample import SamplePlugin03 return SamplePlugin03(iface) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * import os class SamplePlugin03: def __init__(self, iface): self.iface = iface def initGui(self): path = os.path.dirname(__file__) + u'\icon.png' self.action = QAction(QIcon(path), "Layer Count", self.iface.mainWindow()) QObject.connect(self.action, SIGNAL("triggered()"), self.run) self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("Sample Plugin03", self.action) def unload(self): self.iface.removePluginMenu("Sample Plugin03", self.action) self.iface.removeToolBarIcon(self.action) def run(self): from dialog import Dialog dlg = Dialog(self.iface) dlg.show() dlg.exec_() |
ダイアログを読み込む
1 |
from dialog import Dialog |
ダイアログを表示
1 2 3 |
dlg = Dialog(self.iface) dlg.show() dlg.exec_() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[general] name = Sample Plugin03 description = レイヤ数表示プラグイン about = レイヤ数を表示するプラグインを作成しました。 category = sample tags = sample,plugin homepage=https://github.com/ repository=https://github.com/ author = dayjournal email = dayjournal@gmail.com version = 1.0 changelog = 1.0 - 初版作成 icon=icon.png qgisMinimumVersion = 2.8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'Dialog01.ui' # # Created: Wed Jul 15 20:35:21 2015 # by: PyQt4 UI code generator 4.10.1 # # WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 except AttributeError: def _fromUtf8(s): return s try: _encoding = QtGui.QApplication.UnicodeUTF8 def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): return QtGui.QApplication.translate(context, text, disambig) class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(184, 141) self.pushButton = QtGui.QPushButton(Dialog) self.pushButton.setGeometry(QtCore.QRect(40, 80, 101, 41)) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.label = QtGui.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(35, 20, 111, 41)) font = QtGui.QFont() font.setPointSize(12) self.label.setFont(font) self.label.setLayoutDirection(QtCore.Qt.LeftToRight) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName(_fromUtf8("label")) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) self.pushButton.setText(_translate("Dialog", "実行", None)) self.label.setText(_translate("Dialog", "Layer数の表示", None)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * from Dialog01 import Ui_Dialog class Dialog(QDialog): def __init__(self, iface): QDialog.__init__(self) self.iface = iface self.ui = Ui_Dialog() self.ui.setupUi(self) QObject.connect(self.ui.pushButton, SIGNAL("clicked()"), self.PushButton) def PushButton(self): layerall = str(self.iface.mapCanvas().layerCount()) self.ui.label.setText(layerall) |
Qt,QGISの機能を読み込む
1 2 3 |
from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * |
ダイアログを読み込む
1 |
from Dialog01 import Ui_Dialog |
クラスを宣言
1 |
class Dialog(QDialog): |
QGISのインターフェイスを読み込む
1 2 3 4 5 |
def __init__(self, iface): QDialog.__init__(self) self.iface = iface self.ui = Ui_Dialog() self.ui.setupUi(self) |
実行ボタンをクリックでdef PushButton(self):を実行
1 |
QObject.connect(self.ui.pushButton, SIGNAL("clicked()"), self.PushButton) |
実行ボタンを押した時
1 |
def PushButton(self): |
ラベルにプロジェクトのレイヤ数を表示
1 2 |
layerall = str(self.iface.mapCanvas().layerCount()) self.ui.label.setText(layerall) |
プラグインを「プラグイン管理」で利用可にすると下記のようにプラグインを実行できるようになります。
プラグインを実行するとダイアログが表示されます。
実行ボタンを押すと、プロジェクト内の全レイヤ数がラベルに表示されます。
ダイアログ設定が含まれてくると、全体の繋がりや仕組みがいまいちピンとこない部分があります。QtとPythonについて詳しく勉強する必要がありそうです。
以前に「Leaflet #009 – 現在位置の表示」でHTML5の「Geolocation API」を利用して現在位置を表示する方法を記載しました。今回はLeafletのAPIを利用して現在位置を表示する方法を記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<html lang="ja"> <head> <meta charset="UTF-8"> <title>Leaflet Sample</title> <script src="./Library/leaflet-0.7.3/leaflet.js"></script> <link href="./Library/leaflet-0.7.3/leaflet.css" rel="stylesheet"/> <script src="http://maps.google.com/maps/api/js?sensor=false&region=JP"></script> <script src="./plugin/leaflet-plugins-master/layer/tile/Google.js"></script> <link href="./css/stylesheet.css" rel="stylesheet"/> </head> <body> <div id="map"></div> <script src="./js/script.js"></script> </body> </html> |
1 2 3 4 5 6 7 8 9 10 |
html, body { height: 100%; padding: 0; margin: 0; } #map { z-index: 0; height: 100%; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
var t_std = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png', { attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>" }); var t_pale = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png', { attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>" }); var t_ort = new L.tileLayer('http://cyberjapandata.gsi.go.jp/xyz/ort/{z}/{x}/{y}.jpg', { attribution: "<a href='http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html' target='_blank'>国土地理院</a>" }); var o_std = new L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors' }); var g_roadmap = new L.Google('ROADMAP'); var g_satellite = new L.Google('SATELLITE'); var g_hybrid = new L.Google('HYBRID'); var map = L.map('map', { zoomControl: false, layers: [t_pale] }); var mapMarker; var comment; map.locate({setView: true, maxZoom: 14}); function onLocationFound(e) { 'use strict'; mapMarker = L.marker(e.latlng).addTo(map); comment = 'いまここ!!'; mapMarker.bindPopup(comment).openPopup(); } function onLocationError(e) { 'use strict'; window.alert('位置情報取得に失敗しました。'); } map.on('locationfound', onLocationFound); map.on('locationerror', onLocationError); var Map_BaseLayer = { "地理院地図 標準": t_std, "地理院地図 淡色": t_pale, "地理院地図 オルソ": t_ort, "OpenStreetMap 標準": o_std, "GoogleMap 標準": g_roadmap, "GoogleMap オルソ": g_satellite, "GoogleMap ハイブリッド": g_hybrid }; L.control.scale({ imperial: false, maxWidth: 300 }).addTo(map); L.control.layers(Map_BaseLayer, null, { collapsed: false }).addTo(map); |
index.htmlを実行すると下記のようにブラウザで表示されます。
※「この地図は、国土地理院長の承認を得て、同院発行の電子地形図(タイル)を複製したものである。 (承認番号 平27情複、 第224号)」
現在位置のAPIを設定:
1 |
map.locate({setView: true, maxZoom: 14}); |
現在位置の取得可能の場合:
function onLocationFound(e)~の後に処理を記述します。
現在位置にマーカーとポップアップを表示します。
「e.latlng」で現在の緯度経度を取得します。
1 2 3 |
mapMarker = L.marker(e.latlng).addTo(map); comment = 'いまここ!!'; mapMarker.bindPopup(comment).openPopup(); |
現在位置の取得不可能の場合:
function onLocationError(e)~の後に処理を記述します。
アラートを表示させます。
1 |
window.alert('位置情報取得に失敗しました。'); |
日付 | 曜日 | 歩数 |
---|---|---|
2015.07.05 | 日 | 11462 |
2015.07.06 | 月 | 4559 |
2015.07.07 | 火 | 11889 |
2015.07.08 | 水 | 4784 |
2015.07.09 | 木 | 5218 |
2015.07.10 | 金 | 12203 |
2015.07.11 | 土 | 10543 |
合計 |
---|
60658 |
「QGIS #006 – プラグイン作成」を応用してプラグインでダイアログを表示する方法を記載します。
QGISのプラグインでダイアログを表示するためには下記方法でおこないます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# -*- coding: utf-8 -*- #--------------------------------------------------------------------------- # Name: Sample Plugin02 # Purpose: サンプルプラグインの作成 # # Author: dayjournal # # Created: xx/xx/2015 # Copyright: (c) dayjournal 2015 #--------------------------------------------------------------------------- def classFactory(iface): from sample import SamplePlugin02 return SamplePlugin02(iface) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# -*- coding: utf-8 -*- from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * import os class SamplePlugin02: def __init__(self, iface): self.iface = iface def initGui(self): path = os.path.dirname(__file__) + u'\icon.png' self.action = QAction(QIcon(path), "sample", self.iface.mainWindow()) QObject.connect(self.action, SIGNAL("triggered()"), self.run) self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("Sample Plugin02", self.action) def unload(self): self.iface.removePluginMenu("Sample Plugin02", self.action) self.iface.removeToolBarIcon(self.action) def run(self): QMessageBox.information(self.iface.mainWindow(), 'sample', u'プラグインを実行しました!!') |
トリガーの設定
1 |
QObject.connect(self.action, SIGNAL("triggered()"), self.run) |
プラグインの実行時の処理
1 |
def run(self): |
プラグイン実行でメッセージボックスを表示
第2引数に題名、第3引数にコメントを記述
1 |
QMessageBox.information(self.iface.mainWindow(), 'sample', u'プラグインを実行しました!!') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
[general] name = Sample Plugin02 description = サンプルプラグイン about = サンプルプラグインを作成しました。 category = sample tags = sample,plugin homepage=https://github.com/ repository=https://github.com/ author = dayjournal email = dayjournal@gmail.com version = 1.0 changelog = 1.0 - 初版作成 icon=icon.png qgisMinimumVersion = 2.8 |
プラグインを「プラグイン管理」で利用可にすると下記のようにプラグインを実行できるようになります。