タグ別アーカイブ: 抽出

ArcGISでアスタリスクを使ってデータを検索する

ArcGISで属性検索やフィルタリングをおこなう際に、windowsやエクセル等で検索するように*(*,アスタリスク)を使って任意の文字列を指定することは出来ません。

この場合、例えば、以下のように指定します。

KUBUNフィールドの○○公園を探す。
“KUBUN” LIKE ‘%公園’

PREFフィールドの2文字の県を探す。
“PREF” LIKE ‘__県’

完全一致の場合には = を使用しますが、部分一致の場合には LIKE を使用します。また、%が1文字以上の文字列、 _ が1文字を意味するので、注意しましょう。また、フィールドの形式がテキスト以外の場合は部分一致による条件抽出が出来ませんので、適宜対応してください。

ラスタデータを複雑な形で抽出する方法

ArcGISでラスタを配置した場合、特に処理を行わなければ、元々のラスタの形のまま(四角形のまま)配置されますが、後から必要な範囲だけをくり抜くことが出来ます。

この作業には、ArcGISとSpatialAnalystというエクステンションを使用します。

○必要なデータ
ベースとなるラスタ(数値地図・航空写真・衛星写真・DEMなど)と抽出したい形のポリゴンシェープファイル(どんなに複雑な形状でもOK)を用意する。

○作業手順
ArctoolBoxより、Spatial Analystツール>抽出>マスクで抽出(Extract by Mask)を実行。

【入力ラスタ】欄に、先ほどのラスタを指定
【入力ラスタ、またはフィーチャマスクデータ】欄に、先ほどのshapeファイルを指定
【出力ラスタ】欄は、出力先なのでお好きなフォルダ&ファイル名を指定

これだけの手順で、ポリゴンと重なった部分のみで作られたラスタデータを作成することができます。

ドーナツポリゴン(穴の開いたポリゴン)の作り方

ArcGISでは、一般的に以下のa,bどちらかの手順でドーナツポリゴンを作成できます。

a.フィーチャを新規作成する場合
 まず、外側のポリゴンを作成したら「パート編集終了」をクリック
 次に内側の境界線を作図したら「スケッチ終了」をクリック

b.すでにあるポリゴンを使う場合
 内側のポリゴンを選択し、エディタツールバーよりクリップを選択し、バッファ距離=0、「重なる領域を削除」を指定すると内側が消える

ただ上記手順では、1回に付き穴を1つしか開けることが出来ないため、穴を開けたい箇所が多数ある場合、上記手順では面倒です。

以下の手順を踏めば、穴の開きまくった虫食い状態のポリゴンでも一気に作成することが出来ます。

  1. 内縁線と外縁線を書いてあるポリゴンshpファイルを用意する。
  2. そのファイル1つだけを使ってインターセクト
  3. 出来上がったファイルをコピーし、外縁線よりも大きなポリゴンを作図する(適当な形でOK)。
  4. 1番と3番のファイルを使ってインターセクト
  5. 4番のファイルから2番のファイルと「正確に一致する」ポリゴンを削除

標高データから、河川および流域界を抽出する

ArcGISおよびSpatialAnalystを使って、レーザープロファイラのデータや数値地図50mメッシュ標高などから、河川(というか水が流れそうな所)や流域界を自動的に抽出することができます。

作業手順は『図解ArcGIS Part2 ~GIS実践に向けてのステップアップ~』に載っているので、必要な場合はそちらを参考にしてください。

簡単な手順

  1. 標高値をラスタ(標高グリッド)化にする
    名前は何でもいいですが、ここではdemとします。
  2. データをスムージングする。
    何も補正していない生データ(dem)を使うと、小さな凸凹に影響を受けて集水域が上手く作成できない場合があるため、解析のためのスムースなデータに変換します。微妙な凸凹を除去するには、Fillコマンドを使います。
    ArcToolbox > Spatial Analyst Tools > 水文解析 > Fill
    入力サーフェスラスタ dem
    出力サーフェスラスタ fill_dem
  3. グリット毎に水が流れる方向を計算します。
    ArcToolbox > Spatial Analyst Tools > 水文解析 > FlowDirection
    入力サーフェスラスタ fill_dem
    出力流向ラスタ fd
    ラスタには、流れの方向(北64、北東128、東1、南東2、南4、南西8、西16、北西32)という値が格納されます。
  4. 累積流量を計算する。
    ArcToolbox > Spatial Analyst Tools > 水文解析 > FlowAccumulation
    入力流向ラスタ fd
    出力累積流量ラスタ fa
    出力データタイプは、Integerにしておきましょう。
    入力加重ラスタに値を入れない場合には、単純に流れる方向に累積していったセルの個数が値として反映されます。川は、流域から水が集まって形成されますので、ある程度値が入っているセルのみ表示させれば、澪筋がどこなるか分かります(この作業を次項Conで行う)。
  5. 河川グリッドの作成
    ArcToolbox > Spatial Analyst Tools > 条件 > Con
    入力条件付きラスタ fa
    条件式がTRUEのときの入力ラスタ、または定数値 1
    出力ラスタ con
    条件式 Value >=100 とか
    流域を抽出したい河川の規模にあった条件式で抽出します。大河川で集水メッシュ数が多いのに、条件式につかう値を小さくすると、流域が細切れすぎて使いにくいです。
  6. 支流毎にグループ分け
    ArcToolbox > Spatial Analyst Tools > 水文解析 > Stream Link
    入力河川ラスタ con
    入力流向ラスタ fd
    出力ラスタ sl
  7. 集水域の作成
    ArcToolbox > Spatial Analyst Tools > 水文解析 > Watershed
    入力流向ラスタ fd
    流出点データの入力ラスタ、またはフィーチャ sl
    出力ラスタ ws
    シンボルを個別値で塗り直せば、流域抽出完了です。

