GRASS SEEDS(チュートリアルB)
GISには,保存しているデータのレポート作成機能があります.この機能を用いると,あるテーマの地図に関するデータの要約や簡略な統計量を求めることができます.このセッションでは,前回あつかったいくつかの地図に関する情報の要約や統計を求めるという作業を行います.
このセッションは3つの短いエクササイズから構成されています.これらのエクササイズのどれから始め,そしてどれを最後としてもかまいません.しかし,なるべく簡単なエクササイズからスタートし,そこで操作技術をある程度身につけてから次のワンランク上のエクササイズに進むのが望ましいでしょう.
また,前回のレッスンでGRASSの動作環境や対話(インタラクティブ)形式に少しは慣れてきたでしょうから,この章ではディスカッションや説明の内容の量をセッションAよりも減らすことにします(セッション修了予定時間: 約2時間).
この章のエクササイズを始める前に,まずGRASSを起動し,データベース等を設定してください.起動や設定は前回のチュートリアルAと同じです.
Display 1
これから利用するコマンド一覧|
r.average d.rast d.what.rast r.report r.reclass d.mapcalc |
Display 2
このレッスンで扱うラスター地図|
ファイル名 |
地図の主題 |
|
crash |
自動車道路での衝突自己現場 |
このエクササイズでは,GRASSコマンド
r.averageを使って,地図から統計的データを求める作業を行います.r.averageはベース地図(base file)で同じカテゴリーを持つ地域におけるバリュー地図(values file;コマンド中ではcover)で示された値の平均値を求めるコマンドです.従って,2つのラスター地図が必要です.ベース地図は平均値を求める場所のカテゴリー,バリュー地図には平均したい統計データを指定します.例えば,「市街地/非市街地」というカテゴリーのファイル(urban)と,「人口」のデータが入っているファイル(popln)の2つがあったとします.この場合,例えば,市街地の人口の平均値を計算しようとするならば,urbanをベース地図とし,poplnをバリュー地図としてセットで使用することになります.ここでは,土地利用区分ごとの標高の平均値を求める作業を行います.土地利用区分は
landcov地図に,標高の情報はtopo地図に示されています.これらの作業を始める前に,モニターを起動してください.
Command :
d.mon start=x0 select=x0まず,
r.reportコマンドを使って,landcov地図に入っている土地利用のカテゴリーを確認して下さい.そして各カテゴリーの総面積の情報を求め,下の一覧表の中に記入して下さい.Command :
r.report landcov units=k
次に,
r.averageコマンドを用いて各土地利用カテゴリーの平均高度を算出して下さい.baseにlandcov(土地利用),coverにtopo(標高),output(出力するラスター地図)をavheightとします,Command :
r.average base=landcov cover=topo output=avheight平均高度値を含む地図
avheightを表示して下さい.Command :
d.rast avheightDiscussion
この画像はlandcov地図レイヤーに似ているように思われるかもしれませんが,この場合は別の色が使われています.
(クリックすると大きな図が表示されます)
それぞれの色が何を示しているか,わかりますか?
さて,ラスター地図レイヤーのカテゴリー値の統計を表示するにはr.reportコマンドを使うということはすでに学びましたが,ここではまた別の方法で試してみましょう.
Command :
d.what.rast avheightResponses : マウスをイメージの上に動かし,左ボタンをクリックすると,次のような3行があらわれると思います.
445175(E) 317675(N)
avheight in grass, quant (76)
avheight in grass, actual (76.300667)
Discussion
このうち一番上の行は先ほどクリックしたポイントのラスター地図上の地理座標を示しています.下の2行の括弧内の数字はカテゴリー(この場合は平均高度)を表わしています.上は整数表示で,下は実数値です.また,一度に幾つもの地図について調べた結果を表示することが出来ます.次の例では,avheightとlandcovの両方を同時に調べています.
Command :
d.what.rast landcov,avheight448325(E) 316175(N)
landcov in PERMANENT (5)Arable
avheight in grass , quant (104)
avheight in grass , actual (104.021431)
これにより,マウスで指定した場所の土地利用と平均高度の情報が同時に得られます.上記の例では,土地利用(landcov)はカテゴリー番号5番(Arable)で,その平均高度(avheight)は104.02…を表しています.
前に記入した表の各項目をすべて確認して下さい.確認し終えたらマウスの右ボタンをクリックして下さい.なお,場合により色の差がほとんどなく識別しにくいこともあります(landcovのカテゴリー3と4は見つけにくい).その場合は,再度landcovを表示して,位置を確認しながらコマンドを実行して,調べなおしてください.
Discussion

得られた結果が,0.01の単位まで上記のものと同じであることを確認して下さい.この表は,メートルで表わされた,landcovファイルに含まれる8つの土地利用カテゴリーの平均高度を表したものです.
これらの値はそれぞれ適切な数値であると思いますか? この結果から,海抜高度が気候や植生におよぼす影響は何だと思われますか? また,それとほぼ同等と思われる別の要因についても考えてみて下さい.
研究対象地域における河川の汚染問題を調べる調査団の一員になったと仮定してみましょう.この場合,汚水源は主に産業廃棄物や,耕地から流れ出る農薬などの化学物質が可能性として考えられということにします.まず,この問題に関する最初の見積りを行うにあたって,耕地や産業地帯を流れる川の距離を調べておくと,よい手がかりになるでしょう.
この処理は次の3段階,
1. 土地利用図からの目的の場所(耕地・産業地帯)を探す,
2. 耕地や産業地帯を流れる川を探し出す,
3. その川の流れる距離を計算する,
から構成されています.
さて,最初のステップは土地利用のラスター地図を再分類(reclass)し,耕地(Arable)と産業地帯(Industry)のみが対象となるようにします.なお,以降のResponsesには,必要な部分のみを表し,それ以外は省略してあります(実際には,もっと多くの文章が表示されます).
Command :
r.reclassResponses : RECLASS: Program for reassigning category codes
Enter name of data layer to be reclassified(再分類するラスター名)
>
Enter name of NEW RECLASSIFIED map(再分類結果の新しいラスター名)
>
arabl_indPlease indicate how you would like the reclass table initialized
2
(すべての値をnullにセットする)<Esc><Enter>
(Escキー,Enterキーを順に押す)nullとは,データがない(no data)ということを意味します.
次に,landcovで分類されていたカテゴリーに対して,古いカテゴリー(OLD NUM)と新しいカテゴリー(NEW NUM)が表示されます.新しいカテゴリーはすべて先ほど指定したnullになっています.ここでは,新しいカテゴリーを変更します.行の移動は
<Enter>キーです.カーソルをIndustry(産業地帯)の行に移動してください.そこで,新しいカテゴリーとして1を入力し,後ろをスペースキーで消しましょう.さらに,カーソルがArable(耕地)の行に来るまで<Enter>キーを数回押し,そこも同様に1にします.正しくできたかどうかを確認し,<Esc>キー<Enter>キーを順に押します.次に,新しく再分類した地図レイヤーにタイトルとカテゴリーの説明を与える必要があります.以下のように記入して下さい(前の文字の上に新しい文字を重ねて入力することも出来ます).:
[arabl_ind] ENTER NEW CATEGORY NAMES FOR THESE ENTRIES
TITLE :
Arable and Industrial Landuse______CAT NEW CATEGORY NAME
NUM
0 Background
________________________________1 Industrial/Arable
________________________<Esc><Enter>
(Escキー,Enterキーを順に押す)r.reclassコマンドで作成されるラスター地図は,通常のラスター地図とは異なるので注意が必要です.先ほどオリジナルのラスター地図を再分類したことによって,カテゴリー値を変えた新しいラスター地図を定義しました.しかし,この作業は完全な新しいラスター地図を作成したのではなく,単にオリジナル地図とは違った内容の別な‘再分類(reclass)’ファイルを作成しただけです.そのため,オリジナルのラスター地図を消去すれば,再分類された新しいラスター地図もそれに伴って消去されてしまいます.
先程の再分類の作業がうまくいったかどうか確かめるために,
d.rastを使って新しいファイルarabl_indを表示してみましょう.また,河川や貯水池の分布状態を示す地図waterも表示してみましょう.
(クリックすると大きな図が表示されます)
(クリックすると大きな図が表示されます)
次のステップは,耕地や産業地帯を流れる河川を探し出すという作業を行います.
Command :
r.mapcalcResponses : mapcalc>
polrivers = arabl_ind * watermapcalc> <Enter> (Enterキーを押す)
Discussion
r.mapcalcは,ラスター地図をmap algebra(地図代数)という概念で操作する機能です.ラスター地図を数学の方程式における変数として扱います.これらは上の例のように非常にシンプルになりますし,様々な数学の関数等を駆使することにより,より高度な計算が行えます.地図代数法という方法は,空間情報を扱うには非常に有能かつ柔軟な方法なのです.以上の例では,ラスター地図
arabl_indの各セルに,地図waterにおける同じ位置のセルの値を‘掛け合わせる’という計算が行われました.null値は何を掛けてもnullとなります.その結果でき上がった地図には,両方の地図において非null値のエリアのみが示されています.さて,次は汚染区域と考えられるエリアを流れる河川の長さを計ります.しかし,直接にその長さを計らなくても,
r.reportコマンドを使えば,おおまかな距離を知ることが出来ます.Command :
r.report polrivers units=cellDiscussion
polrivers地図の中のセルの数が表示されると思います.各区域における河川の大体の長さは,この数に50を掛けたものです(ここでの設定では,各セルの寸法は縦横50mです.このことは覚えておいてください) .この計算からどのような結果が出ましたか?
その結果より良い答えがあると思いますか?
この数値は実際の長さを上回ると思いますか,それとも下回ると思いますか?
河川のような線状の形態を計測するには,
d.measureコマンドを使うとよいでしょう.このコマンドを使うと,動作中のグラフィック・ディスプレイ上の線図形の寸法(面積も可能)を計測することが出来ます.しかし,polriver地図に表示された全ての地区における河川の長さをすべて計算するのはたいへん時間がかかるために,1つの地区のみを取り出したsegment地図をすでに準備しています.まずは,d.rastを使ってsegment地図を表示してみましょう.Command :
d.rast segment
(クリックすると大きな図が表示されます)
つぎに,
d.measureコマンドを実行して長さを測定します.Command :
d.measureResponses : Buttons:
Left: Where am i
Middle: Set FIRST vertex
Right: quit this
マウスを河川の端の点に置き,中央のマウスボタンをクリックして下さい.
(マウスが2つボタンの方は,右と左のボタンを同時に押す.)
Responses : Buttons:
Left: Where am i
Middle: set NEXT vertex
Right: FINISH
中央のマウスボタンを押しながら川の線をなぞり,最後まで来たら右ボタンをクリックします.下記のように測定の途中結果が表示されます.
Right: FINISH
LEN: 482.14 meters
LEN: 849.26 meters
LEN: 1216.37 meters
Responses : Buttons:
Left: DO ANOTHER
Middle:
Right: quit this
最後まで行ったら,もう一度右ボタンをクリックします.計測した線の長さとそれでできる面の面積が表示されます.次に,モニターに表示している画像のサイズを大きくして,もう一度先ほどの
segment地図で河川の長さを測ります.目的の領域をズームして拡大するコマンドは,d.zoomです.Command :
d.zoomResponses : Buttons:
Left: Establish a corner
Middle: Check coordinates
Right: Accept
マウスでカーソルをモニター画像の中に移動し(カーソルが十字に変わり,線が表示されます),画面内の左上端のところ付近(正確でなくても良い)でマウスの左ボタンをクリックして下さい.画面に下記のようなものが表示されます.上の行は,画面上での点の位置,下は本当の座標値です(値は,指定した点により異なります).
screen_x: 27 screen_y: 2
north: 321950 south: 321900 east: 444100 west: 444050
次に,マウスを動かすと先ほどの点と現在の十字の位置を囲む細い線でボックスが表れます.画面の中心にカーソルを移動しマウスの右ボタンを押します.これで画面をおよそ4分の1のサイズにします(失敗したら,もう一度やり直します).モニター画面の左端に赤いボックスが表示されるので,
YESをクリックして新しい領域を承認します.次は,ズーム・インした場所を有効にするためにd.eraseコマンド(画面表示の消去と画面の再設定)を実行します.Command :
d.erased.rast
でsegment地図を表示します.この時,表示が前より拡大されているため,地図の構成要素であるラスターセルが粗くなり,各点が四画く見えると思います.d.measure
を使って,再度河川の一部の長さを測り,その結果を記述して下さい.d.zoom
を使ってさらにズーム・インし,河川をボックスからはみ出さない程度に出来るだけ大きく表示して下さい.d.eraseとd.rastを用いて河川の部分を表示し,そしてd.measureを用いて河川の線の長さを計測し,その結果を記述して下さい.r.report
を使って,polriversにおける河川を計測してみましょう.そしてこれをd.measureで計測した3つの区域の長さと比較してみましょう.d.measure
から得たそれぞれの河川の長さは,なぜこのように互いに異なっているのでしょうか?最後に,
g.regionコマンドでデータ表示する領域を最初の大きさに戻しましょう(オプションの-dは,デフォルト(標準設定)にすることを意味します.この操作に関してはセクションCでより詳しく説明します).Command :
g.region -dCommand :
d.eraseGISは本来非常に強力な意思決定サポートシステムを特徴としていますが,中でもとりわけ優れた能力として,ある出来事が起こった状況を仮想してモデル化するという機能があります.このようなシステムや技術は,すでにいくつかの国で災害対策や住民の避難に役立てるために,実際に採用されています.
このレッスンで用意されたデータでは限界があるため,ここではごく単純な例を紹介する程度しかできません.それでもこの機能の基本的な原理を説明するには役に立ちます.
危険な化学物質を積んだ貨物車(列車,あるいは自動車)が対象地域を通るとします.もし,この貨物車がなんらかの事故を起こし,爆発した化学物質が気体となって拡散したとします.当然ながらその地域社会にとって非常に危険な事態となるため,事故現場から例えば1000m以内に住む住民はただちに避難をしなければならないとします.貨物車の輸送ルートに関しては,鉄道か自動車道かを選択することにします.ルートの選定をするにあたって,事故発生後に被害を受けると考えられる範囲内に住む住民の人口を判断の基準にする必要があります.さて,これからGRASSを使ってこの答えを出してみましょう.
鉄道あるいは自動車道から各々1000m以内の地区の住民の人口を求めるためには,2つのステップを行なわなければいけません.第1ステップはこれら2つの輸送ルートからそれぞれ1000m以内の区域を示す地図を新たに作成します.第2ステップでは,
popln(人口)地図からこれら2つの区域の人口の総計を出すという作業をします.まず最初に,鉄道および自動車道(Motorway)から1000m以内のエリアの地図をそれぞれ作成します(鉄道のラスター地図は
rail,道路のラスター地図はroadsです).これにはラスター地図からのラスター形式のバッファーゾーンを求めるコマンドr.bufferを用います.バッファーゾーンとは,ある点から指定した距離の間にある領域です.このコマンドでは,入力されたファイルの非nullの各セルから,その他の各セルまでの距離をユークリッド幾何学的(あるいは直線的)に求め,指定された区間ごとに表わしたものをバッファーゾーンとし,新しいラスター地図を作成します.Command :
r.buffer rail distances=1000,20000 output=railbuf_temp(ラスター地図
railの中の非nullのセル(鉄道の位置)から,距離1000m以内,20000m以内(distances=1000,20000)に領域を区分けした新しいラスター地図railbuf_temp を作成します.1000m以上という指定はできないので,その代わりに全領域の大きさ12000m(50m×240セル)よりも大きい20000mを指定し,1000m以上(20000m以内)の領域としました.)
(クリックすると大きな図が表示されます)
次は自動車道についても同じ操作をします.そのためには,道路地図(
roads)から自動車道(Motorway)を探し,自動車道のみの地図(mway)を作成します.これは,r.reclassコマンドで再分類することにより作成します.Command :
r.reclassResponses : RECLASS: Program for reassigning category codes
Enter name of the layer to be reclassified
>
Enter name of the NEW RECLASSIFIED map
>
mway:
再分類する操作に関しては,これまでにある程度慣れているはずです.自動車道(
Motorway)を値1,それ以外のカテゴリー値をnullになるようにして下さい.また,適当なタイトルとカテゴリー名を付けてください.次は,この
mway地図を用いて自動車道周辺の1000mのバッファーゾーン(mwaybuf_temp)を求めます.手順は先ほどと同じです.Command :
r.buffer mway distances=1000,20000 output=mwaybuf_temp新しい地図レイヤー
railbuf_tempとmwaybuf_tempを表示し,間違いがないかどうかチェックしてみましょう.Discussion
地理的対象物の周囲に対象物の影響がおよぶ範囲を,それ自身の境界を拡張してバッファーゾーンとして設定するという作業は,GISではごく一般的です.この2つの地図では両方とも,対象(鉄道や自動車道)とバッファーゾーンとを区別しています.しかし,このエクササイズでは,特にこれらを区別する必要はありません.そこで,これらを1つにまとめましょう.また,1000m以上の領域(カテゴリー番号
3になっている)は,対象外なので0にしましょう.Command :
r.reclassResponses : Enter name of the layer to be reclassified
>
Enter name of the NEW RECLASSIFIED map
>
mwaybufカテゴリーを一度すべてゼロ(0)するを選ぶ.
<Esc><Enter>
さらに下のように変更する.
OLD CATEGORY NAME OLD VAL NEW VAL
distances calculated from these locations 1 1____
1000 meters 2 1____
20000 meters 3 0____
<Esc><Enter>
タイトルとカテゴリー名を入力する.
TITLE :
Motorway Buffer0
Background1
1000m_around_M<Esc><Enter>
railbuf_temp
についても同じ作業をして,新しい地図レイヤーrailbufを作りましょう.バッファーゾーンの内側に住む住民の人口を計算する前に,2つのエリアを1つのファイルにまとめておくと作業はいくらか簡単になります.これは必要というわけではありませんが,最も効率的な方法と考えられるからです.これを
r.mapcalcコマンドで次のように求めます.なお,railbufを2倍したのは自動車道と鉄道のバッファーゾーンを区別するためです.これにより,自動車道のバッファーゾーンは1,鉄道のバッファーゾーンは2に,両者が重なる場所は3になります.Command :
r.mapcalcResponses : mapcalc>
buffers = mwaybuf + railbuf * 2EXECUTING buffers2 = ... 100%
CREATING SUPPORT FILES FOR buffers2
range: 0 2
mapcalc>
<Enter> (Enterキーを打つ)buffers
地図を表示して,次の操作に移る前に期待どおりの結果が得られたかどうか確かめてみましょう.都合の良いことに鉄道と自動車道のバッファーゾーンが重なっていないので,3の地域はでてきません.
(クリックすると大きな図が表示されます)
以上の作業で,バッファーゾーンの人口を計算するための準備が整いました.r.mapcalcコマンドを用いて,バッファーゾーン(
buffers)と人口分布(popln)を用いて,それぞれの輸送経路周辺の事故により被害が予想される危険地域の人口を示す地図at_riskを求めます.Command :
r.mapcalcResponses : mapcalc>
at_risk = buffers * poplnEXECUTING buffers = ... 100%
CREATING SUPPORT FILES FOR buffers
range: 0 2
mapcalc>
<Enter> (Enterキーを押す)予想される危険地域の人口分布を見るために,計算結果の
at_risk地図を画面に表示てみて下さい.
(クリックすると大きな図が表示されます)
最後に,
at_riskのそれぞれのグループの人口を定量的に比較して下さい.Command :
r.report at_risk units=cellこのデータのみを参考とした結果,どちらの輸送ルートが危険な化学物質を運搬するのによいと思われますか?
rail地図レイヤーを再び表示して下さい.このレイヤーの中でまだ気にかかる要素はありませんか?
コストの関係で,自動車道を使ったルートが決定されたと仮定します.そして,不幸なことに,化学物質を積んだ貨物自動車は衝突事故に巻き込まれ,化学物質がこぼれて火災になったとします.化学物質の有毒煙による大気汚染の危険がおよぶ範囲(衝突現場から1000m以内)の住民を別の場所に避難させる必要があります.その住民の人口を見積りましょう.
ラスター地図
crashは衝突現場を示しています(表示してよく見ましょう).r.bufferコマンドを用いて,事故現場から1000mのバッファーゾーンを作成して下さい.Command :
r.buffer crash distances=1000,20000 output=crashbuf_temp次に,
r.reclassコマンドを用いて,前と同じように,1000m以内を1,それ以外を0とするバッファーゾーンを表す新しいラスター地図crashbufを作成してください.処理の対象地域を限定するマスク機能(第3回講義の最後を参照)を実現する
r.maskコマンドを用いて,これ以降の処理の対象範囲をこのバッファーゾーンcrashbufのみに限定しましょう.Command :
r.maskResponses : Options:
1 Remove the current mask (現在のマスクを取り除く)
2 Identify a new mask (新しいマスクを指定する)
RETURN Exit program
>
Enter name of data layer to be used for mask
>
crashbufr.reclass
コマンドを用いる場合と似た形式が表示されます.目的と同じ指定になっているので,ここでは変更する必要はありません.<Esc><Enter>
<Enter>
Discussion
r.maskコマンドはマスクと呼ばれる特殊なラスター地図MASKを作成します.このMASK地図は現在対象としている地域以外を「隠す"hiding"」ことで,余分な要素をすべて取り除く働きをします.この場合では,衝突現場から1000mを超える地域は必要ではなく,MASKにおいては値ゼロとし,1000m以内の地域の値は1とします.
d.rastを用いて他の地図を表示すると,MASKの効果を見ることができます(例;landcovを表示してみましょう) .以上で
MASKが完成したので,次はr.reportを使って避難させる必要のある住民の人口を調べてみましょう.Command :
r.report popln units=cell以上の結果に基づいて,事故現場周辺の住民を非難させたとします.さらに,有毒煙による大気汚染が南西からの強い風によって北東へと拡大したとしましょう.しかし,次の日まで,この大気汚染の拡大による影響が,住民が避難しなかった地域へもおよんでいたことがわからなかったとします.大気汚染の拡大は地図
spillageで見ることが出来ます.spillage地図のすべてが表示できるように現在のMASKを解除しなければなりません.MASKの解除は,通常のラスター地図を削除するのと同様にg.removeコマンドを用います.Command :
g.remove rast=MASKCommand :
d.rast spillage大気汚染は
spillage地図中で値が5以上の場所の人々に被害をおよぼした可能性が高く,それらの人々のために健康診断を行なう必要があるとします.そこで,まずは大気汚染による被害の可能性がある人口を調べます.この作業はr.maskコマンドとr.reportコマンドとを用いて行なうことができます.Command :
r.maskmask
に対して用いるラスター地図としてspillageを入力することと,カテゴリー5以上に1を入力することを除いて,あとは全て以前と同じ操作です.なお,ガテゴリーは30まであり,複数のページになっているので注意してください.次のページにうつるのは<ESC><Enter>です.Command :
r.report popln units=cellこれで大気汚染の拡大による被害の可能性のある地域の人口のセル数が求められました.しかし,汚染の拡大以前にすでに避難した人々(これらの人々は健康診断を行なう必要はないとしています)のことが考慮されていません.これを計算に入れるために,
r.mapcalcコマンドを用いて,すでに避難していた地域(crashbuf)をMASKから除外します.Command :
r.mapcalcResponses : mapcalc>
MASK = MASK - crashbufMASK - already exists. ok to overwrite ?(Y/N)
y(MASKがすでに存在するので,上書きして良いか?)
これでMASKからすでに人々が避難した地域を除外することが出来ました.
MASKを表示して確認してみて下さい.ほかのラスター地図レイヤーとまったく同様に
MASKの計算はr.mapcalcを使い,またそれを消去する場合,g.removeを使うということを覚えておいて下さい.最後に,健康診断を受ける必要のある住民の人数を調べます.
r.reportを使って被害区域のセル数を出したあと,この数に5.4(各セルの平均人口)をかけて計算して下さい.Command :
r.report popln units=cell(1) 研究地域の中で自動車道に沿って,最も高い高度(標高)の値を求めて下さい.
ヒント:この答えを出すには,
(2) エクササイズ2をもう一度考えてみると,すべての河川及び貯水池から例えば250m以内の耕作地と産業地帯を調べておくほうがより適切であると考えることもできます.
この章で作成したラスター地図は,次は使いません.もし,必要ならば,これらの地図をすべて削除することによってディスクの空きを確保することができますが,この作業は十分慎重に行って下さい.まず,最初に
g.listコマンドで,現在ディスクに保管されている地図レイヤーを全て再確認して下さい.ここで覚えておいてほしいのは,削除するのはPERMANENTマップセットのファイルではなく,自分自身のマップセットで作成したファイルということです.GRASSを終了するためには,まずこのセッションの間に開いたウインドウを閉じなければいけません.
Command :
d.mon stop=x0最後に,GRASSを終了して下さい.
Command :
exitGOOD BYE from GRASS !
これで終了です.