簡単操作のジオイド補正ツール

GISアプリ

 

 

🌏 緯度・経度を入力するだけ!簡単操作のジオイド補正ツール 🌏

このツールは、国土地理院が提供するジオイド計算ツールと同じ精度と機能を持ちながら、
さらにシンプルな操作でジオイド補正値を計算できる便利なウェブアプリケーションです。
測量やGIS(地理情報システム)を利用する専門家から、地理データの精度を向上させたい研究者まで、
誰でも手軽に使えるよう設計されています。

💡 ツールの特徴

  • 同じ精度: 国土地理院の公式ツールと同等のジオイドモデル(GSIGEO2011)を利用し、正確なジオイド補正値を提供します。
  • 簡単操作: 緯度と経度を入力し、ファイルをアップロードするだけで、複雑な設定や操作は不要。シンプルな操作性を重視しました。
  • リアルタイム計算: 双一次補間法を使用し、瞬時に補正値を算出します。これにより、測量の現場でも即座に利用可能です。

📈 ツールの使い方

  1. ジオイドデータファイル(gsigeo2011_ver2_2.asc)をアップロードします。
  2. 緯度と経度を入力し、「計算」ボタンを押すと、その地点のジオイド補正値が即座に表示されます。

📜 ソースコードの解説

以下は、このツールの主要な機能を実装した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>

ソースコードの説明: ファイルの読み込みと処理、緯度・経度の格子点計算、双一次補間法による補正値の計算を実装しています。
このツールは公式のツールと同じモデルを使用しながら、シンプルで誰でも直感的に使えるデザインとなっています。地理データの精度向上を目指す方々にぜひお試しいただきたいツールです!

 

コメント

タイトルとURLをコピーしました