arcgisの便利な印刷周りの機能に、qgis apiを駆使して挑んでみたお話

37
ArcGISの便利な印刷周りの機能に、 QGIS APIを駆使して挑んでみたお話 北海道地図株式会社 朝日 孝輔 長船 翔太

Upload: kosuke-asahi

Post on 15-Jul-2015

4.767 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

北海道地図株式会社朝日 孝輔長船 翔太

Page 2: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

2

disってるわけではありません

Page 3: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

3

QGISのAPIとかいじってます

● 趣味です● 会社黙認

シーッ! d( ゚ε゚;)

Page 4: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

4

QGISに詳しいの?

● 編集ツールとして使ってます● GRASS?何それおいしいの?● 幾何演算とかするなら他のツール使っちゃってるかも

● APIいじってるけど、仕事でAPI使ったことは実は無いの

Page 5: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

5

そうは言っても業務で使ってるよ

● 紙地図をスキャンしてのジオリファレンス

Page 6: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

6

そうは言っても業務で使ってるよ

● ベクトルデータの編集● 小規模なものから大規模まで

● 例えば● 数百万ポリゴン

PostgreSQL/PostGISで管理● 複数人で編集

各種地図データ

Page 7: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

7

会社では他のGISも使われてます

Page 8: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

8

会社では他のGISも使われてます

Page 9: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

9

ある日

ArcGIS10 チョー便利帳票印刷簡単に作れますよQGISで出来ないでしょうw

Page 10: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

10

ある日

お、disってんのか??

よろしいならば戦争検証だ

Page 11: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

11

お題

Page 12: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

12

お題

広域図学校校区エリアを包含する地図

属性表示

タイトルなど

学校校区エリア分学校校区エリア分自動で作るべし自動で作るべし

凡例

スケール・ページ数・作成者

Page 13: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

13

お題 使用するデータ

●背景地図(弊社GISMAPシリーズ)

●国土数値情報ダウンロードサービス ・小学校区データ ・公共施設データ

●数値地図5mメッシュ DEM

Page 14: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

14

ArcGIS10 便利なレイアウト機能

● ArcGIS10より標準搭載された「データドリブン」機能を活かす

ArcGISブログ~図郭ごとにマップを出力する方法http://blog.esrij.com/arcgisblog/2011/03/post-5653.html

Page 15: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

15

ArcGIS 作業の流れ1

● マップデータの構築→データレイヤの追加、色スタイル設定、ラベル発生、フィルタ処 理…etc

2hぐらい

データ読込初期状態 作り込み後のマップイメージ

Page 16: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

16

ArcGIS 作業の流れ2

● 帳票のレイアウトの構築→タイトル、凡例、広域図、属性情報、方位、ページ数…etc

2hぐらい

既存のテンプレート 作り込みテンプレート

Page 17: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

17

ArcGIS 作業の流れ3

● 校区ポリゴン毎にドリブン化設定

   校区1        校区2       校区3

0.5hぐらい

Page 18: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

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ぐらい

Page 19: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

19

ArcGIS 作業完了

● 作業時間トータル6h● マップデータの表示設定と帳票レイアウトの作り込みには多少のコ

ツがいるが、基本的にはプログラム不要の”えいやー”感覚で作れる。

Page 20: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

20

QGIS

● プリントコンポーザーという機能がある● 各種部品をGUIで配置出来る● 特定箇所を特定

レイアウトで出せる● 連続で出力するような

機能はない

Page 21: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

21

QGIS

● PythonコンソールからQGIS APIを使えるよ

● QGIS API(Python)使用方法● Pythonコンソールから● Pythonでプラグインを作っちゃう● カスタムアプリケーションにQGIS APIを埋め込む

Page 22: ArcGISの便利な印刷周りの機能に、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()

Page 23: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

23

QGIS

● メニューバーを全部消してしまう

iface = qgis.utils.iface childrenList = iface.mainWindow().children()

for item in childrenList: if isinstance(item, PyQt4.QtGui.QToolBar): item.hide()

Page 24: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

24

QGIS

● 今回使ったのは ”Script Runner” プラグイン● マクロのイメージ● “Add Script”

→ “Run Script”● プラグインを作るより

少しだけ気がラク

Page 25: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

25

QGIS

1日で出来るとこまで

1日で出来るとこまで

作ってみました

作ってみました

Page 26: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

26

QGIS

● データ取り込み、表現設定は先に行っておく● 200行くらいのスクリプトです

● 選択されているレイヤーの図形でループ

– 図形の外接矩形を取得● 周辺図用画面キャプチャ● 縮尺を変えて、広域図用画面キャプチャ

– 図形の属性取得して描画– その他整飾を描画– PDF書き出し

Page 27: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

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))

抜粋です

Page 28: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

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)))

Page 29: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

29

QGIS vs ArcGIS

● 注記、記号 orz

Page 30: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

30

QGIS vs ArcGIS

● 広域図 orz

Page 31: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

31

QGIS vs ArcGIS

● スケール orz

● ラスタ凡例 orz

Page 32: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

32

ここまでの結論

● 商用GISは気が効いてるよね● でも、少し手間かければ似たようなことが出来るよ#ということにしておこう

● もう1レベル上のクラスをきちんと使えれば・・・● 情報が少ないので、誰かが公開しててくれれば・・・

Page 33: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

33

そこのあなた

● 私もFOSS4G 2010 Tokyoで始めて触りました● PyQGISの世界へようこそ

まだまだやってる人少ないです● 便利なプラグインを作ろう● 情報を公開しよう

● 今年もFOSS4G 2012 Tokyoではハンズオンあるかな?

Page 34: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

34

さらに

● QGISはC++で書かれています● 開発しちゃいなよ● 特に日本語周りはみなさん苦労してるので、解決しちゃって#でもgdal/ogrの問題かな

Page 35: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

35

QGISの名前は

Developer Meetingの場所

Page 36: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

36

こんなのだってありえる

Page 37: ArcGISの便利な印刷周りの機能に、QGIS APIを駆使して挑んでみたお話

37

ご清聴ありがとうございました