public LiteCoordinateSequence(CoordinateSequence cs, int dimension) { super(dimension, cs.getMeasures()); this.size = cs.size(); this.dimension = dimension; if (cs instanceof LiteCoordinateSequence) { double[] orig = ((LiteCoordinateSequence) cs).getOrdinateArray(dimension); this.coords = new double[orig.length]; System.arraycopy(orig, 0, coords, 0, coords.length); } else { this.coords = new double[size * dimension]; int minDimension = Math.min(dimension, cs.getDimension()); for (int i = 0; i < size; i++) { for (int j = 0; j < minDimension; j++) { coords[i * dimension + j] = cs.getOrdinate(i, j); } } } }
void coordinates(CoordinateSequence coordinates, char cs, char ts, StringBuffer sb) { sb.setLength(0); int n = coordinates.size(); int dim = CoordinateSequences.coordinateDimension(coordinates); for (int i = 0; i < n; i++) { coordFormatter.format(coordinates.getX(i), sb).append(cs); coordFormatter.format(coordinates.getY(i), sb); if (dim > 2) { int totalDimensions = encodeMeasures ? dim : dim - coordinates.getMeasures(); // encoding the remaining ordinates, typically Z and M values for (int j = 2; j < totalDimensions; j++) { sb.append(cs); coordFormatter.format(coordinates.getOrdinate(i, j), sb); } } sb.append(ts); } sb.setLength(sb.length() - 1); }
/** * Checks that the provided feature default geometry is a linestring and has the expected * dimension, measures and ordinates. */ private void checkLineCoordinates( SimpleFeature feature, int dimension, int measures, double... ordinates) { // get the feature point geometry Object candidate = feature.getDefaultGeometry(); assertThat(candidate, instanceOf(LineString.class)); LineString line = (LineString) candidate; // check the coordinate sequence dimension and measures CoordinateSequence coordinateSequence = line.getCoordinateSequence(); assertThat(coordinateSequence.getDimension(), is(dimension)); assertThat(coordinateSequence.getMeasures(), is(measures)); // check the we have the expected ordinates List<Double> candidatesOrdinates = getOrdinates(coordinateSequence); assertThat(candidatesOrdinates.size(), is(ordinates.length)); for (int i = 0; i < ordinates.length; i++) { assertThat(candidatesOrdinates.get(i), is(ordinates[i])); } }
/** * Checks that the provided feature default geometry is a point and has the expected dimension, * measures and ordinates. */ private void checkPointCoordinates( SimpleFeature feature, int dimension, int measures, double... ordinates) { // get the feature point geometry Object candidate = feature.getDefaultGeometry(); assertThat(candidate, instanceOf(Point.class)); Point point = (Point) candidate; // check the coordinate sequence dimension and measures CoordinateSequence coordinateSequence = point.getCoordinateSequence(); assertThat(coordinateSequence.getDimension(), is(dimension)); assertThat(coordinateSequence.getMeasures(), is(measures)); // check the we have the expected ordinates List<Double> candidatesOrdinates = getOrdinates(coordinateSequence); assertThat(candidatesOrdinates.size(), is(ordinates.length)); for (int i = 0; i < ordinates.length; i++) { assertThat(candidatesOrdinates.get(i), is(ordinates[i])); } }
/** * Does what it says, reverses the order of the Coordinates in the ring. * * <p>This is different then lr.reverses() in that a copy is produced using a new coordinate * sequence. * * @param lr The ring to reverse. * @return A new ring with the reversed Coordinates. */ public static final LinearRing reverseRing(LinearRing lr) { GeometryFactory gf = lr.getFactory(); CoordinateSequenceFactory csf = gf.getCoordinateSequenceFactory(); CoordinateSequence csOrig = lr.getCoordinateSequence(); int numPoints = csOrig.size(); int dimensions = csOrig.getDimension(); CoordinateSequence csNew = JTS.createCS(csf, numPoints, dimensions, csOrig.getMeasures()); for (int i = 0; i < numPoints; i++) { for (int j = 0; j < dimensions; j++) { csNew.setOrdinate(numPoints - 1 - i, j, csOrig.getOrdinate(i, j)); } } return gf.createLinearRing(csNew); }
JTS.createCS(csFactory, sequence.size(), targetCSDim, sequence.getMeasures());
CoordinateSequence cs = JTS.createCS( csf, 2, coords.getDimension(), coords.getMeasures()); cs.setOrdinate(0, 0, clippedSegment[0]); cs.setOrdinate(0, 1, clippedSegment[1]);
/** * Checks {@link #getDimension()} and {@link #getMeasures()} to determine if {@link #getZ(int)} * is supported. * * @return true if {@link #getZ(int)} is supported. */ default boolean hasZ() { return (getDimension()-getMeasures()) > 2; }
/** * Checks {@link #getMeasures()} to determine if {@link #getM(int)} * is supported. * * @return true if {@link #getM(int)} is supported. */ default boolean hasM() { return getDimension()>2 && getMeasures() > 0; }
/** Checks that the measures of XYZM geometries are not transformed. */ @Test public void testXyzmGeometriesMeasuresArePreserved() throws Exception { // build a XYM geometry and reproject it Geometry geometry = new WKTReader().read("LINESTRINGZM(170 -40 10 2, 190 40 15 7)"); MathTransform transform = CRS.findMathTransform(WGS84, MERCATOR, true); Geometry transformed = JTS.transform(geometry, transform); // check that coordinates where transformed but measures preserved assertThat(transformed, instanceOf(LineString.class)); LineString line = (LineString) transformed; assertThat(line.getCoordinateSequence().getDimension(), is(4)); assertThat(line.getCoordinateSequence().getMeasures(), is(1)); // check the first coordinate assertThat(line.getCoordinateSequence().getX(0), closeTo(1.8924313434856504E7, EPS)); assertThat(line.getCoordinateSequence().getY(0), closeTo(-4838471.398061137, EPS)); assertThat(line.getCoordinateSequence().getZ(0), is(10.0)); assertThat(line.getCoordinateSequence().getM(0), is(2.0)); // check the second coordinate assertThat(line.getCoordinateSequence().getX(1), closeTo(2.115070325072198E7, EPS)); assertThat(line.getCoordinateSequence().getY(1), closeTo(4838471.398061137, EPS)); assertThat(line.getCoordinateSequence().getZ(1), is(15.0)); assertThat(line.getCoordinateSequence().getM(1), is(7.0)); }
/** Checks that the measures of XYM geometries are not transformed. */ @Test public void testXymGeometriesMeasuresArePreserved() throws Exception { // build a XYM geometry and reproject it Geometry geometry = new WKTReader().read("LINESTRINGM(170 -40 2, 190 40 7)"); MathTransform transform = CRS.findMathTransform(WGS84, MERCATOR, true); Geometry transformed = JTS.transform(geometry, transform); // check that coordinates where transformed but measures preserved assertThat(transformed, instanceOf(LineString.class)); LineString line = (LineString) transformed; assertThat(line.getCoordinateSequence().getDimension(), is(3)); assertThat(line.getCoordinateSequence().getMeasures(), is(1)); // check the first coordinate assertThat(line.getCoordinateSequence().getX(0), closeTo(1.8924313434856504E7, EPS)); assertThat(line.getCoordinateSequence().getY(0), closeTo(-4838471.398061137, EPS)); assertThat(line.getCoordinateSequence().getZ(0), is(Double.NaN)); assertThat(line.getCoordinateSequence().getM(0), is(2.0)); // check the second coordinate assertThat(line.getCoordinateSequence().getX(1), closeTo(2.115070325072198E7, EPS)); assertThat(line.getCoordinateSequence().getY(1), closeTo(4838471.398061137, EPS)); assertThat(line.getCoordinateSequence().getZ(1), is(Double.NaN)); assertThat(line.getCoordinateSequence().getM(1), is(7.0)); }
/** * Creates a coordinate for use in this sequence. * <p> * The coordinate is created supporting the same number of {@link #getDimension()} and {@link #getMeasures()} * as this sequence and is suitable for use with {@link #getCoordinate(int, Coordinate)}. * </p> * @return coordinate for use with this sequence */ default Coordinate createCoordinate() { return Coordinates.create(getDimension(), getMeasures()); }
/** * Returns ordinate M of the specified coordinate if available. * * @param index * @return the value of the M ordinate in the index'th coordinate, or Double.NaN if not defined. */ default double getM(int index) { if (hasM()) { final int mIndex = getDimension()-getMeasures(); return getOrdinate( index, mIndex ); } else { return Double.NaN; } }
/** * Creates a new sequence based on a deep copy of the given {@link CoordinateSequence}. * The coordinate dimension is set to equal the dimension of the input. * * @param coordSeq the coordinate sequence that will be copied. */ public CoordinateArraySequence(CoordinateSequence coordSeq) { // NOTE: this will make a sequence of the default dimension if (coordSeq == null) { coordinates = new Coordinate[0]; return; } dimension = coordSeq.getDimension(); measures = coordSeq.getMeasures(); coordinates = new Coordinate[coordSeq.size()]; for (int i = 0; i < coordinates.length; i++) { coordinates[i] = coordSeq.getCoordinateCopy(i); } }
/** * @see org.locationtech.jts.geom.CoordinateSequenceFactory#create(org.locationtech.jts.geom.CoordinateSequence) */ public CoordinateSequence create(CoordinateSequence coordSeq) { int dimension = coordSeq.getDimension(); int measures = coordSeq.getMeasures(); if (type == DOUBLE) { return new PackedCoordinateSequence.Double(coordSeq.toCoordinateArray(), dimension, measures); } else { return new PackedCoordinateSequence.Float(coordSeq.toCoordinateArray(), dimension, measures); } }
/** * Creates a {@link MultiPoint} using the * points in the given {@link CoordinateSequence}. * A <code>null</code> or empty CoordinateSequence creates an empty MultiPoint. * * @param coordinates a CoordinateSequence (possibly empty), or <code>null</code> * @return a MultiPoint geometry */ public MultiPoint createMultiPoint(CoordinateSequence coordinates) { if (coordinates == null) { return createMultiPoint(new Point[0]); } Point[] points = new Point[coordinates.size()]; for (int i = 0; i < coordinates.size(); i++) { CoordinateSequence ptSeq = getCoordinateSequenceFactory() .create(1, coordinates.getDimension(), coordinates.getMeasures()); CoordinateSequences.copy(coordinates, i, ptSeq, 0, 1); points[i] = createPoint(ptSeq); } return createMultiPoint(points); }
CoordinateSequence sequence = factory.create(10, 4); assertEquals("clipped dimension 3", 3, sequence.getDimension()); assertEquals("default measure 0", 0, sequence.getMeasures()); assertTrue(sequence.hasZ()); assertTrue(!sequence.hasM()); assertEquals("provided measure 0", 0, sequence.getMeasures()); assertTrue(sequence.hasZ()); assertTrue(!sequence.hasM()); assertEquals("clipped measure 1", 1, sequence.getMeasures()); assertTrue(!sequence.hasZ()); assertTrue(sequence.hasM()); assertEquals("provided measure 1", 1, sequence.getMeasures()); assertTrue(sequence.hasZ()); assertTrue(sequence.hasM()); assertEquals("default measure 0", 0, sequence.getMeasures()); assertTrue(!sequence.hasZ()); assertTrue(!sequence.hasM()); assertEquals("provided measure 1", 1, sequence.getMeasures()); assertTrue(!sequence.hasZ()); assertTrue(sequence.hasM());
public void testMixedCoordinates() { CoordinateSequenceFactory factory = getCSFactory(); Coordinate coord1 = new Coordinate(1.0,1.0,1.0); CoordinateXY coord2 = new CoordinateXY(2.0,2.0); CoordinateXYM coord3 = new CoordinateXYM(3.0,3.0,3.0); Coordinate[] array = new Coordinate[] {coord1, coord2, coord3}; CoordinateSequence seq = factory.create(array); assertEquals( 3, seq.getDimension()); assertEquals( 1, seq.getMeasures()); assertTrue( coord1.equals( seq.getCoordinate(0))); assertTrue( coord2.equals( seq.getCoordinate(1))); assertTrue( coord3.equals( seq.getCoordinate(2))); }
assertEquals(1,seq.getMeasures());