|
|
GridLocW
- a Lat/Long to Maidenhead converter for Windows - with optional
GPS support
{
GridLocW : Grid Locator (for) Windows }
{
Name derived from the various versions of Gridloc around on the
web - most of which are DOS or BASIC (eg GWBASIC) releases }
----------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------
A
side issue from operating in the 2009 John Moyle Field Day was the
fact that some operators - particularly home stations - did not
know their (maidenhead) grid squares. To make it easier for any
future field days, I wrote GridLocW - Grid Locator (for) Windows
- in the pascal-based environment of "Delphi". That way,
provided they can give me a latitude and longtitude, I can calculate
it for them via software loaded on the logging PC - and then tell
them as well - as using it in the log itself. Of course, it has
a side benefit for any field day operators in that it has internal
GPS support that can tell them exactly what grid square they are
in - all they need to do is connect a suitable GPS to the PC via
a serial port -and run GridLocW !
Best
of all, it''s free !
---------------------------------------------------------------------------------------
| MAIDENHEAD
GRID LOCATOR CALCULATIONS
The
Maidenhead grid locator system divides the entire world into
squares one degree (in latitude) by two degrees (in longitude).
Each square is given a label, two letters followed by two
numbers. You can determine grid locators in the Americas,
Europe, Australia etc using various maps/tables/documents
available on the internet. If those references are not handy,
or you need a grid locator for some other spot around the
world, just run the likes of GridLocWM.exe. GridLocWM will
take any latitude and longitude and calculate the corresponding
grid locator (eg "QG62"). By common usage, these
locators are also called "Grid Squares".
For
more precise location information, the Maidenhead system also
allows an optional two characters to be appended to the 4
digit basic grid locator (eg. adding the letters "mj"
to "QG62" to become "QG62mj" ). These
two additional letters will pin a station's location down
to within several kilometres and are usually listed in lower
case. GridLocWM will handle the precise locator detail as
well. Given the minutes and seconds of latitude and longitude
(as well as the degrees), GridLocWN will display the precise
locator.
A
worldwide standard is that degrees South in Latitude is signed
negative, as is degrees West longtitude, when dealing in calculations
relating to lat/long conversions. GridLocWM doesn't really
care if you use the identifiers + (plus) or a - (minus) or
the letters N, S, E or W when describing any degrees parts.
|
---------------------------------------------------------------------------------------
While
doing a bit of research on Latitude/Longtitude to Maidenhead converters,
I discovered that the likes of the ARRL only have links to DOS-based
converters on their web site and that led me to extract some code
from a Delphi-based application that I have been using for some
time. The result is a program that will will run on any 32 bit version
of Windows - ie Win 2000 and up, does decimal or degrees/minutes/seconds
cross-conversions as well as the Maidenhead grid squares.
To
make it easier to use in some situations, I have written in some
simple GPS support to determine latitude and longtitude details.
Most GPS devices that output data to a serial port ( direct or via
a serial/USB adapter) should work with this software. You will still
need to press the "Convert" button to obtain your grid
square details.. Hey, YOU have to do something.
The
"Raw" tickbox allows part of the GPS data to be displayed
so that you will find it easier to determine that you are on the
correct COM port. Once you know, you will probably never use Raw
again.
Please
do not copy the file/s from this site and publish them on any other
sites otherwise software revisions will not be apparent - and that
means bugs will not be fixed in those versions. Always link to the
actual files here so that any downloads come only from this site.
|
---------------------------------------------------------------------------------------

Basic
program mode - manual entry of latitude and longtitude details
into either the Decimal format boxes OR into the Degrees/ Minutes
/ Seconds boxes.
Pressing
the Convert button fills in the empty boxes and calculated the
Maidenhead grid square.
-
The
Clear Dec button clears only the Decimal format boxes and Maidenhead
grid
-
The
Clear D/M/S button clears only the D/M/S format boxes and Maidenhead
grid
-
The
Clear All button clears all of the Lat/Long boxes and Maidenhead
grid
---------------------------------------------------------------------------------------
|

