/*
* 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();
}
}