2017年07月05日

ラベルに桁区切りを表示

この時期になると、サンディエゴでESRIのユーザ会が開かれる。サンディエゴはメキシコとの国境に近く、市の中心部から路面電車で国境付近まで行って、そこから歩いてメキシコに行くことができる。

ユーザ会のついでに一度だけ、メキシコまで足を延ばしたことがある。

メキシコとアメリカとの境は、それはもうはっきりとわかる。アメリカ側は建物が閑散と建っているのに対して、メキシコ側はぎっしりと建っているからだ。人が決めた境界がこんなにも住む人の生活の境界になってしまうんだ、国境が陸上にあるとその境目はこんなにもはっきりとしてしまうんだと、とても印象深かった。

さてさて、本題。こっちはやっと時系列アニメーションから離れようと思う。でも地価のデータは使う。

何回か前の記事で、凡例を桁区切りで表示する方法を説明したけど、今回はラベルに桁区切りを表示する方法を確認しておく。

ラベルの制御なので、地価のレイヤーからレイヤプロパティを開いて、「ラベル」タブを開く。で、ウインドウ真ん中へんにある、ラベルフィールドの部分で、地価の入ったフィールド名を指定する。以下の例では「LandPriceNum」というフィールドの値をラベリングする設定になっている。

i17060501.png
(図をクリックすると拡大します)

で、その横にある「条件式」というボタンをクリックする。そうすると「ラベル条件式」というウインドウが開く。ここで、形式から「Python」を選んで、「高度な設定」をクリックする。

i17060502.png

「高度な設定」をオンにすると、条件式のあたりが以下のようにちょっと変化する。

i17060503.png

そうしたら、条件式を入力するところに以下のように入力する。

def FindLabel ([LandPriceNum]):
return "{:,}".format(long([LandPriceNum]))

1行目は、「高度な設定」をオンにした直後と同じ文なのでそのまま流用して、2行目だけ書き換えてもよい。

で、念のため、「確認」ボタンをクリックしてみよう。以下のように、サンプルテキストが3桁で区切られて表示されたらOKだ。

i17060504.png

条件式の確認ウィンドウで「OK」ボタンを、さらに、ラベル条件式ウィンドウで「OK」ボタンを、そしてレイヤプロパティウィンドウでも「OK」をクリックする。

そうすると、ラベルが桁区切りとともに、以下のように表示される。

i17060505.png

(上の図では、ラベルのフォントを游ゴシック、11ptで表示している。)

こちらも数字がずらーっと並ぶよりは、まだ数値がわかりやすいと思う。
まま、今回はこれにてー。

(記事内の地価の地図は、国土交通省国土政策局「国土数値情報(地価公示データ)」をもとに、てくてくGISラボ たかはしが編集・加工)
posted by たかはし at 11:00| Comment(0) | ArcGIS

2017年06月28日

時系列アニメーションをPDFに

前回は地価の時系列データを使って描いた地図を、動画ファイルに出力する方法を確認した。

でも、地価の値に興味がある人なら、ある時点でアニメーションを止めたくなると思う。ArcGISを持っていればもちろんタイムスライダーバーをその時点で止めればいいわけだけど、プレゼンのように、みんなの前で何か見せる時は、あらかじめ作っておいた地図を見せる方がトラブルも少なく安心だ。

そういうわけで、今回は各年の地図をPDFに出力する方法を確認する。

まず手作業でやるなら、タイムスライダーを1年ずらして、ファイル>エクスポートでPDFにエクスポートして、これを30年分…という方法だろうか。作業に入る前から、遠い目になってしまいそうだ。第一、PDFを作ってから、ちょっと地価のポイントの色を変えたいんだよねーとなると、また一からエクスポートのし直しだ。まぁ30年ぐらいならやらないこともないけどね…。(この妥協が悲劇を生むことが多い)。

もし頑張ればPythonを実行できる、という人なら、スクリプト作るといいと思う。

私はすんごく頑張らないとPythonのコードを書くことができない。ということで、以下のArcGISのマニュアルに出ているコードを参照してみた。

DataFrameTime ― Help | ArcGIS for Desktop
http://desktop.arcgis.com/ja/arcmap/10.3/analyze/arcpy-mapping/dataframetime-class.htm#C_GUID-31BD4516-B656-43D6-800F-C4FADE9D4062

コードのサンプルのところのexample 1のところに出ているコードを使った。以下にこのコードをベースに、ほんとにちょっとだけ書き換えたものをコメント付きで載せておく。

(コメントでは日本語を使っていて、コードに日本語を使うための処理をしていないので、削除しないと動かないと思う。#で始まる行は削除してくださいな。あるいは、# coding: cp932をコードの先頭にいれてくださいな。(SJISでコードを保存する場合))

import arcpy
import os

### mxd名をフルパスで指定 パスの区切りは円マーク2つ ###
mxd = arcpy.mapping.MapDocument("C:\\home\\gisdata\\d01_tokchika_anime.mxd")

# df にMapLayersというデータフレームを代入
# 上記.mxdの地価データを読みこんだデータフレーム名もMapLayersに変更して
# .mxdを保存しておくこと
df = arcpy.mapping.ListDataFrames(mxd, "MapLayers")[0]

# df.time.currentTimeにMapLayersデータフレームの開始時間を代入
# 開始時間はタイムスライダーのオプション内で設定した時間だと思う
df.time.currentTime = df.time.startTime

# df.time.currentTimeが終了時間以下の時、while文内を実行
while df.time.currentTime <= df.time.endTime:
# 時間文字列は例えば2008-12-29 02:19:59となる。
# これをハイフンで区切り、最初の文字列(つまり2008)に
# yearと.pdfをつけてファイル名とする
fileName = "year" + str(df.time.currentTime).split("-")[0] + ".pdf"

print df.time.currentTime

# fileNameに出力先のフルパスを追加する
fileName = os.path.join("C:\\home\\gisdata\\pdfs\\", fileName)

# mxdからfileNameにPDFを出力する
arcpy.mapping.ExportToPDF(mxd, fileName)

# df.time.currentTimeに時間間隔分をプラス
# 時間間隔もタイムスライダーのオプション内で指定されている数値だと思う
df.time.currentTime = df.time.currentTime + df.time.timeStepInterval
del mxd

これを実行すると、C:\home\gisdata\pdfs\の中に、year1983.pdfといったファイルが出力される。それらを1つのPDFにまとめたのが、以下のPDFだ。
若干容量が大きいので、ダウンロードにはご注意を。(15.3MB)

国土数値情報 地価公示データから作った東京23区の地価の地図
tokchika1983-2015.pdf


この方法だと.aviに出力したものよりはきれいじゃないかなー。AcrobatでPDFを表示している場合は、ページレベルにズームで表示(「表示>ズーム>ページレベルにズーム」を選択)すると、1ページ全体がぴったりとAcrobatの中に表示される。ここで、マウスのホイールをくるくる回すとアニメーション的表示ができる。

ところで、PDFを1つにまとめる際、私がよく使っているのは、CubePDFPageというフリーソフトだ。
PDFページ結合・分割フリーソフト
http://www.cube-soft.jp/cubepdfpage/

全部の年じゃなくて、5年おきの地図だけ必要ならそれだけをCubePDFPageにドラッグしてあげて、PDFを作成するなんてこともできる。うーん便利。

ちなみに、mxdをPDFに出力するarcpy.mapping.ExportToPDFでは、「PDF」の部分をPNGやらJPGに変えるとそれらのファイルに出力することもできる(詳細はマニュアルを見てくださいな)。動画にしたいならこれらの画像からArcGISの外で何かツールを使ってアニメーションにすると、きれいにできると思う。

今回は頑張ってPythonを実行してみた。
ではでは〜。
posted by たかはし at 11:00| Comment(0) | ArcGIS

2017年06月21日

時系列アニメーションを動画ファイルに出力

あれっ、アニメーションはもう終わったはずじゃぁと思った人もいるかもしれない。今回は、アニメーションを動画ファイルに出力する方法をメモしておく。

アニメーション表示についての記事では、これまで以下のような内容を説明した。
(1)アニメーション表示用のデータの取得
国土数値情報の地価データのダウンロード

(2)アニメーション表示用データの構造と作成
地価データからアニメーション表示用のデータを作成

(3)アニメーション表示
レイヤプロパティ>時間タブでの設定とタイムスライダーの利用

(4)アニメーション表示に時間を示すテキスト追加
タイムスライダーのオプション設定

そして、アニメーション表示の設定がされたデータを使って以下を説明した。
凡例に各年のフィーチャ数を表示
凡例の数値に桁区切りを表示
値が大きなフィーチャを最後に表示

今回はこれで表示される地図を動画ファイル(.aviとか)に出力する。

出力前にもうひと手間。現在地価は自然分類で表示されているが、これを手動で分類値を決める。えーっと手順は…レイヤプロパティのシンボルタブで、範囲の数字を入力して変更していく。

変更後の数値だけど、よくやるのは自然分類のクラス分けを参考にして決める方法である。自然分類でクラス数が5(サンプル数の上限が10,000)だと、区切りの数値は以下のようになっている。

i17052121.png

これを大まかに参考にしつつ、キリがよくわかりやすいかなぁと思われる数値を選ぶ。例えば以下のような感じ。

i17052122.png

もちろん、使っているデータの分野でポピュラーな値の区切り方があるようならそれに従うとよい。

ラベルのところの文字もクリックすれば自分で書き換えられるので、最大値と最小値は凡例に出さない、というようなこともできる。

i17052123.png

これなら、クラス分けの数値もちょっとは人間にわかりやすいかもしれない。

さて、やっといよいよ動画ファイルへの出力だ。操作は簡単、タイムスライダーの「ビデオにエクスポート」アイコンをクリックする。

i17052124.png

で、出力ファイル名を聞かれるので、何か指定する。

次に、出力ファイルの圧縮形式を指定する画面が表示される。動画の圧縮とか詳しくないんだけど、私の環境では「Microsoft Video1」だと、コーデックがないとかのエラーも出ずに出力できた。OKをクリックするとエクスポートが始まる(けど、結構時間がかかるしPCのファンがぐーんと回り始める)。

i17052125.png

出力結果は結構な容量のファイルになる。圧縮の度合いとかを調整するといいかもしれない。私が出力したのが以下のファイル。圧縮の品質は50にしている。いえ、見るほどの美しい地図じゃないですよ、残念ながら。5MB強あるのでネットがナローな環境ではダウンロードにご注意を。



動画では、画面のイメージがそのままアニメーション化されてしまう。このビデオにエクスポートを起動した時点で、ArcMapの表示がデータビューならデータビューが、レイアウトビューならそれがアニメーション化される。年によってちこちこ変わる凡例も出力したいのなら、レイアウトビューにしておこう。

あと、レイアウトビューで選択したテキストも水色の枠もそのまま表示されてしまう。がっくり。用紙とか余白の範囲を示す線も出力されちゃうので、あんまりエクセレントではないかも…。こんだけいろいろ操作して、最後がこれだとちょっと悲しいかも…。

実際に、プレゼントとかで使う場合で、○○年の地図でアニメーションを止める、という必要がなければ、この.aviファイルを使うのもまぁ悪くはないかもしれない。

うーん、でもこれだとなぁ、かなり不納得…。次回でもうちょっとなんとかしよう。今回はこれにて。


(記事内の地価の地図は、国土交通省国土政策局「国土数値情報(地価公示データ)」をもとに、てくてくGISラボ たかはしが編集・加工)

posted by たかはし at 11:00| Comment(0) | ArcGIS