/*
|
* JtsGeometry.java
|
*
|
* Wrapper for PostgreSQL JDBC driver to allow transparent reading and writing
|
* of JTS geometries
|
*
|
* (C) 2005 Markus Schaber, markus.schaber@logix-tt.com
|
*
|
* 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, either 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.
|
*
|
* You should have received a copy of the GNU Lesser General Public License
|
* along with this library; if not, write to the Free Software Foundation, Inc.,
|
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA or visit the web at
|
* http://www.gnu.org.
|
*
|
* $Id$
|
*/
|
|
package com.ximple.eofms.util.postjts;
|
|
import java.sql.SQLException;
|
|
import org.postgresql.util.PGobject;
|
|
import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
|
import com.vividsolutions.jts.geom.Geometry;
|
import com.vividsolutions.jts.geom.GeometryCollection;
|
import com.vividsolutions.jts.geom.GeometryFactory;
|
import com.vividsolutions.jts.geom.Polygon;
|
import com.vividsolutions.jts.geom.PrecisionModel;
|
import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory;
|
import com.vividsolutions.jts.io.WKTReader;
|
|
/**
|
* JTS Geometry SQL wrapper. Supports PostGIS 1.x (lwgeom hexwkb) for writing
|
* and both PostGIS 0.x (EWKT) and 1.x (lwgeom hexwkb) for reading.
|
*
|
* @author Markus Schaber
|
*/
|
|
public class JtsGeometry extends PGobject
|
{
|
/* JDK 1.5 Serialization */
|
private static final long serialVersionUID = 0x100;
|
|
Geometry geom;
|
|
final static JtsBinaryParser bp = new JtsBinaryParser();
|
|
final static JtsBinaryWriter bw = new JtsBinaryWriter();
|
|
final static PrecisionModel prec = new PrecisionModel();
|
|
final static CoordinateSequenceFactory csfac = PackedCoordinateSequenceFactory.DOUBLE_FACTORY;
|
|
final static GeometryFactory geofac = new GeometryFactory(prec, 0, csfac);
|
|
static final WKTReader reader = new WKTReader(geofac);
|
|
/**
|
* Constructor called by JDBC drivers
|
*/
|
public JtsGeometry()
|
{
|
setType("geometry");
|
}
|
|
public JtsGeometry(Geometry geom)
|
{
|
this();
|
this.geom = geom;
|
}
|
|
public JtsGeometry(String value) throws SQLException
|
{
|
this();
|
setValue(value);
|
}
|
|
public void setValue(String value) throws SQLException
|
{
|
geom = geomFromString(value);
|
}
|
|
public static Geometry geomFromString(String value) throws SQLException
|
{
|
try
|
{
|
value = value.trim();
|
if (value.startsWith("00") || value.startsWith("01"))
|
{
|
return bp.parse(value);
|
} else
|
{
|
Geometry result;
|
// no srid := 0 in JTS world
|
int srid = 0;
|
// break up geometry into srid and wkt
|
if (value.startsWith("SRID="))
|
{
|
String[] temp = value.split(";");
|
value = temp[1].trim();
|
srid = Integer.parseInt(temp[0].substring(5));
|
}
|
|
result = reader.read(value);
|
setSridRecurse(result, srid);
|
return result;
|
}
|
} catch (Exception E)
|
{
|
E.printStackTrace();
|
throw new SQLException("Error parsing SQL data:" + E);
|
}
|
}
|
|
/**
|
* Recursively set a srid for the geometry and all subgeometries
|
*/
|
public static void setSridRecurse(final Geometry geom, final int srid)
|
{
|
geom.setSRID(srid);
|
if (geom instanceof GeometryCollection)
|
{
|
final int subcnt = geom.getNumGeometries();
|
for (int i = 0; i < subcnt; i++)
|
{
|
setSridRecurse(geom.getGeometryN(i), srid);
|
}
|
} else if (geom instanceof Polygon)
|
{
|
Polygon poly = (Polygon) geom;
|
poly.getExteriorRing().setSRID(srid);
|
final int subcnt = poly.getNumInteriorRing();
|
for (int i = 0; i < subcnt; i++)
|
{
|
poly.getInteriorRingN(i).setSRID(srid);
|
}
|
}
|
}
|
|
public Geometry getGeometry()
|
{
|
return geom;
|
}
|
|
public String toString()
|
{
|
return geom.toString();
|
}
|
|
public String getValue()
|
{
|
return bw.writeHexed(getGeometry());
|
}
|
|
public Object clone()
|
{
|
JtsGeometry obj = new JtsGeometry(geom);
|
obj.setType(type);
|
return obj;
|
}
|
|
public boolean equals(Object obj)
|
{
|
if ((obj != null) && (obj instanceof JtsGeometry))
|
{
|
Geometry other = ((JtsGeometry) obj).geom;
|
if (this.geom == other)
|
{ // handles identity as well as both
|
// ==null
|
return true;
|
} else if (this.geom != null && other != null)
|
{
|
return other.equals(this.geom);
|
}
|
}
|
return false;
|
}
|
}
|