- 「27-12.38N」に含まれる'-'は符号ではなく、最初の数字(度)と次の数字(分)を分ける記号と想定します。
- 「27-12.38N」⇒「27.206」と記号Nが消えるので、北緯は+、南緯はー、同様に東経は+、西経はーと想定します。
緯度データを度に変換する方法
9 views (last 30 days)
Show older comments
Hiroki Takeda
on 15 May 2022
Commented: Hiroki Takeda
on 16 May 2022
緯度データを,度に変換したいと思っています。
「27-12.38N」を「27.206」(27+12.38/60)のように,単位を°に統一したいと考えています。
緯度データは,上記のようなものがtableで,10×1で入っています。
同様に,経度データも,「127-35.30E」のように入っており,同じようにしたいと思っています。
困っていることは以下です。
・計算方法は分を度に変換するだけなので27+12.38/60でよいが,緯度データのstringから,どのように文字を抜き出せば良いか方法がよくわからないため,処理ができない。
・File Exchangeなどで適切なものがあれば教えていただきたい。
ご教示くださいますと幸いです。よろしくお願いいたします。
0 Comments
Accepted Answer
Atsushi Ueno
on 15 May 2022
質問文に掛かれていない要件は、緯度経度の表現方法を参照して下記の通り補います。
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段階ほどく
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
このような方法を任意に変更して適用すればよいと思います。
3 Comments
Atsushi Ueno
on 16 May 2022
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)' % 文字列から数値に変換、転置
result = (nums(:,1) + nums(:,2) / 60) .* nums(:,3)
※上記回答で誤記がありました('35-34.12S'と'135-31.35W'の角度表記が異なる値になります)
【誤】-str2num(texts{1}) + str2num(texts{2}) / 60
【正】-(str2num(texts{1}) + str2num(texts{2}) / 60)
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!