Il cast di LineString su Polygon genera ClassCastException quando le coordinate y sono le stesse

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();

Tale codice risulta con ClassCastException (). Tuttavia, quando modifico il valore y di una qualsiasi delle coordinate, ad esempio la prima in 34.6309 4 , non ottengo alcun errore.
Sto usando org.locationtech.jts-1.17.

Quello che mi piacerebbe ottenere è lanciarlo su Polygon senza questa eccezione. Oppure, l'eccezione è effettivamente valida e non dovrei essere in grado di eseguire il cast di LineString a due coordinate su Polygon?

Risposte

3 IanTurton Aug 17 2020 at 20:27

Poiché la tua MultiLineString è una linea verticale, JTS ti restituisce una linea quando chiedi la busta (pensa che questo sia utile). Quindi devi chiedere il internalEnvelopequale ti darà un Envelope(un xmin / xmax, ymin / ymax). È quindi possibile convertirlo in un Polygonutilizzando la 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);

Che produce:

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: il poligono sembrerà comunque una linea poiché non ha larghezza, ma immagino che sia quello che vuoi.