# JTS TOPOLOGY SUITE
Version History

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

## 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 `IsValipOp` 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

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

### 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`

### 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`

### 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