@Override public SpatialRelation relate(Shape other) { // ** NOTE ** the overall order of logic is kept consistent here with simple.PointImpl. if (isEmpty() || other.isEmpty()) return SpatialRelation.DISJOINT; if (other instanceof org.locationtech.spatial4j.shape.Point) return this.equals(other) ? SpatialRelation.INTERSECTS : SpatialRelation.DISJOINT; return other.relate(this).transpose(); }
@Override public double getLat() { return getY(); }
@Override public double getLon() { return getX(); }
@Override public Shape build() { Class<?> last = null; List<Geometry> geoms = new ArrayList<>(shapes.size()); for(Shape s : shapes) { if (last != null && last != s.getClass()) { return super.build(); } if (s instanceof JtsGeometry) { geoms.add(((JtsGeometry)s).getGeom()); } else if (s instanceof JtsPoint) { geoms.add(((JtsPoint)s).getGeom()); } else { return super.build(); } last = s.getClass(); } return makeShapeFromGeometry(geometryFactory.buildGeometry(geoms)); } }
@Override public double getX() { return isEmpty() ? Double.NaN : pointGeom.getX(); }
@Override public Shape lineString(List<Point> points, double bufferDistance) { if (!useJtsLineString()) return super.lineString(points, bufferDistance); //convert List<Point> to Coordinate[] Coordinate[] coords = new Coordinate[points.size()]; for (int i = 0; i < coords.length; i++) { Point p = points.get(i); if (p instanceof JtsPoint) { JtsPoint jtsPoint = (JtsPoint) p; coords[i] = jtsPoint.getGeom().getCoordinate(); } else { coords[i] = new Coordinate(p.getX(), p.getY()); } } JtsGeometry shape = makeShape(geometryFactory.createLineString(coords)); if(bufferDistance!=0) { return shape.getBuffered(bufferDistance, ctx); } return shape; }
@Override public Point pointXYZ(double x, double y, double z) { if (!useJtsPoint()) return super.pointXY(x, y);// ignore z //A Jts Point is fairly heavyweight! TODO could/should we optimize this? SingleCoordinateSequence verifyX(x); verifyY(y); verifyZ(z); // verifyZ(z)? Coordinate coord = Double.isNaN(x) ? null : new Coordinate(x, y, z); return new JtsPoint(geometryFactory.createPoint(coord), (JtsSpatialContext) ctx); }
@Override public double getY() { return isEmpty() ? Double.NaN : pointGeom.getY(); }
protected JtsGeometry createMultiPoint(ShapeCollection<JtsPoint> geometries) { Coordinate[] points = new Coordinate[geometries.size()]; int i = 0; for (JtsPoint geometry : geometries) { points[i] = new Coordinate(geometry.getX(), geometry.getY()); i++; } MultiPoint multiPoints = GEOMETRY_FACTORY.createMultiPoint(points); return SPATIAL_CONTEXT.makeShape(multiPoints); }
public SpatialRelation relate(Point pt) { if (!getBoundingBox().relate(pt).intersects()) return SpatialRelation.DISJOINT; Geometry ptGeom; if (pt instanceof JtsPoint) ptGeom = ((JtsPoint)pt).getGeom(); else ptGeom = ctx.getGeometryFactory().createPoint(new Coordinate(pt.getX(), pt.getY())); return relate(ptGeom);//is point-optimized }
/** * Reads WKT from the {@code str} via JTS's {@link org.locationtech.jts.io.WKTReader}. * @param str * @param reader <pre>new WKTReader(ctx.getGeometryFactory()))</pre> * @return Non-Null */ protected Shape parseIfSupported(String str, WKTReader reader) throws ParseException { try { Geometry geom = reader.read(str); //Normalizes & verifies coordinates checkCoordinates(geom); if (geom instanceof org.locationtech.jts.geom.Point) { org.locationtech.jts.geom.Point ptGeom = (org.locationtech.jts.geom.Point) geom; if (getShapeFactory().useJtsPoint()) return new JtsPoint(ptGeom, (JtsSpatialContext) ctx); else return getShapeFactory().pointXY(ptGeom.getX(), ptGeom.getY()); } else if (geom.isRectangle()) { return getShapeFactory().makeRectFromRectangularPoly(geom); } else { return getShapeFactory().makeShapeFromGeometry(geom); } } catch (InvalidShapeException e) { throw e; } catch (Exception e) { throw new InvalidShapeException("error reading WKT: "+e.toString(), e); } }
@Override public void reset(double x, double y) { assert ! isEmpty(); CoordinateSequence cSeq = pointGeom.getCoordinateSequence(); cSeq.setOrdinate(0, CoordinateSequence.X, x); cSeq.setOrdinate(0, CoordinateSequence.Y, y); }
return ((JtsPoint) shape).getGeom();