CADファイルのXYZ座標を取得するプログラム

このような特殊な物を必要としている人はほとんどいないと思いますが、必要に迫られてAuutoCADで書いた線の座標を片っ端から抽出プログラムを作りました。 

  1. このプログラム(autocad-xyz.exe)と同じフォルダに、AuroCADのログファイルをacad.txtという名前で保存する。
  2. プログラムを実行すると、同じフォルダにoutput.txtというファイルが作成されます。
  3. 中身をみれば一目瞭然ですが、不要な行が削除され、X,Y,Zデータのみが抽出されているはずです(特定の条件でしか試していないので、削除漏れがあるかもしれません)。

ArcGISのジオメトリ変換ツールでラインをポイントにしても良いのですが、まぁ、AutoCAD単体で3次元のDMデータを点にしたいときに使ってください。

条件を指定して点を抽出

ArgGISでは、様々な条件を指定してデータを抽出することが可能です。

例えば、距離というフィールドに起点からの距離が入っているとして、属性検索を以下のようにする。

mod (“距離”,500) = 0

距離を500で割った余りが0の物を選択するといった意味で、500mごとの点が抽出されます。

属性検索は、単純な値を抽出するだけではなく特殊な検索もできますので、式さえ組めればデータの抽出・整理が非常に楽になります。

AutoCADで作った横断図等の座標一覧表をつくる

AutoCADの持っているカスタマイズ機能を駆使して、LISPやVBAなどによるマクロを作ってもよいのですが、AutoCADのLT版でできる、手軽で手っ取り早い方法を紹介します。 
手順を書くと長いですが、操作自体はクリックしまくるだけなので簡単です。

■AutoCADでの操作

1.各断面をポリラインにして、繋げる

2.要に応じて、DLを分かりやすい高さに移動させる
  (やらなくても可。やった方がデータを見やすくなる)

3.河道の中心線に目安となるxlineを引く
  (やらなくても可。やった方がデータを見やすくなる)

4.logfilemodeを1にする
  (LOGFILEPATHに、全ての操作を記録したファイルが作成されます)

5.●SPほにゃららと打ち込む
  (ログファイルを見やすくするため)

6.UCS原点をDLとxlineが交差する点にセットする
  (UCSツールバーを表示させて、原点ボタンをクリックするだけ)

7.横断線を選んでlistを表示

8.(5~7)を断面の数だけ繰り返す
  その際、毎度毎度●SPほにゃららを打ち込むのは面倒なので、
   十時キーの上を2回押す>BSキーを押す>新しい数字を入力
  とすると、楽です。

9.全ての断面のlist取得が終わったら、logfilemodeを0に戻す

■出来上がったテキストファイルの操作

1.秀丸などの「正規表現」が使えるソフトでlogファイルを開く

2.置換で、以下の文字列を消す
  (^\n|^(?!コマンド: ●.*)(?!.*点の位置.*).*$)

3.置換で、以下の文字列を消す
  (コマンド: |X=|Y=|  Z=.*|          点の位置  |^ *|)

4.置換で、以下の文字列を,に置換する
  ( +)

接しているメッシュの属性値を取得する

『接続対象となるメッシュ』に接するメッシュを作成する手順

  1. 『接続対象となるメッシュ』のバッファーを作成
    50mメッシュだとすれば50mの角丸バッファを作る
  2. 空間検索で、作成したバッファに含まれるメッシュを選択対象に追加する
    (「重なる」ではなく「含まれる」にするのは、角が接しているだけのメッシュを排除するため)
  3. 空間検索で、『接続対象となるメッシュ』と重なるメッシュを選択対象から除外する
  4. データをエクスポートする

上記1~4でファイルを作成したら、テーブルを空間結合して、最小値を取得する
最小値を取得するのは、複数のメッシュに接している場合、1つの値だけが欲しいから。