提交 b3d9db45 编写于 作者: S serge-rider

MySQL GIS data types: invert coordinates

上级 e685b6f0
......@@ -34,7 +34,15 @@ import java.sql.SQLException;
*/
public class GISGeometryValueHandler extends JDBCAbstractValueHandler {
public static final GISGeometryValueHandler INSTANCE = new GISGeometryValueHandler();
private boolean invertCoordinates;
public GISGeometryValueHandler() {
this(false);
}
public GISGeometryValueHandler(boolean invertCoordinates) {
this.invertCoordinates = invertCoordinates;
}
@Override
protected Object fetchColumnValue(DBCSession session, JDBCResultSet resultSet, DBSTypedObject type, int index) throws DBCException, SQLException {
......@@ -70,9 +78,17 @@ public class GISGeometryValueHandler extends JDBCAbstractValueHandler {
} else if (object instanceof Geometry) {
return new DBGeometry((Geometry)object);
} else if (object instanceof byte[]) {
return new DBGeometry(GeometryConverter.getInstance().from((byte[]) object));
Geometry geometry = GeometryConverter.getInstance().from((byte[]) object);
if (invertCoordinates) {
geometry.apply(GeometryConverter.INVERT_COORDINATE_FILTER);
}
return new DBGeometry(geometry);
} else if (object instanceof String) {
return new DBGeometry(GeometryConverter.getInstance().from((String)object));
Geometry geometry = GeometryConverter.getInstance().from((String) object);
if (invertCoordinates) {
geometry.apply(GeometryConverter.INVERT_COORDINATE_FILTER);
}
return new DBGeometry(geometry);
} else {
throw new DBCException("Unsupported geometry value: " + object);
}
......
package org.jkiss.dbeaver.data.gis.handlers;
import com.vividsolutions.jts.geom.CoordinateSequenceFactory;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.PrecisionModel;
import com.vividsolutions.jts.geom.*;
import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory;
import com.vividsolutions.jts.io.*;
......@@ -19,6 +16,7 @@ import java.io.IOException;
* of byte[] because of codegen.
*/
public class GeometryConverter {
public static final InvertCoordinateFilter INVERT_COORDINATE_FILTER = new InvertCoordinateFilter();
/**
* Little endian or Big endian
*/
......@@ -60,7 +58,9 @@ public class GeometryConverter {
// Read Geometry
WKBReader wkbReader = new WKBReader(geometryFactory);
return wkbReader.read(new InputStreamInStream(inputStream));
Geometry geometry = wkbReader.read(new InputStreamInStream(inputStream));
return geometry;
} catch (IOException | ParseException e) {
throw new IllegalArgumentException(e);
}
......@@ -95,4 +95,12 @@ public class GeometryConverter {
}
}
private static class InvertCoordinateFilter implements CoordinateFilter {
public void filter(Coordinate coord) {
double oldX = coord.x;
coord.x = coord.y;
coord.y = oldX;
}
}
}
\ No newline at end of file
......@@ -43,7 +43,7 @@ public class MySQLValueHandlerProvider implements DBDValueHandlerProvider {
} else if (typedObject.getTypeName().equalsIgnoreCase(MySQLConstants.TYPE_JSON)) {
return JDBCContentValueHandler.INSTANCE;
} else if (typedObject.getTypeName().equalsIgnoreCase(MySQLConstants.TYPE_GEOMETRY)) {
return GISGeometryValueHandler.INSTANCE;
return new GISGeometryValueHandler(true);
} else {
return null;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册