<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2800.1170" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face=Arial size=2>Charlie,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>I checked the great circle stuff, you are right 
that this was not the most accurate although difference generally within 
1%<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>I replaced it with a shortened version of what you 
were using:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>Private Function GeoDistance(Lon1 As Double, 
Lat1 As Double, Lon2 As Double, Lat2 As Double) As Double</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>'The great circle distance d between two points 
with coordinates {lat1,lon1} and {lat2,lon2} is given by:<BR>'<BR>'d = 
acos(Sin(Lat1) * Sin(Lat2) + Cos(Lat1) * Cos(Lat2) * Cos(Lon1 - Lon2))<BR>'A 
mathematically equivalent formula, which is less subject to rounding error for 
short distances is:<BR>'<BR>'d=2*asin(sqrt((sin((lat1-lat2)/2))^2 
+<BR>'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))<BR>'<BR>' an additional check is 
put in to make sure the argument to asin is within the range 
0-1</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>Const deg2rad = 
1.74532925199433E-02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
' radians per degree<BR>Const Pi = 
3.14159265358979&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
' Pi<BR>Const Radius = 6377000<BR>Dim dLat As Double, dLon As 
Double</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>dLat = Lat2 - Lat1<BR>dLon = Lon2 - 
Lon1</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>GeoDistance = Radius * 2 * asin(min(1, 
Sqr(Sin(deg2rad * dLat / 2) ^ 2 + Cos(deg2rad * Lat1) * Cos(deg2rad * Lat2) * 
Sin(deg2rad * dLon / 2) ^ 2)))</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>End Function</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>Private Function asin(ByVal x As Double) As 
Double<BR>&nbsp; asin = Atn(x / Sqr(-x * x + 1))<BR>End 
Function</EM></FONT></DIV>
<DIV><FONT face=Arial size=2><EM></EM></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>Private Function min(ByVal x As Double, ByVal y 
As Double)<BR>&nbsp; If x &lt; y Then min = x Else min = y<BR>End 
Function<BR></EM></FONT></DIV>
<DIV><FONT face=Arial size=2>The differences will be neglectable, i chose not to 
make my own sin2 function like you have, for simplicity's sake...</FONT></DIV>
<DIV><FONT face=Arial size=2>Now if we want do do this completely right the 
first time, i adapted the rest of it to exactly compute one pixel in the middle 
rather then 10% of the window, just to stick to the openGIS definition 
exactly:</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><EM>&nbsp; With 
mvarDisplay.Frame<BR>&nbsp;&nbsp;&nbsp; mapwidth = .xMax - 
.xMin<BR>&nbsp;&nbsp;&nbsp; mapheight = .yMax - .yMin<BR>&nbsp; End 
With<BR>&nbsp; <BR>&nbsp; With mvarDisplay.ZoomExtent<BR>&nbsp;&nbsp;&nbsp; ' 
extent of central pixel<BR>&nbsp;&nbsp;&nbsp; x1 = (.xMin + .xMax) / 
2<BR>&nbsp;&nbsp;&nbsp; x2 = x1 + (.xMax - .xMin) / 
mapwidth<BR>&nbsp;&nbsp;&nbsp; y1 = (.yMin = .yMax) / 2<BR>&nbsp;&nbsp;&nbsp; y2 
= y1 + (.yMax - .yMin) / mapheight<BR>&nbsp;&nbsp;&nbsp; If mvarUnitMeter = 0 
Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' great circle distance for 
lat-lon<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixelmeters = GeoDistance(x1, y1, x2, 
y2)<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' pythagoras 
for projected maps in meters<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pixelmeters = 
Sqr((mvarUnitMeter * (.xMax - .xMin)) ^ 2 + (mvarUnitMeter * (.yMax - .yMin)) ^ 
2)<BR>&nbsp;&nbsp;&nbsp; End If<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp; End 
With<BR>&nbsp; DoGetZoomFactor = pixelmeters / 0.00025<BR></EM></FONT></DIV>
<DIV><FONT face=Arial size=2>I'll try to get a server running here today, but 
first i have to add the scalehints to the XML output.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Best regards,</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Bart Adriaanse</FONT></DIV>
<DIV><FONT face=Arial size=2>Demis bv</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>----- Original Message ----- </FONT></DIV>
<DIV><FONT face=Arial size=2>From: "Paul Kelly" &lt;</FONT><A 
href="mailto:paul-grass@stjohnspoint.co.uk"><FONT face=Arial 
size=2>paul-grass@stjohnspoint.co.uk</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>To: "H Bowman" &lt;</FONT><A 
href="mailto:hamish_nospam@yahoo.com"><FONT face=Arial 
size=2>hamish_nospam@yahoo.com</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>Cc: &lt;</FONT><A 
href="mailto:grass5@grass.itc.it"><FONT face=Arial 
size=2>grass5@grass.itc.it</FONT></A><FONT face=Arial size=2>&gt;; &lt;</FONT><A 
href="mailto:osrs-proj@remotesensing.org"><FONT face=Arial 
size=2>osrs-proj@remotesensing.org</FONT></A><FONT face=Arial 
size=2>&gt;</FONT></DIV>
<DIV><FONT face=Arial size=2>Sent: Wednesday, July 23, 2003 13:09</FONT></DIV>
<DIV><FONT face=Arial size=2>Subject: [OSRS-PROJ] Re: [GRASS5] adding a new 
datum/projection?</FONT></DIV>
<DIV><FONT face=Arial><BR><FONT size=2></FONT></FONT></DIV><FONT face=Arial 
size=2>&gt; Hello<BR>&gt; <BR>&gt; On Wed, 23 Jul 2003, H Bowman wrote:<BR>&gt; 
<BR>&gt; &gt; Hi again --<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; I've got some 
new data in yet another new projection, which uses its own<BR>&gt; &gt; new 
datum.<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; The datum is New Zealand Geodetic 
Datum 2000 (NZGD2000), which is based<BR>&gt; &gt; on the International 
Terrestrial Reference Frame 1996 (ITRF96). This is<BR>&gt; &gt; pretty much the 
same as WGS84 but uses the GRS80 ellipsoid (slightly<BR>&gt; &gt; different 
flattening parameter).<BR>&gt; &gt;<BR>&gt; &gt; So as far as I understand: 
NZGD2k (==ITRF96) is the WGS84 datum combined<BR>&gt; &gt; with the GRS80 
ellipsoid.<BR>&gt; <BR>&gt; We are pushing at the limits of the accuracy of the 
current GRASS/PROJ<BR>&gt; system here. I looked at the document and to me it 
seems that NZGD2000 is<BR>&gt; based on the ITRS datum. It is 'realised' (which 
I think means a<BR>&gt; description of the current location of the earth's 
plates based on<BR>&gt; measurements from a number of stations around the world) 
by several ITRF<BR>&gt; defintions, and each can be realised at any epoch (point 
in time).<BR>&gt; <BR>&gt; For high accuracy you would define a shift that 
related each epoch to WGS84<BR>&gt; (would change because of plate tectonics) 
and each would have a separate<BR>&gt; datum entry in GRASS. It would get out of 
hand very quickly if these were<BR>&gt; all included but it may be possible to 
use GRASS in this way if you could<BR>&gt; get figures for the shift (for New 
Zealand you need ITRF96 at 2000.0<BR>&gt; epoch). </FONT><A 
href="http://www.iers.org/iers/products/itrf/"><FONT face=Arial 
size=2>http://www.iers.org/iers/products/itrf/</FONT></A><FONT face=Arial 
size=2> looks relevant but I don't<BR>&gt; really know.<BR>&gt; <BR>&gt; &gt; 
Except g.setproj won't let me do that, either with a new location or<BR>&gt; 
&gt; retroactively. The old 5.0.2 version asks for ellipsoid first, then<BR>&gt; 
&gt; datum, but complains when you try to mix wgs84 and grs80 and quits<BR>&gt; 
&gt; without writing anything. The latest g.setproj never gives you a 
chance<BR>&gt; &gt; to set the ellipsoid, it is chosen from your datum.<BR>&gt; 
<BR>&gt; No it doesn't seem logical to do that. GRASS uses a very limited 
definition<BR>&gt; of a datum which really just comes down to the ellipsoid 
used, so by<BR>&gt; changing the ellipsoid you are really taking away everything 
the datum<BR>&gt; stands for.<BR>&gt; <BR>&gt; &gt; I'm not sure if I get the 
correct result if I just change the ellps:<BR>&gt; &gt; line to grs80 in the 
PROJ_INFO file?<BR>&gt; <BR>&gt; ellps: grs80<BR>&gt; towgs84: 0,0,0<BR>&gt; 
<BR>&gt; and make sure there is no 'datum' line.<BR>&gt; <BR>&gt; &gt; Is 
anything else based on ITRF96? Would it be worth adding that as a<BR>&gt; &gt; 
common denominator datum? I think the Map Grid of Australia might be in<BR>&gt; 
&gt; a similar situation (??).<BR>&gt; <BR>&gt; It might be worth adding ITRS 
(International Terrestrial Reference<BR>&gt; *System*), but to be compatible 
with other GIS we should probably<BR>&gt; explicitly add 
New_Zealand_Geodetic_Datum_2000 and the others. But as<BR>&gt; they are the same 
as far as the level of accuracy GRASS/PROJ currently<BR>&gt; provides goes, it 
seems like we could end up with a lot of clutter.<BR>&gt; However I have already 
done that for several countries in Europe which use<BR>&gt; the international 
ellipsoid but have different datum names, so there is no<BR>&gt; point in 
discriminating....<BR>&gt; <BR>&gt; <BR>&gt; &gt;<BR>&gt; &gt; see:&nbsp; 
(102k)<BR>&gt; &gt; </FONT><A 
href="http://www.linz.govt.nz/rcs/linz/17880/difference_wgs84_nzgd2000.pdf"><FONT 
face=Arial 
size=2>http://www.linz.govt.nz/rcs/linz/17880/difference_wgs84_nzgd2000.pdf</FONT></A><BR><FONT 
face=Arial size=2>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; As for the 
new projection, it is New Zealand Transverse Mercator (NZTM),<BR>&gt; &gt; which 
is in terms of that new NZGD2k datum.<BR>&gt; &gt; Details:<BR>&gt; &gt; Datum: 
NZGD2k<BR>&gt; &gt; Origin Latitude: 0° South<BR>&gt; &gt; Origin Longitude: 
173° East<BR>&gt; &gt; False Northing: 10 000 000m N<BR>&gt; &gt; False Easting: 
1 600 000m E<BR>&gt; &gt; Scale Factor: 0.9996<BR>&gt; &gt;<BR>&gt; &gt; Setting 
projection as tmerc and entering those terms goes smoothly.<BR>&gt; &gt; Should 
NZTM get its own projection entry or is entering by hand with the<BR>&gt; &gt; 
tmerc projection every time the way to go?<BR>&gt; <BR>&gt; Yes that is the way 
to do it until GRASS has co-ordinate system support,<BR>&gt; which I don't see 
happening any time soon.. you have it very easy with<BR>&gt; New Zealand Map 
Grid which puts in all the parameters for you.<BR>&gt; <BR>&gt; &gt;<BR>&gt; 
&gt; for more details see:&nbsp; (44k)<BR>&gt; &gt; </FONT><A 
href="http://www.linz.govt.nz/rcs/linz/5684/nztransverse_mercator.pdf"><FONT 
face=Arial 
size=2>http://www.linz.govt.nz/rcs/linz/5684/nztransverse_mercator.pdf</FONT></A><BR><FONT 
face=Arial size=2>&gt; &gt;<BR>&gt; &gt; That PDF also has a page of useful 
ellipsoid to grid formulae which<BR>&gt; &gt; might be useful to 
someone.<BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; It doesn't help much that half 
the country is moving 5cm/year in the<BR>&gt; &gt; opposite direction to the 
other half..<BR>&gt; <BR>&gt; It would be useful to keep an eye out for any Free 
Software that handles<BR>&gt; that level of accuracy<BR>&gt; </FONT><A 
href="http://www-gpsg.mit.edu/~simon/gtgk/"><FONT face=Arial 
size=2>http://www-gpsg.mit.edu/~simon/gtgk/</FONT></A><FONT face=Arial size=2> 
has some interesting links<BR>&gt; <BR>&gt; &gt;<BR>&gt; &gt;<BR>&gt; &gt; 
thanks for any insight,<BR>&gt; <BR>&gt; Well hopefully someone will correct the 
inevitable errors and<BR>&gt; misunderstandings in what I've written 
above<BR>&gt; <BR>&gt; Paul<BR>&gt; 
----------------------------------------<BR>&gt; PROJ.4 Discussion List<BR>&gt; 
See </FONT><A href="http://www.remotesensing.org/proj"><FONT face=Arial 
size=2>http://www.remotesensing.org/proj</FONT></A><FONT face=Arial size=2> for 
subscription, unsubscription<BR>&gt; and other information.</FONT></BODY></HTML>