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); } } }