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

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

Respuesta aceptada

Atsushi Ueno
Atsushi Ueno el 15 de Mayo de 2022
質問文に掛かれていない要件は、緯度経度の表現方法を参照して下記の通り補います。
  • 「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 comentarios
Atsushi Ueno
Atsushi Ueno el 16 de Mayo de 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)' % 文字列から数値に変換、転置
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 el 16 de Mayo de 2022
早速にご教示くださり、誠にありがとうございました。
無事に作業を進めることができました。
今後ともよろしくお願いいたします。

Iniciar sesión para comentar.

Más respuestas (0)

Etiquetas

Productos


Versión

R2020b

Community Treasure Hunt

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

Start Hunting!