Así que escribí una función simple para tratar con mi cadena declarada en variable poli, como puede ver, usé un método split () y ahora quiero convertir cada uno de esos valores de cadena en valores numéricos:
function toArray(polygon) { final = polygon.replace('POLYGON ', '').replace('((', '').replace('))', '').split(','); const arrOfNum = []; final.forEach(str => { arrOfNum.push(Number(str)); }); return arrOfNum } poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))'; console.log(toArray(poly))
Estoy tratando de convertir cadenas en valores numéricos, pero obtengo este resultado:
[NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]
Más adelante quiero llegar a este punto exacto:
[[20.7218472,52.2294069], [20.9436337,52.0756329], [21.0651699,52.2134223], [20.7767788,52.2537934], [20.7218472,52.2294069]]
El objetivo principal de esas operaciones es que quiero usar estos datos para averiguar si un punto está dentro de un polígono. Para hacer esto estoy usando esta función:
function ray_casting(point, polygon){ var n=polygon.length, is_in=false, x=point[0], y=point[1], x1,x2,y1,y2; for(var i=0; i < n-1; ++i){ x1=polygon[i][0]; x2=polygon[i+1][0]; y1=polygon[i][1]; y2=polygon[i+1][1]; if(y < y1 != y < y2 && x < (x2-x1) * (y-y1) / (y2-y1) + x1){ is_in=!is_in; } } return is_in; }
¡Gracias a todos por la ayuda!
Esta solución es equivalente a una de las de @mplungjan. Otro enfoque sería usar una new Function
o simplemente una Function
como en la segunda demostración.
const poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))'; const nums = poly.replace(/POLYGON \(\(|\)\)/g, '') .split(/, /).map(num => num.split(/ /).map(n => +n)); console.log( nums );
USANDO new Function()
const poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))', jstr = poly .replace(/POLYGON \(\(/, '[[') .replace(/\)\)/, ']]') .replace(/, /g, '],[') .replace(/ /g, ','), output = new Function(`return ${jstr}`)(); console.log( output );
Te perdiste algunos espacios y necesitas manejar los pares
expresión regular
function toArray(polygon) { const final = polygon.match(/(\d+\.\d+ \d+\.\d+)/g) return final.flatMap(str => ([str.split(" ").map(str => +str)])); } poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))'; console.log(toArray(poly))
Tu versión extendida
function toArray(polygon) { const final = polygon .replace('POLYGON ((', '') .replace('))', '') .split(", "); return final.flatMap(str => ([str.split(" ").map(str => +str)])); } poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))'; console.log(toArray(poly))
Simplemente puede lograrlo simplemente dividiendo el elemento de la matriz y luego encasillándolo en un Número.
demostración :
function toArray(polygon) { final = polygon.replace('POLYGON ', '').replace('((', '').replace('))', '').split(','); const arrOfNum = []; final.forEach(str => { const arr = []; str.trim().split(' ').forEach(str => arr.push(Number(str))) arrOfNum.push(arr); }); return arrOfNum } poly = 'POLYGON ((21.0446582 52.2367037, 21.0544858 52.2264265, 21.0702358 52.2307111, 21.0755573 52.2333133, 21.0771022 52.2349428, 21.0759006 52.2375447, 21.0716091 52.2421962, 21.0532413 52.238412, 21.0472331 52.2371242, 21.0446582 52.2367037))'; console.log(toArray(poly))