package com.revolsys.geometry.model.vertex; import java.util.NoSuchElementException; import com.revolsys.geometry.model.LineString; import com.revolsys.geometry.model.Lineal; public class MultiLineStringVertex extends AbstractVertex { private static final long serialVersionUID = 1L; private int partIndex; private int vertexIndex; public MultiLineStringVertex(final Lineal lineal, final int... vertexId) { super(lineal); setVertexId(vertexId); } @Override public double getCoordinate(final int axisIndex) { final LineString lineString = getLineString(); if (lineString == null) { return java.lang.Double.NaN; } else { return lineString.getCoordinate(this.vertexIndex, axisIndex); } } public Lineal getLineal() { return (Lineal)getGeometry(); } @Override public double getLineCoordinateRelative(final int vertexOffset, final int axisIndex) { if (isEmpty()) { return java.lang.Double.NaN; } else { final int vertexIndex = getVertexIndex(); final LineString line = getLineString(); return line.getCoordinate(vertexIndex + vertexOffset, axisIndex); } } @Override public Vertex getLineNext() { final LineString line = getLineString(); if (line != null) { final int newVertexIndex = this.vertexIndex + 1; if (newVertexIndex < line.getVertexCount()) { final Lineal lineal = getLineal(); return new MultiLineStringVertex(lineal, this.partIndex, newVertexIndex); } } return null; } @Override public Vertex getLinePrevious() { final LineString line = getLineString(); if (line != null) { final int newVertexIndex = this.vertexIndex - 1; if (newVertexIndex >= 0) { return new MultiLineStringVertex(getLineal(), this.partIndex, newVertexIndex); } } return null; } public LineString getLineString() { final Lineal lineal = getLineal(); return lineal.getLineString(this.partIndex); } @Override public int getPartIndex() { return super.getPartIndex(); } @Override public int[] getVertexId() { return new int[] { this.partIndex, this.vertexIndex }; } @Override public int getVertexIndex() { return this.vertexIndex; } @Override public double getX() { final LineString lineString = getLineString(); if (lineString == null) { return java.lang.Double.NaN; } else { return lineString.getX(this.vertexIndex); } } @Override public double getX(final int axisIndex) { final LineString lineString = getLineString(); if (lineString == null) { return java.lang.Double.NaN; } else { return lineString.getX(this.vertexIndex); } } @Override public double getY() { final LineString lineString = getLineString(); if (lineString == null) { return java.lang.Double.NaN; } else { return lineString.getY(this.vertexIndex); } } @Override public double getY(final int axisIndex) { final LineString lineString = getLineString(); if (lineString == null) { return java.lang.Double.NaN; } else { return lineString.getY(this.vertexIndex); } } @Override public boolean hasNext() { if (getGeometry().isEmpty()) { return false; } else { final Lineal lineal = getLineal(); int partIndex = this.partIndex; int vertexIndex = this.vertexIndex + 1; while (partIndex < lineal.getGeometryCount()) { final LineString lineString = lineal.getLineString(partIndex); if (vertexIndex < lineString.getVertexCount()) { return true; } else { partIndex++; vertexIndex = 0; } } return false; } } @Override public boolean isFrom() { return getVertexIndex() == 0; } @Override public boolean isTo() { final int vertexIndex = getVertexIndex(); final LineString lineString = getLineString(); final int lastVertexIndex = lineString.getVertexCount() - 1; return vertexIndex == lastVertexIndex; } @Override public Vertex next() { final Lineal lineal = getLineal(); this.vertexIndex++; while (this.partIndex < lineal.getGeometryCount()) { final LineString lineString = lineal.getLineString(this.partIndex); if (this.vertexIndex < lineString.getVertexCount()) { return this; } else { this.partIndex++; this.vertexIndex = 0; } } throw new NoSuchElementException(); } @Override public void remove() { throw new UnsupportedOperationException("Removing vertices not supported"); } public void setVertexId(final int... vertexId) { this.partIndex = vertexId[0]; this.vertexIndex = vertexId[1]; } }