Mentransmisikan LineString ke Polygon menghasilkan ClassCastException saat koordinat y sama

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

Hasil kode tersebut dengan ClassCastException (). Namun, ketika saya mengubah nilai y dari salah satu koordinat, misalnya yang pertama menjadi 34.6309 4 , saya tidak mendapatkan kesalahan apa pun.
Saya menggunakan org.locationtech.jts-1.17.

Apa yang ingin saya capai adalah melemparkannya ke Polygon tanpa Pengecualian ini. Atau, pengecualian sebenarnya valid dan saya seharusnya tidak dapat mentransmisikan LineString dua koordinat ke Polygon?

Jawaban

3 IanTurton Aug 17 2020 at 20:27

Karena MultiLineString Anda adalah garis vertikal, JTS memberi Anda garis belakang ketika Anda meminta amplop (menurutnya ini membantu). Jadi, Anda perlu meminta internalEnvelopeyang akan memberi Anda Envelope(xmin / xmax, ymin / ymax). Anda kemudian dapat mengonversinya menjadi Polygonmenggunakan org.geotools.geometry.jts.JTS kelas Utilitas .

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

Yang menghasilkan:

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

Catatan: poligon akan tetap terlihat seperti garis karena tidak memiliki lebar, tapi saya rasa itulah yang Anda inginkan.