我在使用正则表达式在javascript中将DMS转换为DD时遇到问题。我从geoserver那里获取了这段代码,但似乎没有用。我希望它能够使用正确或非常接近的答案转换我的所有测试用例。
我真的不在乎这个函数是完全javascript还是繁重的正则表达式,我只是需要它才能工作。
您可以在JSFIDDLE上测试它 http://jsfiddle.net/NJDp4/13/
以下是我的测试用例: dmsToDeg('N 03 01'37“'); dmsToDeg('03 01 37'); dmsToDeg('03 01'37“N'); dmsToDeg('076 40'35“W'); dmsToDeg('W 076 40'35“'); dmsToDeg('N 05 11'17“');
这是我的代码:
function dmsToDeg (dms) {
if (!dms) {
return Number.NaN;
}
var neg = dms.match(/(^\s?-)|(\s?[SW]\s?$)/) != null ? -1.0 : 1.0;
dms = dms.replace(/(^\s?-)|(\s?[NSEW]\s?)$/, '');
dms = dms.replace(/\s/g, '');
var parts = dms.match(/(\d{1,3})[.,°d ]?\s*(\d{0,2})[']?(\d{0,2})[.,]?(\d{0,})(?:["]|[']{2})?/);
if (parts == null) {
return Number.NaN;
}
// parts:
// 0 : degree
// 1 : degree
// 2 : minutes
// 3 : secondes
// 4 : fractions of seconde
var d = (parts[1] ? parts[1] : '0.0') * 1.0;
var m = (parts[2] ? parts[2] : '0.0') * 1.0;
var s = (parts[3] ? parts[3] : '0.0') * 1.0;
var r = (parts[4] ? ('0.' + parts[4]) : '0.0') * 1.0;
var dec = (d + (m / 60.0) + (s / 3600.0) + (r / 3600.0)) * neg;
return dec;
}
答案 0 :(得分:7)
这并不难,下面假设传入了正确的格式,您可能想要对此进行一些验证。它也不格式化输出,如果你需要它,使用通用的格式化功能(再次,不难写,大约5行代码)。
可能你正在将它提供给另一个计算(度数转换为弧度?),因此可能不需要格式化。请注意,javascript数字不能准确表示所有十进制数字,因此请注意舍入。但是,精度足以满足大多数用途。
function dms2deg(s) {
// Determine if south latitude or west longitude
var sw = /[sw]/i.test(s);
// Determine sign based on sw (south or west is -ve)
var f = sw? -1 : 1;
// Get into numeric parts
var bits = s.match(/[\d.]+/g);
var result = 0;
// Convert to decimal degrees
for (var i=0, iLen=bits.length; i<iLen; i++) {
// String conversion to number is done by division
// To be explicit (not necessary), use
// result += Number(bits[i])/f
result += bits[i]/f;
// Divide degrees by +/- 1, min by +/- 60, sec by +/-3600
f *= 60;
}
return result;
}
alert(
dms2deg('S 023 30\'') + '\n' + // -23.5
dms2deg('N 023 00\' 00\"') + '\n' + // 23
dms2deg('W 117 23\' 23.32\"') // -117.3898111111111
);
答案 1 :(得分:0)
问题是您要删除所有空格,以便'03 01 37'变为'030137'。然后,正则表达式\d{1,3}
匹配三个数字,'030'。您应该向正则表达式添加可选的分隔符,而不是从输入中删除它们。
可能还有其他事情,但这是我看到的第一个。
正如您所发现的,解析lat / lon值比看起来更难。如果你可以重新使用别人的代码,你应该。