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