From 94ae08701bbd7585a0b7e5a92d1975965a503c03 Mon Sep 17 00:00:00 2001 From: Dennis Kao <ulysseskao@gmail.com> Date: Wed, 15 Jan 2014 11:28:52 +0800 Subject: [PATCH] Merge branch 'origin/2.1.x' --- xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/postjts/JtsBinaryWriter.java | 207 +++++++++++++++++---------------------------------- 1 files changed, 69 insertions(+), 138 deletions(-) diff --git a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/postjts/JtsBinaryWriter.java b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/postjts/JtsBinaryWriter.java index 36a9d7b..3b0b584 100644 --- a/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/postjts/JtsBinaryWriter.java +++ b/xdgnjobs/ximple-spatialjob/src/main/java/com/ximple/eofms/util/postjts/JtsBinaryWriter.java @@ -50,8 +50,7 @@ * * @author markus.schaber@logi-track.com */ -public class JtsBinaryWriter -{ +public class JtsBinaryWriter { /** * Get the appropriate ValueGetter for my endianness @@ -59,16 +58,12 @@ * @param bytes The appropriate Byte Getter * @return the ValueGetter */ - public static ValueSetter valueSetterForEndian(ByteSetter bytes, byte endian) - { - if (endian == ValueSetter.XDR.NUMBER) - { // XDR + public static ValueSetter valueSetterForEndian(ByteSetter bytes, byte endian) { + if (endian == ValueSetter.XDR.NUMBER) { // XDR return new ValueSetter.XDR(bytes); - } else if (endian == ValueSetter.NDR.NUMBER) - { + } else if (endian == ValueSetter.NDR.NUMBER) { return new ValueSetter.NDR(bytes); - } else - { + } else { throw new IllegalArgumentException("Unknown Endian type:" + endian); } } @@ -79,16 +74,14 @@ * Currently, geometries with more than 2 dimensions and measures are not * cleanly supported, but SRID is honored. */ - public String writeHexed(Geometry geom, byte REP) - { + public String writeHexed(Geometry geom, byte REP) { int length = estimateBytes(geom); ByteSetter.StringByteSetter bytes = new ByteSetter.StringByteSetter(length); writeGeometry(geom, valueSetterForEndian(bytes, REP)); return bytes.result(); } - public String writeHexed(Geometry geom) - { + public String writeHexed(Geometry geom) { return writeHexed(geom, ValueSetter.NDR.NUMBER); } @@ -98,37 +91,30 @@ * Currently, geometries with more than 2 dimensions and measures are not * cleanly supported, but SRID is honored. */ - public byte[] writeBinary(Geometry geom, byte REP) - { + public byte[] writeBinary(Geometry geom, byte REP) { int length = estimateBytes(geom); ByteSetter.BinaryByteSetter bytes = new ByteSetter.BinaryByteSetter(length); writeGeometry(geom, valueSetterForEndian(bytes, REP)); return bytes.result(); } - public byte[] writeBinary(Geometry geom) - { + public byte[] writeBinary(Geometry geom) { return writeBinary(geom, ValueSetter.NDR.NUMBER); } /** * Parse a geometry starting at offset. */ - protected void writeGeometry(Geometry geom, ValueSetter dest) - { + protected void writeGeometry(Geometry geom, ValueSetter dest) { final int dimension; - if (geom == null) - { + if (geom == null) { throw new NullPointerException(); - } else if (geom.isEmpty()) - { + } else if (geom.isEmpty()) { // don't set any flag bits dimension = 0; - } else - { + } else { dimension = getCoordDim(geom); - if (dimension < 2 || dimension > 4) - { + if (dimension < 2 || dimension > 4) { throw new IllegalArgumentException("Unsupported geometry dimensionality: " + dimension); } } @@ -138,30 +124,25 @@ // write typeword final int plaintype = getWKBType(geom); int typeword = plaintype; - if (dimension == 3 || dimension == 4) - { + if (dimension == 3 || dimension == 4) { typeword |= 0x80000000; } - if (dimension == 4) - { + if (dimension == 4) { typeword |= 0x40000000; } final boolean haveSrid = checkSrid(geom); - if (haveSrid) - { + if (haveSrid) { typeword |= 0x20000000; } dest.setInt(typeword); - if (haveSrid) - { + if (haveSrid) { dest.setInt(geom.getSRID()); } - switch (plaintype) - { + switch (plaintype) { case org.postgis.Geometry.POINT: writePoint((Point) geom, dest); break; @@ -188,37 +169,27 @@ } } - public static int getWKBType(Geometry geom) - { + public static int getWKBType(Geometry geom) { // We always write emtpy geometries as emtpy collections - for OpenGIS // conformance - if (geom.isEmpty()) - { + if (geom.isEmpty()) { return org.postgis.Geometry.GEOMETRYCOLLECTION; - } else if (geom instanceof Point) - { + } else if (geom instanceof Point) { return org.postgis.Geometry.POINT; - } else if (geom instanceof com.vividsolutions.jts.geom.LineString) - { + } else if (geom instanceof com.vividsolutions.jts.geom.LineString) { return org.postgis.Geometry.LINESTRING; - } else if (geom instanceof com.vividsolutions.jts.geom.Polygon) - { + } else if (geom instanceof com.vividsolutions.jts.geom.Polygon) { return org.postgis.Geometry.POLYGON; - } else if (geom instanceof MultiPoint) - { + } else if (geom instanceof MultiPoint) { return org.postgis.Geometry.MULTIPOINT; - } else if (geom instanceof MultiLineString) - { + } else if (geom instanceof MultiLineString) { return org.postgis.Geometry.MULTILINESTRING; - } else if (geom instanceof com.vividsolutions.jts.geom.MultiPolygon) - { + } else if (geom instanceof com.vividsolutions.jts.geom.MultiPolygon) { return org.postgis.Geometry.MULTIPOLYGON; } - if (geom instanceof com.vividsolutions.jts.geom.GeometryCollection) - { + if (geom instanceof com.vividsolutions.jts.geom.GeometryCollection) { return org.postgis.Geometry.GEOMETRYCOLLECTION; - } else - { + } else { throw new IllegalArgumentException("Unknown Geometry Type: " + geom.getClass().getName()); } } @@ -227,8 +198,7 @@ * Writes a "slim" Point (without endiannes, srid ant type, only the * ordinates and measure. Used by writeGeometry. */ - private void writePoint(Point geom, ValueSetter dest) - { + private void writePoint(Point geom, ValueSetter dest) { writeCoordinates(geom.getCoordinateSequence(), getCoordDim(geom), dest); } @@ -236,62 +206,49 @@ * Write a Coordinatesequence, part of LinearRing and Linestring, but not * MultiPoint! */ - private void writeCoordinates(CoordinateSequence seq, int dims, ValueSetter dest) - { - for (int i = 0; i < seq.size(); i++) - { - for (int d = 0; d < dims; d++) - { + private void writeCoordinates(CoordinateSequence seq, int dims, ValueSetter dest) { + for (int i = 0; i < seq.size(); i++) { + for (int d = 0; d < dims; d++) { dest.setDouble(seq.getOrdinate(i, d)); } } } - private void writeMultiPoint(MultiPoint geom, ValueSetter dest) - { + private void writeMultiPoint(MultiPoint geom, ValueSetter dest) { dest.setInt(geom.getNumPoints()); - for (int i = 0; i < geom.getNumPoints(); i++) - { + for (int i = 0; i < geom.getNumPoints(); i++) { writeGeometry(geom.getGeometryN(i), dest); } } - private void writeLineString(LineString geom, ValueSetter dest) - { + private void writeLineString(LineString geom, ValueSetter dest) { dest.setInt(geom.getNumPoints()); writeCoordinates(geom.getCoordinateSequence(), getCoordDim(geom), dest); } - private void writePolygon(Polygon geom, ValueSetter dest) - { + private void writePolygon(Polygon geom, ValueSetter dest) { dest.setInt(geom.getNumInteriorRing() + 1); writeLineString(geom.getExteriorRing(), dest); - for (int i = 0; i < geom.getNumInteriorRing(); i++) - { + for (int i = 0; i < geom.getNumInteriorRing(); i++) { writeLineString(geom.getInteriorRingN(i), dest); } } - private void writeMultiLineString(MultiLineString geom, ValueSetter dest) - { + private void writeMultiLineString(MultiLineString geom, ValueSetter dest) { writeGeometryArray(geom, dest); } - private void writeMultiPolygon(MultiPolygon geom, ValueSetter dest) - { + private void writeMultiPolygon(MultiPolygon geom, ValueSetter dest) { writeGeometryArray(geom, dest); } - private void writeCollection(GeometryCollection geom, ValueSetter dest) - { + private void writeCollection(GeometryCollection geom, ValueSetter dest) { writeGeometryArray(geom, dest); } - private void writeGeometryArray(Geometry geom, ValueSetter dest) - { + private void writeGeometryArray(Geometry geom, ValueSetter dest) { dest.setInt(geom.getNumGeometries()); - for (int i = 0; i < geom.getNumGeometries(); i++) - { + for (int i = 0; i < geom.getNumGeometries(); i++) { writeGeometry(geom.getGeometryN(i), dest); } } @@ -299,8 +256,7 @@ /** * Estimate how much bytes a geometry will need in WKB. */ - protected int estimateBytes(Geometry geom) - { + protected int estimateBytes(Geometry geom) { int result = 0; // write endian flag @@ -309,13 +265,11 @@ // write typeword result += 4; - if (checkSrid(geom)) - { + if (checkSrid(geom)) { result += 4; } - switch (getWKBType(geom)) - { + switch (getWKBType(geom)) { case org.postgis.Geometry.POINT: result += estimatePoint((Point) geom); break; @@ -343,26 +297,22 @@ return result; } - private boolean checkSrid(Geometry geom) - { + private boolean checkSrid(Geometry geom) { final int srid = geom.getSRID(); // SRID is default 0 with jts geometries return (srid != -1) && (srid != 0); } - private int estimatePoint(Point geom) - { + private int estimatePoint(Point geom) { return 8 * getCoordDim(geom); } /** * Write an Array of "full" Geometries */ - private int estimateGeometryArray(Geometry container) - { + private int estimateGeometryArray(Geometry container) { int result = 0; - for (int i = 0; i < container.getNumGeometries(); i++) - { + for (int i = 0; i < container.getNumGeometries(); i++) { result += estimateBytes(container.getGeometryN(i)); } return result; @@ -371,12 +321,10 @@ /** * Estimate an array of "fat" Points */ - private int estimateMultiPoint(MultiPoint geom) - { + private int estimateMultiPoint(MultiPoint geom) { // int size int result = 4; - if (geom.getNumGeometries() > 0) - { + if (geom.getNumGeometries() > 0) { // We can shortcut here, compared to estimateGeometryArray, as all // subgeoms have the same fixed size result += geom.getNumGeometries() * estimateBytes(geom.getGeometryN(0)); @@ -384,85 +332,68 @@ return result; } - private int estimateLineString(LineString geom) - { - if (geom == null || geom.getNumGeometries() == 0) - { + private int estimateLineString(LineString geom) { + if (geom == null || geom.getNumGeometries() == 0) { return 0; - } else - { + } else { return 4 + 8 * getCoordSequenceDim(geom.getCoordinateSequence()) * geom.getCoordinateSequence().size(); } } - private int estimatePolygon(Polygon geom) - { + private int estimatePolygon(Polygon geom) { // int length int result = 4; result += estimateLineString(geom.getExteriorRing()); - for (int i = 0; i < geom.getNumInteriorRing(); i++) - { + for (int i = 0; i < geom.getNumInteriorRing(); i++) { result += estimateLineString(geom.getInteriorRingN(i)); } return result; } - private int estimateMultiLineString(MultiLineString geom) - { + private int estimateMultiLineString(MultiLineString geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); } - private int estimateMultiPolygon(MultiPolygon geom) - { + private int estimateMultiPolygon(MultiPolygon geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); } - private int estimateCollection(GeometryCollection geom) - { + private int estimateCollection(GeometryCollection geom) { // 4-byte count + subgeometries return 4 + estimateGeometryArray(geom); } - public static final int getCoordDim(Geometry geom) - { - if (geom.isEmpty()) - { + public static final int getCoordDim(Geometry geom) { + if (geom.isEmpty()) { return 0; } - if (geom instanceof Point) - { + if (geom instanceof Point) { return getCoordSequenceDim(((Point) geom).getCoordinateSequence()); - } else if (geom instanceof LineString) - { + } else if (geom instanceof LineString) { return getCoordSequenceDim(((LineString) geom).getCoordinateSequence()); - } else if (geom instanceof Polygon) - { + } else if (geom instanceof Polygon) { return getCoordSequenceDim(((Polygon) geom).getExteriorRing().getCoordinateSequence()); - } else - { + } else { return getCoordDim(geom.getGeometryN(0)); } } - public static final int getCoordSequenceDim(CoordinateSequence coords) - { + public static final int getCoordSequenceDim(CoordinateSequence coords) { if (coords == null || coords.size() == 0) return 0; // JTS has a really strange way to handle dimensions! // Just have a look at PackedCoordinateSequence and // CoordinateArraySequence int dimensions = coords.getDimension(); - if (dimensions == 3) - { + if (dimensions == 3) { // CoordinateArraySequence will always return 3, so we have to // check, if // the third ordinate contains NaN, then the geom is actually // 2-dimensional return Double.isNaN(coords.getOrdinate(0, CoordinateSequence.Z)) ? 2 : 3; - } else - { + } else { return dimensions; } } -- Gitblit v0.0.0-SNAPSHOT