/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotools.data.shapefile.shp;
import com.vividsolutions.jts.geom.GeometryFactory;
/**
* Not much but a type safe enumeration of file types as ints and names. The
* descriptions can easily be tied to a ResourceBundle if someone wants to do
* that.
*
* @author Ian Schneider
*
* @source $URL$
*/
public final class ShapeType {
/** Represents a Null shape (id = 0). */
public static final ShapeType NULL = new ShapeType(0, "Null");
/** Represents a Point shape (id = 1). */
public static final ShapeType POINT = new ShapeType(1, "Point");
/** Represents a PointZ shape (id = 11). */
public static final ShapeType POINTZ = new ShapeType(11, "PointZ");
/** Represents a PointM shape (id = 21). */
public static final ShapeType POINTM = new ShapeType(21, "PointM");
/** Represents an Arc shape (id = 3). */
public static final ShapeType ARC = new ShapeType(3, "Arc");
/** Represents an ArcZ shape (id = 13). */
public static final ShapeType ARCZ = new ShapeType(13, "ArcZ");
/** Represents an ArcM shape (id = 23). */
public static final ShapeType ARCM = new ShapeType(23, "ArcM");
/** Represents a Polygon shape (id = 5). */
public static final ShapeType POLYGON = new ShapeType(5, "Polygon");
/** Represents a PolygonZ shape (id = 15). */
public static final ShapeType POLYGONZ = new ShapeType(15, "PolygonZ");
/** Represents a PolygonM shape (id = 25). */
public static final ShapeType POLYGONM = new ShapeType(25, "PolygonM");
/** Represents a MultiPoint shape (id = 8). */
public static final ShapeType MULTIPOINT = new ShapeType(8, "MultiPoint");
/** Represents a MultiPointZ shape (id = 18). */
public static final ShapeType MULTIPOINTZ = new ShapeType(18, "MultiPointZ");
/** Represents a MultiPointZ shape (id = 28). */
public static final ShapeType MULTIPOINTM = new ShapeType(28, "MultiPointM");
/** Represents an Undefined shape (id = -1). */
public static final ShapeType UNDEFINED = new ShapeType(-1, "Undefined");
/** The integer id of this ShapeType. */
public final int id;
/**
* The human-readable name for this ShapeType.<br>
* Could easily use ResourceBundle for internationialization.
*/
public final String name;
/**
* Creates a new instance of ShapeType. Hidden on purpose.
*
* @param id
* The id.
* @param name
* The name.
*/
protected ShapeType(int id, String name) {
this.id = id;
this.name = name;
}
/**
* Get the name of this ShapeType.
*
* @return The name.
*/
public String toString() {
return name;
}
/**
* Is this a multipoint shape? Hint- all shapes are multipoint except NULL,
* UNDEFINED, and the POINTs.
*
* @return true if multipoint, false otherwise.
*/
public boolean isMultiPoint() {
boolean mp = true;
if (this == UNDEFINED) {
mp = false;
} else if (this == NULL) {
mp = false;
} else if (this == POINT || this == POINTM || this == POINTZ) {
mp = false;
}
return mp;
}
public boolean isPointType() {
return id % 10 == 1;
}
public boolean isLineType() {
return id % 10 == 3;
}
public boolean isPolygonType() {
return id % 10 == 5;
}
public boolean isMultiPointType() {
return id % 10 == 8;
}
/**
* Determine the ShapeType for the id.
*
* @param id
* The id to search for.
* @return The ShapeType for the id.
*/
public static ShapeType forID(int id) {
ShapeType t;
switch (id) {
case 0:
t = NULL;
break;
case 1:
t = POINT;
break;
case 11:
t = POINTZ;
break;
case 21:
t = POINTM;
break;
case 3:
t = ARC;
break;
case 13:
t = ARCZ;
break;
case 23:
t = ARCM;
break;
case 5:
t = POLYGON;
break;
case 15:
t = POLYGONZ;
break;
case 25:
t = POLYGONM;
break;
case 8:
t = MULTIPOINT;
break;
case 18:
t = MULTIPOINTZ;
break;
case 28:
t = MULTIPOINTM;
break;
default:
t = UNDEFINED;
break;
}
return t;
}
/**
* Each ShapeType corresponds to a handler. In the future this should
* probably go else where to allow different handlers, or something...
*
* @throws ShapefileException
* If the ShapeType is bogus.
* @return The correct handler for this ShapeType. Returns a new one.
*/
public ShapeHandler getShapeHandler(GeometryFactory gf) throws ShapefileException {
ShapeHandler handler;
switch (id) {
case 1:
case 11:
case 21:
handler = new PointHandler(this, gf);
break;
case 3:
case 13:
case 23:
handler = new MultiLineHandler(this, gf);
break;
case 5:
case 15:
case 25:
handler = new PolygonHandler(this, gf);
break;
case 8:
case 18:
case 28:
handler = new MultiPointHandler(this, gf);
break;
default:
handler = null;
}
return handler;
}
}