Skip to content

Instantly share code, notes, and snippets.

@threesquared
Created November 20, 2013 15:19
Show Gist options
  • Save threesquared/7564887 to your computer and use it in GitHub Desktop.
Save threesquared/7564887 to your computer and use it in GitHub Desktop.
Grow a lat lon geobox based on a given radius in kilometres and a centre point
function point_distance($coords, $center)
{
$radius = 6378100; // radius of earth in meters
$latDist = $center[0] - $coords[0];
$lngDist = $center[1] - $coords[1];
$latDistRad = deg2rad($latDist);
$lngDistRad = deg2rad($lngDist);
$sinLatD = sin($latDistRad);
$sinLngD = sin($lngDistRad);
$cosLat1 = cos(deg2rad($center[0]));
$cosLat2 = cos(deg2rad($coords[0]));
$a = ($sinLatD/2)*($sinLatD/2) + $cosLat1*$cosLat2*($sinLngD/2)*($sinLngD/2);
if($a<0) $a = -1*$a;
$c = 2*atan2(sqrt($a), sqrt(1-$a));
$distance = $radius*$c;
return $distance;
}
function grow_box($radius, $coords, $center)
{
$center = explode(',', $center);
$ne_distance = (point_distance(array($coords['latn'], $coords['lone']), $center));
$ne_ratio = ($radius*1000) / $ne_distance;
$coords['latn'] = $coords['latn'] - (($center[0] - $coords['latn']) * $ne_ratio);
$coords['lone'] = $coords['lone'] - (($center[1] - $coords['lone']) * $ne_ratio);
$sw_distance = (point_distance(array($coords['lats'], $coords['lonw']), $center));
$sw_ratio = ($radius*1000) / $ne_distance;
$coords['lats'] = $coords['lats'] - (($center[0] - $coords['lats']) * $ne_ratio);
$coords['lonw'] = $coords['lonw'] - (($center[1] - $coords['lonw']) * $ne_ratio);
return $coords;
}
$coords = array(
'latn' => 51.6679,
'lone' => 0.137323,
'lats' => 51.3856,
'lonw' => -0.347998,
);
$center = '51.5149,-0.108381';
$new_box = grow_box(10, $coords, $center);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment