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