Cross Street Indexer
Blazing fast tile based geocoder that matches cross street (road intersections) entirely sourced by OSM QA Tiles.
Features
- Blazing fast 1/20th of a millisecond search (275,000 ops/sec)
- Processed United States OSM QA Tiles in 24m 27s (189714 tiles)
- Reads streaming index data
- Easy to use CLI to create & search index
- NodeJS 6 & 7 compatible
- Only uses Tile Reduce + Turf
- Indexes published on S3 buckets
- Bundled 5MB QA-Tiles for testing purposes
Process
OSM QA Tiles
Users can download the entire planet or country extracts of OSM QA Tiles from https://osmlab.github.io/osm-qa-tiles.
Install
npm
$ npm install --global cross-street-indexer
yarn
$ yarn global add cross-street-indexer
Quickstart
$ cross-street-indexer latest.planet.mbtiles --tiles [[654,1584,12]]
$ cross-street-search "Chester St" "ABBOT AVE." --tiles [[654,1584,12]]
-122.457711,37.688544
CLI
Cross Street Indexer
$ cross-street-indexer --help
Cross Street Indexer
Usage:
$ cross-street-indexer <qa-tiles>
Options:
--output [cross-street-index] Filepath to store outputs
--bbox Excludes QATiles by BBox
--tiles Excludes QATiles by an Array of Tiles
--debug [false] Enables DEBUG mode
Examples:
$ cross-street-indexer latest.planet.mbtiles
$ cross-street-indexer latest.planet.mbtiles --tiles [[654,1584,12]]
$ cross-street-indexer latest.planet.mbtiles --bbox [-122.519,37.629,-122.168,37.917]
Cross Street Search
$ cross-street-search --help
Cross Street Indexer
Usage:
$ cross-street-search <name1> <name2>
Options:
--output [cross-street-index] filepath to Cross Street index output folder
--tiles Lookup index files via an Array of Tiles or Quadkeys
--bbox Lookup index files via BBox
--latlng Outputs LatLng instead of the default LngLat
--stream Enables reading from streaming index file (ignores tiles/bbox options)
Examples:
$ cross-street-search "Chester St" "ABBOT AVE." --tiles [[654,1584,12],[653,1585,12]]
$ cross-street-search "Chester St" "ABBOT AVE." --tiles "023010221110,023010221110"
$ cross-street-search "Chester St" "ABBOT AVE." --bbox [-122.5,37.6,-122.1,37.9]
$ cat 023010221110.json | cross-street-search "Chester St" "ABBOT AVE."
$ curl -s https://s3.amazonaws.com/cross-street-index/latest/023010221110.json | cross-street-search "Chester St" "ABBOT AVE." --stream
Normalization Process
Normalization should follow the following standards:
- Drop any period if exists
- Street suffix to full name
- ave => avenue
- CIR => circle
- ln => lane
- HWY => highway
- Name should be entirely lowercase
- Parkside Avenue => parkside avenue
- Direction to full word
- N => north
- S => south
- NE => northeast
- Numbered street names to Abreviations
- first => 1st
- third => 3rd
- ninth => 9th
- fifth => 5th
- Remove any additional information
- rodeo avenue trail (dead end ford bikes--no bikes on 101) => rodeo avenue trail
Index (JSON Lines)
The Cross Street Index is stored in an easy to read key/value JSON Lines format.
- key: Normalized road pairs (
<name1>+<name2>
) - value: Longitude & Latitude
{"abbot avenue+chester street":[-122.457711,37.688544]}
{"chester street+abbot avenue":[-122.457711,37.688544]}
{"chester street+lisbon street":[-122.45821,37.68796]}
{"lisbon street+chester street":[-122.45821,37.68796]}
{"hoffman street+lisbon street":[-122.456764,37.687179]}
Design Considerations
OSM Attributes
name
: Street name (Abbot Avenue)ref
Reference number normaly used to tag highways numbershighway
classification (residential, primary, secondary)bridge
yes/notunnel
yes/no@id
OSM ID of street (way)
Debugging
Including --debug
will store additional files for each QA-Tile which can be helpful for debugging.
<output>/<quadkey>.json
- Cross Street index cache<output>/<quadkey>/lines.geojson
- Filtered (Multi)LinesString from QA-Tile<output>/<quadkey>/intersects.geojson
- Point which are intersecting roads<output>/<quadkey>/debug.json
- Debug details
debug.json
{
"tile": [
654,
1584,
12
],
"quadkey": "023010221110",
"features": 49003,
"lines": 2427,
"intersects": 1921,
"index": 3882
}
References