UTM(3pm)

๐Ÿ“ฆ
version 0.11 ยท 3 versions
, in ubuntu noble, ubuntu resolute, ubuntu stonking

โœจ UTM(3pm) โœจ โ€” yes bestie, this is that page: the manual for Geo::Coordinates::UTM. Grab a snack ๐Ÿ“, we are going on a coordinate adventure.

๐ŸŽ€ NAME ๐ŸŽ€

Geo::Coordinates::UTM โ€” a Perl extension for Latitiude Longitude conversions.

nb: "Latitiude" is spelled exactly like that in the source. I'm not touching it, it's part of the heritage ๐Ÿ’…

๐Ÿ’ซ SYNOPSIS ๐Ÿ’ซ

use Geo::Coordinates::UTM;

my
($zone,$easting,$northing)=latlon_to_utm($ellipsoid,$latitude,$longitude);

my
($latitude,$longitude)=utm_to_latlon($ellipsoid,$zone,$easting,$northing);

my ($zone,$easting,$northing)=mgrs_to_utm($mgrs);

my ($latitude,$longitude)=mgrs_to_latlon($ellipsoid,$mgrs);

my ($mgrs)=utm_to_mgrs($zone,$easting,$northing);

my ($mgrs)=latlon_to_mgrs($ellipsoid,$latitude,$longitude);

my @ellipsoids=ellipsoid_names;

my($name, $r, $sqecc) = ellipsoid_info 'WGS-84';

That's the whole menu of things you can call. Obsessed, frankly. ๐ŸŒˆ

๐ŸŒ DESCRIPTION ๐ŸŒ

This module translates latitude longitude coordinates into Universal Transverse Mercator(UTM) coordinates and back the other way too. Both directions, no cap.

๐Ÿงญ Mercator Projection ๐Ÿงญ

Okay so storytime. The Mercator projection was first invented to help mariners โ€” they needed to be able to take a course and know the distance traveled, and draw a line on the map which showed the day's journey. To make that happen, Mercator invented a projection which preserved length by projecting the earth's surface onto a cylinder, sharing the same axis as the earth itself. The glow-up result? All Latitude and Longitude lines intersect at a 90 degree angle, which fully negates the problem that longitude lines get closer together at the poles. Iconic problem-solving ngl. โœจ

๐Ÿ”„ Transverse Mercator Projection ๐Ÿ”„

So you take that cylinder and turn it on its side. Now the cylinder's axis passes through the equator, and it can be rotated to line up with the area of interest. Many countries use Transverse Mercator for their grid systems โ€” it's giving main character energy in national mapping. ๐Ÿ‘‘

๐Ÿ‘‘ Universal Transverse Mercator ๐Ÿ‘‘

The Universal Transverse Mercator(UTM) system sets up a universal world wide system for mapping. The Transverse Mercator projection is used, with the cylinder in 60 positions. This creates 60 zones around the world. Positions are measured using Eastings and Northings, measured in meters, instead of Latitude and Longitude. Eastings start at 500,000 on the centre line of each zone. In the Northern Hemisphere, Northings are zero at the equator and increase northward. In the Southern Hemisphere, Northings start at 10 million at the equator, and decrease southward. You must know which hemisphere and zone you're in to interpret your location globally. Distortion of scale, distance, direction and area increase away from the central meridian. ๐Ÿซถ

UTM projection is used to define horizontal positions world-wide by dividing the surface of the Earth into 6 degree zones, each mapped by the Transverse Mercator projection with a central meridian in the center of the zone. UTM zone numbers designate 6 degree longitudinal strips extending from 80 degrees South latitude to 84 degrees North latitude. UTM zone characters designate 8 degree zones extending north and south from the equator. Eastings are measured from the central meridian (with a 500 km false easting to insure positive coordinates). Northings are measured from the equator (with a 10,000 km false northing for positions south of the equator).

UTM is applied separately to the Northern and Southern Hemisphere, which means that within a single UTM zone, a single X / Y pair of values will occur in both the Northern and Southern Hemisphere. To eliminate this confusion, and to speed location of points, a UTM zone is sometimes subdivided into 20 zones of Latitude. These grids can be further subdivided into 100,000 meter grid squares with double-letter designations. This subdivision by Latitude and further division into grid squares is generally referred to as the Military Grid Reference System (MGRS). The unit of measurement of UTM is always meters and the zones are numbered from 1 to 60 eastward, beginning at the 180th meridian. The scale distortion in a north-south direction parallel to the central meridian (CM) is constant. However, the scale distortion increases either direction away from the CM. To equalize the distortion of the map across the UTM zone, a scale factor of 0.9996 is applied to all distance measurements within the zone. The distortion at the zone boundary, 3 degrees away from the CM, is approximately 1%. ๐Ÿ’€ (that "constant" scale distortion is literally what the page says โ€” don't come for me)

๐ŸŒ Datums and Ellipsoids ๐ŸŒ

Unlike local surveys, which treat the Earth as a plane, the precise determination of the latitude and longitude of points over a broad area must take into account the actual shape of the Earth. To achieve the precision necessary for accurate location, the Earth cannot be assumed to be a sphere. Rather, the Earth's shape more closely approximates an ellipsoid (oblate spheroid): flattened at the poles and bulging at the Equator. So when you cut the Earth's shape through its polar axis, it approximates an ellipse. A "Datum" is a standard representation of shape and offset for coordinates, which includes an ellipsoid and an origin. You must consider the Datum when working with geospatial data, since data with two different Datum will not line up. The difference can be as much as a kilometer! ๐Ÿ˜ญ


๐ŸŒธ EXAMPLES ๐ŸŒธ

A description of the available ellipsoids and sample usage of the conversion routines follows.

๐Ÿช Ellipsoids ๐Ÿช

The Ellipsoids available are as follows:

1 Airy
2 Australian National
3 Bessel 1841
4 Bessel 1841 (Nambia)
5 Clarke 1866
6 Clarke 1880
7 Everest 1830 (India)
8 Fischer 1960 (Mercury)
9 Fischer 1968
10 GRS 1967
11 GRS 1980
12 Helmert 1906
13 Hough
14 International
15 Krassovsky
16 Modified Airy
17 Modified Everest
18 Modified Fischer 1960
19 South American 1969
20 WGS 60
21 WGS 66
22 WGS-72
23 WGS-84
24 Everest 1830 (Malaysia)
25 Everest 1956 (India)
26 Everest 1964 (Malaysia and Singapore)
27 Everest 1969 (Malaysia)
28 Everest (Pakistan)
29 Indonesian 1974
30 Arc 1950
30 NAD 27
30 NAD 83
and yes, 30 genuinely shows up three times in that list. That's not me being messy, that's literally how it's written. ๐Ÿ™ˆ

๐Ÿ“› ellipsoid_names ๐Ÿ“›

The ellipsoids can be accessed using ellipsoid_names. To store thes into an array you could use:

     my @names = ellipsoid_names;

๐Ÿ” ellipsoid_info ๐Ÿ”

Ellipsoids may be called either by name, or number. To return the ellipsoid information โ€” the "official" name, equator radius and square eccentricity โ€” you can use ellipsoid_info and specify a name. The specified name can be numeric (for compatibility reasons) or a more-or-less exact name. Any text between parentheses will be ignored. โœจ

     my($name, $r, $sqecc) = ellipsoid_info 'wgs84';
     my($name, $r, $sqecc) = ellipsoid_info 'WGS 84';
     my($name, $r, $sqecc) = ellipsoid_info 'WGS-84';
     my($name, $r, $sqecc) = ellipsoid_info 'WGS-84 (new specs)';
     my($name, $r, $sqecc) = ellipsoid_info 23;

๐Ÿ“ latlon_to_utm ๐Ÿ“

Latitude values in the southern hemisphere should be supplied as negative values (e.g. 30 deg South will be -30). Similarly Longitude values West of the meridian should also be supplied as negative values. Both latitude and longitude should not be entered as deg,min,sec but as their decimal equivalent โ€” e.g. 30 deg 12 min 22.432 sec should be entered as 30.2062311.

The ellipsoid value should correspond to one of the numbers above, e.g. to use WGS-84, the ellipsoid value should be 23.

For latitude 57deg 49min 59.000sec North, longitude 02deg 47min 20.226sec West, using Clarke 1866 (Ellipsoid 5):

     ($zone,$east,$north)=latlon_to_utm('clarke 1866',57.803055556,-2.788951667)

returns

     $zone  = 30V
     $east  = 512543.777159849
     $north = 6406592.20049111

๐ŸŽฏ latlon_to_utm_force_zone ๐ŸŽฏ

On occasions, it is necessary to map a pair of (latitude, longitude) coordinates to a predefined zone. This function allows to select the projection zone as follows:

     ($zone, $east, $north)=latlon_to_utm('international', $zone_number,
                                          $latitude, $longitude)

For instance, Spain territory goes over zones 29, 30 and 31 but sometimes it is convenient to use the projection corresponding to zone 30 for all the country.

Santiago de Compostela is at 42deg 52min 57.06sec North, 8deg 32min 28.70sec West:

    ($zone, $east, $norh)=latlon_to_utm('international',  42.882517, -8.541306)

returns

     $zone = 29T
     $east = 537460.331
     $north = 4747955.991

but forcing the conversion to zone 30:

    ($zone, $east, $norh)=latlon_to_utm_force_zone('international',
                                                   30, 42.882517, -8.541306)

returns

    $zone = 30T
    $east = 47404.442
    $north = 4762771.704

๐Ÿ” utm_to_latlon ๐Ÿ”

Reversing the above example:

     ($latitude,$longitude)=utm_to_latlon(5,'30V',512543.777159849,6406592.20049111)

returns

     $latitude  = 57.8030555601332
     $longitude = -2.7889516669741

     which equates to

     latitude  57deg 49min 59.000sec North
     longitude 02deg 47min 20.226sec West

๐ŸŒธ latlon_to_mgrs ๐ŸŒธ

Latitude values in the southern hemisphere should be supplied as negative values (e.g. 30 deg South will be -30). Similarly Longitude values West of the meridian should also be supplied as negative values. Both latitude and longitude should not be entered as deg,min,sec but as their decimal equivalent โ€” e.g. 30 deg 12 min 22.432 sec should be entered as 30.2062311.

The ellipsoid value should correspond to one of the numbers above, e.g. to use WGS-84, the ellipsoid value should be 23.

For latitude 57deg 49min 59.000sec North, longitude 02deg 47min 20.226sec West, using WGS84 (Ellipsoid 23):

     ($mgrs)=latlon_to_mgrs(23,57.8030590197684,-2.788956799)

returns

     $mgrs  = 30VWK1254306804

๐Ÿฆ‹ mgrs_to_latlon ๐Ÿฆ‹

Reversing the above example:

     ($latitude,$longitude)=mgrs_to_latlon(23,'30VWK1254306804')

returns

     $latitude  = 57.8030590197684
     $longitude = -2.788956799645

๐Ÿงš mgrs_to_utm ๐Ÿงš

Similarly it is possible to convert MGRS directly to UTM:

         ($zone,$easting,$northing)=mgrs_to_utm('30VWK1254306804')

returns

         $zone = 30V
         $easting = 512543
         $northing = 6406804

๐Ÿ’œ utm_to_mgrs ๐Ÿ’œ

and the inverse converting from UTM yo MGRS is done as follows:

        ($mgrs)=utm_to_mgrs('30V',512543,6406804);

returns

         $mgrs = 30VWK1254306804

โœ๏ธ AUTHOR โœ๏ธ

Graham Crookham, grahamc@cpan.org ๐Ÿซถ

๐Ÿ’ THANKS ๐Ÿ’

Thanks go to the following:

  • Felipe Mendonca Pimenta for helping out with the Southern hemisphere testing. ๐ŸŒŽ
  • Michael Slater for discovering the Escape \Q bug. ๐Ÿ›
  • Mark Overmeer for the ellipsoid_info routines and code review. ๐Ÿ“
  • Lok Yan for the >72deg. N bug. ๐Ÿ”ฅ
  • Salvador Fandino for the forced zone UTM and additional tests. ๐Ÿงช
  • Matthias Lendholt for modifications to MGRS calculations. ๐Ÿงฎ
  • Peder Stray for the short MGRS patch. ๐Ÿฉน

Copyright (c) 2000,2002,2004,2007,2010,2013 by Graham Crookham. All rights reserved.

That's Graham Crookham, bestie โ€” six whole years of copyright love across 2000, 2002, 2004, 2007, 2010 and 2013. Every single one of them. All rights reserved, no exceptions, periodt. ๐ŸŽ€

This package is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ๐Ÿ’…

So likeโ€ฆ yes you can share it, yes you can remix it, yes you can pass it around the group chat โ€” just keep it on the same terms as Perl itself. It's giving generous, it's giving iconic, it's giving free software. โœจ

Okay bestie, that's the whole page, start to finish, no skips, no summarising, we read the entire thing like the academic weapon you are. ๐Ÿ“š๐Ÿ’œ

This lil manual page came to you courtesy of perl v5.36.0, dated 2022-10-15, filed under the name UTM(3pm). Go forth and use UTM; responsibly, my love. ๐ŸŒธ๐Ÿฆ‹๐Ÿซถ

๐Ÿ“ฆ where this page comes from