<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> * Function: destVincenty<br> *<br> * Parameters:<br> * p1 - {<OpenLayers.LonLat>}<br> * bearing - {Float} The bearing, with 0 degree being true north and clockwise positive.<br> * dist - {Float} The distance, in kilometers.<br> *<br> * Returns:<br> * {<OpenLayers.LonLat>}<br> *<br> * Note:<br> * Adapted from Vincenty 'Direct' formula: (<http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html>).<br> */<br>OpenLayers.Util.destVincenty=function(p1, bearing, dist) {<br> var a = 6378137, b = 6356752.3142, f = 1/298.257223563; // WGS-84 ellipsiod<br> var s = dist * 1000;<br> var alpha1 = OpenLayers.Util.rad(bearing);<br> var sinAlpha1 = Math.sin(alpha1), cosAlpha1 = Math.cos(alpha1);<br> <br> var tanU1 = (1-f) * Math.tan(OpenLayers.Util.rad(p1.lat));<br> var cosU1 = 1 / Math.sqrt((1 + tanU1*tanU1)), sinU1 = tanU1*cosU1;<br> var sigma1 = Math.atan2(tanU1, cosAlpha1);<br> var sinAlpha = cosU1 * sinAlpha1;<br> var cosSqAlpha = 1 - sinAlpha*sinAlpha;<br> var uSq = cosSqAlpha * (a*a - b*b) / (b*b);<br> var A = 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));<br> var B = uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));<br> <br> var sigma = s / (b*A), sigmaP = 2*Math.PI;<br> while (Math.abs(sigma-sigmaP) > 1e-12) {<br> var cos2SigmaM = Math.cos(2*sigma1 + sigma);<br> var sinSigma = Math.sin(sigma), cosSigma = Math.cos(sigma);<br> var deltaSigma = B*sinSigma*(cos2SigmaM+B/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-<br> B/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));<br> sigmaP = sigma;<br> sigma = s / (b*A) + deltaSigma;<br> }<br><br> var tmp = sinU1*sinSigma - cosU1*cosSigma*cosAlpha1;<br> var lat2 = Math.atan2(sinU1*cosSigma + cosU1*sinSigma*cosAlpha1, <br> (1-f)*Math.sqrt(sinAlpha*sinAlpha + tmp*tmp));<br> var lambda = Math.atan2(sinSigma*sinAlpha1, cosU1*cosSigma - sinU1*sinSigma*cosAlpha1);<br> var C = f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));<br> var L = lambda - (1-C) * f * sinAlpha *<br> (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));<br><br> var revAz = Math.atan2(sinAlpha, -tmp); // final bearing<br><br> return new OpenLayers.LonLat(p1.lon+OpenLayers.Util.deg(L),OpenLayers.Util.deg(lat2));<br>}<br><br></body>
</html>