Mentransmisikan LineString ke Polygon menghasilkan ClassCastException saat koordinat y sama
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
Karena MultiLineString Anda adalah garis vertikal, JTS memberi Anda garis belakang ketika Anda meminta amplop (menurutnya ini membantu). Jadi, Anda perlu meminta internalEnvelope
yang akan memberi Anda Envelope
(xmin / xmax, ymin / ymax). Anda kemudian dapat mengonversinya menjadi Polygon
menggunakan 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.