With
GPS support enabled by using the tick box at the RHS top.
The details shown were derived using a Magellan Explorist 500
with it's USB adapter function but a Garmin GPS16 has also been
tested and works correctly.
---------------------------------------------------------------------------------------
Please
Note:
-
that GPS devices can have different message streams so may not
display all of the available selections in the Raw GPS Data
box.
-
the
Time detail in some GPS data has decimals of seconds available
while others do not.
-
just
be sure that you have satellite acquisition BEFORE YOU COMPLAIN
THAT THE GPS PART DOESN'T WORK !
-
The
"Latest Version" button will take you to this web
page provided that you have a valid internet connection at the
time.
The functionality
of GridLocW has been extended to include a UTC date display plus
a "Clock Set" button to allow you
to set the computer clock from the GPS data, taking into account
the time zone set on the PC.
To test
it once you have GPS data available, double click on the Windows
(2000, XP,+..) system clock (typically bottom RH corner of your
screen),
change the time or date, Apply, then press the "Clock Set"
button in GridLocW...
Watch the
Windows clock snap back to the correct time/date..
This Clock
Set function has been included to make it easier to determine/set
the correct time on the computer when out Field Day'ing.
---------------------------------------------------------------------------------------
Just a
hint : Read these words behind the "About GPS" button
FIRST !
|
Repeated
here....
GPS Support.
The
GPS must be set to 4800 baud, 8 bits, 1 stop bit, no parity
and can be connected to any COM port number - whether physical
or virtual (eg from a serial to USB adapter). Simply select
the apropriate detail from the Port dropdown box. The GPS
brand should not be important but should be set to output
NMEA data.
Only
data is read from the port and if there is no data stream
then the box marked GPS Time UTC will state "No GPS
Data". Try any and or all COM ports and check for GPS
data. If you add a USB-based com port after starting the
software, use the "Recheck COM Ports" button to
find any additional ports. "Raw" displays some
of the basic data from the GPS, useful for confirming the
correct port is selected.. If no GPS data is displayed,
use the message drop-down to check for other messages. The
most common problem is that the GPS does not have enough
satellites to obtain a fix. On at least some GPS devices,
if GGA and RMC are blank and GSV has data showing, no satellite
fix !
Lat
& Long values and the time & date should appear
within 2 seconds of selecting the correct com port - it
is not an immediate display. The Clock Set button allows
you to set the computer system clock to the GPS time (+/-
APPROX 0.5 sec) and takes into account your time zone setting.
The
higher the number of satellites (Sats), the better the GPS
position fix.
Always
turn off the GPS support before unplugging any GPS device.
If you get an error while using the GPS option, exit and
re-start the software.
A
few positioning maps have been implemented in more recent
versions. The World map has an additional feature that shows
Grid Locator plus Distance (in either KM (standard) or Statute
Miles plus a bearing from the origin location. These latter
values are generated using Vincenty's formula.
A
conversion feature allows the entry of a Grid code in either
4 or 6 character format to calculate Latitude and Longtitude
plus distance and bearing from the current Maidenhead
locator code.
The
ability to change from the standard Metric measurements
to Imperial (height in feet, distances in Statute Miles)
is available as a checkbox on the basic program panel.
The
program's software settings deemed important are saved to
the Windows registry on program exit and are thus available
on subsequent uses.
Use
the "About GPS" button again to remove this screen.
|
---------------------------------------------------------------------------------------
|
|
GridLocW.EXE
: NO LONGER AVAILABLE FOR DOWNLOAD - SEE GridLocWM.exe
below
( right-click and Save Target As.. ) {
about 490KB }
OR
GridLocW.ZIP
: NO LONGER AVAILABLE FOR DOWNLOAD - SEE GridLocWM.zip
below
(right-click and Save Target As.. ) {
about 260KB }
[ ZIP contains 1 file ]
THIS
version is dated 20/3/2009 and is known to
have some "bugs"....
AND WILL NOT BE UPDATED FURTHER - SEE GRIDLOCWM BELOW FOR ALL LATER
REVISIONS
There
is greater error trapping included in the later releases !
Note
- the above images may not show the current release date and all
functions
---------------------------------------------------------------------------------------
|
|
For
those of you who want "more", there is an additional version
of GridLocW called GridLocWM which has a world map facility built-in
- which works in two ways.
- By
having a Lat/Long value before launching the map by using the
"Map" button on the primary application, it will spot
the resultant Grid Square on the world map.
- Alternatively,
roving your mouse cursor over the map produces readouts of latitude,
longtitude and grid square down the bottom of the display.
The
displayed info from the cursor position is reasonably accurate however
as the map is not perfect, there are some small errors noted - particularly
towards the RH side. The textual info is correct.
Because
the map graphic is included within the application, this version
is considerably larger to download.
Note that map operation is inhibited on screen resolutions smaller
than 1024 x 768 pixels.
This
is what the main program screen looks like....

(Mouse
over to see full size)
CHANGELOG
:
Note
: in Australia, we use DD/MM/YY format so all dates quoted in documentation
are this format.
As
of the version dated 02/04/2009, there is also an Australian map
option which is accessed by selecting the AUS box next to the map
button.
Note that by the time places like Tasmania are accessed, the linearity
of the map itself is not particularly good and some positioning
errors are introduced,
this being a normal situation with Mercator-series maps. Unfortunately
I have not located any suitable linear-scaled maps on the web.
( I could have removed Tassie but then some 'Taswegians' would have
been upset. )
Minor changes at Version dated 15/5/09 : Added automatical recall
of main program position, updated date formats to suit international
users, last COM port, last map used etc.. plus a map of the USA
& some of the Central Americas. Maps ( World, Aus, USA) are
selected from a drop-down box at LHS. Size is now 4.7MB as an EXE,
1MB as a ZIP.
Minor
changes at Version dated 16/5/09 : Added mouse pointer distance
plus bearing from GPS location - featured only on World map - using
Vincenty's formula. Added an extra checkbox on primary screen to
allow display of Imperial measurements of GPS height and any distances
(Metric is standard). Size is still around 4.7MB as an EXE, 1MB
as a ZIP.
Minor
changes at Version dated 19/5/09 : Added an entry box for a destination
Maidenhead Grid plus a Calculate button to convert back to a Latitude
and Longtitude (at the centre of the grid), plus a distance in Km
(/ Statute Miles) and bearing in degrees FROM the main Calculated
Grid value.
Minor
changes at Version dated 20/5/09 : Added mouse pointer distance
plus bearing from GPS location to the USA and Australian maps. When
right-clicking on a map, a Summary box appears with the Lat/ Long/
Grid / Distance / Bearing values 'frozen'. The Summary box can be
moved from over the map (to a clear part of screen) and subsequent
left-clicks on alternate map areas will update the 'frozen' data.
Added
more error trapping for occasional floating point, COM and initial
Windows registry startup errors.
World:

Locator JJ00 is at 0 degrees latitude, 0 degrees
longtitude and is the default marker placed when there are no Lat
and Long values in the decimal degrees boxes.
AUS
Map : 
USA
Map :
Other
maps may be added in future releases IF I can find suitable linear
map images.
GridLocWM.EXE
( right-click and Save Target As.. ) {
about 4.8MB }
OR
GridLocWM.ZIP
(right-click and Save Target As.. ) {
about 1000KB }
[ ZIP contains 1 file ]
Current
version is dated 19/5/2009
---------------------------------------------------------------------------------------
|
|
No
installation is necessary for either version, no setup.exe, no additional
files. Just run GridLocW.exe / GridLocWM.exe from the folder it
is saved/extracted into..
Free
to download, free to use, but please - no copies on other websites.
If,
perchance, your GPS does not decode correctly then use something
like Windows HyperTerminal to capture some of the raw GPS serial
output into a text file to email to me.
Please make sure that the device has a good satellite acquisition
window by taking the unit to near a door, window or even outside.
|
|
Formatting/indentation
of the Delphi code has been lost in the functions & procedure
listed below, which is normal for web pages which only allow one
space between characters & no tabs. Even so, those who need
to should be able to copy and paste into a Delphi Unit for inclusion
with their own code to create an application.
------------------------------------ Added
30 June 2009 ------------------------------------
For those
who are seeking info/code on Vincenty's formula in Delphi :
//* - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - */
//* Vincenty Inverse Solution of Geodesics on the Ellipsoid (c)
Chris Veness 2002-2008, edited to suit Delphi 5 by Doug Hunter VK4ADC
2009 */
//* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - */
//*
// * Calculate geodesic distance (in m) between two points specified
by latitude/longitude
// * (in numeric degrees) using Vincenty inverse formula for ellipsoids
// Returns the distance as the function result, the forward azimuth
in the var Azim in the calling variable.
// eg yy := distVincenty(strtofloat(form1.edit1.text), strtofloat(form1.edit2.text),
strtofloat(form1.edit3.text), strtofloat(form1.edit4.text), zz);
// where edit1 & edit 2 are first Lat & Long (respectively)
in decimal format, edit3 and edit 4 are second Lat & Long (respectively)
in decimal format, returns distance in metres in yy (real), azimuth
in degrees in zz (real), // */
function distVincenty(lat1, lon1, lat2, lon2 : real; var azim
: real) : real;
var
a, b, c, f, U1, U2, uSq, sinU1, sinU2, CosU1, CosU2,lambda, lambdap,
sinlambda, sinsigma, coslambda, cossigma, sigma, sinalpha, cosSqalpha,
cos2sigmam, deltasigma : double;
l, aa, bb, s, rads, a1, a2 : real;
iterlimit : integer;
begin
azim := 0;
rads := pi / 180;
a := 6378137; b := 6356752.3142; f := 1/298.257223563; // WGS-84
ellipsoid
L := (lon2-lon1)* rads;
U1 := arctan((1-f) * tan(lat1 * rads));
U2 := arctan((1-f) * tan(lat2 * rads));
sinU1 := sin(U1);
cosU1 := cos(U1);
sinU2 := sin(U2);
cosU2 := cos(U2);
lambda := L;
lambdaP := 100;
iterLimit := 100;
while (abs(lambda-lambdaP) > 1e-12) and (iterLimit>0) do
begin
sinLambda := sin(lambda);
cosLambda := cos(lambda);
sinSigma := sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
(cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
if (sinSigma =0) then
begin // co-incident points
iterlimit := 0;
exit;
end;
cosSigma := sinU1*sinU2 + cosU1*cosU2*cosLambda;
sigma := arctan2(sinSigma, cosSigma);
sinAlpha := cosU1 * cosU2 * sinLambda / sinSigma;
cosSqAlpha := 1 - sinAlpha*sinAlpha;
if (sinU1 <> 0) and (sinU2 <> 0) and (cosSqAlpha <>
0)
then cos2SigmaM := cosSigma - 2*sinU1*sinU2/cosSqAlpha
else cos2SigmaM := cosSigma;
if cos2SigmaM = 0 then
begin
iterlimit := 0;
exit; // equatorial line: cosSqAlpha=0 (§6)
end;
C := f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
lambdaP := lambda;
lambda := L + (1-C) * f * sinAlpha *
(sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
dec(iterlimit);
end;
if (iterLimit
= 0) then result := 0
else
begin // formula failed to converge
uSq := cosSqAlpha
* (a*a - b*b) / (b*b);
AA := 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
BB := uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
deltaSigma := BB*sinSigma*(cos2SigmaM+BB/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
BB/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
s := b*AA*(sigma-deltaSigma);
a1 := arctan2(cosU2*sinlambda,
cosU1*sinU2 - sinU1*cosU2*coslambda);
a2 := arctan2(cosU1*sinlambda, -sinU1*cosU2 + cosU1*sinU2*coslambda);
// same lines
as above but with different variable names to be declared globally
// fwdAz = arctan2(cosU2*sinLambda,
cosU1*sinU2-sinU1*cosU2*cosLambda);
// revAz = arctan2(cosU1*sinLambda, -sinU1*cosU2+cosU1*sinU2*cosLambda);
azim := a1; // Forward azimuth in degrees, only really need this
one
result := s; // distance in metres
end;
end;
|
For those
who are seeking info/code on con conversion of Latitude and Longtitude
to a Maidenhead Grid locator in Delphi :
// Not the neatest
code I have encountered but certainly works.
// Pass it
the Lat and long values (eg -27.3 & 153.2 ) and returns the
Maidenhead code as the result.
// eg form1.edit9.text := latlong_to_maidenhead(lat,long);
function
latlong_to_maidenhead(lat_d,long_d : real): string;
var alphas, nums, codes : string;
g1zz,g2zz,g3zz,g4zz,g5zz,g6zz : string;
ge,te : real;
g1,g2,g3,g4,g5,g6 : integer;
nszz,ewzz,
sv : string;
begin
alphas := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
nums := '0123456789';
{CALCULATE
THE GRID LOCATOR}
GE := (Long_D+
180) / 20;
TE := (Lat_d + 90) / 10;
G1 := trunc(GE);
G2 := trunc(TE);
G1ZZ := alphas[G1+1];
G2ZZ := alphas[G2+1];
GE := (GE -
G1) * 10;
TE := (TE - g2) * 10;
G3 := trunc(GE) ;
G4 := trunc(TE);
G3ZZ := nums[G3+1];
G4ZZ := nums[G4+1];
G5 := trunc((GE
- G3)*24);
G6 := trunc((TE - G4)*24);
G5ZZ := alphas[G5+1];
G6ZZ := alphas[G6+1];
sv := G1ZZ+G2ZZ+G3ZZ+G4ZZ;
if (trunc(lat_d) = lat_d) and (trunc(long_d) = long_d) then result
:= sv else
result := sv+lowercase(G5ZZ)+lowercase(G6ZZ);
end;
|
|
For those
who are seeking info/code on conversion of a Maidenhead Grid locator
back to Latitude and Longtitude in Delphi :
// Again, not
the neatest code I have encountered but certainly works.
Variables :
mh = maidenhead in 4 or 6 charcater format, Lat : lat:6:2, Long
: long:6:2
PROCEDURE
maidenhead_to_latlong(mh : string; var lat,long : real);
var g1,g2,g3,g4,g5,g6
: integer;
g1s,g2s,g3s,g4s,g5s,g6s : char;
a,b,c,d : integer;
s1,s2,s3,s4 : string;
ge,te,gn,tn : real;
begin
lat := 0;
long := 0;
a := length(mh);
if a < 4 then
begin
lat := 0;
long := 0;
exit;
end;
{ upper case}
for b := 1 to a do mh[b] := upcase(mh[b]);
{ separate
chars of maidenhead code }
for b := 1 to a do
begin
case b of
1 : g1s := mh[1];
2 : g2s := mh[2];
3 : g3s := mh[3];
4 : g4s := mh[4];
5 : g5s := mh[5];
6 : g6s := mh[6];
end;
end;
{ allow for
last 2 chars to be missing}
if a = 4 then
begin
g5 := 0;
g6 := 0;
g5s := chr(0);
g6s := chr(0);
end;
g1 := ord(g1s)
- 65;
g2 := ord(g2s) - 65;
g3 := ord(g3s) - 48;
g4 := ord(g4s) - 48;
g5 := ord(g5s) - 65;
g6 := ord(g6s) - 65;
ge := 20 *
g1;
te := 10 * g2;
gn := 0;
tn := 0;
ge := ge + (2 * G3);
te := te + g4;
if a > 4 then
begin
gn := g5 * 5;
if gn > 59 then ge := ge + 1;
if gn > 59 then gn := gn - 60;
tn := 2.5 * g6;
end;
ge := int(ge
- 180);
if ge < 0 then gn := 60 - gn;
if ge < 0 then
begin
if g5 = 0 then ge := ge + 1;
end;
gn := int(g5 div 5) * 5;
long:= (ge)+
(gn / 60);
te := int(te
- 90);
if te < 0 then gn := 60 -gn;
if te < 0 then
begin
if g5 = 0 then te := te + 1;
end;
tn := int(tn / 2.5) * 2.5;
lat := (te)
+ (tn / 60);
end;
|
| |
Any
feedback would be appreciated :
Feedback Form
Last
edit :
25-Feb-2010
|