将纬度和经度转换为十进制值
我有以下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; }