mergeSequences method

CoordinateSequence mergeSequences(
  1. List<CoordinateSequence> sequences,
  2. List<Ordinate> ordinateFlags
)

Merges an array of one-coordinate-{@link CoordinateSequence}s into one {@link CoordinateSequence}.

@param sequences an array of coordinate sequences. Each sequence contains exactly one coordinate. @param ordinateFlags a bit-mask of required ordinates. @return a coordinate sequence containing all coordinate

Implementation

CoordinateSequence mergeSequences(
    List<CoordinateSequence> sequences, List<Ordinate> ordinateFlags) {
  // if the sequences array is empty or null create an empty sequence
  if (sequences == null || sequences.isEmpty)
    return csFactory.createSizeDim(0, toDimension(ordinateFlags));

  if (sequences.length == 1) return sequences[0];

  List<Ordinate> mergeOrdinates;
  if (this.isAllowOldJtsCoordinateSyntax && ordinateFlags.length == 2) {
    mergeOrdinates = []
      ..addAll(ordinateFlags); // TODO check if this clone is enough
    for (int i = 0; i < sequences.length; i++) {
      if ((sequences[i]).hasZ()) {
        mergeOrdinates.add(Ordinate.Z);
        break;
      }
    }
  } else
    mergeOrdinates = ordinateFlags;

  // create and fill the result sequence // TODO check
  CoordinateSequence sequence = this.csFactory.createSizeDimMeas(
      sequences.length,
      toDimension(mergeOrdinates),
      mergeOrdinates.contains(Ordinate.M) ? 1 : 0);

  int offsetM =
      CoordinateSequence.Z + (mergeOrdinates.contains(Ordinate.Z) ? 1 : 0);
  for (int i = 0; i < sequences.length; i++) {
    CoordinateSequence item = sequences[i];
    sequence.setOrdinate(
        i, CoordinateSequence.X, item.getOrdinate(0, CoordinateSequence.X));
    sequence.setOrdinate(
        i, CoordinateSequence.Y, item.getOrdinate(0, CoordinateSequence.Y));
    if (mergeOrdinates.contains(Ordinate.Z)) {
      sequence.setOrdinate(
          i, CoordinateSequence.Z, item.getOrdinate(0, CoordinateSequence.Z));
    }
    if (mergeOrdinates.contains(Ordinate.M)) {
      sequence.setOrdinate(i, offsetM, item.getOrdinate(0, offsetM));
    }
  }

  // return it
  return sequence;
}