Version 1.21
July 1, 2026 ยท View on GitHub
JTS TOPOLOGY SUITE
Version History
This document lists the change history of release versions of the JTS Topology Suite.
- Project site: LocationTech JTS
- Code repo: Github JTS
- Distribution: Github JTS Releases
Distributions for older JTS versions can be obtained at the SourceForge JTS project
Version 1.21
Release Date: TBD*
New Features
- Add
CoverageCleaner(#1126) - Add
MinimumBoundingTriangle(#1160) - Add
DirectedHausdorffDistanceclass (#1182)
Functionality Improvements
- Improve
DouglasPeuckerSimplifierto preserve XYZM coordinates (#1045) - Improve
OffsetCurveto support miter joins for polygonal input (#1109) - Add
MaximumInscribedCirclefast exact calculation for simple shapes (#1123) - Add
MaximumInscribedCircle.isRadiusWithinfunction (#1125) - Add auto-tolerance to
MaximumInscribedCircleandLargestEmptyCircle(#1128) - Add
KdTreemethodsnearestNeighborandnearestNeighbors(#1114) - Allow
WKTReaderto readInfand-Infordinates (#1166, #1167) - Fix
KMLReaderXML parser security hole (#1204)
Bug Fixes
- Fix
ConcaveHullOfPolygonsnested shell handling (#1081) - Fix
ConvexHullto avoid modifying input (#1083) - Fix
TopologyPreservingSimplifierto avoid jumping components (#1096) - Fix
VWSimplifiercoordinate aliasing (#1107) - Add
BufferOphole erosion heuristic for rings (#1117) - Fix
BufferOpelement erosion for negative distance (#1119) - Fix writing XYM geometries as WKB (#1092)
- Fix
DepthSegmentcomparator (#1132) - Fix
BoundaryChainNoderto split chains at self-touch nodes (also fixesCoverageUnion) (#1134) - Fix
OffsetCurvesimplifyFactorparameter handling (#1151) - Fix
CoordinateArrays.hasRepeatedOrInvalidPointsto check first point (#1157) - Fix
GeometryFactory.createto deep-copy polygonal geometry (#1158) - Add buffer artifact removal heuristic for single-element inputs (#1161)
- Fix
BufferOpto handle geometries with all-invalid coordinate lists (#1165) - Fix CoordinateList.clone() to copy correctly (#1168)
- Add Voronoi snapping heuristic to fix invalid diagram topology (#1174)
- Fix
LineSegment.projectto handle segments projecting onto a single endpoint (#1179) - Fix DD equals and compareTo (#1186)
- Fix
RelateNG.computeLineEndsincorrectly skipping boundary points for disjoint line components (#1175) - Add
equalsandhashCodeconsistent withcompareTofor value-semanticsComparableclasses (LinearLocation,EdgeIntersection,NodeSection,OrientedCoordinateArray) (#1184) - Add
DD.hashCodeconsistent withDD.equals(#1186) - Fix
OverlayEdgeto include first point when adding coordinates (#1187)
Performance Improvements
- Fix
RelateNGto cache in prepared A-L cases (#1099) - Add
GeometryCollectiondimension cache (#1103) - Add
MathUtil.hypotfunction and use it for length calculations (#1112) - Improve
LineStringSnapperperformance by using squared distance (#1111) - Add spatial index to OverlayNG
PolygonBuilder.placeFreeHoles(#1173)
JTS TestBuilder
Functionality Improvements
- Add Select Elements tool with virtual layer
- Add Layer style presets
- Add Layer List Zoom to Geometry button
- Add Layer List Copy Geometry button
Bug Fixes
- Fix
BaseGeometryFunction.hashCodeto be consistent withequals(exclude parameter names)
JTS TestRunner
Functionality Improvements
- Process XML tests in a stable order (sorted by filename)
Version 1.20.0
Release Date: 09/18/2024
New Features
- Add
CoverageValidatorCoveragePolygonValidator(#900) - Add
CoverageGapFinder(#900) - Add
CoverageUnion(#900) - Add
CoverageSimplifier(#911) - Add
OverlayNGsupport for simple GeometryCollection inputs (#915) - Add
Geometry.hasDimension(int dim)method {#944} - Add
ConcaveHull.alphaShapefunction (#952) - Add
OffsetCurveJoined mode (#956) - Add
PointLocation.isOnSegmentfunction (#1048) - Add
RelateNGAPI for improved topological relationship functionality and performance (#1052, #1055) - Add system property
jts.relate=ngto enable use of RelateNG inGeometrymethods (#1073)
Functionality Improvements
- Improve
TopologyPreservingSimplifierto prevent edge-disjoint line collapse (#925) - Improve
OffsetCurveto return more linework for some input situations (#956) - Reduce buffer curve short fillet segments (#960)
- Added ability to specify boundary for
LargestEmptyCircle(#973) - Improve
DouglaPeuckerSimplifierandTopologyPreservingSimplifierto handle ring endpoints (#1013) - Add
AnglefunctionssinSnapandcosSnapto 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
WKBReaderandWKBWriterhandling of M measures when writing to WKB and reading from WKB (#734) - Fix
PreparedGeometryhandling of EMPTY elements (#904) - Fix
WKBReaderparsing of WKB containing multiple empty elements (#905) - Fix
LineSegment.orientationIndex(LineSegment)to correct orientation for non-collinear segments on right (#914) - Fix
DepthSegmentcompareTo method (#920) - Ensure
GeometryFixerdoes not change coordinate dimension (#922) - Improve
ConvexHullradial sort robustness (#927) - Improve robustness of Delaunay Triangulation frame size heuristic (#931)
- Fix
PreparedLineString.intersectsto handle mixed GCs correctly (#944) - Fix
QuadEdgeSubdivision.TriangleEdgesListVisitor(#945) - Fix
PolygonHoleJoinerto handle all valid inputs (allowsPolygonTriangulator,ConstrainedDelaunayTriangulator, andConcaveHullOfPolygonsto work correctly) (#946) - Fix
OffsetCurvehandling of input with repeated points (#956) - Fix
OffsetCurvehandling zero offset distance (#971) - Fix
MaximumInscribedCircleandLargestEmptyCircleto avoid long looping for thin inputs (#978) - Fix
OffsetCurveto use a minimum QuadrantSegs value (#981) - Fix
HilbertEncoderY extent handling - Fix
Geometry.getCoordinateto return non-null coordinate for collections with empty first element (#987) - Fix
LargestEmptyCircleto handle polygonal obstacles (#988) - Make intersection computation more robust (#989)
- Fix
VariableBufferto handle zero vertex buffer distances correctly (#997) - Fix
IncrementalDelaunayTriangulatorto ensure triangulation boundary is convex (#1004) - Fix OverlayNG Area Check heuristic for difference (#1005)
- Fix
InteriorPointPointto handle empty elements - Fix
DistanceOpfor empty elements (#1010) - Fix predicates for MultiPoint with EMPTY (#1015)
- Fix
InteriorPointfor MultiLineString with EMPTY (#1023) - Fix TopologyPreservingSimplifier to prevent incorrect topology from jumping components (#1024)
- Fix OffsetCurve to ensure end segments are included (#1029)
- Fix
PointLocatorto respectBoundaryNodeRulefor single lines (#1031) - Fix
BufferOpInverted Ring Removal check (#1038) - Improve
VariableBuffersegment buffer cap generation (#1041) - Fix
TopologyPreservingSimplifierring endpoint removal indexing (#1059)
Performance Improvements
- Improve
Polygonizerperformance in some cases with many islands (#906) - Improve Convex Hull performance by avoiding duplicate uniquing (#985)
- Improve
HPRtreeperformance (#1012) - Improve performance of noding and overlay via
HPRtree(#1012) - Improve
DistanceOpperformance for Point-Point (#1049) - Improve
CoveragePolygonValidatorvia section performance optimization (#1053)
Version 1.19
Release Date: 06/21/2022
New Features
- Add
ConstrainedDelaunayTriangulatorandPolygonTriangulator(#775, #862) - Add
Tridata structure for representing triangulations (#775) - Add
DiscreteFrechetDistance(#764, #783) - Add
OffsetCurveclass (#810, #816) - Add
ConcaveHullclass for points (#823, #829) - Add
ConcaveHullOfPolygonsclass (#870) - Add
PolygonHullSimplifierclass (#861, #880) - TWKB read and write implementation (#854)
- Add
CubicBezierCurveclass
Functionality Improvements
- Improve
GeometryFixerbehaviour for holes outside polygons (#772) - Simplify and fix logic of
BufferParameters.setQuadSegs(#778) - Improve
KdTreequery code to avoid recursion (#779) - Add
KdTreeseeding toSnappingNoder(#780) - Add
GeometryFixeroption to preserveMultigeometry types when collapses occur (#791) - Make
QuadTreethread-safe (#792) - Allow specifying a fixed
PrecisionModelvia grid size (#804) - Improve
Densifierto interpolate Z values (#835) - Add support for GeoJSON
FeatureandFeatureCollectiontypes (#837) - Add
WKTReader.setFixStructureto fix WKT input (#848) - Improve
LineSegment.hashCodeto reduce collisions (#872)
Performance Improvements
- Improve performance of
CoverageUnionby using boundary chains (#891)
Bug Fixes
- Fix
WKTReadergeometry typename parsing (#786) - Fix
CoordinateArrays.reverseto handle zero-length arrays (#787) - Fix
GeometryFixerto appplyisKeepCollapsedflag toGeometryCollectionelements (#790) - Fix
RectangleIntersectsto handle XYZM geometry (#794) - Fix various operations to handle XYZM geometry (#795)
- Fix
SnapRoundingNoderto use tolerance in noding (also fixesGeometryPrecisionReducer) (#802) - Fix
MaximumInscribedCircleto avoid infinite-looping on flat collapsed input (#807) - Add
OverlayNGresult area heuristic check (#812) - Fix the buffers generated for mitred joins (#818)
- Fix
WKTReaderto produce correct XY coordinate dimension for POLYGON EMPTY (#828) - Fix
RelateOpfor a snapped line boundary point (#839) - Fix IsValidOp for repeated node points (#845)
- Fix
IsSimpleOpfor repeated endpoints (#851) - Fix
GeometryFixervia noding check for zero-distance buffers (#867) - Fix
MinimumDiameter.minimumRectanglefor flat inputs (#875) - Fix
BufferOpinverted ring check optimization (#878) - Fix
STRtreenearest-neighbour queries on empty trees to avoid NPE (#886) - Remove transitive compile dependency on
junitfromjts-io-commmon(#855)
Version 1.18.2
Release Date: 08/27/2021
API Changes
- Move
IsSimpleOptoorg.locationtech.jts.operation.validpackage (#717)
New Features
- Add
GeometryFixerclass (#704)
Functionality Improvements
- Improve design and performance of
IsSimpleOp(#717, #754) - Improve design and perforance of
IsValidOp(#743, #748, #755, #756, #757) - Fix
SortedPackedIntervalRtreeto be thread-safe (fixesPreparedPolygontoo) (#746)
Bug Fixes
- Fix
InteriorPointto handle partially-empty collections (#698) - Fix
MultiPoint.isValidto check validity correctly (#700) - Fix
WKTReaderandWKTWriterhandling of collections with all empty elements (#702) - Fix
HalfEdge.prev()method (#703) - Fix
BufferOpto remove invalid elements caused by inverted ring curves (#706) - Fix
IsSimpleOpduplicate lines bug (#716) - Fix
Angle.interiorAngleto produce interior angle correctly (#721) - Fix
IsValidOpto correctly report invalidity for certain kinds of LinearRings (#737) - Fix
GeometryPrecisionReducerto support the "keep collapsed components" semantics (#738) - Fix
VoronoiDiagramBuilderto 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
Coordinateand subclassescreate()methods (#637) - Ensure OverlayNG input line order is preserved (#665)
- Add
UnaryUnionNGfunctions that acceptCollections (#669 and #670) - Switch to using compact-SRID WKB format (#664)
- Improve
WKBReadererror checking (#675) - Improve
Densifiersplitting algorithm to create longer segments (#677) - Allow constructing invalid
Polygons andLinearRings with only 3 vertices (#682) - Ensure invalid 3-point polygons and rings are handled correctly (#683)
- Fix
GeoJSONReaderto parse null and empty coordinates as empty geometry (#687) - Fix
GeoJSONWriterto emit empty coordinates array for empty point and linestring (#688) - Add
MaximumInscribedCirclecheck for invalid tolerance, to avoid infinite loops (#696) - Add
GeoJsonWriter.setForceCCWmethod to emit polygons with CCW orientation, as per GeoJSON specification (#694)
Bug Fixes
- Ensure
DensifiercreatesCoordinates with same class as input (#637) - Fix Relate for cases with closed linear geometry and empty geometry (#671)
- Fix
Densifierto avoid splitting segments with length equal to distance tolerance (#676) - Fix
Geometry.compareToto test polygon holes (#678) - Fix OverlayNG handling of polygons with interior flat lines (#685)
- Fix
Polygonizerto 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
GeometryPrecisionReduceris less tolerant of invalid input (but also avoids failing on some valid ones) (#648)- Moved
PositionandQuadranttoorg.locationtech.jts.geompackage - Removed
SimpleSnapRounder- useSnapRoundingNoderinstead - Deprecated
MCIndexSnapRounder- useSnapRoundingNoderinstead
New Features
- Add
KMLReader(#593) - Add
OverlayNGcodebase (#599) - Add Z support in OverlayNG (#645)
- Add system property
jts.overlay=ngto enable use of OverlayNG inGeometrymethods (#615) - Add
SnapRoundingNoder(#599) - Add
SnappingNoder(#599) - Add
Orientation.isCCWArea(#655)
Functionality Improvements
- Improve
Orientation.isCCWto handle flat topology collapse (#588) - Add
Densifier.setValidatedmethod to allow disabling expensive polygon validation (#595) - Change
GeometryPrecisionReducerto use OverlayNG with Snap-Rounding - Change
GeometryNoderto useSnapRoundingNoder - Add
KdTreesizeanddepthmethods (#603) - Improve
WKBWriterto write empty Polygons using a more compact representation (#623) - Support read and initialize internal structure of
STRtreeandQuadtree(#634) - Improve
GeometryPrecisionReducerto handle GeometryCollections (#648)
Performance Improvements
- Improve performance of
UnaryUnionOpby removing OverlayUnion optimization (#644)
Bug Fixes
- Fix
RayCrossingCounterto handle XYZM coordinates (#589) - Fix
PackedCoordinateSequenceto always use XYZM coordinates when dimension is 4 (#591) - Fix
OrdinateFormatto work around a JDK issue with the minus sign character inLocale.NO(#596) - Fix
GeoJsonReaderto throw aParseExceptionfor empty arrays (#600) - Fix
WKTFileReaderhandling of files with large amount of whitespace (#616) - Fix
WKBWriterto output 3D empty Points with 3 ordinates (#622) - Fix
Geometry.reverseto handle all geometry structures (#628) - Fix
GeometryPrecisionReducerto avoid silently mangling input (#648) - Fix
Geometry.bufferto avoid dropping large polygon areas in some situations (#655)- also fixes
DouglasPeuckerSimplifier(#498)
- also fixes
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
WKBReaderandWKBWritersupport forPOINT EMPTY(#567)
Performance Improvements
- Improve performance of
PreparedPolygoncoversandcontainsfor point inputs (#577)
Bug Fixes
- Fix
IndexedPointInAreaLocatorthread-safety (#572) - Fix
WKTReaderto handle MultiPoints containingEMPTY(#575) - Fix API compile regression by removing deprecation on geometry
reversemethods (#582)
JTS TestBuilder
Functionality Improvements
- Add per-Layer palette control for Strokes and Fills
JTS TestRunner
Functionality Improvements
- Enhance
-geomfuncto load multiple function classes - Fix function registry to replace matching loaded functions (#569)
JtsOp
- Added
-limitand-offsetoptions for reading from file inputs (#617)
Version 1.17.0
Release Date: July 1, 2020
Java Version: 1.8
API Changes
- Change
PolygongetExteriorRingandgetInteriorRingNaccessors to returnLinearRing.- 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
OrdinateFormatto ensure that ordinate text output is accurate and consistent - Added
Triangle.circumcentreDD - Added
DD.determinantmethods - Added
EnvelopemethodsgetDiameter,copy,disjoint(#483) - Added
Intersectionclass, refactored library to use it (#468) - Added
CoordinateList.toCoordinateArray(isForward)(#482) - Added
HPRtreeHilbert Packed R-tree (#494) - Added
VariableBufferclass for computing varying-distance buffers (#495) - Added
LineSegment.reflectmethod (#495) - Added
MaximumInscribedCirclealgorithm (#530) - Added
LargestEmptyCirclealgorithm (#530)
Functionality Improvements
- Added
CascadedPolygonUnionunion-by-buffer on error capability (#470) - Added
HalfEdgesupport for direction points (#479)
Performance Improvements
- Improve performance of
UniqueCoordinateFilter(#422) - Improve performance of
Polygonizer(#431) - Avoid use of
ArrayListin MonotoneChain builders - Add
DistanceOpline-line envelope short-circuit optimizations (#534)
Bug Fixes
- Fix
PackedCoordinateSequence.Floatconstruction methods (#379, #381) - Fix bug in
Quadtree.ensureExtent(#416) - Fix bugs in
LinearLocationendpoint handling (#421) - Fix bug in
MinimumBoundingCirclemaximum diameter algorithm, and provide method for it - Improve robustness of
CascadedPolygonUnionby addingOverlapUnion - Fix bug in
HalfEdge.insertmethod 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
IndexedPointInAreaLocatorandSortedPackedIntervalRTree(#462) - Fix WKT parsing in Turkish locale (#456)
- Improve accuracy of
LineSegment.lineIntersection(#468) - Fix
Distance3DOpcoordinate ordering (#480) - Fix
Geometry.reverse()to have consistent behaviour and to copy all fields (#513) - Fix
MinimumBoundingCircle.farthestPointsto work correctly (#522 and #533) - Fix
DistanceOphandling 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
.xmlfiles from directories
JtsOp
- Added command-line utility to run JTS operations
Version 1.16.1
Release Date: Febuary 19, 2019
Functionality Improvements
- Added
HilbertCodeandHilbertCurveBuilder. - Added
MortonCodeandMortonCurveBuilder. - Improved
InteriorPointAreaalgorithm performance and robustness - Add
IndexedFacetDistancemethodsnearestLocationsandnearestPoints - Make
IndexedFacetDistancethread-safe - Add
SimplePointInAreaLocatorenvelope check
Bug Fixes
- Fix
IsValidOpto handle empty components. - Fix
ShapeWriterto handle Polygons with empty holes. - Fix
CoordinateArraySequenceto 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
CoordinateSequenceandCoordinateSequenceFactorywithgetDimension()andgetMeasures()information. - Added
Coordinatemethods forgetX(),getY(),getZ(), andgetM(). - Deprecated
Coordinate.zfield. UseCoordinate.getZ(). Coordinatesubclasses introduced for XY, XYM, XYZM representations.
Functionality Improvements
- Removed
PackedCoordinateSequenceFactoryconstructor used to supply a default dimension. Use appropriatecreate( size, dimension )instead. - Added
WKTReaderandWKTWritersupport 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
CGAlgorithmsinto function-specific classesOrientation,PointLocation,Distance,Length,Area - Deprecated
NonRobustCGAlgorithms; use function-specific classes refactored fromCGAlgorithms - Deprecated
RobustDeterminant; useCGAlgorithmsDD - Deprecated
Geometry.clone; useGeometry.copy - Deprecated
GeometryFactory.createX(null)methods; Use no-argumentGeometryFactory.createXmethods - Deprecated overloaded
GeometryFactory.createMultiPoint; useGeometryFactory.createMultiPointFromCoords
Functionality Improvements
- Improve
Quadtreeto handle queries with null envelopes - Add
STRtreeK-Nearest Neighbours query - Add
Serializableto ``PackedCoordinateSequence` - Add
Envelope.intersects - Add
Geometry.intersectsforGeometryCollection - Improve
WKBReaderto handle the OGC 06-103r4 specification. - Improve
WKTReaderto handleZ,M,ZMmodifiers.
Performance & Robustness Improvements
- Add optimization for
Geometry.containsandGeometry.covers - Improve robustness of
RayCrossingCounterandGeometry.contains - Improve robustness of
MultiPolygoncentroid computation
Bug Fixes
- Eliminated
LineString.normalizeside-effects
JTS TestBuilder
Functionality Improvements
- Added function
Writer.writeGeoJSON - Added tree view of scalar functions
- Added ability to repeat functions
- Added custom fill styling
- Added
SelectionFunctionsfor 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.compareTomethod - Fixed
SegmentSetMutualIntersectorclasses to be thread-safe - Fixed
PreparedGeometryclasses to be thread-safe - Added
LineDissolverclass - Added
edgegraphpackage - Added
CoordinateSequences.isEqualmethod - Extended
CoordinateSequences.copyandCoordinateSequences.copyto handle inputs of different dimension - Added
CoordinateArrays.envelope()function - Added
CoordinateArrays.intersection()function - Added
Polygonizer.setCheckValidRings()method for optimizing performance in some situations - Added
KMLWriterto convert Geometry to KML representation - Added
Coordinateequals3D,equals2D(Coordinate, tolerance), andequalInZmethods. - Added
VWSimplifierto perform Visvalingam-Whyatt simplification - Enhanced
WKBReaderto handle Spatialite WKB format - Added
DD.setValue()methods - Added
getGeometry()methods toLinearComponentExtracterandLineStringExtracter - Added
BufferParameterssimplifyFactorsetting - Added node counting and ability to not keep intersection points to
InteriorIntersectionFinder - Added
Polygonizerfunctionality to extract only polygons forming a valid polygonal geometry - Added
KdTree.toCoordinates - Added
MinimumBoundingCircle.getFarthestPointsmethod
Performance Improvements
- Performance & memory improvement in
PreparedPolygonIntersectsby 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
PointExtracterto improve performance for Points
Bug Fixes
- Fixed
RobustLineIntersectorheuristic for handling invalid intersection points (computed as outside envelope of input segments due to numeric precision issues) - Fixed
CGAlgorithmsDD.intersectionto compute intersection correctly - Fixed
Geometry.interiorPoint()to compute a true interior point in certain cases - Fixed
Geometry.equalsto handle null argument - Fixed
DistanceToPointto be thread-safe - Fixed
Geometry.interiorPoint()andInteriorPointAreato handle zero-area geometries - Fixed
STRtreeclasses to be thread-safe (by synchronizing theAbstractSTRtree.build()method) - Fixed
STRtree.remove()method to avoid a NPE - Fixed
DouglasPeuckerSimplifierandTopologyPreservingSimplifierto handle empty geometry components in the input - Fixed
ConvexHullto handle input of array of identical coordinates - Fixed
GeometryTransformer.transformLinearRing()to handle null inputs - Fixed the
extractPoint(distance, offset)methods inLocationIndexedLineandLengthIndexedLineto handle offsets from endpoints correctly. - Fixed
GeometryCollectionIteratorto correctly handle atomic geometries - Fixed
InteriorIntersectionFinderto not short-circuit when finding all nodes - Fixed
SubgraphDepthLocatorto work with Java 7+ by avoiding sorting with an inconsistent ordering - Fixed
FontGlyphReaderto use correct Java font value of "SansSerif", and added new constant to match. - Fixed
KdTreeto correctly implement distance tolerance-based coordinate matching - Fixed
LineString.normalize()to correctly handle CoordinateSequences - Fixed
CommonBitsRemoverto correctly handle CoordinateSequences - Fixed bug in
CoordinateArraySequence.clone()
API Changes
- Changed interface of
SegmentSetMutualIntersectorto support thread-safety by removing state - Provided
InteriorIntersectionFinderAdderto replace the poorly namedIntersectionFinderAdder - Changed some classes in
com.vividsolutions.jts.operation.bufferto be package-private
Testing Improvements
- Added
GeometryTestCasebase class to simplify unit tests
JTS I/O
Functionality Improvements
- Added
GeoJsonReaderandGeoJsonWriterclasses
API Changes
- In
OraWriterthe connection is now provided to thewrite()method, not the constructors
Bug Fixes
- Fixed
OraReaderto handle readingGeometryCollectionwithPointas second element - Many improvements to Oracle API code and performance
- Added
OraWriter.setOptimizePointandOraWriter.setOptimizeRectanglemethods
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.CoordinateSequenceOperationto allow easy editing of constituent CoordinateSequences - Added
GeometryFactory.createPolygonconvenience methods which do not require holes to be specified Geometryoverlay methods now return empty results as atomic types of appropriate dimension- Added
RectangleLineIntersectorto provide efficient rectangle-line intersection testing - Added
getOrdinateandsetOrdinatetoCoordinate QuadtreeisSerializableSTRtreeisSerializable- Added
max,averageandwrapfunctions toMathUtil - Improved
WKTReaderparse error reporting to report input line of error - Improved
WKBReaderto repair structurally-invalid input - Made
TopologyPreservingSimplifierthread-safe - Added
AbstractSTRtree.isEmpty()method - Added
QuadTree.isEmpty()method - Added
KdTree.isEmpty()method - Added decimation and duplicate point removal to
ShapeWriter. ScaledNodernow preserves Z values of input- Added instance methods for all
Triangle` static methods - Added
CGAlgorithmsDDcontaining high-precision versions of some basic CG algorithms - Added
IntersectionMatrix.isTrue()method for testing IM pattern matches - Added
getRawCoordinatesmethods toPackedCoordinateSequenceconcrete classes - Modified
Geometry.isSimple()to explicity check for simplicity for all types, and supportGeometryCollections - Improved
MCIndexSnapRounderto add nodes only where they are necessary - Added
CoordinateArrays.removeNull()method - Enhanced
GeometryEditorto handle null geometries returned from operation - Added
WKBHExFileReader - Added
Distance3Doperation
Performance Improvements
- Simplified & improved performance of
RectangleIntersectsby using newRectangleLineIntersector - In
RandomPointsInGridBuildereliminated redundantArrayListusage - In
PreparedPolygonIntersectsandPreparedLineStringIntersectsadded check to avoid creating segment index if all test inputs are points - In
AbstractSTRtreeswitched to using indexed list access for better performance than using iterators - In
AbstractSTRtreefreed inserted item array after index is built - Improved performance of
Polygonizerfor cases with many potential holes - Improved performance for some
DDmethods by making themfinal - 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 Nodeto use scalar x and y variables rather than aCoordinateto reduce memory allocation - Fixed
PreparedGeometryconcrete classes to be thread-safe. - Fixed
SortedPackedIntervalRTreeso 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 Stackfailure inConvexHullfor some nearly collinear inputs CGAlgorithms.signedArea()uses a more accurate algorithm
Bug Fixes
- Fixed
Geometry.equalsExact()to avoid NPE when comparing empty and non-emptyPoints - Fixed
CascadedPolygonUnionto discard non-polygonal components created during unioning, to avoid failures and provide more desirable behaviour - Fixed
CentralEndpointIntersectorto initialize result correctly - Fixed
DelaunayTriangulationBuilder.extractUniqueCoordinates(Geometry)to avoid mutating the vertex order of the input Geometry - Fixed
ConformingDelaunayTriangulationBuilderto allow non-disjoint site and constraint vertex sets - Fixed
RandomPointsInGridBuilderpoint 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
LocationIndexedLineandLengthIndexLinewhich 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
TopologyPreservingSimplifierto return a valid result for closedLineStrings with large distance tolerances - Fixed
TopologyPreservingSimplifierto return an empty result for an empty input - Fixed
DouglasPeuckerSimplifierto return an empty result for an empty input - Fixed
MinimumBoundingCircleto correctly compute circle for obtuse triangles. - Fixd
GeometryPrecisionReducerto use input GeometryFactory when polygon topology is fixed - Fixed
GeometryNoderbug that was failing to snap to end vertices of lines - Fixed
Geometry.getCentroid()andGeometry.getInteriorPoint()to returnPOINT EMPTYfor empty inputs - Fixed
DelaunayTriangulationBuilderto correctly extract unique points - Fixed
KdTreeto correctly handle inserting duplicate points into an empty tree - Fixed
LineSegment.projectionFactor()to handle zero-length lines (by returning Double.POSITIVE_INFINITY) - Fixed
LocationIndexedLineto handle locations on zero-length lines - Fixed
LengthIndexedLineandLocationIndexedLineto handleindexOfAfter()correctly - Fixed
WKBReaderto handle successive geometrys with different endianness - Fixed
GeometricShapeFactoryto correctly handle setting the centre point - Fixed
GeometryFactory.createMultiPoint(CoordinateSequence)to handle sequences of dimension > 3
API Changes
- Changed visibility of
TaggedLineStringSimplifierback topublicdue to user demand
Testing
- Added Performance Testing framework (
PerformanceTestRunnerandPerformanceTestCase) - Added named predicate tests to all Relate test cases
Contributors
- Peter Hopfgartner - improved area computation
- Michael Michaud - snap-rounding improvements
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
Geometryequality:equals(Object)is a synonym forequalsExact(Geometry)equalsNorm(Geometry)automatically normalizes the operandsequalsTopo(Geometry)computes topological equality, and is a synonym for the originalequals(Geometry)
- Added
Geometry.norm()to provide non-mutating normalization - Added
Geometry.hashCode()to fulfill Java conventions - Added
LineIntersector.getEndpoint()method - Added methods to
CoordinateSequencesto test for and create valid rings - Added
minExtentandmaxExtenttoEnvelope - Added ability to compute Single-Sided Buffers (invoked via
BufferOpandBufferParameters) - Added
GeometryPrecisionReducer - Added ExtendedWKB SRID support to
WKBWriter(thanks to Justin Deoliviera) - Improved
PolygonShapeto support floating-point coordinates - Added
GeometryShapeFactory.setRotation(double radians)method - Added
GeometricShapeBuilderAPI to support shape builder development - Added
RandomPointsBuilderto allow generating various random point sets - Added
RandomPointsInGridBuilderto allow generating various random point sets constrained to a grid - Added
KochSnowflakeBuilder - Added
SierpinskiCarpetBuilder - Added
MathUtilcontaining mathematics and numerical utility functions - Added
Vector2Dclass providing vector operations - Added
DirectedEdgeStar.getNextCWEdge()method toplanargraphAPI - Improved
AffineTransformationto avoid numeric precision issues in case of reflection in X=Y (coordinate flipping) - Added
LineSequencer.sequence()static convenience method - Added error indicators to
BufferDistanceValidatorandBufferResultValidator - Added
MinimumClearanceclass - Added
nearestNeighboursmethods toSTRtree
Performance Improvements
- Improved memory performance of
ShapeWriterconversions (by tuning coordinate and polygon conversion) - Improved performance of
RectangleIntersectsby refiningSegmentIntersectionTester
Robustness Improvements
- Delaunay triangulation uses more robust formulation for the inCircle test
- Voronoi computation now uses more robust formulation for the circumcentre computation
- Force
RectangleIntersectsto 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
Matrixclass intojts.mathpackage - Refactored internal offset curve generation classes
in
com.vividsolutions.jts.operation.bufferpackage
Bug Fixes
- Fixed
CoordinateArraySequenceandPackedCoordinateSequenceto correctly handle Z ordinate ingetCoordinate(int, Coordinate) - Fixed
LinearRingto haveisClosed()returntruefor empty rings - Fixed
Geometry.union()to use more robust union algorithm. This provides behaviour consistent withunion(Geometry). - Fixed
Point.isValid()to validate POINT EMPTY correctly - Fixed
SnapIfNeededOverlayOpto throw the originating exception,which contains meaningful coordinates - Fixed
GeometrySnapperto allow final vertices of LineStrings to snap correctly - Fixed buffer (
OffsetCurveSetBuilder) to handle "flat" rings correctly - Fixed
IsValidOpto handle reporting "Not Closed" errors on empty rings correctly - Fixed
NestedRingTester(used byIsValidOp) to correctly handle the case where a hole touches all the vertices of another hole (which is invalid) - Fixed
ConvexHullto handle large geometries with fewer than 3 unique points - Fixed
GeometryGraphto ignore empty hole rings when building graph - Fixed
LineMergerto skip lines with only a single unique coordinate - Fixed
ByteArrayInStreamto pad byte buffers with zeroes - Corrected spelling of
SquarePointShapeFactory - Fixed tolerance check in
KdTree - Updated
MasterTesterto include more unit tests
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
MinimumBoundingCircleclass - Added
Densifierclass - Added triangulation API, including
QuadEdgeSubdivision,IncrementalDelaunayTriangulator,ConformingDelaunayTriangulatorand supporting classes - Added
VoronoiDiagramBuilderto perform Voronoi diagram generation - Added
scaleInstance(scaleX, scaleY, x, y)toAffineTransformation - Added
AffineTransformationFactoryto allow generating transformations from various kinds of control inputs - Added
BinTree.remove()method - Fixed
BinTree.query()to allow null interval arguments - Added
ShapeReaderAPI to convert Java2D Shapes into JTS Geometry - Added
ShapeWriterAPI to convert JTS geometry into Java2D Shapes - Added
FontGlyphReaderAPI to render Java2D text font glyphs into geometry - Added
SdeReaderto jtsio library - Added
Debugbreak methods - Added
Memoryutility for reporting memory statistics - Added
ObjectCounterutility for counting objects - Added
createSquircleandcreateSuperCircletoGeometricShapeFactory
Performance Improvements
- Improved performance of
Geometry.getArea()andGeometry.getLength()when used with customCoordinateSequences
API Changes
- Deprecated
WKBWriter.bytesToHexin favour ofWKBWriter.toHexto regularize and simplify method name
Bug Fixes
- Fixed Point.isValid() to check for invalid coordinates (ie with Nan ordinates)
- Fixed
Geometry.distance()andDistanceOpto return 0.0 for empty inputs - Fixed
Bufferto handle degenerate polygons with too few distinct points correctly - Added illegal state check in
LineSegment.pointAlongOffset() - Fixed exception strategy in
BufferSubgraphto handle certain robustness failures correctly - Fixed robustness problem in
OffsetCurveBuilderin computing mitred joins for nearly parallel segments - Fixed minor bug in
BufferInputLineSimplifierwhich prevented simplification of some situations - Fixed bug in
BufferInputLineSimplifierwhich caused over-simplification for large tolerances - Fixed bug in
Angle.normalizePositiveto handle values > 2PI correctly - Fixed
WKTWriterto emit correct syntax for MULTIPOINTs - Fixed
WKTReaderto accept correct syntax for MULTIPOINTs CGAlgorithms.isCCWnow checks for too few points in the ring and throws anIllegalArgumentException- Fixed bug in
AffineTransformation#eqals(logic bug) - Fixed bug in
CoordinateList#closeRing(cloning closing Coordinate)
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,setCustomRootElementsmethods toGMLWriter - Added
Envelope.getAreamethod - Added
copy,copyCoordmethods toCoordinateSequences - Added
areamethod toEnvelope - Added
extractPoint(pt, offset)methods toLengthIndexedLineandLocationIndexedLine - Added
CoordinatePrecisionReducerFilter - Added
UnaryUnionOp(Collection, GeometryFactory)constructor to handle empty inputs more automatically - Added
DiscreteHausdorffDistanceclass - Made
LineMergerable to be called incrementally - Added
GeometricShapeFactory.createArcPolygonto 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 ofjava.io.ByteArrayInputStream) - Unrolled intersection computation in
HCoordinateto avoid object allocation - Improved performance for buffering via better offset curve generation and simplification.
- Improved performance for
IsValidOpby switching to useSTRtreefor nested hole checking
Bug Fixes
- Fixed
Geometry.getClassSortIndex()to lazily initialize the sorted class list. This fixes a threading bug. - Fixed
RectangleContainsto return correct result for points on the boundary of the rectangle - Fixed error in
com.vividsolutions.jts.simplify.LineSegmentIndexwhich caused polygons simplified usingTopologyPreservingSimplifierto be invalid in certain situations - Fixed error in
DouglasPeuckerSimplifierwhich caused empty polygons to be returned when they contained a very small hole - Fixed
PackedCoordinateSequenceto returnNaNfor 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
UnaryUnionOpto correctly handle heterogeneous inputs with P/L/A components - Fixed
UnaryUnionOpto acceptLINEARRINGs - Fixed
CentroidAreato handle zero-area polygons correctly - Fixed
WKBWriterto always output 3D when requested, and to handle 2DPackedCoordinateSequencescorrectly in this case - Fixed
NodedSegmentStringto handle zero-length line segments correctly (viasafeOctant) - Cleaned up code to remove unneeded
CGAlgorithmsobjects - Fixed
GeometricShapeFactory.createArcto ensure arc has requested number of vertices
API Changes
- Moved GML I/O classes into core JTS codebase
- Changed
GMLWriterto not write thesrsNameattribute by default - In
DistanceOpswitched to usingnearestPointsmethod 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...
- Added stream digitizing to Polygon and Line Draw tools
JTS TestRunner
Functionality Improvements
- Added
-testCaseIndexcommand-line option
Version 1.9
Release Date: January 2, 2008
Functionality Improvements
- Added
Polygonal,Lineal,Puntaltag interfaces to better categorize geometry classes - Added
Geometry.union()method,UnaryUnionOpclass for efficient unioning of geometrys - Added
Triangle.area3Dmethod - Added
LineSegment.pointAlongOffsetmethod - Added
LineSegment.orientationIndex(Coordinate)method - Added
PreparedGeometryclasses and methods to optimize some geometry functions in batch situations - Added
Envelope.coversmethods, for preciseness - Added
OctagonalEnvelopeclass - Improved
CGAlgorithms.isPointInRingmethod to handle case where point lies on the ring - Added
CGAlgorithms.locatePointInRingmethod - Added
PointInAreaLocatorinterface, enhancedSimplePointInAreaLocatorto extend this - Added
RayCrossingCounter,IndexedPointInAreaLocatorclasses for more efficient Point-In-Polygon testing - Added
GeometryCombinerclass - Enhanced
BufferOpwith join styles - Enhanced
WKTReaderto accept any case forNaNnumber symbols - Added
WKTFileReaderclass - Improved performance of
CoordinateListconstructors - Added
CascadedPolygonUnionclass - Added
LinearLocation.isOnSameSegmentmethod - Added
LinearLocation.getSegmentmethod - Added
LocationIndexedLine.indexOfAftermethod - Added interpolation of Z value to linear referencing methods
- Added methods to rotate around a given point to
AffineTransformation - Allowed
GeometricShapeFactoryto be subclassed to add new shapes - Added
SineStarFactory(primarily to support testing) - Added
SortedPackedIntervalRTreeclass - Added
SegmentSetMutualIntersectorinterface and implementations - Added
Node.remove(DirectedEdge)method inplanargraphpackage
Performance Improvements
- Improved performance for
SimplePointInAreaLocator(by checking ring envelopes as a filter)
Bug Fixes
Geometry.bufferoperation fixed to always return polygonal geometries- Fixed bug in
Geometry.buffer(distance, quadrantSegs)causing failure for some cases withquadrantSegs = 1 - Fixed bug in
GeometryFactory.toGeometry(Envelope)which was returning invalid Polygons for "linear" envelopes - Fixed bug in
MonotoneChainBuilderwhich caused failures in situations with segments of zero length - Fixed
PointLocatorto handle locating in Point geometries - Fixed
GeometricShapeFactoryto always use provided PrecisionModel - Fixed
LinearLocation.clonemethod - Fixed
LinearLocation.isValidmethod - Fixed
Polygonizerto accept single-point linestrings (which are ignored)
API Changes
- Deprecated
RobustCGAlgorithms - Deprecated
BufferOpcap style constants (these are now provided inBufferParameters) - Removed
SIRPointInRing
JTS TestRunner
New Features
- Added ability to specify GeometryOperation in XML file
- Added
BufferValidatedGeometryOperation - Added ability to specify custom result matching via
resultMatcherparameter 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
Angleclass - Added methods to
Triangleclass - Added
LineSegment.midPointmethod - Added ability to specify output of Z values to
WKTWriter - Added
setFormatted,setTab,setMaxCoordinatesPerLinemethods toWKTWriter - Added
BoundaryNodeRuleclasses, and ability to specify a Boundary Node Rule inRelateOp,IsSimpleOp,BoundaryOp - Added ability to get the failure location to
IsSimpleOp - Added
BoundaryOpwith improved algorithm for lineal geometries. Changed lineal Geometry classes to use it. - Enhanced
Geometryoverlay methods to accept emptyGeometryCollections. - Enhanced Error Handling for
WKTReader - Added
CoordinateSequenceFilter - Added
AffineTransformationandAffineTransformationBuilder
API Changes
- Changed API for
IsSimpleOp(required to support returning failure location)
Bug Fixes
- Fixed bug in
GeometryFactory.buildGeometrycausing failure if input contained all GeometryCollections of the same subclass - Changed AssertFailure to TopologyException in
PolygonBuilder - Improved correctness of
RobustLineIntersectorin 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. Changedpolygonize.EdgeRingto 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
WKBReaderandWKBWriter
Bug Fixes
- Fixed null point cloning bug in
TopologyValidationError(thanks to Markus Gebhard) - Fixed bug in
PointLocatorfix for LinearRings - Fixed bug in
Geometry.isValidandIsValidOpcausing 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
JTSVersionclass to provide access to the API version information - Added
coversandcoveredBypredicates toGeometry - Added
Geometry#buffer(distance, quadSegs, endCapStyle)method to expose buffer end cap styles - Added
LineString#reverseandMultiLineString#reversemethods - Added
centre,intersection,translate,expandBy(distance),expandBy(dx, dy)methods toEnvelope - Added
CollectionUtilclass for performing operations over collections - Added
CoordinateArrayscomparators - Added
CoordinateSequence#getDimension - Added convenience methods
toPointandtoLineStringtoWKTWriter - Added WKB API (
WKBReaderandWKBWriterclasses incom.vividsolutions.jts.io WKTReaderhas better handling of numeric parsing, including support for scientific notation- Added
IsValidOp#setSelfTouchingRingFormingHoleValidto allow validating SDE-style polygons - Added check for non-closed rings in
IsValidOp - Added Linear Referencing API (
com.vividsolutions.jts.linearref - Added
LineSequencerclass tocom.vividsolutions.jts.operation.linemerge - Added
Subgraphclass tocom.vividsolutions.jts.planargraph - Added
isRemovedmethod toGraphComponent - Added
ConnectedSubgraphFinderclass tocom.vividsolutions.jts.planargraph.algorithm - Added
setVisited,getComponentWithVisitedState,setVisited,getComponentWithVisitedStatemethods tocom.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#toLinemethods - Added
ConvexHull(Coordinate[])constructor
Bug Fixes
- Fixed decimal formatting in
WKTWriterto 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
PointLocatorfor 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 asfinal, 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
CoordinateArraySequenceinstead ofDefaultCoordinateSequence(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
Debugmethods by setting a system property - Added
getNumGeometriesandgetGeometryNmethods to Geometry class, to make API more uniform - Improved API for
CoordinateSequenceallows more options for improving memory usage and handling custom coordinate storage methods - Added
PackedCoordinateSequenceto 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#isValidto 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#getBoundarynow returns aLinearRingif 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#isCCWnow handles coordinate lists with repeated points. Also throws an IllegalArgumentException if the input ring does not have 3 distinct pointsisValidnow checks for invalid coordinates (e.g. ones with Nan or infinite numbers)- added copyDeep() method to
CoordinateArrays - added geometry simplification operations
DouglasPeuckerSimplifierandTopologyPreservingSimplifier - added methods to
QuadtreeandSTRtreeto 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
Geometryserialization - Fixed bug in
ValidOpwhich 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
Polygonizerwhich caused exception if no lines were supplied
Architecture Changes
- Basic CG algorithm methods made static in the
CGAlgorithmsclass - Various utility methods made public in
CoordinateArraysclass
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