graph-normalizer
is a JavaScript module that performs operations on an array of GeoJSON LineStrings representing OpenStreetMap ways. The operations performed cover a standard set of graph normalization techniques such as merging edges between intersections and splitting edges that cross over intersections. Ids assigned to ways in the normalized graph are deterministic and reproducible.
npm install @mapbox/graph-normlizer
npm test
npm run bench
var normalizer = require('@mapbox/graph-normalizer');
var ways = require('./ways.json');
var splitWays = normalizer.splitWays(ways);
var mergedWays = normalizer.mergeWays(ways);
console.log(JSON.stringify(ways));
Any ways that traverse an intersection are split in two. !<i>
is appended to the way id where i
is the index of the split way in the original geometry. Note that !0
is appended to the way id if there is no split.
Ways that share a node which is not an intersection (only 2 way owners) are merged together. The resulting id is <wayOne>,<wayTwo>
.
- An array of GeoJSON LineString Features
- Each feature must have a
refs
array signifying node Ids of the coordinates that make up the way used for topology construction - Each feature must have an
id
property representing the OpenStreetMap id of the way - Each feature must have a
highway
property representing the OpenStreetMap highway tag of the way - Each feature must have a
oneway
property representing the OpenStreetMap oneway tag of the way- the
oneway
property must be normalized to0
,1
, or-1
0
signifies a bidirectional way1
signifies a oneway way traveling in coordinate order-1
signifies a oneway way traveling in reverse coordinate order (this will be normalized to forward order1
)- graph-normalizer will not work with raw OpenStreetMap oneway values such as
yes
, orno
- the
- All way geometries in the original road network have an equivalent in the normalized graph.
- No intersection ever lies within a normalized way, only at its ends.
- Normalized way ids keep track of the history of transformations that led to it.
highway
,oneway
,bridge
,tunnel
andjunction
tags are conserved from the original graph by default.highway
,bridge
,tunnel
andjunction
tags can be merged using optional arguments. When merging different tags:highway
tag is set asunclassified
tunnel
tag is set toyes
i.e. we keep the info that there is a tunnel in the merged waybridge
tag is set toyes
i.e. we keep the info that there is a bridge in the merged wayjunction
tag is set we keep the info about the junction in the merged way