提交 88fa4120 authored 作者: Evgenij Ryazanov's avatar Evgenij Ryazanov

Move envelope2wkb() to EWKBUtils

上级 7c5fa8c6
......@@ -10,6 +10,10 @@ import static org.h2.util.geometry.GeometryUtils.DIMENSION_SYSTEM_XYZ;
import static org.h2.util.geometry.GeometryUtils.DIMENSION_SYSTEM_XYZM;
import static org.h2.util.geometry.GeometryUtils.GEOMETRY_COLLECTION;
import static org.h2.util.geometry.GeometryUtils.LINE_STRING;
import static org.h2.util.geometry.GeometryUtils.MAX_X;
import static org.h2.util.geometry.GeometryUtils.MAX_Y;
import static org.h2.util.geometry.GeometryUtils.MIN_X;
import static org.h2.util.geometry.GeometryUtils.MIN_Y;
import static org.h2.util.geometry.GeometryUtils.MULTI_LINE_STRING;
import static org.h2.util.geometry.GeometryUtils.MULTI_POINT;
import static org.h2.util.geometry.GeometryUtils.MULTI_POLYGON;
......@@ -450,6 +454,51 @@ public final class EWKBUtils {
index, total);
}
/**
* Converts an envelope to a WKB.
*
* @param envelope
* envelope, or null
* @return WKB, or null
*/
public static byte[] envelope2wkb(double[] envelope) {
if (envelope == null) {
return null;
}
byte[] result;
double minX = envelope[MIN_X], maxX = envelope[MAX_X], minY = envelope[MIN_Y], maxY = envelope[MAX_Y];
if (minX == maxX && minY == maxY) {
result = new byte[21];
result[4] = POINT;
Bits.writeLong(result, 5, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 13, Double.doubleToRawLongBits(minY));
} else if (minX == maxX || minY == maxY) {
result = new byte[41];
result[4] = LINE_STRING;
result[8] = 2;
Bits.writeLong(result, 9, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 17, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 25, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 33, Double.doubleToRawLongBits(maxY));
} else {
result = new byte[93];
result[4] = POLYGON;
result[8] = 1;
result[12] = 5;
Bits.writeLong(result, 13, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 21, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 29, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 37, Double.doubleToRawLongBits(maxY));
Bits.writeLong(result, 45, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 53, Double.doubleToRawLongBits(maxY));
Bits.writeLong(result, 61, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 69, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 77, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 85, Double.doubleToRawLongBits(minY));
}
return result;
}
private EWKBUtils() {
}
......
......@@ -5,8 +5,6 @@
*/
package org.h2.util.geometry;
import org.h2.util.Bits;
/**
* Utilities for GEOMETRY data type.
*/
......@@ -119,8 +117,7 @@ public final class GeometryUtils {
* Invoked after writing of a collection.
*
* @param type
* type of collection, see
* {@link #startCollection(int, int)}
* type of collection, see {@link #startCollection(int, int)}
*/
protected void endCollection(int type) {
}
......@@ -474,51 +471,6 @@ public final class GeometryUtils {
return target.getEnvelope();
}
/**
* Converts an envelope to a WKB.
*
* @param envelope
* envelope, or null
* @return WKB, or null
*/
public static byte[] envelope2wkb(double[] envelope) {
if (envelope == null) {
return null;
}
byte[] result;
double minX = envelope[MIN_X], maxX = envelope[MAX_X], minY = envelope[MIN_Y], maxY = envelope[MAX_Y];
if (minX == maxX && minY == maxY) {
result = new byte[21];
result[4] = POINT;
Bits.writeLong(result, 5, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 13, Double.doubleToRawLongBits(minY));
} else if (minX == maxX || minY == maxY) {
result = new byte[41];
result[4] = LINE_STRING;
result[8] = 2;
Bits.writeLong(result, 9, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 17, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 25, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 33, Double.doubleToRawLongBits(maxY));
} else {
result = new byte[93];
result[4] = POLYGON;
result[8] = 1;
result[12] = 5;
Bits.writeLong(result, 13, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 21, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 29, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 37, Double.doubleToRawLongBits(maxY));
Bits.writeLong(result, 45, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 53, Double.doubleToRawLongBits(maxY));
Bits.writeLong(result, 61, Double.doubleToRawLongBits(maxX));
Bits.writeLong(result, 69, Double.doubleToRawLongBits(minY));
Bits.writeLong(result, 77, Double.doubleToRawLongBits(minX));
Bits.writeLong(result, 85, Double.doubleToRawLongBits(minY));
}
return result;
}
/**
* Checks whether two envelopes intersect with each other.
*
......
......@@ -157,8 +157,10 @@ public class ValueGeometry extends Value {
* @return the value
*/
public static Value fromEnvelope(double[] envelope) {
return envelope != null ? Value.cache(new ValueGeometry(GeometryUtils.envelope2wkb(envelope),
GeometryUtils.DIMENSION_SYSTEM_XY, envelope)): ValueNull.INSTANCE;
return envelope != null
? Value.cache(new ValueGeometry(EWKBUtils.envelope2wkb(envelope), GeometryUtils.DIMENSION_SYSTEM_XY,
envelope))
: ValueNull.INSTANCE;
}
/**
......
......@@ -241,14 +241,14 @@ public class TestGeometryUtils extends TestBase {
private void testEnvelope(Envelope envelopeFromJTS, double[] envelopeFromH2) {
if (envelopeFromJTS.isNull()) {
assertNull(envelopeFromH2);
assertNull(GeometryUtils.envelope2wkb(envelopeFromH2));
assertNull(EWKBUtils.envelope2wkb(envelopeFromH2));
} else {
assertEquals(envelopeFromJTS.getMinX(), envelopeFromH2[0]);
assertEquals(envelopeFromJTS.getMaxX(), envelopeFromH2[1]);
assertEquals(envelopeFromJTS.getMinY(), envelopeFromH2[2]);
assertEquals(envelopeFromJTS.getMaxY(), envelopeFromH2[3]);
assertEquals(new WKBWriter(2).write(new GeometryFactory().toGeometry(envelopeFromJTS)),
GeometryUtils.envelope2wkb(envelopeFromH2));
EWKBUtils.envelope2wkb(envelopeFromH2));
}
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论