功能说明
该函数将WKT格式的空间数据转换为GeoJSON格式,支持直接转换或从对象属性中提取WKT字符串转换。
代码实现
/**
* 将wkt格式的空间数据转为geojson格式的空间数据
* @param item 数据对象或WKT字符串
* @param key 可选的空间数据字段名
*/
export const wktToGeojson = (item: any, key?: string) => {
if (!key) {
const geojson = WKT.parse(item); // 直接转换WKT字符串
return geojson;
} else if (!item[key]) {
return null; // 字段不存在时返回null
} else {
const geojson = WKT.parse(item[key]); // 从对象属性转换
return {
type: "Feature",
geometry: geojson,
properties: item
};
}
};
参数说明
item
: 接受两种输入类型
key
参数未提供时)key
参数使用)key
: 可选参数,指定对象中WKT字符串的属性名返回值
null
使用示例
// 示例1:直接转换WKT字符串
const pointWKT = 'POINT(30 10)';
const geojson1 = wktToGeojson(pointWKT);
// 示例2:从对象属性转换
const feature = {
id: 1,
geometry: 'LINESTRING(30 10, 40 40)'
};
const geojson2 = wktToGeojson(feature, 'geometry');
注意事项
terraformer-wkt-parser
)key
参数提供但字段不存在时,函数会静默返回null
2.
POINT字符串转数组函数/** POINT转数组 */
export const isPointOrArray = (pointString: any) => {
const coordinatesString = pointString.substring(6, pointString.length - 1)
// 使用空格分割成数组
const coordinatesArray = coordinatesString.split(" ")
// 将字符串转换为浮点数
const coordinatesNumericArray = coordinatesArray.map((coord: any) => parseFloat(coord))
return coordinatesNumericArray
}
该函数用于将POINT(x y)
格式的地理坐标字符串转换为数字数组格式[x, y]
。适用于WKT(Well-Known Text)格式的地理数据处理。
pointString
:输入参数,需为POINT(经度 纬度)
格式的字符串,例如POINT(116.404 39.915)
从字符串第6个字符(跳过POINT(
)开始截取,到倒数第1个字符(跳过)
)结束 用空格分割字符串得到两个坐标值的字符串数组 通过parseFloat
将字符串坐标转为数字类型
返回包含两个数字元素的数组,示例: 输入"POINT(116.404 39.915)"
,输出[116.404, 39.915]
函数未对输入参数格式做严格校验 若输入非标准WKT格式可能导致错误 建议在实际使用时添加参数验证逻辑
该函数将坐标数组转换为PostGIS的POINT格式字符串,适用于地理空间数据处理。
函数定义:
export const isArrayOrPoint = (coordinatesArray: any) => {
const x = coordinatesArray[0]
const y = coordinatesArray[1]
const pointString = `POINT(${x} ${y})`
return pointString
}
参数说明:
coordinatesArray
: 包含x和y坐标的数组,如[longitude, latitude]
返回值:
POINT(116.404 39.915)
注意事项: 函数未做输入验证,建议添加数组长度检查 对于非数组输入,函数会抛出异常 考虑扩展支持三维坐标POINT Z(x y z)
格式
以下是判断字符串是否为合法车牌号(包括传统车牌和新能源车牌)的 TypeScript 函数实现:
/**
* 车牌号验证(兼容新能源车牌)
* @param str 待验证字符串
* @returns 是否为合法车牌号
*/
export const isLicensePlate = (str: string) => {
const reg =
/^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4,5}[A-HJ-NP-Z0-9挂学警港澳]$/
return reg.test(str)
}
该正则表达式分为以下几个部分:
^[京津沪渝冀豫云辽黑黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]
匹配第一位汉字省份简称,包含所有省级行政区及"使领"字(使馆/领馆车牌)
[A-HJ-NP-Z]
第二位字母,排除I和O(避免与数字混淆)
[A-HJ-NP-Z0-9]{4,5}
中间4-5位字母数字组合(传统车牌5位,新能源车牌6位中的中间部分)
[A-HJ-NP-Z0-9挂学警港澳]$
最后一位字符,可以是数字、字母或特殊汉字(挂/学/警/港/澳)
^...$
确保从开头到结尾完整匹配
该正则匹配6位新能源车牌(如"京AD12345")和7位传统车牌(如"京A12345")
未包含2021年新推出的临时行驶车号牌格式(白底蓝字)
军车、警车等特殊车牌格式需要单独处理
实际应用中建议先执行trim()去除前后空格
/**
* 判断是否为 IPv4 地址
* @param ip 待验证的字符串
* @returns 是否为合法 IPv4 地址
*/
export const isIPv4 = (ip: string) => {
const reg =
/^((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])(?::(?:[0-9]|[1-9][0-9]{1,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$/;
return reg.test(ip);
};
该正则表达式具备以下验证特性:
/**
* 判断是否为 MAC 地址
* @param mac 待检测的字符串
* @returns 是否为有效的 MAC 地址格式
*/
export const isMAC = (mac: string) => {
const reg =
/^(([a-f0-9][0,2,4,6,8,a,c,e]:([a-f0-9]{2}:){4})|([a-f0-9][0,2,4,6,8,a,c,e]-([a-f0-9]{2}-){4}))[a-f0-9]{2}$/i;
return reg.test(mac);
};
正则表达式分为两部分,匹配两种常见 MAC 地址格式(冒号分隔或连字符分隔):
([a-f0-9][0,2,4,6,8,a,c,e]:([a-f0-9]{2}:){4})
01:23:45:67:89:ab
([a-f0-9][0,2,4,6,8,a,c,e]-([a-f0-9]{2}-){4})
01-23-45-67-89-ab
末尾 [a-f0-9]{2}$
确保最后两位是有效的十六进制字符,/i
标志忽略大小写。
console.log(isMAC("01:23:45:67:89:AB")); // true
console.log(isMAC("01-23-45-67-89-ab")); // true
console.log(isMAC("00:1A:2B:3C:4D:5E")); // true
console.log(isMAC("gh:ij:kl:mn:op:qr")); // false(含无效字符)
console.log(isMAC("01:23:45:67:89")); // false(长度不足)
/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
该正则表达式分为以下部分:
^[A-Za-z0-9\u4e00-\u9fa5]+
匹配开头的中英文、数字字符@
匹配邮箱分隔符[a-zA-Z0-9_-]+
匹配域名部分(不含后缀)(\.[a-zA-Z0-9_-]+)+
匹配一个或多个域名后缀/**
* 判断是否为 Email(支持中文邮箱)
* @param email 待验证的字符串
* @returns 是否为合法邮箱格式
*/
export const isEmail = (email: string) => {
const reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
return reg.test(email);
};
console.log(isEmail("测试@test.com")); // true
console.log(isEmail("[email protected]")); // true
console.log(isEmail("invalid.email@com")); // false
console.log(isEmail("no@domain")); // false
该正则表达式存在以下特点:
以下是判断中国第二代身份证(18位)的代码实现,采用 TypeScript 编写:
/**
* 校验字符串是否符合中国第二代身份证(18位)格式规则
* @param str 待校验的字符串
* @returns 是否符合身份证格式
*/
export const isChineseIdCard = (str: string) => {
const reg = /^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/;
return reg.test(str);
};
^[1-9]\d{5}
匹配6位行政区划代码,首位不为0
(?:18|19|20)\d{2}
匹配年份范围(1800-2099)
(?:0[1-9]|10|11|12)
匹配月份(01-12)
(?:0[1-9]|[1-2]\d|30|31)
匹配日期(01-31),已考虑不同月份的天数差异
\d{3}
匹配顺序码(3位数字)
[\dXx]$
末位可能是数字或X(校验码)
该正则表达式覆盖了中国大陆第二代身份证的编号规则,包括行政区划代码、出生日期、顺序码和校验码的格式验证。
/**
* 判断时间格式是否为 24 小时制(HH:mm:ss)
*/
export const is24H = (time: string) => {
const reg = /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/;
return reg.test(time);
};
该代码用于判断一个给定的路径是否为外部链接,即是否以 http:
、https:
、mailto:
或 tel:
开头。
export const isExternal = (path: string) => {
const reg = /^(https?:|mailto:|tel:)/
return reg.test(path)
}
export const isExternal
:定义并导出一个名为 isExternal
的常量函数,接收一个 path
参数。const reg = /^(https?:|mailto:|tel:)/
:定义一个正则表达式,匹配以 http:
、https:
、mailto:
或 tel:
开头的字符串。return reg.test(path)
:使用正则表达式测试 path
,返回布尔值结果。// 测试外部链接
isExternal('https://example.com') // true
isExternal('mailto:[email protected]') // true
isExternal('tel:+123456789') // true
// 测试非外部链接
isExternal('/about') // false
isExternal('../contact') // false
target="_blank"
或处理跳转逻辑。以下是符合要求的代码块格式和说明:
/**
* 判断字符串是否为合法网址(支持带协议的URL)
* @param url 待检测的字符串
* @returns 是否为合法网址
*/
export const isUrl = (url: string) => {
const reg = /^(((ht|f)tps?):\/\/)?([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+[a-z]{2,6}\/?/;
return reg.test(url);
}
^(((ht|f)tps?):\/\/)?
匹配可选的http/https/ftp/ftps协议头
([^!@#$%^&*?.\s-]([^!@#$%^&*?.\s]{0,63}[^!@#$%^&*?.\s])?\.)+
匹配域名主体(限制特殊字符和长度)
[a-z]{2,6}\/?$
匹配顶级域名和可选尾部斜杠
isUrl("https://example.com") // true
isUrl("ftp://sub.domain.org/path") // true
isUrl("invalid.url") // false
该实现考虑了常见URL格式,但实际应用中可能需要根据具体需求调整正则表达式。
/** 判断是否为网址或 IP(带端口) */
export const isUrlPort = (url: string) => {
const reg = /^((ht|f)tps?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+:\\d{1,5}\\\/?$/
return reg.test(url)
}
该正则表达式用于验证字符串是否为合法的网址或 IP 地址且包含端口号,具体匹配规则如下:
/^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\\/?$/
^((ht|f)tps?:\/\/)?
http://
、https://
、ftp://
或 ftps://
),s?
表示 s
可选。[\w-]+
\w
等价于 [A-Za-z0-9_]
,-
允许连字符。(\.[\w-]+)+
.com
、.org
),至少出现一次。:\d{1,5}
\d
为数字,限制 1-5 位(合法端口范围 0-65535,此处简化校验)。\/?$
$
表示字符串结束。isUrlPort("example.com:8080"); // true
isUrlPort("192.168.1.1:80"); // true
isUrlPort("https://api.site:443"); // true
isUrlPort("localhost:3000"); // false(需调整正则以支持无点分的域名)
127.0.0.1:8080
),需调整正则中的 (\.[\w-]+)+
部分。/**
* 判断字符串是否为域名格式(不带协议)
* @param domain 待检测的字符串
* @returns 符合域名格式返回true,否则返回false
*/
export const isDomain = (domain: string) => {
const reg = /^([0-9a-zA-Z-]{1,}\.)+([a-zA-Z]{2,})$/
return reg.test(domain)
}
^([0-9a-zA-Z-]{1,}\.)+([a-zA-Z]{2,})$
^
匹配字符串开头([0-9a-zA-Z-]{1,}\.)+
匹配由字母、数字或横线组成的子域名(长度≥1),后跟一个点,可重复多次([a-zA-Z]{2,})
匹配顶级域名(纯字母且长度≥2)$
匹配字符串结尾// 合法域名
isDomain("example.com") // true
isDomain("sub.example.com") // true
isDomain("a.cn") // true
// 非法域名
isDomain("example.") // false(缺少顶级域名)
isDomain(".com") // false(缺少子域名)
isDomain("example..com") // false(连续点号)
isDomain("example_com") // false(包含下划线)