2016-07-14 1 views
1

У меня есть массив контуров и точек. Для контура, вызывая outline.geometry.coordinates производит многомерный массив координат:Частично сплющенный многомерный массив

[[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724], ...]] 

Для точки, вызывая point.geometry.coordinates производит одномерный массив координат:

[-72.78630766033722,41.767349642115724] 

Обе точки и контуры удерживается в массив. Я хотел бы, чтобы в конечном счете, в конечном итоге с массивом всех координатных пар, таких как:

[[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724],[-72.78630766033722,41.767349642115724], ...]] 

Что я Пробовал

Во-первых, я пытался получить все координаты, где geometries мой массив очертаний и точек:

var coordinates = geometries.map(function(outline) {return outline.geometry.coordinates}); 

Не удивительно, что это создает следующий массив:

[[[[-72.68639118392117,41.66733032827929],[-72.68630366033922,41.667449647115724], ...]], [-72.78630766033722,41.767349642115724]] 

Сглаживание этого массива приведет к падению пар пар координат, поэтому я не совсем уверен, как это сделать. Есть идеи?

+1

'arr.reduce ((а, Ь) => a.concat (б))' сглаживает 1 уровень, который фиксирует последний пример – dandavis

+0

возможность определить контуры против точек, например, с помощью 'Are вы instanceof'? «Геометрия» содержит только «контур» или смешивается? – arcyqwerty

+0

@ dandavis Я получаю 'a.conct не функцию '? –

ответ

1

Как насчет этого?

var geometries = [ 
    // point 
    { 
     geometry: { 
      coordinates: [1, 2], 
     }, 
    }, 

    // outline 
    { 
     geometry: { 
      coordinates: [ 
       [ 
        [3, 4], 
        [5, 6], 
       ], 
      ], 
     }, 
    }, 
]; 

var coordinates = geometries.map(function(outline) { 
    var coords = outline.geometry.coordinates; 
    if (typeof coords[0] === 'number') { 
    return [coords]; 
    } else { 
    return coords[0]; 
    } 
}).reduce(function (prev, next) { 
    return prev.concat(next); 
}, []); 

console.log(coordinates); 

// Output: 
// [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ] 
+0

Мне пришлось делать 'return [[coords]];' но это работает! –

+0

@tibsar См. Мое редактирование, если вы этого еще не сделали. :-) – smarx

+0

Это похоже на массив формата: '[[[1, 2], [3, 4], [5, 6] ...], [[1, 2], [3 , 4], [5, 6] ...], [1, 2]] ' –

1

Один из подходов - стандартизация выходов координат. Если outline s дает вам массив парных координат, вы можете иметь point s сделать то же самое, обернув его как один массив элементов.

Outline

[[a, b], [c, d], [e, f], ...] 

Точка

[[a, b]] 

таким образом, что, когда вы объединяете их они все же формы/мерности. В этот момент вы можете сгладить один раз, используя технику @dandavis.


Если вы можете использовать instanceof, чтобы определить, является ли объект является скелетом или точки, вы можете использовать следующее.

var coordinates = geometries.map(function(outline_or_point) { 
    return outline_or_point instanceof outline ? outline.geometry.coordinates : [point.geometry.coordinates]; 
}); 

Если instanceof не представляется возможным, вы могли бы сделать некоторые утки печатать, например, путем проверки, если outline_or_point является массивом или номер.

var coordinates = geometries.map(function(outline_or_point) { 
    return typeof outline_or_point[0] == 'number' ? [point.geometry.coordinates] : outline.geometry.coordinates; 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^