как отделить массив и поместить его в скобки

#javascript #arrays #geojson #babylonjs

#javascript #массивы #geojson #babylonjs

Вопрос:

У меня есть массив (файл Geojson), и я хочу разделить его на три массива. есть несколько многополигональных координат, и я хочу поместить координаты последовательно для каждого идентификатора, я хочу получить:

  arrGeo = 
  [ 
    [-4.66478, 58.42441, 5127.4,-4.65982, 58.42082, 5074.7],
    [-3.94815, 57.71632, 5000,-3.94812, 57.71576, 4374.1,-3.94216, 57.71541, 4283,-3.93717, 
     57.71583, 5001],
    [-3.93224, 57.71476, 4048,-3.93261, 57.71456, 3800.4] 
  ]
  

Я пытаюсь сделать это с помощью цикла for, но я не смог их разделить, я имею в виду, что для каждого идентификатора мне нужно создать отдельный массив координат. в чем проблема моего кода? и что я должен сделать, чтобы решить эту проблему?

это мой код:

 positions =
       
     [
         {

            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-4.66478, 58.42441, 5127.4],
                                [-4.65982, 58.42082, 5074.7],

                            ]
                        ]
                    },
                ]
            },
            "id": "kml_1"
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.94815, 57.71632, 5000],
                                [-3.94812, 57.71576, 4374.1],

                            ]
                        ]
                    },
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.94216, 57.71541, 4283],
                                [-3.93717, 57.71583, 5001],

                            ]
                        ]
                    },

                ]
            },
            "id": "kml_2"
        },

        {
            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.93224, 57.71476, 4048],
                                [-3.93261, 57.71456, 3800.4],

                            ]
                        ]
                    },
                ]
            },
            "id": "kml_3"
        },
    ];

    var customMesh = new BABYLON.Mesh("custom", scene);
    var customMesh2 = new BABYLON.Mesh("custom", scene);
    let arrGeo = [];
    let indices = [];



    for (let i = 0; i < positions.length; i  ) {
        let fGeometry = positions[i].geometry.geometries;

        console.log("i", fGeometry);

        for (let j = 0; j < fGeometry.length; j  ) {
            console.log("j", j);
            // console.log("p", fGeometry[1]);
            for (let k = 0; k < 1; k  ) {
                for (let m = 0; m < 3; m  ) {
                    for (let n = 0; n < 3; n  ) {
                        let fGCoordinate = fGeometry[j].coordinates[k][m][n];
                        console.log("p", fGCoordinate);

                        arrGeo.push(fGCoordinate);
                    }
                }
            }
        }

    }
  

Ответ №1:

Пожалуйста, найдите ниже код и демонстрационную ссылку

 let final = [];
for (var i = 0, len = positions.length; i < len; i  ) {
  let a = [];
  for (var j = 0, jlen = positions[i]["geometry"]["geometries"].length; j < jlen; j  ) {
    
    for (var k = 0, klen = positions[i]["geometry"]["geometries"][j]["coordinates"].length; k < klen; k  ) {
    
      for (l = 0, llen = positions[i]["geometry"]["geometries"][j]["coordinates"][k].length; l < llen; l  ) {
        a = a.concat(positions[i]["geometry"]["geometries"][j]["coordinates"][k][l]);
      }
    }
  }
  final.push(a);
}
console.log(final);
  

https://jsbin.com/hehurajoje/edit?js ,консоль

Комментарии:

1. Большое вам спасибо, это здорово.

Ответ №2:

Вы можете сделать это с помощью forEach для повышения производительности.

 let positions = [
        {
            type: "Feature",
            geometry: {
                type: "GeometryCollection",
                geometries: [
                    {
                        type: "Polygon",
                        coordinates: [
                            [
                                [-4.66478, 58.42441, 5127.4],
                                [-4.65982, 58.42082, 5074.7],
                            ],
                        ],
                    },
                ],
            },
            id: "kml_1",
        },
        {
            type: "Feature",
            geometry: {
                type: "GeometryCollection",
                geometries: [
                    {
                        type: "Polygon",
                        coordinates: [
                            [
                                [-3.94815, 57.71632, 5000],
                                [-3.94812, 57.71576, 4374.1],
                            ],
                        ],
                    },
                    {
                        type: "Polygon",
                        coordinates: [
                            [
                                [-3.94216, 57.71541, 4283],
                                [-3.93717, 57.71583, 5001],
                            ],
                        ],
                    },
                ],
            },
            id: "kml_2",
        },

        {
            type: "Feature",
            geometry: {
                type: "GeometryCollection",
                geometries: [
                    {
                        type: "Polygon",
                        coordinates: [
                            [
                                [-3.93224, 57.71476, 4048],
                                [-3.93261, 57.71456, 3800.4],
                            ],
                        ],
                    },
                ],
            },
            id: "kml_3",
        },
    ];


    let newPolygons = []


    const flatPositions = (arr)=>{
        arr.forEach((pos)=>{
          let p = []
            pos?.geometry?.geometries.forEach((geometry)=>{
              geometry?.coordinates.forEach(coord=>{
                coord.forEach(coo=>{
                  p = p.concat(coo)
                })
            })
            })
          newPolygons.push(p)
        })

    }
    flatPositions(positions)

    console.log(newPolygons)  

