Restructure lane data (cherry pick)

This commit is contained in:
Bryan Housel
2016-07-31 23:53:07 -04:00
parent fbce168809
commit a85bad8c8c
3 changed files with 349 additions and 166 deletions
+67 -19
View File
@@ -102,38 +102,86 @@ _.extend(Way.prototype, {
},
lanes: function() {
// function parseTurnLane(str) {
// if (!str || str === '') return null;
//
// return str.split('|').map(function(s) {
// return s.split(';');
// });
// }
function makeLanesArray(metadata) {
function createLaneItem(index, direction) {
return {
index: index,
direction: direction
};
}
var lanesArray = [];
for (var i = 0; i < metadata.forward; i++) {
lanesArray.push(createLaneItem(i, 'forward'));
}
for (i = 0; i < metadata.bothways; i++) {
lanesArray.push(createLaneItem(metadata.forward + i, 'bothways'));
}
for (i = 0; i < metadata.backward; i++) {
lanesArray.push(createLaneItem(metadata.forward + metadata.bothways + i, 'backward'));
}
return lanesArray;
}
function safeValue(n) {
if (n < 0) return 0;
if (n > metadata.count - metadata.bothways)
return metadata.count - metadata.bothways;
return n;
}
if (!this.tags.highway) return null;
var defaultLanes = {}, tagged = {};
var metadata = {};
// fill metadata.count with default count
switch (this.tags.highway) {
case 'trunk':
case 'motorway':
defaultLanes.count = this.isOneWay() ? 2 : 4;
metadata.count = this.isOneWay() ? 2 : 4;
break;
default:
defaultLanes.count = this.isOneWay() ? 1 : 2;
metadata.count = this.isOneWay() ? 1 : 2;
break;
}
tagged.oneway = this.isOneWay();
tagged.lanes = {};
if (this.tags.lanes) metadata.count = parseInt(this.tags.lanes);
metadata.oneway = this.isOneWay();
if (parseInt(this.tags.oneway) === -1) {
metadata.forward = 0;
metadata.bothways = 0;
metadata.backward = metadata.count;
}
else if (metadata.oneway) {
metadata.forward = metadata.count;
metadata.bothways = 0;
metadata.backward = 0;
} else {
metadata.bothways = parseInt(this.tags['lanes:both_ways']) > 0 ? 1 : 0;
metadata.forward = parseInt(this.tags['lanes:forward']);
metadata.backward = parseInt(this.tags['lanes:backward']);
if (_.isNaN(metadata.forward) && _.isNaN(metadata.backward)) {
metadata.forward = parseInt((metadata.count - metadata.bothways)/2);
metadata.backward = metadata.count - metadata.bothways - metadata.forward;
}
else if (_.isNaN(metadata.forward)) {
metadata.backward = safeValue(metadata.backward);
metadata.forward = metadata.count - metadata.bothways - metadata.backward;
}
else if (_.isNaN(metadata.backward)) {
metadata.forward = safeValue(metadata.forward);
metadata.backward = metadata.count - metadata.bothways - metadata.forward;
}
}
if (this.tags.lanes) tagged.lanes.count = parseInt(this.tags.lanes);
if (this.tags['lanes:forward']) tagged.lanes.forward = parseInt(this.tags['lanes:forward']);
if (this.tags['lanes:backward']) tagged.lanes.backward = parseInt(this.tags['lanes:backward']);
return {
defaults: {
lanes: defaultLanes
},
tagged: tagged
metadata: metadata,
lanes: makeLanesArray(metadata)
};
},
+24 -44
View File
@@ -3,48 +3,11 @@ export function lanes(field, context) {
LANE_WIDTH = 40,
LANE_HEIGHT = 200,
wayID,
laneData;
lanesData;
function processData(raw) {
var laneCount = raw.tagged.lanes.count || raw.defaults.lanes.count;
var lanesArray = [];
for (var i = 0; i < laneCount; i++) {
lanesArray.push({ key: i });
}
if (raw.tagged.oneway) {
lanesArray.forEach(function(l) {
l.forward = true;
l.backward = false;
});
} else {
var countForward = raw.tagged.lanes.forward || 0;
var countBackward = raw.tagged.lanes.backward || 0;
if (countForward + countBackward === 0) {
countForward = laneCount/2;
countBackward = laneCount/2;
}
for (i = 0; i < countForward; i++) {
lanesArray[i].forward = true;
lanesArray[i].backward = false;
}
for (i = 0; i < countBackward; i++) {
lanesArray[countForward + i].forward = false;
lanesArray[countForward + i].backward = true;
}
}
return lanesArray;
}
function lanes(selection) {
laneData = processData(context.entity(wayID).lanes());
lanesData = context.entity(wayID).lanes();
var laneCount = laneData.length;
// if form field is hidden or has detached from dom, clean up.
if (!d3.select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
selection.call(lanes.off);
return;
@@ -61,7 +24,7 @@ export function lanes(field, context) {
.data([0]);
var d = wrap.dimensions();
var freeSpace = d[0] - laneCount*LANE_WIDTH*1.5 + LANE_WIDTH*0.5;
var freeSpace = d[0] - lanesData.lanes.length*LANE_WIDTH*1.5 + LANE_WIDTH*0.5;
surface.enter()
.append('svg')
@@ -82,7 +45,7 @@ export function lanes(field, context) {
});
var lane = lanesSelection.selectAll('.lane')
.data(laneData);
.data(lanesData.lanes);
var enter = lane.enter()
.append('g')
@@ -103,6 +66,14 @@ export function lanes(field, context) {
.attr('x', 14)
.text('▲');
enter
.append('g')
.attr('class', 'bothways')
.append('text')
.attr('y', 40)
.attr('x', 14)
.text('▲▼');
enter
.append('g')
.attr('class', 'backward')
@@ -115,14 +86,23 @@ export function lanes(field, context) {
lane
.attr('transform', function(d) {
return 'translate(' + (LANE_WIDTH*d.key*1.5)+ ', 0)';
return 'translate(' + (LANE_WIDTH*d.index*1.5)+ ', 0)';
});
lane.select('.forward')
.style('visibility', function(d) { return d.forward ? 'visible' : 'hidden'; });
.style('visibility', function(d) {
return d.direction === 'forward' ? 'visible' : 'hidden';
});
lane.select('.bothways')
.style('visibility', function(d) {
return d.direction === 'bothways' ? 'visible' : 'hidden';
});
lane.select('.backward')
.style('visibility', function(d) { return d.backward ? 'visible' : 'hidden'; });
.style('visibility', function(d) {
return d.direction === 'backward' ? 'visible' : 'hidden';
});
}