Essai sur la validation des coordonnées géographiques : Latitude et Longitude avec des expression régulières.
Vu que je travaille avec le "Charset utf-8" je ne supporte pas le caractère du dégré :"°" ; raison pour laquelle j'ai utilisé des tirets : " - " pour être uniforme
Ainsi:
-----
"Geographical Coordinate Format is {N|S {:} [-90 to 90] - [00 to 60] - [00 to 60] } ou {W|E} [-180 to 180]} - [00 to 60] - [00 to 60] } "
Je peux donc valider les chaînes suivantes juste pour donner quelques exemples:
--> Latitude: N:45° - 42 - 07.24 .....le format normal est Latitude: N:45° 42' 07.24''
--> Longitude:W:060° - 21 - 37.22 .....le format normal est Longitude:W:060° 21' 37.22''
NOTA:
----
- Ce bout de code a été fait sous l'API D'EXTJs d'ou la gueule de mes fonctions. On peut toujours l'adapter pour ses propres besoins
- Vu que je ne pouvais pas mettre toute la source, alors j'ai mis juste l'essentiel que l'on peut modifier et adapter à ses besoins.
- Avec ces fonctions, on peut bien s'amuser et faire ce qu'on veut i hope !
Source / Exemple :
//...some code ....
//...My Regex rules
/**
- l'ensemble des regles de validation des coordonnes
- geographiques.
-
- @author : marcel tawe
- @param {void}
- @return {JSON} rules, l'ensemble des regles
- /
getRegexRuler : function () {
//var latitude = /^(\s)*[nNsS](\s)*\:(\s)*[-+]?([0-8][0-9]|90)(\s)*\°(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)(\s)*\'(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)\''(\s)*$/ ;
//var longitude= /^(\s)*[wWeE](\s)*\:(\s)*[-+]?(0?[0-9][0-9]|1[0-7][0-9]|180)(\s)*\°(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)(\s)*\'(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)\''(\s)*$/;
//dms = (\s)* latitude | longitude (\s)*
var rules = {
decimal: /^[-+]?\d+(\.\d+)?$/,
degre: /^[-+]?([0-8][0-9]|90)$/,
minute: /^([0-5][0-9](\.\d+)?|60(\.\0+)?)$/,
second: /^([0-5][0-9](\.\d+)?|60(\.\0+)?)$/,
symbDeg: /^°$/,
symbMin: /^'$/,
symbSec: /^\''$/,
dms : /^(\s)*([nNsS](\s)*\:(\s)*[-+]?([0-8][0-9]|90)(\s)*\-(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)(\s)*\-(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?))|([wWeE](\s)*\:(\s)*[-+]?(0?[0-9][0-9]|1[0-7][0-9]|180)(\s)*\-(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?)(\s)*\-(\s)*([0-5][0-9](\.\d+)?|60(\.\0+)?))(\s)*$/
}
return rules ;
},
//....... Des fonctions utilitaires
/**
-
- Validate an expression if it satisfy the correct
- DMS format for a geographical coordinate
-
- @author : marcel tawe
- @param {string} expr, the expression to test
- @return {boolean} , is it a correct DMS format or no
- /
isCorrectDMSFormat : function ( expr ){
var regex = this.getRegexRuler();
var correct = false ;
if( regex.dms.test(expr) ){
correct = true
}
return correct;
},
/**
- Reads a string in a specific DMS format
-
- @author : marcel tawe
- @param {string} expr,
- @return{Object} val, a JSON representing the DMS format of the expr
- /
parseDMS : function ( expr ){
var dms = "";
var parts ="";
if( this.isCorrectDMSFormat(expr) ){
dms = this.trim(expr.toString()); // to remove extras spaces
parts = dms.split(/[^\d\w\.]+/);
dms = {loc: parts[0], deg: parts[1] , min : parts[2] , sec: parts[3] };
}
else
{
dms = {loc: undefined, deg: undefined , min : undefined , sec: undefined };
}
return dms;
},
/**
- Utilitaire permettant d'eliminer les espaces superflus
- en debut et a la fin d'une chaine de caracteres
-
- @param {string} myString
- @return {string} , la chaine de carateres depourvue de tout espace
- /
trim : function (myString) {
return myString.replace(/^\s+/g,'').replace(/\s+$/g,'')
},
/**
- Validate the entry that the user gives to avoid error.
- This function validates that we correctly entered the DMS
- format and that we have respected the range of values
-
- NOTA: Coordinates out of range: lat >90°, <-90°; long >180°, < -180°
-
- @author : marcel tawe
- @param {string} coordinate
- @return {boolean} isValid ,
- /
validateDMSRange :function ( coordinate ) {
var dms = this.trim(coordinate); // to remove extras spaces
var parts = dms.split(/[^\d\w\.]+/);
var isValid = false ;
var loc, rgDeg, rgMin ,rgSec;
// Gets the DMS parts of string
dms = this.parseDMS(coordinate);
//Read the parts of the string
loc = dms.loc; // W, N , S, E
deg = parseFloat(dms.deg);//
min = parseFloat(dms.min);//
sec = parseFloat(dms.sec);//
//Treatement depending if it's Longitude or Latitude
if( loc.toUpperCase()=="E" || loc.toUpperCase()=="W" )
{
//Longitude
rgDeg = (deg < 180 || deg > -180)? true : false;
rgMin = (deg < 60 || deg > 0) ? true : false;
rgSec = (deg < 60 || deg > 0) ? true : false;
}
else
{
//Latitude
rgDeg = (deg < 90 || deg > -90) ? true : false;
rgMin = (deg < 60 || deg > 0) ? true : false;
rgSec = (deg < 60 || deg > 0) ? true : false;
}
//Was all the range's test correct
if( rgDeg && rgMin && rgSec )
isValid = true ;
return isValid;
}
//......
Conclusion :
Les commentaires sont les bienvenues.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.