Convertir des coordonnées sexagésimales en coordonnées décimales

Principe

Les données sexagésimales représentent des données de type latitude/longitude, et sont en général sous la forme : 45°30,5440N, où :

  • 45 reste invariant
  • 30 correspond aux minutes
  • 5440 correspond soit aux secondes, soit aux dixièmes de minutes (le script est à adapter si vous êtes dans le premier cas)
  • N indique l'orientation de la mesure (N/S pour les latitudes, W/E pour les longitudes)

Les SGBD, comme Postgis, ne sont capables d'intégrer que des données de type décimal : dans notre cas, nous devrions fournir la valeur 45.50907 pour que la coordonnée puisse être prise en compte.

Par convention, les données orientées N ou W sont positives, S ou E négatives.

Script

Il s'agit d'un script créé pour être utilisé avec Talend. Il reste partiel, certaines valeurs n'étant pas traduites (O à la place de W, ou la gestion des minuscules...). Par défaut, si l'orientation n'est pas spécifiée, elle est fixée à N pour une latitude et W pour une longitude.

package routines;
public class Coordonnees_convert {
    /**
     * sexa_to_decimal : transform sexadecimal coord into decimal coord
     *
     * {talendTypes} Double
     *
     * {Category} User Defined
     *
     * {param} (string coord, boolean is_latitude)
     *
     * Fonction de transformation d'une coordonnee sexagesimale en valeur decimale
     * @param String coord : coordonnee a transformer
     * @param Boolean is_latitude : true s'il s'agit d'une latitude, false en cas de longitude
     * @return double : valeur transformee
     */
    public static double sexa_to_decimal(String coord, boolean is_latitude) {
        int pos = 0;
        String signe = "", new_coord = "";
        double coord_abs;
        String[] a_coord;
        /*
         * recherche du dernier caractere pour savoir si on est en positif ou negatif
         */
        if (is_latitude) {
            /*
             * Traitement de la latitude
             */
            pos = coord.indexOf("N");
            if (pos > 0) {
                coord = coord.substring(0, pos );
            } else {
                pos = coord.indexOf("S");
                if (pos > 0) {
                    coord = coord.substring(0, pos );
                    signe = "-";
                }
            }
        } else {
            /*
             * traitement de la longitude
             */
            pos = coord.indexOf("E");
            if (pos > 0) {
                coord = coord.substring(0, pos );
            } else {
                pos = coord.indexOf("W");
                if (pos > 0) {
                    coord = coord.substring(0, pos);
                }
                signe = "-";
            }
        }
        /*
         * Remplacement de la virgule par le point
         */
        coord = coord.replace(",", ".");
        /*
         * Separation en deux parties
         */
        a_coord = coord.split("°");
        /*
         * Transformation des minutes en valeur decimale, et ajout des degres
         */
        coord_abs = Double.parseDouble(a_coord[0].trim()) + (Double.parseDouble(a_coord[1].trim()) / 60);
        /*
         * Creation de la chaine a transformer
         */
        new_coord = signe + String.valueOf(coord_abs);
        /*
         * Retour de la coordonnee transformee
         */
        return Double.parseDouble(new_coord);
    }
}