A conversão de LineString para Polygon resulta em ClassCastException quando as coordenadas y são iguais

Aug 17 2020
final WKTReader wktReader = new WKTReader();
String geomString = "MULTILINESTRING ((-98.753985 34.63093, -98.7555568 34.63093))";
MultiLineString geom = (MultiLineString)wktReader.read(geomString);
LineString newGeom = new GeometryFactory().createLineString(geom.getCoordinates());
Polygon envelope = (Polygon) newGeom.getEnvelope();

Esse código resulta com ClassCastException (). No entanto, quando estou alterando o valor y de qualquer uma das coordenadas, por exemplo, primeiro um para 34.6309 4 , não recebo nenhum erro.
Estou usando org.locationtech.jts-1.17.

O que eu gostaria de alcançar é lançá-lo no Polygon sem esta exceção. Ou, a exceção é realmente válida e eu não deveria ser capaz de lançar qualquer LineString de duas coordenadas para o polígono?

Respostas

3 IanTurton Aug 17 2020 at 20:27

Como sua MultiLineString é uma linha vertical, o JTS retorna uma linha quando você pede o envelope (ele acha que isso é útil). Portanto, você precisa perguntar o internalEnvelopeque lhe dará um Envelope(an xmin / xmax, ymin / ymax). Você pode então converter isso em um Polygonusando a org.geotools.geometry.jts.JTS classe Utility .

final WKTReader wktReader = new WKTReader();
String geomString = "MULTILINESTRING ((-98.753985 34.63093, -98.7555568 34.63093))";
MultiLineString geom = (MultiLineString) wktReader.read(geomString);
LineString newGeom = new GeometryFactory().createLineString(geom.getCoordinates());
Geometry envelope = newGeom.getEnvelope();
System.out.println(envelope);
Envelope env = newGeom.getEnvelopeInternal();
System.out.println(env);
Polygon polygon = JTS.toGeometry(env);
System.out.println(polygon);

Que produz:

LINESTRING (-98.7555568 34.63093, -98.753985 34.63093)
Env[-98.7555568 : -98.753985, 34.63093 : 34.63093]
POLYGON ((-98.7555568 34.63093, -98.753985 34.63093, -98.753985 34.63093, -98.7555568 34.63093, -98.7555568 34.63093))

Nota: o polígono ainda parecerá uma linha, pois não tem largura, mas acho que é isso que você deseja.