緯度データを度に変換する方法

13 ビュー (過去 30 日間)
Hiroki Takeda
Hiroki Takeda 2022 年 5 月 15 日
コメント済み: Hiroki Takeda 2022 年 5 月 16 日
緯度データを,度に変換したいと思っています。
「27-12.38N」を「27.206」(27+12.38/60)のように,単位を°に統一したいと考えています。
緯度データは,上記のようなものがtableで,10×1で入っています。
同様に,経度データも,「127-35.30E」のように入っており,同じようにしたいと思っています。
困っていることは以下です。
・計算方法は分を度に変換するだけなので27+12.38/60でよいが,緯度データのstringから,どのように文字を抜き出せば良いか方法がよくわからないため,処理ができない。
・File Exchangeなどで適切なものがあれば教えていただきたい。
ご教示くださいますと幸いです。よろしくお願いいたします。

採用された回答

Atsushi Ueno
Atsushi Ueno 2022 年 5 月 15 日
質問文に掛かれていない要件は、緯度経度の表現方法を参照して下記の通り補います。
  • 「27-12.38N」に含まれる'-'は符号ではなく、最初の数字(度)と次の数字(分)を分ける記号と想定します。
  • 「27-12.38N」⇒「27.206」と記号Nが消えるので、北緯は+、南緯はー、同様に東経は+、西経はーと想定します。
tbl = table({'27-12.38N'; '127-35.30E'; '35-34.12S'; '135-31.35W'}) % 適当なサンプルデータ
tbl = 4×1 table
Var1 ______________ {'27-12.38N' } {'127-35.30E'} {'35-34.12S' } {'135-31.35W'}
nums = regexp(tbl.Var1,'(\d+)\-(\d+(\.\d+)?)([NESW])','tokens'); % 正規表現で中身を抽出
nums = [nums{:}]; % ネスト状のセル配列を1段階ほどく
for i = nums
texts = [i{:}]
switch texts{3}
case {'N','E'}
num2str(str2num(texts{1}) + str2num(texts{2}) / 60)
case {'S','W'}
num2str(-str2num(texts{1}) + str2num(texts{2}) / 60)
otherwise
end
end
texts = 1×3 cell array
{'27'} {'12.38'} {'N'}
ans = '27.2063'
texts = 1×3 cell array
{'127'} {'35.30'} {'E'}
ans = '127.5883'
texts = 1×3 cell array
{'35'} {'34.12'} {'S'}
ans = '-34.4313'
texts = 1×3 cell array
{'135'} {'31.35'} {'W'}
ans = '-134.4775'
このような方法を任意に変更して適用すればよいと思います。
  3 件のコメント
Atsushi Ueno
Atsushi Ueno 2022 年 5 月 16 日
regexp関数の出力を紐解くのが面倒ですが、for文を回さなくても下記の様にセル配列(または行列)のまま処理可能です。
tbl = table({'27-12.38N'; '127-35.30E'; '35-34.12S'; '135-31.35W'}); % 適当なサンプルデータ
nums = regexp(tbl.Var1,'(\d+)\-(\d+(\.\d+)?)([NESW])','tokens'); % 正規表現で中身を抽出
nums = [nums{:}]; % ネスト状のセル配列を1段階ほどく
nums = reshape([nums{:}],3,[]); % セル配列をもう1段階ほどき3行ずつ並べる
nums = replace(nums,{'N','E','W','S'},{'1','1','-1','-1'}); % NEWS記号の符号化
nums = str2double(nums)' % 文字列から数値に変換、転置
nums = 4×3
27.0000 12.3800 1.0000 127.0000 35.3000 1.0000 35.0000 34.1200 -1.0000 135.0000 31.3500 -1.0000
result = (nums(:,1) + nums(:,2) / 60) .* nums(:,3)
result = 4×1
27.2063 127.5883 -35.5687 -135.5225
※上記回答で誤記がありました('35-34.12S'と'135-31.35W'の角度表記が異なる値になります)
【誤】-str2num(texts{1}) + str2num(texts{2}) / 60
【正】-(str2num(texts{1}) + str2num(texts{2}) / 60)
Hiroki Takeda
Hiroki Takeda 2022 年 5 月 16 日
早速にご教示くださり、誠にありがとうございました。
無事に作業を進めることができました。
今後ともよろしくお願いいたします。

サインインしてコメントする。

その他の回答 (0 件)

製品


リリース

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!