てつふみはブログ

プログラミングなどの失敗記録

【arcpy】断面図の書き方、とエラー

ArcGISのarcpyで断面線を作成するには stack_Profile()を使用する。

このジオプロツールを使用すれば、断面の標高と始点からの距離をテーブルに出すこともできるし、断面図を作成できる(※1)。必要なデータはDEMと断面線だけ。

もちろん、複数の線にも対応している。テーブルにはIDフィールドもあり、線ごとのIDが保存される。複数の断面図データをいっぺんに取ることも可能。

 

<<注意点>>

ただし、注意点が三つある。

1. 断面線がDEMの外から始まっている場合、出力テーブルの距離は始点ではなく、DEMに断面線が入ってきた所からの距離になる。

2. 入力データのDEMが複数にまたがる場合、統合(※2)した方がいい。複数のDEMにまたがる断面線があると、断面図データはDEMごとに作成される。そのため【注意点1】が原因で、距離の起点が複数存在することになる。よってめちゃくちゃなグラフとなる。

3. 出力テーブル名を"table"にすると、失敗する。どう失敗するのかというと、全部の断面図データを取得できなくなってしまう。まるまるゴソッと無いIDもあるし、一部のデータが抜けることもある。なぜかは分からない。

 

そこだけ注意して使わなきゃいけない。

 

 

※1 GUI上では断面図を作成できるけど、arcpyになるとうまくいっていない(研究中)。とりあえず、matplotlibを使用している。matplotlibは非常に優秀!!

ここら辺を参考にした↓

bicycle1885.hatenablog.com

seesaawiki.jp

 

※2 統合にはジオプロツール  “新規ラスタにモザイク”  が使える。

arcpy.MosaicToNewRaster_management

desktop.arcgis.com

【ArcPy】フォーカル統計がとっても便利(あと加重ファイルを使う時のエラーについて)

ArcGISのフォーカル統計を使えば、ラスタの近傍統計解析ができる。

近傍統計解析ができれば、周囲の平均をとったり、周囲の得点を集計して真ん中の得点にする、ってことが楽にできる。

 

ArcGIS Help

 

特にこの関数(ツール)のよいところが、neighborhoodパラメータを指定すれば柔軟性の高い近傍統計解析ができること。

例えばNbrIrregularやNbrWeightでカーネルファイルを指定すれば、ガウシアンフィルタリングといった平滑処理が容易にできる。

それはもう自由自在。

 

 

※ガウシアンフィルタリングなどについてはこちら↓

(平滑化(移動平均、ガウシアン)フィルタ 画像処理ソリューション)

(http://www.riken.jp/brict/Yoshizawa/Lectures/Kyuusyu/Lectures2011_04.pdf)

 

ここで一つだけ注意事項。

neighborhoodパラメータにNbrWeightを指定する時、カーネルファイルのパスは、ユニコード文字列は使えない

つまり、何らかの文字コードの文字列でなければいけない。

ユニコード文字列を指定していると、エラーが返ってくるので注意。

 

 (試していないが、NbrIrregularでも同じか...?)

【Numpy】インデックスに浮動小数点が使える

実はnumpyのインデックス指定は、float型(浮動小数点)も使えました! ってお話。

自動で型変換してくれていました。。。

こんな時はエラーを返してほしいよね…。

まぁ、変数管理のできていなかった俺が悪いんだけど。

 

以下、詳細

 

numpyはインデックス指定でデータを取り出せる。

import numpy

array = numpy.arange(9).reshape([3,3])

print(array)

>>  numpy.array([[0,1,2]

                         ,[3,4,5]

                         ,[6,7,8]])

print(array[1,2])

>>  5

 こんな感じ。

リストでも

list = [0,1,2,3,4,5]

print(list[2])

>>  2

って機能が あるけど、それと同じような使い方ができる。

 

で、リストの場合、

list[2.3]

みたいにするとエラーが出る。インデックスにfloat型は指定できませんと。

でも、numpyの場合…

array[2.3]     ・・・  (1)

array[2]             ・・・  (2)

array[int(2.3)]    ・・・  (3)

 とすると、インデックスは自動で型変換がされる。つまり、(1)と(2)と(3)の結果は同じ!!!

小数点は切り捨てられる。

 

今回は、このために期待した結果が出ず、悩んでしまった・・・。

 

 

 

 

 

【Arcpy】ラスタのSpatial analysys演算エラー(メモ)

ラスタをSpatial analysysのツールを使って演算しようとすると、エラーになる。

 

エラー例)

 ・テーブルが見つかりません。と言われる。

 ・(python上で)import文の箇所で、"ASCII codec can't encode ...."と言われる。

などなど…

調べてみても、 原因がよく分からない・・・

 

≫いろいろこねくり回した結果

 

直接の原因ではないけど、ジオデータベースに格納されたラスタを入力データとしていたためと分かった。このラスタをTIFFに変換して、入力データとした。そうしたところ、処理が正常に回るようになった。

 

 

≫原因

三つ考えられる。

・ジオデータベースのラスタ作成時に何かしらの失敗をした

・ラスタを作成する際に必要なプロパティ(か何かの設定)がなかった

・ジオデータベースのラスタは対応していない(これは考えにくいが)

 

 

