<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>Hi all,<br><br>There is another formula from Vincenty that permits to use 1 point, a bearing and a distance to obtain the coordinates of the target there. You can find the original JavaScript here:<br><a href="http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html" class="LURL">http://www.movable-type.co.uk<span class="HB">- </span>/scripts<span class="HB">- </span>/latlong-vincenty-direct.html</a><br><br>I think this function should also be part of OpenLayers.Util as the distVincenty is. However, what would be the best return value type? I thought that since a OpenLayers.LonLat is used as a parameter, maybe that should be the return type. On the other hand, I needed such a function to create a geometry, which takes in an OpenLayers.Geometry.Point as a parameter so that I need to convert all points (what's the best way to do that?).<br><br>Vincent<br><br>Here is the function from the link above dapted for OpenLayers:<br>/**<br>&nbsp;* Function: destVincenty<br>&nbsp;*<br>&nbsp;* Parameters:<br>&nbsp;* p1 - {&lt;OpenLayers.LonLat&gt;}<br>&nbsp;* bearing - {Float} The bearing, with 0 degree being true north and clockwise positive.<br>&nbsp;* dist - {Float} The distance, in kilometers.<br>&nbsp;*<br>&nbsp;* Returns:<br>&nbsp;* {&lt;OpenLayers.LonLat&gt;}<br>&nbsp;*<br>&nbsp;* Note:<br>&nbsp;* Adapted from Vincenty 'Direct' formula: (&lt;http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html&gt;).<br>&nbsp;*/<br>OpenLayers.Util.destVincenty=function(p1, bearing, dist) {<br>&nbsp; var a = 6378137, b = 6356752.3142,&nbsp; f = 1/298.257223563;&nbsp; // WGS-84 ellipsiod<br>&nbsp; var s = dist * 1000;<br>&nbsp; var alpha1 = OpenLayers.Util.rad(bearing);<br>&nbsp; var sinAlpha1 = Math.sin(alpha1), cosAlpha1 = Math.cos(alpha1);<br>&nbsp; <br>&nbsp; var tanU1 = (1-f) * Math.tan(OpenLayers.Util.rad(p1.lat));<br>&nbsp; var cosU1 = 1 / Math.sqrt((1 + tanU1*tanU1)), sinU1 = tanU1*cosU1;<br>&nbsp; var sigma1 = Math.atan2(tanU1, cosAlpha1);<br>&nbsp; var sinAlpha = cosU1 * sinAlpha1;<br>&nbsp; var cosSqAlpha = 1 - sinAlpha*sinAlpha;<br>&nbsp; var uSq = cosSqAlpha * (a*a - b*b) / (b*b);<br>&nbsp; var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));<br>&nbsp; var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));<br>&nbsp; <br>&nbsp; var sigma = s / (b*A), sigmaP = 2*Math.PI;<br>&nbsp; while (Math.abs(sigma-sigmaP) &gt; 1e-12) {<br>&nbsp;&nbsp;&nbsp; var cos2SigmaM = Math.cos(2*sigma1 + sigma);<br>&nbsp;&nbsp;&nbsp; var sinSigma = Math.sin(sigma), cosSigma = Math.cos(sigma);<br>&nbsp;&nbsp;&nbsp; var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));<br>&nbsp;&nbsp;&nbsp; sigmaP = sigma;<br>&nbsp;&nbsp;&nbsp; sigma = s / (b*A) + deltaSigma;<br>&nbsp; }<br><br>&nbsp; var tmp = sinU1*sinSigma - cosU1*cosSigma*cosAlpha1;<br>&nbsp; var lat2 = Math.atan2(sinU1*cosSigma + cosU1*sinSigma*cosAlpha1, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1-f)*Math.sqrt(sinAlpha*sinAlpha + tmp*tmp));<br>&nbsp; var lambda = Math.atan2(sinSigma*sinAlpha1, cosU1*cosSigma - sinU1*sinSigma*cosAlpha1);<br>&nbsp; var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));<br>&nbsp; var L = lambda - (1-C) * f * sinAlpha *<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));<br><br>&nbsp; var revAz = Math.atan2(sinAlpha, -tmp);&nbsp; // final bearing<br><br>&nbsp; return new OpenLayers.LonLat(p1.lon+OpenLayers.Util.deg(L),OpenLayers.Util.deg(lat2));<br>}<br><br></body>
</html>