将具有多边形坐标的字符串转换为纬度/经度格式

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 解决这个问题的最优雅的方法是...

  1. 使用String.prototype.replaceAll() to convert your string format into a JSON兼容的二维数组字符串
  2. 使用 JSON.parse() 将数组字符串转换为实际数组
  3. 使用 Array.prototype.map() 将数组转换为所需格式
  4. 使用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'}

希望对你有帮助