You are here

function farm_map_distance in farmOS 7

Calculate the distance between two latitude/longitude points in meters.

Parameters

Point $p1: The first point.

Point $p2: The second point.

Return value

string Returns the distance as a string, in meters.

1 call to farm_map_distance()
farm_map_line_length in modules/farm/farm_map/farm_map.geo.inc
Calculate the length of a LineString in meters.

File

modules/farm/farm_map/farm_map.geo.inc, line 267
Farm map geometry functions.

Code

function farm_map_distance($p1, $p2) {

  // Load GeoPHP.
  geophp_load();

  // Set BCMath scale.
  farm_map_set_bcscale();

  // Build a LineString and calculate the center point.
  $line = new LineString(array(
    $p1,
    $p2,
  ));
  $centroid = $line
    ->centroid();

  // Calculate the length of latitude and longitude degrees at the centroid.
  $lon_deg_len = farm_map_lon_deg_len($centroid
    ->getY());
  $lat_deg_len = farm_map_lat_deg_len($centroid
    ->getY());

  // If BCMath is available, use that. Otherwise, use normal PHP float
  // operations.
  if (geoPHP::bcmathInstalled()) {
    $length = bcsqrt(bcadd(bcpow(bcmul(bcsub($p1
      ->getX(), $p2
      ->getX()), $lon_deg_len), '2'), bcpow(bcmul(bcsub($p1
      ->getY(), $p2
      ->getY()), $lat_deg_len), '2')));
  }
  else {
    $length = sqrt(pow(($p1
      ->getX() - $p2
      ->getX()) * $lon_deg_len, 2) + pow(($p1
      ->getY() - $p2
      ->getY()) * $lat_deg_len, 2));
  }

  // Reset BCMath scale.
  farm_map_reset_bcscale();

  // Return the length as a string.
  return (string) $length;
}