/** sugar encodes a single point as a byte array, rounding values up */ private static byte[] encodeCeil(double latitude, double longitude) { byte[] bytes = new byte[2 * Integer.BYTES]; NumericUtils.intToSortableBytes(encodeLatitudeCeil(latitude), bytes, 0); NumericUtils.intToSortableBytes(encodeLongitudeCeil(longitude), bytes, Integer.BYTES); return bytes; }
LatLonDocValuesBoxQuery(String field, double minLatitude, double maxLatitude, double minLongitude, double maxLongitude) { GeoUtils.checkLatitude(minLatitude); GeoUtils.checkLatitude(maxLatitude); GeoUtils.checkLongitude(minLongitude); GeoUtils.checkLongitude(maxLongitude); if (field == null) { throw new IllegalArgumentException("field must not be null"); } this.field = field; this.crossesDateline = minLongitude > maxLongitude; // make sure to compute this before rounding this.minLatitude = GeoEncodingUtils.encodeLatitudeCeil(minLatitude); this.maxLatitude = GeoEncodingUtils.encodeLatitude(maxLatitude); this.minLongitude = GeoEncodingUtils.encodeLongitudeCeil(minLongitude); this.maxLongitude = GeoEncodingUtils.encodeLongitude(maxLongitude); }
private static Grid createSubBoxes(Rectangle boundingBox, Function<Rectangle, Relation> boxToRelation) { final int minLat = encodeLatitudeCeil(boundingBox.minLat); final int maxLat = encodeLatitude(boundingBox.maxLat); final int minLon = encodeLongitudeCeil(boundingBox.minLon);
private XRectangle2D(double minLat, double maxLat, double minLon, double maxLon) { this.bbox = new byte[4 * BYTES]; int minXenc = encodeLongitudeCeil(minLon); int maxXenc = encodeLongitude(maxLon); int minYenc = encodeLatitudeCeil(minLat); int maxYenc = encodeLatitude(maxLat); if (minYenc > maxYenc) { minYenc = maxYenc; } this.minY = minYenc; this.maxY = maxYenc; if (minLon > maxLon == true) { // crossing dateline is split into east/west boxes this.west = new byte[4 * BYTES]; this.minX = minXenc; this.maxX = maxXenc; encode(MIN_LON_ENCODED, this.maxX, this.minY, this.maxY, this.west); encode(this.minX, MAX_LON_ENCODED, this.minY, this.maxY, this.bbox); } else { // encodeLongitudeCeil may cause minX to be > maxX iff // the delta between the longitude < the encoding resolution if (minXenc > maxXenc) { minXenc = maxXenc; } this.west = null; this.minX = minXenc; this.maxX = maxXenc; encode(this.minX, this.maxX, this.minY, this.maxY, bbox); } }
/** sugar encodes a single point as a byte array, rounding values up */ private static byte[] encodeCeil(double latitude, double longitude) { byte[] bytes = new byte[2 * Integer.BYTES]; NumericUtils.intToSortableBytes(encodeLatitudeCeil(latitude), bytes, 0); NumericUtils.intToSortableBytes(encodeLongitudeCeil(longitude), bytes, Integer.BYTES); return bytes; }
/** * Quantizes lat/lon points and bit interleaves them into a sortable morton code * ranging from 0x00 : 0xFF... * https://en.wikipedia.org/wiki/Z-order_curve * This is useful for bitwise operations in raster space * @param latitude latitude value: must be within standard +/-90 coordinate bounds. * @param longitude longitude value: must be within standard +/-180 coordinate bounds. * @return bit interleaved encoded values as a 64-bit {@code long} * @throws IllegalArgumentException if latitude or longitude is out of bounds */ public static final long encodeCeil(double latitude, double longitude) { checkLatitude(latitude); checkLongitude(longitude); // encode lat/lon flipping the sign bit so negative ints sort before positive ints final int latEnc = encodeLatitudeCeil(latitude) ^ 0x80000000; final int lonEnc = encodeLongitudeCeil(longitude) ^ 0x80000000; return BitUtil.interleave(lonEnc, latEnc); }
LatLonDocValuesBoxQuery(String field, double minLatitude, double maxLatitude, double minLongitude, double maxLongitude) { GeoUtils.checkLatitude(minLatitude); GeoUtils.checkLatitude(maxLatitude); GeoUtils.checkLongitude(minLongitude); GeoUtils.checkLongitude(maxLongitude); if (field == null) { throw new IllegalArgumentException("field must not be null"); } this.field = field; this.crossesDateline = minLongitude > maxLongitude; // make sure to compute this before rounding this.minLatitude = GeoEncodingUtils.encodeLatitudeCeil(minLatitude); this.maxLatitude = GeoEncodingUtils.encodeLatitude(maxLatitude); this.minLongitude = GeoEncodingUtils.encodeLongitudeCeil(minLongitude); this.maxLongitude = GeoEncodingUtils.encodeLongitude(maxLongitude); }
int minXenc = encodeLongitudeCeil(minLon); int maxXenc = encodeLongitude(maxLon); int minYenc = encodeLatitudeCeil(minLat); int maxYenc = encodeLatitude(maxLat); if (minYenc > maxYenc) {
private static Grid createSubBoxes(Rectangle boundingBox, Function<Rectangle, Relation> boxToRelation) { final int minLat = encodeLatitudeCeil(boundingBox.minLat); final int maxLat = encodeLatitude(boundingBox.maxLat); final int minLon = encodeLongitudeCeil(boundingBox.minLon);