diff --git a/geolocation.module b/geolocation.module
index 46baee8..48cce18 100644
--- a/geolocation.module
+++ b/geolocation.module
@@ -43,6 +43,13 @@ function geolocation_theme() {
       ],
       'template' => 'geolocation-latlng-formatter',
     ],
+    'geolocation_sexagesimal_formatter' => [
+      'variables' => [
+        'lat' => NULL,
+        'lng' => NULL,
+      ],
+      'template' => 'geolocation-sexagesimal-formatter',
+    ],
     'geolocation_common_map_display' => [
       'variables' => [
         'centre' => NULL,
diff --git a/src/GeolocationCore.php b/src/GeolocationCore.php
index 409a1ba..d5ab07f 100644
--- a/src/GeolocationCore.php
+++ b/src/GeolocationCore.php
@@ -267,4 +267,66 @@ class GeolocationCore {
     )";
   }
 
+  /**
+   * Transform sexagesimal notation to float.
+   *
+   * Sexagesimal means a string like - X° Y' Z"
+   *
+   * @param string $sexagesimal
+   *  String in DMS notation.
+   *
+   * @return float|FALSE
+   *  The regular float notation or FALSE if not sexagesimal.
+   */
+  public static function SexagesimalToDecimal($sexagesimal = '') {
+    $pattern = "/(?<degree>-?\d{1,3})°[ ]?((?<minutes>\d{1,2})')?[ ]?((?<seconds>(\d{1,2}|\d{1,2}\.\d+))\")?/";
+    preg_match($pattern, $sexagesimal, $gps_matches);
+    if (
+      !empty($gps_matches)
+    ) {
+      $value = $gps_matches['degree'];
+      if (!empty($gps_matches['minutes'])) {
+        $value += $gps_matches['minutes'] / 60;
+      }
+      if (!empty($gps_matches['seconds'])) {
+        $value += $gps_matches['seconds'] / 3600;
+      }
+    }
+    else {
+      return FALSE;
+    }
+    return $value;
+  }
+
+  /**
+   * Transform decimal notation to sexagesimal.
+   *
+   * Sexagesimal means a string like - X° Y' Z"
+   *
+   * @param float|string $decimal
+   *  Either float or float-castable location.
+   *
+   * @return string|FALSE
+   *  The sexagesimal notation or FALSE on error.
+   */
+  public static function DecimalToSexagesimal($decimal = '') {
+    $decimal = (float) $decimal;
+
+    $degrees = floor($decimal);
+    $rest = $decimal - $degrees;
+    $minutes = floor($rest * 60);
+    $rest = $rest * 60 - $minutes;
+    $seconds = round($rest * 60, 4);
+
+    $value = $degrees . '°';
+    if (!empty($minutes)) {
+      $value .= ' ' . $minutes . '\'';
+    }
+    if (!empty($seconds)) {
+      $value .= ' ' . $seconds . '"';
+    }
+
+    return $value;
+  }
+
 }