Комментарии:

1. Большое вам спасибо, это здорово 🙏🙏

Ответ №3:

просто используйте Array.prototype.reduce()
и Array.prototype.flat()
и Назначение деструктурирования

 const arrGeo = positions.reduce((a,{geometry})=>
  {
  let item = []
  for (let geo of geometry.geometries)
    {
    let p = geo.coordinates.reduce((t,c)=>
      {
      t.push(...c.flat())
      return t
      },[])
      item.push(...p)
    }
  a.push(item)
  return a
  },[])
  

полный код:

 const positions = 
      [ { type: 'Feature'
        , geometry: 
          { type: 'GeometryCollection'
          , geometries: 
            [ { type: 'Polygon'
              , coordinates: 
                [ [ [ -4.66478, 58.42441, 5127.4] 
                  , [ -4.65982, 58.42082, 5074.7] 
          ] ] } ] } 
        , id: 'kml_1'
        } 
      , { type: 'Feature'
        , geometry: 
          { type: 'GeometryCollection'
          , geometries: 
            [ { type: 'Polygon'
              , coordinates: 
                [ [ [ -3.94815, 57.71632, 5000   ] 
                  , [ -3.94812, 57.71576, 4374.1 ] 
              ] ] } 
            , { type: 'Polygon'
              , coordinates: 
                [ [ [ -3.94216, 57.71541, 4283] 
                  , [ -3.93717, 57.71583, 5001] 
          ] ] } ] } 
        , id: 'kml_2'
        } 
      , { type: 'Feature'
        , geometry: 
          { type: 'GeometryCollection'
          , geometries: 
            [ { type: 'Polygon'
              , coordinates: 
                [ [ [ -3.93224, 57.71476, 4048] 
                  , [ -3.93261, 57.71456, 3800.4] 
          ] ] } ] } 
        , id: 'kml_3'
      } ] 

const arrGeo = positions.reduce((a,{geometry})=>
  {
  let item = []
  for( let geo of geometry.geometries )
    {
    let p = geo.coordinates.reduce((t,c)=>
      {
      t.push(...c.flat())
      return t
      },[])
      item.push(...p)
    }
  a.push(item)
  return a
  },[])

arrGeo.forEach(el=> console.log(JSON.stringify(el)))  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Комментарии:

1. Большое спасибо, это здорово. 🙏🙏

2. @ArashBagheri Жаль, что вы не подтвердили мой ответ

Ответ №4:

Я не уверен, но если я правильно понял, это должно быть желаемым результатом. Надеюсь, я был полезен.

 positions =

    [
        {

            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-4.66478, 58.42441, 5127.4],
                                [-4.65982, 58.42082, 5074.7],

                            ]
                        ]
                    },
                ]
            },
            "id": "kml_1"
        },
        {
            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.94815, 57.71632, 5000],
                                [-3.94812, 57.71576, 4374.1],

                            ]
                        ]
                    },
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.94216, 57.71541, 4283],
                                [-3.93717, 57.71583, 5001],

                            ]
                        ]
                    },

                ]
            },
            "id": "kml_2"
        },

        {
            "type": "Feature",
            "geometry": {
                "type": "GeometryCollection",
                "geometries": [
                    {
                        "type": "Polygon",
                        "coordinates": [
                            [
                                [-3.93224, 57.71476, 4048],
                                [-3.93261, 57.71456, 3800.4],

                            ]
                        ]
                    },
                ]
            },
            "id": "kml_3"
        },
    ];

var arrGeo = [];
var res = [];

for (var i = 0; i < positions.length; i  ) {
    var x = positions[i].geometry.geometries;
    var f = [];
    for (var ii = 0; ii < x.length; ii  ) {
        var z = x[ii].coordinates[0];
        var t = z.flat();
        f.push(t)
    }
    res.push(f);
    for (let ii = 0; ii < res.length; ii  ) {
        res[ii].flat();
    }
}

for (var i = 0; i < res.length; i  ) {
    arrGeo.push(res[i].flat());
}

console.log(arrGeo);