「Pythonを使用してネパールの地形図を作成する」
Creating a topographic map of Nepal using Python
イントロダクション
あなたの国の地勢が経済や政治の発展にどのような影響を与えるのか、気になったことはありませんか?等高線を使用して地球の表面を可視化する地形図は、これらの疑問に答えるのに役立ちます!私たちはPythonを使用して、興味深い地形環境を持つネパールのための地形図を作成します。国の地形を記述する地理空間データを読み取り、このデータを解釈し、可視化する方法を学びます。結果として得られる地図は、国の地形が経済や政治の発展にどのような影響を与えるかを理解するために、非常に詳細な地方レベルで他の関心のあるデータと組み合わせることができます。このブログ記事では、政策や民間セクターの発展に関する情報を提供できる非常に興味深いツールを生成する方法を教えます!
学習目標
- デジタル標高データのデータ分析技術を習得する。
- Pythonで地理空間データと関連する分析ツールの使用方法を学ぶ。
- マッピング技術の知識を習得する。
- 効果的なデータ可視化のためのスキルを開発する。
- 不平等と貧困における標高の重要性を理解する。
この記事は、データサイエンスのブログマラソンの一部として公開されました。
トポグラフィックマップとは何ですか?
トポグラフィックマップは、等高線を使用して地球の表面を可視化する地図です。トポグラフィックマップは、見知らぬ地形をナビゲートするための貴重なツールであり、都市計画や災害管理の入力としても役立ちます。これらの地図は、インフラ開発に関する政策や民間セクタープロジェクトの空間的な文脈を理解するために頻繁に使用され、自然災害の脆弱な地域や教育、医療、インフラなどの必要なサービスへのアクセスが制限されている地域を特定するためにも使用されます。最終的に、これらの地図は、エビデンスに基づいた意思決定のための入力として機能することができます。このブログ記事では、興味深い地形環境を持つネパールのための地形図を作成するためにPythonを使用します。
データの説明
私たちの地図を生成するために、私たちはアメリカ合衆国地質調査所(USGS)が公開したデータに頼ることになります。USGSは、自然資源、地質学、地理学、水資源、自然災害に関するデータや研究を生成するアメリカ連邦政府の科学機関です。彼らのデータページにアクセスするには、Googleで「USGSデータ」と入力するか、彼らのEarth Explorerにリンクするリンクをクリックします。Earth Explorerは、地球科学データの検索、アクセス、ダウンロードを可能にするオンラインツールおよびデータポータルです。データをフルに使用するためにはアカウントを設定し、ログインする必要があります。
データのダウンロード
このブログ記事では、ネパールを例に挙げます。ネパールは世界でも最も困難で興味深い地形を持つ国の一つです。8,000メートル以上の山のうち8つがネパールにあります(Trekking Trail Nepal)、そしてこの国は山岳地帯、丘陵地帯、テライ(平原)の3つの非常に異なる地形地域に分かれています(DHS)。これらの特徴は、国をユニークで興味深いものにしていますが、一部の研究では、ネパールの地形が国を接続すること、人口に必要なサービスを提供すること、持続可能な発展の道にリスクと障壁を課すことが困難であると示しています。
このため、検索条件でネパールをフィルタリングします。下の画像に示されているように、ネパールを選択したら、興味のあるデータセットを選択します。データセットタブをクリックし、デジタル標高を選択してください。デジタル標高データにはいくつかのオプションがありますが、いくつかのデータセットを使用することができます。私たちはGlobal Multi-resolution Terrain Elevation Data 2010 GMTED2010データを使用します。このデータは、地球の地形を複数の解像度(おおよそ250メートルから1キロメートルまでの範囲)で提供します。これは、衛星高度計、立体視画像、地形図などの宇宙搭載および航空搭載のリモートセンシングデータから生成されます。
データを選択したら、結果タブをクリックします。ダウンロードオプションを持つシンボルをクリックしてデータをダウンロードすることもできます。フットプリントアイコンをクリックしてデータを表示することもできます。最高解像度のデータ(7.5アーク秒)でデータをダウンロードします。重要なことは、ネパール全体をカバーするために、下にあるデータの2つの異なるモザイク(パーツ)をダウンロードして後で結合する必要があるということです。結果として得られるデータセットは、ラスターデータを示すtif形式です。
Pythonでジオスペーシャル分析ツールを使ってデータを準備する
Pythonには、ジオスペーシャル分析のためのいくつかのツールがあります。このブログ記事では、ジオスペーシャルラスタデータ(グリッドデータ)の読み書きを可能にするRasterioライブラリを使用します。まずは、以前にダウンロードしたデータの最初のモザイク(部分)をJupyter Notebookに読み込んでみましょう:
#関連するライブラリをインポートする(インストール後)
import rasterio
import matplotlib.pyplot as plt
import numpy as np
#データを読み込んでデータセットの形状を表示する
file = rasterio.open(r'path\10n060e_20101117_gmted_mea075.tif')
dataset = file.read()
print(dataset.shape)
次に、2つ目のモザイクをアップロードし、それらをマージして結合します。そのために、Pythonで標準的なラスタデータの読み込みと操作の技術に従います:
#2つ目のデータセットをアップロードし、データセットの形状を表示する
file2 = rasterio.open(r'path\30n060e_20101117_gmted_mea075.tif')
dataset2 = file2.read()
print(dataset2.shape)
#両方のデータセットを結合する
from rasterio.merge import merge
from rasterio.plot import show
#空のリストを作成する
src_files_to_mosaic = []
#リストに両方のファイルを追加する
src_files_to_mosaic.append(file)
src_files_to_mosaic.append(file2)
src_files_to_mosaic
#両方のファイルを結合する
mosaic, out_trans = merge(src_files_to_mosaic)
#メタデータをコピーする
output_meta = file.meta.copy()
#メタデータを更新する
output_meta.update(
{"driver": "GTiff",
"height": mosaic.shape[1],
"width": mosaic.shape[2],
"transform": out_trans,
}
)
#出力先に書き込む
#モザイクラスタをディスクに書き込む
out_fp = r"path\Nepal_Mosaic.tif"
with rasterio.open(out_fp, "w", **output_meta) as dest:
dest.write(mosaic)
#結合されたラスタデータを開く
file_mosaic = rasterio.open(out_fp)
#データを読み込む
dataset_mosaic = file_mosaic.read()
print(file_mosaic.shape)
#データを表示する
plt.imshow(dataset_mosaic[0], cmap='Spectral')
plt.show()
グローバルマルチ解像度地形高度データ
今、私たちはネパール全体の結合されたグローバルマルチ解像度地形高度データ2010 GMTED2010データを持っていますが、このファイルはネパールの一部ではない周辺地域もカバーしています。ネパールの領域を制限するために、ネパールのシェープファイルを使用します。世界の国境のシェープファイルを使用します。このデータセットはここからダウンロードできます。それでは、ラスタデータとシェープファイルをマスク関数を使用してクリップしてみましょう。シェープファイルの最初の行とジオメトリカラムのみを使用します。この操作の結果はclipped_arrayに保存され、それはクリップされたラスタデータで、clipped_transformはクリップされたラスタの変換情報を表します。
import geopandas as gpd
from shapely.geometry import mapping
from rasterio import mask as msk#import csv
#世界の国境のシェープファイルをアップロードする
df = gpd.read_file(r'path/world-administrative-boundaries.shp')
#ネパールに制限する
nepal = df.loc[df.name=="Nepal"]
nepal.head()
#データをクリップする
clipped_array, clipped_transform = msk.mask(file_mosaic, [mapping(nepal.iloc[0].geometry)], crop=True)
#
残っている問題が1つあります。ラスタデータのノーデータ値は非常に損傷が大きいです。そのため、これらは値の範囲の一部となるため、地図の可視化を歪めます。
問題を理解する
この問題を以下のように解決します(このブログ記事で説明されている方法):
- ノーデータ値に対処する関数を作成します。クリップされた配列で「ノーデータ」として考慮される値を指定するためのノーデータパラメータを構築します。この場合、それは(np.amax(clipped_array[0]) + 1)に設定されており、クリップされた配列の最大値に1を加えた値と等しいです。この値は「ノーデータ」として扱われます。
- クリップされた配列の最小値の絶対値をクリップされた配列の最初のバンド(インデックス0)に加えることで、クリップされた配列のすべての値が非負になるように調整します。
- クリップされた配列の値の範囲も計算します。これには、クリップされた配列の最大値と最小値の絶対値を加えます。計算された値の範囲はvalue_range変数に格納されます。
- 既存の色値辞書(シーズミック)を基に手動で構築された色-値の辞書を使用し、「ノーデータ」値の背景色を定義します。
- 最後のステップでは、新しいカラーレンジであるnew_seismicを使用してマップをプロットします。
#データが存在しない値を調査しましょう
nodata_value = file_mosaic.nodata
print("データが存在しない値:", nodata_value)
#データが存在しない値: -32768.0
#データが存在しない値を最大標高よりも1つ大きい値に変更する
def clip_raster(gdf, img):
clipped_array, clipped_transform = msk.mask(img, [mapping(gdf.iloc[0].geometry)], crop=True)
clipped_array, clipped_transform = msk.mask(img, [mapping(gdf.iloc[0].geometry)],
crop=True, nodata=(np.amax(clipped_array[0]) + 1))
clipped_array[0] = clipped_array[0] + abs(np.amin(clipped_array))
value_range = np.amax(clipped_array) + abs(np.amin(clipped_array))
return clipped_array, value_range
nepal_topography, value_range = clip_raster(nepal, file_mosaic)
#動作確認
print(value_range)
#データが存在しない値に新しい背景色を設定する
from matplotlib import cm
from matplotlib.colors import ListedColormap,LinearSegmentedColormap
#Seismic
new_seismic = cm.get_cmap('seismic', 8828)
#背景色を定義する
background_color = np.array([0.9882352941176471, 0.9647058823529412, 0.9607843137254902, 1.0])
#カラーマップを使用する
newcolors = new_seismic(np.linspace(0, 1, 8828))
# 背景色を新しいカラーマップ配列の最後の行に追加する
newcolors = np.vstack((newcolors, background_color))
#新しいSeismicカラーマップを使用する
new_seismic = ListedColormap(newcolors)
#最終的な地図を作成して保存する
plt.figure(figsize=(10,10))
c = plt.imshow(nepal_topography[0], cmap = new_seismic)
clb = plt.colorbar(c, shrink=0.4)
clb.ax.set_title('標高(メートル)',fontsize=10)
plt.savefig(r'パス\Topographic_Map_Nepal.png', bbox_inches='tight')
plt.show()
ボワラ!ネパールの地形図ができました。国内の異なる標高と三つの地形ゾーンが明確に示されています。
結論
アメリカ地質調査所(USGS)からの地理空間データを使用して、Pythonで地形図を生成する方法を学びました。また、可視化のために最終データセットの欠損値に注意する重要性も学びました。
政策立案者や実践者は、この地図をさらなる分析に活用できます。たとえば、貧困や自然災害の地図などと組み合わせて、関連性を分析することができます。政治におけるデータに基づいた意思決定を支援するための貴重なツールを生成しました!
重要なポイント
- 地形図は、データに基づいた意思決定のための有用なツールです。
- 地形と標高は、都市計画、サービス提供、不平等に重要な役割を果たします。
- Pythonには、地理空間データの解析に役立つツールがあります。
- このタイプのデータの欠損値に注意することは、可視化において重要です。
- 地理空間データの可視化は、分解されたレベルで貴重な情報を生成することができます。
この記事が役に立ったと思います。LinkedInで私に連絡してください。データを活用してポジティブな変化をもたらすために、つながりましょう。
よくある質問
この記事で表示されているメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量で使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles