将纬度和经度转换为十进制值

我有以下forms提供的GPS信息:

36°57'9“N 110°4'21”W

我可以使用Chris Veness的javascript函数将度,分和秒转换为数字度数,但首先需要将GPS信息parsing为各个纬度和经度string(带有NSEW后缀)。 我已经阅读了相关的post在stackoverflow,但我不是一个正则expression式专家(也不是一个程序员),需要一些parsing函数的帮助。 将这个stringparsing为经度和纬度的最佳方法是在转换函数中使用?

所有这一切的结果将是一个网页链接,可以点击查看谷歌地图表示的位置。

要parsing您的input使用以下内容。

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

所以你的input将产生以下内容:

 36°57'9" N = 36.9525000 110°4'21" W = -110.0725000 

十进制坐标可以通过GLatLng(lat, lng) ( Google Maps API )获取点数GLatLng(lat, lng)

更正了上述function并使输出成为对象。

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

我的调整版本强制string部分为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; } 

我在这个函数上得到了一些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; } 

乔,你提到的脚本已经做了你想要的。 有了它,你可以转换经纬度,并把它放进链接,以查看谷歌地图中的位置:

 var url = "http://maps.google.com/maps?f=q&source=s_q&q=&vps=3&jsv=166d&sll=" + lat.parseDeg() + "," + longt.parseDeg() 

这是我的承担:

 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; 

}

这个函数不处理所有types的lat / longtypes,但它处理以下格式:

 -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 

这是我需要的。

我用\ d +(\,\ d +)\ d +(。\ d +),因为可以有浮点数

我最后的function:

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