blob: 0127274136fd90ab5c656168c6d9f686c615f5cc [file] [log] [blame]
<html>
<head>
<title>JTS Version History</title>
</head>
<body bgcolor='#DFF0FF'>
<h1 style='text-align:center; color:darkblue;'>
JTS TOPOLOGY SUITE
<br>
<i>Version History</i>
</h1>
This document lists the change history of release versions of the
<span style='color:darkblue;'><b>JTS Topology Suite</b></span>.
<ul>
<li>Project site: <a href='http://locationtech.org/projects/technology.jts'><b>LocationTech JTS </b></a>
<li>Code repo: <a href='https://github.com/locationtech/jts'><b>Github JTS</b></a>
<li>Distribution: <a href='https://github.com/locationtech/jts/releases'><b>Github JTS Releases</b></a>
</ul>
<p>
The JTS distributions for older versions can be obtained at the
<a href='http://sourceforge.net/projects/jts-topo-suite/'><b>SourceForge JTS site</b></a>.
</p>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.15</h2>
<i>Release Date: November 30, 2017</i>
<h3>Project Changes</h3>
<ul>
<li>Changed licensing to dual-licensed EDL or EPL
<li>Changed source hosting to GitHub
<li>Changed distro hosting to GitHub
<li>Changed build chain to use Maven
<li>Changed code module structure
</ul>
<h3>API Changes</h3>
<ul>
<li>Changed Java package root to <code>org.locationtech.jts</code>
<li>Refactored <code>CGAlgorithms</code> into function-specific classes
<code>Orientation</code>, <code>PointLocation</code>, <code>Distance</code>, <code>Length</code>, <code>Area</code>
<li>Deprecated <code>NonRobustCGAlgorithms</code>; use function-specific classes refactored from <code>CGAlgorithms</code>
<li>Deprecated <code>RobustDeterminant</code>; use <code>CGAlgorithmsDD</code>
<li>Deprecated <code>Geometry.clone</code>; use <code>Geometry.copy</code>
<li>Deprecated <code>GeometryFactory.createX(null)</code> methods; Use no-argument <code>GeometryFactory.createX</code> methods
<li>Deprecated overloaded <code>GeometryFactory.createMultiPoint</code>; use <code>GeometryFactory.createMultiPointFromCoords</code>
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li>Improve <code>Quadtree</code> to handle queries with null envelopes
<li>Add <code>STRtree</code> K-Nearest Neighbours query
<li>Add <code>Serializable</code> to </code><code>PackedCoordinateSequence</code>
<li>Add <code>Envelope.intersects</code>
<li>Add <code>Geometry.intersects</code> for <code>GeometryCollection</code>
<li>Improve <code>WKBReader</code> to handle the OGC 06-103r4 specification.
<li>Improve <code>WKTReader</code> to handle <code>Z</code>, <code>M</code>, <code>ZM</code> modifiers.
</ul>
<h3>Performance & Robustness Improvements</h3>
<ul>
<li>Add optimization for <code>Geometry.contains</code> and <code>Geometry.covers</code>
<li>Improve robustness of <code>RayCrossingCounter</code> and <code>Geometry.contains</code>
<li>Improve robustness of <code>MultiPolygon</code> centroid computation
<li>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Eliminated <code>LineString.normalize</code> side-effects
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added function <code>Writer.writeGeoJSON</code>
<li>Added tree view of scalar functions
<li>Added ability to repeat functions
<li>Added custom fill styling
<li>Added <code>SelectionFunctions</code> for metrics (area, length)
<li>Added function documentation driven by annotations
<li>Some changes to layout of GUI elements (such as toolbar)
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.14</h2>
<i>Release Date: September 23, 2015</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <code>Envelope.compareTo</code> method
<li>Fixed <code>SegmentSetMutualIntersector</code> classes to be thread-safe</li>
<li>Fixed <code>PreparedGeometry</code> classes to be thread-safe</li>
<li>Added <code>LineDissolver</code> class
<li>Added <code>edgegraph</code> package
<li>Added <code>CoordinateSequences.isEqual</code> method
<li>Extended <code>CoordinateSequences.copy</code> and <code>CoordinateSequences.copy</code> to handle inputs of different dimension
<li>Added <code>CoordinateArrays.envelope()</code> function
<li>Added <code>CoordinateArrays.intersection()</code> function
<li>Added <code>Polygonizer.setCheckValidRings()</code> method for optimizing performance in some situations
<li>Added <code>KMLWriter</code> to convert Geometry to KML representation
<li>Added <code>Coordinate</code> <code>equals3D</code>, <code>equals2D(Coordinate, tolerance)</code>, and <code>equalInZ</code> methods.
<li>Added <code>VWSimplifier</code> to perform Visvalingam-Whyatt simplification
<li>Enhanced <code>WKBReader</code> to handle Spatialite WKB format
<li>Added <code>DD.setValue()</code> methods
<li>Added <code>getGeometry()</code> methods to <code>LinearComponentExtracter</code> and <code>LineStringExtracter</code>
<li>Added <code>BufferParameters</code> </code>simplifyFactor</code> setting
<li>Added node counting and ability to not keep intersection points to <code>InteriorIntersectionFinder</code>
<li>Added <code>Polygonizer</code> functionality to extract only polygons forming a valid polygonal geometry
<li>Added <code>KdTree.toCoordinates</code>
<li>Added <code>MinimumBoundingCircle.getFarthestPoints</code> method
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Performance & memory improvement in <tt>PreparedPolygonIntersects</tt> by short-circuiting point input case
<li>Allow for memory usage optimization in <code>CascadedPolygonUnion</code>, by avoiding retaining input collection
<li>Fix <code>Point.isEmpty()</code> to avoid allocating a coordinate
<li>Fix <code>Geometry.equalsExact()</code> to short-circuit when the inputs are identical objects
<li>Add short-circuit to <code>PointExtracter</code> to improve performance for Points
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed <code>RobustLineIntersector</code> heuristic for handling invalid intersection points
(computed as outside envelope of input segments due to numeric precision issues)
<li>Fixed <code>CGAlgorithmsDD.intersection</code> to compute intersection correctly
<li>Fixed <tt>Geometry.interiorPoint()</tt> to compute a true interior point in certain cases
<li>Fixed <code>Geometry.equals</code> to handle null argument
<li>Fixed <code>DistanceToPoint</code> to be thread-safe
<li>Fixed <code>Geometry.interiorPoint()</code> and <code>InteriorPointArea</code> to handle zero-area geometries
<li>Fixed <code>STRtree</code> classes to be thread-safe (by synchronizing the <code>AbstractSTRtree.build()</code> method)
<li>Fixed <code>STRtree.remove()</code> method to avoid a NPE
<li>Fixed <code>DouglasPeuckerSimplifier</code> and <code>TopologyPreservingSimplifier</code> to handle empty geometry components in the input
<li>Fixed <code>ConvexHull</code> to handle input of array of identical coordinates
<li>Fixed <code>GeometryTransformer.transformLinearRing()</code> to handle null inputs
<li>Fixed the <code>extractPoint(distance, offset)</code> methods in
<code>LocationIndexedLine</code> and <code>LengthIndexedLine</code> to handle offsets from endpoints correctly.
<li>Fixed <code>GeometryCollectionIterator</code> to correctly handle atomic geometries
<li>Fixed <code>InteriorIntersectionFinder</code> to not short-circuit when finding all nodes
<li>Fixed <code>SubgraphDepthLocator</code> to work with Java 7+ by avoiding sorting with an inconsistent ordering
<li>Fixed <code>FontGlyphReader</code> to use correct Java font value of "SansSerif", and added new constant to match.
<li>Fixed <code>KdTree</code> to correctly implement distance tolerance-based coordinate matching
<li>Fixed <code>LineString.normalize()</code> to correctly handle CoordinateSequences
<li>Fixed <code>CommonBitsRemover</code> to correctly handle CoordinateSequences
<li>Fixed bug in <code>CoordinateArraySequence.clone()</code>
</ul>
<h3>API Changes</h3>
<ul>
<li>Changed interface of <code>SegmentSetMutualIntersector</code> to support thread-safety by removing state
<li>Provided <code>InteriorIntersectionFinderAdder</code> to replace the poorly named <code>IntersectionFinderAdder</code>
<li>Changed some classes in <code>com.vividsolutions.jts.operation.buffer</code> to be package-private
</ul>
<h3>Testing Improvements</h3>
<ul>
<li>Added <code>GeometryTestCase</code> base class to simplify unit tests
</ul>
<!------- JTS-IO -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS I/O</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <code>GeoJsonReader</code> and <code>GeoJsonWriter</code> classes
</ul>
<h3>API Changes</h3>
<ul>
<li>In <code>OraWriter</code> the connection is now provided to the <code>write()</code> method, not the constructors
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed <code>OraReader</code> to handle reading <code>GeometryCollection</code> with <code>Point</code> as second element
<li>Many improvements to Oracle API code and performance
<li>Added <code>OraWriter.setOptimizePoint</code> and <code>OraWriter.setOptimizeRectangle</code> methods
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added ability to read multiple WKBHex geometries from a text file
<li>Added AutoZoom to input
<li>Added Oracle text output
<li>Added more function sets
<li>Removed dependency on Acme GIF encoder library
<li>Improved zooming logic
<li>Added mouse wheel zooming
<li>Improved UI for editing A/B geometries
<li>Added <b>Compute New</b> button to Geometry Functions panel
<li>Added SpatialIndex functions
<li>Added User Data labelling
</ul>
<h3>UI Changes</h3>
<ul>
<li>Moved Options menu items to View menu
<li>Removed Tools menu items (they are available as functions)
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed to correctly handle changing Swing Look&Feel
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.13</h2>
<i>Release Date: December 13, 2012</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Changed <tt>GeometryFactory.createGeometry()</tt> to make a deep copy of the argument Geometry,
using the CoordinateSequenceFactory of the factory
<li>Added ability to specify a dimension in <tt>CoordinateArraySequence</tt>
<li>Changed <tt>Geometry.getEnvelopeInternal()</tt> to return a copy of the cached envelope, to prevent modification
<li>Added <tt>GeometryEditor.CoordinateSequenceOperation</tt> to allow easy editing of constituent CoordinateSequences
<li>Added <tt>GeometryFactory.createPolygon</tt> convenience methods which do not require holes to be specified
<li><tt>Geometry</tt> overlay methods now return empty results as atomic types of appropriate dimension
<li>Added <tt>RectangleLineIntersector</tt> to provide efficient rectangle-line intersection testing
<li>Added <tt>getOrdinate</tt> and <tt>setOrdinate</tt> to <tt>Coordinate</tt>
<li><tt>Quadtree</tt> is <tt>Serializable</tt>
<li><tt>STRtree</tt> is <tt>Serializable</tt>
<li>Added <tt>max</tt>, <tt>average</tt> and <tt>wrap</tt> functions to <tt>MathUtil</tt>
<li>Improved <tt>WKTReader</tt> parse error reporting to report input line of error
<li>Improved <code>WKBReader</code> to repair structurally-invalid input
<li>Made <tt>TopologyPreservingSimplifier</tt> thread-safe
<li>Added <tt>AbstractSTRtree.isEmpty()</tt> method
<li>Added <tt>QuadTree.isEmpty()</tt> method
<li>Added <tt>KdTree.isEmpty()</tt> method
<li>Added decimation and duplicate point removal to </tt>ShapeWriter<tt>.
<li><tt>ScaledNoder</tt> now preserves Z values of input
<li>Added instance methods for all <t>Triangle</tt> static methods
<li>Added <tt>CGAlgorithmsDD</tt> containing high-precision versions of some basic CG algorithms
<li>Added <tt>IntersectionMatrix.isTrue()</tt> method for testing IM pattern matches
<li>Added <code>getRawCoordinates</code> methods to <code>PackedCoordinateSequence</code> concrete classes
<li>Modified <code>Geometry.isSimple()</code> to explicity check for simplicity for all types,
and support <code>GeometryCollections</code>
<li>Improved <code>MCIndexSnapRounder</code> to add nodes only where they are necessary
<li>Added <code>CoordinateArrays.removeNull()</code> method
<li>Enhanced <code>GeometryEditor</code> to handle null geometries returned from operation
<li>Added <code>WKBHExFileReader</code>
<li>Added <code>Distance3D</code> operation
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Simplified & improved performance of <tt>RectangleIntersects</tt> by using new <tt>RectangleLineIntersector</tt>
<li>In <tt>RandomPointsInGridBuilder</tt> eliminated redundant <tt>ArrayList</tt> usage
<li>In <tt>PreparedPolygonIntersects</tt> and <tt>PreparedLineStringIntersects</tt> added check
to avoid creating segment index if all test inputs are points
<li>In <tt>AbstractSTRtree</tt> switched to using indexed list access for better performance than using iterators
<li>In <tt>AbstractSTRtree</tt> freed inserted item array after index is built
<li>Improved performance of <tt>Polygonizer</tt> for cases with many potential holes
<li>Improved performance for some <tt>DD</tt> methods by making them <tt>final</tt>
<li>Added fast filter for <tt>CGAlgorithmsDD.orientationIndex</tt>, and switched to self-operations for DD determinant
<li>Changed <code>STRtree.createNode()</code> to use a static class for nodes
<li>Changed <code>QuadTree Node</code> to use scalar x and y variables rather than a <code>Coordinate</code> to reduce memory allocation
<li>Fixed <code>PreparedGeometry</code> concrete classes to be thread-safe.
<li>Fixed <code>SortedPackedIntervalRTree</code> so that it is thread-safe.
</ul>
<h3>Robustness Improvements</h3>
<ul>
<li>Switched to using DD extended-precision arithmetic to compute orientation predicate
<li><code>CGAlgorithms.distanceLineLine()</code> improved to be more robust and performant
<li>Fixed robustness issue causing <tt>Empty Stack</tt> failure
in <tt>ConvexHull</tt> for some nearly collinear inputs
<li><tt>CGAlgorithms.signedArea()</tt> uses a more accurate algorithm
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed <tt>Geometry.equalsExact()</tt> to avoid NPE when comparing empty and non-empty <tt>Point</tt>s
<li>Fixed <tt>CascadedPolygonUnion</tt> to discard non-polygonal components created during unioning,
to avoid failures and provide more desirable behaviour
<li>Fixed <tt>CentralEndpointIntersector</tt> to initialize result correctly
<li>Fixed <tt>DelaunayTriangulationBuilder.extractUniqueCoordinates(Geometry)</tt>
to avoid mutating the vertex order of the input Geometry
<li>Fixed <tt>ConformingDelaunayTriangulationBuilder</tt> to allow
non-disjoint site and constraint vertex sets
<li>Fixed <tt>RandomPointsInGridBuilder</tt> point generation to use circle constraint correctly
<li>Fixed Linear Referencing API to handle MultiLineStrings consistently,
by always using the lowest possible index value, and by trimming zero-length components from results
<li>Fixed bug in <tt>LocationIndexedLine</tt> and <tt>LengthIndexLine</tt> which was
causing an assertion failure when the indexOfAfter() method was called with a constraint location
which is at the end of the line
<li>Fixed bug in <tt>STRtree.query(Envelope, ItemVisitor)</tt> causing an NPE when tree is empty
<li>Fixed issue with creating zero-length edges during buffer topology building under fixed precision, by:
adding filter to remove zero-length edges;
using a better estimate of scale factor for reducing to fixed precision after initial failure.
<li>Fixed <tt>TopologyPreservingSimplifier</tt> to return a valid result
for closed <tt>LineString</tt>s with large distance tolerances
<li>Fixed <tt>TopologyPreservingSimplifier</tt> to return an empty result for an empty input
<li>Fixed <tt>DouglasPeuckerSimplifier</tt> to return an empty result for an empty input
<li>Fixed <tt>MinimumBoundingCircle</tt> to correctly compute circle for obtuse triangles.
<li>Fixd <tt>GeometryPrecisionReducer</tt> to use input GeometryFactory when polygon topology is fixed
<li>Fixed <tt>GeometryNoder</tt> bug that was failing to snap to end vertices of lines
<li>Fixed <tt>Geometry.getCentroid()</tt> and <tt>Geometry.getInteriorPoint()</tt> to return <tt>POINT EMPTY</tt> for empty inputs
<li>Fixed <tt>DelaunayTriangulationBuilder</tt> to correctly extract unique points
<li>Fixed <tt>KdTree</tt> to correctly handle inserting duplicate points into an empty tree
<li>Fixed <tt>LineSegment.projectionFactor()</tt> to handle zero-length lines (by returning Double.POSITIVE_INFINITY)
<li>Fixed <tt>LocationIndexedLine</tt> to handle locations on zero-length lines
<li>Fixed <code>LengthIndexedLine</code> and <code>LocationIndexedLine</code> to handle <code>indexOfAfter()</code> correctly
<li>Fixed <code>WKBReader</code> to handle successive geometrys with different endianness
<li>Fixed <code>GeometricShapeFactory</code> to correctly handle setting the centre point
<li>Fixed <code>GeometryFactory.createMultiPoint(CoordinateSequence)</code> to handle sequences of dimension &gt; 3
</ul>
<h3>API Changes</h3>
<ul>
<li>Changed visibility of <tt>TaggedLineStringSimplifier</tt> back to <tt>public</tt> due to user demand
</ul>
<h3>Testing</h3>
<ul>
<li>Added Performance Testing framework (<tt>PerformanceTestRunner</tt>
and <tt>PerformanceTestCase</tt>)
<li>Added named predicate tests to all Relate test cases
</ul>
<h3>Contributors</h3>
<ul>
<li>Peter Hopfgartner - improved area computation
<li>Michael Michaud - snap-rounding improvements
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added segment index visualization styling
<li>Improved <b>Geometry Inspector</b>
<li>Added stream digitizing for Polygon and LineString tools
<li>Added output of Test Case XML with WKB
<li>Added Extract Component tool
<li>Added Delete Vertices Or Components tool
<li>Added Geometry Edit Panel pop-up menu, with operations
<li>Added Halton sequence functions
<li>Added sorting functions
<li>Added function for selection of first N components
<li>Added CGAlgorithms functions
<li>Added ability to paste and load multiple WKBHex geometries
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Using decimation substantially improves rendering time for large geometries.
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed bug in saving XML test files
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.12</h2>
<i>Release Date: June 30, 2011</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added new names for methods for computing <tt>Geometry</tt> equality:
<li><tt>equals(Object)</tt> is a synonym for <tt>equalsExact(Geometry)</tt>
<li><tt>equalsNorm(Geometry)</tt> automatically normalizes the operands
<li><tt>equalsTopo(Geometry)</tt> computes topological equality,
and is a synonym for the original <tt>equals(Geometry)</tt>
</ul>
<li>Added <tt>Geometry.norm()</tt> to provide non-mutating normalization
<li>Added <tt>Geometry.hashCode()</tt> to fulfill Java conventions
<li>Added <tt>LineIntersector.getEndpoint()</tt> method
<li>Added methods to <tt>CoordinateSequences</tt> to test for and create valid rings
<li>Added <tt>minExtent</tt> and <tt>maxExtent</tt> to <tt>Envelope</tt>
<li>Added ability to compute Single-Sided Buffers (invoked via <tt>BufferOp</tt> and <tt>BufferParameters</tt>)
<li>Added <tt>GeometryPrecisionReducer</tt>
<li>Added ExtendedWKB SRID support to <tt>WKBWriter</tt> (thanks to Justin Deoliviera)
<li>Improved <tt>PolygonShape</tt> to support floating-point coordinates
<li>Added <tt>GeometryShapeFactory.setRotation(double radians)</tt> method
<li>Added <tt>GeometricShapeBuilder</tt> API to support shape builder development
<li>Added <tt>RandomPointsBuilder</tt> to allow generating various random point sets
<li>Added <tt>RandomPointsInGridBuilder</tt> to allow generating various random point sets constrained to a grid
<li>Added <tt>KochSnowflakeBuilder</tt>
<li>Added <tt>SierpinskiCarpetBuilder</tt>
<li>Added <tt>MathUtil</tt> containing mathematics and numerical utility functions
<li>Added <tt>Vector2D</tt> class providing vector operations
<li>Added <tt>DirectedEdgeStar.getNextCWEdge()</tt> method to <tt>planargraph</tt> API
<li><tt>AffineTransformation</tt> enhanced to avoid numeric precision issues in case of reflection in X=Y (coordinate flipping)
<li>Added <tt>LineSequencer.sequence()</tt> static convenience method
<li>Added error indicators to <tt>BufferDistanceValidator</tt> and <tt>BufferResultValidator</tt>
<li>Added <tt>MinimumClearance</tt> class
<li>Added <tt>nearestNeighbours</tt> methods to <tt>STRtree</tt>
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved memory performance of <tt>ShapeWriter</tt> conversions (by tuning coordinate and polygon conversion)
<li>Improved performance of <tt>RectangleIntersects</tt> by refining <tt>SegmentIntersectionTester</tt>
</ul>
<h3>Robustness Improvements</h3>
<ul>
<li>Delaunay triangulation uses more robust formulation for the inCircle test
<li>Voronoi computation now uses more robust formulation for the circumcentre computation
<li>Force <code>RectangleIntersects</code> to always use segment-scanning to improve robustness
</ul>
<h3>API Changes</h3>
<ul>
<li>Reduced visibility of internal classes in <tt>com.vividsolutions.jts.geom.prep</tt>
<li>Reduced visibility of internal classes in <tt>com.vividsolutions.jts.simplify</tt>
<li>Moved <tt>Matrix</tt> class into <tt>jts.math</tt> package
<li>Refactored internal offset curve generation classes
in <tt>com.vividsolutions.jts.operation.buffer</tt> package
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed <tt>CoordinateArraySequence</tt> and <tt>PackedCoordinateSequence</tt>
to correctly handle Z ordinate in <tt>getCoordinate(int, Coordinate)</tt>
<li>Fixed <tt>LinearRing</tt> to have <tt>isClosed()</tt> return <tt>true</tt> for empty rings
<li>Fixed <tt>Geometry.union()</tt> to use more robust union algorithm.
This provides behaviour consistent with <tt>union(Geometry)</tt>.
<li>Fixed <tt>Point.isValid()</tt> to validate POINT EMPTY correctly
<li>Fixed <tt>SnapIfNeededOverlayOp</tt> to throw the originating exception,which contains meaningful coordinates
<li>Fixed <tt>GeometrySnapper</tt> to allow final vertices of LineStrings to snap correctly
<li>Fixed buffer (<tt>OffsetCurveSetBuilder</tt>) to handle "flat" rings correctly
<li>Fixed <tt>IsValidOp</tt> to handle reporting "Not Closed" errors on empty rings correctly
<li>Fixed <tt>NestedRingTester</tt> (used by <tt>IsValidOp</tt>)
to correctly handle the case where a hole touches all the vertices of another hole (which is invalid)
<li>Fixed <tt>ConvexHull</tt> to handle large geometries with fewer than 3 unique points
<li>Fixed <tt>GeometryGraph</tt> to ignore empty hole rings when building graph
<li>Fixed <tt>LineMerger</tt> to skip lines with only a single unique coordinate
<li>Fixed <tt>ByteArrayInStream</tt> to pad byte buffers with zeroes
<li>Corrected spelling of <tt>SquarePointShapeFactory</tt>
<li>Fixed tolerance check in <tt>KdTree</tt>
<li>Updated <tt>MasterTester</tt> to include more unit tests
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <tt>[Zoom To Result]</tt> button
<li>Improved mark display, with floating point label
<li>Added more random geometry creation functions
<li>Added fractal geometry creation functions
<li>Improved threaded rendering handling to ensure only one frame drawn
<li>Added Magnify Topology capability
<li>Added Geometry Inspector dialog
<li>Better startup script, with auto-home directory detection
and JTS_LIB_DIR environment variable (thanks to strk)
<li>Added logging Info window behaviour
<li>Improved saving PNG to allow specifying file name
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed Stats panel to update when current test changes
<li>Fixed deleting single test case
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.11</h2>
<i>Release Date: March 1, 2010</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <tt>CoordinateArrays.isRing</tt>
<li>Added <tt>CGAlgorithms.signedArea(CoordinateSequence)</tt>
<li>Added <tt>CoordinateArrays.copyDeep(...)</tt> method to copy sections of arrays
<li>Added <tt>CoordinateList.add(Coordinate[], boolean, int, int)</tt> method to add sections of arrays
<li>Added <tt>LineSegment.toGeometry()</tt>, <tt>LineSegment.lineIntersection()()</tt>
<li>Added <tt>LineSegment.hashCode()</tt>
<li>Added geometric similarity classes (<tt>HausdorffSimilarityMeasure</tt>, <tt>AreaSimilarityMeasure</tt>)
<li>Added <tt>MinimumDiameter.getMinimumRectangle()</tt>
<li>Added <tt>MinimumBoundingCircle</tt> class
<li>Added <tt>Densifier</tt> class
<li>Added triangulation API, including <tt>QuadEdgeSubdivision</tt>, <tt>IncrementalDelaunayTriangulator</tt>,
<tt>ConformingDelaunayTriangulator</tt> and supporting classes
<li>Added <tt>VoronoiDiagramBuilder</tt> to perform Voronoi diagram generation
<li>Added <tt>scaleInstance(scaleX, scaleY, x, y)</tt> to <tt>AffineTransformation</tt>
<li>Added <tt>AffineTransformationFactory</tt> to allow generating transformations from various kinds of control inputs
<li>Added <tt>BinTree.remove()</tt> method
<li>Fixed <tt>BinTree.query()</tt> to allow null interval arguments
<li>Added <tt>ShapeReader</tt> API to convert Java2D Shapes into JTS Geometry
<li>Added <tt>ShapeWriter</tt> API to convert JTS geometry into Java2D Shapes
<li>Added <tt>FontGlyphReader</tt> API to render Java2D text font glyphs into geometry
<li>Added <tt>SdeReader</tt> to <b>jtsio</b> library
<li>Added <tt>Debug</tt> break methods
<li>Added <tt>Memory</tt> utility for reporting memory statistics
<li>Added <tt>ObjectCounter</tt> utility for counting objects
<li>Added <tt>createSquircle</tt> and <tt>createSuperCircle</tt> to <tt>GeometricShapeFactory</tt>
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved performance of <tt>Geometry.getArea()</tt> and <tt>Geometry.getLength()</tt> when used with custom <tt>CoordinateSequence</tt>s
</ul>
<h3>API Changes</h3>
<ul>
<li>Deprecated <tt>WKBWriter.bytesToHex</tt> in favour of <tt>WKBWriter.toHex</tt> to regularize and simplify method name
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed Point.isValid() to check for invalid coordinates (ie with Nan ordinates)
<li>Fixed <tt>Geometry.distance()</tt> and <tt>DistanceOp</tt> to return 0.0 for empty inputs
<li>Fixed <tt>Buffer</tt> to handle degenerate polygons with too few distinct points correctly
<li>Added illegal state check in <tt>LineSegment.pointAlongOffset()</tt>
<li>Fixed exception strategy in <tt>BufferSubgraph</tt> to handle certain robustness failures correctly
<li>Fixed robustness problem in <tt>OffsetCurveBuilder</tt> in computing mitred joins for nearly parallel segments
<li>Fixed minor bug in <tt>BufferInputLineSimplifier</tt> which prevented simplification of some situations
<li>Fixed bug in <tt>BufferInputLineSimplifier</tt> which caused over-simplification for large tolerances
<li>Fixed bug in <tt>Angle.normalizePositive</tt> to handle values > 2PI correctly
<li>Fixed <tt>WKTWriter</tt> to emit correct syntax for MULTIPOINTs
<li>Fixed <tt>WKTReader</tt> to accept correct syntax for MULTIPOINTs
<li><tt>CGAlgorithms.isCCW</tt> now checks for too few points in the ring and throws an <tt>IllegalArgumentException</tt>
<li>Fixed bug in <tt>AffineTransformation#eqals</tt> (logic bug)
<li>Fixed bug in <tt>CoordinateList#closeRing</tt> (cloning closing Coordinate)
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>WKT input is cleaned automatically when loaded (illegal chars are removed)
<li>Added WKT-Formatted option to Test Case View dialog
<li>Many new geometry functions added
<li>Geometry functions are displayed in tree
<li>Geometry functions can be implemented as Java static class methods.
<li>Geometry function classes can be loaded dynamically from command-line
<li>Improved handling of very large geometry inputs and results
<li>Threaded rendering allows display of very large geometries without limiting usability
<li>Added Draw Rectangle tool
<li>Added Drag-n-drop loading of .SHP files
<li>Added Info tool to provide persistent display of geometry point/segment information
<li>Added display of memory usage
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.10</h2>
<i>Release Date: December 31, 2008</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <tt>Geometry.reverse()</tt> method for all geometry types
<li>Added <tt>setSrsName</tt>, <tt>setNamespace</tt>, <tt>setCustomRootElements</tt> methods to <tt>GMLWriter</tt>
<li>Added <tt>Envelope.getArea</tt> method
<li>Added <tt>copy</tt>, <tt>copyCoord</tt> methods to <tt>CoordinateSequences</tt>
<li>Added <tt>area</tt> method to <tt>Envelope</tt>
<li>Added <tt>extractPoint(pt, offset)</tt> methods to <tt>LengthIndexedLine</tt> and <tt>LocationIndexedLine</tt>
<li>Added <tt>CoordinatePrecisionReducerFilter</tt>
<li>Added <tt>UnaryUnionOp(Collection, GeometryFactory)</tt> constructor to handle empty inputs more automatically
<li>Added <tt>DiscreteHausdorffDistance</tt> class
<li>Made <tt>LineMerger</tt> able to be called incrementally
<li>Added <tt>GeometricShapeFactory.createArcPolygon</tt> to create a polygonal arc
<li>Enhanced <tt>Geometry.buffer()</tt> to preserve SRID
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved performance for <code>EdgeList</code> (by using a more efficient technique for detecting duplicate edges)
<li>Improved performance for <code>ByteArrayInStream</code> (by avoiding use of <tt>java.io.ByteArrayInputStream</tt>)
<li>Unrolled intersection computation in <tt>HCoordinate</tt> to avoid object allocation
<li>Improved performance for buffering via better offset curve generation and simplification.
<li>Improved performance for <tt>IsValidOp</tt> by switching to use <tt>STRtree</tt> for nested hole checking
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed <tt>Geometry.getClassSortIndex()</tt> to lazily initialize the sorted class list. This fixes a threading bug.
<li>Fixed <tt>RectangleContains</tt> to return correct result for points on the boundary of the rectangle
<li>Fixed error in <tt>com.vividsolutions.jts.simplify.LineSegmentIndex</tt> which caused polygons
simplified using <tt>TopologyPreservingSimplifier</tt> to be invalid in certain situations
<li>Fixed error in <tt>DouglasPeuckerSimplifier</tt> which caused empty polygons to be returned when they contained a very small hole
<li>Fixed <tt>PackedCoordinateSequence</tt> to return <tt>NaN</tt> for null ordinate values
<li>Fixed <tt>Geometry.centroid()</tt> (<tt>CentroidArea</tt>) so that it handles degenerate (zero-area) polygons
<li>Fixed <tt>Geometry.buffer()</tt> (<tt>OffsetCurveBuilder</tt>) so that it handles JOIN_MITRE cases with nearly collinear lines correctly
<li>Fixed <tt>GeometryFactory.toGeometry(Envelope)</tt> to return a CW polygon
<li>Fixed <tt>UnaryUnionOp</tt> to correctly handle heterogeneous inputs with P/L/A components
<li>Fixed <tt>UnaryUnionOp</tt> to accept <tt>LINEARRING</tt>s
<li>Fixed <tt>CentroidArea</tt> to handle zero-area polygons correctly
<li>Fixed <tt>WKBWriter</tt> to always output 3D when requested, and to handle 2D <tt>PackedCoordinateSequences</tt> correctly in this case
<li>Fixed <tt>NodedSegmentString</tt> to handle zero-length line segments correctly (via <tt>safeOctant</tt>)
<li>Cleaned up code to remove unneeded <tt>CGAlgorithms</tt> objects
<li>Fixed <tt>GeometricShapeFactory.createArc</tt> to ensure arc has requested number of vertices
</ul>
<h3>API Changes</h3>
<ul>
<li>Moved GML I/O classes into core JTS codebase
<li>Changed <tt>GMLWriter</tt> to not write the <tt>srsName</tt> attribute by default
<li>In <tt>DistanceOp</tt> switched to using <tt>nearestPoints</tt> method names
<li>Exposed <tt>STRtree.getRoot()</tt> method
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>UI Improvements</h3>
<ul>
<li>Added ability to read GML from input panel
<li>Added GML output to View dialog
<li>Added file drag'n'drop to Geometry Input text areas
<li>Add display of computation time
<li>Added Stats panel
<li>Added Scalar functions panel, with extensible function list
<li>Added <b>Save as PNG...</b>
<li>Added stream digitizing to Polygon and Line Draw tools
</ul>
<!------- TestRunner -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestRunner</h3>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <tt>-testCaseIndex</tt> command-line option
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.9</h2>
<i>Release Date: January 2, 2008</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <tt>Polygonal</tt>, <tt>Lineal</tt>, <tt>Puntal</tt> tag interfaces to better categorize geometry classes
<li>Added <tt>Geometry.union()</tt> method, <tt>UnaryUnionOp</tt> class for efficient unioning of geometrys
<li>Added <tt>Triangle.area3D</tt> method
<li>Added <tt>LineSegment.pointAlongOffset</tt> method
<li>Added <tt>LineSegment.orientationIndex(Coordinate)</tt> method
<li>Added <tt>PreparedGeometry</tt> classes and methods to optimize some geometry functions in batch situations
<li>Added <tt>Envelope.covers</tt> methods, for preciseness
<li>Added <tt>OctagonalEnvelope</tt> class
<li>Improved <tt>CGAlgorithms.isPointInRing</tt> method to handle case where point lies on the ring
<li>Added <tt>CGAlgorithms.locatePointInRing</tt> method
<li>Added <tt>PointInAreaLocator</tt> interface, enhanced <tt>SimplePointInAreaLocator</tt> to extend this
<li>Added <tt>RayCrossingCounter</tt>, <tt>IndexedPointInAreaLocator</tt> classes for more efficient Point-In-Polygon testing
<li>Added <tt>GeometryCombiner</tt> class
<li>Enhanced <tt>BufferOp</tt> with join styles
<li>Enhanced <tt>WKTReader</tt> to accept any case for <tt>NaN</tt> number symbols
<li>Added <tt>WKTFileReader</tt> class
<li>Improved performance of <tt>CoordinateList</tt> constructors
<li>Added <tt>CascadedPolygonUnion</tt> class
<li>Added <tt>LinearLocation.isOnSameSegment</tt> method
<li>Added <tt>LinearLocation.getSegment</tt> method
<li>Added <tt>LocationIndexedLine.indexOfAfter</tt> method
<li>Added interpolation of Z value to linear referencing methods
<li>Added methods to rotate around a given point to <tt>AffineTransformation</tt>
<li>Allowed <tt>GeometricShapeFactory</tt> to be subclassed to add new shapes
<li>Added <tt>SineStarFactory</tt> (primarily to support testing)
<li>Added <tt>SortedPackedIntervalRTree</tt> class
<li>Added <tt>SegmentSetMutualIntersector</tt> interface and implementations
<li>Added <tt>Node.remove(DirectedEdge)</tt> method in <tt>planargraph</tt> package
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved performance for <code>SimplePointInAreaLocator</code> (by checking ring envelopes as a filter)
</ul>
<h3>Bug Fixes</h3>
<ul>
<li><tt>Geometry.buffer</tt> operation fixed to always return polygonal geometries
<li>Fixed bug in <code>Geometry.buffer(distance, quadrantSegs)</code>
causing failure for some cases with <tt>quadrantSegs = 1</tt>
<li>Fixed bug in <tt>GeometryFactory.toGeometry(Envelope)</tt>
which was returning invalid Polygons for "linear" envelopes
<li>Fixed bug in <tt>MonotoneChainBuilder</tt> which caused failures in situations with segments of zero length
<li>Fixed <tt>PointLocator</tt> to handle locating in Point geometries
<li>Fixed <tt>GeometricShapeFactory</tt> to always use provided PrecisionModel
<li>Fixed <tt>LinearLocation.clone</tt> method
<li>Fixed <tt>LinearLocation.isValid</tt> method
<li>Fixed <tt>Polygonizer</tt> to accept single-point linestrings (which are ignored)
</ul>
<h3>API Changes</h3>
<ul>
<li>Deprecated <code>RobustCGAlgorithms</code>
<li>Deprecated <code>BufferOp</code> cap style constants (these are now provided in </tt>BufferParameters</tt>)
<li>Removed <code>SIRPointInRing</code>
</ul>
<!------- TestRunner -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestRunner</h3>
<h3>New Features</h3>
<ul>
<li>Added ability to specify GeometryOperation in XML file
<li>Added <tt>BufferValidatedGeometryOperation</tt>
<li>Added ability to specify custom result matching via <tt>resultMatcher</tt> parameter
in XML files
<li>Added <tt>BufferResultMatcher</tt>
</ul>
<!------- TestBuilder -------------------->
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>UI Improvements</h3>
<ul>
<li>Improved rendering of geometries
<li>Improved symbology for orientation
<li>Simplified Geometry creation
<li>Improved vertex move/add
<li>Added tooltip for coordinate location
<li>Added more geometry functions
<li>Added Copy Result to Test button
</ul>
<h3>Code Improvements</h3>
<ul>
<li>Restructured code for more flexibility, better Swing functionality
<li>Made it easier to add geometry functions
</ul>
<!-- ================================================================ -->
<hr size='4' color='darkblue'>
<h2>Version 1.8</h2>
<i>Release Date: December 19, 2006</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Improved robustness for overlay operations, via using geometry snapping
<li>Added <code>Angle</code> class
<li>Added methods to <code>Triangle</code> class
<li>Added <code>LineSegment.midPoint</code> method
<li>Added ability to specify output of Z values to <code>WKTWriter</code>
<li>Added <code>setFormatted</code>, <code>setTab</code>, <code>setMaxCoordinatesPerLine</code> methods to <code>WKTWriter</code>
<li>Added <code>BoundaryNodeRule</code> classes, and ability to specify a Boundary Node Rule
in <code>RelateOp</code>, <code>IsSimpleOp</code>, <code>BoundaryOp</code>
<li>Added ability to get the failure location to <code>IsSimpleOp</code>
<li>Added <code>BoundaryOp</code> with improved algorithm for lineal geometries. Changed lineal Geometry classes to use it.
<li>Enhanced <code>Geometry</code> overlay methods to accept empty <code>GeometryCollections.</code>
<li>Enhanced Error Handling for <tt>WKTReader</tt>
<li>Added <code>CoordinateSequenceFilter</code>
<li>Added <code>AffineTransformation</code> and <code>AffineTransformationBuilder</code>
</ul>
<h3>API Changes</h3>
<ul>
<li>Changed API for <code>IsSimpleOp</code> (required to support returning failure location)
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed bug in <code>GeometryFactory.buildGeometry</code>
causing failure if input contained all GeometryCollections of the same subclass
<li>Changed AssertFailure to TopologyException in <code>PolygonBuilder</code>
<li>Improved correctness of <tt>RobustLineIntersector</tt> in certain cases where segment endpoints intersect
<li>Eliminated duplicate method execution in <code>TestRunner</code>
</ul>
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestBuilder</h3>
<h3>New Features</h3>
<ul>
<li>Zoom tool can now draw zoom box as well as click
<li>Cut, Copy and Paste buttons for Input WKT
<li>added ability to specify custom Geometry Operations
</ul>
<hr size='0' color='darkblue'>
<h3 style='font-family:sans-serif; color:darkblue'>JTS TestRunner</h3>
<h3>New Features</h3>
<ul>
<li>added ability to specify custom Geometry Operations
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Eliminated duplicate method execution
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.7.2</h2>
<i>Release Date: June 22, 2006</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added support for EWKB (SRIDs only) to <code>WKBReader</code>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed bug in <code>CoordinateArrays.ptNotInList</code>.
Changed <code>polygonize.EdgeRing</code> to used corrected code.
<li>Fixed bug causing duplicate points in <code>ScaledNoder</code>
<li>Fixed bug causing Null Pointer for empty geometries in <code>OraWriter</code>
<li>Changed AssertFailure to TopologyException in <code>EdgeNode</code>
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.7.1</h2>
<i>Release Date: March 20, 2006</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added Hex string conversion to <code>WKBReader</code> and <code>WKBWriter</code>
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed null point cloning bug in <code>TopologyValidationError</code> (<i>thanks to Markus Gebhard</i>)
<li>Fixed bug in <code>PointLocator</code> fix for LinearRings
<li>Fixed bug in <code>Geometry.isValid</code> and <code>IsValidOp</code> causing some valid polygons
to be reported as having a Disconnected Interior (specifically, polygons containing
holes touching at a single point, where the point is the highest point in the hole rings, and where the holes
have a specific orientation)
<li>Fixed bug in <code>Polygon.isRectangle</code>, which reported some valid rectangles as false
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved performance for <code>Geometry#withinDistance</code> (via short-circuiting)
</ul>
<h3>Contributors</h3>
<ul>
<li>Dave Blasby
<li>Koen van Dijken
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.7</h2>
<i>Release Date: December 7, 2005</i>
<h3>Functionality Improvements</h3>
<ul>
<li>Added <code>JTSVersion</code> class to provide access to the API version information
<li>Added <code>covers</code> and <code>coveredBy</code> predicates to <code>Geometry</code>
<li>Added <code>Geometry#buffer(distance, quadSegs, endCapStyle)</code> method to expose buffer end cap styles
<li>Added <code>LineString#reverse</code> and <code>MultiLineString#reverse</code> methods
<li>Added <code>centre</code>, <code>intersection</code>, <code>translate</code>,
<code>expandBy(distance)</code>, <code>expandBy(dx, dy)</code>
methods to <code>Envelope</code>
<li>Added <code>CollectionUtil</code> class for performing operations over collections
<li>Added <code>CoordinateArrays</code> comparators
<li>Added <code>CoordinateSequence#getDimension</code>
<li>Added convenience methods <code>toPoint</code> and <code>toLineString</code> to <code>WKTWriter</code>
<li>Added WKB API (<code>WKBReader</code> and <code>WKBWriter</code> classes in <code>com.vividsolutions.jts.io</code>
<li><code>WKTReader</code> has better handling of numeric parsing, including support for scientific notation
<li>Added <code>IsValidOp#setSelfTouchingRingFormingHoleValid</code> to allow validating SDE-style polygons
<li>Added check for non-closed rings in <code>IsValidOp</code>
<li>Added Linear Referencing API (<code>com.vividsolutions.jts.linearref</code>
<li>Added <code>LineSequencer</code> class to <code>com.vividsolutions.jts.operation.linemerge</code>
<li>Added <code>Subgraph</code> class to <code>com.vividsolutions.jts.planargraph</code>
<li>Added <code>isRemoved</code> method to <code>GraphComponent</code>
<li>Added <code>ConnectedSubgraphFinder</code> class to <code>com.vividsolutions.jts.planargraph.algorithm</code>
<li>Added <code>setVisited</code>, <code>getComponentWithVisitedState</code>,
<code>setVisited</code>, <code>getComponentWithVisitedState</code>
methods to <code>com.vividsolutions.jts.planargraph.GraphComponent</code>
<li>Added classes to perform Snap Rounding (in <code>com.vividsolutions.jts.noding.snapround</code>>
<li>Improved buffering speed and robustness by using Snap Rounding
<li>Added buffer optimization for results with large numbers of polygons and/or holes
<li>Added <code>STRtree#query(Envelope, ItemVisitor)</code> method
<li>Added <code>Debug#toLine</code> methods
<li>Added <code>ConvexHull(Coordinate[])</code> constructor
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed decimal formatting in <code>WKTWriter</code> to force a leading 0 in decimal numbers
<li>Fixed bug in <code>CoordinateArraySequence#setOrdinate</code>
<li>Fixed bug when checking validity of polygon with hole (<code>IsValidOp#checkHolesInShell</code>)
<li>Improved correctness of computated intersections in <code>RobustLineIntersector</code>
<li>Fixed bugs in <code>CoordinateList.clone</code> (thanks to Matthias Bobzien)
<li>Fixed bug in <code>Envelope.equals</code> (thanks to John Cartwright)
<li>Fixed <code>PointLocator</code> for LinearRings
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Improved performance for overlay operations (point inclusion, identical edge detection)
<li>Improved Convex Hull performance
</ul>
<h3>API Changes</h3>
<ul>
<li>Added <code>SpatiaIndex#query(Envelope, ItemVisitor)</code> method signature
<li>Added <code>CoordinateSequence#getDimension()</code> method signature
<li>Marked <code>GeometryEditor.CoordinateOperation#edit(Geometry, GeometryFactory)</code> method
as <code>final</code>, to prevent incorrect use
</ul>
<h3>Semantics Changes</h3>
<ul>
<li>CoordinateArraySequence#setOrdinate now checks that the ordinate index is in range
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.6</h2>
Release Date: February 3, 2005
<h3>API Changes</h3>
<ul>
<li>Changed to using <code>CoordinateArraySequence</code> instead of <code>DefaultCoordinateSequence</code>
(to provide a more descriptive name).
</ul>
<h3>Semantics Changes</h3>
<ul>
<li>PrecisionModel#makePrecise changed to use Symmetric Arithmetic Rounding rather than Banker's Rounding
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li>Added ability to enable <code>Debug</code> methods by setting a system property
<li>Added <code>getNumGeometries</code> and <code>getGeometryN</code> methods to Geometry class, to make API more uniform
<li>Improved API for <code>CoordinateSequence</code> allows more options for improving memory usage and handling custom coordinate storage methods
<li>Added <code>PackedCoordinateSequence</code> to provide reduced memory footprint for geometry objects if desired
<li>Added optimized spatial predicates for rectangles
<li>Added Debug#isDebugging method
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed bug in <code>Geometry#within()</code> short circuiting
<li>Fixed bug causing <code>Geometry#isValid</code> to throw IllegalArgumentException for certain kinds of holes with invalid rings
<li>Fixed bug causing redundant linestrings to be returned in the result of overlaying polygons containing holes touching their shell.
<li><code>Polygon#getBoundary</code> now returns a <code>LinearRing</code> if the polygon does not have holes
</ul>
<h3>Architecture Changes</h3>
<ul>
<li>Removed a proliferation of references to the default <code>CoordinateSequenceFactory</code>
</ul>
<h3>Contributors</h3>
<ul>
<li>Andrea Aime
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.5</h2>
Release Date: September 22, 2004
<p>
This version is upwards compatible with Version 1.4
<h3>API Changes</h3>
<ul>
<li>None
</ul>
<h3>Semantics Changes</h3>
<ul>
<li>None
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li><code>CGAlgorithms#isCCW</code> now handles coordinate lists with repeated points. Also throws an IllegalArgumentException if the input ring does not have 3 distinct points
<li><code>isValid</code> now checks for invalid coordinates (e.g. ones with Nan or infinite numbers)
<li>added copyDeep() method to <code>CoordinateArrays</code>
<li>added geometry simplification operations <code>DouglasPeuckerSimplifier</code> and <code>TopologyPreservingSimplifier</code>
<li>added methods to <code>Quadtree</code> and <code>STRtree</code> to remove items and query using the Visitor pattern
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Added short-circuit tests in geometry named predicates based on envelope tests
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed bugs in <code>Geometry</code> serialization
<li>Fixed bug in <code>ValidOp</code> which reported some MultiPolygons with shells nested inside a hole as invalid
<li>Fixed bug in buffer which caused buffers of some polygons with small & large holes to not contain any holes
<li>Fixed bug in <code>Polygonizer</code> which caused exception if no lines were supplied
</ul>
<h3>Architecture Changes</h3>
<ul>
<li>Basic CG algorithm methods made static in the <code>CGAlgorithms</code> class
<li>Various utility methods made public in <code>CoordinateArrays</code> class
</ul>
<h3>Documentation</h3>
<ul>
<li>More examples provided in <code>com.vividsolutions.jtsexamples package</code>
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.4</h2>
Release Date: November 4, 2003
<h3>Semantics Changes</h3>
<ul>
<li>none
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li>Added "LINEARRING" tag to WKT syntax
<li>Added GeometryEditor class to allow easy copy/modify of Geometrys
<li>Added GeometricShapeFactory class to easily create standard geometric shapes
<li>Geometries can now carry arbitrary user-defined data objects (via Geometry#get/setUserData(Object) method)
<li>Added CoordinateSequence and CoordinateSequenceFactory interfaces, and default implementations (BasicCoordinateSequence, BasicCoordinateSequenceFactory)
<li>Added Geometry#getFactory
<li>Added new PrecisionModel type of FLOATING_SINGLE, for rounding to single precision floating point
<li>Added DistanceOp#getClosestPoints method, which returns the closest points between two Geometries
<li>Added com.vividsolutions.jts.noding package containing classes to perform fast indexed noding of linestrings
<li>Added com.vividsolutions.jts.operation.polygonize package containing classes to perform polygonization
<li>Added com.vividsolutions.jts.operation.linemerge package containing classes to perform line merging
<li>Added SimpleGeometryPrecisionReducer to allow reducing precision of coordinates of a Geometry
<li>Added LineSegment#closestPoints method to compute the closest points between two line segments
<li>Added MinimumDiameter class to compute minimum diameters of Geometries
<li>Added geom.Triangle class to contain algorithms for Triangles
<li>BufferOp now allows end cap styles to be specified. Three types are supported: round, butt and square.
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>EdgeList now provides a findEqualEdge method which is substantially faster than findEdgeIndex, for large lists
<li>Buffering is now faster and much more robust
<li>Overlap operations are now more robust
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Envelope#init(Envelope) now handles null Envelopes correctly
<li>CoordinateList#add() now correctly ignores the z-value of Coordinates in determining equality
<li>Geometry#isValid now correctly handles checking validity of LinearRings
<li>Fixed infinite loop bug causing Out Of Memory errors during polygon intersection
<li>Geometry#clone now correctly clones the Geometry's Envelope
<li>LineIntersector#computeEdgeDistance now correctly computes a non-zero edge distance in certain situations when a fixed precision model was being used and the line segment was a single unit in length
<li>Fixed incorrect calculation of depths in DirectedEdgeStar#computeDepths
<li>Fixed BufferSubgraph#addReachable to use explicit stack to avoid stack overflow problems
<li>Fixed various bugs causing some kinds of buffers to be computed incorrectly
</ul>
<h3>API Changes</h3>
<ul>
<li>WKTReader/Writer: changed protected members to private
<li>PrecisionModel type is now an object rather than an int
<li>ConvexHull API changed to remove requirement to pass in CGAlgorithms object
</ul>
<h3>Code Architecture Changes</h3>
<ul>
<li>geom.util package added for utility classes which parse and modify geometries
</ul>
<h3>Documentation</h3>
<ul>
<li>More examples provided in com.vividsolutions.jtsexamples package
<li>Added JTS Developers Guide
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.3</h2>
Release Date: April 4, 2003
<h3>Semantics Changes</h3>
<ul>
<li>all Geometry methods are now reentrant (thread-safe)
<li>Fixed-precision coordinates are now stored in a rounded but non-scaled form. This makes them compatible with non-precise (Floating) coordinates, and simplifies working with precise coordinates directly. Mixed precision models are now supported in Geometry methods; method results are in the more precise of the input precision models.
<li>Offsets are no longer supported in the Fixed precision model. This is necessary to allow storing fixed precision coordinates in a non-scaled form. This does not reduce the total precision available, since coordinates are stored in a floating-point format.
<li>SRID and Precision Model are no longer checked for equality during Geometry operations. This removes a limitation which provided little semantic benefit.
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li>added Geometry.isWithinDistance(Geometry g, double distance) method, to provide optimized proximity queries
<li>added Geometry.buffer(double distance, int quadrantSegments) method, allowing control over accuracy of buffer approximation
<li>added Geometry.getCentroid() method
<li>added Geometry.getInteriorPoint() method, which uses heuristic methods to return a point in the interior of a Geometry
<li>GeometryFactory.toGeometryArray now returns null if the argument is null
</ul>
<h3>Performance Improvements</h3>
<ul>
<li>Removed unnecessary string construction in EdgeEndStar.propagateSideLabels()
<li>Eliminated unnecessary computation of self-intersections in rings during relate and spatial functions. This provides a large increase in speed when working with large rings and polygons. (Note that IsValid still checks for these self-intersections, which are illegal in LinearRings)
<li>Add short-circuit code to RobustLineIntersector to detect non-intersections more efficiently
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>Fixed ClassCastException occurring in GeometryCollection.getLength()
<li>Fixed bug in Edge Intersection insertion (replaced Coordinate#equals with equals2D to ensure that intersection creation is not sensitive to Z-value).
<li>Fixed handling LineStrings with too few points in GeometryGraph.addLineString
<li>Fixed: was not checking that MultiPolygons don't contain components with too few points.
<li>Fixed Envelope.distance() to return correct distance for all envelopes.
<li>Fixed a few Geometry methods to make them re-entrant.
<li>Fixed CoordinateList.closeRing() to ensure endpoints are not duplicated
<li>Fixed CGAlgorithms.signedArea() to use a simpler algorithm which is more robust and faster.
<li>Fixed bug preventing validating Rings containing an initial repeated point.
</ul>
<h3>API Changes</h3>
<ul>
<li>Added default constructor to WKTReader. It uses the default GeometryFactory
<li>Add two static intersects() methods to Envelope, to allow computing intersections with envelopes defined by points only.
<li>Dropped BinaryPower; its functionality is provided by DoubleBits in a more robust fashion.
<li>Removed a couple of redundant private static methods from Geometry; they have been replaced by methods in CoordinateArrays
<li>The Geometry class is now marked as Serializable
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.2</h2>
Release Date: 7 October 2002
<h3>Semantics Changes</h3>
<ul>
<li>JTS now allows Geometrys to have repeated points. All operations will continue to perform as before. This removes a significant incompatibility with the OGC spatial data model.
<li>TopologyExceptions may now be thrown by spatial overlay methods. This helps to distinguish between code bugs and known robustness problems. It also provides a machine-readable coordinate for the error location.
</ul>
<h3>Functionality Improvements</h3>
<ul>
<li>RobustLineIntersector now uses "normalized" coordinates to maximize the accuracy of intersection computation.
<li>Upgraded Quadtree with more robust implementation
<li>Replaced IntervalTree with a more robust implementation of BinTree
<li>Added STRTree 2-D spatial index, which exhibits better performance than QuadTrees in many situations.
<li>Added EnhancePrecisionOp, which uses precisioning enhancing techniques to reduce the number of failure cases due to robustness problems.
</ul>
<h3>Bug Fixes</h3>
<ul>
<li>fixed ConvexHull to use TreeSet instead of HashSet for coordinates
<li>Fixed isValid for GeometryCollections containing Polygons, which were sometimes erroneously returning a validity failure for correct Geometrys.
<li>Fixed bug in LineSegment.distancePointLine() which would return the incorrect distance for a LineSegment with two identical points
<li>Improved error handling in CGAlgorithms.isCCW()
<li>IsValid now checks for too few points in a geometry component (e.g. due to repeated points in a ring)
</ul>
<h3>API Changes</h3>
<ul>
<li>added Stopwatch class
<li>added Geometry.getArea() and Geometry.getLength() methods
<li>added CGAlgorithms.signedArea() method
<li>added methods to LineSegment - closestPoint(), getLength()
<li>added CoordinateArrrays and CoordinateLists utility classes
<li>Added TopologyValidationError.getErrorType() method
<li>Added Envelope#intersects; deprecated Envelope#overlaps.
<li>Added Geometry#geometryChanged() method to allow signaling when Geometry coordinates have been mutated by a client class
<li>Added STRTree class implementing a Sort-Tile-Recursive spatial index (a variant of a packed R-tree)
<li>Deleted IntervalTree 1-D spatial index (replaced by BinTree)
<li>Add BinTree 1-D spatial index
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.1.1</h2>
Release Date: 9 April 2002
<h3>Bug Fixes</h3>
<ul>
<li>fixed decimal-point symbol localization bug in WKTWriter
<li>fixed bug in Envelope.int(Envelope env)
<li>fixed filename case of SFSMultiLineString.java and IntervalTree.java
</ul>
<h3>API Changes</h3>
<ul>
<li>deleted TopologyException class
<li>renamed CGAlgorithms.isPointInPolygon to isPointInRing (a more accurate description of what the method computes)
</ul>
<h3>API Additions</h3>
<ul>
<li>added Geometry.getCoordinate() method
<li>added Geometry.distance() method
<li>added GeometryComponentFilter interface and Geometry.apply(GeometryComponentFilter) method
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.1</h2>
Release Date: 28 March 2002
<h3>New Features</h3>
<ul>
<li>added Geometry.isSimple() and Geometry.isValid() methods
<li>improved design of topological data structures
<li>added Geometry.setSRID() method
<li>improved functionality of the Envelope class
<li>added ability to write to an arbitrary java.io.Writer object to WKTWriter
<li>added Validate and Mark Location functionality to TestBuilder
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 1.0</h2>
Release Date: 1 February 2002
<ul>
<li>Removed some non-compatibilities with Java 1.1
<li>Fixed bug in constructing buffer outline around inside of angles
<li>In TestBuilder vertices are now displayed with fixed size in view units
<li>Improved code for WKTWriter.writeFormatted()
<li>Fixed bug in constructor for LinearRing
<li>Improved implementation of sweepline intersection algorithm to avoid use of dynamic set.
<li>Fixed bug in ConvexHull.cleanRing()
<li>Refactored RobustLineIntersector and NonRobustLineIntersector
</ul>
<!----------------------------------------------------------------------->
<hr size='4' color='darkblue'>
<h2>Version 0.0</h2>
Release Date: 30 May 2001
<p>
<i>Baseline version</i>
</body>
</html>