Приведение LineString к Polygon приводит к исключению ClassCastException, когда координаты y совпадают

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

Такой код получается с ClassCastException (). Однако, когда я изменяю значение y любой из координат, например, первое на 34.6309 4 , я не получаю никаких ошибок.
Я использую org.locationtech.jts-1.17.

Чего бы я хотел добиться, так это привести его к Polygon без этого исключения. Или исключение действительно действительно, и я не смогу преобразовать двухкоординатный LineString в Polygon?

Ответы

3 IanTurton Aug 17 2020 at 20:27

Поскольку ваш 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))

Примечание: многоугольник по-прежнему будет выглядеть как линия, поскольку у него нет ширины, но я думаю, это то, что вам нужно.