// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.pointinfo.ruian;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedList;
import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonValue;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.command.AddCommand;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.command.SequenceCommand;
import org.openstreetmap.josm.data.coor.LatLon;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Tag;
import org.openstreetmap.josm.data.osm.TagCollection;
import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
import org.openstreetmap.josm.plugins.pointinfo.PointInfoUtils;
/**
* Private class contains RUIAN data
* @author Marián Kyral
*/
class RuianRecord {
// CHECKSTYLE.OFF: SingleSpaceSeparator
private double m_coor_lat, m_coor_lon;
private String m_source;
private long m_objekt_ruian_id;
private int m_objekt_podlazi;
private int m_objekt_byty;
private String m_objekt_zpusob_vyuziti;
private String m_objekt_zpusob_vyuziti_kod;
private String m_objekt_zpusob_vyuziti_key;
private String m_objekt_zpusob_vyuziti_val;
private String m_objekt_dokonceni;
private String m_objekt_plati_od;
private String m_err_user;
private String m_err_date;
private String m_err_type;
private String m_err_note;
private ArrayList<ObjectWithoutGeometry> m_so_bez_geometrie;
private ArrayList<AddrPlaces> m_adresni_mista;
private long m_parcela_ruian_id;
private String m_parcela_druh_pozemku;
private String m_parcela_zpusob_vyuziti;
private String m_parcela_plati_od;
private long m_ulice_ruian_id;
private String m_ulice_jmeno;
private long m_katastr_ruian_id;
private String m_katastr_nazev;
private long m_katastr_obec_kod;
private String m_katastr_obec;
private long m_katastr_okres_kod;
private String m_katastr_okres;
private long m_katastr_kraj_kod;
private String m_katastr_kraj;
// CHECKSTYLE.ON: SingleSpaceSeparator
/**
* Constructor
*
*/
RuianRecord() {
init();
}
/**
* Initialization
*
*/
private void init() {
m_coor_lat = 0;
m_coor_lon = 0;
m_source = "";
m_objekt_ruian_id = 0;
m_objekt_podlazi = 0;
m_objekt_byty = 0;
m_objekt_zpusob_vyuziti = "";
m_objekt_zpusob_vyuziti_kod = "";
m_objekt_zpusob_vyuziti_key = "";
m_objekt_zpusob_vyuziti_val = "";
m_objekt_dokonceni = "";
m_objekt_plati_od = "";
m_err_user = "";
m_err_date = "";
m_err_type = "";
m_err_note = "";
m_so_bez_geometrie = new ArrayList<>();
m_adresni_mista = new ArrayList<>();
m_parcela_ruian_id = 0;
m_parcela_druh_pozemku = "";
m_parcela_zpusob_vyuziti = "";
m_parcela_plati_od = "";
m_ulice_ruian_id = 0;
m_ulice_jmeno = "";
m_katastr_ruian_id = 0;
m_katastr_nazev = "";
m_katastr_obec_kod = 0;
m_katastr_obec = "";
m_katastr_okres_kod = 0;
m_katastr_okres = "";
m_katastr_kraj_kod = 0;
m_katastr_kraj = "";
}
/**
* Parse given JSON string and fill variables with RUIAN data
* @param jsonStr JSON string
*/
public void parseJSON(String jsonStr) {
init();
JsonReader jsonReader = Json.createReader(new ByteArrayInputStream(jsonStr.getBytes(StandardCharsets.UTF_8)));
JsonObject obj = jsonReader.readObject();
jsonReader.close();
parseCoordinates(obj);
// =========================================================================
parseStavebniObjekt(obj);
// =========================================================================
parseNahlasenyProblem(obj);
// =========================================================================
parseSoBezGeometrie(obj);
// =========================================================================
parseAdresniMista(obj);
// =========================================================================
parseParcela(obj);
// =========================================================================
parseUlice(obj);
// =========================================================================
parseKatastr(obj);
}
private JsonObject getSafeJsonObject(JsonObject obj, String key) {
JsonValue val = obj.get(key);
if (val instanceof JsonObject) {
return (JsonObject) val;
} else if (val instanceof JsonArray) {
JsonArray array = (JsonArray) val;
if (!array.isEmpty()) {
return array.getJsonObject(0);
}
}
throw new IllegalArgumentException("No value for " + key);
}
private void parseCoordinates(JsonObject obj) {
try {
JsonObject coorObjekt = obj.getJsonObject("coordinates");
try {
m_coor_lat = Double.parseDouble(coorObjekt.getString("lat"));
} catch (NumberFormatException e) {
Main.warn(e, "coordinates.lat:");
}
try {
m_coor_lon = Double.parseDouble(coorObjekt.getString("lon"));
} catch (NumberFormatException e) {
Main.warn(e, "coordinates.lon:");
}
try {
m_source = obj.getString("source");
} catch (RuntimeException e) {
Main.warn(e, "source:");
}
} catch (Exception e) {
Main.warn(e, "coordinates:");
}
}
private void parseStavebniObjekt(JsonObject obj) {
try {
JsonObject stavebniObjekt = getSafeJsonObject(obj, "stavebni_objekt");
try {
m_objekt_ruian_id = Long.parseLong(stavebniObjekt.getString("ruian_id"));
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.ruian_id:");
}
try {
m_objekt_podlazi = Integer.parseInt(stavebniObjekt.getString("pocet_podlazi"));
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.pocet_podlazi:");
}
try {
m_objekt_byty = Integer.parseInt(stavebniObjekt.getString("pocet_bytu"));
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.pocet_bytu:");
}
try {
m_objekt_zpusob_vyuziti = stavebniObjekt.getString("zpusob_vyuziti");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.zpusob_vyuziti:");
}
try {
m_objekt_zpusob_vyuziti_kod = stavebniObjekt.getString("zpusob_vyuziti_kod");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.m_objekt_zpusob_vyuziti_kod:");
}
try {
m_objekt_zpusob_vyuziti_key = stavebniObjekt.getString("zpusob_vyuziti_key");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.zpusob_vyuziti_key:");
}
try {
m_objekt_zpusob_vyuziti_val = stavebniObjekt.getString("zpusob_vyuziti_val");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.m_objekt_zpusob_vyuziti_val:");
}
try {
m_objekt_plati_od = stavebniObjekt.getString("plati_od");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.plati_od:");
}
try {
m_objekt_dokonceni = stavebniObjekt.getString("dokonceni");
} catch (Exception e) {
Main.warn(e, "stavebni_objekt.dokonceni:");
}
} catch (Exception e) {
Main.warn(e, "stavebni_objekt:");
}
}
private void parseNahlasenyProblem(JsonObject obj) {
try {
JsonObject errObjekt = getSafeJsonObject(obj, "nahlaseny_problem");
try {
m_err_user = errObjekt.getString("uzivatel");
} catch (Exception e) {
Main.warn(e, "nahlaseny_problem.uzivatel:");
}
try {
m_err_date = errObjekt.getString("datum");
} catch (Exception e) {
Main.warn(e, "nahlaseny_problem.datum:");
}
try {
m_err_type = errObjekt.getString("duvod");
} catch (Exception e) {
Main.warn(e, "nahlaseny_problem.duvod:");
}
try {
m_err_note = errObjekt.getString("poznamka");
} catch (Exception e) {
Main.warn(e, "nahlaseny_problem.poznamka:");
}
} catch (Exception e) {
Main.warn(e, "nahlaseny_problem:");
}
}
private void parseSoBezGeometrie(JsonObject obj) {
try {
JsonArray arr = obj.getJsonArray("so_bez_geometrie");
for (int i = 0; i < arr.size(); i++) {
JsonObject soBezGeom = arr.getJsonObject(i);
ObjectWithoutGeometry so = new ObjectWithoutGeometry();
try {
so.setRuianID(Long.parseLong(soBezGeom.getString("ruian_id")));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.ruian_id:");
}
try {
so.setPodlazi(Integer.parseInt(soBezGeom.getString("pocet_podlazi")));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.pocet_podlazi:");
}
try {
so.setByty(Integer.parseInt(soBezGeom.getString("pocet_bytu")));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.pocet_bytu:");
}
try {
so.setZpusobVyuziti(soBezGeom.getString("zpusob_vyuziti"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.zpusob_vyuziti:");
}
try {
so.setZpusobVyuzitiKod(soBezGeom.getString("zpusob_vyuziti_kod"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.zpusob_vyuziti_kod:");
}
try {
so.setZpusobVyuzitiKey(soBezGeom.getString("zpusob_vyuziti_key"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.zpusob_vyuziti_key:");
}
try {
so.setZpusobVyuzitiVal(soBezGeom.getString("zpusob_vyuziti_val"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.zpusob_vyuziti_val:");
}
try {
so.setDokonceni(soBezGeom.getString("dokonceni"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.dokonceni:");
}
try {
so.setPlatiOd(soBezGeom.getString("plati_od"));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.plati_od:");
}
try {
so.setVzdalenost(Float.parseFloat(soBezGeom.getString("vzdalenost")));
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie.vzdalenost:");
}
m_so_bez_geometrie.add(so);
}
} catch (Exception e) {
Main.warn(e, "so_bez_geometrie:");
}
}
private void parseAdresniMista(JsonObject obj) {
try {
JsonArray arr = obj.getJsonArray("adresni_mista");
for (int i = 0; i < arr.size(); i++) {
JsonObject adresniMisto = arr.getJsonObject(i);
AddrPlaces am = new AddrPlaces();
try {
am.setRuianID(Long.parseLong(adresniMisto.getString("ruian_id")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.ruian_id:");
}
try {
JsonArray node = adresniMisto.getJsonArray("pozice");
am.setPosition(new LatLon(
LatLon.roundToOsmPrecision(node.getJsonNumber(1).doubleValue()),
LatLon.roundToOsmPrecision(node.getJsonNumber(0).doubleValue()))
);
} catch (Exception e) {
Main.warn(e, "adresni_mista.pozice:");
}
try {
am.setBudovaID(Long.parseLong(adresniMisto.getString("budova_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.budova_kod:");
}
try {
am.setCisloTyp(adresniMisto.getString("cislo_typ"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.cislo_typ:");
}
try {
am.setCisloDomovni(adresniMisto.getString("cislo_domovni"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.cislo_domovni:");
}
try {
am.setCisloOrientacni(adresniMisto.getString("cislo_orientacni"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.cislo_orientacni:");
}
try {
am.setUliceID(Long.parseLong(adresniMisto.getString("ulice_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.ulice_kod:");
}
try {
am.setUlice(adresniMisto.getString("ulice"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.ulice:");
}
try {
am.setCastObceID(Long.parseLong(adresniMisto.getString("cast_obce_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.cast_obce_kod:");
}
try {
am.setCastObce(adresniMisto.getString("cast_obce"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.m_cast_obce:");
}
try {
am.setMestskaCastID(Long.parseLong(adresniMisto.getString("mestska_cast_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.mestska_cast_kod:");
}
try {
am.setMestskaCast(adresniMisto.getString("mestska_cast"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.mestska_cast:");
}
try {
am.setObecID(Long.parseLong(adresniMisto.getString("obec_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.obec_kod:");
}
try {
am.setObec(adresniMisto.getString("obec"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.obec:");
}
try {
am.setOkresID(Long.parseLong(adresniMisto.getString("okres_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.okres_kod:");
}
try {
am.setOkres(adresniMisto.getString("okres"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.okres:");
}
try {
am.setKrajID(Long.parseLong(adresniMisto.getString("kraj_kod")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.kraj_kod:");
}
try {
am.setKraj(adresniMisto.getString("kraj"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.kraj:");
}
try {
am.setPsc(adresniMisto.getString("psc"));
} catch (Exception e) {
Main.warn(e, "adresni_mista.psc:");
}
try {
am.setVzdalenost(Float.parseFloat(adresniMisto.getString("vzdalenost")));
} catch (Exception e) {
Main.warn(e, "adresni_mista.vzdalenost:");
}
m_adresni_mista.add(am);
}
} catch (Exception e) {
Main.warn(e, "adresni_mista:");
}
}
private void parseParcela(JsonObject obj) {
try {
JsonObject parcela = getSafeJsonObject(obj, "parcela");
try {
m_parcela_ruian_id = Long.parseLong(parcela.getString("ruian_id"));
} catch (Exception e) {
Main.warn(e, "parcela.ruian_id:");
}
try {
m_parcela_druh_pozemku = parcela.getString("druh_pozemku");
} catch (Exception e) {
Main.warn(e, "parcela.druh_pozemku:");
}
try {
m_parcela_zpusob_vyuziti = parcela.getString("zpusob_vyuziti");
} catch (Exception e) {
Main.warn(e, "parcela.zpusob_vyuziti:");
}
try {
m_parcela_plati_od = parcela.getString("plati_od");
} catch (Exception e) {
Main.warn(e, "parcela.plati_od:");
}
} catch (Exception e) {
Main.warn(e, "parcela:");
}
}
private void parseUlice(JsonObject obj) {
try {
JsonObject ulice = getSafeJsonObject(obj, "ulice");
try {
m_ulice_ruian_id = Long.parseLong(ulice.getString("ruian_id"));
} catch (Exception e) {
Main.warn(e, "ulice.ruian_id:");
}
try {
m_ulice_jmeno = ulice.getString("jmeno");
} catch (Exception e) {
Main.warn(e, "ulice.jmeno:");
}
} catch (Exception e) {
Main.warn(e, "ulice:");
}
}
private void parseKatastr(JsonObject obj) {
try {
JsonObject katastr = getSafeJsonObject(obj, "katastr");
try {
m_katastr_ruian_id = Long.parseLong(katastr.getString("ruian_id"));
} catch (Exception e) {
Main.warn(e, "katastr.ruian_id:");
}
try {
m_katastr_nazev = katastr.getString("nazev");
} catch (Exception e) {
Main.warn(e, "katastr.nazev:");
}
try {
m_katastr_obec_kod = Long.parseLong(katastr.getString("obec_kod"));
} catch (Exception e) {
Main.warn(e, "katastr.obec_kod:");
}
try {
m_katastr_obec = katastr.getString("obec");
} catch (Exception e) {
Main.warn(e, "katastr.okres:");
}
try {
m_katastr_okres_kod = Long.parseLong(katastr.getString("okres_kod"));
} catch (Exception e) {
Main.warn(e, "katastr.okres_kod:");
}
try {
m_katastr_okres = katastr.getString("okres");
} catch (Exception e) {
Main.warn(e, "katastr.okres:");
}
try {
m_katastr_kraj_kod = Long.parseLong(katastr.getString("kraj_kod"));
} catch (Exception e) {
Main.warn(e, "katastr.kraj_kod:");
}
try {
m_katastr_kraj = katastr.getString("kraj");
} catch (Exception e) {
Main.warn(e, "katastr.kraj:");
}
} catch (Exception e) {
Main.warn(e, "katastr:");
}
}
/**
* Return Html text representation
* @return String htmlText
*/
public String getHtml() {
String icon_ext_link = "<img src=" +getClass().getResource(
"/images/dialogs/open-external-link.png")+" border=0 alt=\"Zobrazit na externích stránkách\"/>";
String icon_ext_link_ruian = "<img src=" +getClass().getResource(
"/images/dialogs/open-external-link.png")+" border=0 alt=\"Zobrazit na stránkách RUIAN\"/>";
String icon_ext_link_kn = "<img src=" +getClass().getResource(
"/images/dialogs/open-external-link-kn.png")+" border=0 alt=\"Zobrazit na stránkách katastru nemovitostí\"/>";
String icon_copy_tags = "<img src=" +getClass().getResource(
"/images/dialogs/copy-tags.png")+" border=0 alt=\"Kopírovat tagy\"/>";
String icon_create_addr = "<img src=" +getClass().getResource(
"/images/dialogs/create-addr.png")+" border=0 alt=\"Vytvořit adresní bod\"/>";
String icon_create_addr_ruian = "<img src=" +getClass().getResource(
"/images/dialogs/create-addr-ruian.png")+" border=0 alt=\"Vytvořit adresní bod dle RUIANu\"/>";
String icon_ruian_error = "<img src=" +getClass().getResource(
"/images/dialogs/create-bug-report.png")+" border=0 alt=\"Nahlásit problém v datech\"/>";
// CHECKSTYLE.OFF: LineLength
String url_cpost = "http://www.postaonline.cz/vyhledani-psc?p_p_id=psc_WAR_pcpvpp&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-1&p_p_col_count=1&_psc_WAR_pcpvpp_struts.portlet.action=%2Fview%2FdetailPost&_psc_WAR_pcpvpp_struts.portlet.mode=view&_psc_WAR_pcpvpp_zipCode=";
// CHECKSTYLE.ON: LineLength
String url_stavebni_objekt = "http://vdp.cuzk.cz/vdp/ruian/stavebniobjekty/";
String url_adresni_misto = "http://vdp.cuzk.cz/vdp/ruian/adresnimista/";
String url_parcela = "http://vdp.cuzk.cz/vdp/ruian/parcely/";
String url_katastralni_uzemi = "http://vdp.cuzk.cz/vdp/ruian/katastralniuzemi/";
String url_ulice = "http://vdp.cuzk.cz/vdp/ruian/ulice/";
String url_mistni_cast = "http://vdp.cuzk.cz/vdp/ruian/castiobce/";
String url_mestska_cast = "http://vdp.cuzk.cz/vdp/ruian/mestskecasti/";
String url_obec = "http://vdp.cuzk.cz/vdp/ruian/obce/";
String url_okres = "http://vdp.cuzk.cz/vdp/ruian/okresy/";
String url_kraj = "http://vdp.cuzk.cz/vdp/ruian/vusc/";
String url_vlastnici = "http://vdp.cuzk.cz/vdp/ruian/vlastnici?typ=";
String url_ruian_error = "http://ruian.poloha.net/building.php?kod=";
StringBuilder r = new StringBuilder();
if (m_objekt_ruian_id == 0 &&
m_parcela_ruian_id == 0 &&
m_adresni_mista.size() == 0 &&
m_ulice_ruian_id == 0 &&
m_katastr_ruian_id == 0)
return "";
r.append("<html><body bgcolor=\"white\" color=\"black\" ><table><tr><td>");
r.append("<br/>");
if (m_objekt_ruian_id > 0) {
r.append("<i><u>Informace o budově</u></i><br/>")
.append("<b>RUIAN id: </b>"+ m_objekt_ruian_id +" <a href="+ url_stavebni_objekt + m_objekt_ruian_id +">"
+ icon_ext_link_ruian + "</a>")
.append(" <a href="+ url_vlastnici + "so&id=" + m_objekt_ruian_id + ">"+ icon_ext_link_kn +"</a>")
.append(" <a href=file://tags.copy/building>"+ icon_copy_tags +"</a>")
.append(" <a href=" + url_ruian_error + m_objekt_ruian_id + ">"+ icon_ruian_error +"</a><br/>");
if (m_adresni_mista.size() == 0) r.append("<b>Budova: </b> bez č.p./č.e<br/>");
else if (m_adresni_mista.get(0).getCisloTyp().equals("Číslo popisné")) r.append("<b>Budova: </b>s číslem popisným<br/>");
else r.append("<b>Budova: </b>s číslem evidenčním<br/>");
if (m_objekt_podlazi > 0) r.append("<b>Počet podlaží: </b>" + m_objekt_podlazi + "<br/>");
if (m_objekt_byty > 0) r.append("<b>Počet bytů: </b>" + m_objekt_byty + "<br/>");
r.append("<b>Způsob využití: </b>" + m_objekt_zpusob_vyuziti + "<br/>")
.append("<b>Datum dokončení: </b>" + m_objekt_dokonceni + "<br/>")
.append("<b>Platí od: </b>" + m_objekt_plati_od + "<br/>");
if (m_adresni_mista.size() > 1) {
r.append("<i><u>Informace o adrese</u></i><br/>");
// More address places
int i = 0;
r.append("<br/>")
.append("<b>" + m_adresni_mista.get(i).getCisloTyp() + "</b> (více adres)<b>: </b>"
+ m_adresni_mista.get(i).getCisloDomovni() + "<br/>")
.append("<b>Část obce: </b>" + m_adresni_mista.get(i).getCastObce())
.append(" <a href="+ url_mistni_cast + m_adresni_mista.get(i).getCastObceID() +">" + icon_ext_link_ruian + "</a><br/>");
if (m_adresni_mista.get(i).getMestskaCast().length() > 0) {
r.append("<b>Městská část: </b>" + m_adresni_mista.get(i).getMestskaCast())
.append(" <a href="+ url_mestska_cast + m_adresni_mista.get(i).getMestskaCastID() +">"
+ icon_ext_link_ruian + "</a><br/>");
}
r.append("<b>Obec: </b>" + m_adresni_mista.get(i).getObec())
.append(" <a href="+ url_obec + m_adresni_mista.get(i).getObecID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Okres: </b>" + m_adresni_mista.get(i).getOkres())
.append(" <a href="+ url_okres + m_adresni_mista.get(i).getOkresID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Kraj: </b>" + m_adresni_mista.get(i).getKraj())
.append(" <a href="+ url_kraj + m_adresni_mista.get(i).getKrajID() +">" + icon_ext_link_ruian + "</a><br/>");
} else if (m_adresni_mista.size() == 1
&& (m_adresni_mista.get(0).getCisloDomovni() == null || m_adresni_mista.get(0).getCisloDomovni().isEmpty())) {
// Without building number
int i = 0;
r.append("<br/>")
.append("<i><u>Informace o adrese</u></i><br/>")
.append("<b>Budova: </b>" + m_adresni_mista.get(i).getCisloTyp() + "<br/>");
if (m_adresni_mista.get(i).getMestskaCast().length() > 0) {
r.append("<b>Městská část: </b>" + m_adresni_mista.get(i).getMestskaCast())
.append(" <a href="+ url_mestska_cast + m_adresni_mista.get(i).getMestskaCastID() +">"
+ icon_ext_link_ruian + "</a><br/>");
}
r.append("<b>Obec: </b>" + m_adresni_mista.get(i).getObec())
.append(" <a href="+ url_obec + m_adresni_mista.get(i).getObecID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Okres: </b>" + m_adresni_mista.get(i).getOkres())
.append(" <a href="+ url_okres + m_adresni_mista.get(i).getOkresID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Kraj: </b>" + m_adresni_mista.get(i).getKraj())
.append(" <a href="+ url_kraj + m_adresni_mista.get(i).getKrajID() +">" + icon_ext_link_ruian + "</a><br/>");
} else if (m_adresni_mista.size() == 1) {
// Only one address place
int i = 0;
String x = "";
String x_name = "";
if (!m_adresni_mista.get(i).getCisloOrientacni().isEmpty()) {
x = "/" + m_adresni_mista.get(i).getCisloOrientacni();
x_name = "/orientační";
}
r.append("<br/>")
.append("<i><u>Informace o adrese</u></i><br/>")
.append("<b>RUIAN id: </b>"+ m_adresni_mista.get(i).getRuianID() +" <a href="+ url_adresni_misto
+ m_adresni_mista.get(i).getRuianID() +">" + icon_ext_link_ruian + "</a>")
.append(" <a href=file://tags.copy/address:"+i+">"+ icon_copy_tags +"</a>")
.append(" <a href=file://tags.create/address:"+i+">"+ icon_create_addr +"</a>")
.append(" <a href=file://tags.create-on-place/address:"+i+">"+ icon_create_addr_ruian +"</a><br/>")
.append("<b>" + m_adresni_mista.get(i).getCisloTyp() + x_name + ": </b>" + m_adresni_mista.get(i).getCisloDomovni() + x)
.append("<br/>");
if (!m_adresni_mista.get(i).getUlice().isEmpty()) {
r.append("<b>Ulice: </b>" + m_adresni_mista.get(i).getUlice())
.append(" <a href="+ url_ulice + m_adresni_mista.get(i).getUliceID() +">" + icon_ext_link_ruian + "</a><br/>");
}
r.append("<b>Část obce: </b>" + m_adresni_mista.get(i).getCastObce())
.append(" <a href="+ url_mistni_cast + m_adresni_mista.get(i).getCastObceID() +">" + icon_ext_link_ruian + "</a><br/>");
if (m_adresni_mista.get(i).getMestskaCast().length() > 0) {
r.append("<b>Městská část: </b>" + m_adresni_mista.get(i).getMestskaCast())
.append(" <a href="+ url_mestska_cast + m_adresni_mista.get(i).getMestskaCastID() +">"
+ icon_ext_link_ruian + "</a><br/>");
}
r.append("<b>Obec: </b>" + m_adresni_mista.get(i).getObec())
.append(" <a href="+ url_obec + m_adresni_mista.get(i).getObecID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Okres: </b>" + m_adresni_mista.get(i).getOkres())
.append(" <a href="+ url_okres + m_adresni_mista.get(i).getOkresID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Kraj: </b>" + m_adresni_mista.get(i).getKraj())
.append(" <a href="+ url_kraj + m_adresni_mista.get(i).getKrajID() +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>PSČ: </b>" + m_adresni_mista.get(i).getPsc())
.append(" <a href="+ url_cpost + m_adresni_mista.get(i).getPsc() +">" + icon_ext_link_ruian + "</a><br/>");
}
r.append("<br/>");
}
// Reported errors
if (m_objekt_ruian_id > 0 && !m_err_user.isEmpty()) {
r.append("<i><u>Nahlášený problém</u></i>")
.append(" <a href=" + url_ruian_error + m_objekt_ruian_id + ">"+ icon_ext_link +"</a><br/>")
.append("<b>Nahlásil: </b>" + m_err_user)
.append("<br/>")
.append("<b>Dne: </b>" + m_err_date)
.append("<br/>")
.append("<b>Typ problému: </b>" + m_err_type)
.append("<br/>");
if (!m_err_note.isEmpty()) {
r.append("<b>Poznámka: </b>" + m_err_note)
.append("<br/>");
}
r.append("<br/>");
}
// Address places
if (m_adresni_mista.size() > 1 && m_objekt_ruian_id > 0) {
String x = "";
if (m_adresni_mista.get(0).getCisloTyp().equals("Číslo evidenční")) {
x = "ev.";
}
r.append("<i><u>Adresní místa</u></i><br/>");
for (int i = 0; i < m_adresni_mista.size(); i++) {
r.append(m_adresni_mista.get(i).getUlice() + " " + x + m_adresni_mista.get(i).getCisloDomovni());
if (!m_adresni_mista.get(i).getCisloOrientacni().isEmpty()) {
r.append("/" + m_adresni_mista.get(i).getCisloOrientacni());
}
r.append(" <a href="+ url_adresni_misto + m_adresni_mista.get(i).getRuianID() + ">"+ icon_ext_link_ruian +"</a> ")
.append(" <a href=file://tags.copy/address:"+i+">"+ icon_copy_tags +"</a>")
.append(" <a href=file://tags.create/address:"+i+">"+ icon_create_addr +"</a>")
.append(" <a href=file://tags.create-on-place/address:"+i+">"+ icon_create_addr_ruian +"</a>")
.append("<br/>");
}
r.append("<br/>");
}
// Land
if (m_parcela_ruian_id > 0) {
r.append("<i><u>Informace o pozemku</u></i>")
.append("<br/>")
.append("<b>RUIAN id: </b>"+ m_parcela_ruian_id +" <a href="+ url_parcela + m_parcela_ruian_id +">"
+ icon_ext_link_ruian + "</a>")
.append(" <a href="+ url_vlastnici + "pa&id=" + m_parcela_ruian_id + ">"+ icon_ext_link_kn +"</a><br/>")
// .append(" <a href=file://tags.copy/parcel>"+ icon_copy_tags +"</a>")
.append("<b>Druh pozemku: </b>" + m_parcela_druh_pozemku +"<br/>");
if (m_parcela_zpusob_vyuziti != "") r.append("<b>Způsob využití: </b>" + m_parcela_zpusob_vyuziti +"<br/>");
r.append("<b>Platí od: </b>" + m_parcela_plati_od +"<br/>")
.append("<br/>");
}
// Street
if (m_ulice_ruian_id > 0) {
r.append("<i><u>Informace o ulici</u></i><br/>")
.append("<b>RUIAN id: </b>"+ m_ulice_ruian_id +" <a href="+ url_ulice + m_ulice_ruian_id +">" + icon_ext_link_ruian + "</a>")
.append(" <a href=file://tags.copy/street>"+ icon_copy_tags +"</a><br/>")
.append("<b>Jméno: </b>" + m_ulice_jmeno +"<br/>")
.append("<br/>");
}
// Cadastral area
if (m_katastr_ruian_id > 0) {
r.append("<b>Katastrální území: </b>" + m_katastr_nazev)
.append(" <a href="+ url_katastralni_uzemi + m_katastr_ruian_id +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Obec: </b>" + m_katastr_obec)
.append(" <a href="+ url_obec + m_katastr_obec_kod +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Okres: </b>" + m_katastr_okres)
.append(" <a href="+ url_okres + m_katastr_okres_kod +">" + icon_ext_link_ruian + "</a><br/>")
.append("<b>Kraj: </b>" + m_katastr_kraj)
.append(" <a href="+url_kraj + m_katastr_kraj_kod +">" + icon_ext_link_ruian + "</a><br/>")
.append("<br/>");
}
// Near address places
if (!m_adresni_mista.isEmpty() && m_objekt_ruian_id == 0) {
String x, x_name;
r.append("<i><u>Adresní místa v okolí</u></i><br/>")
.append("<table>");
for (int i = 0; i < m_adresni_mista.size(); i++) {
x = "";
x_name = "";
if (m_adresni_mista.get(i).getCisloTyp().equals("Číslo evidenční")) {
x = "ev.";
}
x += m_adresni_mista.get(i).getCisloDomovni();
if (!m_adresni_mista.get(i).getCisloOrientacni().isEmpty()) {
x += "/" + m_adresni_mista.get(i).getCisloOrientacni();
x_name += "/orientační";
}
r.append("<tr><td bgcolor=#e5e5ff>");
if (!m_adresni_mista.get(i).getUlice().isEmpty()) {
r.append(m_adresni_mista.get(i).getVzdalenost())
.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append(m_adresni_mista.get(i).getUlice() + " " + x)
.append("<br/><u>" + m_adresni_mista.get(i).getObec() + "</u>")
.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append("<a href="+ url_adresni_misto + m_adresni_mista.get(i).getRuianID() + ">"+ icon_ext_link_ruian +"</a>")
.append(" <a href=file://tags.copy/address:"+i+">"+ icon_copy_tags +"</a>")
.append(" <a href=file://tags.create/address:"+i+">"+ icon_create_addr +"</a>")
.append(" <a href=file://tags.create-on-place/address:"+i+">"+ icon_create_addr_ruian +"</a>");
} else {
r.append(m_adresni_mista.get(i).getVzdalenost())
.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append(m_adresni_mista.get(i).getCastObce() + " " + x + " ");
if (!m_adresni_mista.get(i).getCastObce().equals(m_adresni_mista.get(i).getObec())) {
r.append("<br/><u>" + m_adresni_mista.get(i).getObec() + "</u>");
}
r.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append("<a href="+ url_adresni_misto + m_adresni_mista.get(i).getRuianID() + ">"+ icon_ext_link_ruian +"</a>")
.append(" <a href=file://tags.copy/address:"+i+">"+ icon_copy_tags +"</a>")
.append(" <a href=file://tags.create/address:"+i+">"+ icon_create_addr +"</a>")
.append(" <a href=file://tags.create-on-place/address:"+i+">"+ icon_create_addr_ruian +"</a>");
}
r.append("</td></tr>");
}
r.append("</table><br/>");
}
if (!m_so_bez_geometrie.isEmpty()) {
r.append("<i><u>Budovy bez geometrie v okolí</u></i><br/>")
.append("<table>");
for (int i = 0; i < m_so_bez_geometrie.size(); i++) {
r.append("<tr><td bgcolor=#e5e5ff>")
.append(m_so_bez_geometrie.get(i).getVzdalenost())
.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append(m_so_bez_geometrie.get(i).getRuianID());
if (m_so_bez_geometrie.get(i).getZpusobVyuziti().length() > 0) {
r.append(" - " + m_so_bez_geometrie.get(i).getZpusobVyuziti());
}
r.append("</td><td valign=\"top\" bgcolor=#e5e5ff>")
.append(" <a href="+ url_stavebni_objekt + m_so_bez_geometrie.get(i).getRuianID() + ">"+ icon_ext_link_ruian +"</a> ")
.append(" <a href=file://tags.copy/ghost:"+i+">"+ icon_copy_tags +"</a></br>")
.append("</td></tr>");
}
r.append("</table><br/>")
.append("<br/>");
}
r.append("<hr/>")
.append("<center><i><small>Zdroj: <a href=\"http://www.ruian.cz/\">" + m_source + "</a></small></i></center>")
.append("</td></tr></table></body></html>");
return r.toString();
}
/**
* Convert date from Czech to OSM format
* @param ruianDate Date in RUIAN (Czech) format DD.MM.YYYY
* @return String with date converted to OSM data format YYYY-MM-DD
*/
String convertDate(String ruianDate) {
String r = new String();
String[] parts = ruianDate.split("\\.");
try {
int day = Integer.parseInt(parts[0]);
int month = Integer.parseInt(parts[1]);
int year = Integer.parseInt(parts[2]);
r = Integer.toString(year) + "-" + String.format("%02d", month) + "-" + String.format("%02d", day);
} catch (Exception e) {
Main.warn(e);
}
return r;
}
/**
* Construct tag string for clipboard
* @param k OSM Key
* @param v OSM Value
* @return String OSM tag string for clipboard
*/
String tagToString(String k, String v) {
return "\"" + k + "\"=\"" + v + "\"\n";
}
/**
* Prepare OSM keys
* @param keyType What to prepare (building, address, parcel. street)
* @return String with OSM tags
*/
String getKeys(String keyType) {
StringBuilder c = new StringBuilder();
// Copy building tags to clipboard
if (keyType.equals("building") && m_objekt_ruian_id > 0) {
c.append(tagToString("ref:ruian:building", Long.toString(m_objekt_ruian_id)));
if (!m_objekt_zpusob_vyuziti_key.isEmpty() &&
!m_objekt_zpusob_vyuziti_val.isEmpty()
) {
c.append(tagToString(m_objekt_zpusob_vyuziti_key, m_objekt_zpusob_vyuziti_val));
}
if (m_objekt_podlazi > 0) {
c.append(tagToString("building:levels", Integer.toString(m_objekt_podlazi)));
}
if (m_objekt_byty > 0) {
c.append(tagToString("building:flats", Integer.toString(m_objekt_byty)));
}
if (m_objekt_dokonceni.length() > 0 && convertDate(m_objekt_dokonceni).length() > 0) {
c.append(tagToString("start_date", convertDate(m_objekt_dokonceni)));
}
if (m_objekt_zpusob_vyuziti_kod.length() > 0) {
c.append(tagToString("building:ruian:type", m_objekt_zpusob_vyuziti_kod));
}
c.append(tagToString("source", "cuzk:ruian"));
}
if (keyType.startsWith("ghost") && !m_so_bez_geometrie.isEmpty()) {
String[] key = keyType.split(":");
int i = Integer.parseInt(key[1]);
System.out.println("Ghost ID: " + i);
c.append(tagToString("ref:ruian:building", Long.toString(m_so_bez_geometrie.get(i).getRuianID())));
if (m_so_bez_geometrie.get(i).getZpusobVyuzitiKey().length() > 0 &&
m_so_bez_geometrie.get(i).getZpusobVyuzitiVal().length() > 0
) {
c.append(tagToString(m_so_bez_geometrie.get(i).getZpusobVyuzitiKey(), m_so_bez_geometrie.get(i).getZpusobVyuzitiVal()));
}
if (m_so_bez_geometrie.get(i).getPodlazi() > 0) {
c.append(tagToString("building:levels", Integer.toString(m_so_bez_geometrie.get(i).getPodlazi())));
}
if (m_so_bez_geometrie.get(i).getByty() > 0) {
c.append(tagToString("building:flats", Integer.toString(m_so_bez_geometrie.get(i).getByty())));
}
if (m_so_bez_geometrie.get(i).getDokonceni().length() > 0 && convertDate(m_so_bez_geometrie.get(i).getDokonceni()).length() > 0) {
c.append(tagToString("start_date", convertDate(m_so_bez_geometrie.get(i).getDokonceni())));
}
if (m_so_bez_geometrie.get(i).getZpusobVyuzitiKod().length() > 0) {
c.append(tagToString("building:ruian:type", m_so_bez_geometrie.get(i).getZpusobVyuzitiKod()));
}
c.append(tagToString("source", "cuzk:ruian"));
}
// Copy address tags to clipboard
if (keyType.startsWith("address")) {
if (!m_adresni_mista.isEmpty()) {
int i;
if (m_adresni_mista.isEmpty()) {
i = 0;
} else {
String[] key = keyType.split(":");
i = Integer.valueOf(key[1]);
Main.info("Address ID: " + i);
}
// Only one address place
if (!m_adresni_mista.get(i).getCisloTyp().equals("Číslo evidenční")) {
// Cislo popisne
c.append(tagToString("addr:conscriptionnumber", m_adresni_mista.get(i).getCisloDomovni()));
} else {
// Cislo evidencni
c.append(tagToString("addr:provisionalnumber", m_adresni_mista.get(i).getCisloDomovni()));
}
// Cislo orientacni
if (!m_adresni_mista.get(i).getCisloOrientacni().isEmpty()) {
c.append(tagToString("addr:streetnumber", m_adresni_mista.get(i).getCisloOrientacni()));
}
// Domovni cislo
StringBuilder addr = new StringBuilder();
if (!m_adresni_mista.get(i).getCisloTyp().equals("Číslo evidenční")) {
addr.append(m_adresni_mista.get(i).getCisloDomovni());
} else {
addr.append("ev." + m_adresni_mista.get(i).getCisloDomovni());
}
if (!m_adresni_mista.get(i).getCisloOrientacni().isEmpty()) {
addr.append("/" + m_adresni_mista.get(i).getCisloOrientacni());
}
c.append(tagToString("addr:housenumber", addr.toString()));
// Street
if (!m_adresni_mista.get(i).getUlice().isEmpty()) {
c.append(tagToString("addr:street", m_adresni_mista.get(i).getUlice()));
}
//RUIAN ID
if (m_adresni_mista.get(i).getRuianID() > 0) {
c.append(tagToString("ref:ruian:addr", Long.toString(m_adresni_mista.get(i).getRuianID())));
}
// Place
if (!m_adresni_mista.get(i).getCastObce().isEmpty()) {
c.append(tagToString("addr:place", m_adresni_mista.get(i).getCastObce()));
}
if (!m_adresni_mista.get(i).getMestskaCast().isEmpty()) {
c.append(tagToString("addr:suburb", m_adresni_mista.get(i).getMestskaCast()));
}
// City
if (!m_adresni_mista.get(i).getObec().isEmpty()) {
c.append(tagToString("addr:city", m_adresni_mista.get(i).getObec()));
}
// Postcode
if (!m_adresni_mista.get(i).getPsc().isEmpty()) {
c.append(tagToString("addr:postcode", m_adresni_mista.get(i).getPsc()));
}
// Country
c.append(tagToString("addr:country", "CZ"));
// Source
c.append(tagToString("source:addr", "cuzk:ruian"));
}
}
// Copy parcel tags to clipboard
// Copy street tags to clipboard
if (keyType.equals("street") && m_ulice_ruian_id > 0) {
c.append(tagToString("ref:ruian:street", Long.toString(m_ulice_ruian_id)));
c.append(tagToString("name", m_ulice_jmeno));
c.append(tagToString("source", "cuzk:ruian"));
}
return c.toString();
}
/**
* Create new address poing on current location with given tags
* @param cmd What to do: create on clicked position or on ruian position
* @param t OSM tags in string
*/
void createAddrPoint(String cmd, String t) {
Collection<Command> commands = new LinkedList<>();
Node node;
if (cmd.startsWith("tags.create-on-place")) {
String[] key = cmd.split(":");
int i = Integer.parseInt(key[1]);
node = new Node(m_adresni_mista.get(i).getPosition());
} else {
node = new Node(new LatLon(m_coor_lat, m_coor_lon));
}
commands.add(new AddCommand(node));
Collection<OsmPrimitive> coll = new LinkedList<>();
coll.add(node);
TagCollection tc = new TagCollection();
ArrayList<String> list = new ArrayList<>(Arrays.asList(t.split("\n")));
for (String line : list) {
String[] tag = line.split("\"=\"");
Main.info("<" + tag[0] + ">. <" + tag[1] +">");
tc.add(new Tag(tag[0].substring(1), tag[1].substring(0, tag[1].length()-1)));
}
tc.applyTo(coll);
Main.main.undoRedo.add(new SequenceCommand(tr("Add new address point"), commands));
}
/**
* Perform given action
* e.g.: copy tags to clipboard
* @param act Action to be performed
*/
public void performAction(String act) {
Main.info("act: " + act.substring(7));
String[] params = act.substring(7).split("/");
if (!params[0].equals("tags.copy") && !params[0].startsWith("tags.create")) {
return;
}
String task = getKeys(params[1]);
// Copy tags to clipboard
if (params[0].equals("tags.copy")) {
if (!task.isEmpty()) {
ClipboardUtils.copyString(task);
PointInfoUtils.showNotification(tr("Tags copied to clipboard."), "info");
}
}
// Create address node
if (params[0].startsWith("tags.create")) {
if (!task.isEmpty()) {
createAddrPoint(act.substring(7), task);
PointInfoUtils.showNotification(tr("New address point added."), "info");
}
}
}
}