Subversion Repositories hibernate-spatial

Rev

Rev 147 | Rev 149 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * $Id:$
 *
 * This file is part of Hibernate Spatial, an extension to the
 * hibernate ORM solution for geographic data.
 *
 * Copyright © 2009 Geovise BVBA
 *
 * 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, or (at your option) any later version.
 *
 * 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
 *
 * For more information, visit: http://www.hibernatespatial.org/
 */

package org.hibernatespatial.sqlserver.convertors;

import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.LineString;

class LineStringEncoder extends AbstractEncoder<LineString> {

    private final static Figure LINESTRING_FIGURE = new Figure(FigureAttribute.Stroke, 0);

    private final static Shape LINESTRING_SHAPE = new Shape(-1, 0, OpenGisType.LINESTRING);


    protected void encodePoints(SqlGeometryV1 nativeGeom, Geometry geom) {
        if (geom.getNumPoints() == 2) {
            encodeSingleLineSegment(nativeGeom, geom);
        } else {
            super.encodePoints(nativeGeom, geom);
        }
    }

    private void encodeSingleLineSegment(SqlGeometryV1 nativeGeom, Geometry geom) {
        nativeGeom.setIsSingleLineSegment();
        Coordinate[] coords = geom.getCoordinates();
        setCoordinate(nativeGeom, 0, coords[0]);
        setCoordinate(nativeGeom, 1, coords[1]);
    }

    protected void setCoordinate(SqlGeometryV1 nativeGeom, int idx, Coordinate coordinate) {
        if (!nativeGeom.hasZValues() && !Double.isNaN(coordinate.z)) {
            nativeGeom.setHasZValues();
        }
        nativeGeom.setCoordinate(idx, coordinate);
    }

    protected void encodeFigures(SqlGeometryV1 nativeGeom, Geometry geometry) {
        nativeGeom.setNumberOfFigures(1);
        nativeGeom.setFigure(0, LINESTRING_FIGURE);
    }

    protected void encodeShapes(SqlGeometryV1 nativeGeom, Geometry geometry) {
        nativeGeom.setNumberOfShapes(1);
        nativeGeom.setShape(0, LINESTRING_SHAPE);
    }


    public boolean accepts(Geometry geom) {
        return geom instanceof LineString;
    }
}