/**
* Copyright (C) 2014 Cohesive Integrations, LLC (info@cohesiveintegrations.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.di2e.ecdr.search.transform.atom.geo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.abdera.ext.geo.Box;
import org.apache.abdera.ext.geo.Coordinate;
import org.apache.abdera.ext.geo.Coordinates;
import org.apache.abdera.ext.geo.Line;
import org.apache.abdera.ext.geo.Point;
import org.apache.abdera.ext.geo.Polygon;
import org.apache.abdera.ext.geo.Position;
import org.geotools.geometry.jts.JTS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.LinearRing;
/**
* Converts abdera geometry shapes into other formats
*/
public final class AbderaConverter {
private static final Logger LOGGER = LoggerFactory.getLogger( AbderaConverter.class );
private AbderaConverter() {
}
public static String convertToWKT( Point point ) {
GeometryFactory geometryFactory = new GeometryFactory();
return geometryFactory.createPoint( convertCoordinateToJTS( point.getCoordinate() ) ).toText();
}
public static String convertToWKT( Line line ) {
GeometryFactory geometryFactory = new GeometryFactory();
return geometryFactory.createLineString( convertCoordinatesToJTS( line.getCoordinates() ) ).toText();
}
public static String convertToWKT( Polygon polygon ) {
GeometryFactory geometryFactory = new GeometryFactory();
LinearRing ring = geometryFactory.createLinearRing( convertCoordinatesToJTS( polygon.getCoordinates() ) );
return geometryFactory.createPolygon( ring, new LinearRing[0] ).toText();
}
public static String convertToWKT( Box box ) {
com.vividsolutions.jts.geom.Coordinate coord1 = convertCoordinateToJTS( box.getLowerCorner() );
com.vividsolutions.jts.geom.Coordinate coord2 = convertCoordinateToJTS( box.getUpperCorner() );
return JTS.toGeometry( new Envelope( coord1, coord2 ) ).toText();
}
public static String convertToMultiPointWKT( Collection<Position> points ) {
GeometryFactory geometryFactory = new GeometryFactory();
com.vividsolutions.jts.geom.Point[] pointArray = new com.vividsolutions.jts.geom.Point[points.size()];
Iterator<Position> pointIterator = points.iterator();
for ( int i = 0; i < points.size(); i++ ) {
pointArray[i] = geometryFactory.createPoint( convertCoordinateToJTS( ((Point) pointIterator.next()).getCoordinate() ) );
}
return geometryFactory.createMultiPoint( pointArray ).toText();
}
public static String convertToMultiLineStringWKT( Collection<Position> lines ) {
GeometryFactory geometryFactory = new GeometryFactory();
com.vividsolutions.jts.geom.LineString[] lineArray = new com.vividsolutions.jts.geom.LineString[lines.size()];
Iterator<Position> lineIterator = lines.iterator();
for ( int i = 0; i < lines.size(); i++ ) {
lineArray[i] = geometryFactory.createLineString( convertCoordinatesToJTS( ((Line) lineIterator.next()).getCoordinates() ) );
}
return geometryFactory.createMultiLineString( lineArray ).toText();
}
public static String convertToMultiPolygonWKT( Collection<Position> polygons ) {
GeometryFactory geometryFactory = new GeometryFactory();
com.vividsolutions.jts.geom.Polygon[] polygonArray = new com.vividsolutions.jts.geom.Polygon[polygons.size()];
Iterator<Position> polygonIterator = polygons.iterator();
for ( int i = 0; i < polygons.size(); i++ ) {
Position position = polygonIterator.next();
if ( position instanceof Box ) {
Box box = (Box) position;
com.vividsolutions.jts.geom.Coordinate coord1 = convertCoordinateToJTS( box.getLowerCorner() );
com.vividsolutions.jts.geom.Coordinate coord2 = convertCoordinateToJTS( box.getUpperCorner() );
polygonArray[i] = JTS.toGeometry( new Envelope( coord1, coord2 ) );
//LinearRing ring = geometryFactory.createLinearRing( convertCoordinatesToJTS( box.getCoordinates() ) );
//polygonArray[i] = geometryFactory.createPolygon( ring, new LinearRing[0] );
} else {
Polygon polygon = (Polygon) position;
LinearRing ring = geometryFactory.createLinearRing( convertCoordinatesToJTS( polygon.getCoordinates() ) );
polygonArray[i] = geometryFactory.createPolygon( ring, new LinearRing[0] );
}
}
return geometryFactory.createMultiPolygon( polygonArray ).toText();
}
public static String convertToGeometryCollection( Collection<Position> positions ) {
GeometryFactory geometryFactory = new GeometryFactory();
com.vividsolutions.jts.geom.Geometry[] geometryArray = new com.vividsolutions.jts.geom.Geometry[positions.size()];
Iterator<Position> positionIterator = positions.iterator();
for ( int i = 0; i < positions.size(); i++ ) {
Position position = (Position) positionIterator.next();
if ( position instanceof Point ) {
Point point = (Point) position;
geometryArray[i] = geometryFactory.createPoint( convertCoordinateToJTS( point.getCoordinate() ) );
} else if ( position instanceof Line ) {
Line line = (Line) position;
geometryArray[i] = geometryFactory.createLineString( convertCoordinatesToJTS( line.getCoordinates() ) );
} else if ( position instanceof Box ) {
Box box = (Box) position;
com.vividsolutions.jts.geom.Coordinate coord1 = convertCoordinateToJTS( box.getLowerCorner() );
com.vividsolutions.jts.geom.Coordinate coord2 = convertCoordinateToJTS( box.getUpperCorner() );
geometryArray[i] = JTS.toGeometry( new Envelope( coord1, coord2 ) );
} else {
Polygon polygon = (Polygon) position;
LinearRing ring = geometryFactory.createLinearRing( convertCoordinatesToJTS( polygon.getCoordinates() ) );
geometryArray[i] = geometryFactory.createPolygon( ring, new LinearRing[0] );
}
}
return geometryFactory.createGeometryCollection( geometryArray ).toText();
}
public static String convertToWKT( Position position ) {
if ( position instanceof Point ) {
return convertToWKT( (Point) position );
} else if ( position instanceof Line ) {
return convertToWKT( (Line) position );
} else if ( position instanceof Polygon ) {
return convertToWKT( (Polygon) position );
} else if ( position instanceof Box ) {
return convertToWKT( (Box) position );
} else {
LOGGER.warn( "No conversion available for the abdera geo position of type {}.", position.getClass().getName() );
return null;
}
}
public static String convertToWKT( Position[] positions ) {
boolean isPoint = false;
boolean isLine = false;
boolean isPolygon = false;
int uniqueGeos = 0;
List<Position> geos = new ArrayList<Position>();
for ( Position position : positions ) {
if ( position instanceof Point ) {
geos.add( position );
if ( !isPoint ) {
uniqueGeos++;
isPoint = true;
}
} else if ( position instanceof Line ) {
geos.add( position );
if ( !isLine ) {
uniqueGeos++;
isLine = true;
}
} else if ( position instanceof Polygon ) {
geos.add( position );
if ( !isPolygon ) {
uniqueGeos++;
isPolygon = true;
}
} else if ( position instanceof Box ) {
geos.add( position );
if ( !isPolygon ) {
uniqueGeos++;
isPolygon = true;
}
} else {
LOGGER.warn( "No conversion available for abdera geo position of type {}.", position.getClass().getName() );
}
}
if ( geos.isEmpty() ) {
return null;
} else if ( geos.size() == 1 ) {
return convertToWKT( geos.get( 0 ) );
} else {
if ( uniqueGeos > 1 ) {
return convertToGeometryCollection( geos );
} else if ( isPoint ) {
return convertToMultiPointWKT( geos );
} else if ( isLine ) {
return convertToMultiLineStringWKT( geos );
} else {
return convertToMultiPolygonWKT( geos );
}
}
}
public static com.vividsolutions.jts.geom.Coordinate convertCoordinateToJTS( Coordinate coordinate ) {
return new com.vividsolutions.jts.geom.Coordinate( coordinate.getLongitude(), coordinate.getLatitude() );
}
public static com.vividsolutions.jts.geom.Coordinate[] convertCoordinatesToJTS( Coordinates coordinates ) {
List<com.vividsolutions.jts.geom.Coordinate> jtsCoords = new ArrayList<com.vividsolutions.jts.geom.Coordinate>();
for ( Iterator<Coordinate> iterator = coordinates.iterator(); iterator.hasNext();) {
jtsCoords.add( convertCoordinateToJTS( iterator.next() ) );
}
return jtsCoords.toArray( new com.vividsolutions.jts.geom.Coordinate[jtsCoords.size()] );
}
}