将具有多边形坐标的字符串转换为纬度/经度格式
Converting string with polygon coordinates to lat / lng format
我有一个包含多边形坐标列表的字符串,格式如下:
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
我想将该字符串转换为具有纬度/经度坐标的数组,如下所示:
const polygonCoords = [
{ lat: 38.35870116756209, lng: 38.27089903372614 },
{ lat: 38.3339292947434, lng: 38.2743322612652 },
{ lat: 38.33944984782068, lng: 38.3017980815777 },
{ lat: 38.35829734627614, lng: 38.297678208530826 },
{ lat: 38.35870116756209, lng: 38.27089903372614 } // first coordinate again
];
我该怎么做?
myString.split('),').map(x => x.replace(/[\n/(\)\+]/g,'')).map(x => {
let [lat, lng] = x.split(', ');
return {lat, lng}
})
你可以这样做
const string = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
const coordinates = string.substring(1, string.length - 1).split('),(').map(s => {
const [lat, lng] = s.split(', ').map(Number)
return {lat, lng}
})
console.log(coordinates)
您可以使用基本的 JavaScript 数组方法,如下所示:
var myString = "(38.35870116756209, 38.27089903372614), \
(38.3339292947434, 38.2743322612652), \
(38.33944984782068, 38.3017980815777), \
(38.35829734627614, 38.297678208530826)"
const strArray = myString.split(', ') // Note the whitespace after the comma
let left = [];
let right = [];
strArray.forEach(str => {
if(str[0] === '(') {
left.push(str.substr(1, str.length -1))
}
if (str[str.length - 1] === ')') {
right.push(str.substr(0, str.length -2))
}
})
let polygonCoords = [];
if(left.length === right.length) {
for(let i = 0, n = left.length; i < n; i++) {
polygonCoords.push({
lat: left[i],
lng: right[i]
})
}
}
console.log(polygonCoords)
除了提供的其他答案外,我想添加一个使用命名匹配组的答案:
const str = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
const result = str.match(/\(.*?\)/g)
.map(res => res.match(/((?<lat>[\d.]*), (?<lon>[\d.]*)\))/).groups)
console.log(result)
IMO 解决这个问题的最优雅的方法是...
- 使用String.prototype.replaceAll() to convert your string format into a JSON兼容的二维数组字符串
- 使用 JSON.parse() 将数组字符串转换为实际数组
- 使用 Array.prototype.map() 将数组转换为所需格式
- 使用Array.prototype.push()复制对第一个坐标的引用并追加
工作演示
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
// 1. Convert string format to 2-dimensional array
myString = '[' + myString.replaceAll('(', '[').replaceAll(')', ']') + ']';
// 2. Parse array
const myArray = JSON.parse(myString);
// 3. Convert array format to polygonCoords
const polygonCoords = myArray.map(v => ({lat: v[0], lng: v[1]}));
// 4. Duplicate reference to first coordinate and append
polygonCoords.push(polygonCoords[0]);
console.log("OUTPUT :");
console.log(polygonCoords);
console.log("NUMBER OF COORDINATES :");
console.log(polygonCoords.length);
或者,如果您更喜欢最少的代码而不是可读性,您可以组合前 3 个语句,如下所示:
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
// Convert string to polygonCoords
const polygonCoords = JSON.parse('[' + myString.replaceAll('(', '[').replaceAll(')', ']') + ']')
.map(v => ({lat: v[0], lng: v[1]}));
// Duplicate reference to first coordinate and append
polygonCoords.push(polygonCoords[0]);
console.log("OUTPUT :");
console.log(polygonCoords);
console.log("NUMBER OF COORDINATES :");
console.log(polygonCoords.length);
备注
polygonCoords.push(polygonCoords[0])
实际上并不复制第一个坐标对象本身。相反,它复制对同一对象的引用。因此,如果更改坐标 polygonCoords[0]
的值,也会更改坐标 polygonCoords[length-1]
的值,反之亦然。考虑到这些在多边形中应该始终相同,我赞成这种方法。
如果您仍然想复制对象本身而不是对象的引用,则需要先克隆它。为此,请使用 polygonCoords.push(Object.assign({}, polygonCoords[0]));
而不是 polygonCoords.push(polygonCoords[0])
。
尝试使用正则表达式,它是一个强大的工具!
为了简化任务,我从 polygonCoords 中删除了 const 访问修饰符
但您以后可以随时在代码中更改它。
这是我的解决方案:
包含数据的字符串:
var coords="(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
开始转换
coords=coords.match(/[^(),]+/g) //making a list of separate elements and removing commas and brackets
var polygonCoords=[]
for(var i=0;i<coords.length;i+=2){
polygonCoords.push( {lat:coords[i], lng:coords[i+1]} )
}
//creating objects with our data and putting them in polygonCoords
作为输出,它给我:
output
多边形坐标的输出:
0: {lat: '38.35870116756209', lng: ' 38.27089903372614'}
1: {lat: '38.3339292947434', lng: ' 38.2743322612652'}
2: {lat: '38.33944984782068', lng: ' 38.3017980815777'}
3: {lat: '38.35829734627614', lng: ' 38.297678208530826'}
希望对你有帮助
我有一个包含多边形坐标列表的字符串,格式如下:
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
我想将该字符串转换为具有纬度/经度坐标的数组,如下所示:
const polygonCoords = [
{ lat: 38.35870116756209, lng: 38.27089903372614 },
{ lat: 38.3339292947434, lng: 38.2743322612652 },
{ lat: 38.33944984782068, lng: 38.3017980815777 },
{ lat: 38.35829734627614, lng: 38.297678208530826 },
{ lat: 38.35870116756209, lng: 38.27089903372614 } // first coordinate again
];
我该怎么做?
myString.split('),').map(x => x.replace(/[\n/(\)\+]/g,'')).map(x => {
let [lat, lng] = x.split(', ');
return {lat, lng}
})
你可以这样做
const string = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
const coordinates = string.substring(1, string.length - 1).split('),(').map(s => {
const [lat, lng] = s.split(', ').map(Number)
return {lat, lng}
})
console.log(coordinates)
您可以使用基本的 JavaScript 数组方法,如下所示:
var myString = "(38.35870116756209, 38.27089903372614), \
(38.3339292947434, 38.2743322612652), \
(38.33944984782068, 38.3017980815777), \
(38.35829734627614, 38.297678208530826)"
const strArray = myString.split(', ') // Note the whitespace after the comma
let left = [];
let right = [];
strArray.forEach(str => {
if(str[0] === '(') {
left.push(str.substr(1, str.length -1))
}
if (str[str.length - 1] === ')') {
right.push(str.substr(0, str.length -2))
}
})
let polygonCoords = [];
if(left.length === right.length) {
for(let i = 0, n = left.length; i < n; i++) {
polygonCoords.push({
lat: left[i],
lng: right[i]
})
}
}
console.log(polygonCoords)
除了提供的其他答案外,我想添加一个使用命名匹配组的答案:
const str = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
const result = str.match(/\(.*?\)/g)
.map(res => res.match(/((?<lat>[\d.]*), (?<lon>[\d.]*)\))/).groups)
console.log(result)
IMO 解决这个问题的最优雅的方法是...
- 使用String.prototype.replaceAll() to convert your string format into a JSON兼容的二维数组字符串
- 使用 JSON.parse() 将数组字符串转换为实际数组
- 使用 Array.prototype.map() 将数组转换为所需格式
- 使用Array.prototype.push()复制对第一个坐标的引用并追加
工作演示
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
// 1. Convert string format to 2-dimensional array
myString = '[' + myString.replaceAll('(', '[').replaceAll(')', ']') + ']';
// 2. Parse array
const myArray = JSON.parse(myString);
// 3. Convert array format to polygonCoords
const polygonCoords = myArray.map(v => ({lat: v[0], lng: v[1]}));
// 4. Duplicate reference to first coordinate and append
polygonCoords.push(polygonCoords[0]);
console.log("OUTPUT :");
console.log(polygonCoords);
console.log("NUMBER OF COORDINATES :");
console.log(polygonCoords.length);
或者,如果您更喜欢最少的代码而不是可读性,您可以组合前 3 个语句,如下所示:
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
// Convert string to polygonCoords
const polygonCoords = JSON.parse('[' + myString.replaceAll('(', '[').replaceAll(')', ']') + ']')
.map(v => ({lat: v[0], lng: v[1]}));
// Duplicate reference to first coordinate and append
polygonCoords.push(polygonCoords[0]);
console.log("OUTPUT :");
console.log(polygonCoords);
console.log("NUMBER OF COORDINATES :");
console.log(polygonCoords.length);
备注
polygonCoords.push(polygonCoords[0])
实际上并不复制第一个坐标对象本身。相反,它复制对同一对象的引用。因此,如果更改坐标 polygonCoords[0]
的值,也会更改坐标 polygonCoords[length-1]
的值,反之亦然。考虑到这些在多边形中应该始终相同,我赞成这种方法。
如果您仍然想复制对象本身而不是对象的引用,则需要先克隆它。为此,请使用 polygonCoords.push(Object.assign({}, polygonCoords[0]));
而不是 polygonCoords.push(polygonCoords[0])
。
尝试使用正则表达式,它是一个强大的工具!
为了简化任务,我从 polygonCoords 中删除了 const 访问修饰符 但您以后可以随时在代码中更改它。 这是我的解决方案:
包含数据的字符串:
var coords="(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)"
开始转换
coords=coords.match(/[^(),]+/g) //making a list of separate elements and removing commas and brackets
var polygonCoords=[]
for(var i=0;i<coords.length;i+=2){
polygonCoords.push( {lat:coords[i], lng:coords[i+1]} )
}
//creating objects with our data and putting them in polygonCoords
作为输出,它给我: output
多边形坐标的输出:
0: {lat: '38.35870116756209', lng: ' 38.27089903372614'}
1: {lat: '38.3339292947434', lng: ' 38.2743322612652'}
2: {lat: '38.33944984782068', lng: ' 38.3017980815777'}
3: {lat: '38.35829734627614', lng: ' 38.297678208530826'}
希望对你有帮助