diff --git a/src/Plugin/Field/FieldFormatter/GeolocationSexagesimalFormatter.php b/src/Plugin/Field/FieldFormatter/GeolocationSexagesimalFormatter.php
new file mode 100644
index 0000000..165d141
--- /dev/null
+++ b/src/Plugin/Field/FieldFormatter/GeolocationSexagesimalFormatter.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Drupal\geolocation\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\FormatterBase;
+use Drupal\geolocation\GeolocationCore;
+
+/**
+ * Plugin implementation of the 'geolocation_sexagesimal' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "geolocation_sexagesimal",
+ *   module = "geolocation",
+ *   label = @Translation("Geolocation Sexagesimal / GPS / DMS"),
+ *   field_types = {
+ *     "geolocation"
+ *   }
+ * )
+ */
+class GeolocationSexagesimalFormatter extends FormatterBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items, $langcode) {
+    $element = array();
+
+    foreach ($items as $delta => $item) {
+      $element[$delta] = array(
+        '#theme' => 'geolocation_sexagesimal_formatter',
+        '#lat' => GeolocationCore::DecimalToSexagesimal($item->lat),
+        '#lng' => GeolocationCore::DecimalToSexagesimal($item->lng),
+      );
+    }
+
+    return $element;
+  }
+
+}
diff --git a/src/Plugin/Field/FieldWidget/GeolocationLatlngWidget.php b/src/Plugin/Field/FieldWidget/GeolocationLatlngWidget.php
index 318c534..d4296f1 100644
--- a/src/Plugin/Field/FieldWidget/GeolocationLatlngWidget.php
+++ b/src/Plugin/Field/FieldWidget/GeolocationLatlngWidget.php
@@ -5,6 +5,7 @@ namespace Drupal\geolocation\Plugin\Field\FieldWidget;
 use Drupal\Core\Field\FieldItemListInterface;
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\geolocation\GeolocationCore;
 
 /**
  * Plugin implementation of the 'geolocation_latlng' widget.
@@ -30,9 +31,11 @@ class GeolocationLatlngWidget extends WidgetBase {
       '#empty_value' => '',
       '#default_value' => (isset($items[$delta]->lat)) ? $items[$delta]->lat : NULL,
       '#maxlength' => 255,
-      '#description' => $this->t('Latitude'),
       '#required' => $this->fieldDefinition->isRequired(),
     );
+    if (!empty($element['lat']['#default_value'])) {
+      $element['lat']['#description'] = $this->t('<span>Sexagesimal/DMS notation value: %sexagesimal</span>', ['%sexagesimal' => GeolocationCore::DecimalToSexagesimal($element['lat']['#default_value'])]);
+    }
 
     $element['lng'] = array(
       '#type' => 'textfield',
@@ -40,11 +43,35 @@ class GeolocationLatlngWidget extends WidgetBase {
       '#empty_value' => '',
       '#default_value' => (isset($items[$delta]->lng)) ? $items[$delta]->lng : NULL,
       '#maxlength' => 255,
-      '#description' => $this->t('Longitude'),
       '#required' => $this->fieldDefinition->isRequired(),
     );
+    if (!empty($element['lng']['#default_value'])) {
+      $element['lng']['#description'] = $this->t('<span>Sexagesimal/DMS notation value: %sexagesimal</span>', ['%sexagesimal' => GeolocationCore::DecimalToSexagesimal($element['lng']['#default_value'])]);
+    }
 
     return $element;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
+    // Grep GPS values and transform to regular float.
+    foreach ($values as $index => $geolocation) {
+      if (
+        !empty($geolocation['lat'])
+        && !empty($geolocation['lng'])
+      ) {
+        $latitude = GeolocationCore::SexagesimalToDecimal($values[$index]['lat']);
+        $longitude = GeolocationCore::SexagesimalToDecimal($values[$index]['lng']);
+
+        if (!empty($latitude) && !empty($longitude)) {
+          $values[$index]['lat'] = $latitude;
+          $values[$index]['lng'] = $longitude;
+        }
+      }
+    }
+    return parent::massageFormValues($values, $form, $form_state);
+  }
+
 }
diff --git a/templates/geolocation-sexagesimal-formatter.html.twig b/templates/geolocation-sexagesimal-formatter.html.twig
new file mode 100644
index 0000000..bf2fe5d
--- /dev/null
+++ b/templates/geolocation-sexagesimal-formatter.html.twig
@@ -0,0 +1,15 @@
+{#
+/**
+ * @file
+ * Implementation for a geolocation with latitude, longitude in sexagesimal notation.
+ *
+ * Available variables:
+ * - lat: The latitude value.
+ * - lng: The longitude value.
+ *
+ * @see template_preprocess()
+ *
+ * @ingroup themeable
+ */
+#}
+<span class="geolocation-sexagesimal">{{ lat }}, {{ lng }}</span>
\ No newline at end of file
