Koordinate.java
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() != ergebnis += this.getX();
292     ergebnis += ",";
293     if this.getY() != ergebnis += this.getY();
294     ergebnis += ">, links(";
295     if this.getXLinks() != ergebnis += this.getXLinks();
296     ergebnis += ",";
297     if this.getYLinks() != ergebnis += this.getYLinks();
298     ergebnis += "), rechts(";
299     if this.getXRechts() != ergebnis += this.getXRechts();
300     ergebnis += ",";
301     if this.getYRechts() != ergebnis += this.getYRechts();
302     ergebnis += ")";
303     
304     return ergebnis;
305   // end of toString
306 // end of class Koordinate