com.bbn.openmap.layer.shape
Class SpatialIndex

java.lang.Object
  |
  +--com.bbn.openmap.layer.shape.ShapeUtils
        |
        +--com.bbn.openmap.layer.shape.SpatialIndex
All Implemented Interfaces:
ShapeConstants
Direct Known Subclasses:
LinkSpatialIndex

public class SpatialIndex
extends ShapeUtils

A Spatial Index is a variation on a Shape Index, adding the bounding box of the shape to the index.

The file has a 100 byte header identical to a Shape Index followed by n records.

The record layout of the spatial index is as follows:

Position Field Value Type Byte Order
Byte 0 Offset Offset Integer Big
Byte 4 Content Length Content Length Integer Big
Byte 8 Bounding Box Xmin Double Little
Byte 16 Bounding Box Ymin Double Little
Byte 24 Bounding Box Xmax Double Little
Byte 32 Bounding Box Ymax Double Little

Usage

java com.bbn.openmap.layer.shape.SpatialIndex -d file.ssx
Dumps spatial index information, excluding bounding boxes to stdout. Useful for comparing to a shape index.

java com.bbn.openmap.layer.shape.SpatialIndex -d -b file.ssx
Dumps spatial index information including bounding boxes to stdout.

java com.bbn.openmap.layer.shape.SpatialIndex -c file.ssx file.shp
Creates spatial index file.ssx from shape file file.shp.

Notes

When reading the Shape file, the content length is the length of the record's contents, exclusive of the record header (8 bytes). So the size that we need to read in from the Shape file is actually denoted as ((contentLength * 2) + 8). This converts from 16bit units to 8 bit bytes and adds the 8 bytes for the record header.

To Do

Version:
$Revision: 1.6.2.2 $ $Date: 2004/10/14 18:27:17 $
Author:
Tom Mitchell
See Also:
ShapeIndex

Field Summary
protected  ESRIBoundingBox bounds
          The bounds of all the shapes in the shape file.
static int DEFAULT_SHAPE_RECORD_SIZE
          Default size for shape record buffer.
protected  javax.swing.ImageIcon pointIcon
          The icon to use for point objects.
static int SHAPE_FILE_HEADER_LENGTH
          Size of a shape file header in bytes.
static int SHAPE_RECORD_HEADER_LENGTH
          Size of a shape file record header in bytes.
protected  BinaryBufferedFile shp
          The shape file.
static int SPATIAL_INDEX_HEADER_LENGTH
          Size of the spatial index header in bytes.
static int SPATIAL_INDEX_RECORD_LENGTH
          Size of the spatial index record in bytes.
protected  BinaryBufferedFile ssx
          The spatial index file.
 
Fields inherited from interface com.bbn.openmap.dataAccess.shape.ShapeConstants
DBF_CHARACTER, DBF_DATE, DBF_LOGICAL, DBF_MEMO, DBF_NUMERIC, DBF_TYPE_CHARACTER, DBF_TYPE_DATE, DBF_TYPE_LOGICAL, DBF_TYPE_MEMO, DBF_TYPE_NUMERIC, PARAM_DBF, PARAM_SHP, PARAM_SHX, SHAPE_DBF_DASHPATTERN, SHAPE_DBF_DASHPHASE, SHAPE_DBF_DESCRIPTION, SHAPE_DBF_FILLCOLOR, SHAPE_DBF_LINECOLOR, SHAPE_DBF_LINEWIDTH, SHAPE_DBF_SELECTCOLOR, SHAPE_FILE_RECORD_HEADER_LENGTH, SHAPE_TYPE_ARC, SHAPE_TYPE_MULTIPOINT, SHAPE_TYPE_NULL, SHAPE_TYPE_POINT, SHAPE_TYPE_POLYGON, SHAPE_TYPE_POLYLINE
 
Constructor Summary
SpatialIndex(java.lang.String ssxFilename)
          Opens a spatial index file for reading.
SpatialIndex(java.lang.String ssxFilename, java.lang.String shpFilename)
          Opens a spatial index file and it's associated shape file.
 
Method Summary
static void createIndex(java.lang.String inFile, java.lang.String outFile)
          Creates a spatial index for a shape file.
 void dumpIndex(boolean showBounds)
          Displays the contents of this index.
 ESRIBoundingBox getBounds()
          Get the box boundary containing all the shapes.
 javax.swing.ImageIcon getPointIcon()
          Get the icon used for general point objects.
