一、什么是经纬度
经度和纬度是描述地球表面位置的坐标系,是地球表面的横纵坐标,用于确定某个具体的地理位置。
经度是以本初子午线为基础,东西两边各180度。东经0度是本初子午线,向东经度递增,向西逆序递减,例如,东经120度,表示该地位于本初子午线以东120度的地方。
纬度是以赤道为基础,南北两边各90度。赤道是0度,向北纬度递增,向南逆序递减,例如,北纬30度,表示该地位于赤道以北30度的地方。
二、经纬度的格式
经纬度的格式有多种,最常用的格式有以下几种:
- 度、分、秒(符号+数字)
- 度十进制(符号+数字)
- 地球坐标系(符号+数字)
三、经纬度的正则表达式
利用正则表达式可以判断输入是否符合经纬度格式。以下是常用的经纬度正则表达式:
1、度、分、秒(符号+数字):
/^[+-]?((0?[1-9]|[1-8]\d|90)°([1-5]?\d′([1-5]?\d″)?)?|(0?[1-9]|[1-8]\d|90)°(0?\d′(0?\d″)?)) [+-]?((0?[1-9]|[1-9]\d|1[0-7]\d|180)°([1-5]?\d′([1-5]?\d″)?)?|(0?[1-9]|[1-9]\d|1[0-7]\d|180)°(0?\d′(0?\d″)?))$/
2、度十进制(符号+数字):
/^[+-]?(0?\d{1,2}(\.\d+)?|1[0-7]?\d{1}(\.\d+)?|180(\.0+)?)[°] [+-]?(0?\d{1,2}(\.\d+)?|[1-8]?\d{1}(\.\d+)?|90(\.0+)?)°$/
3、地球坐标系(符号+数字)
/^[+-]?(0?\d{1,2}(\.\d+)?|1[0-7]?\d{1}(\.\d+)?|180(\.0+)?),[+-]?(0?\d{1,2}(\.\d+)?|[1-8]?\d{1}(\.\d+)?|90(\.0+)?)$/
四、经纬度正则表达式解析
1、度、分、秒(符号+数字)
该正则表达式与度、分、秒(符号+数字)格式的经纬度相匹配,如“37°22′40.5″N122°05′06.5″E”。
解析:
- ^[+-]?:以可选的符号开头,即字符串可以是正数、负数或不带符号。
- ((0?[1-9]|[1-8]\d|90)°:1到2位数,且不能以0开头,或者以1~8开头的两位数,或者是90。
- ([1-5]?\d′([1-5]?\d″)?)?:0到2个数字表示分钟,单引号是分隔符,如果有分钟,之后可能有0到2个数字表示秒,秒用双引号分隔。
- |:或
- (0?[1-9]|[1-8]\d|90)°(0?\d′(0?\d″)?):即45°00′
- [+-]?((0?[1-9]|[1-9]\d|1[0-7]\d|180)°([1-5]?\d′([1-5]?\d″)?)?|(0?[1-9]|[1-9]\d|1[0-7]\d|180)°(0?\d′(0?\d″)?))$:以可选符号结尾,即字符串可以是正数、负数或不带符号。
2、度十进制(符号+数字)
该正则表达式与度十进制(符号 + 数字)格式的经纬度相匹配,如“37.3775°N122.057°E”。
解析:
- ^[+-]?:以可选符号开头,即字符串可以是正数、负数或不带符号。
- (0?\d{1,2}(\.\d+)?):1到3位数,可以是以0开头的1到2位数或以1到9开头的两位数或三位数,中间可以是一个小数点以及1位或多位的数字。
- |:或
- (1[0-7]?\d{1}(\.\d+)?):以1开头,后面可以是一位或两位数字,最大值不能超过179,中间可以是一个小数点以及1位或多位的数字。
- |:或
- (180(\.0+)?))°:以180结尾,中间可以是一个小数点加0或多个0。
- [ ]:一个空格
- [+-]?(0?\d{1,2}(\.\d+)?|[1-8]?\d{1}(\.\d+)?|90(\.0+)?)°$:以可选符号结尾,即字符串可以是正数、负数或不带符号。
3、地球坐标系(符号+数字)
该正则表达式与地球坐标系(符号+数字)格式的经纬度相匹配,如“37.3775,122.057”。
解析:
- ^[+-]?:以可选符号开头,即字符串可以是正数、负数或不带符号。
- (0?\d{1,2}(\.\d+)?):与度十进制的解析类似。
- |:或
- (1[0-7]?\d{1}(\.\d+)?):与度十进制的解析类似。
- |:或
- (180(\.0+)?))°:与度十进制的解析类似。
- ,:逗号
- [+-]?(0?\d{1,2}(\.\d+)?|[1-8]?\d{1}(\.\d+)?|90(\.0+)?)$:以可选符号结尾,即字符串可以是正数、负数或不带符号。
五、使用示例
以下是使用JavaScript实现检验经纬度是否符合格式的示例代码:
function isLatitude(input) {
// 精确到小数点后6位
const regex = /^[+-]?(0?\d{1,2}(\.\d{1,6})?|1[0-7]?\d{1}(\.\d{1,6})?|180(\.0{1,6})?)°$/;
return regex.test(input);
}
function isLongitude(input) {
// 精确到小数点后6位
const regex = /^[+-]?((0?\d|[1-9]\d|1[0-7]\d)(\.\d{1,6})?|180(\.0{1,6})?)°$/;
return regex.test(input);
}
// 使用示例
console.log(isLatitude("37.3775°N")); // true
console.log(isLatitude("-90°")); // true
console.log(isLatitude("91.12345678°E")); // false
console.log(isLongitude("122°E")); // false
console.log(isLongitude("122.057°E")); // true