[英]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)";
我想將該字符串轉換為具有 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
];
我怎樣才能做到這一點?
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 解決這個問題的最優雅的方法是......
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
作為輸出它給了我:輸出
多邊形坐標的輸出:
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'}
我希望它有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.