001 /*
002 * Created on 17.02.2004
003 */
004 package de.fub.tip.datenanzeige;
005
006 import java.io.Serializable;
007 import java.util.StringTokenizer;
008
009 import org.postgis.PGgeometry;
010 import org.postgis.Point;
011 import org.postgis.Polygon;
012
013 /**
014 * Sinn: abstrahiert eine Koordinate und bietet Methoden zur Berechnung
015 * einer Umgebung an<br>
016 * <br>
017 * <b>Die distance=0.001-Festlegung ist von Katja übernommen!</b>
018 * <br>
019 * Nach Erzeugung eines Koordinaten-Objektes sollte die Methode<br>
020 * <code>calculateArea()</code> aufgerufen werden,<br>
021 * damit die Rechteckkoordinaten zum angegebenen Punkt berechnet werden.
022 *
023 * @author hirsch, 17.02.2004
024 * @version 2004-04-06
025 * $Id: Koordinate.java,v 1.12 2004/06/11 21:52:47 hirsch Exp $
026 *
027 * @see de.fub.tip.datenanzeige#calculateArea
028 *
029 * Historie:<br>
030 * <ul>
031 * <li>2004-03-30: <br>
032 * Umwandlung einer Koordinate in ein POSTGIS-Point-Objekt
033 * </li>
034 * <li>2004-04-16: <br>
035 * Klasse implementiert auch die Schnittstelle Serializable, damit der Tomcat-
036 * Container sie entsprechend serialisieren kann
037 * </li>
038 * </ul>
039 */
040 public class Koordinate implements Serializable {
041 // Originalkoordinaten
042 /** geografische X-Koordinate */
043 private double x = 0;
044 /** geografische Y-Koordinate */
045 private double y = 0;
046
047 // Ausdehnungskoordinaten
048 /** geografische X-Ausdehnung nach links */
049 private double xLinks = 0;
050 /** geografische X-Ausdehnung nach rechts */
051 private double xRechts = 0;
052
053 /** geografische Y-Ausdehnung nach links */
054 private double yLinks = 0;
055 /** geografische Y-Ausdehnung nach rechts */
056 private double yRechts = 0;
057
058 /** zur Vergrösserung der eigentlichen Koordinaten wird<br>
059 * mit diesem Werte um einen Punkt herum ein Rechteck<br>
060 * abgebildet, das dem aktuellen Standort entspricht.
061 * <br><br>
062 * Aus Katjas Implementierung übernommen und auf<br>
063 * 0.001 gesetzt!<br>
064 */
065 private static double distance = 0.001;
066
067 /**
068 * Standardkonstruktor, der eine leere Koordinate (0,0) erzeugt,<br>
069 * die dann mit den Settern gefüllt werden sollte.
070 * <br><br>
071 * <code>calculateArea()</code> aufrufen nicht vergessen!
072 */
073 public Koordinate() {
074 this.x = 0;
075 this.y = 0;
076 } // end of Konstruktor 1
077
078 /**
079 * Koordinate des aktuellen Standortes
080 * @param x x-Koordinate
081 * @param y y-Koordinate
082 */
083 public Koordinate(double x, double y) {
084 this.x = x;
085 this.y = y;
086 } // end of Konstruktor 2
087
088 /**
089 * Koordinate des aktuellen Standortes als Postgis-Darstellung.<br>
090 * Dieser Konstruktor dient der impliziten Umwandlung der Postgis-Darstellung
091 * in die TIP-Darstellung als <code>Koordinate</code>.
092 *
093 * @param punkt Postgis-Punktdarstellung
094 */
095 public Koordinate(Point punkt) {
096 this.x = punkt.getX();
097 this.y = punkt.getY();
098 } // end of Konstruktor 3
099
100 /**
101 * Hilfsfunktion zur Berechnung der Umgebungskoordinaten in
102 * Abhängigkeit von der Distanz
103 */
104 public void calculateArea() {
105 this.xRechts = this.x + distance;
106 this.xLinks = this.x - distance;
107
108 this.yRechts = this.y + distance;
109 this.yLinks = this.y - distance;
110 } // end of calculateArea
111
112
113 /**
114 * die eingestellte Entfernung um einen Punkt herum
115 * @return Entfernung
116 */
117 public static double getDistance() {
118 return distance;
119 }
120
121 /**
122 * Von Katja eingeführter Hilfswert, da nach Ihren Aussagen die Koordinaten
123 * sehr sehr klein sind ....<br>
124 *
125 * @param distance aktuelle Entfernung
126 */
127 public static void setDistance(double distance) {
128 Koordinate.distance = distance;
129 }
130
131 /**
132 * eigentliche X-Koordinate
133 * @return X-Koordinate
134 */
135 public double getX() {
136 return x;
137 }
138
139 /**
140 * setze X-Koordinate und berechne Umgebung neu
141 * @param x neue x-Koordinate
142 */
143 public void setX(double x) {
144 this.x = x;
145 this.calculateArea();
146 }
147
148 /**
149 * X-Ausdehnung nach Links
150 * @return X-Koordinate Links
151 */
152 public double getXLinks() {
153 return xLinks;
154 }
155
156 /**
157 * setze X-Ausdehnung nach Links
158 * @param links x-ausdehnung nach links
159 */
160 public void setXLinks(double links) {
161 xLinks = links;
162 }
163
164 /**
165 * Y-Ausdehnung nach Rechts
166 * @return X-Koordinate Rechts
167 */
168 public double getXRechts() {
169 return xRechts;
170 }
171
172 /**
173 * setze X-Ausdehnung nach rechts
174 * @param rechts x-ausdehnung nach rechts
175 */
176 public void setXRechts(double rechts) {
177 xRechts = rechts;
178 }
179
180 /**
181 * gesetzte Y-Koordinate
182 * @return Y-Koordinate
183 */
184 public double getY() {
185 return y;
186 }
187
188 /**
189 * setze Y-Koordinate und berechne Umgebung neu
190 * @param y neue y-Koordinate
191 */
192 public void setY(double y) {
193 this.y = y;
194 this.calculateArea();
195 }
196
197 /**
198 * Y-Ausdehnung nach Links
199 * @return Y-Koordinate Links
200 */
201 public double getYLinks() {
202 return yLinks;
203 }
204
205 /**
206 * setze Y-Ausdehnung nach Links
207 * @param links y-Ausdehnung nach links
208 */
209 public void setYLinks(double links) {
210 yLinks = links;
211 }
212
213 /**
214 * Y-Ausdehnung nach rechts
215 * @return Y-Koordinate rechts
216 */
217 public double getYRechts() {
218 return yRechts;
219 }
220
221 /**
222 * setze Y-Ausdehnung nach Rechts
223 * @param rechts Y-Ausdehnung rechts
224 */
225 public void setYRechts(double rechts) {
226 yRechts = rechts;
227 }
228
229 /**
230 * Damit man die Werte der <code>Koordinate</code> auch problemlos
231 * in die Datenbank einfügen kann, gibt es die Möglichkeit mit dieser Methode
232 * die interne Darstellung in eine Postgis-Darstellung umzuwandeln.<br>
233 * Dabei wird ein Objekt des Typs Punkt zurückgegeben. PGgeometry wird hier
234 * jedoch als Signaturrückgabewert gewählt, damit man nicht umständliche
235 * Typumwandlungen vornehmen muss beim Einfügen in die Datenbank.
236 *
237 * @return Koordinatendarstellung als Postgisobjekt
238 */
239 public PGgeometry convertToPostgis() {
240 return new PGgeometry(new Point(this.getX(), this.getY()));
241 } // end of convertToPostgis
242
243 /**
244 * Da dieses POSTGIS-System nicht in der Lage ist aus einem Polygon einen
245 * Punkt rauszugeben und Polygon-WrapperObjekte keine vernünftigen
246 * Getter-Methoden besitzen, die eine Arbeit damit ermöglichen, wandelt diese
247 * Methode ein Polygon (aus der Datenbank gelesen) in eine
248 * <code>Koordinate</code> um
249 *
250 * Im Fehlerfall hat die zurückgegebene Koordinate als Koordinaten (0,0) -<br>
251 * dann ist was in der DB schiefgegangen!
252 *
253 * @param polygon aus der Datenbank gelesenes <code>Polygon</code>-Objekt
254 * @return koordinatendarstellung
255 */
256 public static Koordinate convertType(Polygon polygon) {
257 String poly = polygon.getValue().trim();
258 Koordinate erg = new Koordinate();
259
260 // Das Format ist so:
261 // POLYGON((13.44839 52.50434,13.44892 52.50487,13.44827 52.50511,
262 // 13.44796 52.50457,13.44839 52.50434)) -
263 // als nur POLYGON(( ... )) wegschneiden! und dann Tokenizer mit Komma
264 poly = poly.substring(2,poly.length()-2);
265 poly = poly.substring(6,poly.length());
266
267 // Koordinaten auslesen
268 StringTokenizer tokenizer1 = new StringTokenizer(poly, ",");
269 if ( tokenizer1.hasMoreTokens()) {
270 StringTokenizer tokenizer2 = new StringTokenizer(tokenizer1.nextToken(), " ");
271 // 1. Koordinate setzen
272 erg.setX(Double.valueOf(tokenizer2.nextToken()).doubleValue());
273 // 2.Koordinate setzen, wenn Fehler beim Lesen auftritt, wird keine
274 // Ausnahme geworfen und die 2.Koordinate bleibt 0
275 if ( tokenizer2.hasMoreTokens()) {
276 erg.setY(Double.valueOf(tokenizer2.nextToken()).doubleValue());
277 } // end if
278 } // end if
279
280 return erg;
281 } // end of convertType
282
283
284 /**
285 * stellt die Koordinate mit Ihrer Umgebung als Tupel dar
286 * @return nullpointersichere Stringrepräsentation
287 */
288 public String toString() {
289 String ergebnis = "<";
290
291 if ( this.getX() != 0 ) ergebnis += this.getX();
292 ergebnis += ",";
293 if ( this.getY() != 0 ) ergebnis += this.getY();
294 ergebnis += ">, links(";
295 if ( this.getXLinks() != 0 ) ergebnis += this.getXLinks();
296 ergebnis += ",";
297 if ( this.getYLinks() != 0 ) ergebnis += this.getYLinks();
298 ergebnis += "), rechts(";
299 if ( this.getXRechts() != 0 ) ergebnis += this.getXRechts();
300 ergebnis += ",";
301 if ( this.getYRechts() != 0 ) ergebnis += this.getYRechts();
302 ergebnis += ")";
303
304 return ergebnis;
305 } // end of toString
306 } // end of class Koordinate
|