はじめに
緯度経度の表記方法は実は10進法と60進法の2つがあります。
例えば10進法は北緯36.1914のように小数値で表現され、60進法の場合は北緯36度42分13.3秒のように度分秒で表されます。(36°42’13.3”のように表現されることもあります)
最近では10進法が主流になっているものの、どちらの表記を採用しているかはデータセットを提供している個人・組織に委ねられているのが実情です。では2種類の表記が存在することでどんな問題が起こりえるのでしょうか。個人的には入手した地物データの緯度経度表記が地図アプリケーションに対応していない場合が一番ネックかなと思います。
★関連リンク
業務で活用できるAI技集のまとめはこちら
緯度経度の距離を算出したい場合はこちら
2点間の緯度経度で方位を算出したい場合はこちら
緯度経度からMesh変換したい場合はこちら
自分だけのオリジナル地図を簡単につくりたい場合はこちら
計算方法
もし入手した地物データは60進法で、地図を表示したいアプリが10進法の場合、60進法→10進法に変換する必要があります。その計算式は以下の通りです。
《60進法→10進法》
北緯:■度▲分●秒 → 北緯:■+▲/60+●/3600
東経:□度△分○秒 → 東経:□+△/60+○/3600
計算機も用意しましたので試しに使ってみて下さい。
合わせて、10進を60進に変換する場合も記載しておきます。
《10進法→60進法》
北緯:■ →
度:■の整数部分
分:((■-度の値)×60)の整数部分
秒:(■-度の値-分の値÷60)×3600
東経:□ →
度:□の整数部分
分:((□-度の値)×60)の整数部分
秒:(□-度の値-分の値÷60)×3600
あまり複雑な計算ではないので、Excelなどでも比較的簡単に再現できるかと思います。
Appendix
60進法→10進法の計算機のコードです。JavaScriptで動作しています。
<label for="lat_deg">緯度(度):</label>
<input type="text" id="lat_deg" value="36">
<label for="lat_min">緯度(分):</label>
<input type="text" id="lat_min" value="15">
<label for="lat_sec">緯度(秒):</label>
<input type="text" id="lat_sec" value="30">
<br><br>
<label for="long_deg">経度(度):</label>
<input type="text" id="long_deg" value="136">
<label for="long_min">経度(分):</label>
<input type="text" id="long_min" value="16">
<label for="long_sec">経度(秒):</label>
<input type="text" id="long_sec" value="32">
<button onclick="convert()">変換</button>
<p id="result"></p>
<script>
function convert() {
// 以前の結果をリセットする
document.getElementById('result').innerHTML = '';
const latDeg = parseFloat(document.getElementById('lat_deg').value);
const latMin = parseFloat(document.getElementById('lat_min').value);
const latSec = parseFloat(document.getElementById('lat_sec').value);
const longDeg = parseFloat(document.getElementById('long_deg').value);
const longMin = parseFloat(document.getElementById('long_min').value);
const longSec = parseFloat(document.getElementById('long_sec').value);
const latDecimal = latDeg + (latMin / 60) + (latSec / 3600);
const longDecimal = longDeg + (longMin / 60) + (longSec / 3600);
document.getElementById('result').innerHTML = `緯度(10進):${latDecimal}<br>経度(10進):${longDecimal}`;
}
</script>
10進法→60進法の計算機のコードです。同じくJavaScriptで動作しています。
<label for="lat_deg">緯度(10進):</label>
<input type="text" id="lat_decimal" value="36.1234">
<br><br>
<label for="long_deg">経度(10進):</label>
<input type="text" id="long_decimal" value="136.5678">
<button onclick="convert2()">変換</button>
<p id="result2"></p>
<script>
function convert2() {
// 以前の結果をリセットする
document.getElementById('result2').innerHTML = '';
// 緯度・経度の値を取得する
const latDecimal = parseFloat(document.getElementById('lat_decimal').value);
const longDecimal = parseFloat(document.getElementById('long_decimal').value);
// 緯度・経度を計算する
const latDeg = Math.floor(Math.abs(latDecimal));
const latMin = Math.floor((Math.abs(latDecimal) - latDeg) * 60);
const latSec = ((Math.abs(latDecimal) - latDeg - latMin / 60) * 3600).toFixed(2);
const latDir = latDecimal >= 0 ? 'N' : 'S';
const longDeg = Math.floor(Math.abs(longDecimal));
const longMin = Math.floor((Math.abs(longDecimal) - longDeg) * 60);
const longSec = ((Math.abs(longDecimal) - longDeg - longMin / 60) * 3600).toFixed(2);
const longDir = longDecimal >= 0 ? 'E' : 'W';
// 結果を表示する
document.getElementById('result2').innerHTML = `緯度(60進):${latDeg}°${latMin}'${latSec}"${latDir}<br>経度(60進):${longDeg}°${longMin}'${longSec}"${longDir}`;
}
</script>
コメント