簡體   English   中英

將帶有多邊形坐標的字符串轉換為 lat / lng 格式

[英]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 解決這個問題的最優雅的方法是......

  1. 使用String.prototype.replaceAll()將您的字符串格式轉換為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

作為輸出它給了我:輸出

多邊形坐標的輸出:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM