arcgisの便利な印刷周りの機能に、qgis apiを駆使して挑んでみたお話
TRANSCRIPT
ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話
北海道地図株式会社朝日 孝輔長船 翔太
2
disってるわけではありません
3
QGISのAPIとかいじってます
● 趣味です● 会社黙認
シーッ! d( ゚ε゚;)
4
QGISに詳しいの?
● 編集ツールとして使ってます● GRASS?何それおいしいの?● 幾何演算とかするなら他のツール使っちゃってるかも
● APIいじってるけど、仕事でAPI使ったことは実は無いの
5
そうは言っても業務で使ってるよ
● 紙地図をスキャンしてのジオリファレンス
6
そうは言っても業務で使ってるよ
● ベクトルデータの編集● 小規模なものから大規模まで
● 例えば● 数百万ポリゴン
PostgreSQL/PostGISで管理● 複数人で編集
各種地図データ
7
会社では他のGISも使われてます
8
会社では他のGISも使われてます
9
ある日
ArcGIS10 チョー便利帳票印刷簡単に作れますよQGISで出来ないでしょうw
10
ある日
お、disってんのか??
よろしいならば戦争検証だ
11
お題
12
お題
広域図学校校区エリアを包含する地図
属性表示
タイトルなど
学校校区エリア分学校校区エリア分自動で作るべし自動で作るべし
凡例
スケール・ページ数・作成者
13
お題 使用するデータ
●背景地図(弊社GISMAPシリーズ)
●国土数値情報ダウンロードサービス ・小学校区データ ・公共施設データ
●数値地図5mメッシュ DEM
14
ArcGIS10 便利なレイアウト機能
● ArcGIS10より標準搭載された「データドリブン」機能を活かす
ArcGISブログ~図郭ごとにマップを出力する方法http://blog.esrij.com/arcgisblog/2011/03/post-5653.html
15
ArcGIS 作業の流れ1
● マップデータの構築→データレイヤの追加、色スタイル設定、ラベル発生、フィルタ処 理…etc
2hぐらい
データ読込初期状態 作り込み後のマップイメージ
16
ArcGIS 作業の流れ2
● 帳票のレイアウトの構築→タイトル、凡例、広域図、属性情報、方位、ページ数…etc
2hぐらい
既存のテンプレート 作り込みテンプレート
17
ArcGIS 作業の流れ3
● 校区ポリゴン毎にドリブン化設定
校区1 校区2 校区3
0.5hぐらい
18
ArcGIS 作業の流れ4
#mxdファイルの指定mxd = arcpy.mapping.MapDocument(mxdFilePath)
#ドリブンの更新mxd.dataDrivenPages.refresh
#ドリブンで構成したページのPDFを作成(複数PDF)1for pageNum in range(1, mxd.dataDrivenPages.pageCount + 1): mxd.dataDrivenPages.currentPageID = pageNum print "Exp_pageNum: " + str(pageNum) arcpy.mapping.ExportToPDF(mxd, cd + "\\pdf\\Map"+ str(pageNum) + ".pdf")
● PDF連続出力 GUIでも出力可能だけど、ArcPy(Python)でスクリプト化
GUI操作上で0.5hぐらい
19
ArcGIS 作業完了
● 作業時間トータル6h● マップデータの表示設定と帳票レイアウトの作り込みには多少のコ
ツがいるが、基本的にはプログラム不要の”えいやー”感覚で作れる。
20
QGIS
● プリントコンポーザーという機能がある● 各種部品をGUIで配置出来る● 特定箇所を特定
レイアウトで出せる● 連続で出力するような
機能はない
21
QGIS
● PythonコンソールからQGIS APIを使えるよ
● QGIS API(Python)使用方法● Pythonコンソールから● Pythonでプラグインを作っちゃう● カスタムアプリケーションにQGIS APIを埋め込む
22
QGIS
● 選択されているベクトルレイヤーの図形の属性(0)を表示
l = qgis.utils.iface.activeLayer()provider = l.dataProvider()
feat = QgsFeature()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
while provider.nextFeature(feat): att = feat.attributeMap() print att[0].toString()
23
QGIS
● メニューバーを全部消してしまう
iface = qgis.utils.iface childrenList = iface.mainWindow().children()
for item in childrenList: if isinstance(item, PyQt4.QtGui.QToolBar): item.hide()
24
QGIS
● 今回使ったのは ”Script Runner” プラグイン● マクロのイメージ● “Add Script”
→ “Run Script”● プラグインを作るより
少しだけ気がラク
25
QGIS
1日で出来るとこまで
1日で出来るとこまで
作ってみました
作ってみました
26
QGIS
● データ取り込み、表現設定は先に行っておく● 200行くらいのスクリプトです
● 選択されているレイヤーの図形でループ
– 図形の外接矩形を取得● 周辺図用画面キャプチャ● 縮尺を変えて、広域図用画面キャプチャ
– 図形の属性取得して描画– その他整飾を描画– PDF書き出し
27
QGIS
● 外接矩形に合わせて画面を移動
● 枠を描画
self.canvas.setExtent(bound)self.canvas.zoomScale(self._adjustScale(self.canvas.scale()))self.canvas.refresh()
pen = QPen(Qt.black)pen.setWidth(10)paint.setPen(pen)paint.drawRect(self._mm2dotX(11.0), self._mm2dotY(11.0), self._mm2dotX(270.0), self._mm2dotY(190.0)) paint.drawLine(self._mm2dotX(11.0), self._mm2dotY(188.0), self._mm2dotX(281.0), self._mm2dotY(188.0)) paint.drawLine(self._mm2dotX(230.0), self._mm2dotY(194.0), self._mm2dotX(281.0), self._mm2dotY(194.0)) paint.drawLine(self._mm2dotX(230.0), self._mm2dotY(188.0), self._mm2dotX(230.0), self._mm2dotY(201.0))
抜粋です
28
QGIS
● 文字描画
● 画像を描画
pen = QPen(Qt.black)pen.setWidth(8)paint.setPen(pen)paint.setFont(QFont("Arial", 20))paint.drawText(self._mm2dotX(55.0), self._mm2dotY(198.0), ur'千葉県東金市・九十九里町 小学校別防災MAP')
抜粋です
imgArrow = QImage(ur'C:\OSGeo4W\apps\qgis\images\north_arrows\default.png')paint.drawImage(self._mm2dotX(95.0), self._mm2dotY(80.0), imgArrow.scaled(self._mm2dotX(5.0), self._mm2dotY(5.0)))
29
QGIS vs ArcGIS
● 注記、記号 orz
30
QGIS vs ArcGIS
● 広域図 orz
31
QGIS vs ArcGIS
● スケール orz
● ラスタ凡例 orz
32
ここまでの結論
● 商用GISは気が効いてるよね● でも、少し手間かければ似たようなことが出来るよ#ということにしておこう
● もう1レベル上のクラスをきちんと使えれば・・・● 情報が少ないので、誰かが公開しててくれれば・・・
33
そこのあなた
● 私もFOSS4G 2010 Tokyoで始めて触りました● PyQGISの世界へようこそ
まだまだやってる人少ないです● 便利なプラグインを作ろう● 情報を公開しよう
● 今年もFOSS4G 2012 Tokyoではハンズオンあるかな?
34
さらに
● QGISはC++で書かれています● 開発しちゃいなよ● 特に日本語周りはみなさん苦労してるので、解決しちゃって#でもgdal/ogrの問題かな
35
QGISの名前は
Developer Meetingの場所
36
こんなのだってありえる
37
ご清聴ありがとうございました