2024年10月24日 00:43
このツールは、国土地理院が提供するジオイド計算ツールと同じ精度と機能を持ちながら、
さらにシンプルな操作でジオイド補正値を計算できる便利なウェブアプリケーションです。
測量やGIS(地理情報システム)を利用する専門家から、地理データの精度を向上させたい研究者まで、
誰でも手軽に使えるよう設計されています。
以下は、このツールの主要な機能を実装したHTMLとJavaScriptのソースコードです。公式ツールと同じデータを使用しながら、ユーザーにとって使いやすいように設計しています。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ジオイド補正値計算</title>
<script>
let geoidData = [];
// ファイルの読み込み処理
function loadGeoidData(file) {
const reader = new FileReader();
reader.onload = function(event) {
const lines = event.target.result.split('\n');
let buffer = [];
// 最初の行(ヘッダー)をスキップ
for (let lineNum = 1; lineNum < lines.length; lineNum++) {
const line = lines[lineNum].trim();
if (line === '') continue; // 空行はスキップ
// 行のデータをスペースで区切り、数値に変換して格納
const row = line.split(/\s+/).map(Number);
buffer.push(...row);
// 43行ごとに1201個のデータを取り出す
if (buffer.length === 1201) {
geoidData.push(buffer);
buffer = [];
}
}
// データの行数が1801であるか確認
if (geoidData.length !== 1801) {
alert(`データの行数が不正です: 期待される行数は1801ですが、${geoidData.length}行しかありません。`);
} else {
alert("ファイルの読み込みが完了しました!");
}
};
reader.readAsText(file);
}
// 緯度と経度の格子点を計算する関数
function calculateLatLon() {
let latitudes = [];
let longitudes = [];
for (let i = 0; i < 1801; i++) {
latitudes.push(20.0 + i * (1.0 / 60.0));
}
for (let j = 0; j < 1201; j++) {
longitudes.push(120.0 + j * (1.5 / 60.0));
}
return { latitudes, longitudes };
}
// 緯度と経度に基づいてジオイド補正値を計算する関数
function interpolateGeoidValue(lat, lon) {
const { latitudes, longitudes } = calculateLatLon();
if (lat < 20 || lat > 50 || lon < 120 || lon > 150) {
return 999.0000;
}
let i = latitudes.findIndex((v) => v > lat) - 1;
let j = longitudes.findIndex((v) => v > lon) - 1;
let Z11 = geoidData[i][j];
let Z12 = geoidData[i][j + 1];
let Z21 = geoidData[i + 1][j];
let Z22 = geoidData[i + 1][j + 1];
if ([Z11, Z12, Z21, Z22].includes(999.0000)) {
return 999.0000;
}
let t = (lat - latitudes[i]) / (latitudes[i + 1] - latitudes[i]);
let u = (lon - longitudes[j]) / (longitudes[j + 1] - longitudes[j]);
let Z = (1 - t) * (1 - u) * Z11 +
(1 - t) * u * Z12 +
t * (1 - u) * Z21 +
t * u * Z22;
return parseFloat(Z.toFixed(4));
}
window.onload = function() {
document.getElementById('fileInput').addEventListener('change', function(event) {
const file = event.target.files[0];
if (file) {
loadGeoidData(file);
}
});
document.getElementById('calculateBtn').addEventListener('click', function() {
const lat = parseFloat(document.getElementById('latitude').value);
const lon = parseFloat(document.getElementById('longitude').value);
if (isNaN(lat) || isNaN(lon)) {
alert('入力形式が正しくありません。緯度と経度は数値で入力してください。');
return;
}
if (geoidData.length === 0) {
alert('ジオイドデータが読み込まれていません。ファイルをアップロードしてください。');
return;
}
const geoidValue = interpolateGeoidValue(lat, lon);
document.getElementById('result').textContent = `緯度 ${lat}, 経度 ${lon} のジオイド補正値: ${geoidValue}`;
});
};
</script>
</head>
<body>
<h1>ジオイド補正値計算ツール</h1>
<p>ジオイドデータファイル(gsigeo2011_ver2_2.asc)をアップロードし、緯度と経度を入力して「計算」ボタンを押してください。</p>
<input type="file" id="fileInput" accept=".asc">
<br><br>
<label for="latitude">緯度:</label>
<input type="text" id="latitude" placeholder="例: 35.0">
<br>
<label for="longitude">経度:</label>
<input type="text" id="longitude" placeholder="例: 135.0">
<br>
<button type="button" id="calculateBtn">計算</button>
<p id="result"></p>
</body>
</html>
ソースコードの説明: ファイルの読み込みと処理、緯度・経度の格子点計算、双一次補間法による補正値の計算を実装しています。
このツールは公式のツールと同じモデルを使用しながら、シンプルで誰でも直感的に使えるデザインとなっています。地理データの精度向上を目指す方々にぜひお試しいただきたいツールです!
#ジオイド補正 #測量ツール #地理情報システム #GIS #リアルタイム計算 #gkukan.jp