package com.esri; import ch.hsr.geohash.BoundingBox; import ch.hsr.geohash.WGS84Point; import org.apache.hadoop.hbase.filter.FilterBase; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataInputStream; import java.io.DataOutput; import java.io.IOException; /** */ public final class BoundingBoxFilter extends FilterBase { private BoundingBox m_boundingBox; public BoundingBoxFilter() { } public BoundingBoxFilter( final BoundingBox boundingBox ) { m_boundingBox = boundingBox; } @Override public boolean filterRowKey( final byte[] buffer, final int offset, final int length) { boolean filter; final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(buffer, offset, length); final DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream); try { final long bits = dataInputStream.readLong(); final double lon = dataInputStream.readDouble(); final double lat = dataInputStream.readDouble(); filter = !m_boundingBox.contains(new WGS84Point(lat, lon)); } catch (IOException e) { filter = true; } return filter; } @Override public void write(final DataOutput dataOutput) throws IOException { dataOutput.writeDouble(m_boundingBox.getMinLat()); dataOutput.writeDouble(m_boundingBox.getMaxLat()); dataOutput.writeDouble(m_boundingBox.getMinLon()); dataOutput.writeDouble(m_boundingBox.getMaxLon()); } @Override public void readFields(final DataInput dataInput) throws IOException { final double ymin = dataInput.readDouble(); final double ymax = dataInput.readDouble(); final double xmin = dataInput.readDouble(); final double xmax = dataInput.readDouble(); m_boundingBox = new BoundingBox(ymin, ymax, xmin, xmax); } }