public Coordinate[] coordinates() { return super.coordinates(false); }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { return coordinatesToXcontent(builder, false); }
protected static ArrayList<LineString> decompose(GeometryFactory factory, Coordinate[] coordinates, ArrayList<LineString> strings) { for(Coordinate[] part : decompose(+DATELINE, coordinates)) { for(Coordinate[] line : decompose(-DATELINE, part)) { strings.add(factory.createLineString(line)); } } return strings; }
@Override public Shape build() { Coordinate[] coordinates = points.toArray(new Coordinate[points.size()]); Geometry geometry; if(wrapdateline) { ArrayList<LineString> strings = decompose(FACTORY, coordinates, new ArrayList<LineString>()); if(strings.size() == 1) { geometry = strings.get(0); } else { LineString[] linestrings = strings.toArray(new LineString[strings.size()]); geometry = FACTORY.createMultiLineString(linestrings); } } else { geometry = FACTORY.createLineString(coordinates); } return jtsGeometry(geometry); }
double t = intersection(coordinates[i-1], coordinates[i], dateline); if(!Double.isNaN(t)) { Coordinate[] part; part[part.length-1] = Edge.position(coordinates[i-1], coordinates[i], t); coordinates[offset+i-1] = Edge.position(coordinates[i-1], coordinates[i], t); shift(shift, part); offset = i-1; shift = coordinates[i].x > DATELINE ? DATELINE : (coordinates[i].x < -DATELINE ? -DATELINE : 0); } else { part = shift(shift, Arrays.copyOfRange(coordinates, offset, i+1)); offset = i; parts.add(shift(shift, coordinates)); } else if(offset < coordinates.length-1) { Coordinate[] part = Arrays.copyOfRange(coordinates, offset, coordinates.length); parts.add(shift(shift, part));
@Override public Shape build() { final Geometry geometry; if(wrapdateline) { ArrayList<LineString> parts = new ArrayList<>(); for (BaseLineStringBuilder<?> line : lines) { BaseLineStringBuilder.decompose(FACTORY, line.coordinates(false), parts); } if(parts.size() == 1) { geometry = parts.get(0); } else { LineString[] lineStrings = parts.toArray(new LineString[parts.size()]); geometry = FACTORY.createMultiLineString(lineStrings); } } else { LineString[] lineStrings = new LineString[lines.size()]; Iterator<BaseLineStringBuilder<?>> iterator = lines.iterator(); for (int i = 0; iterator.hasNext(); i++) { lineStrings[i] = FACTORY.createLineString(iterator.next().coordinates(false)); } geometry = FACTORY.createMultiLineString(lineStrings); } return jtsGeometry(geometry); }
public Coordinate[][] coordinates() { Coordinate[][] result = new Coordinate[lines.size()][]; for (int i = 0; i < result.length; i++) { result[i] = lines.get(i).coordinates(false); } return result; }
protected XContentBuilder coordinatesArray(XContentBuilder builder, Params params) throws IOException { shell.coordinatesToXcontent(builder, true); for(BaseLineStringBuilder<?> hole : holes) { hole.coordinatesToXcontent(builder, true); } return builder; }
private static int createEdges(int component, Orientation orientation, BaseLineStringBuilder<?> shell, BaseLineStringBuilder<?> hole, Edge[] edges, int offset) { // inner rings (holes) have an opposite direction than the outer rings // XOR will invert the orientation for outer ring cases (Truth Table:, T/T = F, T/F = T, F/T = T, F/F = F) boolean direction = (component == 0 ^ orientation == Orientation.RIGHT); // set the points array accordingly (shell or hole) Coordinate[] points = (hole != null) ? hole.coordinates(false) : shell.coordinates(false); Edge.ring(component, direction, orientation == Orientation.LEFT, shell, points, 0, edges, offset, points.length-1); return points.length-1; }
@Override public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(); builder.field(FIELD_TYPE, TYPE.shapename); builder.field(FIELD_COORDINATES); builder.startArray(); for(BaseLineStringBuilder<?> line : lines) { line.coordinatesToXcontent(builder, false); } builder.endArray(); builder.endObject(); return builder; }