protected static void indexPoints(java.io.InputStream is, long ptr, java.io.OutputStream os)
          Writes the spatial index for a point shape file.
protected static void indexPolygons(java.io.InputStream is, long ptr, java.io.OutputStream os)
          Writes the spatial index for a polygon shape file.
protected static boolean intersects(double xmin1, double ymin1, double xmax1, double ymax1, double xmin2, double ymin2, double xmax2, double ymax2)
          Determines if two rectangles intersect.
static SpatialIndex locateAndSetShapeData(java.lang.String shapeFileName)
          Create a SpatialIndex object with just a shape file name.
static SpatialIndex locateAndSetShapeData(java.lang.String shapeFileName, java.lang.String spatialIndexFileName)
           
static java.lang.String locateFile(java.lang.String name)
          Locate file 'fileName' in classpath, if it is not an absolute file name.
 ESRIRecord[] locateRecords(double xmin, double ymin, double xmax, double ymax)
          Locates records in the shape file that intersect with the given rectangle.
static void main(java.lang.String[] argv)
          The driver for the command line interface.
 ESRIRecord makeESRIRecord(int shapeType, byte[] b, int off)
          Creates a record instance from the shape file data.
static void printUsage(java.io.PrintStream out)
          Prints a usage statement describing how to use this class from the command line.
 void resetBounds()
          Reset the bounds so they will be recalculated the next time a file is read.
 void setPointIcon(javax.swing.ImageIcon ii)
          Set the icon to use for point objects, in general.
 
Methods inherited from class com.bbn.openmap.layer.shape.ShapeUtils
readBEInt, readBox, readLEDouble, readLEInt, readLEInt, readLELong, readPoint, writeBEInt, writeBox, writeLEDouble, writeLEInt, writeLELong, writePoint
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

SHAPE_FILE_HEADER_LENGTH

public static final int SHAPE_FILE_HEADER_LENGTH
Size of a shape file header in bytes.

See Also:
Constant Field Values

SHAPE_RECORD_HEADER_LENGTH

public static final int SHAPE_RECORD_HEADER_LENGTH
Size of a shape file record header in bytes.

See Also:
Constant Field Values

SPATIAL_INDEX_HEADER_LENGTH

public static final int SPATIAL_INDEX_HEADER_LENGTH
Size of the spatial index header in bytes.

See Also:
Constant Field Values

SPATIAL_INDEX_RECORD_LENGTH

public static final int SPATIAL_INDEX_RECORD_LENGTH
Size of the spatial index record in bytes.

See Also:
Constant Field Values

DEFAULT_SHAPE_RECORD_SIZE

public static final int DEFAULT_SHAPE_RECORD_SIZE
Default size for shape record buffer.

See Also:
Constant Field Values

ssx

protected BinaryBufferedFile ssx
The spatial index file.


shp

protected BinaryBufferedFile shp
The shape file.


pointIcon

protected javax.swing.ImageIcon pointIcon
The icon to use for point objects.


bounds

protected ESRIBoundingBox bounds
The bounds of all the shapes in the shape file.

Constructor Detail

SpatialIndex

public SpatialIndex(java.lang.String ssxFilename)
             throws java.io.IOException
Opens a spatial index file for reading.

Parameters:
ssxFilename - the name of the spatial index file
Throws:
java.io.IOException - if something goes wrong opening the file

SpatialIndex

public SpatialIndex(java.lang.String ssxFilename,
                    java.lang.String shpFilename)
             throws java.io.IOException
Opens a spatial index file and it's associated shape file.

Parameters:
ssxFilename - the name of the spatial index file
shpFilename - the name of the shape file
Throws:
java.io.IOException - if something goes wrong opening the files
Method Detail

getBounds

public ESRIBoundingBox getBounds()
Get the box boundary containing all the shapes.


resetBounds

public void resetBounds()
Reset the bounds so they will be recalculated the next time a file is read.


makeESRIRecord

public ESRIRecord makeESRIRecord(int shapeType,
                                 byte[] b,
                                 int off)
                          throws java.io.IOException
