diff --git a/geoPHP/lib/geometry/LineString.class.php b/geoPHP/lib/geometry/LineString.class.php
index bef082c..2f50372 100644
--- a/geoPHP/lib/geometry/LineString.class.php
+++ b/geoPHP/lib/geometry/LineString.class.php
@@ -104,6 +104,57 @@ class LineString extends Collection
     return $length;
   }
 
+  public function vincentyLength() {
+    $length = 0;
+    $points = $this->getPoints();
+    for($i=0; $i<$this->numPoints()-1; $i++) {
+      $point = $points[$i];
+      $next_point = $points[$i+1];
+      if (!is_object($next_point)) {continue;}
+      //vincenty method
+      $lat1 = deg2rad($point->getY());
+      $lat2 = deg2rad($next_point->getY());
+      $lon1 = deg2rad($point->getX());
+      $lon2 = deg2rad($next_point->getX());
+      $a = 6378137;
+      $b = 6356752.314245;
+      $f = 1/298.257223563; // WGS-84 ellipsoid
+      $L = $lon2 - $lon1;
+      $U1 = atan((1-$f) * tan($lat1));
+      $U2 = atan((1-$f) * tan($lat2));
+      $sinU1 = sin($U1);
+      $cosU1 = cos($U1);
+      $sinU2 = sin($U2);
+      $cosU2 = cos($U2);
+      $lambda = $L; $lambdaP = 2 * M_PI;
+      $iterLimit = 100;
+      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
+      $length .= $s;
+    }
+    return $length;
+  }
+
   public function haversineLength() {
     $degrees = 0;
     $points = $this->getPoints();
