001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/io/shpapi/ShapeUtils.java $
002
003 /*----------------------------------------------------------------------------
004 This file is part of deegree, http://deegree.org/
005 Copyright (C) 2001-2009 by:
006 Department of Geography, University of Bonn
007 and
008 lat/lon GmbH
009
010 This library is free software; you can redistribute it and/or modify it under
011 the terms of the GNU Lesser General Public License as published by the Free
012 Software Foundation; either version 2.1 of the License, or (at your option)
013 any later version.
014 This library is distributed in the hope that it will be useful, but WITHOUT
015 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
016 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
017 details.
018 You should have received a copy of the GNU Lesser General Public License
019 along with this library; if not, write to the Free Software Foundation, Inc.,
020 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021
022 Contact information:
023
024 lat/lon GmbH
025 Aennchenstr. 19, 53177 Bonn
026 Germany
027 http://lat-lon.de/
028
029 Department of Geography, University of Bonn
030 Prof. Dr. Klaus Greve
031 Postfach 1147, 53001 Bonn
032 Germany
033 http://www.geographie.uni-bonn.de/deegree/
034
035 e-mail: info@deegree.org
036 ----------------------------------------------------------------------------*/
037
038 package org.deegree.io.shpapi;
039
040 import org.deegree.model.spatialschema.ByteUtils;
041
042 /**
043 * Utilities for reading and writing the components of shape files.
044 *
045 *
046 * <B>Last changes<B>:<BR>
047 * 25.11.1999 ap: memory allocation dynaminized<BR>
048 * 17.1.2000 ap: method SHPPoint readPoint(byte[] b, int off) modified<BR>
049 * 17.1.2000 ap: method SHPEnvelope readBox(byte[] b, int off) modified<BR>
050 * 17.1.2000 ap: method writePoint(..) modified<BR>
051 *
052 * <!---------------------------------------------------------------------------->
053 *
054 * @version 25.1.2000
055 * @author Andreas Poth
056 *
057 */
058
059 public class ShapeUtils {
060
061 /**
062 * readPoint(byte[] b, int off)<BR>
063 * Reads a point record. A point record is a double representing the x value and a double
064 * representing a y value.
065 *
066 * @param b
067 * the raw data buffer
068 * @param off
069 * the offset into the buffer where the int resides
070 * @return the point read from the buffer at the offset location
071 */
072 public static SHPPoint readPoint( byte[] b, int off ) {
073
074 SHPPoint point = new SHPPoint();
075
076 point.x = ByteUtils.readLEDouble( b, off );
077 point.y = ByteUtils.readLEDouble( b, off + 8 );
078
079 return point;
080
081 }
082
083 /**
084 * method: readBox(byte[] b, int off)<BR>
085 * Reads a bounding box record. A bounding box is four double representing, in order, xmin,
086 * ymin, xmax, ymax.
087 *
088 * @param b
089 * the raw data buffer
090 * @param off
091 * the offset into the buffer where the int resides
092 * @return the point read from the buffer at the offset location
093 */
094 public static SHPEnvelope readBox( byte[] b, int off ) {
095
096 SHPEnvelope bb = new SHPEnvelope();
097
098 SHPPoint min = readPoint( b, off );
099 SHPPoint max = readPoint( b, off + 16 );
100
101 bb.west = min.x;
102 bb.south = min.y;
103 bb.east = max.x;
104 bb.north = max.y;
105
106 return bb;
107
108 }
109
110 /**
111 * method: writePoint(byte[] b, int off, ESRIPoint point)<BR>
112 * Writes the given point to the given buffer at the given location. The point is written as a
113 * double representing x followed by a double representing y.
114 *
115 * @param b
116 * the data buffer
117 * @param off
118 * the offset into the buffer where writing should occur
119 * @param point
120 * the point to write
121 * @return the number of bytes written
122 */
123 public static int writePoint( byte[] b, int off, SHPPoint point ) {
124
125 int nBytes = ByteUtils.writeLEDouble( b, off, point.x );
126
127 nBytes += ByteUtils.writeLEDouble( b, off + nBytes, point.y );
128
129 return nBytes;
130
131 }
132
133 /**
134 * method: writeBox(byte[] b, int off, ESRIBoundingBox box)<BR>
135 * Writes the given bounding box to the given buffer at the given location. The bounding box is
136 * written as four doubles representing, in order, xmin, ymin, xmax, ymax.
137 *
138 * @param b
139 * the data buffer
140 * @param off
141 * the offset into the buffer where writing should occur
142 * @param box
143 * the bounding box to write
144 * @return the number of bytes written
145 */
146 public static int writeBox( byte[] b, int off, SHPEnvelope box ) {
147
148 SHPPoint min = new SHPPoint();
149 min.x = box.west;
150 min.y = box.south;
151 SHPPoint max = new SHPPoint();
152 max.x = box.east;
153 max.y = box.north;
154
155 int nBytes = writePoint( b, off, min );
156
157 nBytes += writePoint( b, off + nBytes, max );
158
159 return nBytes;
160
161 }
162
163 }