/** * This file is part of ShareNav * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as published by * the Free Software Foundation. * * Copyright (C) 2009 Kai Krueger */ //#if polish.api.osm-editing package net.sharenav.sharenav.data; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.Enumeration; import java.util.Hashtable; import net.sharenav.sharenav.importexport.QDGpxParser; import net.sharenav.sharenav.importexport.XmlParserContentHandler; import net.sharenav.util.HttpHelper; import net.sharenav.util.Logger; import de.enough.polish.util.Locale; public class OsmDataNode extends OsmDataEntity implements XmlParserContentHandler{ private final static Logger logger = Logger.getInstance( OsmDataNode.class, Logger.DEBUG); /** * latitude and longitude of the OSM data node in radians */ private float lat; private float lon; public OsmDataNode(String fullXML, int osmID) { super(fullXML, osmID); } /** * * @param osmID OSM id of the node, negative if it is a new node * @param lat latitude in radians * @param lon longitude in radians */ public OsmDataNode(int osmID, float lat, float lon) { super(osmID); this.lat = lat; this.lon = lon; } public float getLat() { return lat; } public float getLon() { return lon; } protected void parseXML() { QDGpxParser parser = new QDGpxParser(); logger.debug("Starting Node XML parsing with QDXML"); try { InputStream in = new ByteArrayInputStream(fullXML.getBytes(Configuration.getUtf8Encoding())); parser.parse(in, this); } catch (java.io.UnsupportedEncodingException uee) { } } public void characters(char[] ch, int start, int length) { } public void endDocument() { } public void endElement(String namespaceURI, String localName, String name) { } public void startDocument() { } public void startElement(String namespaceURI, String localName, String name, Hashtable atts) { if (name.equalsIgnoreCase("node")) { try { int id = Integer.parseInt((String)atts.get("id")); if (id == osmID) { ignoring = false; editBy = (String)atts.get("user"); editTime = (String)atts.get("timestamp"); version = Integer.parseInt((String)atts.get("version")); changesetID = Integer.parseInt((String)atts.get("changeset")); // FIXME for OSM POI editing, using a float loses some accuracy, // eg. 60,2077779, 24,6411467 to 60,20778, 24,641148 // - would be proper to store strings to keep the coordinates the same lat = Float.parseFloat((String)atts.get("lat")); lon = Float.parseFloat((String)atts.get("lon")); } else { ignoring = true; } } catch (NumberFormatException nfe) { logger.exception(Locale.get("osmdatanode.FailedParseingOSMid")/*Failed to parse osm id*/, nfe); } } if (ignoring) { return; } if (name.equalsIgnoreCase("tag")) { tags.put(atts.get("k"), atts.get("v")); } } public String toXML(int commitChangesetID) { String xml; xml = "<?xml version='1.0' encoding='utf-8'?>\r\n"; xml += "<osm version='0.6' generator='ShareNav'>\r\n"; xml += "<node id='" + osmID + "' lat='" + lat + "' lon='" + lon + "' version='" + version + "' changeset='" + commitChangesetID + "'>\r\n"; Enumeration enKey = tags.keys(); while (enKey.hasMoreElements()) { String key = (String)enKey.nextElement(); if (key.equalsIgnoreCase("created_by")) { //Drop created_by tag, as it has moved into changesets } else { xml += "<tag k='" + HttpHelper.escapeXML(key) + "' v='" + HttpHelper.escapeXML((String)tags.get(key)) + "' />\r\n"; } } xml += "</node>\r\n"; xml += "</osm>\r\n"; return xml; } public String toDeleteXML(int commitChangesetID) { String xml; // FIXME should be correct but doesn't work, gives a 400 bad request error xml = "<?xml version='1.0' encoding='utf-8'?>\r\n"; xml += "<osm version='0.6' generator='ShareNav'>\r\n"; xml += "<node id='" + osmID + "' version='" + version + "'" + " lat='" + lat + "' lon='" + lon + "' changeset='" + commitChangesetID + "'/>\r\n"; xml += "</osm>\r\n"; return xml; } public String toString() { String res; res = "\n " + Locale.get("osmdatanode.OSMnode")/*OSM node*/ + " " + osmID + "\n"; res += " " + Locale.get("osmdatanode.LastEditedBy")/*last edited by*/ + editBy + Locale.get("osmdatanode.at")/* at */ + editTime + "\n"; res += " " + Locale.get("osmdatanode.version")/*version*/ + " " + version + " " + Locale.get("osmdatanode.inChangeset")/*in changeset*/ + " " + changesetID + "\n"; res += " " + Locale.get("osmdatanode.Tags")/*Tags*/ + ":\n"; Enumeration enKey = tags.keys(); while (enKey.hasMoreElements()) { String key = (String)enKey.nextElement(); res += " " + key + " = " + tags.get(key) + "\n"; } return res; } } //#endif