La conversion de LineString en Polygon entraîne une exception ClassCastException lorsque les coordonnées y sont identiques

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

Un tel code résulte avec ClassCastException (). Cependant, lorsque je change la valeur y de l'une des coordonnées, par exemple la première à 34,6309 4 , je n'obtiens aucune erreur.
J'utilise org.locationtech.jts-1.17.

Ce que j'aimerais réaliser, c'est de le convertir en Polygon sans cette exception. Ou, l'exception est réellement valide et je ne devrais pas être en mesure de convertir une LineString à deux coordonnées en Polygon?

Réponses

3 IanTurton Aug 17 2020 at 20:27

Parce que votre MultiLineString est une ligne verticale, JTS vous renvoie une ligne lorsque vous demandez l'enveloppe (il pense que c'est utile). Vous devez donc demander le internalEnvelopequi vous donnera un Envelope(un xmin / xmax, ymin / ymax). Vous pouvez ensuite le convertir en un en Polygonutilisant 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);

Ce qui produit:

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

Remarque: le polygone ressemblera toujours à une ligne car il n'a pas de largeur, mais je suppose que c'est ce que vous voulez.