
JTS TOPOLOGY SUITE
==================

*Version History*

This document lists the change history of release versions of the
**JTS Topology Suite**.

* Project site: [LocationTech JTS](http://locationtech.org/projects/technology.jts)
* Code repo: [Github JTS](https://github.com/locationtech/jts)
* Distribution: [Github JTS Releases](https://github.com/locationtech/jts/releases)


Distributions for older JTS versions can be obtained at the
[SourceForge JTS project](http://sourceforge.net/projects/jts-topo-suite/)

<!-- ================================================================ -->

Version 1.x

Release Date: TBD

# Version 1.x

### New Features

### Functionality Improvements

### Bug Fixes

### Performance Improvements

# Version 1.20.0

*Release Date: 09/18/2024*

### New Features
* Add `CoverageValidator` `CoveragePolygonValidator` (#900)
* Add `CoverageGapFinder` (#900)
* Add `CoverageUnion` (#900)
* Add `CoverageSimplifier` (#911)
* Add `OverlayNG` support for simple GeometryCollection inputs (#915)
* Add `Geometry.hasDimension(int dim)` method {#944}
* Add `ConcaveHull.alphaShape` function (#952)
* Add `OffsetCurve` Joined mode (#956)
* Add `PointLocation.isOnSegment` function (#1048)
* Add `RelateNG` API for improved topological relationship functionality and performance (#1052, #1055)
* Add system property `jts.relate=ng` to enable use of RelateNG in `Geometry` methods (#1073)

### Functionality Improvements
* Improve `TopologyPreservingSimplifier` to prevent edge-disjoint line collapse (#925)
* Improve `OffsetCurve` to return more linework for some input situations (#956)
* Reduce buffer curve short fillet segments (#960)
* Added ability to specify boundary for `LargestEmptyCircle` (#973)
* Improve `DouglaPeuckerSimplifier` and `TopologyPreservingSimplifier` to handle ring endpoints (#1013)
* Add `Angle` functions `sinSnap` and `cosSnap` to avoid small errors, e.g. with buffer operations (#1016)
* Improve Buffer input simplification for rings (#1022)
* Improve CoverageSimplifier with ring removal, smoothing, inner/outer and per-feature tolerances (#1060)

### Bug Fixes
* Fix `WKBReader` and `WKBWriter` handling of M measures when writing to WKB and reading from WKB (#734)
* Fix `PreparedGeometry` handling of EMPTY elements (#904)
* Fix `WKBReader` parsing of WKB containing multiple empty elements (#905)
* Fix `LineSegment.orientationIndex(LineSegment)` to correct orientation for non-collinear segments on right (#914)
* Fix `DepthSegment` compareTo method (#920)
* Ensure `GeometryFixer` does not change coordinate dimension (#922)
* Improve `ConvexHull` radial sort robustness (#927)
* Improve robustness of Delaunay Triangulation frame size heuristic (#931)
* Fix `PreparedLineString.intersects` to handle mixed GCs correctly (#944)
* Fix `QuadEdgeSubdivision.TriangleEdgesListVisitor` (#945)
* Fix `PolygonHoleJoiner` to handle all valid inputs
  (allows `PolygonTriangulator`, `ConstrainedDelaunayTriangulator`, and `ConcaveHullOfPolygons` to work correctly) (#946)
* Fix `OffsetCurve` handling of input with repeated points (#956)
* Fix `OffsetCurve` handling zero offset distance (#971)
* Fix `MaximumInscribedCircle` and `LargestEmptyCircle` to avoid long looping for thin inputs (#978)
* Fix `OffsetCurve` to use a minimum QuadrantSegs value (#981)
* Fix `HilbertEncoder` Y extent handling
* Fix `Geometry.getCoordinate` to return non-null coordinate for collections with empty first element (#987)
* Fix `LargestEmptyCircle` to handle polygonal obstacles (#988)
* Make intersection computation more robust (#989)
* Fix `VariableBuffer` to handle zero vertex buffer distances correctly (#997)
* Fix `IncrementalDelaunayTriangulator` to ensure triangulation boundary is convex (#1004)
* Fix OverlayNG Area Check heuristic for difference (#1005)
* Fix `InteriorPointPoint` to handle empty elements
* Fix `DistanceOp` for empty elements (#1010)
* Fix predicates for MultiPoint with EMPTY (#1015)
* Fix `InteriorPoint` for MultiLineString with EMPTY (#1023)
* Fix TopologyPreservingSimplifier to prevent incorrect topology from jumping components (#1024)
* Fix OffsetCurve to ensure end segments are included (#1029)
* Fix `PointLocator` to respect `BoundaryNodeRule` for single lines (#1031)
* Fix `BufferOp` Inverted Ring Removal check (#1038)
* Improve `VariableBuffer` segment buffer cap generation (#1041)
* Fix `TopologyPreservingSimplifier` ring endpoint removal indexing (#1059)

### Performance Improvements

* Improve `Polygonizer` performance in some cases with many islands (#906)
* Improve Convex Hull performance by avoiding duplicate uniquing (#985)
* Improve `HPRtree` performance (#1012)
* Improve performance of noding and overlay via `HPRtree` (#1012) 
* Improve `DistanceOp` performance for Point-Point (#1049)
* Improve `CoveragePolygonValidator` via section performance optimization (#1053)

# Version 1.19

*Release Date: 06/21/2022*

### New Features

* Add `ConstrainedDelaunayTriangulator` and `PolygonTriangulator` (#775, #862)
* Add `Tri` data structure for representing triangulations (#775)
* Add `DiscreteFrechetDistance` (#764, #783)
* Add `OffsetCurve` class (#810, #816)
* Add `ConcaveHull` class for points (#823, #829)
* Add `ConcaveHullOfPolygons` class (#870)
* Add `PolygonHullSimplifier` class (#861, #880)
* TWKB read and write implementation (#854)
* Add `CubicBezierCurve` class

### Functionality Improvements

* Improve `GeometryFixer` behaviour for holes outside polygons (#772)
* Simplify and fix logic of `BufferParameters.setQuadSegs` (#778)
* Improve `KdTree` query code to avoid recursion (#779)
* Add `KdTree` seeding to`SnappingNoder` (#780)
* Add `GeometryFixer` option to preserve `Multi` geometry types when collapses occur (#791)
* Make `QuadTree` thread-safe (#792)
* Allow specifying a fixed `PrecisionModel` via grid size (#804)
* Improve `Densifier` to interpolate Z values (#835)
* Add support for GeoJSON `Feature` and `FeatureCollection` types (#837)
* Add `WKTReader.setFixStructure` to fix WKT input (#848)
* Improve `LineSegment.hashCode` to reduce collisions (#872)

### Performance Improvements

* Improve performance of `CoverageUnion` by using boundary chains (#891)

### Bug Fixes

* Fix `WKTReader` geometry typename parsing (#786)
* Fix `CoordinateArrays.reverse` to handle zero-length arrays (#787)
* Fix `GeometryFixer` to appply `isKeepCollapsed` flag to `GeometryCollection` elements (#790)
* Fix `RectangleIntersects` to handle XYZM geometry (#794)
* Fix various operations to handle XYZM geometry (#795)
* Fix `SnapRoundingNoder` to use tolerance in noding (also fixes `GeometryPrecisionReducer`) (#802)
* Fix `MaximumInscribedCircle` to avoid infinite-looping on flat collapsed input (#807)
* Add `OverlayNG` result area heuristic check (#812)
* Fix the buffers generated for mitred joins (#818)
* Fix `WKTReader` to produce correct XY coordinate dimension for POLYGON EMPTY (#828)
* Fix `RelateOp` for a snapped line boundary point (#839)
* Fix IsValidOp for repeated node points (#845)
* Fix `IsSimpleOp` for repeated endpoints (#851)
* Fix `GeometryFixer` via noding check for zero-distance buffers (#867)
* Fix `MinimumDiameter.minimumRectangle` for flat inputs (#875)
* Fix `BufferOp` inverted ring check optimization (#878)
* Fix `STRtree` nearest-neighbour queries on empty trees to avoid NPE (#886)
* Remove transitive compile dependency on `junit` from `jts-io-commmon` (#855)

# Version 1.18.2

*Release Date: 08/27/2021*

### API Changes

* Move `IsSimpleOp` to `org.locationtech.jts.operation.valid` package (#717)

### New Features

* Add `GeometryFixer` class (#704)

### Functionality Improvements

* Improve design and performance of `IsSimpleOp` (#717, #754)
* Improve design and perforance of `IsValidOp` (#743, #748, #755, #756, #757)
* Fix `SortedPackedIntervalRtree` to be thread-safe (fixes `PreparedPolygon` too) (#746)

### Bug Fixes

* Fix `InteriorPoint` to handle partially-empty collections (#698)
* Fix `MultiPoint.isValid` to check validity correctly (#700)
* Fix `WKTReader` and `WKTWriter` handling of collections with all empty elements (#702)
* Fix `HalfEdge.prev()` method (#703)
* Fix `BufferOp` to remove invalid elements caused by inverted ring curves (#706)
* Fix `IsSimpleOp` duplicate lines bug (#716)
* Fix `Angle.interiorAngle` to produce interior angle correctly (#721)
* Fix `IsValidOp` to correctly report invalidity for certain kinds of LinearRings (#737)
* Fix `GeometryPrecisionReducer` to support the "keep collapsed components" semantics (#738)
* Fix `VoronoiDiagramBuilder` to respect user-provided clip envelope (#740)

<!-- ================================================================ -->

# Version 1.18.1

*Release Date:  02/26/2021*

### Functionality Improvements

* Check for invalid polygonal geometry before fixing in `DouglasPeuckerSimplifier`, `VWSimplifier`, `Densifier` (#656)
* Add `Coordinate` and subclasses `create()` methods (#637)
* Ensure OverlayNG input line order is preserved (#665)
* Add `UnaryUnionNG` functions that accept `Collection`s (#669 and #670)
* Switch to using compact-SRID WKB format (#664)
* Improve `WKBReader` error checking (#675)
* Improve `Densifier` splitting algorithm to create longer segments (#677)
* Allow constructing invalid `Polygon`s and `LinearRing`s with only 3 vertices (#682)
* Ensure invalid 3-point polygons and rings are handled correctly (#683)
* Fix `GeoJSONReader` to parse null and empty coordinates as empty geometry (#687)
* Fix `GeoJSONWriter` to emit empty coordinates array for empty point and linestring (#688)
* Add `MaximumInscribedCircle` check for invalid tolerance, to avoid infinite loops (#696)
* Add `GeoJsonWriter.setForceCCW` method to emit polygons with CCW orientation, as per GeoJSON specification (#694)

### Bug Fixes

* Ensure `Densifier` creates `Coordinate`s with same class as input (#637)
* Fix Relate for cases with closed linear geometry and empty geometry (#671)
* Fix `Densifier` to avoid splitting segments with length equal to distance tolerance (#676)
* Fix `Geometry.compareTo` to test polygon holes (#678)
* Fix OverlayNG handling of polygons with interior flat lines (#685)
* Fix `Polygonizer` to avoid NPE on invalid input (#692)

### WKBDump

* Added utility to dump out formatted WKB (#673)

<!-- ================================================================ -->

# Version 1.18.0

*Release Date:  12/23/2020*

### API Changes

* `GeometryPrecisionReducer` is less tolerant of invalid input (but also avoids failing on some valid ones) (#648)
* Moved `Position` and `Quadrant` to `org.locationtech.jts.geom` package
* Removed `SimpleSnapRounder` - use `SnapRoundingNoder` instead
* Deprecated `MCIndexSnapRounder` - use `SnapRoundingNoder` instead

### New Features

* Add `KMLReader` (#593)
* Add `OverlayNG` codebase (#599)
* Add Z support in OverlayNG (#645)
* Add system property `jts.overlay=ng` to enable use of OverlayNG in `Geometry` methods (#615)
* Add `SnapRoundingNoder` (#599)
* Add `SnappingNoder` (#599)
* Add `Orientation.isCCWArea` (#655)

### Functionality Improvements

* Improve `Orientation.isCCW` to handle flat topology collapse (#588)
* Add `Densifier.setValidated` method to allow disabling expensive polygon validation (#595)
* Change `GeometryPrecisionReducer` to use OverlayNG with Snap-Rounding
* Change `GeometryNoder` to use `SnapRoundingNoder`
* Add `KdTree` `size` and `depth` methods (#603)
* Improve `WKBWriter` to write empty Polygons using a more compact representation (#623)
* Support read and initialize internal structure of `STRtree` and `Quadtree` (#634)
* Improve `GeometryPrecisionReducer` to handle GeometryCollections (#648)

### Performance Improvements

* Improve performance of `UnaryUnionOp` by removing OverlayUnion optimization (#644)

### Bug Fixes

* Fix `RayCrossingCounter` to handle XYZM coordinates (#589)
* Fix `PackedCoordinateSequence` to always use XYZM coordinates when dimension is 4 (#591)
* Fix `OrdinateFormat` to work around a JDK issue with the minus sign character in `Locale.NO` (#596)
* Fix `GeoJsonReader` to throw a `ParseException` for empty arrays (#600)
* Fix `WKTFileReader` handling of files with large amount of whitespace (#616)
* Fix `WKBWriter` to output 3D empty Points with 3 ordinates (#622)
* Fix `Geometry.reverse` to handle all geometry structures (#628)
* Fix `GeometryPrecisionReducer` to avoid silently mangling input (#648)
* Fix `Geometry.buffer` to avoid dropping large polygon areas in some situations (#655)
  * also fixes `DouglasPeuckerSimplifier` (#498)


## JTS TestBuilder

### Functionality Improvements

* Add Geometry Inspector sorting by Area or Length

<!-- ================================================================ -->

# Version 1.17.1

*Release Date:  August 27, 2020*

*Java Version: 1.8*

### Functionality Improvements

* Add `WKBReader` and `WKBWriter` support for `POINT EMPTY` (#567)

### Performance Improvements

* Improve performance of `PreparedPolygon` `covers` and `contains` for point inputs (#577)

### Bug Fixes

* Fix `IndexedPointInAreaLocator` thread-safety (#572)
* Fix `WKTReader` to handle MultiPoints containing `EMPTY` (#575)
* Fix API compile regression by removing deprecation on geometry `reverse` methods (#582)

## JTS TestBuilder

### Functionality Improvements

* Add per-Layer palette control for Strokes and Fills

## JTS TestRunner

### Functionality Improvements

* Enhance `-geomfunc` to load multiple function classes
* Fix function registry to replace matching loaded functions (#569)

## JtsOp

* Added `-limit` and `-offset` options for reading from file inputs (#617)


<!-- ================================================================ -->

# Version 1.17.0

*Release Date:  July 1, 2020*

*Java Version: 1.8*

### API Changes

* Change `Polygon` `getExteriorRing` and `getInteriorRingN` accessors to return `LinearRing`.
  * *This is a binary incompatible change to the method signature.  Recompilation is necessary. No source code changes are required.*

### New Features

* Added `IndexedFacetDistance.isWithinDistance`
* Added `OrdinateFormat` to ensure that ordinate text output is accurate and consistent
* Added `Triangle.circumcentreDD`
* Added `DD.determinant` methods
* Added `Envelope` methods `getDiameter`, `copy`, `disjoint` (#483)
* Added `Intersection` class, refactored library to use it (#468)
* Added `CoordinateList.toCoordinateArray(isForward)` (#482)
* Added `HPRtree` Hilbert Packed R-tree (#494)
* Added `VariableBuffer` class for computing varying-distance buffers (#495)
* Added `LineSegment.reflect` method (#495)
* Added `MaximumInscribedCircle` algorithm (#530)
* Added `LargestEmptyCircle` algorithm (#530)

### Functionality Improvements

* Added `CascadedPolygonUnion` union-by-buffer on error capability (#470)
* Added `HalfEdge` support for direction points (#479)

### Performance Improvements

* Improve performance of `UniqueCoordinateFilter` (#422)
* Improve performance of `Polygonizer` (#431)
* Avoid use of `ArrayList` in MonotoneChain builders
* Add `DistanceOp` line-line envelope short-circuit optimizations (#534)

### Bug Fixes

* Fix `PackedCoordinateSequence.Float` construction methods (#379, #381)
* Fix bug in `Quadtree.ensureExtent` (#416)
* Fix bugs in `LinearLocation` endpoint handling (#421)
* Fix bug in `MinimumBoundingCircle` maximum diameter algorithm, and provide method for it
* Improve robustness of `CascadedPolygonUnion` by adding `OverlapUnion`
* Fix bug in `HalfEdge.insert` method which caused CCW order not to be preserved in some cases
* Fix generation of Voronoi diagrams for cases with sites in a square (#447)
* Fix use of clipping envelope in `VoronoiDiagramBuilder`
* Fix infinite loop on empty input in `IndexedPointInAreaLocator` and `SortedPackedIntervalRTree` (#462)
* Fix WKT parsing in Turkish locale (#456)
* Improve accuracy of `LineSegment.lineIntersection` (#468)
* Fix `Distance3DOp` coordinate ordering (#480)
* Fix `Geometry.reverse()` to have consistent behaviour and to copy all fields (#513)
* Fix `MinimumBoundingCircle.farthestPoints` to work correctly (#522 and #533)
* Fix `DistanceOp` handling of geometry collections with empty components (#524)
* Fix GML parsing of coordinates and SRS name (#553)

## JTS TestBuilder

### Functionality Improvements

* Add a UI to run external commands
* Allow creating additional view layers
* Add map view title, legend and border options
* Support points in Reveal Topology mode
* Add WKT panel **Copy as WKB** via Ctl-click

## JTS TestRunner

### Functionality Improvements

* Allow test files/dirs to be specified as free args
* Only load `.xml` files from directories

## JtsOp

* Added command-line utility to run JTS operations



<!-- ================================================================ -->

# Version 1.16.1

*Release Date:  Febuary 19, 2019*

### Functionality Improvements

* Added `HilbertCode` and `HilbertCurveBuilder`.
* Added `MortonCode` and `MortonCurveBuilder`.
* Improved `InteriorPointArea` algorithm performance and robustness
* Add `IndexedFacetDistance` methods `nearestLocations` and `nearestPoints`
* Make `IndexedFacetDistance` thread-safe
* Add `SimplePointInAreaLocator` envelope check

### Bug Fixes

* Fix `IsValidOp` to handle empty components.
* Fix `ShapeWriter` to handle Polygons with empty holes.
* Fix `CoordinateArraySequence` to duplicate coordinate array if needed to make coordinates consistent (rather than fix in place)
* Fix `AffineTransformation.rotate`

## JTS TestBuilder

### Functionality Improvements

* Added per-layer style control
* Change UI terminology to **Reveal Topology**
* Add undo capability
* Add more functions to **Delete Components** tool
* Add **Save Image to PNG** button
* Add **Scalar Function** panel logging
* Add Pan capability to **Zoom Tool**
* Improve arrow styling
* Add meta-function options **Each** and **Repeat**

<!-- ================================================================ -->

# Version 1.16

*Release Date:  September 10, 2018*

### API Changes

* Added XYZM support to `CoordinateSequence` and `CoordinateSequenceFactory` with `getDimension()` and `getMeasures()` information.
* Added `Coordinate` methods for `getX()`, `getY()`, `getZ()`, and `getM()`.
* Deprecated `Coordinate.z` field.  Use `Coordinate.getZ()`.
* `Coordinate` subclasses introduced for XY, XYM, XYZM representations.


### Functionality Improvements

* Removed `PackedCoordinateSequenceFactory` constructor used to supply a default dimension.  Use appropriate `create( size, dimension )` instead.
* Added `WKTReader` and `WKTWriter` support for measures


<!-- ================================================================ -->

# Version 1.15

*Release Date:  November 30, 2017*

### Project Changes

* Changed licensing to dual-licensed EDL or EPL
* Changed source hosting to GitHub
* Changed distro hosting to GitHub
* Changed build chain to use Maven
* Changed code module structure


### API Changes

* Changed Java package root to `org.locationtech.jts`
* Refactored `CGAlgorithms` into function-specific classes
    `Orientation`, `PointLocation`, `Distance`, `Length`, `Area`
* Deprecated `NonRobustCGAlgorithms`; use function-specific classes refactored from `CGAlgorithms`
* Deprecated `RobustDeterminant`; use `CGAlgorithmsDD`
* Deprecated `Geometry.clone`; use `Geometry.copy`
* Deprecated `GeometryFactory.createX(null)` methods; Use no-argument `GeometryFactory.createX` methods
* Deprecated overloaded `GeometryFactory.createMultiPoint`; use `GeometryFactory.createMultiPointFromCoords`


### Functionality Improvements

* Improve `Quadtree` to handle queries with null envelopes
* Add `STRtree` K-Nearest Neighbours query
* Add `Serializable` to ``PackedCoordinateSequence`
* Add `Envelope.intersects`
* Add `Geometry.intersects` for `GeometryCollection`
* Improve `WKBReader` to handle the OGC 06-103r4 specification.
* Improve `WKTReader` to handle `Z`, `M`, `ZM` modifiers.


### Performance & Robustness Improvements

* Add optimization for `Geometry.contains` and `Geometry.covers`
* Improve robustness of `RayCrossingCounter` and `Geometry.contains`
* Improve robustness of `MultiPolygon` centroid computation


### Bug Fixes

* Eliminated `LineString.normalize` side-effects


<!------- TestBuilder -------------------->

## JTS TestBuilder

### Functionality Improvements

* Added function `Writer.writeGeoJSON`
* Added tree view of scalar functions
* Added ability to repeat functions
* Added custom fill styling
* Added `SelectionFunctions` for metrics (area, length)
* Added function documentation driven by annotations
* Some changes to layout of GUI elements (such as toolbar)


<!-- ================================================================ -->

# Version 1.14

*Release Date:  September 23, 2015*

### Functionality Improvements

* Added `Envelope.compareTo` method
* Fixed `SegmentSetMutualIntersector` classes to be thread-safe
* Fixed `PreparedGeometry` classes to be thread-safe
* Added `LineDissolver` class
* Added `edgegraph` package
* Added `CoordinateSequences.isEqual` method
* Extended `CoordinateSequences.copy` and `CoordinateSequences.copy` to handle inputs of different dimension
* Added `CoordinateArrays.envelope()` function
* Added `CoordinateArrays.intersection()` function
* Added `Polygonizer.setCheckValidRings()` method for optimizing performance in some situations
* Added `KMLWriter` to convert Geometry to KML representation
* Added `Coordinate` `equals3D`, `equals2D(Coordinate, tolerance)`, and `equalInZ` methods.
* Added `VWSimplifier` to perform Visvalingam-Whyatt simplification
* Enhanced `WKBReader` to handle Spatialite WKB format
* Added `DD.setValue()` methods
* Added `getGeometry()` methods to `LinearComponentExtracter` and `LineStringExtracter`
* Added `BufferParameters` `simplifyFactor` setting
* Added node counting and ability to not keep intersection points to `InteriorIntersectionFinder`
* Added `Polygonizer` functionality to extract only polygons forming a valid polygonal geometry
* Added `KdTree.toCoordinates`
* Added `MinimumBoundingCircle.getFarthestPoints` method


### Performance Improvements

* Performance & memory improvement in `PreparedPolygonIntersects` by short-circuiting point input case
* Allow for memory usage optimization in `CascadedPolygonUnion`, by avoiding retaining input collection
* Fix `Point.isEmpty()` to avoid allocating a coordinate
* Fix `Geometry.equalsExact()` to short-circuit when the inputs are identical objects
* Add short-circuit to `PointExtracter` to improve performance for Points


### Bug Fixes

* Fixed `RobustLineIntersector` heuristic for handling invalid intersection points
(computed as outside envelope of input segments due to numeric precision issues)
* Fixed `CGAlgorithmsDD.intersection` to compute intersection correctly
* Fixed `Geometry.interiorPoint()` to compute a true interior point in certain cases
* Fixed `Geometry.equals` to handle null argument
* Fixed `DistanceToPoint` to be thread-safe
* Fixed `Geometry.interiorPoint()` and `InteriorPointArea` to handle zero-area geometries
* Fixed `STRtree` classes to be thread-safe (by synchronizing the `AbstractSTRtree.build()` method)
* Fixed `STRtree.remove()` method to avoid a NPE
* Fixed `DouglasPeuckerSimplifier` and `TopologyPreservingSimplifier` to handle empty geometry components in the input
* Fixed `ConvexHull` to handle input of array of identical coordinates
* Fixed `GeometryTransformer.transformLinearRing()` to handle null inputs
* Fixed the `extractPoint(distance, offset)` methods in
  `LocationIndexedLine` and `LengthIndexedLine` to handle offsets from endpoints correctly.
* Fixed `GeometryCollectionIterator` to correctly handle atomic geometries
* Fixed `InteriorIntersectionFinder` to not short-circuit when finding all nodes
* Fixed `SubgraphDepthLocator` to work with Java 7+ by avoiding sorting with an inconsistent ordering
* Fixed `FontGlyphReader` to use correct Java font value of "SansSerif", and added new constant to match.
* Fixed `KdTree` to correctly implement distance tolerance-based coordinate matching
* Fixed `LineString.normalize()` to correctly handle CoordinateSequences
* Fixed `CommonBitsRemover` to correctly handle CoordinateSequences
* Fixed bug in `CoordinateArraySequence.clone()`


### API Changes

* Changed interface of `SegmentSetMutualIntersector` to support thread-safety by removing state
* Provided `InteriorIntersectionFinderAdder` to replace the poorly named `IntersectionFinderAdder`
* Changed some classes in `com.vividsolutions.jts.operation.buffer` to be package-private


### Testing Improvements

* Added `GeometryTestCase` base class to simplify unit tests


<!------- JTS-IO -------------------->

## JTS I/O

### Functionality Improvements

* Added `GeoJsonReader` and `GeoJsonWriter` classes


### API Changes

* In `OraWriter` the connection is now provided to the `write()` method, not the constructors


### Bug Fixes

* Fixed `OraReader` to handle reading `GeometryCollection` with `Point` as second element
* Many improvements to Oracle API code and performance
* Added `OraWriter.setOptimizePoint` and `OraWriter.setOptimizeRectangle` methods


<!------- TestBuilder -------------------->

## JTS TestBuilder

### Functionality Improvements

* Added ability to read multiple WKBHex geometries from a text file
* Added AutoZoom to input
* Added Oracle text output
* Added more function sets
* Removed dependency on Acme GIF encoder library
* Improved zooming logic
* Added mouse wheel zooming
* Improved UI for editing A/B geometries
* Added **Compute New** button to Geometry Functions panel
* Added SpatialIndex functions
* Added User Data labelling


### UI Changes

* Moved Options menu items to View menu
* Removed Tools menu items (they are available as functions)


### Bug Fixes

* Fixed to correctly handle changing Swing Look&Feel



<!-- ================================================================ -->

# Version 1.13

*Release Date:  December 13, 2012*

### Functionality Improvements

* Changed `GeometryFactory.createGeometry()` to make a deep copy of the argument Geometry,
using the CoordinateSequenceFactory of the factory
* Added ability to specify a dimension in `CoordinateArraySequence`
* Changed `Geometry.getEnvelopeInternal()` to return a copy of the cached envelope, to prevent modification
* Added `GeometryEditor.CoordinateSequenceOperation` to allow easy editing of constituent CoordinateSequences
* Added `GeometryFactory.createPolygon` convenience methods which do not require holes to be specified
* `Geometry` overlay methods now return empty results as atomic types of appropriate dimension
* Added `RectangleLineIntersector` to provide efficient rectangle-line intersection testing
* Added `getOrdinate` and `setOrdinate` to `Coordinate`
* `Quadtree` is `Serializable`
* `STRtree` is `Serializable`
* Added `max`, `average` and `wrap` functions to `MathUtil`
* Improved `WKTReader` parse error reporting to report input line of error
* Improved `WKBReader` to repair structurally-invalid input
* Made `TopologyPreservingSimplifier` thread-safe
* Added `AbstractSTRtree.isEmpty()` method
* Added `QuadTree.isEmpty()` method
* Added `KdTree.isEmpty()` method
* Added decimation and duplicate point removal to `ShapeWriter`.
* `ScaledNoder` now preserves Z values of input
* Added instance methods for all <t>Triangle` static methods
* Added `CGAlgorithmsDD` containing high-precision versions of some basic CG algorithms
* Added `IntersectionMatrix.isTrue()` method for testing IM pattern matches
* Added `getRawCoordinates` methods to `PackedCoordinateSequence` concrete classes
* Modified `Geometry.isSimple()` to explicity check for simplicity for all types,
and support `GeometryCollections`
* Improved `MCIndexSnapRounder` to add nodes only where they are necessary
* Added `CoordinateArrays.removeNull()` method
* Enhanced `GeometryEditor` to handle null geometries returned from operation
* Added `WKBHExFileReader`
* Added `Distance3D` operation


### Performance Improvements

* Simplified & improved performance of `RectangleIntersects` by using new `RectangleLineIntersector`
* In `RandomPointsInGridBuilder` eliminated redundant `ArrayList` usage
* In `PreparedPolygonIntersects` and `PreparedLineStringIntersects` added check
to avoid creating segment index if all test inputs are points
* In `AbstractSTRtree` switched to using indexed list access for better performance than using iterators
* In `AbstractSTRtree` freed inserted item array after index is built
* Improved performance of `Polygonizer` for cases with many potential holes
* Improved performance for some `DD` methods by making them `final`
* Added fast filter for `CGAlgorithmsDD.orientationIndex`, and switched to self-operations for DD determinant
* Changed `STRtree.createNode()` to use a static class for nodes
* Changed `QuadTree Node` to use scalar x and y variables rather than a `Coordinate` to reduce memory allocation
* Fixed `PreparedGeometry` concrete classes to be thread-safe.
* Fixed `SortedPackedIntervalRTree` so that it is thread-safe.


### Robustness Improvements

* Switched to using DD extended-precision arithmetic to compute orientation predicate
* `CGAlgorithms.distanceLineLine()` improved to be more robust and performant
* Fixed robustness issue causing `Empty Stack` failure
in `ConvexHull` for some nearly collinear inputs
* `CGAlgorithms.signedArea()` uses a more accurate algorithm


### Bug Fixes

* Fixed `Geometry.equalsExact()` to avoid NPE when comparing empty and non-empty `Point`s
* Fixed `CascadedPolygonUnion` to discard non-polygonal components created during unioning,
to avoid failures and provide more desirable behaviour
* Fixed `CentralEndpointIntersector` to initialize result correctly
* Fixed `DelaunayTriangulationBuilder.extractUniqueCoordinates(Geometry)`
to avoid mutating the vertex order of the input Geometry
* Fixed `ConformingDelaunayTriangulationBuilder` to allow
non-disjoint site and constraint vertex sets
* Fixed `RandomPointsInGridBuilder` point generation to use circle constraint correctly
* Fixed Linear Referencing API to handle MultiLineStrings consistently,
by always using the lowest possible index value, and by trimming zero-length components from results
* Fixed bug in `LocationIndexedLine` and `LengthIndexLine` which was
causing an assertion failure when the indexOfAfter() method was called with a constraint location
which is at the end of the line
* Fixed bug in `STRtree.query(Envelope, ItemVisitor)` causing an NPE when tree is empty
* 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.
* Fixed `TopologyPreservingSimplifier` to return a valid result
for closed `LineString`s with large distance tolerances
* Fixed `TopologyPreservingSimplifier` to return an empty result for an empty input
* Fixed `DouglasPeuckerSimplifier` to return an empty result for an empty input
* Fixed `MinimumBoundingCircle` to correctly compute circle for obtuse triangles.
* Fixd `GeometryPrecisionReducer` to use input GeometryFactory when polygon topology is fixed
* Fixed `GeometryNoder` bug that was failing to snap to end vertices of lines
* Fixed `Geometry.getCentroid()` and `Geometry.getInteriorPoint()` to return `POINT EMPTY` for empty inputs
* Fixed `DelaunayTriangulationBuilder` to correctly extract unique points
* Fixed `KdTree` to correctly handle inserting duplicate points into an empty tree
* Fixed `LineSegment.projectionFactor()` to handle zero-length lines (by returning Double.POSITIVE_INFINITY)
* Fixed `LocationIndexedLine` to handle locations on zero-length lines
* Fixed `LengthIndexedLine` and `LocationIndexedLine` to handle `indexOfAfter()` correctly
* Fixed `WKBReader` to handle successive geometrys with different endianness
* Fixed `GeometricShapeFactory` to correctly handle setting the centre point
* Fixed `GeometryFactory.createMultiPoint(CoordinateSequence)` to handle sequences of dimension > 3


### API Changes

* Changed visibility of `TaggedLineStringSimplifier` back to `public` due to user demand


### Testing

* Added Performance Testing framework (`PerformanceTestRunner`
and `PerformanceTestCase`)
* Added named predicate tests to all Relate test cases


### Contributors

* Peter Hopfgartner - improved area computation
* Michael Michaud - snap-rounding improvements



<!------- TestBuilder -------------------->

## JTS TestBuilder

### Functionality Improvements

* Added segment index visualization styling
* Improved **Geometry Inspector**
* Added stream digitizing for Polygon and LineString tools
* Added output of Test Case XML with WKB
* Added Extract Component tool
* Added Delete Vertices Or Components tool
* Added Geometry Edit Panel pop-up menu, with operations
* Added Halton sequence functions
* Added sorting functions
* Added function for selection of first N components
* Added CGAlgorithms functions
* Added ability to paste and load multiple WKBHex geometries


### Performance Improvements

* Using decimation substantially improves rendering time for large geometries.


### Bug Fixes

* Fixed bug in saving XML test files


<!-- ================================================================ -->

# Version 1.12

*Release Date:  June 30, 2011*

### Functionality Improvements

* Added new names for methods for computing `Geometry` equality:
  * `equals(Object)` is a synonym for `equalsExact(Geometry)`
  * `equalsNorm(Geometry)` automatically normalizes the operands
  * `equalsTopo(Geometry)` computes topological equality, and is a synonym for the original `equals(Geometry)`
* Added `Geometry.norm()` to provide non-mutating normalization
* Added `Geometry.hashCode()` to fulfill Java conventions
* Added `LineIntersector.getEndpoint()` method
* Added methods to `CoordinateSequences` to test for and create valid rings
* Added `minExtent` and `maxExtent` to `Envelope`
* Added ability to compute Single-Sided Buffers (invoked via `BufferOp` and `BufferParameters`)
* Added `GeometryPrecisionReducer`
* Added ExtendedWKB SRID support to `WKBWriter` (thanks to Justin Deoliviera)
* Improved `PolygonShape` to support floating-point coordinates
* Added `GeometryShapeFactory.setRotation(double radians)` method
* Added `GeometricShapeBuilder` API to support shape builder development
* Added `RandomPointsBuilder` to allow generating various random point sets
* Added `RandomPointsInGridBuilder` to allow generating various random point sets constrained to a grid
* Added `KochSnowflakeBuilder`
* Added `SierpinskiCarpetBuilder`
* Added `MathUtil` containing mathematics and numerical utility functions
* Added `Vector2D` class providing vector operations
* Added `DirectedEdgeStar.getNextCWEdge()` method to `planargraph` API
* Improved `AffineTransformation` to avoid numeric precision issues in case of reflection in X=Y (coordinate flipping)
* Added `LineSequencer.sequence()` static convenience method
* Added error indicators to `BufferDistanceValidator` and `BufferResultValidator`
* Added `MinimumClearance` class
* Added `nearestNeighbours` methods to `STRtree`


### Performance Improvements

* Improved memory performance of `ShapeWriter` conversions (by tuning coordinate and polygon conversion)
* Improved performance of `RectangleIntersects` by refining `SegmentIntersectionTester`


### Robustness Improvements

* Delaunay triangulation uses more robust formulation for the inCircle test
* Voronoi computation now uses more robust formulation for the circumcentre computation
* Force `RectangleIntersects` to always use segment-scanning to improve robustness


### API Changes

* Reduced visibility of internal classes in `com.vividsolutions.jts.geom.prep`
* Reduced visibility of internal classes in `com.vividsolutions.jts.simplify`
* Moved `Matrix` class into `jts.math` package
* Refactored internal offset curve generation classes
in `com.vividsolutions.jts.operation.buffer` package


### Bug Fixes

* Fixed `CoordinateArraySequence` and `PackedCoordinateSequence`
to correctly handle Z ordinate in `getCoordinate(int, Coordinate)`
* Fixed `LinearRing` to have `isClosed()` return `true` for empty rings
* Fixed `Geometry.union()` to use more robust union algorithm.
    This provides behaviour consistent with `union(Geometry)`.
* Fixed `Point.isValid()` to validate POINT EMPTY correctly
* Fixed `SnapIfNeededOverlayOp` to throw the originating exception,which contains meaningful coordinates
* Fixed `GeometrySnapper` to allow final vertices of LineStrings to snap correctly
* Fixed buffer (`OffsetCurveSetBuilder`) to handle "flat" rings correctly
* Fixed `IsValidOp` to handle reporting "Not Closed" errors on empty rings correctly
* Fixed `NestedRingTester` (used by `IsValidOp`)
to correctly handle the case where a hole touches all the vertices of another hole (which is invalid)
* Fixed `ConvexHull` to handle large geometries with fewer than 3 unique points
* Fixed `GeometryGraph` to ignore empty hole rings when building graph
* Fixed `LineMerger` to skip lines with only a single unique coordinate
* Fixed `ByteArrayInStream` to pad byte buffers with zeroes
* Corrected spelling of `SquarePointShapeFactory`
* Fixed tolerance check in `KdTree`
* Updated `MasterTester` to include more unit tests


<!------- TestBuilder -------------------->

## JTS TestBuilder

### Functionality Improvements

* Added `[Zoom To Result]` button
* Improved mark display, with floating point label
* Added more random geometry creation functions
* Added fractal geometry creation functions
* Improved threaded rendering handling to ensure only one frame drawn
* Added Magnify Topology capability
* Added Geometry Inspector dialog
* Better startup script, with auto-home directory detection
and JTS_LIB_DIR environment variable (thanks to strk)
* Added logging Info window behaviour
* Improved saving PNG to allow specifying file name


### Bug Fixes

* Fixed Stats panel to update when current test changes
* Fixed deleting single test case


<!-- ================================================================ -->

# Version 1.11

*Release Date:  March 1, 2010*

### Functionality Improvements

* Added `CoordinateArrays.isRing`
* Added `CGAlgorithms.signedArea(CoordinateSequence)`
* Added `CoordinateArrays.copyDeep(...)` method to copy sections of arrays
* Added `CoordinateList.add(Coordinate[], boolean, int, int)` method to add sections of arrays
* Added `LineSegment.toGeometry()`, `LineSegment.lineIntersection()()`
* Added `LineSegment.hashCode()`
* Added geometric similarity classes (`HausdorffSimilarityMeasure`, `AreaSimilarityMeasure`)
* Added `MinimumDiameter.getMinimumRectangle()`
* Added `MinimumBoundingCircle` class
* Added `Densifier` class
* Added triangulation API, including `QuadEdgeSubdivision`, `IncrementalDelaunayTriangulator`,
	`ConformingDelaunayTriangulator` and supporting classes
* Added `VoronoiDiagramBuilder` to perform Voronoi diagram generation
* Added `scaleInstance(scaleX, scaleY, x, y)` to `AffineTransformation`
* Added `AffineTransformationFactory` to allow generating transformations from various kinds of control inputs
* Added `BinTree.remove()` method
* Fixed `BinTree.query()` to allow null interval arguments
* Added `ShapeReader` API to convert Java2D Shapes into JTS Geometry
* Added `ShapeWriter` API to convert JTS geometry into Java2D Shapes
* Added `FontGlyphReader` API to render Java2D text font glyphs into geometry
* Added `SdeReader` to **jtsio** library
* Added `Debug` break methods
* Added `Memory` utility for reporting memory statistics
* Added `ObjectCounter` utility for counting objects
* Added `createSquircle` and `createSuperCircle` to `GeometricShapeFactory`


### Performance Improvements

* Improved performance of `Geometry.getArea()` and `Geometry.getLength()` when used with custom `CoordinateSequence`s


### API Changes

* Deprecated `WKBWriter.bytesToHex` in favour of `WKBWriter.toHex` to regularize and simplify method name


### Bug Fixes

* Fixed Point.isValid() to check for invalid coordinates (ie with Nan ordinates)
* Fixed `Geometry.distance()` and `DistanceOp` to return 0.0 for empty inputs
* Fixed `Buffer` to handle degenerate polygons with too few distinct points correctly
* Added illegal state check in `LineSegment.pointAlongOffset()`
* Fixed exception strategy in `BufferSubgraph` to handle certain robustness failures correctly
* Fixed robustness problem in `OffsetCurveBuilder` in computing mitred joins for nearly parallel segments
* Fixed minor bug in `BufferInputLineSimplifier` which prevented simplification of some situations
* Fixed bug in `BufferInputLineSimplifier` which caused over-simplification for large tolerances
* Fixed bug in `Angle.normalizePositive` to handle values > 2PI correctly
* Fixed `WKTWriter` to emit correct syntax for MULTIPOINTs
* Fixed `WKTReader` to accept correct syntax for MULTIPOINTs
* `CGAlgorithms.isCCW` now checks for too few points in the ring and throws an `IllegalArgumentException`
* Fixed bug in `AffineTransformation#eqals` (logic bug)
* Fixed bug in `CoordinateList#closeRing` (cloning closing Coordinate)


<!------- TestBuilder -------------------->

## JTS TestBuilder

### Functionality Improvements

* WKT input is cleaned automatically when loaded (illegal chars are removed)
* Added WKT-Formatted option to Test Case View dialog
* Many new geometry functions added
* Geometry functions are displayed in tree
* Geometry functions can be implemented as Java static class methods.
* Geometry function classes can be loaded dynamically from command-line
* Improved handling of very large geometry inputs and results
* Threaded rendering allows display of very large geometries without limiting usability
* Added Draw Rectangle tool
* Added Drag-n-drop loading of .SHP files
* Added Info tool to provide persistent display of geometry point/segment information
* Added display of memory usage



<!-- ================================================================ -->

# Version 1.10

*Release Date:  December 31, 2008*

### Functionality Improvements

* Added `Geometry.reverse()` method for all geometry types
* Added `setSrsName`, `setNamespace`, `setCustomRootElements` methods to `GMLWriter`
* Added `Envelope.getArea` method
* Added `copy`, `copyCoord` methods to `CoordinateSequences`
* Added `area` method to `Envelope`
* Added `extractPoint(pt, offset)` methods to `LengthIndexedLine` and `LocationIndexedLine`
* Added `CoordinatePrecisionReducerFilter`
* Added `UnaryUnionOp(Collection, GeometryFactory)` constructor to handle empty inputs more automatically
* Added `DiscreteHausdorffDistance` class
* Made `LineMerger` able to be called incrementally
* Added `GeometricShapeFactory.createArcPolygon` to create a polygonal arc
* Enhanced `Geometry.buffer()` to preserve SRID


### Performance Improvements

* Improved performance for `EdgeList` (by using a more efficient technique for detecting duplicate edges)
* Improved performance for `ByteArrayInStream` (by avoiding use of `java.io.ByteArrayInputStream`)
* Unrolled intersection computation in `HCoordinate` to avoid object allocation
* Improved performance for buffering via better offset curve generation and simplification.
* Improved performance for `IsValidOp` by switching to use `STRtree` for nested hole checking


### Bug Fixes

* Fixed `Geometry.getClassSortIndex()` to lazily initialize the sorted class list.  This fixes a threading bug.
* Fixed `RectangleContains` to return correct result for points on the boundary of the rectangle
* Fixed error in `com.vividsolutions.jts.simplify.LineSegmentIndex` which caused polygons
simplified using `TopologyPreservingSimplifier` to be invalid in certain situations
* Fixed error in `DouglasPeuckerSimplifier` which caused empty polygons to be returned when they contained a very small hole
* Fixed `PackedCoordinateSequence` to return `NaN` for null ordinate values
* Fixed `Geometry.centroid()` (`CentroidArea`) so that it handles degenerate (zero-area) polygons
* Fixed `Geometry.buffer()` (`OffsetCurveBuilder`) so that it handles JOIN_MITRE cases with nearly collinear lines correctly
* Fixed `GeometryFactory.toGeometry(Envelope)` to return a CW polygon
* Fixed `UnaryUnionOp` to correctly handle heterogeneous inputs with P/L/A components
* Fixed `UnaryUnionOp` to accept `LINEARRING`s
* Fixed `CentroidArea` to handle zero-area polygons correctly
* Fixed `WKBWriter` to always output 3D when requested, and to handle 2D `PackedCoordinateSequences` correctly in this case
* Fixed `NodedSegmentString` to handle zero-length line segments correctly (via `safeOctant`)
* Cleaned up code to remove unneeded `CGAlgorithms` objects
* Fixed `GeometricShapeFactory.createArc` to ensure arc has requested number of vertices


### API Changes

* Moved GML I/O classes into core JTS codebase
* Changed `GMLWriter` to not write the `srsName` attribute by default
* In `DistanceOp` switched to using `nearestPoints` method names
* Exposed `STRtree.getRoot()` method



<!------- TestBuilder -------------------->

## JTS TestBuilder

### UI Improvements

* Added ability to read GML from input panel
* Added GML output to View dialog
* Added file drag'n'drop to Geometry Input text areas
* Add display of computation time
* Added Stats panel
* Added Scalar functions panel, with extensible function list
* Added **Save as PNG...**
* Added stream digitizing to Polygon and Line Draw tools


<!------- TestRunner -------------------->

## JTS TestRunner

### Functionality Improvements

* Added `-testCaseIndex` command-line option


<!-- ================================================================ -->

# Version 1.9

*Release Date: January 2, 2008*

### Functionality Improvements

* Added `Polygonal`, `Lineal`, `Puntal` tag interfaces to better categorize geometry classes
* Added `Geometry.union()` method, `UnaryUnionOp` class for efficient unioning of geometrys
* Added `Triangle.area3D` method
* Added `LineSegment.pointAlongOffset` method
* Added `LineSegment.orientationIndex(Coordinate)` method
* Added `PreparedGeometry` classes and methods to optimize some geometry functions in batch situations
* Added `Envelope.covers` methods, for preciseness
* Added `OctagonalEnvelope` class
* Improved `CGAlgorithms.isPointInRing` method to handle case where point lies on the ring
* Added `CGAlgorithms.locatePointInRing` method
* Added `PointInAreaLocator` interface, enhanced `SimplePointInAreaLocator` to extend this
* Added `RayCrossingCounter`,  `IndexedPointInAreaLocator` classes for more efficient Point-In-Polygon testing
* Added `GeometryCombiner` class
* Enhanced `BufferOp` with join styles
* Enhanced `WKTReader` to accept any case for `NaN` number symbols
* Added `WKTFileReader` class
* Improved performance of `CoordinateList` constructors
* Added `CascadedPolygonUnion` class
* Added `LinearLocation.isOnSameSegment` method
* Added `LinearLocation.getSegment` method
* Added `LocationIndexedLine.indexOfAfter` method
* Added interpolation of Z value to linear referencing methods
* Added methods to rotate around a given point to `AffineTransformation`
* Allowed `GeometricShapeFactory` to be subclassed to add new shapes
* Added `SineStarFactory` (primarily to support testing)
* Added `SortedPackedIntervalRTree` class
* Added `SegmentSetMutualIntersector` interface and implementations
* Added `Node.remove(DirectedEdge)` method in `planargraph` package


### Performance Improvements

* Improved performance for `SimplePointInAreaLocator` (by checking ring envelopes as a filter)


### Bug Fixes

* `Geometry.buffer` operation fixed to always return polygonal geometries
* Fixed bug in `Geometry.buffer(distance, quadrantSegs)`
causing failure for some cases with `quadrantSegs = 1`
* Fixed bug in `GeometryFactory.toGeometry(Envelope)`
which was returning invalid Polygons for "linear" envelopes
* Fixed bug in `MonotoneChainBuilder` which caused failures in situations with segments of zero length
* Fixed `PointLocator` to handle locating in Point geometries
* Fixed `GeometricShapeFactory` to always use provided PrecisionModel
* Fixed `LinearLocation.clone` method
* Fixed `LinearLocation.isValid` method
* Fixed `Polygonizer` to accept single-point linestrings (which are ignored)


### API Changes

* Deprecated `RobustCGAlgorithms`
* Deprecated `BufferOp` cap style constants (these are now provided in `BufferParameters`)
* Removed `SIRPointInRing`


<!------- TestRunner -------------------->

## JTS TestRunner

### New Features

* Added ability to specify GeometryOperation in XML file
* Added `BufferValidatedGeometryOperation`
* Added ability to specify custom result matching via `resultMatcher` parameter
in XML files
* Added `BufferResultMatcher`



<!------- TestBuilder -------------------->

## JTS TestBuilder

### UI Improvements

* Improved rendering of geometries
* Improved symbology for orientation
* Simplified Geometry creation
* Improved vertex move/add
* Added tooltip for coordinate location
* Added more geometry functions
* Added Copy Result to Test button


### Code Improvements

* Restructured code for more flexibility, better Swing functionality
* Made it easier to add geometry functions



<!-- ================================================================ -->

# Version 1.8

*Release Date: December 19, 2006*

### Functionality Improvements

* Improved robustness for overlay operations, via using geometry snapping
* Added `Angle` class
* Added methods to `Triangle` class
* Added `LineSegment.midPoint` method
* Added ability to specify output of Z values to `WKTWriter`
* Added `setFormatted`, `setTab`, `setMaxCoordinatesPerLine` methods to `WKTWriter`
* Added `BoundaryNodeRule` classes, and ability to specify a Boundary Node Rule
in `RelateOp`, `IsSimpleOp`, `BoundaryOp`
* Added ability to get the failure location to `IsSimpleOp`
* Added `BoundaryOp` with improved algorithm for lineal geometries.  Changed lineal Geometry classes to use it.
* Enhanced `Geometry` overlay methods to accept empty `GeometryCollections.`
* Enhanced Error Handling for `WKTReader`
* Added `CoordinateSequenceFilter`
* Added `AffineTransformation` and `AffineTransformationBuilder`


### API Changes

* Changed API for `IsSimpleOp` (required to support returning failure location)


### Bug Fixes

* Fixed bug in `GeometryFactory.buildGeometry`
causing failure if input contained all GeometryCollections of the same subclass
* Changed AssertFailure to TopologyException in `PolygonBuilder`
* Improved correctness of `RobustLineIntersector` in certain cases where segment endpoints intersect
* Eliminated duplicate method execution in `TestRunner`



## JTS TestBuilder

### New Features

* Zoom tool can now draw zoom box as well as click
* Cut, Copy and Paste buttons for Input WKT
* added ability to specify custom Geometry Operations



## JTS TestRunner

### New Features

* added ability to specify custom Geometry Operations


### Bug Fixes

* Eliminated duplicate method execution




<!----------------------------------------------------------------------->

# Version 1.7.2

*Release Date: June 22, 2006*

### Functionality Improvements

* Added support for EWKB (SRIDs only) to `WKBReader`


### Bug Fixes

* Fixed bug in `CoordinateArrays.ptNotInList`.
  Changed `polygonize.EdgeRing` to used corrected code.
* Fixed bug causing duplicate points in `ScaledNoder`
* Fixed bug causing Null Pointer for empty geometries in `OraWriter`
* Changed AssertFailure to TopologyException in `EdgeNode`


<!----------------------------------------------------------------------->

# Version 1.7.1

*Release Date: March 20, 2006*

### Functionality Improvements

* Added Hex string conversion to `WKBReader` and `WKBWriter`


### Bug Fixes

* Fixed null point cloning bug in `TopologyValidationError` (*thanks to Markus Gebhard*)
* Fixed bug in `PointLocator` fix for LinearRings
* Fixed bug in `Geometry.isValid` and `IsValidOp` 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)
* Fixed bug in `Polygon.isRectangle`, which reported some valid rectangles as false


### Performance Improvements

* Improved performance for `Geometry#withinDistance` (via short-circuiting)


### Contributors

* Dave Blasby
* Koen van Dijken



<!----------------------------------------------------------------------->

# Version 1.7

*Release Date: December 7, 2005*

### Functionality Improvements

* Added `JTSVersion` class to provide access to the API version information
* Added `covers` and `coveredBy` predicates to `Geometry`
* Added `Geometry#buffer(distance, quadSegs, endCapStyle)` method to expose buffer end cap styles
* Added `LineString#reverse` and `MultiLineString#reverse` methods
* Added `centre`, `intersection`, `translate`,
`expandBy(distance)`, `expandBy(dx, dy)`
methods to `Envelope`
* Added `CollectionUtil` class for performing operations over collections
* Added `CoordinateArrays` comparators
* Added `CoordinateSequence#getDimension`
* Added convenience methods `toPoint` and `toLineString` to `WKTWriter`
* Added WKB API (`WKBReader` and `WKBWriter` classes in `com.vividsolutions.jts.io`
* `WKTReader` has better handling of numeric parsing, including support for scientific notation
* Added `IsValidOp#setSelfTouchingRingFormingHoleValid` to allow validating SDE-style polygons
* Added check for non-closed rings in `IsValidOp`
* Added Linear Referencing API (`com.vividsolutions.jts.linearref`
* Added `LineSequencer` class to `com.vividsolutions.jts.operation.linemerge`
* Added `Subgraph` class to `com.vividsolutions.jts.planargraph`
* Added `isRemoved` method to `GraphComponent`
* Added `ConnectedSubgraphFinder` class to `com.vividsolutions.jts.planargraph.algorithm`
* Added `setVisited`, `getComponentWithVisitedState`,
`setVisited`, `getComponentWithVisitedState`
methods to `com.vividsolutions.jts.planargraph.GraphComponent`
* Added classes to perform Snap Rounding (in `com.vividsolutions.jts.noding.snapround`>
* Improved buffering speed and robustness by using Snap Rounding
* Added buffer optimization for results with large numbers of polygons and/or holes
* Added `STRtree#query(Envelope, ItemVisitor)` method
* Added `Debug#toLine` methods
* Added `ConvexHull(Coordinate[])` constructor


### Bug Fixes

* Fixed decimal formatting in `WKTWriter` to force a leading 0 in decimal numbers
* Fixed bug in `CoordinateArraySequence#setOrdinate`
* Fixed bug when checking validity of polygon with hole (`IsValidOp#checkHolesInShell`)
* Improved correctness of computated intersections in `RobustLineIntersector`
* Fixed bugs in `CoordinateList.clone` (thanks to Matthias Bobzien)
* Fixed bug in `Envelope.equals` (thanks to John Cartwright)
* Fixed `PointLocator` for LinearRings


### Performance Improvements

* Improved performance for overlay operations (point inclusion, identical edge detection)
* Improved Convex Hull performance


### API Changes

* Added `SpatiaIndex#query(Envelope, ItemVisitor)` method signature
* Added `CoordinateSequence#getDimension()` method signature
* Marked `GeometryEditor.CoordinateOperation#edit(Geometry, GeometryFactory)` method
as `final`, to prevent incorrect use


### Semantics Changes

* CoordinateArraySequence#setOrdinate now checks that the ordinate index is in range




<!----------------------------------------------------------------------->

# Version 1.6

*Release Date: February 3, 2005*

### API Changes

* Changed to using `CoordinateArraySequence` instead of `DefaultCoordinateSequence`
(to provide a more descriptive name).


### Semantics Changes

* PrecisionModel#makePrecise changed to use Symmetric Arithmetic Rounding rather than Banker's Rounding


### Functionality Improvements

* Added ability to enable `Debug` methods by setting a system property
* Added `getNumGeometries` and `getGeometryN` methods to Geometry class, to make API more uniform
* Improved API for `CoordinateSequence` allows more options for improving memory usage and handling custom coordinate storage methods
* Added `PackedCoordinateSequence` to provide reduced memory footprint for geometry objects if desired
* Added optimized spatial predicates for rectangles
* Added Debug#isDebugging method


### Bug Fixes

* Fixed bug in `Geometry#within()` short circuiting
* Fixed bug causing `Geometry#isValid` to throw IllegalArgumentException for certain kinds of holes with invalid rings
* Fixed bug causing redundant linestrings to be returned in the result of overlaying polygons containing holes touching their shell.
* `Polygon#getBoundary` now returns a `LinearRing` if the polygon does not have holes


### Architecture Changes

* Removed a proliferation of references to the default `CoordinateSequenceFactory`


### Contributors

* Andrea Aime


<!----------------------------------------------------------------------->

# Version 1.5
*Release Date: September 22, 2004*

This version is upwards compatible with Version 1.4

### API Changes

* None


### Semantics Changes

* None


### Functionality Improvements

* `CGAlgorithms#isCCW` now handles coordinate lists with repeated points.  Also throws an IllegalArgumentException if the input ring does not have 3 distinct points
* `isValid` now checks for invalid coordinates (e.g. ones with Nan or infinite numbers)
* added copyDeep() method to `CoordinateArrays`
* added geometry simplification operations `DouglasPeuckerSimplifier` and `TopologyPreservingSimplifier`
* added methods to `Quadtree` and `STRtree` to remove items and query using the Visitor pattern


### Performance Improvements

* Added short-circuit tests in geometry named predicates based on envelope tests

### Bug Fixes

* Fixed bugs in `Geometry` serialization
* Fixed bug in `ValidOp` which reported some MultiPolygons with shells nested inside a hole as invalid
* Fixed bug in buffer which caused buffers of some polygons with small & large holes to not contain any holes
* Fixed bug in `Polygonizer` which caused exception if no lines were supplied

### Architecture Changes

* Basic CG algorithm methods made static in the `CGAlgorithms` class
* Various utility methods made public in `CoordinateArrays` class

### Documentation

* More examples provided in `com.vividsolutions.jtsexamples package`


<!----------------------------------------------------------------------->

# Version 1.4

*Release Date: November 4, 2003*
### Semantics Changes

* none

### Functionality Improvements

* Added "LINEARRING" tag to WKT syntax
* Added GeometryEditor class to allow easy copy/modify of Geometrys
* Added GeometricShapeFactory class to easily create standard geometric shapes
* Geometries can now carry arbitrary user-defined data objects (via Geometry#get/setUserData(Object) method)
* Added CoordinateSequence and CoordinateSequenceFactory interfaces, and default implementations (BasicCoordinateSequence, BasicCoordinateSequenceFactory)
* Added Geometry#getFactory
* Added new PrecisionModel type of FLOATING_SINGLE, for rounding to single precision floating point
* Added DistanceOp#getClosestPoints method, which returns the closest points between two Geometries
* Added com.vividsolutions.jts.noding package containing classes to perform fast indexed noding of linestrings
* Added com.vividsolutions.jts.operation.polygonize package containing classes to perform polygonization
* Added com.vividsolutions.jts.operation.linemerge package containing classes to perform line merging
* Added SimpleGeometryPrecisionReducer to allow reducing precision of coordinates of a Geometry
* Added LineSegment#closestPoints method to compute the closest points between two line segments
* Added MinimumDiameter class to compute minimum diameters of Geometries
* Added geom.Triangle class to contain algorithms for Triangles
* BufferOp now allows end cap styles to be specified.  Three types are supported: round, butt and square.

### Performance Improvements

* EdgeList now provides a findEqualEdge method which is substantially faster than findEdgeIndex, for large lists
* Buffering is now faster and much more robust
* Overlap operations are now more robust

### Bug Fixes

* Envelope#init(Envelope) now handles null Envelopes correctly
* CoordinateList#add() now correctly ignores the z-value of Coordinates in determining equality
* Geometry#isValid now correctly handles checking validity of LinearRings
* Fixed infinite loop bug causing Out Of Memory errors during polygon intersection
* Geometry#clone now correctly clones the Geometry's Envelope
* 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
* Fixed incorrect calculation of depths in DirectedEdgeStar#computeDepths
* Fixed BufferSubgraph#addReachable to use explicit stack to avoid stack overflow problems
* Fixed various bugs causing some kinds of buffers to be computed incorrectly

### API Changes

* WKTReader/Writer: changed protected members to private
* PrecisionModel type is now an object rather than an int
* ConvexHull API changed to remove requirement to pass in CGAlgorithms object

### Code Architecture Changes

* geom.util package added for utility classes which parse and modify geometries

### Documentation

* More examples provided in com.vividsolutions.jtsexamples package
* Added JTS Developers Guide


<!----------------------------------------------------------------------->

# Version 1.3
*Release Date: April 4, 2003*
### Semantics Changes

* all Geometry methods are now reentrant (thread-safe)
* 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.
* 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.
* SRID and Precision Model are no longer checked for equality during Geometry operations.  This removes a limitation which provided little semantic benefit.


### Functionality Improvements

* added Geometry.isWithinDistance(Geometry g, double distance) method, to provide optimized proximity queries
* added Geometry.buffer(double distance, int quadrantSegments) method, allowing control over accuracy of buffer approximation
* added Geometry.getCentroid() method
* added Geometry.getInteriorPoint() method, which uses heuristic methods to return a point in the interior of a Geometry
* GeometryFactory.toGeometryArray now returns null if the argument is null

### Performance Improvements

* Removed unnecessary string construction in EdgeEndStar.propagateSideLabels()
* 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)
* Add short-circuit code to RobustLineIntersector to detect non-intersections more efficiently

### Bug Fixes

* Fixed ClassCastException occurring in GeometryCollection.getLength()
* Fixed bug in Edge Intersection insertion (replaced Coordinate#equals with equals2D to ensure that intersection creation is not sensitive to Z-value).
* Fixed handling LineStrings with too few points in GeometryGraph.addLineString
* Fixed: was not checking that MultiPolygons don't contain components with too few points.
* Fixed Envelope.distance() to return correct distance for all envelopes.
* Fixed a few Geometry methods to make them re-entrant.
* Fixed CoordinateList.closeRing() to ensure endpoints are not duplicated
* Fixed CGAlgorithms.signedArea() to use a simpler algorithm which is more robust and faster.
* Fixed bug preventing validating Rings containing an initial repeated point.

### API Changes

* Added default constructor to WKTReader.  It uses the default GeometryFactory
* Add two static intersects() methods to Envelope, to allow computing intersections with envelopes defined by points only.
* Dropped BinaryPower; its functionality is provided by DoubleBits in a more robust fashion.
* Removed a couple of redundant private static methods from Geometry; they have been replaced by methods in CoordinateArrays
* The Geometry class is now marked as Serializable


<!----------------------------------------------------------------------->

# Version 1.2

*Release Date: 7 October 2002*
### Semantics Changes

* 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.
* 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.

### Functionality Improvements

* RobustLineIntersector now uses "normalized" coordinates to maximize the accuracy of intersection computation.
* Upgraded Quadtree with more robust implementation
* Replaced IntervalTree with a more robust implementation of BinTree
* Added STRTree 2-D spatial index, which exhibits better performance than QuadTrees in many situations.
* Added EnhancePrecisionOp, which uses precisioning enhancing techniques to reduce the number of failure cases due to robustness problems.

### Bug Fixes

* fixed ConvexHull to use TreeSet instead of HashSet for coordinates
* Fixed isValid for GeometryCollections containing Polygons, which were sometimes erroneously returning a validity failure for correct Geometrys.
* Fixed bug in LineSegment.distancePointLine() which would return the incorrect distance for a LineSegment with two identical points
* Improved error handling in CGAlgorithms.isCCW()
* IsValid now checks for too few points in a geometry component (e.g. due to repeated points in a ring)

### API Changes

* added Stopwatch class
* added Geometry.getArea() and Geometry.getLength() methods
* added CGAlgorithms.signedArea() method
* added methods to LineSegment - closestPoint(), getLength()
* added CoordinateArrrays and CoordinateLists utility classes
* Added TopologyValidationError.getErrorType() method
* Added Envelope#intersects; deprecated Envelope#overlaps.
* Added Geometry#geometryChanged() method to allow signaling when Geometry coordinates have been mutated by a client class
* Added STRTree class implementing a Sort-Tile-Recursive spatial index (a variant of a packed R-tree)
* Deleted IntervalTree 1-D spatial index (replaced by BinTree)
* Add BinTree 1-D spatial index


<!----------------------------------------------------------------------->

# Version 1.1.1

*Release Date: 9 April 2002*
### Bug Fixes

* fixed decimal-point symbol localization bug in WKTWriter
* fixed bug in Envelope.int(Envelope env)
* fixed filename case of SFSMultiLineString.java and IntervalTree.java

### API Changes

* deleted TopologyException class
* renamed CGAlgorithms.isPointInPolygon to isPointInRing (a more accurate description of what the method computes)

### API Additions

* added Geometry.getCoordinate() method
* added Geometry.distance() method
* added GeometryComponentFilter interface and Geometry.apply(GeometryComponentFilter) method


<!----------------------------------------------------------------------->

# Version 1.1

*Release Date: 28 March 2002*
### New Features

* added Geometry.isSimple() and Geometry.isValid() methods
* improved design of topological data structures
* added Geometry.setSRID() method
* improved functionality of the Envelope class
* added ability to write to an arbitrary java.io.Writer object to WKTWriter
* added Validate and Mark Location functionality to TestBuilder


<!----------------------------------------------------------------------->

# Version 1.0
*Release Date: 1 February 2002*

* Removed some non-compatibilities with Java 1.1
* Fixed bug in constructing buffer outline around inside of angles
* In TestBuilder vertices are now displayed with fixed size in view units
* Improved code for WKTWriter.writeFormatted()
* Fixed bug in constructor for LinearRing
* Improved implementation of sweepline intersection algorithm to avoid use of dynamic set.
* Fixed bug in ConvexHull.cleanRing()
* Refactored RobustLineIntersector and NonRobustLineIntersector


<!----------------------------------------------------------------------->

# Version 0.0
*Release Date: 30 May 2001*

**Baseline version**
