/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2007-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.ogr;
import java.io.IOException;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.io.ParseException;
import com.vividsolutions.jts.io.WKBReader;
import com.vividsolutions.jts.io.WKBWriter;
import com.vividsolutions.jts.io.WKTReader;
import com.vividsolutions.jts.io.WKTWriter;
/**
* Converts between JTS and OGR geometries
*
* @author Andrea Aime - GeoSolutions
*
*
* @source $URL:
* http://svn.osgeo.org/geotools/trunk/modules/unsupported/ogr/src/main/java/org/geotools
* /data/ogr/GeometryMapper.java $
*/
@SuppressWarnings("rawtypes")
abstract class GeometryMapper {
protected OGR ogr;
protected GeometryMapper(OGR ogr) {
this.ogr = ogr;
}
abstract Geometry parseOgrGeometry(Object geom) throws IOException;
abstract Object parseGTGeometry(Geometry geometry) throws IOException;
static class WKB extends GeometryMapper {
GeometryFactory geomFactory;
WKBReader wkbReader;
WKBWriter wkbWriter;
public WKB(GeometryFactory geomFactory, OGR ogr) {
super(ogr);
this.geomFactory = geomFactory;
this.wkbReader = new WKBReader(geomFactory);
this.wkbWriter = new WKBWriter();
}
/**
* Reads the current feature's geometry using wkb encoding. A wkbReader should be provided
* since it's not thread safe by design.
*
* @throws IOException
*/
Geometry parseOgrGeometry(Object geom) throws IOException {
int wkbSize = ogr.GeometryGetWkbSize(geom);
byte[] wkb = new byte[wkbSize];
ogr.CheckError(ogr.GeometryExportToWkb(geom, wkb));
try {
Geometry g = wkbReader.read(wkb);
return g;
} catch (ParseException pe) {
throw new IOException("Could not parse the current Geometry in WKB format.", pe);
}
}
Object parseGTGeometry(Geometry geometry) throws IOException {
byte[] wkb = wkbWriter.write(geometry);
int[] ret = new int[1];
Object result = ogr.GeometryCreateFromWkb(wkb, ret);
ogr.CheckError(ret[0]);
return result;
}
}
static class WKT extends GeometryMapper {
GeometryFactory geomFactory;
WKTReader wktReader;
WKTWriter wktWriter;
public WKT(GeometryFactory geomFactory, OGR ogr) {
super(ogr);
this.geomFactory = geomFactory;
this.wktReader = new WKTReader(geomFactory);
this.wktWriter = new WKTWriter();
}
/**
* Reads the current feature's geometry using wkb encoding. A wkbReader should be provided
* since it's not thread safe by design.
*
* @throws IOException
*/
Geometry parseOgrGeometry(Object geom) throws IOException {
int[] ret = new int[1];
String wkt = ogr.GeometryExportToWkt(geom, ret);
ogr.CheckError(ret[0]);
try {
return wktReader.read(wkt);
} catch (ParseException pe) {
throw new IOException("Could not parse the current Geometry in WKT format.", pe);
}
}
Object parseGTGeometry(Geometry geometry) throws IOException {
String wkt = wktWriter.write(geometry);
int[] ret = new int[1];
Object result = ogr.GeometryCreateFromWkt(wkt, ret);
ogr.CheckError(ret[0]);
return result;
}
}
}