Nov 30, 2014

Find Random Coordinates in the proximity

If you are asked to find the random coordinates (latitude & longitude) considering that your latitude & longitude as the center and with in the given proximity (radius), then this service will help to get one such coordinate. An example, you are at X location (17.414472, 78.449024) and radius 1 mile.



 /**
     * picks the random latitude & longitude with respect to given within the provided radius
     *
     * @param array $centre    (lat, lng)
     * @param number $radius           
     * @return array:
     */
    function getCoordinates($centre, $radius)
    {
        $radius_earth = 3959; // miles
                             
        // Pick random distance within $distance;
        $distance = lcg_value() * $radius;
       
        // Convert degrees to radians.
        $centre_rads = array_map('deg2rad', $centre);
       
        // First suppose our point is the north pole.
        // Find a random point $distance miles away
        $lat_rads = (pi() / 2) - $distance / $radius_earth;
        $lng_rads = lcg_value() * 2 * pi();
       
        // ($lat_rads,$lng_rads) is a point on the circle which is
        // $distance miles from the north pole. Convert to Cartesian
        $x1 = cos($lat_rads) * sin($lng_rads);
        $y1 = cos($lat_rads) * cos($lng_rads);
        $z1 = sin($lat_rads);
       
        // Rotate that sphere so that the north pole is now at $centre.
       
        // Rotate in x axis by $rot = (pi()/2) - $centre_rads[0];
        $rot = (pi() / 2) - $centre_rads[0];
        $x2 = $x1;
        $y2 = $y1 * cos($rot) + $z1 * sin($rot);
        $z2 = - $y1 * sin($rot) + $z1 * cos($rot);
       
        // Rotate in z axis by $rot = $centre_rads[1]
        $rot = $centre_rads[1];
        $x3 = $x2 * cos($rot) + $y2 * sin($rot);
        $y3 = - $x2 * sin($rot) + $y2 * cos($rot);
        $z3 = $z2;
       
        // Finally convert this point to polar co-ords
        $lng_rads = atan2($x3, $y3);
        $lat_rads = asin($z3);
       
        return array_map('rad2deg', array(
            $lat_rads,
            $lng_rads
        ));
    }


    $my_location = array(17.414472, 78.449024);
    $radius = 1;
    print_r(getCoordinates($my_location, $radius));

No comments:

Post a Comment

Want to tell something about this post. Please feel free to write...