提交 fe25a8f0 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Add ValueGeometry.getEnvelopeNoCopy()

上级 12ec6d9d
...@@ -24,7 +24,6 @@ import org.h2.value.Value; ...@@ -24,7 +24,6 @@ import org.h2.value.Value;
import org.h2.value.ValueGeometry; import org.h2.value.ValueGeometry;
import org.h2.value.ValueNull; import org.h2.value.ValueNull;
import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
/** /**
* This is an index based on a MVR-TreeMap. * This is an index based on a MVR-TreeMap.
...@@ -134,8 +133,7 @@ public class SpatialTreeIndex extends BaseIndex implements SpatialIndex { ...@@ -134,8 +133,7 @@ public class SpatialTreeIndex extends BaseIndex implements SpatialIndex {
if (v == ValueNull.INSTANCE) { if (v == ValueNull.INSTANCE) {
return new SpatialKey(row.getKey()); return new SpatialKey(row.getKey());
} }
Geometry g = ((ValueGeometry) v.convertTo(Value.GEOMETRY)).getGeometryNoCopy(); Envelope env = ((ValueGeometry) v.convertTo(Value.GEOMETRY)).getEnvelopeNoCopy();
Envelope env = g.getEnvelopeInternal();
return new SpatialKey(row.getKey(), return new SpatialKey(row.getKey(),
(float) env.getMinX(), (float) env.getMaxX(), (float) env.getMinX(), (float) env.getMaxX(),
(float) env.getMinY(), (float) env.getMaxY()); (float) env.getMinY(), (float) env.getMaxY());
......
...@@ -33,7 +33,6 @@ import org.h2.value.ValueGeometry; ...@@ -33,7 +33,6 @@ import org.h2.value.ValueGeometry;
import org.h2.value.ValueLong; import org.h2.value.ValueLong;
import org.h2.value.ValueNull; import org.h2.value.ValueNull;
import org.locationtech.jts.geom.Envelope; import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
/** /**
* This is an index based on a MVRTreeMap. * This is an index based on a MVRTreeMap.
...@@ -223,8 +222,7 @@ public class MVSpatialIndex extends BaseIndex implements SpatialIndex, MVIndex { ...@@ -223,8 +222,7 @@ public class MVSpatialIndex extends BaseIndex implements SpatialIndex, MVIndex {
if (v == ValueNull.INSTANCE) { if (v == ValueNull.INSTANCE) {
return new SpatialKey(row.getKey()); return new SpatialKey(row.getKey());
} }
Geometry g = ((ValueGeometry) v.convertTo(Value.GEOMETRY)).getGeometryNoCopy(); Envelope env = ((ValueGeometry) v.convertTo(Value.GEOMETRY)).getEnvelopeNoCopy();
Envelope env = g.getEnvelopeInternal();
return new SpatialKey(row.getKey(), return new SpatialKey(row.getKey(),
(float) env.getMinX(), (float) env.getMaxX(), (float) env.getMinX(), (float) env.getMaxX(),
(float) env.getMinY(), (float) env.getMaxY()); (float) env.getMinY(), (float) env.getMaxY());
......
...@@ -52,6 +52,11 @@ public class ValueGeometry extends Value { ...@@ -52,6 +52,11 @@ public class ValueGeometry extends Value {
*/ */
private Geometry geometry; private Geometry geometry;
/**
* The envelope of the value. Calculated only on request.
*/
private Envelope envelope;
/** /**
* Create a new geometry objects. * Create a new geometry objects.
* *
...@@ -205,6 +210,18 @@ public class ValueGeometry extends Value { ...@@ -205,6 +210,18 @@ public class ValueGeometry extends Value {
return 0; return 0;
} }
/**
* Return an envelope of this geometry. Do not modify the returned value.
*
* @return envelope of this geometry
*/
public Envelope getEnvelopeNoCopy() {
if (envelope == null) {
envelope = getGeometryNoCopy().getEnvelopeInternal();
}
return envelope;
}
/** /**
* Test if this geometry envelope intersects with the other geometry * Test if this geometry envelope intersects with the other geometry
* envelope. * envelope.
...@@ -213,9 +230,7 @@ public class ValueGeometry extends Value { ...@@ -213,9 +230,7 @@ public class ValueGeometry extends Value {
* @return true if the two overlap * @return true if the two overlap
*/ */
public boolean intersectsBoundingBox(ValueGeometry r) { public boolean intersectsBoundingBox(ValueGeometry r) {
// the Geometry object caches the envelope return getEnvelopeNoCopy().intersects(r.getEnvelopeNoCopy());
return getGeometryNoCopy().getEnvelopeInternal().intersects(
r.getGeometryNoCopy().getEnvelopeInternal());
} }
/** /**
...@@ -226,8 +241,8 @@ public class ValueGeometry extends Value { ...@@ -226,8 +241,8 @@ public class ValueGeometry extends Value {
*/ */
public Value getEnvelopeUnion(ValueGeometry r) { public Value getEnvelopeUnion(ValueGeometry r) {
GeometryFactory gf = new GeometryFactory(); GeometryFactory gf = new GeometryFactory();
Envelope mergedEnvelope = new Envelope(getGeometryNoCopy().getEnvelopeInternal()); Envelope mergedEnvelope = new Envelope(getEnvelopeNoCopy());
mergedEnvelope.expandToInclude(r.getGeometryNoCopy().getEnvelopeInternal()); mergedEnvelope.expandToInclude(r.getEnvelopeNoCopy());
return get(gf.toGeometry(mergedEnvelope)); return get(gf.toGeometry(mergedEnvelope));
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论