我有以下表格提供的GPS信息:
36°57'9“N 110°4'21”W
我可以使用javascript functions of Chris Veness将度,分和秒转换为数字度,但首先需要将GPS信息解析为单独的纬度和经度字符串(带有NSEW后缀)。我已经阅读了stackoverflow上的相关帖子,但我不是正则表达式专家(也不是程序员),需要一些解析函数的帮助。将此字符串解析为纬度和经度以便在转换函数中使用的最佳方法是什么?
所有这一切的结果将是一个Web链接,人们可以点击该链接查看位置的Google地图表示。
答案 0 :(得分:50)
要解析您的输入,请使用以下内容。
function ParseDMS(input) {
var parts = input.split(/[^\d\w]+/);
var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}
以下内容将您的DMS转换为DD
function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = degrees + minutes/60 + seconds/(60*60);
if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
所以你的输入会产生以下结果:
36°57'9" N = 36.9525000
110°4'21" W = -110.0725000
十进制坐标可以输入谷歌地图,通过GLatLng(lat, lng)
(Google Maps API)
答案 1 :(得分:12)
纠正了上述功能并使输出成为对象。
function ParseDMS(input) {
var parts = input.split(/[^\d\w\.]+/);
var lat = ConvertDMSToDD(parts[0], parts[2], parts[3], parts[4]);
var lng = ConvertDMSToDD(parts[5], parts[7], parts[8], parts[9]);
return {
Latitude : lat,
Longitude: lng,
Position : lat + ',' + lng
}
}
function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);
if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
答案 2 :(得分:6)
我的调整版本将字符串部分强制转换为Numbers,以便它们实际上可以一起添加而不是连接在一起。它还处理Seconds组件常用的十进制值:
function ParseDMS(input) {
var parts = input.split(/[^\d\w\.]+/);
var lat = ConvertDMSToDD(parts[0], parts[1], parts[2], parts[3]);
var lng = ConvertDMSToDD(parts[4], parts[5], parts[6], parts[7]);
}
以下内容将您的DMS转换为DD
function ConvertDMSToDD(degrees, minutes, seconds, direction) {
var dd = Number(degrees) + Number(minutes)/60 + Number(seconds)/(60*60);
if (direction == "S" || direction == "W") {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}
答案 3 :(得分:3)
我在这个功能上得到了一些NaN,并且需要这样做(不要问我原因)
function ConvertDMSToDD(days, minutes, seconds, direction) {
var dd = days + (minutes/60) + seconds/(60*60);
dd = parseFloat(dd);
if (direction == "S" || direction == "W") {
dd *= -1;
} // Don't do anything for N or E
return dd;
}
答案 4 :(得分:2)
乔,你提到的剧本已经做了你想要的。有了它,您可以转换lat和long并将其链接到Google地图中查看位置:
var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg()
答案 5 :(得分:2)
这是我对此的看法:
function parse_gps( input ) {
if( input.indexOf( 'N' ) == -1 && input.indexOf( 'S' ) == -1 &&
input.indexOf( 'W' ) == -1 && input.indexOf( 'E' ) == -1 ) {
return input.split(',');
}
var parts = input.split(/[°'"]+/).join(' ').split(/[^\w\S]+/);
var directions = [];
var coords = [];
var dd = 0;
var pow = 0;
for( i in parts ) {
// we end on a direction
if( isNaN( parts[i] ) ) {
var _float = parseFloat( parts[i] );
var direction = parts[i];
if( !isNaN(_float ) ) {
dd += ( _float / Math.pow( 60, pow++ ) );
direction = parts[i].replace( _float, '' );
}
direction = direction[0];
if( direction == 'S' || direction == 'W' )
dd *= -1;
directions[ directions.length ] = direction;
coords[ coords.length ] = dd;
dd = pow = 0;
} else {
dd += ( parseFloat(parts[i]) / Math.pow( 60, pow++ ) );
}
}
if( directions[0] == 'W' || directions[0] == 'E' ) {
var tmp = coords[0];
coords[0] = coords[1];
coords[1] = tmp;
}
return coords;
}
此函数不处理所有类型的lat / long类型,但它处理以下格式:
-31,2222,21.99999
-31 13 13 13.75S, -31 13 13 13.75W
-31 13 13 13.75S -31 13 13 13.75W
-31 13 13 13.75W -31 13.75S
36°57'9" N 110°4'21" W
110°4'21" W 36°57'9"N
这就是我需要的。
答案 6 :(得分:0)
我使用 \ d +(\,\ d +)和 \ d +(。\ d +)因为可以有浮点数
我的最终功能:
convertDMSToDD: function (dms) {
let parts = dms.split(/[^\d+(\,\d+)\d+(\.\d+)?\w]+/);
let degrees = parseFloat(parts[0]);
let minutes = parseFloat(parts[1]);
let seconds = parseFloat(parts[2].replace(',','.'));
let direction = parts[3];
console.log('degrees: '+degrees)
console.log('minutes: '+minutes)
console.log('seconds: '+seconds)
console.log('direction: '+direction)
let dd = degrees + minutes / 60 + seconds / (60 * 60);
if (direction == 'S' || direction == 'W') {
dd = dd * -1;
} // Don't do anything for N or E
return dd;
}