franta-hg@119: package cz.frantovo.nekurak.ext; franta-hg@100: franta-hg@100: import java.io.UnsupportedEncodingException; franta-hg@100: import java.net.URLEncoder; franta-hg@100: import java.util.logging.Level; franta-hg@100: import java.util.logging.Logger; franta-hg@100: import javax.xml.parsers.DocumentBuilder; franta-hg@100: import javax.xml.parsers.DocumentBuilderFactory; franta-hg@100: import org.w3c.dom.Document; franta-hg@100: import org.w3c.dom.Node; franta-hg@100: import org.w3c.dom.NodeList; franta-hg@100: franta-hg@100: /** franta-hg@100: * TODO: přesunout jinam a převést na EJB. franta-hg@100: * @author fiki franta-hg@100: */ franta-hg@100: public class Geo { franta-hg@100: franta-hg@145: private static final Logger log = Logger.getLogger(Geo.class.getSimpleName()); franta-hg@100: franta-hg@145: /** franta-hg@145: * Převede poštovní adresu na zeměpisné souřadnice. franta-hg@145: * @param adresa franta-hg@145: * @return souřadnice k dané adrese nebo null, v případě chyby. franta-hg@145: */ franta-hg@145: public Souradnice getSouradnice(String adresa) { franta-hg@145: try { franta-hg@100: franta-hg@145: /** franta-hg@145: * TODO: naprosto zprasené → předělat → franta-hg@145: * http://code.google.com/intl/cs/apis/maps/documentation/geocoding/#XMLParsing franta-hg@145: */ franta-hg@145: DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); franta-hg@145: Document d = db.parse(sestavURL(adresa)); franta-hg@145: NodeList mista = d.getElementsByTagName("location"); franta-hg@145: Node misto = mista.item(0); franta-hg@145: NodeList potomci = misto.getChildNodes(); franta-hg@145: String delka = null; franta-hg@145: String sirka = null; franta-hg@145: for (int i = 0; i < potomci.getLength(); i++) { franta-hg@145: Node p = potomci.item(i); franta-hg@145: if ("lat".equals(p.getNodeName())) { franta-hg@145: sirka = p.getTextContent(); franta-hg@145: } franta-hg@145: if ("lng".equals(p.getNodeName())) { franta-hg@145: delka = p.getTextContent(); franta-hg@145: } franta-hg@145: } franta-hg@145: franta-hg@145: if (sirka == null || delka == null) { franta-hg@145: log.log(Level.WARNING, "Selhalo zjišťování souřadnic – šířka nebo délka jsou null – pro adresu: " + adresa); franta-hg@145: return null; franta-hg@145: } else { franta-hg@145: return new Souradnice(Double.parseDouble(sirka), Double.parseDouble(delka)); franta-hg@145: } franta-hg@145: } catch (Exception e) { franta-hg@145: log.log(Level.WARNING, "Selhalo zjišťování souřadnic pro adresu: " + adresa, e); franta-hg@145: return null; franta-hg@100: } franta-hg@100: } franta-hg@100: franta-hg@145: private static String sestavURL(String adresa) throws UnsupportedEncodingException { franta-hg@145: return "http://maps.google.com/maps/api/geocode/xml?sensor=false&address=" + URLEncoder.encode(adresa, "UTF-8"); franta-hg@120: } franta-hg@120: franta-hg@145: public class Souradnice { franta-hg@145: franta-hg@145: private double sirka; franta-hg@145: private double delka; franta-hg@145: franta-hg@145: @Override franta-hg@145: public String toString() { franta-hg@145: return "šířka = " + sirka + "; délka = " + delka + ";"; franta-hg@145: } franta-hg@145: franta-hg@145: @Override franta-hg@145: public boolean equals(Object o) { franta-hg@145: if (o instanceof Souradnice) { franta-hg@145: Souradnice s = (Souradnice) o; franta-hg@145: return s.sirka == sirka && s.delka == delka; franta-hg@145: } else { franta-hg@145: return false; franta-hg@145: } franta-hg@145: } franta-hg@145: franta-hg@145: @Override franta-hg@145: public int hashCode() { franta-hg@145: int hash = 5; franta-hg@145: hash = 79 * hash + (int) (Double.doubleToLongBits(this.sirka) ^ (Double.doubleToLongBits(this.sirka) >>> 32)); franta-hg@145: hash = 79 * hash + (int) (Double.doubleToLongBits(this.delka) ^ (Double.doubleToLongBits(this.delka) >>> 32)); franta-hg@145: return hash; franta-hg@145: } franta-hg@145: franta-hg@145: public Souradnice(double sirka, double delka) { franta-hg@145: this.sirka = sirka; franta-hg@145: this.delka = delka; franta-hg@145: } franta-hg@145: franta-hg@145: public String getLoc() { franta-hg@145: return "Loc: " + sirka + ", " + delka; franta-hg@145: } franta-hg@145: franta-hg@145: public double getDelka() { franta-hg@145: return delka; franta-hg@145: } franta-hg@145: franta-hg@145: public double getSirka() { franta-hg@145: return sirka; franta-hg@145: } franta-hg@145: franta-hg@145: public void setDelka(double delka) { franta-hg@145: this.delka = delka; franta-hg@145: } franta-hg@145: franta-hg@145: public void setSirka(double sirka) { franta-hg@145: this.sirka = sirka; franta-hg@145: } franta-hg@120: } franta-hg@100: }