Don't get transportation_name ref values from minor networks (#148)

This commit is contained in:
Michael Barry
2022-03-25 05:42:45 -04:00
committed by GitHub
parent c7ee23e8aa
commit b14b4775e9
2 changed files with 126 additions and 16 deletions

View File

@@ -121,6 +121,7 @@ public class TransportationName implements
private final boolean sizeForShield; private final boolean sizeForShield;
private final boolean limitMerge; private final boolean limitMerge;
private final PlanetilerConfig config; private final PlanetilerConfig config;
private final boolean minorRefs;
private Transportation transportation; private Transportation transportation;
private final LongByteMap motorwayJunctionHighwayClasses = Hppc.newLongByteHashMap(); private final LongByteMap motorwayJunctionHighwayClasses = Hppc.newLongByteHashMap();
@@ -141,6 +142,11 @@ public class TransportationName implements
"transportation_name layer: limit merge so we don't combine different relations to help merge long highways", "transportation_name layer: limit merge so we don't combine different relations to help merge long highways",
false false
); );
this.minorRefs = config.arguments().getBoolean(
"transportation_name_minor_refs",
"transportation_name layer: include name and refs from minor road networks if not present on a way",
false
);
} }
public void needsTransportationLayer(Transportation transportation) { public void needsTransportationLayer(Transportation transportation) {
@@ -208,9 +214,22 @@ public class TransportationName implements
public void process(Tables.OsmHighwayLinestring element, FeatureCollector features) { public void process(Tables.OsmHighwayLinestring element, FeatureCollector features) {
String ref = element.ref(); String ref = element.ref();
List<Transportation.RouteRelation> relations = transportation.getRouteRelations(element); List<Transportation.RouteRelation> relations = transportation.getRouteRelations(element);
Transportation.RouteRelation relation = relations.isEmpty() ? null : relations.get(0); Transportation.RouteRelation firstRelationWithNetwork = relations.stream()
if (relation != null && nullIfEmpty(relation.ref()) != null) { .filter(rel -> rel.networkType() != null)
ref = relation.ref(); .findFirst()
.orElse(null);
if (firstRelationWithNetwork != null && !nullOrEmpty(firstRelationWithNetwork.ref())) {
ref = firstRelationWithNetwork.ref();
}
// if transportation_name_minor_refs flag set and we don't have a ref yet, then pull it from any network
if (nullOrEmpty(ref) && minorRefs && !relations.isEmpty()) {
ref = relations.stream()
.map(r -> r.ref())
.filter(r -> !nullOrEmpty(r))
.findFirst()
.orElse(null);
} }
String name = nullIfEmpty(element.name()); String name = nullIfEmpty(element.name());
@@ -240,8 +259,8 @@ public class TransportationName implements
.setAttr(Fields.REF, ref) .setAttr(Fields.REF, ref)
.setAttr(Fields.REF_LENGTH, ref != null ? ref.length() : null) .setAttr(Fields.REF_LENGTH, ref != null ? ref.length() : null)
.setAttr(Fields.NETWORK, .setAttr(Fields.NETWORK,
(relation != null && relation.networkType() != null) ? relation.networkType().name : firstRelationWithNetwork != null ? firstRelationWithNetwork.networkType().name : !nullOrEmpty(ref) ? "road" :
!nullOrEmpty(ref) ? "road" : null) null)
.setAttr(Fields.CLASS, highwayClass) .setAttr(Fields.CLASS, highwayClass)
.setAttr(Fields.SUBCLASS, highwaySubclass(highwayClass, null, highway)) .setAttr(Fields.SUBCLASS, highwaySubclass(highwayClass, null, highway))
.setMinPixelSize(0) .setMinPixelSize(0)
@@ -267,7 +286,7 @@ public class TransportationName implements
if (limitMerge) { if (limitMerge) {
feature feature
.setAttr(LINK_TEMP_KEY, isLink ? 1 : 0) .setAttr(LINK_TEMP_KEY, isLink ? 1 : 0)
.setAttr(RELATION_ID_TEMP_KEY, relation == null ? null : relation.id()); .setAttr(RELATION_ID_TEMP_KEY, firstRelationWithNetwork == null ? null : firstRelationWithNetwork.id());
} }
if (isFootwayOrSteps(highway)) { if (isFootwayOrSteps(highway)) {

View File

@@ -341,15 +341,25 @@ public class TransportationTest extends AbstractLayerTest {
@Test @Test
public void testRouteWithoutNetworkType() { public void testRouteWithoutNetworkType() {
var rel = new OsmElement.Relation(1); var rel1 = new OsmElement.Relation(1);
rel.setTag("type", "route"); rel1.setTag("type", "route");
rel.setTag("route", "road"); rel1.setTag("route", "road");
rel.setTag("network", "US:NJ:NJTP"); rel1.setTag("network", "US:NJ:NJTP");
rel.setTag("ref", "NJTP"); rel1.setTag("ref", "NJTP");
rel.setTag("name", "New Jersey Turnpike (mainline)"); rel1.setTag("name", "New Jersey Turnpike (mainline)");
var rel2 = new OsmElement.Relation(1);
rel2.setTag("type", "route");
rel2.setTag("route", "road");
rel2.setTag("network", "US:I");
rel2.setTag("ref", "95");
rel2.setTag("name", "I 95 (NJ)");
FeatureCollector rendered = process(lineFeatureWithRelation( FeatureCollector rendered = process(lineFeatureWithRelation(
profile.preprocessOsmRelation(rel), Stream.concat(
profile.preprocessOsmRelation(rel1).stream(),
profile.preprocessOsmRelation(rel2).stream()
).toList(),
Map.of( Map.of(
"highway", "motorway", "highway", "motorway",
"name", "New Jersey Turnpike", "name", "New Jersey Turnpike",
@@ -364,13 +374,94 @@ public class TransportationTest extends AbstractLayerTest {
"_layer", "transportation_name", "_layer", "transportation_name",
"class", "motorway", "class", "motorway",
"name", "New Jersey Turnpike", "name", "New Jersey Turnpike",
"ref", "NJTP", "ref", "95",
"ref_length", 4, "ref_length", 2,
"route_1", "US:NJ:NJTP=NJTP", "route_1", "US:I=95",
"route_2", "US:NJ:NJTP=NJTP",
"_minzoom", 6 "_minzoom", 6
)), rendered); )), rendered);
} }
@Test
public void testMinorRouteRef() {
var rel1 = new OsmElement.Relation(1);
rel1.setTag("type", "route");
rel1.setTag("route", "road");
rel1.setTag("network", "rwn");
rel1.setTag("ref", "GFW");
rel1.setTag("name", "Georg-Fahrbach-Weg");
assertFeatures(13, List.of(mapOf(
"_layer", "transportation",
"class", "tertiary"
)), process(lineFeatureWithRelation(
profile.preprocessOsmRelation(rel1),
Map.of(
"highway", "tertiary"
))));
var profileWithMinorRefs = new BasemapProfile(translations, PlanetilerConfig.from(Arguments.of(Map.of(
"transportation_name_minor_refs", "true"
))), Stats.inMemory());
SourceFeature feature = lineFeatureWithRelation(
profileWithMinorRefs.preprocessOsmRelation(rel1),
Map.of(
"highway", "tertiary"
));
var collector = featureCollectorFactory.get(feature);
profileWithMinorRefs.processFeature(feature, collector);
assertFeatures(13, List.of(mapOf(
"_layer", "transportation",
"class", "tertiary"
), mapOf(
"_layer", "transportation_name",
"class", "tertiary",
"ref", "GFW",
"network", "road"
)), collector);
}
@Test
public void testPolishHighwayIssue165() {
var rel1 = new OsmElement.Relation(1);
rel1.setTag("type", "route");
rel1.setTag("route", "road");
rel1.setTag("network", "e-road");
rel1.setTag("ref", "E 77");
rel1.setTag("name", "European route E 77");
var rel2 = new OsmElement.Relation(2);
rel2.setTag("type", "route");
rel2.setTag("route", "road");
rel2.setTag("network", "e-road");
rel2.setTag("ref", "E 28");
rel2.setTag("name", "European route E 28");
FeatureCollector rendered = process(lineFeatureWithRelation(
Stream.concat(
profile.preprocessOsmRelation(rel1).stream(),
profile.preprocessOsmRelation(rel2).stream()
).toList(),
Map.of(
"highway", "trunk",
"ref", "S7"
)));
assertFeatures(13, List.of(mapOf(
"_layer", "transportation",
"class", "trunk"
), Map.of(
"_layer", "transportation_name",
"class", "trunk",
"name", "<null>",
"ref", "S7",
"ref_length", 2,
"route_1", "e-road=E 28",
"route_2", "e-road=E 77"
)), rendered);
}
@Test @Test
public void testMotorwayJunction() { public void testMotorwayJunction() {
var otherNode1 = new OsmElement.Node(1, 1, 1); var otherNode1 = new OsmElement.Node(1, 1, 1);