private Polygon parsePolygon(List<Object> coordinates) throws ParseException { List<Polygon> holes = new ArrayList<>(); Object o = coordinates.get(0); if (o instanceof List == false) { throw newParseException("first element of polygon array must be an array [[lat, lon], [lat, lon] ...] but got: " + o); } double[][] polyPoints = parsePoints((List<Object>) o); for(int i=1;i<coordinates.size();i++) { o = coordinates.get(i); if (o instanceof List == false) { throw newParseException("elements of coordinates array must be an array [[lat, lon], [lat, lon] ...] but got: " + o); } double[][] holePoints = parsePoints((List<Object>) o); holes.add(new Polygon(holePoints[0], holePoints[1])); } return new Polygon(polyPoints[0], polyPoints[1], holes.toArray(new Polygon[holes.size()])); }
public Object toPolygonLucene() { final org.apache.lucene.geo.Polygon[] holes = new org.apache.lucene.geo.Polygon[this.holes.size()]; for (int i = 0; i < holes.length; ++i) { holes[i] = linearRing(this.holes.get(i).coordinates); } return new org.apache.lucene.geo.Polygon(this.shell.coordinates.stream().mapToDouble(i -> normalizeLat(i.y)).toArray(), this.shell.coordinates.stream().mapToDouble(i -> normalizeLon(i.x)).toArray(), holes); }
protected static org.apache.lucene.geo.Polygon linearRing(List<Coordinate> coordinates) { return new org.apache.lucene.geo.Polygon(coordinates.stream().mapToDouble(i -> normalizeLat(i.y)).toArray(), coordinates.stream().mapToDouble(i -> normalizeLon(i.x)).toArray()); }
protected static org.apache.lucene.geo.Polygon polygonLucene(Coordinate[][] polygon) { org.apache.lucene.geo.Polygon[] holes; Coordinate[] shell = polygon[0]; if (polygon.length > 1) { holes = new org.apache.lucene.geo.Polygon[polygon.length - 1]; for (int i = 0; i < holes.length; ++i) { Coordinate[] coords = polygon[i+1]; //We do not have holes on the dateline as they get eliminated //when breaking the polygon around it. double[] x = new double[coords.length]; double[] y = new double[coords.length]; for (int c = 0; c < coords.length; ++c) { x[c] = normalizeLon(coords[c].x); y[c] = normalizeLat(coords[c].y); } holes[i] = new org.apache.lucene.geo.Polygon(y, x); } } else { holes = new org.apache.lucene.geo.Polygon[0]; } double[] x = new double[shell.length]; double[] y = new double[shell.length]; for (int i = 0; i < shell.length; ++i) { //Lucene Tessellator treats different +180 and -180 and we should keep the sign. //normalizeLon method excludes -180. x[i] = Math.abs(shell[i].x) > 180 ? normalizeLon(shell[i].x) : shell[i].x; y[i] = normalizeLat(shell[i].y); } return new org.apache.lucene.geo.Polygon(y, x, holes); }
return LatLonPoint.newPolygonQuery(fieldType.name(), new Polygon(lats, lons));
@JsonIgnore public Polygon toPolygon() { return new Polygon(polyLats, polyLons, toPolygons(holes)); }
Polygon p = new Polygon(new double[]{r.minLat, r.minLat, r.maxLat, r.maxLat, r.minLat}, new double[]{r.minLon, r.maxLon, r.maxLon, r.minLon, r.minLon}); indexFields(context, XLatLonShape.createIndexableFields(name(), p));
/** parses the hole of a polygon */ private static Polygon parsePolygonHole(StreamTokenizer stream) throws IOException, ParseException { ArrayList<Double> lats = new ArrayList(); ArrayList<Double> lons = new ArrayList(); parseCoordinates(stream, lats, lons); return new Polygon(lats.stream().mapToDouble(i->i).toArray(), lons.stream().mapToDouble(i->i).toArray()); }
private Polygon parsePolygon(List<Object> coordinates) throws ParseException { List<Polygon> holes = new ArrayList<>(); Object o = coordinates.get(0); if (o instanceof List == false) { throw newParseException("first element of polygon array must be an array [[lat, lon], [lat, lon] ...] but got: " + o); } double[][] polyPoints = parsePoints((List<Object>) o); for(int i=1;i<coordinates.size();i++) { o = coordinates.get(i); if (o instanceof List == false) { throw newParseException("elements of coordinates array must be an array [[lat, lon], [lat, lon] ...] but got: " + o); } double[][] holePoints = parsePoints((List<Object>) o); holes.add(new Polygon(holePoints[0], holePoints[1])); } return new Polygon(polyPoints[0], polyPoints[1], holes.toArray(new Polygon[holes.size()])); }
@Override protected Query doBuild(LuceneSearchPredicateContext context) { List<GeoPoint> points = polygon.getPoints(); double[] polyLats = new double[points.size()]; double[] polyLons = new double[points.size()]; for ( int i = 0; i < points.size(); i++ ) { polyLats[i] = points.get( i ).getLatitude(); polyLons[i] = points.get( i ).getLongitude(); } Polygon lucenePolygon = new Polygon( polyLats, polyLons ); return LatLonPoint.newPolygonQuery( absoluteFieldPath, lucenePolygon ); } }
/** parses a POLYGON */ private static Polygon parsePolygon(StreamTokenizer stream) throws IOException, ParseException { if (nextEmptyOrOpen(stream).equals(EMPTY)) { return null; } nextOpener(stream); ArrayList<Double> lats = new ArrayList(); ArrayList<Double> lons = new ArrayList(); parseCoordinates(stream, lats, lons); ArrayList<Polygon> holes = new ArrayList<>(); while (nextCloserOrComma(stream).equals(COMMA)) { holes.add(parsePolygonHole(stream)); } if (holes.isEmpty() == false) { return new Polygon(lats.stream().mapToDouble(i->i).toArray(), lons.stream().mapToDouble(i->i).toArray(), holes.toArray(new Polygon[holes.size()])); } return new Polygon(lats.stream().mapToDouble(i->i).toArray(), lons.stream().mapToDouble(i->i).toArray()); }
return LatLonPoint.newPolygonQuery(fieldType.name(), new Polygon(lats, lons));
return LatLonPoint.newPolygonQuery(fieldType.name(), new Polygon(lats, lons));
return LatLonPoint.newPolygonQuery(fieldType.name(), new Polygon(lats, lons));