249 lines
8.2 KiB
Bash
249 lines
8.2 KiB
Bash
#! /bin/sh
|
|
#
|
|
# GeoConvert.cgi
|
|
# cgi script for geographic coordinate conversion
|
|
#
|
|
# Copyright (c) Charles Karney (2011-2022) <charles@karney.com> and
|
|
# licensed under the MIT/X11 License. For more information, see
|
|
# https://geographiclib.sourceforge.io/
|
|
|
|
. ./utils.sh
|
|
OPTION=`lookupkey "$QUERY_STRING" option`
|
|
if test "$OPTION" = Reset; then
|
|
INPUT=
|
|
else
|
|
INPUT=`lookupcheckkey "$QUERY_STRING" input`
|
|
ZONE=`lookupkey "$QUERY_STRING" zone`
|
|
PREC=`lookupkey "$QUERY_STRING" prec`
|
|
fi
|
|
test "$ZONE" || ZONE=-3
|
|
test "$PREC" || PREC=0
|
|
INPUTENC=`encodevalue "$INPUT"`
|
|
EXECDIR=../bin
|
|
COMMAND="GeoConvert"
|
|
VERSION=`$EXECDIR/$COMMAND --version | cut -f4 -d" "`
|
|
F='<font color="Blue">'
|
|
G='</font>'
|
|
test $PREC = 0 || COMMAND="$COMMAND -p $PREC"
|
|
LOCG=
|
|
LOCD=
|
|
LOCU=
|
|
LOCM=
|
|
GEOH=
|
|
set -o pipefail
|
|
if test "$INPUT"; then
|
|
LOCG=`echo $INPUT | $EXECDIR/$COMMAND | head -1`
|
|
if test $? -eq 0; then
|
|
GEOH=`echo $INPUT | $EXECDIR/$COMMAND -p 1 | head -1`
|
|
LOCG=`geohack $GEOH $LOCG Blue`
|
|
LOCD=\(`echo $INPUT | $EXECDIR/$COMMAND -d | head -1`\)
|
|
case $ZONE in
|
|
-3 ) ;;
|
|
-2 ) COMMAND="$COMMAND -t";;
|
|
-1 ) COMMAND="$COMMAND -s";;
|
|
* ) COMMAND="$COMMAND -z $ZONE"
|
|
esac
|
|
LOCU=`echo $INPUT | $EXECDIR/$COMMAND -u | head -1`
|
|
LOCM=`echo $INPUT | $EXECDIR/$COMMAND -m | head -1`
|
|
fi
|
|
# echo `date +"%F %T"` "$COMMAND: $INPUT" >> ../persistent/utilities.log
|
|
fi
|
|
|
|
echo Content-type: text/html
|
|
echo
|
|
cat <<EOF
|
|
<html>
|
|
<head>
|
|
<title>
|
|
Online geographic coordinate converter
|
|
</title>
|
|
<meta name="description"
|
|
content="Online geographic coordinate converter" />
|
|
<meta name="author" content="Charles F. F. Karney" />
|
|
<meta name="keywords"
|
|
content="geographic coordinate conversions,
|
|
geographic coordinates,
|
|
latitude and longitude,
|
|
degrees minutes seconds,
|
|
universal transverse Mercator, UTM,
|
|
easting northing and zone,
|
|
universal polar sterographic, UPS,
|
|
military grid reference system, MGRS,
|
|
online calculator,
|
|
WGS84 ellipsoid,
|
|
GeographicLib" />
|
|
</head>
|
|
<body>
|
|
<h3>
|
|
Online geographic coordinate conversions using the
|
|
<a href="https://geographiclib.sourceforge.io/C++/doc/GeoConvert.1.html">
|
|
GeoConvert</a> utility
|
|
</h3>
|
|
<form action="/cgi-bin/GeoConvert" method="get">
|
|
<p>
|
|
Location
|
|
(ex. «<tt>33.33 44.4</tt>»,
|
|
«<tt>33d19'47"N 44d23.9'E</tt>»,
|
|
«<tt>38SMB4488</tt>»,
|
|
«<tt>38n 444000 3688000</tt>»):<br>
|
|
|
|
<input type=text name="input" size=40 value="$INPUTENC">
|
|
</p>
|
|
<table>
|
|
<tr>
|
|
<td>
|
|
|
|
Output zone:<br>
|
|
|
|
<select name="zone" size=1>
|
|
EOF
|
|
(
|
|
cat <<EOF
|
|
-3 Match input or standard
|
|
-1 Standard UPS/UTM zone
|
|
0 UPS
|
|
-2 Standard UTM zone
|
|
EOF
|
|
) | while read z name; do
|
|
SELECTED=
|
|
test "$z" = "$ZONE" && SELECTED=SELECTED
|
|
echo "<option $SELECTED value=\"$z\">$name</option>"
|
|
done
|
|
for ((z=1; z<=60; ++z)); do
|
|
SELECTED=
|
|
test "$z" = "$ZONE" && SELECTED=SELECTED
|
|
name="UTM zone $z"
|
|
echo "<option $SELECTED value=\"$z\">$name</option>"
|
|
done
|
|
cat <<EOF
|
|
</select>
|
|
</td>
|
|
<td>
|
|
|
|
Output precision:<br>
|
|
|
|
<select name="prec" size=1>
|
|
EOF
|
|
(
|
|
cat <<EOF
|
|
-5 100km 1d
|
|
-4 10km 0.1d
|
|
-3 1km 0.01d 1'
|
|
-2 100m 0.001d 0.1'
|
|
-1 10m 0.0001d 1"
|
|
0 1m 0.00001d 0.1"
|
|
1 100mm 0.01"
|
|
2 10mm 0.001"
|
|
3 1mm 0.0001"
|
|
4 100um 0.00001"
|
|
5 10um 0.000001"
|
|
6 1um 0.0000001"
|
|
7 100nm 0.00000001"
|
|
8 10nm 0.000000001"
|
|
9 1nm 0.0000000001"
|
|
10 0.00000000001"
|
|
EOF
|
|
) | while read p desc; do
|
|
SELECTED=
|
|
test "$p" = "$PREC" && SELECTED=SELECTED
|
|
echo "<option $SELECTED value=\"$p\">$desc</option>"
|
|
done
|
|
cat <<EOF
|
|
</select>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p>
|
|
Select action:<br>
|
|
|
|
<input type="submit" name="option" value="Submit">
|
|
<input type="submit" name="option" value="Reset">
|
|
</p>
|
|
<p>
|
|
Results:
|
|
<font size="4"><pre>
|
|
input = `encodevalue "$INPUT"`
|
|
lat lon = $F$LOCG `convertdeg "$LOCD"`$G
|
|
<a href="https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system">UTM</a>/<a href="https://en.wikipedia.org/wiki/Universal_Polar_Stereographic">UPS</a> = $F`encodevalue "$LOCU"`$G
|
|
<a href="https://en.wikipedia.org/wiki/Military_grid_reference_system">MGRS</a> = $F`encodevalue "$LOCM"`$G</pre></font>
|
|
</p>
|
|
</form>
|
|
<hr>
|
|
<p>
|
|
<a href="https://geographiclib.sourceforge.io/C++/doc/GeoConvert.1.html">
|
|
GeoConvert (version $VERSION)</a>
|
|
converts between geographic (latitude and longitude) coordinates,
|
|
<a href="https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system">
|
|
universal transverse Mercator (UTM)</a> or
|
|
<a href="https://en.wikipedia.org/wiki/Universal_Polar_Stereographic">
|
|
universal polar stereographic (UPS)</a> coordinates, and the
|
|
<a href="https://en.wikipedia.org/wiki/Military_grid_reference_system">
|
|
military grid reference system (MGRS)</a>.
|
|
Examples of legal geographic locations are (these all refer to roughly
|
|
the same place, Cape Morris Jesup on the northern tip of Greenland):
|
|
<pre>
|
|
Latitude and longitude: MGRS:
|
|
83.627 -32.664 24XWT783908
|
|
W32d40 N83d37.6 YUB17770380
|
|
83°37'39"N 32°39'52"W UTM:
|
|
83:37:39 32:39:52W 25n 504158 9286521
|
|
32:39.9W 83:37.6N 430000 9290000 26n
|
|
32:40W+0:0:6 83:37.6 UPS:
|
|
32:40W+0:0:6 83:38-0:0.4 n 1617772 1403805</pre>
|
|
<b>Notes:</b>
|
|
<ul>
|
|
<li>
|
|
The letter in following the zone number in the UTM position is
|
|
a hemisphere designator (n or s) and <em>not</em> the MGRS
|
|
latitude band letter. "north" or "south" can also be used,
|
|
e.g., 25north.
|
|
<li>
|
|
MGRS coordinates are taken to refer to <em>grid squares</em>
|
|
(<em>not</em> to the intersections of grid lines). Thus in UTM
|
|
zone 38n, the square area with easting in [444 km, 445 km) and
|
|
northing in [3688 km, 3689 km) corresponds to the MGRS square
|
|
38SMB4488 (at 1 km precision).
|
|
<ul>
|
|
<li>
|
|
When an MGRS coordinate is read, a representative point
|
|
within the grid square, namely, the <em>center</em>, is
|
|
returned.
|
|
<li>
|
|
The MGRS easting and northing are obtained
|
|
by <em>truncation</em> to the requested precision
|
|
(<em>not</em> rounding).
|
|
</ul>
|
|
<li>
|
|
Usually <em>Output zone</em> should be <em>Match input or
|
|
standard</em>. If the latitude and longitude are given, the
|
|
standard UPS and UTM zone rules are applied; otherwise the
|
|
UPS/UTM selection and the UTM zone match the input. The other
|
|
choices let you override this selection.
|
|
</ul>
|
|
</p>
|
|
<p>
|
|
<a href="https://geographiclib.sourceforge.io/C++/doc/GeoConvert.1.html">
|
|
GeoConvert</a>,
|
|
which is a simple wrapper of the
|
|
<a href="https://geographiclib.sourceforge.io/C++/doc/classGeographicLib_1_1GeoCoords.html">
|
|
GeographicLib::GeoCoords</a> class,
|
|
is one of the utilities provided
|
|
with <a href="https://geographiclib.sourceforge.io/">
|
|
GeographicLib</a>.
|
|
This web interface illustrates a subset of its capabilities. If
|
|
you wish to use GeoConvert directly,
|
|
<a href="https://sourceforge.net/projects/geographiclib/files/distrib-C++">
|
|
download</a>
|
|
and compile GeographicLib.
|
|
</p>
|
|
<hr>
|
|
<address>Charles Karney
|
|
<a href="mailto:charles@karney.com"><charles@karney.com></a>
|
|
(2022-04-10)</address>
|
|
<a href="https://geographiclib.sourceforge.io">
|
|
GeographicLib home
|
|
</a>
|
|
</body>
|
|
</html>
|
|
EOF
|