/*
* JGrass - Free Open Source Java GIS http://www.jgrass.org
* (C) HydroloGIS - www.hydrologis.com
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Library General Public License as published by the Free
* Software Foundation; either version 2 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 Library General Public License for more
* details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; if not, write to the Free Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.jgrasstools.gears.io.dxfdwg.libs;
import java.awt.geom.Point2D;
import org.geotools.feature.simple.SimpleFeatureBuilder;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgArc;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgAttrib;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgCircle;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgLine;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgLwPolyline;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgMText;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgPoint;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgPolyline2D;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgPolyline3D;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgSolid;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.objects.DwgText;
import org.jgrasstools.gears.io.dxfdwg.libs.dwg.utils.GisModelCurveCalculator;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.CoordinateList;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LineString;
import com.vividsolutions.jts.geom.LinearRing;
import com.vividsolutions.jts.geom.MultiPoint;
import com.vividsolutions.jts.geom.Point;
import com.vividsolutions.jts.geom.Polygon;
public class GeometryTranslator {
private static final String LAYER = "layer";
private static final String THE_GEOM = "the_geom";
private static GeometryFactory gF = new GeometryFactory();
private final CoordinateReferenceSystem crs;
public GeometryTranslator( CoordinateReferenceSystem crs ) {
this.crs = crs;
}
/**
* Builds a point feature from a dwg text.
*/
public SimpleFeature convertDwgMText( String typeName, String layerName, DwgMText text, int id ) {
double[] p = text.getInsertionPoint();
Point2D pto = new Point2D.Double(p[0], p[1]);
Coordinate coord = new Coordinate(pto.getX(), pto.getY(), 0.0);
String textString = text.getText();
return createPointTextFeature(typeName, layerName, id, coord, textString);
}
/**
* Builds a point feature from a dwg text.
*
*/
public SimpleFeature convertDwgText( String typeName, String layerName, DwgText text, int id ) {
Point2D pto = text.getInsertionPoint();
Coordinate coord = new Coordinate(pto.getX(), pto.getY(), 0.0);
String textString = text.getText();
return createPointTextFeature(typeName, layerName, id, coord, textString);
}
/**
* Builds a point feature from a dwg attribute.
*/
public SimpleFeature convertDwgAttribute( String typeName, String layerName,
DwgAttrib attribute, int id ) {
Point2D pto = attribute.getInsertionPoint();
Coordinate coord = new Coordinate(pto.getX(), pto.getY(), attribute.getElevation());
String textString = attribute.getText();
return createPointTextFeature(typeName, layerName, id, coord, textString);
}
private SimpleFeature createPointTextFeature( String typeName, String layerName, int id,
Coordinate coord, String textString ) {
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, Point.class);
b.add("text", String.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry point = gF.createPoint(coord);
Object[] values = new Object[]{point, textString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
/**
* Builds a line feature from a dwg polyline 3D.
*
* TODO handle these as contourlines
*
*/
public SimpleFeature convertDwgPolyline3D( String typeName, String layerName,
DwgPolyline3D polyline3d, int id ) {
double[][] ptos = polyline3d.getPts();
CoordinateList coordList = new CoordinateList();
if (ptos != null) {
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j][0], ptos[j][1], ptos[j][2]);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, LineString.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry lineString = gF.createLineString(coordList.toCoordinateArray());
Object[] values = new Object[]{lineString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
return null;
}
/**
* Builds a line feature from a dwg polyline 2D.
*
*/
public SimpleFeature convertDwgPolyline2D( String typeName, String layerName,
DwgPolyline2D polyline2d, int id ) {
Point2D[] ptos = polyline2d.getPts();
CoordinateList coordList = new CoordinateList();
if (ptos != null) {
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY(), 0.0);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, LineString.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry lineString = gF.createLineString(coordList.toCoordinateArray());
Object[] values = new Object[]{lineString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
return null;
}
/**
* Builds a line feature from a dwg polyline 2D.
*
*/
public SimpleFeature convertDwgLwPolyline( String typeName, String layerName,
DwgLwPolyline lwPolyline, int id ) {
Point2D[] ptos = lwPolyline.getVertices();
if (ptos != null) {
CoordinateList coordList = new CoordinateList();
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY(), 0.0);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, LineString.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry lineString = gF.createLineString(coordList.toCoordinateArray());
Object[] values = new Object[]{lineString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
return null;
}
/**
* Builds a point feature from a dwg point.
*/
public SimpleFeature convertDwgPoint( String typeName, String layerName, DwgPoint point, int id ) {
double[] p = point.getPoint();
Point2D pto = new Point2D.Double(p[0], p[1]);
CoordinateList coordList = new CoordinateList();
Coordinate coord = new Coordinate(pto.getX(), pto.getY(), 0.0);
coordList.add(coord);
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, MultiPoint.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry points = gF.createMultiPoint(coordList.toCoordinateArray());
Object[] values = new Object[]{points, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
/**
* Builds a line feature from a dwg line.
*
*/
public SimpleFeature convertDwgLine( String typeName, String layerName, DwgLine line, int id ) {
double[] p1 = line.getP1();
double[] p2 = line.getP2();
Point2D[] ptos = new Point2D[]{new Point2D.Double(p1[0], p1[1]),
new Point2D.Double(p2[0], p2[1])};
CoordinateList coordList = new CoordinateList();
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY(), 0.0);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, LineString.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry lineString = gF.createLineString(coordList.toCoordinateArray());
Object[] values = new Object[]{lineString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
/**
* Builds a polygon feature from a dwg circle.
*
*/
public SimpleFeature convertDwgCircle( String typeName, String layerName, DwgCircle circle,
int id ) {
double[] center = circle.getCenter();
double radius = circle.getRadius();
Point2D[] ptos = GisModelCurveCalculator.calculateGisModelCircle(new Point2D.Double(
center[0], center[1]), radius);
CoordinateList coordList = new CoordinateList();
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY(), 0.0);
coordList.add(coord);
}
// close to create a polygon
if ((ptos[ptos.length - 1].getX() != ptos[0].getX())
|| (ptos[ptos.length - 1].getY() != ptos[0].getY())) {
Coordinate coord = new Coordinate(ptos[0].getX(), ptos[0].getY(), 0.0);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, Polygon.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
LinearRing linearRing = gF.createLinearRing(coordList.toCoordinateArray());
Geometry polygon = gF.createPolygon(linearRing, null);
Object[] values = new Object[]{polygon, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
/**
* Builds a polygon feature from a dwg solid.
*
*/
public SimpleFeature convertDwgSolid( String typeName, String layerName, DwgSolid solid, int id ) {
double[] p1 = solid.getCorner1();
double[] p2 = solid.getCorner2();
double[] p3 = solid.getCorner3();
double[] p4 = solid.getCorner4();
Point2D[] ptos = new Point2D[]{new Point2D.Double(p1[0], p1[1]),
new Point2D.Double(p2[0], p2[1]), new Point2D.Double(p3[0], p3[1]),
new Point2D.Double(p4[0], p4[1])};
CoordinateList coordList = new CoordinateList();
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY());
coordList.add(coord);
}
coordList.closeRing();
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, Polygon.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
LinearRing linearRing = gF.createLinearRing(coordList.toCoordinateArray());
Geometry polygon = gF.createPolygon(linearRing, null);
Object[] values = new Object[]{polygon, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
/**
* Builds a line feature from a dwg arc.
*/
public SimpleFeature convertDwgArc( String typeName, String layerName, DwgArc arc, int id ) {
double[] c = arc.getCenter();
Point2D center = new Point2D.Double(c[0], c[1]);
double radius = (arc).getRadius();
double initAngle = Math.toDegrees((arc).getInitAngle());
double endAngle = Math.toDegrees((arc).getEndAngle());
Point2D[] ptos = GisModelCurveCalculator.calculateGisModelArc(center, radius, initAngle,
endAngle);
CoordinateList coordList = new CoordinateList();
for( int j = 0; j < ptos.length; j++ ) {
Coordinate coord = new Coordinate(ptos[j].getX(), ptos[j].getY(), 0.0);
coordList.add(coord);
}
SimpleFeatureTypeBuilder b = new SimpleFeatureTypeBuilder();
b.setName(typeName);
b.setCRS(crs);
b.add(THE_GEOM, LineString.class);
b.add(LAYER, String.class);
SimpleFeatureType type = b.buildFeatureType();
SimpleFeatureBuilder builder = new SimpleFeatureBuilder(type);
Geometry lineString = gF.createLineString(coordList.toCoordinateArray());
Object[] values = new Object[]{lineString, layerName};
builder.addAll(values);
return builder.buildFeature(typeName + "." + id);
}
}