{"record":{"id":"dba70b54354c1775","repo":"elastic/elasticsearch","slug":"line-ring-cannot-be-serialized-using-wkt","errorCode":null,"errorMessage":"line ring cannot be serialized using WKT","messagePattern":"line ring cannot be serialized using WKT","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"libs/geo/src/main/java/org/elasticsearch/geometry/utils/WellKnownText.java","lineNumber":802,"sourceCode":"        return geometry.visit(new GeometryVisitor<String, RuntimeException>() {\n            @Override\n            public String visit(Circle circle) {\n                return \"CIRCLE\";\n            }\n\n            @Override\n            public String visit(GeometryCollection<?> collection) {\n                return \"GEOMETRYCOLLECTION\";\n            }\n\n            @Override\n            public String visit(Line line) {\n                return \"LINESTRING\";\n            }\n\n            @Override\n            public String visit(LinearRing ring) {\n                throw new UnsupportedOperationException(\"line ring cannot be serialized using WKT\");\n            }\n\n            @Override\n            public String visit(MultiLine multiLine) {\n                return \"MULTILINESTRING\";\n            }\n\n            @Override\n            public String visit(MultiPoint multiPoint) {\n                return \"MULTIPOINT\";\n            }\n\n            @Override\n            public String visit(MultiPolygon multiPolygon) {\n                return \"MULTIPOLYGON\";\n            }\n\n            @Override","sourceCodeStart":784,"sourceCodeEnd":820,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/libs/geo/src/main/java/org/elasticsearch/geometry/utils/WellKnownText.java#L784-L820","documentation":"Thrown by the getWKTName visitor when serializing a LinearRing to WKT. A LinearRing is a closed LineString used only as a building block (the boundary of a Polygon or a ring in a MultiPolygon); it has no standalone WKT keyword, so attempting to write one is unsupported by design.","triggerScenarios":"Calling WellKnownText.toWKT (or any write path) on a Geometry that is a bare LinearRing rather than a Polygon. The visitor's visit(LinearRing) branch throws UnsupportedOperationException immediately because there is no WKT name for it.","commonSituations":"Code that constructs a LinearRing directly (e.g., for use as a polygon boundary) and then accidentally serializes it as a top-level geometry; a generic serializer iterating a GeometryCollection containing a LinearRing; test fixtures using LinearRing where Polygon was intended.","solutions":["Wrap the LinearRing in a Polygon before serializing: a Polygon's shell is a LinearRing, and Polygon has a valid WKT representation.","If iterating a collection, filter or convert LinearRing elements to Polygon (or LineString if an open ring is acceptable) before writing.","Avoid calling toWKT on a bare LinearRing; use it only as a component of a Polygon."],"exampleFix":"// before: serializing a bare LinearRing\nLinearRing ring = new LinearRing(new double[]{...}, new double[]{...});\nString wkt = WellKnownText.toWKT(ring); // throws\n\n// after: wrap in a Polygon\nPolygon polygon = new Polygon(ring);\nString wkt = WellKnownText.toWKT(polygon); // \"POLYGON ((...))\"","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"// Guard against serializing a bare LinearRing\nstatic boolean isDirectlySerializable(Geometry g) {\n    return !(g instanceof LinearRing);\n}\n// before writing:\nif (g instanceof LinearRing ring) {\n    g = new Polygon(ring); // wrap into a Polygon which has a WKT keyword\n}\nString wkt = WellKnownText.toWKT(g);","tryCatchPattern":"try {\n    String wkt = WellKnownText.toWKT(geometry);\n} catch (UnsupportedOperationException e) {\n    if (e.getMessage().contains(\"line ring\")) {\n        // wrap the LinearRing in a Polygon and retry\n        geometry = new Polygon((LinearRing) geometry);\n        wkt = WellKnownText.toWKT(geometry);\n    } else throw e;\n}","preventionTips":["Never serialize a bare LinearRing; always wrap it in a Polygon first.","Filter or convert LinearRing elements in collections before writing.","Use instanceof checks to detect LinearRing before calling toWKT."],"tags":["geo","wkt","serialization","elasticsearch","geometry"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T08:17:17.861Z"}