first add this dependency (in addition to mysql-connector-java)
<dependency> <groupId>com.vividsolutions</groupId> <artifactId>jts</artifactId> <version>1.13</version> </dependency>
and then use following code from http://www.dev-garden.org/2011/11/27/loading-mysql-spatial-data-with-jdbc-and-jts-wkbreader/:
//MySQL geometries are returned in JDBC as binary streams. The
//stream will be null if the record has no geometry.
try(InputStream inputStream = rs.getBinaryStream("Geom")) {
Geometry geometry = GeometryParser.getGeometryFromInputStream(inputStream);
}
where rs is a ResultSet (rs = stmt.getResultSet())
, "Geom" is a column of type Geometry, and:
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.io.WKBReader;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class GeometryParser {
/**
* http://www.dev-garden.org/2011/11/27/loading-mysql-spatial-data-with-jdbc-and-jts-wkbreader/
* @param inputStream
* @return
* @throws Exception
*/
public static Geometry getGeometryFromInputStream(InputStream inputStream) throws Exception {
Geometry dbGeometry = null;
if (inputStream != null) {
//convert the stream to a byte[] array
//so it can be passed to the WKBReader
byte[] buffer = new byte[255];
int bytesRead = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((bytesRead = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, bytesRead);
}
byte[] geometryAsBytes = baos.toByteArray();
baos.close();
if (geometryAsBytes.length < 5) {
throw new Exception("Invalid geometry inputStream - less than five bytes");
}
//first four bytes of the geometry are the SRID,
//followed by the actual WKB. Determine the SRID
//here
byte[] sridBytes = new byte[4];
System.arraycopy(geometryAsBytes, 0, sridBytes, 0, 4);
boolean bigEndian = (geometryAsBytes[4] == 0x00);
int srid = 0;
if (bigEndian) {
for (int i = 0; i < sridBytes.length; i++) {
srid = (srid << 8) + (sridBytes[i] & 0xff);
}
} else {
for (int i = 0; i < sridBytes.length; i++) {
srid += (sridBytes[i] & 0xff) << (8 * i);
}
}
//use the JTS WKBReader for WKB parsing
WKBReader wkbReader = new WKBReader();
//copy the byte array, removing the first four
//SRID bytes
byte[] wkb = new byte[geometryAsBytes.length - 4];
System.arraycopy(geometryAsBytes, 4, wkb, 0, wkb.length);
dbGeometry = wkbReader.read(wkb);
dbGeometry.setSRID(srid);
}
return dbGeometry;
}
}