A conversão de LineString para Polygon resulta em ClassCastException quando as coordenadas y são iguais
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
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 internalEnvelope
que lhe dará um Envelope
(an xmin / xmax, ymin / ymax). Você pode então converter isso em um Polygon
usando 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.