Creates a record instance from the shape file data. Calls the appropriate record constructor based on the shapeType, and passes the buffer and offset to that constructor.

Parameters:
shapeType - the shape file's shape type, enumerated in ShapeUtils
b - the buffer pointing to the raw record data
off - the offset of the data starting point in the buffer
Throws:
java.io.IOException - if something goes wrong reading the file
See Also:
ShapeUtils

locateRecords

public ESRIRecord[] locateRecords(double xmin,
                                  double ymin,
                                  double xmax,
                                  double ymax)
                           throws java.io.IOException,
                                  FormatException
Locates records in the shape file that intersect with the given rectangle. The spatial index is searched for intersections and the appropriate records are read from the shape file.

Parameters:
xmin - the smaller of the x coordinates
ymin - the smaller of the y coordinates
xmax - the larger of the x coordinates
ymax - the larger of the y coordinates
Returns:
an array of records that intersect the given rectangle
Throws:
java.io.IOException - if something goes wrong reading the files
FormatException

intersects

protected static final boolean intersects(double xmin1,
                                          double ymin1,
                                          double xmax1,
                                          double ymax1,
                                          double xmin2,
                                          double ymin2,
                                          double xmax2,
                                          double ymax2)
Determines if two rectangles intersect. Actually, this method determines if two rectangles don't intersect, and then returns a negation of that result. But the bottom line is the same.

Parameters:
xmin1 - the small x of rectangle 1
ymin1 - the small y of rectangle 1
xmax1 - the big x of rectangle 1
ymax1 - the big y of rectangle 1
xmin2 - the small x of rectangle 2
ymin2 - the small y of rectangle 2
xmax2 - the big x of rectangle 2
ymax2 - the big y of rectangle 2
Returns:
true if the rectangles intersect, false if they do not

dumpIndex

public void dumpIndex(boolean showBounds)
               throws java.io.IOException
Displays the contents of this index.

Parameters:
showBounds - true to show bounding box, false to skip it
Throws:
java.io.IOException - if something goes wrong reading the file

indexPolygons

protected static void indexPolygons(java.io.InputStream is,
                                    long ptr,
                                    java.io.OutputStream os)
Writes the spatial index for a polygon shape file.

Parameters:
is - the shape file input stream
ptr - the current position in the file
os - the spatial index file output stream

indexPoints

protected static void indexPoints(java.io.InputStream is,
                                  long ptr,
                                  java.io.OutputStream os)
Writes the spatial index for a point shape file.

Parameters:
is - the shape file input stream
ptr - the current position in the file
os - the spatial index file output stream

createIndex

public static void createIndex(java.lang.String inFile,
                               java.lang.String outFile)
Creates a spatial index for a shape file. Reads the records from the shape file, writing appropriate index records to the spatial index file.

Parameters:
inFile - the shape file
outFile - the spatial index file

printUsage

public static void printUsage(java.io.PrintStream out)
Prints a usage statement describing how to use this class from the command line.

Parameters:
out - The output stream to use for output

locateFile

public static java.lang.String locateFile(java.lang.String name)
Locate file 'fileName' in classpath, if it is not an absolute file name.

Returns:
absolute name of the file as a string if found, null otherwise.

locateAndSetShapeData

public static SpatialIndex locateAndSetShapeData(java.lang.String shapeFileName)
Create a SpatialIndex object with just a shape file name. If the shape file is local, this method will attempt to build the spatial index file and place it next to the shape file.


locateAndSetShapeData

public static SpatialIndex locateAndSetShapeData(java.lang.String shapeFileName,
                                                 java.lang.String spatialIndexFileName)

main

public static void main(java.lang.String[] argv)
                 throws java.io.IOException
The driver for the command line interface. Reads the command line arguments and executes appropriate calls.

See the file documentation for usage.

Parameters:
argv - the command line arguments
Throws:
java.io.IOException - if something goes wrong reading or writing the file

setPointIcon

public void setPointIcon(javax.swing.ImageIcon ii)
Set the icon to use for point objects, in general.

Parameters:
ii - ImageIcon to use for icon.

getPointIcon

public javax.swing.ImageIcon getPointIcon()
Get the icon used for general point objects.

Returns:
ImageIcon, null if not set.


Copyright (C) BBNT Solutions LLC; See http://openmap.bbn.com/ for details