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ù :
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.
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); }}