なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

緯度経度からutm座標への変換

はじめに

WebODMでGCPファイル使用際に緯度経度からutm座標に変換したほうが効率よかったのでAIさんに相談した。

UTM座標って?

ja.wikipedia.org

Wikipediaさんを見てください。

日本で使用する際には、ゾーンが51から54となるのでゾーンの境目に注意する必要がありそう。

実装

AIさんに聞いたのでアルゴリズムとかはよくわかんないです。 個人的には54の帯でしか使用しないので以下で十分。

  • 緯度経度を与えてutm座標をカンマ区切りで出力するもの
mkdir utm_converter
cd utm_converter
python3 -m venv venv
source venv/bin/activate
pip install pyproj
vi utm_converter.py
import argparse
from pyproj import Proj

def convert_to_utm(lon, lat):
    # Compute UTM zone
    e2u_zone = int(divmod(lon, 6)[0]) + 31

    # Define EQA2UTM converter
    e2u_conv = Proj(proj='utm', zone=e2u_zone, ellps='WGS84')

    # Apply the converter
    utmx, utmy = e2u_conv(lon, lat)

    # Add offset if the point is in the southern hemisphere
    if lat < 0:
        utmy = utmy + 10000000

    return utmx, utmy

def main():
    parser = argparse.ArgumentParser(description='Convert longitude and latitude to UTM coordinates.')
    parser.add_argument('lon', type=float, help='Longitude in degrees')
    parser.add_argument('lat', type=float, help='Latitude in degrees')

    args = parser.parse_args()

    utmx, utmy = convert_to_utm(args.lon, args.lat)

    print(f"{utmx},{utmy}")

if __name__ == "__main__":
    main()
  • 念の為、緯度経度を与えてutm座標をカンマ区切りで出力し、zoneを3つめに出力するのも作った。
cat utm_converter_addzone.py 
import argparse
from pyproj import Proj

def convert_to_utm(lon, lat):
    # Compute UTM zone
    e2u_zone = int(divmod(lon, 6)[0]) + 31

    # Define EQA2UTM converter
    e2u_conv = Proj(proj='utm', zone=e2u_zone, ellps='WGS84')

    # Apply the converter
    utmx, utmy = e2u_conv(lon, lat)

    # Add offset if the point is in the southern hemisphere
    if lat < 0:
        utmy = utmy + 10000000

    return utmx, utmy, e2u_zone

def main():
    parser = argparse.ArgumentParser(description='Convert longitude and latitude to UTM coordinates.')
    parser.add_argument('lon', type=float, help='Longitude in degrees')
    parser.add_argument('lat', type=float, help='Latitude in degrees')

    args = parser.parse_args()

    utmx, utmy, zone = convert_to_utm(args.lon, args.lat)

    print(f"{utmx},{utmy},{zone}")

if __name__ == "__main__":
    main()

使用例

$ python utm_converter.py 140.710349472 36.66216925
474114.43463469925,4057435.8432025937
$ python utm_converter_addzone.py 140.710349472 36.66216925
474114.43463469925,4057435.8432025937,54