La conversion de LineString en Polygon entraîne une exception ClassCastException lorsque les coordonnées y sont identiques
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
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 internalEnvelope
qui vous donnera un Envelope
(un xmin / xmax, ymin / ymax). Vous pouvez ensuite le convertir en un en Polygon
utilisant 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.