Re: Math_LatLong ?

From: Date: Fri, 13 Jan 2006 18:07:07 +0000
Subject: Re: Math_LatLong ?
References: 1 2  Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-40955@lists.php.net to get a copy of this message
BTW, please note that any code I have posted in the thread so far is slated for refactoring over the weekend, and would like to have any comments held off until I actually submit a draft (especially since what I have posted so far uses way too many magic numbers). Thanks, JC On 1/13/06, James Carr <james.r.carr@gmail.com> wrote: > > Sorry, seems my last replies were actually off list (Seth is probably > wondering why I sent him all my emails). :( > > So, as a quick repost to those: > On 1/11/06, bertrand Gugger < bertrand@toggg.com> > >Dunno how how much it is math :) > It's a little too much math! Take a peek: > /* > * Calculate geodesic distance (in m) between two points specified > by > latitude/longitude with Vincenty formula > * > * from: Vincenty inverse formula - T Vincenty, "Direct and Inverse > Solutions of Geodesics on the > * Ellipsoid with application of nested equations", Survey > Review, vol XXII no 176, 1975 > * http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf > * > * @access public > * @static > * @param LatLong $p1 - starting point > * @param LatLong $p2 - ending point > */ > function distVincenty ($p1, $p2) > { > $a = 6378137; > $b = 6356752.3142; > $f = 1/298.257223563; > $L = $p2->lon - $p1->long; > $U1 = atan((1-$f) * tan($p1->lat)); > $U2 = atan((1-$f) * tan($p2->lat)); > $sinU1 = sin($U1); $cosU1 = cos($U1); > $sinU2 = sin($U2); $cosU2 = cos($U2); > $lambda = $L; $lambdaP = 2*PI; > $iterLimit = 20; > > while (abs($lambda-$lambdaP) > 1e-12 && --$iterLimit>0) > { > $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) > { > return 0; // co-incident points > } > $cosSigma = $sinU1*$sinU2 + > $cosU1*$cosU2*$cosLambda; > $sigma = atan2($sinSigma, $cosSigma); // was atan2 > $alpha = asin($cosU1 * $cosU2 * $sinLambda / > $sinSigma); > $cosSqAlpha = cos($alpha) * cos($alpha); > $cos2SigmaM = $cosSigma - 2*$sinU1*$sinU2/$cosSqAlpha; > $C = $f/16*$cosSqAlpha*(4+$f*(4-3*$cosSqAlpha)); > $lambdaP = $lambda; > $lambda = $L + (1-$C) * $f * sin($alpha) * > ($sigma + $C*$sinSigma*($cos2SigmaM+$C*$cosSigma* > (-1+2*$cos2SigmaM*$cos2SigmaM))); > } > if ($iterLimit==0) return false; // formula failed to > converge > $uSq = $cosSqAlpha * ($a*$a - $b*$b) / ($b*$b); > $A = 1 + $uSq/16384*(4096+$uSq*(-768+$uSq*(320-175*$uSq))); > $B = $uSq/1024 * (256+$uSq*(-128+$uSq*(74-47*$uSq))); > $deltaSigma = > $B*$sinSigma*($cos2SigmaM+$B/4*($cosSigma*(-1+2*$cos2SigmaM*$cos2SigmaM)- > > $B/6*$cos2SigmaM*(-3+4*$sinSigma*$sinSigma)*(-3+4*$cos2SigmaM*$cos2SigmaM))); > $s = $b*$A*($sigma-$deltaSigma); > $s = round( $s, 3); // round to 1mm precision > return $s; > } > (yeah, a bit nasty. I'm working on cleaning up the readability). > > Anyway, I've signed up for an account and would like to move forward and > submit code. I've refactored the current class a bit, but plan on > refactoring it into a package that provides a LatitudeLongitude object with > associated attributes, and encapsulate all the realted algorithms to perform > calculations on latitude longitude coordinates ( i.e. finding lat/long > coordinate given a starting point, bearing, and distance... as well as > mutiple ways to calculate the distance between two points, and even type > conversion between types like NAD83, WGS84, UMT, etc). > > Thanks, > JC > > > On 1/11/06, James Carr <james.r.carr@gmail.com> wrote: > > > > Hi, > > > > I have a small class I cooked up sometime back to do latitude/longitude > > related calculations, and was wondering if there would be any interest in > > putting this in PEAR? I need to do a bit of cleaning up on it, but it's > > pretty solid and contains around 8 algorithms for latitude/logtitude related > > calculations (and I am sure all the new google maps api people would enjoy > > it). > > > > Thanks, > > JC > > > >

« previous php.pear.dev (#40955) next »