001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/io/shpapi/SHPMultiPoint.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    import org.deegree.model.spatialschema.MultiPoint;
042    
043    /**
044     * Class representig a collection of points<BR>
045     *
046     *
047     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
048     * @author last edited by: $Author: mschneider $
049     *
050     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
051     */
052    public class SHPMultiPoint extends SHPGeometry {
053    
054        /**
055         *
056         */
057        public SHPPoint[] points = null;
058    
059        /**
060         *
061         */
062        public int numPoints = 0;
063    
064        /**
065         *
066         */
067        public SHPMultiPoint() {
068            // with no points
069        }
070    
071        /**
072         * constructor: recieves a stream
073         *
074         * @param recBuf
075         */
076        public SHPMultiPoint( byte[] recBuf ) {
077    
078            super( recBuf );
079    
080            envelope = ShapeUtils.readBox( recBuf, 4 );
081    
082            numPoints = ByteUtils.readLEInt( recBuffer, 36 );
083    
084            points = new SHPPoint[numPoints];
085    
086            for ( int i = 0; i < numPoints; i++ ) {
087                points[i] = new SHPPoint( recBuffer, 40 + i * 16 );
088            }
089    
090        }
091    
092        /**
093         * constructor: recieves an array of gm_points
094         *
095         * @param multipoint
096         */
097        public SHPMultiPoint( MultiPoint multipoint ) {
098    
099            double xmin = multipoint.getEnvelope().getMin().getX();
100            double xmax = multipoint.getEnvelope().getMax().getX();
101            double ymin = multipoint.getEnvelope().getMin().getY();
102            double ymax = multipoint.getEnvelope().getMax().getY();
103    
104            try {
105                points = new SHPPoint[multipoint.getSize()];
106                for ( int i = 0; i < multipoint.getSize(); i++ ) {
107                    points[i] = new SHPPoint( multipoint.getPointAt( i ).getPosition() );
108                    if ( points[i].x > xmax ) {
109                        xmax = points[i].x;
110                    } else if ( points[i].x < xmin ) {
111                        xmin = points[i].x;
112                    }
113                    if ( points[i].y > ymax ) {
114                        ymax = points[i].y;
115                    } else if ( points[i].y < ymin ) {
116                        ymin = points[i].y;
117                    }
118                }
119            } catch ( Exception e ) {
120                e.printStackTrace();
121            }
122    
123            envelope = new SHPEnvelope( xmin, xmax, ymax, ymin );
124    
125        }
126    
127        /**
128         * loops through the point array and writes each point to the bytearray<BR>
129         *
130         * @param bytearray
131         * @param start
132         * @return SHPMultiPoint as byte arry
133         */
134        public byte[] writeSHPMultiPoint( byte[] bytearray, int start ) {
135    
136            int offset = start;
137    
138            double xmin = points[0].x;
139            double xmax = points[0].x;
140            double ymin = points[0].y;
141            double ymax = points[0].y;
142    
143            // write shape type identifier ( 8 = multipoint )
144            ByteUtils.writeLEInt( bytearray, offset, 8 );
145    
146            offset += 4;
147            // save offset of the bounding box
148            int tmp = offset;
149    
150            // increment offset with size of the bounding box
151            offset += ( 4 * 8 );
152    
153            // write number of points
154            ByteUtils.writeLEInt( bytearray, offset, points.length );
155    
156            offset += 4;
157    
158            for ( int i = 0; i < points.length; i++ ) {
159    
160                // calculate bounding box
161                if ( points[i].x > xmax ) {
162                    xmax = points[i].x;
163                } else if ( points[i].x < xmin ) {
164                    xmin = points[i].x;
165                }
166    
167                if ( points[i].y > ymax ) {
168                    ymax = points[i].y;
169                } else if ( points[i].y < ymin ) {
170                    ymin = points[i].y;
171                }
172    
173                // write x-coordinate
174                ByteUtils.writeLEDouble( bytearray, offset, points[i].x );
175    
176                offset += 8;
177    
178                // write y-coordinate
179                ByteUtils.writeLEDouble( bytearray, offset, points[i].y );
180    
181                offset += 8;
182    
183            }
184    
185            // jump back to the offset of the bounding box
186            offset = tmp;
187    
188            // write bounding box to the byte array
189            ByteUtils.writeLEDouble( bytearray, offset, xmin );
190            offset += 8;
191            ByteUtils.writeLEDouble( bytearray, offset, ymin );
192            offset += 8;
193            ByteUtils.writeLEDouble( bytearray, offset, xmax );
194            offset += 8;
195            ByteUtils.writeLEDouble( bytearray, offset, ymax );
196    
197            return bytearray;
198        }
199    
200        /**
201         * returns the size of the multipoint shape in bytes<BR>
202         *
203         * @return size of the byte arry representation
204         */
205        public int size() {
206            return 40 + points.length * 16;
207        }
208    
209    }