package com.ximple.io.dgn7;
|
|
import org.apache.log4j.Logger;
|
|
import com.vividsolutions.jts.geom.Geometry;
|
import com.vividsolutions.jts.geom.GeometryFactory;
|
import com.vividsolutions.jts.geom.LinearRing;
|
import com.vividsolutions.jts.geom.Coordinate;
|
|
/**
|
* ShapeElement
|
*
|
* @author Ulysses
|
* @version 0.1
|
* @since 2006/5/18 下午 03:08:43
|
*/
|
public class ShapeElement extends LineStringElement implements GeometryConverter
|
{
|
private static final Logger logger = Logger.getLogger(ShapeElement.class);
|
|
public ShapeElement(byte[] raw)
|
{
|
super(raw);
|
}
|
|
public Coordinate[] getVertices()
|
{
|
Coordinate[] result = super.getVertices();
|
if ((result != null) && (result.length > 2))
|
{
|
boolean isClosed = result[0].equals2D(result[result.length - 1]);
|
if (!isClosed)
|
{
|
double distance = result[0].distance(result[result.length - 1]);
|
if (distance < 0.00210)
|
{
|
result[result.length - 1] = new Coordinate(result[0]);
|
} else
|
{
|
logger.info("Shape is not closed. distance=" + distance);
|
logger.debug("result[0]=" + result[0].toString());
|
logger.debug("result[length - 1]=" + result[result.length - 1]);
|
}
|
}
|
}
|
|
return result;
|
}
|
|
public Geometry toGeometry(GeometryFactory factory)
|
{
|
try
|
{
|
LinearRing ring = factory.createLinearRing(this.getVertices());
|
return factory.createPolygon(ring, null);
|
} catch (IllegalArgumentException e)
|
{
|
logger.warn(e.getMessage(), e);
|
return null;
|
}
|
}
|
|
public static class ElementHandler extends Element.ElementHandler
|
{
|
private static ElementHandler instance = null;
|
|
public ElementHandler()
|
{
|
super(ElementType.SHAPE);
|
}
|
|
public static IElementHandler getInstance()
|
{
|
if (instance == null)
|
{
|
instance = new ElementHandler();
|
}
|
|
return instance;
|
}
|
|
protected Element createElement(byte[] raw)
|
{
|
return new ShapeElement(raw);
|
}
|
}
|
}
|