Приведение LineString к Polygon приводит к исключению ClassCastException, когда координаты y совпадают
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();
Такой код получается с ClassCastException (). Однако, когда я изменяю значение y любой из координат, например, первое на 34.6309 4 , я не получаю никаких ошибок.
Я использую org.locationtech.jts-1.17.
Чего бы я хотел добиться, так это привести его к Polygon без этого исключения. Или исключение действительно действительно, и я не смогу преобразовать двухкоординатный LineString в Polygon?
Ответы
Поскольку ваш MultiLineString представляет собой вертикальную линию, JTS возвращает вам строку, когда вы запрашиваете конверт (он думает, что это полезно). Поэтому вам нужно спросить, internalEnvelopeчто даст вам Envelope(xmin / xmax, ymin / ymax). Вы можете преобразовать это в Polygonиспользовании org.geotools.geometry.jts.JTS класса 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);
Что производит:
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))
Примечание: многоугольник по-прежнему будет выглядеть как линия, поскольку у него нет ширины, но я думаю, это то, что вам нужно.