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);
}
}