public Geoshape geoshape(org.locationtech.jts.geom.Geometry geometry) { return new Geoshape(context.getShapeFactory().makeShapeFromGeometry(geometry)); }
public int size(Shape shape) { switch(getType(shape)) { case LINE: case POLYGON: case MULTIPOINT: case MULTILINESTRING: case MULTIPOLYGON: return ((JtsGeometry) shape).getGeom().getCoordinates().length; case POINT: return 1; case CIRCLE: return 1; case BOX: return 2; case GEOMETRYCOLLECTION: return ((ShapeCollection<?>) shape).getShapes().stream().map(s -> (Shape) s).mapToInt(s -> size(s)).sum(); default: throw new IllegalStateException("size() not supported for type: " + getType(shape)); } }
@Override public Shape build() { return makeShapeFromGeometry(buildPolygonGeom()); }
protected JtsGeometry jtsGeometry(Geometry geom) { //dateline180Check is false because ElasticSearch does it's own dateline wrapping JtsGeometry jtsGeometry = new JtsGeometry(geom, SPATIAL_CONTEXT, false, MULTI_POLYGON_MAY_OVERLAP); if (AUTO_VALIDATE_JTS_GEOMETRY) jtsGeometry.validate(); if (AUTO_INDEX_JTS_GEOMETRY) jtsGeometry.index(); return jtsGeometry; }
@Override public Shape buildOrRect() { Polygon geom = buildPolygonGeom(); if (geom.isRectangle()) { return makeRectFromRectangularPoly(geom); } return makeShapeFromGeometry(geom); }
@Override public Shape build() { Geometry geom = buildLineStringGeom(); if (bufDistance != 0.0) { geom = geom.buffer(bufDistance); } return makeShape(geom); }
@Override public Shape build() { return makeShape(geometryFactory.createMultiPoint(getCoordsArray())); } }
/** * INTERNAL: Creates a {@link Shape} from a JTS {@link Geometry}. Generally, this shouldn't be * called when one of the other factory methods are available, such as for points. The caller * needs to have done some verification/normalization of the coordinates by now, if any. Also, * note that direct instances of {@link GeometryCollection} isn't supported. * * Instead of calling this method, consider {@link #makeShapeFromGeometry(Geometry)} * which */ public JtsGeometry makeShape(Geometry geom) { return makeShape(geom, datelineRule != DatelineRule.none, allowMultiOverlap); }
@Override public double getLat() { return getY(); }
@Override public double getLon() { return getX(); }
@Override public LineStringBuilder lineString() { if (!useJtsLineString()) return super.lineString(); return new JtsLineStringBuilder(); }
@Override public <T extends Shape> MultiShapeBuilder<T> multiShape(Class<T> shapeClass) { if (!useJtsMulti()) { return super.multiShape(shapeClass); } return new JtsMultiShapeBuilder<>(); }
@Override public PolygonBuilder polygon() { return new JtsPolygonBuilder(); }
@Override public Point pointXY(double x, double y) { return pointXYZ(x, y, Coordinate.NULL_ORDINATE); }
@Override public JtsHoleBuilder hole() { return new JtsHoleBuilder(); }
@Override public LineStringBuilder lineString() { return new JtsLineStringBuilder(); }
public T pointLatLon(double latitude, double longitude) { return pointXYZ(longitude, latitude, Coordinate.NULL_ORDINATE); } // TODO would be be useful to add other ways of providing points? e.g. point(Coordinate)?
@SuppressWarnings("unchecked") public Geoshape.Type getType(Shape shape) { final Geoshape.Type type; if (JtsGeometry.class.isAssignableFrom(shape.getClass()) && "LineString".equals(((JtsGeometry) shape).getGeom().getGeometryType())) { type = Geoshape.Type.LINE; } else if (JtsGeometry.class.isAssignableFrom(shape.getClass())) { try { type = Geoshape.Type.fromGson((((JtsGeometry) shape).getGeom().getGeometryType())); } catch (IllegalArgumentException e) { throw new IllegalStateException("Unrecognized shape type");
@Override public PolygonBuilder polygon() { return new JtsPolygonBuilder(); }
case MULTILINESTRING: case MULTIPOLYGON: Coordinate coordinate = ((JtsGeometry) shape).getGeom().getCoordinates()[position]; return new Geoshape.Point(coordinate.y, coordinate.x); case POINT: