我有一個字串,其中包含以下格式的多邊形坐標串列:
var myString = "(38.35870116756209, 38.27089903372614),(38.3339292947434, 38.2743322612652),(38.33944984782068, 38.3017980815777),(38.35829734627614, 38.297678208530826)";
我想將該字串轉換為具有 lat / lng 坐標的陣列,如下所示:
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
];
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
myString.split('),').map(x => x.replace(/[\n/(\)\ ]/g,'')).map(x => {
let [lat, lng] = x.split(', ');
return {lat, lng}
})
uj5u.com熱心網友回復:
IMO 解決這個問題的最優雅的方法是......
- 使用String.prototype.replaceAll()將您的字串格式轉換為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]).
uj5u.com熱心網友回復:
你可以做這樣的事情
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)
uj5u.com熱心網友回復:
你可以使用基本的 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)
uj5u.com熱心網友回復:
除了提供的其他答案之外,我還想添加一個使用命名匹配組的答案:
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)
uj5u.com熱心網友回復:
嘗試使用正則運算式,它是一個強大的工具!
為了簡化任務,我從 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
作為輸出它給了我: 輸出
多邊形坐標的輸出:
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'}
我希望它有幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483024.html
標籤:javascript 数组 细绳 坐标 数据转换
