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

#4222 Spatial attribute transformers


Former-commit-id: dc5bbc59
上级 f0db44ea
......@@ -12,6 +12,7 @@
<extension point="org.jkiss.dbeaver.dataManager">
<manager class="org.jkiss.dbeaver.ui.gis.GeometryValueManager" id="org.jkiss.dbeaver.ui.gis.GeometryValueManager">
<supports type="org.jkiss.dbeaver.model.gis.DBGeometry"/>
<supports typeName="GIS.Transformed"/> <!-- Fake type name for GIS transformer -->
</manager>
</extension>
......
......@@ -21,9 +21,13 @@ import org.eclipse.swt.widgets.Composite;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.gis.DBGeometry;
import org.jkiss.dbeaver.model.gis.GisTransformUtils;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.ui.controls.lightgrid.GridPos;
......@@ -76,8 +80,13 @@ public class GISBrowserViewer extends BaseValueEditor<Browser> implements IGeome
DBDAttributeBinding attr = selection.getElementAttribute(cell);
ResultSetRow row = selection.getElementRow(cell);
Object cellValue = resultSetController.getModel().getCellValue(attr, row);
if (cellValue instanceof DBGeometry) {
DBGeometry geometry = (DBGeometry) cellValue;
DBGeometry geometry = GisTransformUtils.getGeometryValueFromObject(
valueController.getDataController().getDataContainer(),
valueController.getValueHandler(),
valueController.getValueType(),
cellValue);
if (geometry != null) {
geometries.add(geometry);
// Set properties
......
......@@ -26,6 +26,7 @@ import org.eclipse.swt.widgets.*;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.ui.ActionUtils;
import org.jkiss.dbeaver.ui.DBeaverIcons;
......
......@@ -28,6 +28,7 @@ import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.gis.DBGeometry;
import org.jkiss.dbeaver.model.gis.GisTransformUtils;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.ui.controls.resultset.*;
import org.jkiss.dbeaver.ui.gis.GeometryDataUtils;
......@@ -124,8 +125,14 @@ public class GeometryPresentation extends AbstractPresentation {
for (GeometryDataUtils.GeomAttrs geomAttrs : result) {
for (ResultSetRow row : model.getAllRows()) {
Object value = model.getCellValue(geomAttrs.geomAttr, row);
if (value instanceof DBGeometry) {
DBGeometry geometry = (DBGeometry)value;
DBGeometry geometry = GisTransformUtils.getGeometryValueFromObject(
controller.getDataContainer(),
geomAttrs.geomAttr.getValueHandler(),
geomAttrs.geomAttr,
value);
if (geometry != null) {
geometries.add(geometry);
// Now get description
if (!geomAttrs.descAttrs.isEmpty()) {
......
......@@ -2,4 +2,22 @@
<?eclipse version="3.4"?>
<plugin>
<extension point="org.jkiss.dbeaver.dataTypeProvider">
<!-- Spatial transformer -->
<transformer
class="org.jkiss.dbeaver.data.gis.handlers.GeometryAttributeTransformer"
id="WKTAttributeTransformer"
name="Geometry"
description="Shows string or binary value as Geometry (spatial data type)"
applyByDefault="false"
custom="true">
<type kind="STRING"/>
<type kind="BINARY"/>
<propertyGroup label="Properties">
<property id="srid" label="SRID" type="string" description="CRS identifier" defaultValue="4326" required="false" validValues=""/>
</propertyGroup>
</transformer>
</extension>
</plugin>
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2019 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.data.gis.handlers;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataKind;
import org.jkiss.dbeaver.model.data.DBDAttributeBinding;
import org.jkiss.dbeaver.model.data.DBDAttributeTransformer;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCResultSet;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.gis.DBGeometry;
import org.jkiss.dbeaver.model.gis.GisConstants;
import org.jkiss.dbeaver.model.impl.data.ProxyValueHandler;
import org.jkiss.dbeaver.model.impl.data.transformers.TransformerPresentationAttribute;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.utils.CommonUtils;
import java.util.List;
import java.util.Map;
/**
* Transforms string value into geometry
*/
public class GeometryAttributeTransformer implements DBDAttributeTransformer {
private static final Log log = Log.getLog(GeometryAttributeTransformer.class);
private static final String PROP_SRID = "srid";
public static final String GIS_TYPE_NAME = "GIS.Transformed";
@Override
public void transformAttribute(@NotNull DBCSession session, @NotNull DBDAttributeBinding attribute, @NotNull List<Object[]> rows, @NotNull Map<String, String> options) throws DBException {
attribute.setPresentationAttribute(
new TransformerPresentationAttribute(attribute, GIS_TYPE_NAME, -1, attribute.getDataKind()));
int srid = CommonUtils.toInt(options.get(PROP_SRID));
if (srid == 0) {
srid = GisConstants.DEFAULT_SRID;
}
attribute.setTransformHandler(new GISValueHandler(attribute.getValueHandler(), srid));
}
private class GISValueHandler extends ProxyValueHandler {
private final GISGeometryValueHandler realHandler;
private final int srid;
public GISValueHandler(DBDValueHandler target, int srid) {
super(target);
this.realHandler = new GISGeometryValueHandler();
this.srid = srid;
}
@Override
public Class<?> getValueObjectType(DBSTypedObject attribute) {
return realHandler.getValueObjectType(attribute);
}
@Override
public Object fetchValueObject(DBCSession session, DBCResultSet resultSet, DBSTypedObject type, int index) throws DBCException {
Object object = super.fetchValueObject(session, resultSet, type, index);
return getValueFromObject(session, type, object, false);
}
@Nullable
@Override
public Object getValueFromObject(@NotNull DBCSession session, @NotNull DBSTypedObject type, @Nullable Object object, boolean copy) throws DBCException {
return realHandler.getValueFromObject(session, type, object, copy);
}
}
}
......@@ -30,6 +30,13 @@ import org.cts.op.CoordinateOperationFactory;
import org.cts.registry.*;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.data.DBDValueHandler;
import org.jkiss.dbeaver.model.exec.DBCException;
import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.struct.DBSDataContainer;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.utils.CommonUtils;
import java.util.ArrayList;
......@@ -168,4 +175,29 @@ public class GisTransformUtils {
return srcCoord;
}
public static DBGeometry getGeometryValueFromObject(DBSDataContainer dataContainer, DBDValueHandler valueHandler, DBSTypedObject valueType, Object cellValue) {
if (cellValue instanceof DBGeometry) {
return (DBGeometry) cellValue;
}
// Convert value from string, binary or some other format.
// This may be needed if use some attribute transformer or some datasource
// uses plain string data type with GIS value manager.
// Use void monitor because this transformation shouldn't interact with
// any external systems or make db queries.
try (DBCSession utilSession = DBUtils.openUtilSession(new VoidProgressMonitor(), dataContainer, "Convert GIS value")) {
Object convertedValue = valueHandler.getValueFromObject(
utilSession,
valueType,
cellValue,
false);
if (convertedValue instanceof DBGeometry) {
return (DBGeometry) convertedValue;
}
} catch (DBCException e) {
log.debug("Error trandforming geometry value", e);
}
return null;
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册