// License: GPL. For details, see LICENSE file.
package relcontext.actions;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
import org.openstreetmap.josm.data.osm.RelationMember;
/**
* @author freeExec
* @see http://wiki.openstreetmap.org/wiki/Key:public_transport
*/
public final class PublicTransportHelper {
public static final String PUBLIC_TRANSPORT = "public_transport";
public static final String STOP_POSITION = "stop_position";
public static final String STOP = "stop";
public static final String STOP_AREA = "stop_area";
public static final String PLATFORM = "platform";
public static final String HIGHWAY = "highway";
public static final String RAILWAY = "railway";
public static final String BUS_STOP = "bus_stop";
public static final String RAILWAY_HALT = "halt";
public static final String RAILWAY_STATION = "station";
private PublicTransportHelper() {
// Hide default constructor for utils classes
}
public static String getRoleByMember(RelationMember m) {
if (isMemberStop(m)) return STOP;
else if (isMemberPlatform(m)) return PLATFORM;
return null;
}
public static boolean isMemberStop(RelationMember m) {
return isNodeStop(m); // stop is only node
}
public static boolean isMemberPlatform(RelationMember m) {
return isNodePlatform(m) || isWayPlatform(m);
}
public static boolean isNodeStop(RelationMember m) {
return isNodeStop(m.getMember());
}
public static boolean isNodeStop(OsmPrimitive p) {
if (p.getType() == OsmPrimitiveType.NODE && !p.isIncomplete()) {
if (p.hasKey(PUBLIC_TRANSPORT)) {
String pt = p.get(PUBLIC_TRANSPORT);
if (STOP_POSITION.equals(pt)) return true;
} else if (p.hasKey(RAILWAY)) {
String rw = p.get(RAILWAY);
if (RAILWAY_HALT.equals(rw) || RAILWAY_STATION.equals(rw)) return true;
}
}
return false;
}
public static boolean isNodePlatform(RelationMember m) {
return isNodePlatform(m.getMember());
}
public static boolean isNodePlatform(OsmPrimitive p) {
if (p.getType() == OsmPrimitiveType.NODE && !p.isIncomplete()) {
if (p.hasKey(PUBLIC_TRANSPORT)) {
String pt = p.get(PUBLIC_TRANSPORT);
if (PLATFORM.equals(pt)) return true;
} else if (p.hasKey(HIGHWAY)) {
String hw = p.get(HIGHWAY);
if (BUS_STOP.equals(hw)) return true;
else if (PLATFORM.equals(hw)) return true;
} else if (p.hasKey(RAILWAY)) {
String rw = p.get(RAILWAY);
if (PLATFORM.equals(rw)) return true;
}
}
return false;
}
public static boolean isWayPlatform(RelationMember m) {
return isWayPlatform(m.getMember());
}
public static boolean isWayPlatform(OsmPrimitive p) {
if (p.getType() == OsmPrimitiveType.WAY && !p.isIncomplete()) {
if (p.hasKey(PUBLIC_TRANSPORT)) {
String pt = p.get(PUBLIC_TRANSPORT);
if (PLATFORM.equals(pt)) return true;
} else if (p.hasKey(HIGHWAY)) {
String hw = p.get(HIGHWAY);
if (PLATFORM.equals(hw)) return true;
} else if (p.hasKey(RAILWAY)) {
String rw = p.get(RAILWAY);
if (PLATFORM.equals(rw)) return true;
}
}
return false;
}
public static boolean isMemberRouteway(RelationMember m) {
return isWayRouteway(m.getMember());
}
public static boolean isWayRouteway(OsmPrimitive p) {
if (p.getType() == OsmPrimitiveType.WAY && !p.isIncomplete())
return p.hasKey(HIGHWAY) || p.hasKey(RAILWAY);
return false;
}
public static String getNameViaStoparea(RelationMember m) {
return getNameViaStoparea(m.getMember());
}
public static String getNameViaStoparea(OsmPrimitive prim) {
String result = prim.getName();
if (result != null) return result;
// try to get name by stop_area
for (OsmPrimitive refOp : prim.getReferrers()) {
if (refOp.getType() == OsmPrimitiveType.RELATION
&& refOp.hasTag(PUBLIC_TRANSPORT, STOP_AREA)) {
result = refOp.getName();
if (result != null) return result;
}
}
return result;
}
}