/* * Copyright (C) 2014. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 3 or * version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ package uk.me.parabola.mkgmap.reader.osm; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import uk.me.parabola.imgfmt.app.Coord; import uk.me.parabola.log.Logger; import uk.me.parabola.util.EnhancedProperties; /** * Collect data from ways with addr:interpolation tag. * @author GerdP * */ public class HousenumberHooks extends OsmReadingHooksAdaptor { private static final Logger log = Logger.getLogger(HousenumberHooks.class); private ElementSaver saver; private Node currentNodeInWay; private final List<Node> nodes = new ArrayList<>(); private boolean clearNodes; private static final short addrHousenumberTagKey = TagDict.getInstance().xlate("addr:housenumber"); private static final short addrInterpolationTagKey = TagDict.getInstance().xlate("addr:interpolation"); public static final short partOfInterpolationTagKey = TagDict.getInstance().xlate("mkgmap:part-of-interpolation"); public static final short mkgmapNodeIdsTagKey = TagDict.getInstance().xlate("mkgmap:node-ids"); @Override public boolean init(ElementSaver saver, EnhancedProperties props) { this.saver = saver; if (props.getProperty("addr-interpolation", true) == false) return false; return (props.getProperty("housenumbers", false)); } @Override public Set<String> getUsedTags() { HashSet<String> usedTags = new HashSet<>(); usedTags.add("addr:street"); usedTags.add("addr:housenumber"); usedTags.add("addr:interpolation"); usedTags.add("addr:place"); return usedTags; } @Override public void onCoordAddedToWay(Way way, long id, Coord co) { if (clearNodes){ nodes.clear(); clearNodes = false; } currentNodeInWay = saver.getNode(id); if (currentNodeInWay == null) return; if (currentNodeInWay.getTag(addrHousenumberTagKey) == null) return; // this node might be part of a way that has the addr:interpolation tag nodes.add(currentNodeInWay); } @Override public void onAddWay(Way way) { clearNodes = true; // make sure that the list is cleared with the next coord String ai = way.getTag(addrInterpolationTagKey); if (ai == null) return; if (nodes.size() < 2){ log.warn(way.toBrowseURL(),"tag addr:interpolation="+ai, "is ignored, found less than two valid nodes."); return; } switch (ai) { case "odd": case "even": case "all": case "1": case "2": break; default: if (log.isInfoEnabled()) log.warn(way.toBrowseURL(),"tag addr:interpolation="+ai, "is ignored"); return; } StringBuilder sb = new StringBuilder(); int num = nodes.size(); for (int i = 0; i < num; i++) { Node n = nodes.get(i); String id = String.valueOf(n.getId()); sb.append(id); if (i + 1 < num) sb.append(","); n.addTag(partOfInterpolationTagKey, "1"); } way.addTag(mkgmapNodeIdsTagKey, sb.toString()); } @Override public void end() { nodes.clear(); } }