ひとまずの解決を見るまで、かなり時間がかかってしまった。。。

【python】 四則演算する上での注意

python 四則演算する上での注意

 

pythonで同じ型同士の演算をすると、返り値の型は入力と同じになる。

 

3 * 4  int * int

>> 12      int

 

1.0 + 2.0    float * float

>> 3.0        float

 

そのため、整数同士で割り算をすると...

 

29 / 2      int * int

>> 14      int

 

!!!

 

切り捨てられてしまうので、注意が必要。

 

 

異なる方同士の演算なら、複雑な方に型が合わせられる。

よって、こうすれば解決する↓

 

29 / 2.0         int * float

>> 14.5         float

 

以上。つまらないところで小一時間引っかかってしまった。

【登山】磐梯山

先日、磐梯山に行ってきた。

素晴らしい山だった。

 

 

何が良かったのか?

荒々しい磐梯山、赤く染まる磐梯山浅葱色の絨毯、深い森が見れたからだと思う。

 

一つのルートでここまで景色が変わるところは、そうはない。

もし自分の百名山を決めるなら、ここは必ずランクインするだろう。

自己顕示したいが、秘密にしておきたい気もするので、ここに書く。

 

○ルート

裏磐梯スキー場>>土石流跡>>櫛ヶ峰と磐梯山のコル>>山頂>>中ノ湯>>銅沼(あかぬま)>>裏磐梯スキー場

 

○危険地

土石流跡のあたりが迷いやすい。印はついているので大丈夫だけど。

土石流後の急斜面は、登る分には危険ではない。下っても危なくはないが大変。時間はかかる。

 

○記録

朝(というか昼)の磐梯山 猪苗代湖より。雲がかぶっているが、中山峠抜けて見えたこの景色にハイテンション

f:id:tkmaestro:20150922095534j:plain

 

最初の森 昔山体崩壊が起きたらしい。その後回復した森か?木が細い

f:id:tkmaestro:20150922111308j:plain

 

開けてくると、ロックガーデンのような景観。そして、シラタマ祭。歩いているだけでシップ臭がする。

これで酒作れば、自家製アイラできないかなぁ。あるいは自家製ルートビアとか。そういうの好き。

f:id:tkmaestro:20150922111803j:plain

f:id:tkmaestro:20150922113232j:plain

 

土石流の掃流跡? 人の手を加えたように真っ直ぐで、きれいにえぐれている。

f:id:tkmaestro:20150922113419j:plain

 

土石流跡。 迷いやすい。

f:id:tkmaestro:20150922114423j:plain

 

土石流跡が終わると、こんな森の急斜面。 ほんと辛い。首が痛くなるほど見上げる位置に人がいたのは久しぶりだ。

f:id:tkmaestro:20150922115307j:plain

 

振り返れば桧原湖。 今まさに歩いているところが崩壊し、流れ流れてあそこまで到達した。崩壊土砂が桧原湖をつくり、桧原村が埋まった。

f:id:tkmaestro:20150922120623j:plain

 

お隣の山、櫛ヶ峰。南八甲田にも櫛ヶ峰があるが、どんな由来なのか?

f:id:tkmaestro:20150922120934j:plain

 

砂礫地の花

f:id:tkmaestro:20150922121429j:plain

 

急傾斜を抜ければ、そこは浅葱色の絨毯。風が吹き抜ける。

画像じゃよくわからないな…。

f:id:tkmaestro:20150922121304j:plain

 

崖錐?のカーブは美しい。 習字の右払いと同じ。

f:id:tkmaestro:20150922121726j:plain

 

山頂直下の紅葉。ちょっと早いか!?

f:id:tkmaestro:20150922130404j:plain

 

山頂の三角点。わざわざ復活させた模様。

f:id:tkmaestro:20150922131340j:plain

 

降りてきて、振り返れば磐梯山

f:id:tkmaestro:20150922150759j:plain

 

中ノ湯側の森林はブナ林(?)時々大きな木もあった(気がする)

f:id:tkmaestro:20150922153739j:plain

f:id:tkmaestro:20150922161116j:plain

 

銅沼と書いて、"あかぬま"と読む。

赤って、それ鉄じゃね? 銅は緑じゃなかったか

f:id:tkmaestro:20150922161707j:plain

 

最後に、桧原湖より磐梯山を望む。

f:id:tkmaestro:20150922175028j:plain

 

 

 

 

【arcpy】saモジュールのConメソッドでの、NumPyの使用はダメ

背景>>

先日、こんなようなコードを書いた。

import, numpy,arcpy

np = numpy.arange(9).reshape([3,3])

raster2 = arcpy.sa.Con(raster1 > 10, np[2,2], float(u"NaN"))

するとRuntimeだかジオプロセシングエラー999999だかが出て、原因不明で落ちる。

 

原因>>

Conメソッドの式中に、NumPyを書いたのが原因だった。

二次元配列にするとすんなり実行可能に…。

どうやらConメソッド内ではNumPyに対応していない模様(考えてみれば当然だな)

調べてはいないけど、おそらく他のメソッド(あるいは他のモジュール?)でも対応していないと思われる。

 

そんなに必要な機能ではなかったから、最初から直書きでやればよかったと後悔…

NumPy覚えたてだからなんか使ってみたくなったんだな、きっと。