├── .gitignore ├── example.env ├── data ├── raw │ ├── Train Station Codes and Chinese Names.xls │ ├── sg-station-codes.txt │ ├── punggol-lrt-east-loop.json │ ├── wikipedia-lrt.json │ ├── MRTLRTStnPtt.json │ ├── tel1-way.json │ ├── tel-line.json │ ├── dtl-way.json │ ├── tel-exits.citymapper.json │ └── wikipedia-mrt.json └── v1 │ └── sg-rail.recipe.json ├── utils ├── fetch.js ├── writeFile.js ├── index.js └── readFile.js ├── package.json ├── scripts ├── fetch-routes-citymapper.js ├── fetch-punggol-lrt-east-loop.js ├── fetch-tel-exits-citymapper.js ├── fetch-downtown-line.js ├── fetch-lrt-wikipedia.js ├── fetch-mrt-wikipedia.js ├── fetch-tel-lines.js ├── walk-routes.js └── build-geojson.js ├── CHANGELOG.md ├── README.md └── sg-rail-preview.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .DS_Store -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | ONEMAP_TOKEN= 2 | MAPBOX_ACCESS_TOKEN= -------------------------------------------------------------------------------- /data/raw/Train Station Codes and Chinese Names.xls: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheeaun/sgraildata/HEAD/data/raw/Train Station Codes and Chinese Names.xls -------------------------------------------------------------------------------- /utils/fetch.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | 3 | module.exports = (url, opts) => { 4 | return got(url, { responseType: 'json', ...opts }); 5 | }; 6 | -------------------------------------------------------------------------------- /utils/writeFile.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | module.exports = (fileName, data) => { 4 | fs.writeFileSync(fileName, JSON.stringify(data, null, '\t')); 5 | console.log(`File written: ${fileName}`); 6 | }; 7 | -------------------------------------------------------------------------------- /utils/index.js: -------------------------------------------------------------------------------- 1 | const fetch = require('./fetch'); 2 | const readFile = require('./readFile'); 3 | const writeFile = require('./writeFile'); 4 | 5 | module.exports = { 6 | fetch, 7 | readFile, 8 | writeFile, 9 | }; 10 | -------------------------------------------------------------------------------- /utils/readFile.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | module.exports = (fileName) => { 4 | console.log(`Read file: ${fileName}`); 5 | const content = fs.readFileSync(fileName, 'utf-8'); 6 | return JSON.parse(content); 7 | }; 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sgraildata", 3 | "version": "4.0.0", 4 | "description": "Singapore Rail data", 5 | "keywords": [ 6 | "singapore", 7 | "rail", 8 | "train", 9 | "subway", 10 | "metro", 11 | "mrt", 12 | "lrt", 13 | "data" 14 | ], 15 | "author": "Lim Chee Aun ", 16 | "license": "ISC", 17 | "scripts": { 18 | "preview": "npx serve . -l 8000" 19 | }, 20 | "dependencies": { 21 | "@mapbox/polyline": "~1.1.1", 22 | "@turf/turf": "~6.5.0", 23 | "chaikin": "~1.0.0", 24 | "cheerio": "~1.0.0-rc.10", 25 | "color-namer": "~1.4.0", 26 | "dotenv": "~10.0.0", 27 | "got": "~11.8.2" 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /scripts/fetch-routes-citymapper.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | 3 | fetch('https://citymapper.com/api/2/routeinfo', { 4 | searchParams: { 5 | route_ids: [ 6 | 'SingaporeMRTCircleLine', 7 | 'SingaporeMRTDowntownLine', 8 | 'SingaporeMRTEastwestLine', 9 | 'SingaporeMRTNortheastLine', 10 | 'SingaporeMRTNorthsouthLine', 11 | 'CM_SingaporeMRT_tel', 12 | 'SingaporeLRTBukitPanjangLine', 13 | 'SingaporeLRTPunggolLineEastLoop', 14 | 'SingaporeLRTPunggolLineWestLoop', 15 | 'SingaporeLRTSengkangLineEastLoop', 16 | 'SingaporeLRTSengkangLineWestLoop', 17 | ].join(','), 18 | region_id: 'sg-singapore', 19 | weekend: 1, 20 | status_format: 'rich', 21 | }, 22 | }).then((res) => { 23 | const { body } = res; 24 | writeFile('data/raw/routes.citymapper.json', body); 25 | }); 26 | -------------------------------------------------------------------------------- /scripts/fetch-punggol-lrt-east-loop.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | 3 | fetch('https://overpass-api.de/api/interpreter', { 4 | method: 'POST', 5 | body: ` 6 | [out:json][timeout:25]; 7 | ( 8 | relation(9663919); 9 | ); 10 | out body; 11 | >; 12 | out skel qt; 13 | `, 14 | }).then((res) => { 15 | const { body } = res; 16 | // get all nodes from the ways 17 | const nodes = body.elements.filter((element) => element.type === 'node'); 18 | const ways = body.elements.filter((e) => e.type === 'way'); 19 | const lines = ways.map((way) => { 20 | // return lat, lon from nodes 21 | return way.nodes.map((node) => { 22 | const fullNode = nodes.find((n) => n.id === node); 23 | return [fullNode.lon, fullNode.lat]; 24 | }); 25 | }); 26 | writeFile('data/raw/punggol-lrt-east-loop.json', lines); 27 | }); 28 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 4.0.0 (27 June 2025) 4 | 5 | - Add Hume and Punggol Coast stations 6 | - Add Phase 4 of Thomson-East Coast Line 7 | 8 | ## 3.0.1 (18 November 2022) 9 | 10 | - Fix DTL line become straight lines instead of real lines 11 | 12 | ## 3.0.0 (18 November 2022) 13 | 14 | - Add Phase 3 of Thomson-East Coast Line 15 | - Add exits for other stations in TEL2 16 | 17 | ## 2.0.1 (29 August 2021) 18 | 19 | - Fix Upper Thomson MRT's chinese name containing `[19]` 20 | - Fix lines from OSM for TEL1 and TEL2 21 | - Remove duplicates from `wikipedia-mrt.json` 22 | 23 | ## 2.0.0 (28 August 2021) 24 | 25 | - Add Phase 2 of Thomson-East Coast Line (only stations, buildings and lines, no exits) 26 | 27 | ## 1.0.1 (29 July 2020) 28 | 29 | - Fix wrong `station_codes` format 30 | - Fix missing `station_codes` for some exits 31 | 32 | ## 1.0.0 (29 July 2020) 33 | 34 | - Initial dataset release 35 | -------------------------------------------------------------------------------- /data/raw/sg-station-codes.txt: -------------------------------------------------------------------------------- 1 | "BP10 BP11 BP12 BP13 BP2 BP3 BP4 BP5 BP7 BP8 BP9 CC10-DT26 CC11 CC12 CC14 CC16 CC17-TE9 CC19-DT9 CC2 CC20 CC21 CC23 CC24 CC25 CC26 CC27 CC28 CC3 CC4-DT15 CC5 CC6 CC7 CC8 CG2 DT1-BP6 DT10-TE11 DT13 DT16-CE1 DT17 DT18 DT2 DT20 DT21 DT22 DT23 DT24 DT25 DT27 DT28 DT29 DT3 DT30 DT31 DT33 DT34 DT35-CG1 DT4 DT5 DT6 DT7 DT8 EW1 EW10 EW11 EW12-DT14 EW15 EW16-NE3-TE17 EW17 EW18 EW19 EW2-DT32 EW20 EW21-CC22 EW22 EW23 EW25 EW26 EW27 EW28 EW29 EW3 EW30 EW31 EW32 EW33 EW4-CG EW5 EW6 EW7 EW8-CC9 EW9 NE1-CC29 NE10 NE11 NE12-CC13 NE13 NE14 NE15 NE16-STC NE17-PTC NE18 NE4-DT19 NE5 NE7-DT12 NE8 NE9 NS1-EW24 NS10 NS11 NS12 NS13 NS14 NS15 NS16 NS17-CC15 NS18 NS19 NS2 NS20 NS21-DT11 NS22-TE14 NS23 NS24-NE6-CC1 NS25-EW13 NS26-EW14 NS27-CE2-TE20 NS28 NS3 NS4-BP1 NS5 NS7 NS8 NS9-TE2 PE1 PE2 PE3 PE4 PE5 PE6 PE7 PW1 PW2 PW3 PW4 PW5 PW6 PW7 SE1 SE2 SE3 SE4 SE5 SW1 SW2 SW3 SW4 SW5 SW6 SW7 SW8 TE1 TE12 TE13 TE15 TE16 TE18 TE19 TE22 TE23 TE24 TE25 TE26 TE27 TE28 TE29 TE3 TE4 TE5 TE6 TE7 TE8" -------------------------------------------------------------------------------- /scripts/fetch-tel-exits-citymapper.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | 3 | fetch('https://citymapper.com/api/1/routeinfo', { 4 | searchParams: { 5 | route: 'mrt-te', 6 | region_id: 'sg-singapore', 7 | weekend: 1, 8 | status_format: 'rich', 9 | extended: 1, 10 | }, 11 | }).then((res) => { 12 | const { body } = res; 13 | const { stops } = body; 14 | // extract all keys into an array 15 | const stopIDs = Object.keys(stops); 16 | console.log(stopIDs.length, stopIDs); 17 | 18 | fetch('https://citymapper.com/api/3/stopinfo', { 19 | searchParams: { 20 | ids: stopIDs.join(','), 21 | region_id: 'sg-singapore', 22 | }, 23 | }).then((res) => { 24 | const { body } = res; 25 | const { stops } = body; 26 | // construct stop to exits hash 27 | const stopNameToExits = {}; 28 | stops.forEach((stop) => { 29 | const { name, exits } = stop; 30 | stopNameToExits[name] = exits; 31 | }); 32 | console.log(stopNameToExits); 33 | writeFile('data/raw/tel-exits.citymapper.json', stopNameToExits); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /scripts/fetch-downtown-line.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | const nearestPointOnLine = require('@turf/nearest-point-on-line').default; 3 | const { lineString, point } = require('@turf/helpers'); 4 | const pointToLineDistance = require('@turf/point-to-line-distance').default; 5 | const lineSlice = require('@turf/line-slice'); 6 | 7 | const extractLine = (body) => { 8 | const { elements } = body; 9 | const line = elements 10 | .map((element) => { 11 | if ( 12 | element.type === 'way' && 13 | (element.tags?.construction !== 'subway' || 14 | element.tags?.railway !== 'construction') 15 | ) { 16 | if (element.id === 544673198) return; // skip this line 17 | const nodes = element.nodes.map((node) => { 18 | const fullNode = elements.find((n) => n.id === node); 19 | return [fullNode.lon, fullNode.lat]; 20 | }); 21 | return nodes; 22 | } 23 | }) 24 | .filter(Boolean); 25 | return line; 26 | }; 27 | 28 | fetch('https://www.openstreetmap.org/api/0.6/relation/2313458/full.json').then( 29 | (res) => { 30 | const { body } = res; 31 | const line = extractLine(body); 32 | writeFile('data/raw/dtl-way.json', line); 33 | }, 34 | ); 35 | -------------------------------------------------------------------------------- /scripts/fetch-lrt-wikipedia.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | const cheerio = require('cheerio'); 3 | 4 | const data = []; 5 | 6 | fetch('https://en.m.wikipedia.org/wiki/List_of_Singapore_LRT_stations', { 7 | responseType: 'text', 8 | }).then((res) => { 9 | const $ = cheerio.load(res.body); 10 | const $td1s = $('#mf-section-1 .wikitable tr td:first-child'); 11 | 12 | $td1s.each((i, tdFirst) => { 13 | const $tdFirst = $(tdFirst); 14 | if ($tdFirst.attr('colspan')) return; 15 | const $codes = $tdFirst.find('b'); 16 | 17 | // Only care about current stations, not future ones 18 | // If first column is empty, means it's a future station 19 | if ($codes.length) { 20 | const codes = $codes 21 | .map((i, el) => $(el).text().trim()) 22 | .get() 23 | .sort(); 24 | 25 | let $td1 = $tdFirst.next('td'); 26 | if ($td1.attr('rowspan')) { 27 | $td1 = $td1.next('td'); 28 | } 29 | 30 | const $a = $td1.find('a'); 31 | const url = $a.length ? $a.attr('href') : null; 32 | const title = 33 | $a.length && $a.attr('title') ? $a.attr('title').trim() : null; 34 | const name = $td1.text().trim(); 35 | 36 | const $td2 = $td1.next('td'); 37 | const name_zh_Hans = $td2.text().trim(); 38 | 39 | const $td3 = $td2.next('td'); 40 | const name_ta = $td3.text().trim(); 41 | 42 | data.push({ codes, name, name_zh_Hans, name_ta, title, url }); 43 | } 44 | }); 45 | 46 | writeFile('./data/raw/wikipedia-lrt.json', data); 47 | }); 48 | -------------------------------------------------------------------------------- /data/v1/sg-rail.recipe.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 1, 3 | "layers": { 4 | "stations": { 5 | "source": "mapbox://tileset-source/cheeaun/sg-rail", 6 | "minzoom": 6, 7 | "maxzoom": 16, 8 | "features": { 9 | "filter": [ 10 | "all", 11 | ["==", ["geometry-type"], "Point"], 12 | ["==", ["get", "stop_type"], "station"] 13 | ] 14 | }, 15 | "tiles": { 16 | "buffer_size": 10 17 | } 18 | }, 19 | "lines": { 20 | "source": "mapbox://tileset-source/cheeaun/sg-rail", 21 | "minzoom": 0, 22 | "maxzoom": 16, 23 | "features": { 24 | "filter": [ 25 | "all", 26 | ["==", ["geometry-type"], "LineString"], 27 | ["has", "line_color"] 28 | ], 29 | "simplification": ["case", ["<", ["zoom"], 16], 4, 1] 30 | } 31 | }, 32 | "exits": { 33 | "source": "mapbox://tileset-source/cheeaun/sg-rail", 34 | "minzoom": 13, 35 | "maxzoom": 16, 36 | "features": { 37 | "filter": [ 38 | "all", 39 | ["==", ["geometry-type"], "Point"], 40 | ["==", ["get", "stop_type"], "entrance"] 41 | ] 42 | } 43 | }, 44 | "buildings": { 45 | "source": "mapbox://tileset-source/cheeaun/sg-rail", 46 | "minzoom": 13, 47 | "maxzoom": 16, 48 | "features": { 49 | "filter": [ 50 | "all", 51 | ["==", ["geometry-type"], "Polygon"], 52 | ["==", ["get", "type"], "subway"] 53 | ] 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /scripts/fetch-mrt-wikipedia.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | const cheerio = require('cheerio'); 3 | 4 | const data = []; 5 | 6 | fetch('https://en.m.wikipedia.org/wiki/List_of_Singapore_MRT_stations', { 7 | responseType: 'text', 8 | }).then((res) => { 9 | const $ = cheerio.load(res.body); 10 | const $td1s = $('#mf-section-2 .wikitable tr td:nth-child(2)'); 11 | 12 | const names = []; 13 | $td1s 14 | .each((i, td1) => { 15 | const $td1 = $(td1); 16 | const $a = $td1.find('a'); 17 | const url = $a.length ? $a.attr('href') : null; 18 | const title = 19 | $a.length && $a.attr('title') ? $a.attr('title').trim() : null; 20 | const name = $td1.find('a').text().trim() || $td1.text().trim(); 21 | 22 | if (names.includes(name)) return null; 23 | 24 | const $tdFirst = $td1.prev('td'); 25 | const $codes = $tdFirst.find('b'); 26 | const $siblingTds = $tdFirst.nextAll('td'); 27 | const hasTBA = $siblingTds.text().includes('TBA'); 28 | 29 | // Only care about current stations, not future ones 30 | // If first column is empty, means it's a future station 31 | // If any sibling columns have TBA, means it's a future station 32 | if ($codes.length && !hasTBA) { 33 | const codes = $codes.map((i, el) => $(el).text().trim()).get(); 34 | 35 | const $td2 = $td1.next('td'); 36 | $td2.find('sup').remove(); 37 | const name_zh_Hans = $td2.text().trim(); 38 | 39 | const $td3 = $td2.next('td'); 40 | $td3.find('sup').remove(); 41 | const name_ta = $td3.text().trim(); 42 | 43 | data.push({ codes, name, name_zh_Hans, name_ta, title, url }); 44 | names.push(name); 45 | } 46 | }) 47 | .filter(Boolean); 48 | 49 | writeFile('./data/raw/wikipedia-mrt.json', data); 50 | }); 51 | -------------------------------------------------------------------------------- /scripts/fetch-tel-lines.js: -------------------------------------------------------------------------------- 1 | const { fetch, writeFile } = require('../utils'); 2 | const nearestPointOnLine = require('@turf/nearest-point-on-line').default; 3 | const { lineString, point } = require('@turf/helpers'); 4 | const lineSlice = require('@turf/line-slice'); 5 | 6 | const extractLine = (body) => { 7 | let way; 8 | let nodes = []; 9 | body.elements.forEach((element) => { 10 | if (element.type === 'way') { 11 | way = element; 12 | } else if (element.type === 'node') { 13 | nodes.push(element); 14 | } 15 | }); 16 | 17 | const line = []; 18 | way.nodes.forEach((node) => { 19 | const fullNode = nodes.find((n) => n.id === node); 20 | if (fullNode) { 21 | line.push([fullNode.lon, fullNode.lat]); 22 | } 23 | }); 24 | return line; 25 | }; 26 | 27 | const tel1Way = 768424508; 28 | const woodlandsNorthPoint = [103.785519, 1.448646]; 29 | const tel2Way = 977168499; 30 | const gardensByTheBayPoint = [103.868124, 1.279451]; 31 | // const caldecottPoint = [103.839991, 1.33768]; 32 | 33 | fetch(`https://www.openstreetmap.org/api/0.6/way/${tel1Way}/full.json`).then( 34 | (res) => { 35 | const { body } = res; 36 | const line1 = extractLine(body); 37 | writeFile(`data/raw/tel1-way.json`, body); 38 | 39 | const startPoint1 = nearestPointOnLine( 40 | lineString(line1), 41 | point(woodlandsNorthPoint), 42 | ); 43 | const endPoint1 = line1[line1.length - 1]; 44 | const alteredLine1 = lineSlice(startPoint1, endPoint1, lineString(line1)) 45 | .geometry.coordinates; 46 | 47 | fetch( 48 | `https://www.openstreetmap.org/api/0.6/way/${tel2Way}/full.json`, 49 | ).then((res) => { 50 | const { body } = res; 51 | const line2 = extractLine(body); 52 | writeFile(`data/raw/tel2-way.json`, body); 53 | 54 | const startPoint2 = line2[0]; 55 | const endPoint2 = nearestPointOnLine( 56 | lineString(line2), 57 | point(gardensByTheBayPoint), 58 | ); 59 | const alteredLine2 = lineSlice(startPoint2, endPoint2, lineString(line2)) 60 | .geometry.coordinates; 61 | 62 | // const lines = [...line1, ...line2]; 63 | const lines = [...alteredLine1, ...alteredLine2]; 64 | writeFile('data/raw/tel-line.json', lines); 65 | }); 66 | }, 67 | ); 68 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SG Rail Data 2 | 3 | > Singapore Rail data 4 | 5 | This is a data-only repository to complement [RailRouter SG](https://github.com/cheeaun/railrouter-sg/). 6 | 7 | ## The data 8 | 9 | It's in the `/data` folder. 10 | 11 | Changelog in [`CHANGELOG.md`](./CHANGELOG.md). 12 | 13 | ## Notes 14 | 15 | - `id`s are not guaranteed to be unique 16 | - Rail line coordinates are not guaranteed to match the real tracks. They are also simplified and smoothed. 17 | - Station buildings data is not complete; 18 | - Incomplete underground building data 19 | - Missing aboveground building data 20 | - Missing multiple levels (Ground level, basement level, etc) 21 | - Some exits data are inaccurate and incomplete 22 | 23 | ## Data sources 24 | 25 | - Routes and stops from [CityMapper](https://citymapper.com/singapore/) 26 | - Run `node scripts/fetch-routes-citymapper` 27 | - Station names in Chinese and Tamil from Wikipedia 28 | - Run `node scripts/fetch-mrt-wikipedia` 29 | - Run `node scripts/fetch-lrt-wikipedia` 30 | - Train Station Exit Point: https://datamall.lta.gov.sg/content/datamall/en/search_datasets.html?searchText=Train%20Station%20Exit%20Point (convert from `SHP` to `GeoJSON` - instructions below) 31 | - LTA MRT Station Exit: https://data.gov.sg/collections/367/view 32 | - Master Plan 2019 Rail Station layer: https://data.gov.sg/datasets/d_8d886e3a83934d7447acdf5bc6959999/view 33 | ~~- Station codes: https://datamall.lta.gov.sg/content/dam/datamall/datasets/Geospatial/TrainStation.zip (convert from `SHP` to `JSON Records` - instructions below)~~ 34 | - Train Station Codes and Chinese Names: https://datamall.lta.gov.sg/content/dam/datamall/datasets/Geospatial/Train%20Station%20Codes%20and%20Chinese%20Names.zip (XLS file) 35 | - A point representation to indicate the location of the MRT station: https://datamall.lta.gov.sg/content/dam/datamall/datasets/Geospatial/TrainStation_Apr2025.zip via https://datamall.lta.gov.sg/content/datamall/en/static-data.html 36 | - Line for Thomson-East Coast Line from OSM: 37 | - Run `node scripts/fetch-tel-lines` 38 | - Line for Punggol LRT (East Loop) from OSM: 39 | - Run `node scripts/fetch-punggol-lrt-east-loop` 40 | - Line for Downtown Line (DTL) from OSM: 41 | - Run `node scripts/fetch-downtown-line` 42 | 43 | ### Convert SHP to GeoJSON or JSON Records 44 | 45 | 1. Upload `SHP`, `DBF` and `PRJ` files on https://mapshaper.org/ 46 | 2. Open "Console" and enter `-proj from=EPSG:3414 crs=EPSG:4326` to convert from [SVY21 (EPSG:3414)](https://epsg.io/3414) to [WGS84 (EPSG:4326)](https://epsg.io/4326) 47 | 3. Export as `GeoJSON` or `JSON Records`. 48 | 49 | ## Generate final data 50 | 51 | - Run `node scripts/build-geojson` 52 | 53 | ## Upload tileset to Mapbox Tiling Service (MTS) 54 | 55 | Use [`tilesets-cli`](https://github.com/mapbox/tilesets-cli). 56 | 57 | - Upload new tileset source: `tilesets upload-source data/v1/sg-rail.geojson` 58 | - Create new tileset with recipe: `tilesets create --recipe data/v1/sg-rail.recipe.json --name "SG Rail"` 59 | - Update recipe: `tilesets update --recipe data/v1/sg-rail.recipe.json` (Note: after update, publish to see changes) 60 | - Publish tileset: `tilesets publish ` -------------------------------------------------------------------------------- /data/raw/punggol-lrt-east-loop.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | [ 4 | 103.9034286, 5 | 1.4069691 6 | ], 7 | [ 8 | 103.9028434, 9 | 1.4059021 10 | ], 11 | [ 12 | 103.9027186, 13 | 1.4055177 14 | ], 15 | [ 16 | 103.9025093, 17 | 1.405139 18 | ], 19 | [ 20 | 103.9023139, 21 | 1.4047884 22 | ], 23 | [ 24 | 103.9019902, 25 | 1.4043715 26 | ], 27 | [ 28 | 103.9017378, 29 | 1.4039013 30 | ] 31 | ], 32 | [ 33 | [ 34 | 103.9013407, 35 | 1.4018418 36 | ], 37 | [ 38 | 103.9015802, 39 | 1.4017114 40 | ], 41 | [ 42 | 103.9018833, 43 | 1.4015631 44 | ], 45 | [ 46 | 103.9022225, 47 | 1.4013946 48 | ], 49 | [ 50 | 103.9039999, 51 | 1.4005395 52 | ], 53 | [ 54 | 103.9049752, 55 | 1.4000656 56 | ], 57 | [ 58 | 103.9054789, 59 | 1.399799 60 | ], 61 | [ 62 | 103.9060328, 63 | 1.3994036 64 | ], 65 | [ 66 | 103.9064012, 67 | 1.3991203 68 | ], 69 | [ 70 | 103.9068521, 71 | 1.3987082 72 | ], 73 | [ 74 | 103.9080459, 75 | 1.3977237 76 | ], 77 | [ 78 | 103.9085976, 79 | 1.3973005 80 | ], 81 | [ 82 | 103.909316, 83 | 1.3966703 84 | ], 85 | [ 86 | 103.9101243, 87 | 1.396021 88 | ], 89 | [ 90 | 103.9111185, 91 | 1.3952027 92 | ], 93 | [ 94 | 103.9125485, 95 | 1.3940301 96 | ], 97 | [ 98 | 103.9130235, 99 | 1.3936325 100 | ], 101 | [ 102 | 103.9133323, 103 | 1.3933502 104 | ], 105 | [ 106 | 103.9136174, 107 | 1.393117 108 | ], 109 | [ 110 | 103.913806, 111 | 1.3929777 112 | ], 113 | [ 114 | 103.9140219, 115 | 1.3928666 116 | ], 117 | [ 118 | 103.9141731, 119 | 1.3928147 120 | ], 121 | [ 122 | 103.9143334, 123 | 1.3927956 124 | ], 125 | [ 126 | 103.9144837, 127 | 1.3928065 128 | ], 129 | [ 130 | 103.9146422, 131 | 1.3928429 132 | ], 133 | [ 134 | 103.9148308, 135 | 1.3929422 136 | ], 137 | [ 138 | 103.9149319, 139 | 1.3930114 140 | ], 141 | [ 142 | 103.9150112, 143 | 1.3930897 144 | ], 145 | [ 146 | 103.9151979, 147 | 1.3933155 148 | ], 149 | [ 150 | 103.9154029, 151 | 1.393586 152 | ], 153 | [ 154 | 103.91566, 155 | 1.3939271 156 | ], 157 | [ 158 | 103.9160179, 159 | 1.3944168 160 | ], 161 | [ 162 | 103.9162403, 163 | 1.3947045 164 | ], 165 | [ 166 | 103.9163715, 167 | 1.3948855 168 | ], 169 | [ 170 | 103.9168765, 171 | 1.3956067 172 | ], 173 | [ 174 | 103.9180376, 175 | 1.3971871 176 | ], 177 | [ 178 | 103.9181426, 179 | 1.397426 180 | ], 181 | [ 182 | 103.9181948, 183 | 1.3976409 184 | ], 185 | [ 186 | 103.9181955, 187 | 1.3978923 188 | ], 189 | [ 190 | 103.9181457, 191 | 1.3981185 192 | ], 193 | [ 194 | 103.918076, 195 | 1.3982891 196 | ], 197 | [ 198 | 103.917977, 199 | 1.3984306 200 | ], 201 | [ 202 | 103.9178475, 203 | 1.3985625 204 | ], 205 | [ 206 | 103.9172612, 207 | 1.3990063 208 | ], 209 | [ 210 | 103.9165527, 211 | 1.3994815 212 | ], 213 | [ 214 | 103.9158693, 215 | 1.3999709 216 | ], 217 | [ 218 | 103.9151945, 219 | 1.4004905 220 | ], 221 | [ 222 | 103.9134932, 223 | 1.4017105 224 | ], 225 | [ 226 | 103.9128156, 227 | 1.4021767 228 | ], 229 | [ 230 | 103.9120296, 231 | 1.4027366 232 | ], 233 | [ 234 | 103.9114839, 235 | 1.4031658 236 | ], 237 | [ 238 | 103.911066, 239 | 1.4034655 240 | ], 241 | [ 242 | 103.9093817, 243 | 1.4046635 244 | ], 245 | [ 246 | 103.9087633, 247 | 1.4050742 248 | ], 249 | [ 250 | 103.9083654, 251 | 1.4053673 252 | ], 253 | [ 254 | 103.9081342, 255 | 1.4055312 256 | ], 257 | [ 258 | 103.9077856, 259 | 1.4057865 260 | ], 261 | [ 262 | 103.907487, 263 | 1.4060172 264 | ], 265 | [ 266 | 103.9063634, 267 | 1.406798 268 | ], 269 | [ 270 | 103.9060579, 271 | 1.4069728 272 | ], 273 | [ 274 | 103.9049667, 275 | 1.4074912 276 | ], 277 | [ 278 | 103.9047961, 279 | 1.4075415 280 | ], 281 | [ 282 | 103.9046631, 283 | 1.4075737 284 | ], 285 | [ 286 | 103.9044643, 287 | 1.4075914 288 | ], 289 | [ 290 | 103.904296, 291 | 1.4075787 292 | ], 293 | [ 294 | 103.9041824, 295 | 1.4075571 296 | ], 297 | [ 298 | 103.9040512, 299 | 1.4075154 300 | ], 301 | [ 302 | 103.9039117, 303 | 1.4074501 304 | ], 305 | [ 306 | 103.9037929, 307 | 1.4073689 308 | ], 309 | [ 310 | 103.9036569, 311 | 1.407249 312 | ], 313 | [ 314 | 103.9035335, 315 | 1.4071133 316 | ], 317 | [ 318 | 103.9034286, 319 | 1.4069691 320 | ] 321 | ], 322 | [ 323 | [ 324 | 103.9017378, 325 | 1.4039013 326 | ], 327 | [ 328 | 103.9011157, 329 | 1.4027601 330 | ], 331 | [ 332 | 103.9010694, 333 | 1.4026552 334 | ], 335 | [ 336 | 103.9010357, 337 | 1.4025233 338 | ], 339 | [ 340 | 103.9010242, 341 | 1.4024071 342 | ], 343 | [ 344 | 103.901035, 345 | 1.402275 346 | ], 347 | [ 348 | 103.9010811, 349 | 1.4021477 350 | ], 351 | [ 352 | 103.9011256, 353 | 1.4020573 354 | ], 355 | [ 356 | 103.901189, 357 | 1.4019676 358 | ], 359 | [ 360 | 103.9013407, 361 | 1.4018418 362 | ] 363 | ] 364 | ] -------------------------------------------------------------------------------- /scripts/walk-routes.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const { ONEMAP_TOKEN, MAPBOX_ACCESS_TOKEN } = process.env; 3 | 4 | const { readFile, writeFile } = require('../utils'); 5 | const distance = require('@turf/distance').default; 6 | 7 | const { 8 | featureCollection, 9 | feature, 10 | lineString, 11 | point, 12 | } = require('@turf/helpers'); 13 | const cleanCoords = require('@turf/clean-coords').default; 14 | const along = require('@turf/along').default; 15 | const polyline = require('@mapbox/polyline'); 16 | 17 | const data = readFile('./data/v1/sg-rail.geojson'); 18 | 19 | const stations = data.features.filter( 20 | (f) => f.properties.stop_type === 'station', 21 | ); 22 | const mrtStations = stations.filter( 23 | (f) => f.properties.network === 'singapore-mrt', 24 | ); 25 | const exits = data.features.filter( 26 | (f) => f.properties.stop_type === 'entrance', 27 | ); 28 | 29 | function stationsAreAdjacent(sc1, sc2) { 30 | const codes1 = sc1.split('-'); 31 | const codes2 = sc2.split('-'); 32 | const codes2Adjacents = [...codes2]; 33 | codes2.forEach((c) => { 34 | const [alphabets, numbers] = (c.match(/([a-z]+)(\d+)/i) || []).slice(1); 35 | if (numbers) { 36 | codes2Adjacents.push(alphabets + (Number(numbers) + 1)); 37 | codes2Adjacents.push(alphabets + (Number(numbers) - 1)); 38 | } 39 | }); 40 | for (let i = 0, l = codes1.length; i < l; i++) { 41 | if (codes2Adjacents.includes(codes1[i])) return true; 42 | } 43 | return false; 44 | } 45 | 46 | const maxDistance = 800; // meter 47 | const maxWalkDuration = 10 * 60; // in seconds 48 | const nearbyStationsPair = []; 49 | const nearbyStationsPairCodes = {}; 50 | mrtStations.forEach((s1) => { 51 | mrtStations.forEach((s2) => { 52 | const c1 = s1.properties.station_codes; 53 | const c2 = s2.properties.station_codes; 54 | if (c1 === c2) return; 55 | if (stationsAreAdjacent(c1, c2)) return; 56 | const d = distance(s1, s2); // km 57 | if (d >= maxDistance / 1000) return; 58 | const c12 = c1 + c2; 59 | const c21 = c2 + c1; 60 | if (nearbyStationsPairCodes[c12] || nearbyStationsPairCodes[c21]) return; 61 | nearbyStationsPairCodes[c12] = true; 62 | nearbyStationsPair.push([s1, s2]); 63 | }); 64 | }); 65 | 66 | nearbyStationsPair.forEach(([p1, p2], i) => { 67 | console.log( 68 | `${(i + 1).toString().padStart(2, ' ')}. [${p1.properties.station_codes}] ${ 69 | p1.properties.name 70 | } <-> [${p2.properties.station_codes}] ${p2.properties.name}`, 71 | ); 72 | }); 73 | 74 | function getExitsForStation(codes) { 75 | return exits.filter((e) => e.properties.station_codes === codes); 76 | } 77 | function timeout(ms) { 78 | return new Promise((res) => setTimeout(res, ms)); 79 | } 80 | const exitPairs = []; 81 | (async () => { 82 | for (let i = 0, l = nearbyStationsPair.length; i < l; i++) { 83 | const [p1, p2] = nearbyStationsPair[i]; 84 | const e1 = getExitsForStation(p1.properties.station_codes); 85 | const e2 = getExitsForStation(p2.properties.station_codes); 86 | let shortestDuration = Infinity; 87 | let exitPair; 88 | for (let i1 = 0, l1 = e1.length; i1 < l1; i1++) { 89 | const exit1 = e1[i1]; 90 | for (let i2 = 0, l2 = e2.length; i2 < l2; i2++) { 91 | const exit2 = e2[i2]; 92 | console.log( 93 | `➡️ ${p1.properties.station_codes} (${exit1.properties.name}) - ${p2.properties.station_codes} (${exit2.properties.name})`, 94 | ); 95 | const startCoords = exit1.geometry.coordinates; 96 | const endCoords = exit2.geometry.coordinates; 97 | const coords = startCoords.join(',') + ';' + endCoords.join(','); 98 | // const { body } = await got( 99 | // `https://api.mapbox.com/directions/v5/mapbox/walking/${encodeURIComponent( 100 | // coords, 101 | // )}`, 102 | // { 103 | // searchParams: { 104 | // geometries: 'geojson', 105 | // access_token: MAPBOX_ACCESS_TOKEN, 106 | // }, 107 | // responseType: 'json', 108 | // }, 109 | // ); 110 | // // console.log(body); 111 | // const { geometry, distance: d, duration } = body.routes[0]; 112 | // console.log(d, duration); 113 | const url = new URL('https://www.onemap.gov.sg/api/public/routingsvc/route'); 114 | url.searchParams.set('start', [...startCoords].reverse().join(',')); 115 | url.searchParams.set('end', [...endCoords].reverse().join(',')); 116 | url.searchParams.set('routeType', 'walk'); 117 | 118 | const response = await fetch(url, { 119 | headers: { 120 | 'Authorization': `${ONEMAP_TOKEN}` 121 | } 122 | }); 123 | const body = await response.json(); 124 | const { 125 | route_geometry, 126 | route_summary: { total_distance: d, total_time: duration }, 127 | } = body; 128 | const lineCoords = polyline 129 | .decode(route_geometry) 130 | .map((coord) => coord.reverse()); 131 | // Put the start and end coords back in because sometimes the line cut off from the actual points 132 | lineCoords.unshift(startCoords); 133 | lineCoords.push(endCoords); 134 | const { geometry } = cleanCoords(lineString(lineCoords)); 135 | // const d = distance(exit1, exit2); 136 | if (duration <= maxWalkDuration && duration <= shortestDuration) { 137 | shortestDuration = duration; 138 | exitPair = [p1, exit1, p2, exit2, d, duration, geometry]; 139 | } 140 | await timeout(240); 141 | } 142 | } 143 | if (exitPair) exitPairs.push(exitPair); 144 | await timeout(240); 145 | } 146 | 147 | const exitNamePairs = exitPairs.map( 148 | ([p1, e1, p2, e2, dist, dur, geometry]) => { 149 | return { 150 | 'Station A ->': `${p1.properties.name} (Exit ${e1.properties.name})`, 151 | '<- Station B': `${p2.properties.name} (Exit ${e2.properties.name})`, 152 | 'Distance (m)': Math.round(dist), 153 | 'Walk duration (min)': Math.ceil(dur / 60), 154 | }; 155 | }, 156 | ); 157 | console.table(exitNamePairs); 158 | 159 | const features = exitPairs.map(([p1, e1, p2, e2, dist, dur, geometry]) => { 160 | const lineFeature = feature(geometry); 161 | const pointFeature = along(lineFeature, dist / 2 / 1000); 162 | pointFeature.properties.duration_min = Math.ceil(dur / 60); 163 | pointFeature.properties.station_codes_1 = p1.properties.station_codes; 164 | pointFeature.properties.station_codes_2 = p2.properties.station_codes; 165 | pointFeature.properties.exit_name_1 = e1.properties.name; 166 | pointFeature.properties.exit_name_2 = e2.properties.name; 167 | return [lineFeature, pointFeature]; 168 | }); 169 | writeFile( 170 | 'data/v1/sg-rail-walks.geojson', 171 | featureCollection(features.flat()), 172 | ); 173 | })(); 174 | -------------------------------------------------------------------------------- /data/raw/wikipedia-lrt.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "codes": [ 4 | "BP1", 5 | "NS4" 6 | ], 7 | "name": "Choa Chu Kang", 8 | "name_zh_Hans": "蔡厝港", 9 | "name_ta": "சுவா சூ காங்", 10 | "title": "Choa Chu Kang MRT/LRT station", 11 | "url": "/wiki/Choa_Chu_Kang_MRT/LRT_station" 12 | }, 13 | { 14 | "codes": [ 15 | "BP2" 16 | ], 17 | "name": "South View", 18 | "name_zh_Hans": "南景", 19 | "name_ta": "சவுத் வியூ", 20 | "title": "South View LRT station", 21 | "url": "/wiki/South_View_LRT_station" 22 | }, 23 | { 24 | "codes": [ 25 | "BP3" 26 | ], 27 | "name": "Keat Hong", 28 | "name_zh_Hans": "吉丰", 29 | "name_ta": "கியட் ஹோங்", 30 | "title": "Keat Hong LRT station", 31 | "url": "/wiki/Keat_Hong_LRT_station" 32 | }, 33 | { 34 | "codes": [ 35 | "BP4" 36 | ], 37 | "name": "Teck Whye", 38 | "name_zh_Hans": "德惠", 39 | "name_ta": "டெக் வாய்", 40 | "title": "Teck Whye LRT station", 41 | "url": "/wiki/Teck_Whye_LRT_station" 42 | }, 43 | { 44 | "codes": [ 45 | "BP5" 46 | ], 47 | "name": "Phoenix", 48 | "name_zh_Hans": "凤凰", 49 | "name_ta": "ஃபீனிக்ஸ்", 50 | "title": "Phoenix LRT station", 51 | "url": "/wiki/Phoenix_LRT_station" 52 | }, 53 | { 54 | "codes": [ 55 | "BP6", 56 | "DT1" 57 | ], 58 | "name": "Bukit Panjang", 59 | "name_zh_Hans": "武吉班让", 60 | "name_ta": "புக்கிட் பாஞ்சாங்", 61 | "title": "Bukit Panjang MRT/LRT station", 62 | "url": "/wiki/Bukit_Panjang_MRT/LRT_station" 63 | }, 64 | { 65 | "codes": [ 66 | "BP7" 67 | ], 68 | "name": "Petir", 69 | "name_zh_Hans": "柏提", 70 | "name_ta": "பெட்டீர்", 71 | "title": "Petir LRT station", 72 | "url": "/wiki/Petir_LRT_station" 73 | }, 74 | { 75 | "codes": [ 76 | "BP8" 77 | ], 78 | "name": "Pending", 79 | "name_zh_Hans": "秉定", 80 | "name_ta": "பெண்டிங்", 81 | "title": "Pending LRT station", 82 | "url": "/wiki/Pending_LRT_station" 83 | }, 84 | { 85 | "codes": [ 86 | "BP9" 87 | ], 88 | "name": "Bangkit", 89 | "name_zh_Hans": "万吉", 90 | "name_ta": "பங்கிட்", 91 | "title": "Bangkit LRT station", 92 | "url": "/wiki/Bangkit_LRT_station" 93 | }, 94 | { 95 | "codes": [ 96 | "BP10" 97 | ], 98 | "name": "Fajar", 99 | "name_zh_Hans": "法嘉", 100 | "name_ta": "ஃபஜார்", 101 | "title": "Fajar LRT station", 102 | "url": "/wiki/Fajar_LRT_station" 103 | }, 104 | { 105 | "codes": [ 106 | "BP11" 107 | ], 108 | "name": "Segar", 109 | "name_zh_Hans": "实加", 110 | "name_ta": "செகார்", 111 | "title": "Segar LRT station", 112 | "url": "/wiki/Segar_LRT_station" 113 | }, 114 | { 115 | "codes": [ 116 | "BP12" 117 | ], 118 | "name": "Jelapang", 119 | "name_zh_Hans": "泽拉邦", 120 | "name_ta": "ஜெலப்பாங்", 121 | "title": "Jelapang LRT station", 122 | "url": "/wiki/Jelapang_LRT_station" 123 | }, 124 | { 125 | "codes": [ 126 | "BP13" 127 | ], 128 | "name": "Senja", 129 | "name_zh_Hans": "信佳", 130 | "name_ta": "சென்ஜா", 131 | "title": "Senja LRT station", 132 | "url": "/wiki/Senja_LRT_station" 133 | }, 134 | { 135 | "codes": [ 136 | "BP14" 137 | ], 138 | "name": "Ten Mile Junction", 139 | "name_zh_Hans": "十里广场", 140 | "name_ta": "பத்தாம் கல் சந்திப்பு", 141 | "title": "Ten Mile Junction LRT station", 142 | "url": "/wiki/Ten_Mile_Junction_LRT_station" 143 | }, 144 | { 145 | "codes": [ 146 | "NE16", 147 | "STC" 148 | ], 149 | "name": "Sengkang", 150 | "name_zh_Hans": "盛港", 151 | "name_ta": "செங்காங்", 152 | "title": "Sengkang MRT/LRT station", 153 | "url": "/wiki/Sengkang_MRT/LRT_station" 154 | }, 155 | { 156 | "codes": [ 157 | "SE1" 158 | ], 159 | "name": "Compassvale", 160 | "name_zh_Hans": "康埔桦", 161 | "name_ta": "கம்பஸ்வேல்", 162 | "title": "Compassvale LRT station", 163 | "url": "/wiki/Compassvale_LRT_station" 164 | }, 165 | { 166 | "codes": [ 167 | "SE2" 168 | ], 169 | "name": "Rumbia", 170 | "name_zh_Hans": "棕美", 171 | "name_ta": "ரூம்பியா", 172 | "title": "Rumbia LRT station", 173 | "url": "/wiki/Rumbia_LRT_station" 174 | }, 175 | { 176 | "codes": [ 177 | "SE3" 178 | ], 179 | "name": "Bakau", 180 | "name_zh_Hans": "码高", 181 | "name_ta": "பக்காவ்", 182 | "title": "Bakau LRT station", 183 | "url": "/wiki/Bakau_LRT_station" 184 | }, 185 | { 186 | "codes": [ 187 | "SE4" 188 | ], 189 | "name": "Kangkar", 190 | "name_zh_Hans": "港脚", 191 | "name_ta": "கங்கார்", 192 | "title": "Kangkar LRT station", 193 | "url": "/wiki/Kangkar_LRT_station" 194 | }, 195 | { 196 | "codes": [ 197 | "SE5" 198 | ], 199 | "name": "Ranggung", 200 | "name_zh_Hans": "兰岗", 201 | "name_ta": "ரங்கோங்", 202 | "title": "Ranggung LRT station", 203 | "url": "/wiki/Ranggung_LRT_station" 204 | }, 205 | { 206 | "codes": [ 207 | "SW1" 208 | ], 209 | "name": "Cheng Lim", 210 | "name_zh_Hans": "振林", 211 | "name_ta": "செங் லிம்", 212 | "title": "Cheng Lim LRT station", 213 | "url": "/wiki/Cheng_Lim_LRT_station" 214 | }, 215 | { 216 | "codes": [ 217 | "SW2" 218 | ], 219 | "name": "Farmway", 220 | "name_zh_Hans": "农道", 221 | "name_ta": "ஃபாம்வே", 222 | "title": "Farmway LRT station", 223 | "url": "/wiki/Farmway_LRT_station" 224 | }, 225 | { 226 | "codes": [ 227 | "SW3" 228 | ], 229 | "name": "Kupang", 230 | "name_zh_Hans": "古邦", 231 | "name_ta": "கூப்பாங்", 232 | "title": "Kupang LRT station", 233 | "url": "/wiki/Kupang_LRT_station" 234 | }, 235 | { 236 | "codes": [ 237 | "SW4" 238 | ], 239 | "name": "Thanggam", 240 | "name_zh_Hans": "丹甘", 241 | "name_ta": "தங்கம்", 242 | "title": "Thanggam LRT station", 243 | "url": "/wiki/Thanggam_LRT_station" 244 | }, 245 | { 246 | "codes": [ 247 | "SW5" 248 | ], 249 | "name": "Fernvale", 250 | "name_zh_Hans": "芬微", 251 | "name_ta": "ஃபொ்ன்வேல்", 252 | "title": "Fernvale LRT station", 253 | "url": "/wiki/Fernvale_LRT_station" 254 | }, 255 | { 256 | "codes": [ 257 | "SW6" 258 | ], 259 | "name": "Layar", 260 | "name_zh_Hans": "拉雅", 261 | "name_ta": "லாயார்", 262 | "title": "Layar LRT station", 263 | "url": "/wiki/Layar_LRT_station" 264 | }, 265 | { 266 | "codes": [ 267 | "SW7" 268 | ], 269 | "name": "Tongkang", 270 | "name_zh_Hans": "同港", 271 | "name_ta": "தொங்காங்", 272 | "title": "Tongkang LRT station", 273 | "url": "/wiki/Tongkang_LRT_station" 274 | }, 275 | { 276 | "codes": [ 277 | "SW8" 278 | ], 279 | "name": "Renjong", 280 | "name_zh_Hans": "仁宗", 281 | "name_ta": "ரெஞ்சோங்", 282 | "title": "Renjong LRT station", 283 | "url": "/wiki/Renjong_LRT_station" 284 | }, 285 | { 286 | "codes": [ 287 | "NE17", 288 | "PTC" 289 | ], 290 | "name": "Punggol", 291 | "name_zh_Hans": "榜鹅", 292 | "name_ta": "பொங்கோல்", 293 | "title": "Punggol MRT/LRT station", 294 | "url": "/wiki/Punggol_MRT/LRT_station" 295 | }, 296 | { 297 | "codes": [ 298 | "PE1" 299 | ], 300 | "name": "Cove", 301 | "name_zh_Hans": "海湾", 302 | "name_ta": "கோவ்", 303 | "title": "Cove LRT station", 304 | "url": "/wiki/Cove_LRT_station" 305 | }, 306 | { 307 | "codes": [ 308 | "PE2" 309 | ], 310 | "name": "Meridian", 311 | "name_zh_Hans": "丽园", 312 | "name_ta": "மெரிடியன்", 313 | "title": "Meridian LRT station", 314 | "url": "/wiki/Meridian_LRT_station" 315 | }, 316 | { 317 | "codes": [ 318 | "PE3" 319 | ], 320 | "name": "Coral Edge", 321 | "name_zh_Hans": "珊瑚", 322 | "name_ta": "கோரல் எட்ஜ்", 323 | "title": "Coral Edge LRT station", 324 | "url": "/wiki/Coral_Edge_LRT_station" 325 | }, 326 | { 327 | "codes": [ 328 | "PE4" 329 | ], 330 | "name": "Riviera", 331 | "name_zh_Hans": "里维拉", 332 | "name_ta": "ரிவியாரா", 333 | "title": "Riviera MRT/LRT station", 334 | "url": "/wiki/Riviera_MRT/LRT_station" 335 | }, 336 | { 337 | "codes": [ 338 | "PE5" 339 | ], 340 | "name": "Kadaloor", 341 | "name_zh_Hans": "卡达鲁", 342 | "name_ta": "கடலூர்", 343 | "title": "Kadaloor LRT station", 344 | "url": "/wiki/Kadaloor_LRT_station" 345 | }, 346 | { 347 | "codes": [ 348 | "PE6" 349 | ], 350 | "name": "Oasis", 351 | "name_zh_Hans": "绿洲", 352 | "name_ta": "ஓய்சிஸ்", 353 | "title": "Oasis LRT station", 354 | "url": "/wiki/Oasis_LRT_station" 355 | }, 356 | { 357 | "codes": [ 358 | "PE7" 359 | ], 360 | "name": "Damai", 361 | "name_zh_Hans": "达迈", 362 | "name_ta": "டாமாய்", 363 | "title": "Damai LRT station (Singapore)", 364 | "url": "/wiki/Damai_LRT_station_(Singapore)" 365 | }, 366 | { 367 | "codes": [ 368 | "PW1" 369 | ], 370 | "name": "Sam Kee", 371 | "name_zh_Hans": "三记", 372 | "name_ta": "சாம் கீ", 373 | "title": "Sam Kee LRT station", 374 | "url": "/wiki/Sam_Kee_LRT_station" 375 | }, 376 | { 377 | "codes": [ 378 | "PW2" 379 | ], 380 | "name": "Teck Lee", 381 | "name_zh_Hans": "德利", 382 | "name_ta": "டெக் லீ", 383 | "title": "Teck Lee LRT station", 384 | "url": "/wiki/Teck_Lee_LRT_station" 385 | }, 386 | { 387 | "codes": [ 388 | "PW3" 389 | ], 390 | "name": "Punggol Point", 391 | "name_zh_Hans": "榜鹅坊", 392 | "name_ta": "பொங்கோல் பாயிண்ட்", 393 | "title": "Punggol Point LRT station", 394 | "url": "/wiki/Punggol_Point_LRT_station" 395 | }, 396 | { 397 | "codes": [ 398 | "PW4" 399 | ], 400 | "name": "Samudera", 401 | "name_zh_Hans": "山姆", 402 | "name_ta": "சமுத்திரா", 403 | "title": "Samudera LRT station", 404 | "url": "/wiki/Samudera_LRT_station" 405 | }, 406 | { 407 | "codes": [ 408 | "PW5" 409 | ], 410 | "name": "Nibong", 411 | "name_zh_Hans": "尼蒙", 412 | "name_ta": "நிபொங்", 413 | "title": "Nibong LRT station", 414 | "url": "/wiki/Nibong_LRT_station" 415 | }, 416 | { 417 | "codes": [ 418 | "PW6" 419 | ], 420 | "name": "Sumang", 421 | "name_zh_Hans": "苏芒", 422 | "name_ta": "சுமாங்", 423 | "title": "Sumang LRT station", 424 | "url": "/wiki/Sumang_LRT_station" 425 | }, 426 | { 427 | "codes": [ 428 | "PW7" 429 | ], 430 | "name": "Soo Teck", 431 | "name_zh_Hans": "树德", 432 | "name_ta": "சூ டெக்", 433 | "title": "Soo Teck LRT station", 434 | "url": "/wiki/Soo_Teck_LRT_station" 435 | } 436 | ] -------------------------------------------------------------------------------- /data/raw/MRTLRTStnPtt.json: -------------------------------------------------------------------------------- 1 | [ 2 | { "STN_NAME": "ESPLANADE MRT STATION", "STN_NO": "CC3" }, 3 | { "STN_NAME": "PAYA LEBAR MRT STATION", "STN_NO": "EW8/CC9" }, 4 | { "STN_NAME": "DHOBY GHAUT MRT STATION", "STN_NO": "NS24/NE6/CC1" }, 5 | { "STN_NAME": "DAKOTA MRT STATION", "STN_NO": "CC8" }, 6 | { "STN_NAME": "LAVENDER MRT STATION", "STN_NO": "EW11" }, 7 | { "STN_NAME": "RENJONG LRT STATION", "STN_NO": "SW8" }, 8 | { "STN_NAME": "DOVER MRT STATION", "STN_NO": "EW22" }, 9 | { "STN_NAME": "HOUGANG MRT STATION", "STN_NO": "NE14" }, 10 | { "STN_NAME": "PHOENIX LRT STATION", "STN_NO": "BP5" }, 11 | { "STN_NAME": "ALJUNIED MRT STATION", "STN_NO": "EW9" }, 12 | { "STN_NAME": "COVE LRT STATION", "STN_NO": "PE1" }, 13 | { "STN_NAME": "PASIR RIS MRT STATION", "STN_NO": "EW1" }, 14 | { "STN_NAME": "ADMIRALTY MRT STATION", "STN_NO": "NS10" }, 15 | { "STN_NAME": "KEMBANGAN MRT STATION", "STN_NO": "EW6" }, 16 | { "STN_NAME": "PUNGGOL POINT LRT STATION", "STN_NO": "PW3" }, 17 | { "STN_NAME": "MARSILING MRT STATION", "STN_NO": "NS8" }, 18 | { "STN_NAME": "COMPASSVALE LRT STATION", "STN_NO": "SE1" }, 19 | { "STN_NAME": "KHATIB MRT STATION", "STN_NO": "NS14" }, 20 | { "STN_NAME": "LAYAR LRT STATION", "STN_NO": "SW6" }, 21 | { "STN_NAME": "TAMPINES WEST MRT STATION", "STN_NO": "DT31" }, 22 | { "STN_NAME": "TAMPINES MRT STATION", "STN_NO": "EW2/DT32" }, 23 | { "STN_NAME": "TAMPINES EAST MRT STATION", "STN_NO": "DT33" }, 24 | { "STN_NAME": "TAI SENG MRT STATION", "STN_NO": "CC11" }, 25 | { "STN_NAME": "SUMANG LRT STATION", "STN_NO": "PW6" }, 26 | { "STN_NAME": "STEVENS MRT STATION", "STN_NO": "DT10" }, 27 | { "STN_NAME": "STADIUM MRT STATION", "STN_NO": "CC6" }, 28 | { "STN_NAME": "SIXTH AVENUE MRT STATION", "STN_NO": "DT7" }, 29 | { "STN_NAME": "SOUTH VIEW LRT STATION", "STN_NO": "BP2" }, 30 | { "STN_NAME": "SOO TECK LRT STATION", "STN_NO": "PW7" }, 31 | { "STN_NAME": "SOMERSET MRT STATION", "STN_NO": "NS23" }, 32 | { "STN_NAME": "SIMEI MRT STATION", "STN_NO": "EW3" }, 33 | { "STN_NAME": "SERANGOON MRT STATION", "STN_NO": "NE12/CC13" }, 34 | { "STN_NAME": "SERANGOON MRT STATION", "STN_NO": "NE12/CC13" }, 35 | { "STN_NAME": "SENGKANG MRT STATION", "STN_NO": "NE16" }, 36 | { "STN_NAME": "BRADDELL MRT STATION", "STN_NO": "NS18" }, 37 | { "STN_NAME": "NOVENA MRT STATION", "STN_NO": "NS20" }, 38 | { "STN_NAME": "FARRER PARK MRT STATION", "STN_NO": "NE8" }, 39 | { "STN_NAME": "BEDOK MRT STATION", "STN_NO": "EW5" }, 40 | { "STN_NAME": "REDHILL MRT STATION", "STN_NO": "EW18" }, 41 | { "STN_NAME": "CHANGI AIRPORT MRT STATION", "STN_NO": "CG2" }, 42 | { "STN_NAME": "CORAL EDGE LRT STATION", "STN_NO": "PE3" }, 43 | { "STN_NAME": "CLEMENTI MRT STATION", "STN_NO": "EW23" }, 44 | { "STN_NAME": "BUKIT BATOK MRT STATION", "STN_NO": "NS2" }, 45 | { "STN_NAME": "OASIS LRT STATION", "STN_NO": "PE6" }, 46 | { "STN_NAME": "NIBONG LRT STATION", "STN_NO": "PW5" }, 47 | { "STN_NAME": "MERIDIAN LRT STATION", "STN_NO": "PE2" }, 48 | { "STN_NAME": "BUKIT GOMBAK MRT STATION", "STN_NO": "NS3" }, 49 | { "STN_NAME": "EUNOS MRT STATION", "STN_NO": "EW7" }, 50 | { "STN_NAME": "CHINESE GARDEN MRT STATION", "STN_NO": "EW25" }, 51 | { "STN_NAME": "KADALOOR LRT STATION", "STN_NO": "PE5" }, 52 | { "STN_NAME": "CHENG LIM LRT STATION", "STN_NO": "SW1" }, 53 | { "STN_NAME": "SAM KEE LRT STATION", "STN_NO": "PW1" }, 54 | { "STN_NAME": "KRANJI MRT STATION", "STN_NO": "NS7" }, 55 | { "STN_NAME": "ANG MO KIO MRT STATION", "STN_NO": "NS16" }, 56 | { "STN_NAME": "RIVIERA LRT STATION", "STN_NO": "PE4" }, 57 | { "STN_NAME": "BANGKIT LRT STATION", "STN_NO": "BP9" }, 58 | { "STN_NAME": "PASIR PANJANG MRT STATION", "STN_NO": "CC26" }, 59 | { "STN_NAME": "HOLLAND VILLAGE MRT STATION", "STN_NO": "CC21" }, 60 | { "STN_NAME": "LABRADOR PARK MRT STATION", "STN_NO": "CC27" }, 61 | { "STN_NAME": "BOTANIC GARDENS MRT STATION", "STN_NO": "CC19/DT9" }, 62 | { "STN_NAME": "ONE-NORTH MRT STATION", "STN_NO": "CC23" }, 63 | { "STN_NAME": "KENT RIDGE MRT STATION", "STN_NO": "CC24" }, 64 | { "STN_NAME": "HAW PAR VILLA MRT STATION", "STN_NO": "CC25" }, 65 | { "STN_NAME": "MARINA BAY MRT STATION", "STN_NO": "NS27/TE20/CE2" }, 66 | { "STN_NAME": "KING ALBERT PARK MRT STATION", "STN_NO": "DT6" }, 67 | { "STN_NAME": "LITTLE INDIA MRT STATION", "STN_NO": "NE7/DT12" }, 68 | { "STN_NAME": "ROCHOR MRT STATION", "STN_NO": "DT13" }, 69 | { "STN_NAME": "SENJA LRT STATION", "STN_NO": "BP13" }, 70 | { "STN_NAME": "MOUNTBATTEN MRT STATION", "STN_NO": "CC7" }, 71 | { "STN_NAME": "CHOA CHU KANG MRT STATION", "STN_NO": "NS4" }, 72 | { "STN_NAME": "BOON KENG MRT STATION", "STN_NO": "NE9" }, 73 | { "STN_NAME": "BARTLEY MRT STATION", "STN_NO": "CC12" }, 74 | { "STN_NAME": "SEGAR LRT STATION", "STN_NO": "BP11" }, 75 | { "STN_NAME": "HILLVIEW MRT STATION", "STN_NO": "DT3" }, 76 | { "STN_NAME": "BEAUTY WORLD MRT STATION", "STN_NO": "DT5" }, 77 | { "STN_NAME": "HUME MRT STATION", "STN_NO": "DT4" }, 78 | { "STN_NAME": "BUKIT PANJANG MRT STATION", "STN_NO": "DT1" }, 79 | { "STN_NAME": "CASHEW MRT STATION", "STN_NO": "DT2" }, 80 | { "STN_NAME": "JOO KOON MRT STATION", "STN_NO": "EW29" }, 81 | { "STN_NAME": "YEW TEE MRT STATION", "STN_NO": "NS5" }, 82 | { "STN_NAME": "YISHUN MRT STATION", "STN_NO": "NS13" }, 83 | { "STN_NAME": "YIO CHU KANG MRT STATION", "STN_NO": "NS15" }, 84 | { "STN_NAME": "WOODLEIGH MRT STATION", "STN_NO": "NE11" }, 85 | { "STN_NAME": "WOODLANDS MRT STATION", "STN_NO": "NS9/TE2" }, 86 | { "STN_NAME": "UPPER CHANGI MRT STATION", "STN_NO": "DT34" }, 87 | { "STN_NAME": "TELOK AYER MRT STATION", "STN_NO": "DT18" }, 88 | { "STN_NAME": "TONGKANG LRT STATION", "STN_NO": "SW7" }, 89 | { "STN_NAME": "UBI MRT STATION", "STN_NO": "DT27" }, 90 | { "STN_NAME": "TOA PAYOH MRT STATION", "STN_NO": "NS19" }, 91 | { "STN_NAME": "TIONG BAHRU MRT STATION", "STN_NO": "EW17" }, 92 | { "STN_NAME": "THANGGAM LRT STATION", "STN_NO": "SW4" }, 93 | { "STN_NAME": "PROMENADE MRT STATION", "STN_NO": "CC4/DT15" }, 94 | { "STN_NAME": "BRAS BASAH MRT STATION", "STN_NO": "CC2" }, 95 | { "STN_NAME": "NICOLL HIGHWAY MRT STATION", "STN_NO": "CC5" }, 96 | { "STN_NAME": "POTONG PASIR MRT STATION", "STN_NO": "NE10" }, 97 | { "STN_NAME": "LAKESIDE MRT STATION", "STN_NO": "EW26" }, 98 | { "STN_NAME": "SAMUDERA LRT STATION", "STN_NO": "PW4" }, 99 | { "STN_NAME": "RANGGUNG LRT STATION", "STN_NO": "SE5" }, 100 | { "STN_NAME": "SEMBAWANG MRT STATION", "STN_NO": "NS11" }, 101 | { "STN_NAME": "PUNGGOL LRT STATION", "STN_NO": "PTC" }, 102 | { "STN_NAME": "KANGKAR LRT STATION", "STN_NO": "SE4" }, 103 | { "STN_NAME": "PAYA LEBAR MRT STATION", "STN_NO": "EW8/CC9" }, 104 | { "STN_NAME": "PIONEER MRT STATION", "STN_NO": "EW28" }, 105 | { "STN_NAME": "BUGIS MRT STATION", "STN_NO": "EW12/DT14" }, 106 | { "STN_NAME": "NEWTON MRT STATION", "STN_NO": "NS21/DT11" }, 107 | { "STN_NAME": "BUONA VISTA MRT STATION", "STN_NO": "EW21/CC22" }, 108 | { "STN_NAME": "OUTRAM PARK MRT STATION", "STN_NO": "EW16/NE3" }, 109 | { "STN_NAME": "MARINA BAY MRT STATION", "STN_NO": "NS27/TE20/CE2" }, 110 | { "STN_NAME": "DHOBY GHAUT MRT STATION", "STN_NO": "NS24/NE6/CC1" }, 111 | { "STN_NAME": "CHINATOWN MRT STATION", "STN_NO": "NE4/DT19" }, 112 | { "STN_NAME": "EXPO MRT STATION", "STN_NO": "CG1/DT35" }, 113 | { "STN_NAME": "RAFFLES PLACE MRT STATION", "STN_NO": "EW14/NS26" }, 114 | { "STN_NAME": "TUAS CRESCENT MRT STATION", "STN_NO": "EW31" }, 115 | { "STN_NAME": "TUAS LINK MRT STATION", "STN_NO": "EW33" }, 116 | { "STN_NAME": "TUAS WEST ROAD MRT STATION", "STN_NO": "EW32" }, 117 | { "STN_NAME": "LITTLE INDIA MRT STATION", "STN_NO": "NE7/DT12" }, 118 | { "STN_NAME": "BOTANIC GARDENS MRT STATION", "STN_NO": "CC19/DT9" }, 119 | { "STN_NAME": "PROMENADE MRT STATION", "STN_NO": "CC4/DT15" }, 120 | { "STN_NAME": "CITY HALL MRT STATION", "STN_NO": "EW13/NS25" }, 121 | { "STN_NAME": "OUTRAM PARK MRT STATION", "STN_NO": "EW16/NE3" }, 122 | { "STN_NAME": "BISHAN MRT STATION", "STN_NO": "NS17/CC15" }, 123 | { "STN_NAME": "EXPO MRT STATION", "STN_NO": "CG1/DT35" }, 124 | { "STN_NAME": "FERNVALE LRT STATION", "STN_NO": "SW5" }, 125 | { "STN_NAME": "PUNGGOL MRT STATION", "STN_NO": "NE17" }, 126 | { "STN_NAME": "BUANGKOK MRT STATION", "STN_NO": "NE15" }, 127 | { "STN_NAME": "BAKAU LRT STATION", "STN_NO": "SE3" }, 128 | { "STN_NAME": "FARMWAY LRT STATION", "STN_NO": "SW2" }, 129 | { "STN_NAME": "COMMONWEALTH MRT STATION", "STN_NO": "EW20" }, 130 | { "STN_NAME": "KUPANG LRT STATION", "STN_NO": "SW3" }, 131 | { "STN_NAME": "DAMAI LRT STATION", "STN_NO": "PE7" }, 132 | { "STN_NAME": "QUEENSTOWN MRT STATION", "STN_NO": "EW19" }, 133 | { "STN_NAME": "KALLANG MRT STATION", "STN_NO": "EW10" }, 134 | { "STN_NAME": "RUMBIA LRT STATION", "STN_NO": "SE2" }, 135 | { "STN_NAME": "PETIR LRT STATION", "STN_NO": "BP7" }, 136 | { "STN_NAME": "BISHAN MRT STATION", "STN_NO": "NS17/CC15" }, 137 | { "STN_NAME": "BOON LAY MRT STATION", "STN_NO": "EW27" }, 138 | { "STN_NAME": "KEAT HONG LRT STATION", "STN_NO": "BP3" }, 139 | { "STN_NAME": "JELAPANG LRT STATION", "STN_NO": "BP12" }, 140 | { "STN_NAME": "CHOA CHU KANG LRT STATION", "STN_NO": "BP1" }, 141 | { "STN_NAME": "SENGKANG LRT STATION", "STN_NO": "STC" }, 142 | { "STN_NAME": "HARBOURFRONT MRT STATION", "STN_NO": "NE1/CC29" }, 143 | { "STN_NAME": "PENDING LRT STATION", "STN_NO": "BP8" }, 144 | { "STN_NAME": "CLARKE QUAY MRT STATION", "STN_NO": "NE5" }, 145 | { "STN_NAME": "BUKIT PANJANG LRT STATION", "STN_NO": "BP6" }, 146 | { "STN_NAME": "FAJAR LRT STATION", "STN_NO": "BP10" }, 147 | { "STN_NAME": "KOVAN MRT STATION", "STN_NO": "NE13" }, 148 | { "STN_NAME": "LORONG CHUAN MRT STATION", "STN_NO": "CC14" }, 149 | { "STN_NAME": "MARYMOUNT MRT STATION", "STN_NO": "CC16" }, 150 | { "STN_NAME": "HARBOURFRONT MRT STATION", "STN_NO": "NE1/CC29" }, 151 | { "STN_NAME": "BUONA VISTA MRT STATION", "STN_NO": "EW21/CC22" }, 152 | { "STN_NAME": "CALDECOTT MRT STATION", "STN_NO": "CC17/TE9" }, 153 | { "STN_NAME": "BUGIS MRT STATION", "STN_NO": "EW12/DT14" }, 154 | { "STN_NAME": "NEWTON MRT STATION", "STN_NO": "NS21/DT11" }, 155 | { "STN_NAME": "CHINATOWN MRT STATION", "STN_NO": "NE4/DT19" }, 156 | { "STN_NAME": "DOWNTOWN MRT STATION", "STN_NO": "DT17" }, 157 | { "STN_NAME": "GEYLANG BAHRU MRT STATION", "STN_NO": "DT24" }, 158 | { "STN_NAME": "BENDEMEER MRT STATION", "STN_NO": "DT23" }, 159 | { "STN_NAME": "BENCOOLEN MRT STATION", "STN_NO": "DT21" }, 160 | { "STN_NAME": "FORT CANNING MRT STATION", "STN_NO": "DT20" }, 161 | { "STN_NAME": "KAKI BUKIT MRT STATION", "STN_NO": "DT28" }, 162 | { "STN_NAME": "TAMPINES MRT STATION", "STN_NO": "EW2/DT32" }, 163 | { "STN_NAME": "JALAN BESAR MRT STATION", "STN_NO": "DT22" }, 164 | { "STN_NAME": "MATTAR MRT STATION", "STN_NO": "DT25" }, 165 | { "STN_NAME": "MACPHERSON MRT STATION", "STN_NO": "CC10/DT26" }, 166 | { "STN_NAME": "BAYFRONT MRT STATION", "STN_NO": "DT16/CE1" }, 167 | { "STN_NAME": "DHOBY GHAUT MRT STATION", "STN_NO": "NS24/NE6/CC1" }, 168 | { "STN_NAME": "FARRER ROAD MRT STATION", "STN_NO": "CC20" }, 169 | { "STN_NAME": "JURONG EAST MRT STATION", "STN_NO": "EW24/NS1" }, 170 | { "STN_NAME": "BEDOK NORTH MRT STATION", "STN_NO": "DT29" }, 171 | { "STN_NAME": "BEDOK RESERVOIR MRT STATION", "STN_NO": "DT30" }, 172 | { "STN_NAME": "ORCHARD MRT STATION", "STN_NO": "NS22/TE14" }, 173 | { "STN_NAME": "BUKIT BROWN MRT STATION", "STN_NO": "CC18" }, 174 | { "STN_NAME": "LENTOR MRT STATION", "STN_NO": "TE5" }, 175 | { "STN_NAME": "BRIGHT HILL MRT STATION", "STN_NO": "TE7" }, 176 | { "STN_NAME": "SPRINGLEAF MRT STATION", "STN_NO": "TE4" }, 177 | { "STN_NAME": "MARINA SOUTH PIER MRT STATION", "STN_NO": "NS28" }, 178 | { "STN_NAME": "MACPHERSON MRT STATION", "STN_NO": "CC10/DT26" }, 179 | { "STN_NAME": "CANBERRA MRT STATION", "STN_NO": "NS12" }, 180 | { "STN_NAME": "WOODLANDS SOUTH MRT STATION", "STN_NO": "TE3" }, 181 | { "STN_NAME": "WOODLANDS NORTH MRT STATION", "STN_NO": "TE1" }, 182 | { "STN_NAME": "GUL CIRCLE MRT STATION", "STN_NO": "EW30" }, 183 | { "STN_NAME": "WOODLANDS MRT STATION", "STN_NO": "NS9/TE2" }, 184 | { "STN_NAME": "TELOK BLANGAH MRT STATION", "STN_NO": "CC28" }, 185 | { "STN_NAME": "TECK WHYE LRT STATION", "STN_NO": "BP4" }, 186 | { "STN_NAME": "TECK LEE LRT STATION", "STN_NO": "PW2" }, 187 | { "STN_NAME": "TANJONG PAGAR MRT STATION", "STN_NO": "EW15" }, 188 | { "STN_NAME": "TANAH MERAH MRT STATION", "STN_NO": "EW4" }, 189 | { "STN_NAME": "TAN KAH KEE MRT STATION", "STN_NO": "DT8" }, 190 | { "STN_NAME": "UPPER THOMSON MRT STATION", "STN_NO": "TE8" }, 191 | { "STN_NAME": "CALDECOTT MRT STATION", "STN_NO": "CC17/TE9" }, 192 | { "STN_NAME": "MAYFLOWER MRT STATION", "STN_NO": "TE6" } 193 | ] 194 | -------------------------------------------------------------------------------- /data/raw/tel1-way.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.6", 3 | "generator": "CGImap 0.8.8 (2833739 spike-06.openstreetmap.org)", 4 | "copyright": "OpenStreetMap and contributors", 5 | "attribution": "http://www.openstreetmap.org/copyright", 6 | "license": "http://opendatacommons.org/licenses/odbl/1-0/", 7 | "elements": [ 8 | { 9 | "type": "node", 10 | "id": 6170309591, 11 | "lat": 1.4342802, 12 | "lon": 103.7883482, 13 | "timestamp": "2022-10-08T04:17:49Z", 14 | "version": 3, 15 | "changeset": 127181445, 16 | "user": "coshatiuav", 17 | "uid": 8748137 18 | }, 19 | { 20 | "type": "node", 21 | "id": 7174110067, 22 | "lat": 1.4523609, 23 | "lon": 103.7837605, 24 | "timestamp": "2021-12-06T13:10:44Z", 25 | "version": 3, 26 | "changeset": 114618626, 27 | "user": "marczoutendijk", 28 | "uid": 606555 29 | }, 30 | { 31 | "type": "node", 32 | "id": 7174110068, 33 | "lat": 1.4457877, 34 | "lon": 103.7872172, 35 | "timestamp": "2020-01-31T07:16:47Z", 36 | "version": 2, 37 | "changeset": 80354255, 38 | "user": "angys", 39 | "uid": 3191182 40 | }, 41 | { 42 | "type": "node", 43 | "id": 7174125090, 44 | "lat": 1.4484581, 45 | "lon": 103.7858045, 46 | "timestamp": "2020-07-03T04:46:25Z", 47 | "version": 3, 48 | "changeset": 87479549, 49 | "user": "Ptrho81", 50 | "uid": 10674755, 51 | "tags": { 52 | "name": "Woodlands North", 53 | "name:en": "Woodlands North", 54 | "name:ta": "உட்லண்ட்ஸ் நார்த்", 55 | "name:zh": "兀兰北", 56 | "network": "Thomson–East Coast Line (TEL)", 57 | "operator": "SMRT", 58 | "public_transport": "stop_position", 59 | "railway": "stop", 60 | "ref": "TE1", 61 | "subway": "yes" 62 | } 63 | }, 64 | { 65 | "type": "node", 66 | "id": 7174211446, 67 | "lat": 1.4424558, 68 | "lon": 103.7889861, 69 | "timestamp": "2022-10-08T04:17:49Z", 70 | "version": 2, 71 | "changeset": 127181445, 72 | "user": "coshatiuav", 73 | "uid": 8748137 74 | }, 75 | { 76 | "type": "node", 77 | "id": 7174211447, 78 | "lat": 1.4418685, 79 | "lon": 103.7891371, 80 | "timestamp": "2022-10-08T04:17:49Z", 81 | "version": 2, 82 | "changeset": 127181445, 83 | "user": "coshatiuav", 84 | "uid": 8748137 85 | }, 86 | { 87 | "type": "node", 88 | "id": 7174211448, 89 | "lat": 1.4413399, 90 | "lon": 103.7891692, 91 | "timestamp": "2022-10-08T04:17:49Z", 92 | "version": 2, 93 | "changeset": 127181445, 94 | "user": "coshatiuav", 95 | "uid": 8748137 96 | }, 97 | { 98 | "type": "node", 99 | "id": 7174211449, 100 | "lat": 1.4392128, 101 | "lon": 103.7882665, 102 | "timestamp": "2022-10-08T04:17:49Z", 103 | "version": 2, 104 | "changeset": 127181445, 105 | "user": "coshatiuav", 106 | "uid": 8748137 107 | }, 108 | { 109 | "type": "node", 110 | "id": 7174211451, 111 | "lat": 1.4386959, 112 | "lon": 103.7880492, 113 | "timestamp": "2022-10-08T04:17:49Z", 114 | "version": 2, 115 | "changeset": 127181445, 116 | "user": "coshatiuav", 117 | "uid": 8748137 118 | }, 119 | { 120 | "type": "node", 121 | "id": 7174211452, 122 | "lat": 1.4382843, 123 | "lon": 103.7879608, 124 | "timestamp": "2022-10-08T04:17:49Z", 125 | "version": 2, 126 | "changeset": 127181445, 127 | "user": "coshatiuav", 128 | "uid": 8748137 129 | }, 130 | { 131 | "type": "node", 132 | "id": 7174211453, 133 | "lat": 1.4378588, 134 | "lon": 103.7879391, 135 | "timestamp": "2022-10-08T04:17:49Z", 136 | "version": 2, 137 | "changeset": 127181445, 138 | "user": "coshatiuav", 139 | "uid": 8748137 140 | }, 141 | { 142 | "type": "node", 143 | "id": 7174211454, 144 | "lat": 1.4374941, 145 | "lon": 103.7879681, 146 | "timestamp": "2020-01-31T07:16:47Z", 147 | "version": 1, 148 | "changeset": 80354255, 149 | "user": "angys", 150 | "uid": 3191182 151 | }, 152 | { 153 | "type": "node", 154 | "id": 7174211457, 155 | "lat": 1.4333227, 156 | "lon": 103.7882002, 157 | "timestamp": "2022-10-08T04:17:49Z", 158 | "version": 2, 159 | "changeset": 127181445, 160 | "user": "coshatiuav", 161 | "uid": 8748137 162 | }, 163 | { 164 | "type": "node", 165 | "id": 7174211458, 166 | "lat": 1.4345427, 167 | "lon": 103.788336, 168 | "timestamp": "2022-10-08T04:17:49Z", 169 | "version": 2, 170 | "changeset": 127181445, 171 | "user": "coshatiuav", 172 | "uid": 8748137 173 | }, 174 | { 175 | "type": "node", 176 | "id": 7174211459, 177 | "lat": 1.4362549, 178 | "lon": 103.7881226, 179 | "timestamp": "2022-10-08T04:17:49Z", 180 | "version": 3, 181 | "changeset": 127181445, 182 | "user": "coshatiuav", 183 | "uid": 8748137, 184 | "tags": { 185 | "name": "Woodlands", 186 | "name:en": "Woodlands", 187 | "name:ta": "ஊட்லண்ட்ஸ்", 188 | "name:zh": "兀兰", 189 | "network": "Thomson–East Coast Line (TEL)", 190 | "operator": "SMRT", 191 | "public_transport": "stop_position", 192 | "railway": "stop", 193 | "ref": "TE2", 194 | "subway": "yes" 195 | } 196 | }, 197 | { 198 | "type": "node", 199 | "id": 7174211460, 200 | "lat": 1.4320826, 201 | "lon": 103.7879496, 202 | "timestamp": "2022-10-08T04:17:49Z", 203 | "version": 2, 204 | "changeset": 127181445, 205 | "user": "coshatiuav", 206 | "uid": 8748137 207 | }, 208 | { 209 | "type": "node", 210 | "id": 7174211461, 211 | "lat": 1.4314765, 212 | "lon": 103.7879978, 213 | "timestamp": "2022-10-08T04:17:49Z", 214 | "version": 2, 215 | "changeset": 127181445, 216 | "user": "coshatiuav", 217 | "uid": 8748137 218 | }, 219 | { 220 | "type": "node", 221 | "id": 7174211462, 222 | "lat": 1.431016, 223 | "lon": 103.7880847, 224 | "timestamp": "2022-10-08T04:17:49Z", 225 | "version": 2, 226 | "changeset": 127181445, 227 | "user": "coshatiuav", 228 | "uid": 8748137 229 | }, 230 | { 231 | "type": "node", 232 | "id": 7174211463, 233 | "lat": 1.4304992, 234 | "lon": 103.7882645, 235 | "timestamp": "2022-10-08T04:17:49Z", 236 | "version": 2, 237 | "changeset": 127181445, 238 | "user": "coshatiuav", 239 | "uid": 8748137 240 | }, 241 | { 242 | "type": "node", 243 | "id": 7174211464, 244 | "lat": 1.4301973, 245 | "lon": 103.788429, 246 | "timestamp": "2022-10-08T04:17:49Z", 247 | "version": 2, 248 | "changeset": 127181445, 249 | "user": "coshatiuav", 250 | "uid": 8748137 251 | }, 252 | { 253 | "type": "node", 254 | "id": 7174211465, 255 | "lat": 1.4296654, 256 | "lon": 103.78881, 257 | "timestamp": "2022-10-08T04:17:49Z", 258 | "version": 2, 259 | "changeset": 127181445, 260 | "user": "coshatiuav", 261 | "uid": 8748137 262 | }, 263 | { 264 | "type": "node", 265 | "id": 7174211466, 266 | "lat": 1.4292767, 267 | "lon": 103.7892265, 268 | "timestamp": "2022-10-08T04:17:49Z", 269 | "version": 3, 270 | "changeset": 127181445, 271 | "user": "coshatiuav", 272 | "uid": 8748137 273 | }, 274 | { 275 | "type": "node", 276 | "id": 7174211467, 277 | "lat": 1.4289903, 278 | "lon": 103.7896598, 279 | "timestamp": "2022-10-08T04:17:49Z", 280 | "version": 3, 281 | "changeset": 127181445, 282 | "user": "coshatiuav", 283 | "uid": 8748137 284 | }, 285 | { 286 | "type": "node", 287 | "id": 7174211468, 288 | "lat": 1.4287508, 289 | "lon": 103.7901202, 290 | "timestamp": "2022-10-08T04:17:49Z", 291 | "version": 3, 292 | "changeset": 127181445, 293 | "user": "coshatiuav", 294 | "uid": 8748137 295 | }, 296 | { 297 | "type": "node", 298 | "id": 7174211469, 299 | "lat": 1.4284573, 300 | "lon": 103.7909458, 301 | "timestamp": "2022-10-08T04:17:49Z", 302 | "version": 2, 303 | "changeset": 127181445, 304 | "user": "coshatiuav", 305 | "uid": 8748137 306 | }, 307 | { 308 | "type": "node", 309 | "id": 7174211470, 310 | "lat": 1.4276519, 311 | "lon": 103.7929602, 312 | "timestamp": "2020-01-31T07:16:47Z", 313 | "version": 1, 314 | "changeset": 80354255, 315 | "user": "angys", 316 | "uid": 3191182 317 | }, 318 | { 319 | "type": "node", 320 | "id": 7174211471, 321 | "lat": 1.4268942, 322 | "lon": 103.7948858, 323 | "timestamp": "2022-11-12T17:33:15Z", 324 | "version": 4, 325 | "changeset": 128821831, 326 | "user": "coshatiuav", 327 | "uid": 8748137 328 | }, 329 | { 330 | "type": "node", 331 | "id": 7174211472, 332 | "lat": 1.4271055, 333 | "lon": 103.7944618, 334 | "timestamp": "2021-10-29T02:58:11Z", 335 | "version": 2, 336 | "changeset": 113103246, 337 | "user": "coshatiuav", 338 | "uid": 8748137 339 | }, 340 | { 341 | "type": "node", 342 | "id": 7174211475, 343 | "lat": 1.4273684, 344 | "lon": 103.7937603, 345 | "timestamp": "2020-07-04T15:05:24Z", 346 | "version": 2, 347 | "changeset": 87533606, 348 | "user": "Ptrho81", 349 | "uid": 10674755, 350 | "tags": { 351 | "name": "Woodlands South", 352 | "name:en": "Woodlands South", 353 | "name:ta": "உட்லண்ட்ஸ் சவுத்", 354 | "name:zh": "兀兰南", 355 | "network": "Thomson–East Coast Line (TEL)", 356 | "operator": "SMRT", 357 | "public_transport": "stop_position", 358 | "railway": "stop", 359 | "ref": "TE3", 360 | "subway": "yes" 361 | } 362 | }, 363 | { 364 | "type": "node", 365 | "id": 7177379516, 366 | "lat": 1.4337954, 367 | "lon": 103.7882897, 368 | "timestamp": "2022-10-08T04:17:49Z", 369 | "version": 2, 370 | "changeset": 127181445, 371 | "user": "coshatiuav", 372 | "uid": 8748137 373 | }, 374 | { 375 | "type": "node", 376 | "id": 7177379523, 377 | "lat": 1.4327844, 378 | "lon": 103.7880552, 379 | "timestamp": "2022-10-08T04:17:49Z", 380 | "version": 2, 381 | "changeset": 127181445, 382 | "user": "coshatiuav", 383 | "uid": 8748137 384 | }, 385 | { 386 | "type": "node", 387 | "id": 7257704661, 388 | "lat": 1.4282185, 389 | "lon": 103.7916109, 390 | "timestamp": "2022-10-08T04:17:49Z", 391 | "version": 2, 392 | "changeset": 127181445, 393 | "user": "coshatiuav", 394 | "uid": 8748137 395 | }, 396 | { 397 | "type": "node", 398 | "id": 10057222632, 399 | "lat": 1.440696, 400 | "lon": 103.78908, 401 | "timestamp": "2022-10-08T04:17:49Z", 402 | "version": 2, 403 | "changeset": 127181445, 404 | "user": "coshatiuav", 405 | "uid": 8748137 406 | }, 407 | { 408 | "type": "node", 409 | "id": 10057222633, 410 | "lat": 1.4400132, 411 | "lon": 103.7887878, 412 | "timestamp": "2022-10-08T04:17:49Z", 413 | "version": 2, 414 | "changeset": 127181445, 415 | "user": "coshatiuav", 416 | "uid": 8748137 417 | }, 418 | { 419 | "type": "node", 420 | "id": 10057222634, 421 | "lat": 1.4431427, 422 | "lon": 103.788625, 423 | "timestamp": "2022-10-08T04:17:49Z", 424 | "version": 2, 425 | "changeset": 127181445, 426 | "user": "coshatiuav", 427 | "uid": 8748137 428 | }, 429 | { 430 | "type": "node", 431 | "id": 10057222635, 432 | "lat": 1.4403565, 433 | "lon": 103.788955, 434 | "timestamp": "2022-10-08T04:17:49Z", 435 | "version": 2, 436 | "changeset": 127181445, 437 | "user": "coshatiuav", 438 | "uid": 8748137 439 | }, 440 | { 441 | "type": "node", 442 | "id": 10057222637, 443 | "lat": 1.4441421, 444 | "lon": 103.7880123, 445 | "timestamp": "2022-10-08T04:17:49Z", 446 | "version": 2, 447 | "changeset": 127181445, 448 | "user": "coshatiuav", 449 | "uid": 8748137 450 | }, 451 | { 452 | "type": "way", 453 | "id": 768424508, 454 | "timestamp": "2022-10-08T04:17:49Z", 455 | "version": 12, 456 | "changeset": 127181445, 457 | "user": "coshatiuav", 458 | "uid": 8748137, 459 | "nodes": [ 460 | 7174110067, 461 | 7174125090, 462 | 7174110068, 463 | 10057222637, 464 | 10057222634, 465 | 7174211446, 466 | 7174211447, 467 | 7174211448, 468 | 10057222632, 469 | 10057222635, 470 | 10057222633, 471 | 7174211449, 472 | 7174211451, 473 | 7174211452, 474 | 7174211453, 475 | 7174211454, 476 | 7174211459, 477 | 7174211458, 478 | 6170309591, 479 | 7177379516, 480 | 7174211457, 481 | 7177379523, 482 | 7174211460, 483 | 7174211461, 484 | 7174211462, 485 | 7174211463, 486 | 7174211464, 487 | 7174211465, 488 | 7174211466, 489 | 7174211467, 490 | 7174211468, 491 | 7174211469, 492 | 7257704661, 493 | 7174211470, 494 | 7174211475, 495 | 7174211472, 496 | 7174211471 497 | ], 498 | "tags": { 499 | "electrified": "rail", 500 | "frequency": "0", 501 | "gauge": "1435", 502 | "layer": "-1", 503 | "name": "MRT Thomson–East Coast Line", 504 | "name:zh": "汤申-东海岸线", 505 | "railway": "subway", 506 | "ref": "TEL", 507 | "tunnel": "yes", 508 | "voltage": "750", 509 | "wikidata": "Q7795883", 510 | "wikipedia": "en:Thomson–East Coast MRT line" 511 | } 512 | } 513 | ] 514 | } -------------------------------------------------------------------------------- /scripts/build-geojson.js: -------------------------------------------------------------------------------- 1 | const { readFile, writeFile } = require('../utils'); 2 | const { 3 | point, 4 | lineString, 5 | multiLineString, 6 | featureCollection, 7 | feature, 8 | } = require('@turf/helpers'); 9 | const truncate = require('@turf/truncate').default; 10 | const centerOfMass = require('@turf/center-of-mass').default; 11 | const nearestPoint = require('@turf/nearest-point').default; 12 | const { rewind, simplify } = require('@turf/turf'); 13 | const namer = require('color-namer'); 14 | const { chaikin } = require('chaikin'); 15 | 16 | const routesData = readFile('./data/raw/routes.citymapper.json'); 17 | const codesData = readFile('./data/raw/MRTLRTStnPtt.json'); 18 | const wikipediaMRTData = readFile('./data/raw/wikipedia-mrt.json'); 19 | const wikipediaLRTData = readFile('./data/raw/wikipedia-lrt.json'); 20 | const stationData = readFile( 21 | './data/raw/master-plan-2019-rail-station-layer-geojson.geojson', 22 | ); 23 | const exitsData = readFile('./data/raw/Train_Station_Exit_Layer.json'); 24 | // const telExitsData = readFile('./data/raw/tel-exits.citymapper.json'); 25 | // const telLine = readFile('./data/raw/tel-line.json'); 26 | const peLine = readFile('./data/raw/punggol-lrt-east-loop.json'); 27 | // const dtlLine = readFile('./data/raw/dtl-way.json'); 28 | 29 | // https://github.com/darkskyapp/string-hash/ 30 | function hash(str) { 31 | let hash = 5381; 32 | let i = str.length; 33 | while (i) hash = (hash * 33) ^ str.charCodeAt(--i); 34 | return hash >>> 0; 35 | } 36 | 37 | function brand2Network(brand) { 38 | return { 39 | SingaporeMRT: 'singapore-mrt', 40 | SingaporeLRT: 'singapore-lrt', 41 | }[brand]; 42 | } 43 | 44 | function color2Name(color) { 45 | return namer(color).html[0].name; 46 | } 47 | 48 | const codesOrder = ['NS', 'EW', 'NE', 'CC', 'DT']; 49 | function sortStationCodes(a, b) { 50 | const aCode = a.match(/[a-z]+/i)[0]; 51 | const bCode = b.match(/[a-z]+/i)[0]; 52 | let aIndex = codesOrder.indexOf(aCode); 53 | let bIndex = codesOrder.indexOf(bCode); 54 | if (aIndex === -1) aIndex = 99; 55 | if (bIndex === -1) bIndex = 99; 56 | return aIndex - bIndex; 57 | } 58 | function stationName2Codes(name) { 59 | const cleanName = name 60 | .replace(/(l|m)rt/i, '') 61 | .replace(/stat?ion/i, '') 62 | .trim(); 63 | 64 | let codes = []; 65 | const wikipedia = stationName2Wikipedia(cleanName); 66 | if (wikipedia) { 67 | codes = filterInvalidCodes(wikipedia.codes); 68 | } else { 69 | const found = codesData.filter((d) => { 70 | const stnName = d.STN_NAME.trim() 71 | .replace(/\s*(m|l)rt\s+station.*$/i, '') 72 | .toLowerCase(); 73 | const lowerCleanName = cleanName.toLowerCase(); 74 | return ( 75 | lowerCleanName === stnName || 76 | lowerCleanName.replace(/road/i, '').trim() === 77 | stnName.replace(/road/i, '').trim() // special case for Tuas West Road 78 | ); 79 | }); 80 | 81 | if (found.length) { 82 | if (found.length === 1) { 83 | codes = found[0].STN_NO.split('/').map((s) => s.trim()); 84 | } else { 85 | codes = found 86 | .map((f) => f.STN_NO.split('/').map((s) => s.trim())) 87 | .flat() // Flatten 88 | .filter((item, index, arr) => arr.indexOf(item) === index); // Remove dups 89 | } 90 | } 91 | } 92 | 93 | codes.sort(sortStationCodes); 94 | if (!codes.length) { 95 | console.warn('NO CODES', name); 96 | } 97 | return codes; 98 | } 99 | 100 | const wikipediaData = [...wikipediaMRTData, ...wikipediaLRTData]; 101 | function stationCodes2Wikipedia(codes) { 102 | return wikipediaData.find((d) => { 103 | const lowerCodes = d.codes.map((c) => c.toLowerCase()); 104 | return lowerCodes.includes(codes[0].toLowerCase()); 105 | }); 106 | } 107 | 108 | function stationName2Wikipedia(name) { 109 | return wikipediaData.find((d) => { 110 | const lowerName = d.name.toLowerCase().trim(); 111 | return lowerName === name.toLowerCase().trim(); 112 | }); 113 | } 114 | 115 | const colorMap = { 116 | NE: 'purple', 117 | DT: 'blue', 118 | NS: 'red', 119 | CC: 'yellow', 120 | CE: 'yellow', 121 | EW: 'green', 122 | CG: 'green', 123 | TE: 'brown', 124 | BP: 'gray', 125 | SE: 'gray', 126 | SW: 'gray', 127 | PE: 'gray', 128 | PW: 'gray', 129 | PTC: 'gray', 130 | STC: 'gray', 131 | }; 132 | const code2Color = (code) => 133 | colorMap[code.match(/[a-z]+/i)[0].toUpperCase()] || 'gray'; 134 | const validCodes = Object.keys(colorMap); 135 | 136 | const filterInvalidCodes = (codes) => { 137 | return codes.filter((c) => 138 | validCodes.includes(c.toUpperCase().replace(/\d+$/, '')), 139 | ); 140 | }; 141 | 142 | const { stops, routes } = routesData; 143 | 144 | // STATIONS 145 | console.log('Generate Stations...'); 146 | const stationCodes = []; 147 | const stations = Object.values(stops) 148 | .map((s) => { 149 | const { name, coords, brands } = s; 150 | 151 | // const codes = stationName2Codes(name); 152 | // const wikipedia = stationCodes2Wikipedia(codes); 153 | const wikipedia = stationName2Wikipedia(name); 154 | if (!wikipedia) throw new Error(`No Wikipedia for ${name}`); 155 | const { codes: _codes, title, name_zh_Hans, name_ta, url } = wikipedia; 156 | const codes = filterInvalidCodes(_codes).sort(sortStationCodes); 157 | 158 | const joinedCodes = codes.join('-'); 159 | stationCodes.push(joinedCodes); 160 | 161 | const p = point( 162 | coords.reverse(), 163 | { 164 | name, 165 | 'name_zh-Hans': name_zh_Hans, 166 | name_ta, 167 | network: brands.map(brand2Network).join('.'), 168 | // Custom 169 | network_count: codes.length, 170 | station_codes: joinedCodes, 171 | station_colors: codes 172 | .map((c) => c.replace(/\d+$/, '')) 173 | .map(code2Color) 174 | .join('-'), 175 | wikipedia: `en:${title}`, // https://wiki.openstreetmap.org/wiki/Key:wikipedia 176 | wikipedia_slug: url.replace(/^.*\/wiki\//i, ''), 177 | // Follow Mapbox 178 | stop_type: 'station', 179 | mode: 'metro_rail', 180 | }, 181 | { 182 | id: hash(joinedCodes), 183 | }, 184 | ); 185 | return p; 186 | }) 187 | .sort((a, b) => a.properties.name.localeCompare(b.properties.name)); 188 | 189 | stationCodes.sort((a, b) => a.localeCompare(b)); 190 | 191 | // LINES 192 | console.log('Generate Lines...'); 193 | const lines = routes 194 | .map((r) => { 195 | const { live_line_code, color, brand, long_name, patterns } = r; 196 | 197 | // Always get longest one first 198 | patterns.sort((a, b) => b.stop_points.length - a.stop_points.length); 199 | const diffPatterns = [patterns[0]]; 200 | const diffStopPoints = patterns[0].stop_points.map((p) => 201 | p.id.toLowerCase(), 202 | ); 203 | 204 | for (let i = 1, l = patterns.length; i < l; i++) { 205 | let addPattern = 0; 206 | let p2; 207 | for (let j = 0, lj = diffPatterns.length; j < lj; j++) { 208 | const p1 = diffPatterns[j]; 209 | p2 = patterns[i]; 210 | const sp1 = p1.stop_points.map((p) => p.id.toLowerCase()); 211 | const sp2 = p2.stop_points.map((p) => p.id.toLowerCase()); 212 | if ( 213 | sp1.join().includes(sp2.join()) || 214 | sp1.join().includes(sp2.reverse().join()) || 215 | (diffStopPoints.includes(p2.stop_points[0].id.toLowerCase()) && 216 | diffStopPoints.includes( 217 | p2.stop_points[p2.stop_points.length - 1].id.toLowerCase(), 218 | )) 219 | ) { 220 | // console.log(p1.name, p2.name); 221 | // do nothing 222 | } else { 223 | ++addPattern; 224 | 225 | // Chop off the path, prevent overlapping with original path 226 | if (p1.stop_points[0].id === p2.stop_points[0].id) { 227 | for (let k = 0, lk = p1.stop_points.length; k < lk; k++) { 228 | if ( 229 | p2.stop_points[k] && 230 | p1.stop_points[k].id !== p2.stop_points[k].id 231 | ) { 232 | const { path_index } = p2.stop_points[k - 1]; 233 | p2.stop_points = p2.stop_points.slice(k - 1); 234 | p2.path = p2.path.slice(path_index); 235 | } 236 | } 237 | if (!p2.path.length) addPattern--; 238 | } 239 | } 240 | } 241 | if (addPattern === diffPatterns.length) { 242 | // console.log( 243 | // diffPatterns.map((p) => p.name), 244 | // p2.name, 245 | // ); 246 | diffPatterns.push(p2); 247 | diffStopPoints.push(...p2.stop_points.map((p) => p.id.toLowerCase())); 248 | } 249 | } 250 | // console.log({ long_name, diffPatterns }); 251 | 252 | let lines = diffPatterns.map((p) => p.path.map((c) => c.reverse())); 253 | 254 | // if (/thomson/i.test(long_name)) { 255 | // // Special case for TEL 256 | // lines = [telLine]; 257 | // } else if (/punggol lrt \(east/i.test(long_name)) { 258 | // // Special case for PE 259 | // lines = peLine; 260 | // } else if (/downtown/i.test(long_name)) { 261 | // // Special case for DTL 262 | // lines = dtlLine; 263 | // } 264 | if (/punggol lrt \(east/i.test(long_name)) { 265 | // Special case for PE 266 | lines = peLine; 267 | } 268 | 269 | const props = { 270 | name: long_name.trim(), 271 | line_color: color2Name(color), 272 | network: brand2Network(brand), 273 | // Follow Mapbox 274 | mode: 'metro_rail', 275 | }; 276 | const opts = { 277 | id: hash(live_line_code), 278 | }; 279 | 280 | let l; 281 | // console.log({ long_name, c: lines.length }); 282 | if (lines.length === 1) { 283 | l = lineString(chaikin(lines[0], 3), props, opts); 284 | } else { 285 | l = multiLineString( 286 | lines.map((l) => chaikin(l, 3)), 287 | props, 288 | opts, 289 | ); 290 | } 291 | return truncate( 292 | simplify(l, { tolerance: 0.000005, highQuality: true, mutate: true }), 293 | { mutate: true }, 294 | ); 295 | }) 296 | .sort((a, b) => a.properties.name.localeCompare(b.properties.name)); 297 | 298 | // console.log({ lines: lines.map((l) => l.properties) }); 299 | 300 | // EXITS 301 | console.log('Generate Exits...'); 302 | // const tel3Stations = 303 | // /^(stevens|napier|orchard|great world|havelock|outram park|maxwell|shenton way|marina bay|gardens by the bay)/i; 304 | const exitsList = exitsData.features 305 | .map((f) => { 306 | const { 307 | properties: { stn_name, exit_code: _exit_code }, 308 | geometry, 309 | } = f; 310 | const exit_code = _exit_code.replace(/exit\s+?/i, '').toUpperCase(); 311 | if (/^null/i.test(exit_code)) return; 312 | // if (tel3Stations.test(stn_name)) return; // Skip TEL3 stations. Exits have become 123 instead of ABC 313 | 314 | let codes = stationName2Codes(stn_name); 315 | if (!codes?.length) return; 316 | 317 | // if (codes.includes('NS9') && /[a-z]/i.test(exit_code)) { 318 | // // Deprecated in favor of 123s https://landtransportguru.net/woodlands-station/ 319 | // return; 320 | // } 321 | 322 | const joinedCodes = codes.join('-'); 323 | 324 | const props = { 325 | stop_type: 'entrance', 326 | network: 'entrance', 327 | name: exit_code, 328 | // Custom 329 | station_codes: joinedCodes, 330 | }; 331 | const opts = { 332 | id: hash(stn_name + exit_code), 333 | }; 334 | const truncGeometry = truncate(geometry, { 335 | coordinates: 2, 336 | }); 337 | const e = feature(truncGeometry, props, opts); 338 | return e; 339 | }) 340 | .filter(Boolean) 341 | .sort((a, b) => 342 | a.properties.station_codes.localeCompare(b.properties.station_codes), 343 | ); 344 | 345 | // const telExitsList = Object.entries(telExitsData) 346 | // .map(([stationName, exits]) => { 347 | // if (!tel3Stations.test(stationName)) return; 348 | // const stn_name = stationName; 349 | // return exits.map((exit) => { 350 | // const { indicator, coords } = exit; 351 | // const exit_code = indicator; 352 | // const geometry = { 353 | // type: 'Point', 354 | // coordinates: coords.reverse(), 355 | // }; 356 | 357 | // let codes = stationName2Codes(stn_name); 358 | 359 | // const joinedCodes = codes.join('-'); 360 | 361 | // const props = { 362 | // stop_type: 'entrance', 363 | // network: 'entrance', 364 | // name: exit_code.toUpperCase(), 365 | // // Custom 366 | // station_codes: joinedCodes, 367 | // }; 368 | // const opts = { 369 | // id: hash(stn_name + exit_code), 370 | // }; 371 | // const truncGeometry = truncate(geometry, { 372 | // coordinates: 2, 373 | // }); 374 | // const e = feature(truncGeometry, props, opts); 375 | // return e; 376 | // }); 377 | // }) 378 | // .filter(Boolean) 379 | // .flat() 380 | // .sort((a, b) => 381 | // a.properties.station_codes.localeCompare(b.properties.station_codes), 382 | // ); 383 | const exits = [...exitsList /*, ...telExitsList*/]; 384 | 385 | // STATION BUILDINGS 386 | console.log('Generate Station Buildings...'); 387 | const exitsCollection = featureCollection(exits); 388 | const stationsCollection = featureCollection(stations); 389 | const buildings = stationData.features 390 | .map((f) => { 391 | const { 392 | properties: { Description }, 393 | geometry, 394 | } = f; 395 | 396 | // Exclude stations 397 | if (//i.test(Description)) return null; 398 | 399 | const centerPoint = centerOfMass(geometry); 400 | // nearestPoint retuns value in km unit 401 | const nearPoint = nearestPoint(centerPoint, exitsCollection); 402 | const { distanceToPoint: distPoint2Exits } = nearPoint.properties; 403 | 404 | const nearStation = nearestPoint(centerPoint, stationsCollection); 405 | let nearestStation; 406 | 407 | if (distPoint2Exits < 0.2) { 408 | nearestStation = nearStation; 409 | } else { 410 | const { distanceToPoint: distPoint2Station } = nearStation.properties; 411 | if (distPoint2Station < 0.3) { 412 | nearestStation = nearStation; 413 | } 414 | } 415 | 416 | if (!nearestStation) return null; 417 | // if (nearestStation.properties.station_codes === 'NS28') { 418 | // // Exclude Marina South station 419 | // return null; 420 | // } 421 | 422 | const name = Description.match( 423 | /(NAME|INC_CRC)<\/th>\s+([^<>]*)<\/td/i, 424 | )[2].toLowerCase(); 425 | // console.log({ name, distanceToPoint }); 426 | 427 | const groundLevel = Description.match( 428 | />((under|above)ground) 449 | a.properties.station_codes.localeCompare(b.properties.station_codes), 450 | ); 451 | 452 | const geoJSON = featureCollection([ 453 | ...stations, 454 | ...exits, 455 | ...lines, 456 | ...buildings, 457 | ]); 458 | 459 | writeFile('data/v1/sg-rail.geojson', geoJSON); 460 | console.log('Stations count', stationCodes.length); 461 | writeFile('data/raw/sg-station-codes.txt', stationCodes.join(' ')); 462 | -------------------------------------------------------------------------------- /sg-rail-preview.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Singapore Rail Data Preview 7 | 8 | 9 | 50 | 51 | 52 |
Loading Singapore Rail Data...
53 |
54 |
55 |

Singapore Rail Data

56 |
Loading...
57 |
58 | 59 | 385 | 386 | 387 | -------------------------------------------------------------------------------- /data/raw/tel-line.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | 103.78566584437888, 4 | 1.4487228481203833 5 | ], 6 | [ 7 | 103.7858045, 8 | 1.4484581 9 | ], 10 | [ 11 | 103.7872172, 12 | 1.4457877 13 | ], 14 | [ 15 | 103.7880123, 16 | 1.4441421 17 | ], 18 | [ 19 | 103.788625, 20 | 1.4431427 21 | ], 22 | [ 23 | 103.7889861, 24 | 1.4424558 25 | ], 26 | [ 27 | 103.7891371, 28 | 1.4418685 29 | ], 30 | [ 31 | 103.7891692, 32 | 1.4413399 33 | ], 34 | [ 35 | 103.78908, 36 | 1.440696 37 | ], 38 | [ 39 | 103.788955, 40 | 1.4403565 41 | ], 42 | [ 43 | 103.7887878, 44 | 1.4400132 45 | ], 46 | [ 47 | 103.7882665, 48 | 1.4392128 49 | ], 50 | [ 51 | 103.7880492, 52 | 1.4386959 53 | ], 54 | [ 55 | 103.7879608, 56 | 1.4382843 57 | ], 58 | [ 59 | 103.7879391, 60 | 1.4378588 61 | ], 62 | [ 63 | 103.7879681, 64 | 1.4374941 65 | ], 66 | [ 67 | 103.7881226, 68 | 1.4362549 69 | ], 70 | [ 71 | 103.788336, 72 | 1.4345427 73 | ], 74 | [ 75 | 103.7883482, 76 | 1.4342802 77 | ], 78 | [ 79 | 103.7882897, 80 | 1.4337954 81 | ], 82 | [ 83 | 103.7882002, 84 | 1.4333227 85 | ], 86 | [ 87 | 103.7880552, 88 | 1.4327844 89 | ], 90 | [ 91 | 103.7879496, 92 | 1.4320826 93 | ], 94 | [ 95 | 103.7879978, 96 | 1.4314765 97 | ], 98 | [ 99 | 103.7880847, 100 | 1.431016 101 | ], 102 | [ 103 | 103.7882645, 104 | 1.4304992 105 | ], 106 | [ 107 | 103.788429, 108 | 1.4301973 109 | ], 110 | [ 111 | 103.78881, 112 | 1.4296654 113 | ], 114 | [ 115 | 103.7892265, 116 | 1.4292767 117 | ], 118 | [ 119 | 103.7896598, 120 | 1.4289903 121 | ], 122 | [ 123 | 103.7901202, 124 | 1.4287508 125 | ], 126 | [ 127 | 103.7909458, 128 | 1.4284573 129 | ], 130 | [ 131 | 103.7916109, 132 | 1.4282185 133 | ], 134 | [ 135 | 103.7929602, 136 | 1.4276519 137 | ], 138 | [ 139 | 103.7937603, 140 | 1.4273684 141 | ], 142 | [ 143 | 103.7944618, 144 | 1.4271055 145 | ], 146 | [ 147 | 103.7948858, 148 | 1.4268942 149 | ], 150 | [ 151 | 103.7948858, 152 | 1.4268942 153 | ], 154 | [ 155 | 103.7948858, 156 | 1.4268942 157 | ], 158 | [ 159 | 103.7952205, 160 | 1.4267504 161 | ], 162 | [ 163 | 103.7955312, 164 | 1.4265956 165 | ], 166 | [ 167 | 103.7958695, 168 | 1.4263497 169 | ], 170 | [ 171 | 103.7962253, 172 | 1.4260251 173 | ], 174 | [ 175 | 103.7966903, 176 | 1.4254716 177 | ], 178 | [ 179 | 103.7972123, 180 | 1.4247057 181 | ], 182 | [ 183 | 103.7985116, 184 | 1.4227656 185 | ], 186 | [ 187 | 103.8004728, 188 | 1.4202174 189 | ], 190 | [ 191 | 103.8005343, 192 | 1.4201332 193 | ], 194 | [ 195 | 103.8018747, 196 | 1.4182994 197 | ], 198 | [ 199 | 103.8021111, 200 | 1.4180225 201 | ], 202 | [ 203 | 103.8023055, 204 | 1.4178102 205 | ], 206 | [ 207 | 103.8025361, 208 | 1.4175843 209 | ], 210 | [ 211 | 103.8027801, 212 | 1.4173505 213 | ], 214 | [ 215 | 103.8036807, 216 | 1.4166016 217 | ], 218 | [ 219 | 103.8047378, 220 | 1.4156589 221 | ], 222 | [ 223 | 103.8054417, 224 | 1.4148658 225 | ], 226 | [ 227 | 103.8056841, 228 | 1.4145578 229 | ], 230 | [ 231 | 103.8062006, 232 | 1.4139166 233 | ], 234 | [ 235 | 103.8065762, 236 | 1.4134119 237 | ], 238 | [ 239 | 103.8067969, 240 | 1.413069 241 | ], 242 | [ 243 | 103.8069569, 244 | 1.4126948 245 | ], 246 | [ 247 | 103.807036, 248 | 1.412373 249 | ], 250 | [ 251 | 103.8070832, 252 | 1.4120215 253 | ], 254 | [ 255 | 103.807134, 256 | 1.411537 257 | ], 258 | [ 259 | 103.8072115, 260 | 1.4110262 261 | ], 262 | [ 263 | 103.8073161, 264 | 1.4106535 265 | ], 266 | [ 267 | 103.8080004, 268 | 1.4088265 269 | ], 270 | [ 271 | 103.8085502, 272 | 1.4075285 273 | ], 274 | [ 275 | 103.8088059, 276 | 1.4070193 277 | ], 278 | [ 279 | 103.8093706, 280 | 1.4061425 281 | ], 282 | [ 283 | 103.8099107, 284 | 1.4053666 285 | ], 286 | [ 287 | 103.8108448, 288 | 1.4042146 289 | ], 290 | [ 291 | 103.811244, 292 | 1.4036372 293 | ], 294 | [ 295 | 103.8115041, 296 | 1.4033104 297 | ], 298 | [ 299 | 103.81179, 300 | 1.403043 301 | ], 302 | [ 303 | 103.8121045, 304 | 1.4028378 305 | ], 306 | [ 307 | 103.812562, 308 | 1.4026287 309 | ], 310 | [ 311 | 103.8131231, 312 | 1.4024572 313 | ], 314 | [ 315 | 103.8135506, 316 | 1.4024062 317 | ], 318 | [ 319 | 103.8139891, 320 | 1.4023964 321 | ], 322 | [ 323 | 103.8146385, 324 | 1.402364 325 | ], 326 | [ 327 | 103.8152167, 328 | 1.4022826 329 | ], 330 | [ 331 | 103.8155719, 332 | 1.40218 333 | ], 334 | [ 335 | 103.8159338, 336 | 1.4020148 337 | ], 338 | [ 339 | 103.8163438, 340 | 1.4017516 341 | ], 342 | [ 343 | 103.816695, 344 | 1.4014269 345 | ], 346 | [ 347 | 103.8169883, 348 | 1.4010651 349 | ], 350 | [ 351 | 103.817322, 352 | 1.4004527 353 | ], 354 | [ 355 | 103.8177373, 356 | 1.3991246 357 | ], 358 | [ 359 | 103.8180641, 360 | 1.3982167 361 | ], 362 | [ 363 | 103.8184033, 364 | 1.3973347 365 | ], 366 | [ 367 | 103.8186993, 368 | 1.3966038 369 | ], 370 | [ 371 | 103.8189833, 372 | 1.3960583 373 | ], 374 | [ 375 | 103.8193373, 376 | 1.3956428 377 | ], 378 | [ 379 | 103.8208554, 380 | 1.3943101 381 | ], 382 | [ 383 | 103.8224506, 384 | 1.3927078 385 | ], 386 | [ 387 | 103.8238478, 388 | 1.3918534 389 | ], 390 | [ 391 | 103.8258388, 392 | 1.3909923 393 | ], 394 | [ 395 | 103.8317553, 396 | 1.388003 397 | ], 398 | [ 399 | 103.8347776, 400 | 1.3864571 401 | ], 402 | [ 403 | 103.8353282, 404 | 1.3861072 405 | ], 406 | [ 407 | 103.835717, 408 | 1.3857927 409 | ], 410 | [ 411 | 103.8361919, 412 | 1.3853577 413 | ], 414 | [ 415 | 103.8366337, 416 | 1.3849405 417 | ], 418 | [ 419 | 103.8373233, 420 | 1.3842893 421 | ], 422 | [ 423 | 103.8379808, 424 | 1.3834576 425 | ], 426 | [ 427 | 103.839254, 428 | 1.3814675 429 | ], 430 | [ 431 | 103.8396232, 432 | 1.3807831 433 | ], 434 | [ 435 | 103.8398269, 436 | 1.3800687 437 | ], 438 | [ 439 | 103.8398689, 440 | 1.3794681 441 | ], 442 | [ 443 | 103.8398076, 444 | 1.3789111 445 | ], 446 | [ 447 | 103.8396084, 448 | 1.3771311 449 | ], 450 | [ 451 | 103.839485, 452 | 1.376542 453 | ], 454 | [ 455 | 103.8393443, 456 | 1.3761424 457 | ], 458 | [ 459 | 103.8390943, 460 | 1.375742 461 | ], 462 | [ 463 | 103.8388684, 464 | 1.3754621 465 | ], 466 | [ 467 | 103.8379535, 468 | 1.3746397 469 | ], 470 | [ 471 | 103.8378138, 472 | 1.3744915 473 | ], 474 | [ 475 | 103.8375795, 476 | 1.3742184 477 | ], 478 | [ 479 | 103.8373964, 480 | 1.3739356 481 | ], 482 | [ 483 | 103.8372783, 484 | 1.3737144 485 | ], 486 | [ 487 | 103.8372515, 488 | 1.3736444 489 | ], 490 | [ 491 | 103.8371544, 492 | 1.3733187 493 | ], 494 | [ 495 | 103.837047, 496 | 1.3729063 497 | ], 498 | [ 499 | 103.8369397, 500 | 1.3724697 501 | ], 502 | [ 503 | 103.8368595, 504 | 1.3721204 505 | ], 506 | [ 507 | 103.8367557, 508 | 1.37153 509 | ], 510 | [ 511 | 103.8366564, 512 | 1.3708211 513 | ], 514 | [ 515 | 103.8365578, 516 | 1.3703105 517 | ], 518 | [ 519 | 103.8364393, 520 | 1.3696632 521 | ], 522 | [ 523 | 103.8358741, 524 | 1.3667098 525 | ], 526 | [ 527 | 103.8356496, 528 | 1.3660457 529 | ], 530 | [ 531 | 103.8354793, 532 | 1.3657126 533 | ], 534 | [ 535 | 103.8353173, 536 | 1.3654792 537 | ], 538 | [ 539 | 103.8350997, 540 | 1.3652182 541 | ], 542 | [ 543 | 103.8347997, 544 | 1.364906 545 | ], 546 | [ 547 | 103.8342677, 548 | 1.3644117 549 | ], 550 | [ 551 | 103.8334758, 552 | 1.3637045 553 | ], 554 | [ 555 | 103.8321818, 556 | 1.3625579 557 | ], 558 | [ 559 | 103.8314047, 560 | 1.3618857 561 | ], 562 | [ 563 | 103.8306659, 564 | 1.3612499 565 | ], 566 | [ 567 | 103.8297263, 568 | 1.3604385 569 | ], 570 | [ 571 | 103.8293853, 572 | 1.3599682 573 | ], 574 | [ 575 | 103.8291116, 576 | 1.3595602 577 | ], 578 | [ 579 | 103.8289049, 580 | 1.359098 581 | ], 582 | [ 583 | 103.8288551, 584 | 1.3588846 585 | ], 586 | [ 587 | 103.8288211, 588 | 1.3586061 589 | ], 590 | [ 591 | 103.8288049, 592 | 1.3582989 593 | ], 594 | [ 595 | 103.8288265, 596 | 1.3580183 597 | ], 598 | [ 599 | 103.8288827, 600 | 1.3577544 601 | ], 602 | [ 603 | 103.8290264, 604 | 1.3573649 605 | ], 606 | [ 607 | 103.8293263, 608 | 1.3570029 609 | ], 610 | [ 611 | 103.8298334, 612 | 1.3564728 613 | ], 614 | [ 615 | 103.8303473, 616 | 1.3559869 617 | ], 618 | [ 619 | 103.8306252, 620 | 1.3557486 621 | ], 622 | [ 623 | 103.8311744, 624 | 1.3554071 625 | ], 626 | [ 627 | 103.8313778, 628 | 1.3553083 629 | ], 630 | [ 631 | 103.8321663, 632 | 1.3549054 633 | ], 634 | [ 635 | 103.8326808, 636 | 1.3546425 637 | ], 638 | [ 639 | 103.8332057, 640 | 1.3543627 641 | ], 642 | [ 643 | 103.8335933, 644 | 1.3540803 645 | ], 646 | [ 647 | 103.8339642, 648 | 1.3537225 649 | ], 650 | [ 651 | 103.8345226, 652 | 1.3532115 653 | ], 654 | [ 655 | 103.8350708, 656 | 1.3527141 657 | ], 658 | [ 659 | 103.8353259, 660 | 1.352421 661 | ], 662 | [ 663 | 103.8355023, 664 | 1.3521453 665 | ], 666 | [ 667 | 103.8356357, 668 | 1.3518498 669 | ], 670 | [ 671 | 103.8359194, 672 | 1.3510383 673 | ], 674 | [ 675 | 103.8361126, 676 | 1.3506575 677 | ], 678 | [ 679 | 103.8363423, 680 | 1.350334 681 | ], 682 | [ 683 | 103.8370844, 684 | 1.3494391 685 | ], 686 | [ 687 | 103.8375222, 688 | 1.3488177 689 | ], 690 | [ 691 | 103.8379307, 692 | 1.3480577 693 | ], 694 | [ 695 | 103.8383899, 696 | 1.3469591 697 | ], 698 | [ 699 | 103.8386368, 700 | 1.3463411 701 | ], 702 | [ 703 | 103.8387685, 704 | 1.3459913 705 | ], 706 | [ 707 | 103.8388813, 708 | 1.3455852 709 | ], 710 | [ 711 | 103.8390738, 712 | 1.3446206 713 | ], 714 | [ 715 | 103.8392965, 716 | 1.3429017 717 | ], 718 | [ 719 | 103.8393404, 720 | 1.3421178 721 | ], 722 | [ 723 | 103.8393539, 724 | 1.3412931 725 | ], 726 | [ 727 | 103.8393699, 728 | 1.3407918 729 | ], 730 | [ 731 | 103.8394095, 732 | 1.340519 733 | ], 734 | [ 735 | 103.8395466, 736 | 1.3400135 737 | ], 738 | [ 739 | 103.8397059, 740 | 1.3396416 741 | ], 742 | [ 743 | 103.8398363, 744 | 1.3394064 745 | ], 746 | [ 747 | 103.8399954, 748 | 1.3390915 749 | ], 750 | [ 751 | 103.8401571, 752 | 1.3386686 753 | ], 754 | [ 755 | 103.8402133, 756 | 1.3381446 757 | ], 758 | [ 759 | 103.8402259, 760 | 1.3375869 761 | ], 762 | [ 763 | 103.8402726, 764 | 1.335518 765 | ], 766 | [ 767 | 103.8403457, 768 | 1.3331865 769 | ], 770 | [ 771 | 103.8403393, 772 | 1.3318519 773 | ], 774 | [ 775 | 103.8402759, 776 | 1.3314891 777 | ], 778 | [ 779 | 103.8401149, 780 | 1.3310613 781 | ], 782 | [ 783 | 103.8399032, 784 | 1.3306476 785 | ], 786 | [ 787 | 103.8396853, 788 | 1.3303504 789 | ], 790 | [ 791 | 103.8393617, 792 | 1.3299987 793 | ], 794 | [ 795 | 103.8389486, 796 | 1.3296984 797 | ], 798 | [ 799 | 103.8385194, 800 | 1.3294892 801 | ], 802 | [ 803 | 103.838039, 804 | 1.3293228 805 | ], 806 | [ 807 | 103.836614, 808 | 1.328938 809 | ], 810 | [ 811 | 103.8352692, 812 | 1.3285215 813 | ], 814 | [ 815 | 103.8308682, 816 | 1.3271586 817 | ], 818 | [ 819 | 103.8295182, 820 | 1.3267454 821 | ], 822 | [ 823 | 103.8288464, 824 | 1.3265039 825 | ], 826 | [ 827 | 103.8283998, 828 | 1.326261 829 | ], 830 | [ 831 | 103.8280501, 832 | 1.325984 833 | ], 834 | [ 835 | 103.8277268, 836 | 1.325651 837 | ], 838 | [ 839 | 103.8275211, 840 | 1.3253456 841 | ], 842 | [ 843 | 103.8272676, 844 | 1.324927 845 | ], 846 | [ 847 | 103.8262899, 848 | 1.3231412 849 | ], 850 | [ 851 | 103.8258967, 852 | 1.3222898 853 | ], 854 | [ 855 | 103.8256218, 856 | 1.3216237 857 | ], 858 | [ 859 | 103.8255015, 860 | 1.3210983 861 | ], 862 | [ 863 | 103.8254847, 864 | 1.3207891 865 | ], 866 | [ 867 | 103.8254885, 868 | 1.3205288 869 | ], 870 | [ 871 | 103.8255167, 872 | 1.3202334 873 | ], 874 | [ 875 | 103.825744, 876 | 1.3186007 877 | ], 878 | [ 879 | 103.8257565, 880 | 1.3183242 881 | ], 882 | [ 883 | 103.8257247, 884 | 1.3179295 885 | ], 886 | [ 887 | 103.825609, 888 | 1.3174646 889 | ], 890 | [ 891 | 103.8253174, 892 | 1.316881 893 | ], 894 | [ 895 | 103.8230539, 896 | 1.3137251 897 | ], 898 | [ 899 | 103.8228687, 900 | 1.3134406 901 | ], 902 | [ 903 | 103.822465, 904 | 1.3125776 905 | ], 906 | [ 907 | 103.822277, 908 | 1.3122015 909 | ], 910 | [ 911 | 103.8220591, 912 | 1.3118644 913 | ], 914 | [ 915 | 103.8218801, 916 | 1.3116445 917 | ], 918 | [ 919 | 103.8216915, 920 | 1.3114476 921 | ], 922 | [ 923 | 103.8214645, 924 | 1.3112467 925 | ], 926 | [ 927 | 103.8212127, 928 | 1.3110717 929 | ], 930 | [ 931 | 103.8203634, 932 | 1.3105698 933 | ], 934 | [ 935 | 103.8200045, 936 | 1.3103111 937 | ], 938 | [ 939 | 103.8196037, 940 | 1.3099414 941 | ], 942 | [ 943 | 103.8193609, 944 | 1.3096186 945 | ], 946 | [ 947 | 103.8191929, 948 | 1.3093224 949 | ], 950 | [ 951 | 103.8190521, 952 | 1.3089827 953 | ], 954 | [ 955 | 103.8189241, 956 | 1.3086602 957 | ], 958 | [ 959 | 103.8188532, 960 | 1.3082615 961 | ], 962 | [ 963 | 103.8188316, 964 | 1.3079634 965 | ], 966 | [ 967 | 103.8188284, 968 | 1.3073817 969 | ], 970 | [ 971 | 103.8188504, 972 | 1.3059442 973 | ], 974 | [ 975 | 103.8188965, 976 | 1.3053555 977 | ], 978 | [ 979 | 103.8189967, 980 | 1.3048885 981 | ], 982 | [ 983 | 103.8191533, 984 | 1.3044396 985 | ], 986 | [ 987 | 103.8194134, 988 | 1.3039587 989 | ], 990 | [ 991 | 103.8197911, 992 | 1.3034872 993 | ], 994 | [ 995 | 103.8202905, 996 | 1.303026 997 | ], 998 | [ 999 | 103.8206465, 1000 | 1.3027853 1001 | ], 1002 | [ 1003 | 103.8210399, 1004 | 1.3025814 1005 | ], 1006 | [ 1007 | 103.8215498, 1008 | 1.3024228 1009 | ], 1010 | [ 1011 | 103.8221083, 1012 | 1.3023305 1013 | ], 1014 | [ 1015 | 103.8227828, 1016 | 1.3023541 1017 | ], 1018 | [ 1019 | 103.8233924, 1020 | 1.3024439 1021 | ], 1022 | [ 1023 | 103.8249541, 1024 | 1.3027699 1025 | ], 1026 | [ 1027 | 103.8254208, 1028 | 1.3029099 1029 | ], 1030 | [ 1031 | 103.8258525, 1032 | 1.3031301 1033 | ], 1034 | [ 1035 | 103.8262907, 1036 | 1.3034808 1037 | ], 1038 | [ 1039 | 103.8267821, 1040 | 1.3040096 1041 | ], 1042 | [ 1043 | 103.8271944, 1044 | 1.3043003 1045 | ], 1046 | [ 1047 | 103.8278559, 1048 | 1.3046246 1049 | ], 1050 | [ 1051 | 103.8282784, 1052 | 1.3047055 1053 | ], 1054 | [ 1055 | 103.8288602, 1056 | 1.3047362 1057 | ], 1058 | [ 1059 | 103.8293309, 1060 | 1.3046575 1061 | ], 1062 | [ 1063 | 103.8299104, 1064 | 1.3044422 1065 | ], 1066 | [ 1067 | 103.8303168, 1068 | 1.3042043 1069 | ], 1070 | [ 1071 | 103.8307662, 1072 | 1.3037637 1073 | ], 1074 | [ 1075 | 103.8313956, 1076 | 1.3029668 1077 | ], 1078 | [ 1079 | 103.8323199, 1080 | 1.3018889 1081 | ], 1082 | [ 1083 | 103.833415, 1084 | 1.3006837 1085 | ], 1086 | [ 1087 | 103.8337555, 1088 | 1.3001841 1089 | ], 1090 | [ 1091 | 103.8339136, 1092 | 1.2997581 1093 | ], 1094 | [ 1095 | 103.8339779, 1096 | 1.2994621 1097 | ], 1098 | [ 1099 | 103.8339919, 1100 | 1.2990196 1101 | ], 1102 | [ 1103 | 103.8339318, 1104 | 1.2983464 1105 | ], 1106 | [ 1107 | 103.8338037, 1108 | 1.2977526 1109 | ], 1110 | [ 1111 | 103.833537, 1112 | 1.2968367 1113 | ], 1114 | [ 1115 | 103.8334777, 1116 | 1.2966046 1117 | ], 1118 | [ 1119 | 103.8334434, 1120 | 1.2963863 1121 | ], 1122 | [ 1123 | 103.8334096, 1124 | 1.2958801 1125 | ], 1126 | [ 1127 | 103.8334402, 1128 | 1.2955094 1129 | ], 1130 | [ 1131 | 103.8338837, 1132 | 1.2933605 1133 | ], 1134 | [ 1135 | 103.8338902, 1136 | 1.2930036 1137 | ], 1138 | [ 1139 | 103.8338751, 1140 | 1.2927612 1141 | ], 1142 | [ 1143 | 103.8338222, 1144 | 1.2921608 1145 | ], 1146 | [ 1147 | 103.8336712, 1148 | 1.2904375 1149 | ], 1150 | [ 1151 | 103.8336619, 1152 | 1.29001 1153 | ], 1154 | [ 1155 | 103.8336374, 1156 | 1.288937 1157 | ], 1158 | [ 1159 | 103.8336484, 1160 | 1.2880742 1161 | ], 1162 | [ 1163 | 103.8336609, 1164 | 1.2870918 1165 | ], 1166 | [ 1167 | 103.8336864, 1168 | 1.2865061 1169 | ], 1170 | [ 1171 | 103.8337769, 1172 | 1.2860773 1173 | ], 1174 | [ 1175 | 103.8338918, 1176 | 1.2856953 1177 | ], 1178 | [ 1179 | 103.8340434, 1180 | 1.2853957 1181 | ], 1182 | [ 1183 | 103.834347, 1184 | 1.2849874 1185 | ], 1186 | [ 1187 | 103.8349895, 1188 | 1.2842606 1189 | ], 1190 | [ 1191 | 103.8356199, 1192 | 1.2837142 1193 | ], 1194 | [ 1195 | 103.836022, 1196 | 1.2834681 1197 | ], 1198 | [ 1199 | 103.8363623, 1200 | 1.2832957 1201 | ], 1202 | [ 1203 | 103.8373736, 1204 | 1.2828512 1205 | ], 1206 | [ 1207 | 103.838076, 1208 | 1.2824785 1209 | ], 1210 | [ 1211 | 103.8394651, 1212 | 1.2815727 1213 | ], 1214 | [ 1215 | 103.8403545, 1216 | 1.2809928 1217 | ], 1218 | [ 1219 | 103.8408897, 1220 | 1.2805993 1221 | ], 1222 | [ 1223 | 103.8412622, 1224 | 1.2803951 1225 | ], 1226 | [ 1227 | 103.8416457, 1228 | 1.2802589 1229 | ], 1230 | [ 1231 | 103.8418883, 1232 | 1.280205 1233 | ], 1234 | [ 1235 | 103.8421234, 1236 | 1.2801734 1237 | ], 1238 | [ 1239 | 103.8424863, 1240 | 1.2801606 1241 | ], 1242 | [ 1243 | 103.8428096, 1244 | 1.2801965 1245 | ], 1246 | [ 1247 | 103.8431544, 1248 | 1.2802656 1249 | ], 1250 | [ 1251 | 103.8437244, 1252 | 1.2804096 1253 | ], 1254 | [ 1255 | 103.8444142, 1256 | 1.2805838 1257 | ], 1258 | [ 1259 | 103.8448762, 1260 | 1.2806833 1261 | ], 1262 | [ 1263 | 103.8451013, 1264 | 1.28071 1265 | ], 1266 | [ 1267 | 103.8453802, 1268 | 1.2807162 1269 | ], 1270 | [ 1271 | 103.8456396, 1272 | 1.2806954 1273 | ], 1274 | [ 1275 | 103.8460024, 1276 | 1.2806219 1277 | ], 1278 | [ 1279 | 103.8463645, 1280 | 1.2804925 1281 | ], 1282 | [ 1283 | 103.8466934, 1284 | 1.2803183 1285 | ], 1286 | [ 1287 | 103.8470401, 1288 | 1.2800601 1289 | ], 1290 | [ 1291 | 103.8473088, 1292 | 1.2797861 1293 | ], 1294 | [ 1295 | 103.8477266, 1296 | 1.2794379 1297 | ], 1298 | [ 1299 | 103.8481043, 1300 | 1.2791926 1301 | ], 1302 | [ 1303 | 103.8490016, 1304 | 1.2786754 1305 | ], 1306 | [ 1307 | 103.8499544, 1308 | 1.2780305 1309 | ], 1310 | [ 1311 | 103.8526786, 1312 | 1.2762646 1313 | ], 1314 | [ 1315 | 103.8530557, 1316 | 1.2760472 1317 | ], 1318 | [ 1319 | 103.8539419, 1320 | 1.2755875 1321 | ], 1322 | [ 1323 | 103.8542819, 1324 | 1.2754011 1325 | ], 1326 | [ 1327 | 103.8556079, 1328 | 1.2745654 1329 | ], 1330 | [ 1331 | 103.8562824, 1332 | 1.274117 1333 | ], 1334 | [ 1335 | 103.8583269, 1336 | 1.272774 1337 | ], 1338 | [ 1339 | 103.8587609, 1340 | 1.2726052 1341 | ], 1342 | [ 1343 | 103.8591573, 1344 | 1.2725007 1345 | ], 1346 | [ 1347 | 103.8596362, 1348 | 1.2724472 1349 | ], 1350 | [ 1351 | 103.8600053, 1352 | 1.2724536 1353 | ], 1354 | [ 1355 | 103.8604262, 1356 | 1.2725167 1357 | ], 1358 | [ 1359 | 103.8609083, 1360 | 1.2726592 1361 | ], 1362 | [ 1363 | 103.8614719, 1364 | 1.27297 1365 | ], 1366 | [ 1367 | 103.8631463, 1368 | 1.2741363 1369 | ], 1370 | [ 1371 | 103.8647196, 1372 | 1.275232 1373 | ], 1374 | [ 1375 | 103.8655199, 1376 | 1.2758026 1377 | ], 1378 | [ 1379 | 103.8660282, 1380 | 1.2763183 1381 | ], 1382 | [ 1383 | 103.8666223, 1384 | 1.2771923 1385 | ], 1386 | [ 1387 | 103.8674398, 1388 | 1.2784611 1389 | ], 1390 | [ 1391 | 103.868042, 1392 | 1.2794176 1393 | ], 1394 | [ 1395 | 103.86807992126685, 1396 | 1.2794784538223565 1397 | ] 1398 | ] -------------------------------------------------------------------------------- /data/raw/dtl-way.json: -------------------------------------------------------------------------------- 1 | [ 2 | [ 3 | [ 4 | 103.8557942, 5 | 1.3008052 6 | ], 7 | [ 8 | 103.8554736, 9 | 1.3010947 10 | ], 11 | [ 12 | 103.854795, 13 | 1.3017222 14 | ], 15 | [ 16 | 103.8545724, 17 | 1.301985 18 | ], 19 | [ 20 | 103.8545134, 21 | 1.3020654 22 | ], 23 | [ 24 | 103.8542693, 25 | 1.3023604 26 | ], 27 | [ 28 | 103.853694, 29 | 1.3031215 30 | ], 31 | [ 32 | 103.853624, 33 | 1.3032304 34 | ] 35 | ], 36 | [ 37 | [ 38 | 103.8430739, 39 | 1.2856345 40 | ], 41 | [ 42 | 103.844097, 43 | 1.2848117 44 | ], 45 | [ 46 | 103.8451046, 47 | 1.2842318 48 | ], 49 | [ 50 | 103.8462224, 51 | 1.2835885 52 | ], 53 | [ 54 | 103.8483554, 55 | 1.2823577 56 | ], 57 | [ 58 | 103.8486744, 59 | 1.2821736 60 | ], 61 | [ 62 | 103.8507392, 63 | 1.2809821 64 | ], 65 | [ 66 | 103.8515205, 67 | 1.2803842 68 | ], 69 | [ 70 | 103.8519406, 71 | 1.2800819 72 | ], 73 | [ 74 | 103.8523248, 75 | 1.2798014 76 | ], 77 | [ 78 | 103.8528373, 79 | 1.2794465 80 | ], 81 | [ 82 | 103.8532304, 83 | 1.2791743 84 | ], 85 | [ 86 | 103.8540673, 87 | 1.2786621 88 | ], 89 | [ 90 | 103.854508, 91 | 1.2784861 92 | ], 93 | [ 94 | 103.8548674, 95 | 1.2784136 96 | ], 97 | [ 98 | 103.8554464, 99 | 1.2783943 100 | ], 101 | [ 102 | 103.8560653, 103 | 1.2785161 104 | ], 105 | [ 106 | 103.8566575, 107 | 1.2787911 108 | ], 109 | [ 110 | 103.8569834, 111 | 1.2790296 112 | ], 113 | [ 114 | 103.8573173, 115 | 1.2793766 116 | ], 117 | [ 118 | 103.8578567, 119 | 1.2799588 120 | ], 121 | [ 122 | 103.8580311, 123 | 1.2801208 124 | ], 125 | [ 126 | 103.8582459, 127 | 1.2803897 128 | ], 129 | [ 130 | 103.8586333, 131 | 1.2809941 132 | ], 133 | [ 134 | 103.8589234, 135 | 1.281458 136 | ], 137 | [ 138 | 103.8597441, 139 | 1.2826608 140 | ], 141 | [ 142 | 103.8603791, 143 | 1.2838513 144 | ], 145 | [ 146 | 103.8606527, 147 | 1.2843233 148 | ], 149 | [ 150 | 103.8609584, 151 | 1.2851599 152 | ], 153 | [ 154 | 103.8610711, 155 | 1.285841 156 | ], 157 | [ 158 | 103.8610765, 159 | 1.2866508 160 | ], 161 | [ 162 | 103.861129, 163 | 1.2879638 164 | ], 165 | [ 166 | 103.8611193, 167 | 1.2895522 168 | ], 169 | [ 170 | 103.8609399, 171 | 1.2907868 172 | ], 173 | [ 174 | 103.8609264, 175 | 1.2914437 176 | ], 177 | [ 178 | 103.8609504, 179 | 1.292573 180 | ], 181 | [ 182 | 103.8609744, 183 | 1.2937022 184 | ] 185 | ], 186 | [ 187 | [ 188 | 103.853624, 189 | 1.3032304 190 | ], 191 | [ 192 | 103.8526118, 193 | 1.3039839 194 | ], 195 | [ 196 | 103.8521079, 197 | 1.3042971 198 | ], 199 | [ 200 | 103.8507885, 201 | 1.3052506 202 | ], 203 | [ 204 | 103.8492436, 205 | 1.3066201 206 | ], 207 | [ 208 | 103.8474466, 209 | 1.3082131 210 | ], 211 | [ 212 | 103.8449931, 213 | 1.3103012 214 | ], 215 | [ 216 | 103.8444203, 217 | 1.3105793 218 | ], 219 | [ 220 | 103.8436049, 221 | 1.3108046 222 | ], 223 | [ 224 | 103.8416791, 225 | 1.3113033 226 | ], 227 | [ 228 | 103.8401174, 229 | 1.3119073 230 | ], 231 | [ 232 | 103.8395441, 233 | 1.3121614 234 | ], 235 | [ 236 | 103.839061, 237 | 1.3125064 238 | ], 239 | [ 240 | 103.838021, 241 | 1.313657 242 | ], 243 | [ 244 | 103.8375225, 245 | 1.314218 246 | ], 247 | [ 248 | 103.8367183, 249 | 1.3154805 250 | ], 251 | [ 252 | 103.8348962, 253 | 1.3171975 254 | ], 255 | [ 256 | 103.8273688, 257 | 1.3197592 258 | ], 259 | [ 260 | 103.8259069, 261 | 1.320253 262 | ], 263 | [ 264 | 103.8235546, 265 | 1.3210202 266 | ], 267 | [ 268 | 103.8214928, 269 | 1.3218246 270 | ], 271 | [ 272 | 103.8161926, 273 | 1.3225034 274 | ], 275 | [ 276 | 103.8154843, 277 | 1.3225941 278 | ], 279 | [ 280 | 103.8142569, 281 | 1.3228552 282 | ], 283 | [ 284 | 103.8116974, 285 | 1.3232038 286 | ], 287 | [ 288 | 103.8111877, 289 | 1.3233486 290 | ], 291 | [ 292 | 103.8106781, 293 | 1.3235953 294 | ], 295 | [ 296 | 103.8091232, 297 | 1.3247189 298 | ], 299 | [ 300 | 103.8069722, 301 | 1.326052 302 | ], 303 | [ 304 | 103.8056526, 305 | 1.3268239 306 | ], 307 | [ 308 | 103.8025403, 309 | 1.3288564 310 | ], 311 | [ 312 | 103.8019292, 313 | 1.3291375 314 | ], 315 | [ 316 | 103.7972638, 317 | 1.3308228 318 | ], 319 | [ 320 | 103.786418, 321 | 1.3347005 322 | ], 323 | [ 324 | 103.7850862, 325 | 1.3351466 326 | ], 327 | [ 328 | 103.7838043, 329 | 1.3356235 330 | ], 331 | [ 332 | 103.7824, 333 | 1.336146 334 | ], 335 | [ 336 | 103.7814446, 337 | 1.336568 338 | ], 339 | [ 340 | 103.7793906, 341 | 1.3372826 342 | ], 343 | [ 344 | 103.7784017, 345 | 1.3376514 346 | ], 347 | [ 348 | 103.7779673, 349 | 1.3378896 350 | ], 351 | [ 352 | 103.7778462, 353 | 1.3379547 354 | ], 355 | [ 356 | 103.777754, 357 | 1.338038 358 | ], 359 | [ 360 | 103.7771975, 361 | 1.3385386 362 | ], 363 | [ 364 | 103.7771305, 365 | 1.3386108 366 | ], 367 | [ 368 | 103.7767722, 369 | 1.3390181 370 | ], 371 | [ 372 | 103.7764254, 373 | 1.3394106 374 | ], 375 | [ 376 | 103.7762572, 377 | 1.3396929 378 | ], 379 | [ 380 | 103.7760938, 381 | 1.3399675 382 | ], 383 | [ 384 | 103.7758815, 385 | 1.3405285 386 | ], 387 | [ 388 | 103.7757592, 389 | 1.3411198 390 | ], 391 | [ 392 | 103.7755195, 393 | 1.3422791 394 | ], 395 | [ 396 | 103.7752312, 397 | 1.3435425 398 | ], 399 | [ 400 | 103.7751379, 401 | 1.3439139 402 | ], 403 | [ 404 | 103.7749907, 405 | 1.3442932 406 | ], 407 | [ 408 | 103.7748354, 409 | 1.3445208 410 | ], 411 | [ 412 | 103.774575, 413 | 1.3448688 414 | ], 415 | [ 416 | 103.7741855, 417 | 1.3452207 418 | ], 419 | [ 420 | 103.773719, 421 | 1.3455047 422 | ], 423 | [ 424 | 103.77257, 425 | 1.3461554 426 | ], 427 | [ 428 | 103.77196, 429 | 1.3467221 430 | ], 431 | [ 432 | 103.7717723, 433 | 1.3469808 434 | ], 435 | [ 436 | 103.7713677, 437 | 1.3475493 438 | ], 439 | [ 440 | 103.7705489, 441 | 1.3486959 442 | ], 443 | [ 444 | 103.7703618, 445 | 1.349119 446 | ], 447 | [ 448 | 103.77003, 449 | 1.3521493 450 | ], 451 | [ 452 | 103.7695501, 453 | 1.3537713 454 | ], 455 | [ 456 | 103.7692862, 457 | 1.3546552 458 | ], 459 | [ 460 | 103.7690359, 461 | 1.3553294 462 | ], 463 | [ 464 | 103.7688677, 465 | 1.3556527 466 | ], 467 | [ 468 | 103.7685898, 469 | 1.3560254 470 | ], 471 | [ 472 | 103.7677949, 473 | 1.3571548 474 | ], 475 | [ 476 | 103.7676723, 477 | 1.3573842 478 | ], 479 | [ 480 | 103.7676016, 481 | 1.3579036 482 | ], 483 | [ 484 | 103.7675134, 485 | 1.3585258 486 | ], 487 | [ 488 | 103.7674469, 489 | 1.3590155 490 | ], 491 | [ 492 | 103.7671994, 493 | 1.3614228 494 | ], 495 | [ 496 | 103.7672579, 497 | 1.3616689 498 | ] 499 | ], 500 | [ 501 | [ 502 | 103.9621796, 503 | 1.3355533 504 | ], 505 | [ 506 | 103.9605799, 507 | 1.3368651 508 | ], 509 | [ 510 | 103.9603883, 511 | 1.3371422 512 | ], 513 | [ 514 | 103.9602687, 515 | 1.3374926 516 | ], 517 | [ 518 | 103.9602461, 519 | 1.3378581 520 | ], 521 | [ 522 | 103.9602998, 523 | 1.3385017 524 | ], 525 | [ 526 | 103.9603867, 527 | 1.3389406 528 | ], 529 | [ 530 | 103.9606925, 531 | 1.3395413 532 | ], 533 | [ 534 | 103.9611485, 535 | 1.3410053 536 | ], 537 | [ 538 | 103.961344, 539 | 1.3416575 540 | ], 541 | [ 542 | 103.9634284, 543 | 1.34861 544 | ], 545 | [ 546 | 103.9636145, 547 | 1.3508583 548 | ], 549 | [ 550 | 103.9637008, 551 | 1.3518952 552 | ], 553 | [ 554 | 103.963731, 555 | 1.3526613 556 | ], 557 | [ 558 | 103.9637132, 559 | 1.3529898 560 | ], 561 | [ 562 | 103.9636628, 563 | 1.3533229 564 | ], 565 | [ 566 | 103.9634907, 567 | 1.354051 568 | ], 569 | [ 570 | 103.9631558, 571 | 1.3552031 572 | ], 573 | [ 574 | 103.962963, 575 | 1.3558113 576 | ], 577 | [ 578 | 103.9628727, 579 | 1.3560529 580 | ], 581 | [ 582 | 103.9627529, 583 | 1.3562973 584 | ], 585 | [ 586 | 103.9625974, 587 | 1.356537 588 | ], 589 | [ 590 | 103.9625128, 591 | 1.3566369 592 | ], 593 | [ 594 | 103.9624262, 595 | 1.3567246 596 | ], 597 | [ 598 | 103.9623266, 599 | 1.3568085 600 | ], 601 | [ 602 | 103.9622066, 603 | 1.3568852 604 | ], 605 | [ 606 | 103.9620581, 607 | 1.3569642 608 | ], 609 | [ 610 | 103.9619056, 611 | 1.3570382 612 | ], 613 | [ 614 | 103.961673, 615 | 1.3571321 616 | ], 617 | [ 618 | 103.9614263, 619 | 1.3572157 620 | ], 621 | [ 622 | 103.9611855, 623 | 1.357283 624 | ], 625 | [ 626 | 103.9609392, 627 | 1.3573399 628 | ], 629 | [ 630 | 103.9607068, 631 | 1.3573807 632 | ], 633 | [ 634 | 103.9604743, 635 | 1.3574059 636 | ], 637 | [ 638 | 103.9600586, 639 | 1.3574339 640 | ], 641 | [ 642 | 103.9598178, 643 | 1.3574292 644 | ], 645 | [ 646 | 103.959577, 647 | 1.3574105 648 | ], 649 | [ 650 | 103.9593486, 651 | 1.3573835 652 | ], 653 | [ 654 | 103.9591238, 655 | 1.3573483 656 | ], 657 | [ 658 | 103.9588743, 659 | 1.3572972 660 | ], 661 | [ 662 | 103.9586283, 663 | 1.3572309 664 | ], 665 | [ 666 | 103.9584244, 667 | 1.3571626 668 | ], 669 | [ 670 | 103.9582241, 671 | 1.3570786 672 | ], 673 | [ 674 | 103.9580271, 675 | 1.3569787 676 | ], 677 | [ 678 | 103.9574614, 679 | 1.3566049 680 | ], 681 | [ 682 | 103.95718, 683 | 1.3564513 684 | ], 685 | [ 686 | 103.9568594, 687 | 1.3563235 688 | ], 689 | [ 690 | 103.9565219, 691 | 1.3562433 692 | ], 693 | [ 694 | 103.9561762, 695 | 1.3561996 696 | ], 697 | [ 698 | 103.9558028, 699 | 1.356165 700 | ], 701 | [ 702 | 103.9554157, 703 | 1.3561451 704 | ], 705 | [ 706 | 103.955007, 707 | 1.3561487 708 | ], 709 | [ 710 | 103.9534865, 711 | 1.3561975 712 | ], 713 | [ 714 | 103.9519904, 715 | 1.356354 716 | ], 717 | [ 718 | 103.9503474, 719 | 1.3566072 720 | ], 721 | [ 722 | 103.9494529, 723 | 1.3566943 724 | ], 725 | [ 726 | 103.945429, 727 | 1.3567119 728 | ], 729 | [ 730 | 103.944869, 731 | 1.3566311 732 | ], 733 | [ 734 | 103.9443934, 735 | 1.3564235 736 | ], 737 | [ 738 | 103.9432612, 739 | 1.35545 740 | ], 741 | [ 742 | 103.9432269, 743 | 1.3554146 744 | ], 745 | [ 746 | 103.9430609, 747 | 1.3552399 748 | ], 749 | [ 750 | 103.9425088, 751 | 1.3546587 752 | ], 753 | [ 754 | 103.9418782, 755 | 1.3542143 756 | ], 757 | [ 758 | 103.94128, 759 | 1.3538588 760 | ], 761 | [ 762 | 103.9405708, 763 | 1.3533705 764 | ], 765 | [ 766 | 103.9399521, 767 | 1.3527724 768 | ], 769 | [ 770 | 103.9387771, 771 | 1.3511934 772 | ], 773 | [ 774 | 103.9385906, 775 | 1.3509976 776 | ], 777 | [ 778 | 103.9384774, 779 | 1.350845 780 | ], 781 | [ 782 | 103.9383853, 783 | 1.3506915 784 | ], 785 | [ 786 | 103.9382584, 787 | 1.3504782 788 | ], 789 | [ 790 | 103.9382018, 791 | 1.3503316 792 | ], 793 | [ 794 | 103.9381852, 795 | 1.3501291 796 | ], 797 | [ 798 | 103.9381807, 799 | 1.349967 800 | ], 801 | [ 802 | 103.9382734, 803 | 1.3488539 804 | ], 805 | [ 806 | 103.9382786, 807 | 1.3487909 808 | ], 809 | [ 810 | 103.9382805, 811 | 1.348768 812 | ], 813 | [ 814 | 103.9382864, 815 | 1.3486977 816 | ], 817 | [ 818 | 103.9382645, 819 | 1.3490044 820 | ], 821 | [ 822 | 103.9383091, 823 | 1.348425 824 | ], 825 | [ 826 | 103.9383218, 827 | 1.3482607 828 | ], 829 | [ 830 | 103.9383835, 831 | 1.3475098 832 | ], 833 | [ 834 | 103.9385, 835 | 1.3461264 836 | ], 837 | [ 838 | 103.9385087, 839 | 1.3454132 840 | ], 841 | [ 842 | 103.9385149, 843 | 1.3448997 844 | ], 845 | [ 846 | 103.9385276, 847 | 1.3447542 848 | ], 849 | [ 850 | 103.9385465, 851 | 1.3446302 852 | ], 853 | [ 854 | 103.9385664, 855 | 1.3445386 856 | ], 857 | [ 858 | 103.9385954, 859 | 1.3444278 860 | ], 861 | [ 862 | 103.9394363, 863 | 1.3415792 864 | ], 865 | [ 866 | 103.9398729, 867 | 1.3401003 868 | ], 869 | [ 870 | 103.9398993, 871 | 1.3400046 872 | ], 873 | [ 874 | 103.9399216, 875 | 1.3399078 876 | ], 877 | [ 878 | 103.9399399, 879 | 1.3398102 880 | ], 881 | [ 882 | 103.9399541, 883 | 1.3397119 884 | ], 885 | [ 886 | 103.9399641, 887 | 1.3396131 888 | ], 889 | [ 890 | 103.93997, 891 | 1.339514 892 | ], 893 | [ 894 | 103.9399717, 895 | 1.3394147 896 | ], 897 | [ 898 | 103.9399693, 899 | 1.3393154 900 | ], 901 | [ 902 | 103.9399627, 903 | 1.3392164 904 | ], 905 | [ 906 | 103.9399519, 907 | 1.3391176 908 | ], 909 | [ 910 | 103.939937, 911 | 1.3390195 912 | ], 913 | [ 914 | 103.9399181, 915 | 1.338922 916 | ], 917 | [ 918 | 103.939895, 919 | 1.3388254 920 | ], 921 | [ 922 | 103.939868, 923 | 1.3387298 924 | ], 925 | [ 926 | 103.9398369, 927 | 1.3386355 928 | ], 929 | [ 930 | 103.939802, 931 | 1.3385426 932 | ], 933 | [ 934 | 103.9397631, 935 | 1.3384512 936 | ], 937 | [ 938 | 103.9397205, 939 | 1.3383615 940 | ], 941 | [ 942 | 103.9396741, 943 | 1.3382736 944 | ], 945 | [ 946 | 103.9396241, 947 | 1.3381878 948 | ], 949 | [ 950 | 103.9395706, 951 | 1.3381042 952 | ], 953 | [ 954 | 103.9395136, 955 | 1.3380229 956 | ], 957 | [ 958 | 103.9394533, 959 | 1.337944 960 | ], 961 | [ 962 | 103.9393896, 963 | 1.3378677 964 | ], 965 | [ 966 | 103.9393229, 967 | 1.3377942 968 | ], 969 | [ 970 | 103.9392531, 971 | 1.3377235 972 | ], 973 | [ 974 | 103.9391805, 975 | 1.3376558 976 | ], 977 | [ 978 | 103.939105, 979 | 1.3375912 980 | ], 981 | [ 982 | 103.9390269, 983 | 1.3375298 984 | ], 985 | [ 986 | 103.9389463, 987 | 1.3374718 988 | ], 989 | [ 990 | 103.9388634, 991 | 1.3374172 992 | ], 993 | [ 994 | 103.9387782, 995 | 1.3373661 996 | ], 997 | [ 998 | 103.938691, 999 | 1.3373186 1000 | ], 1001 | [ 1002 | 103.9386019, 1003 | 1.3372748 1004 | ], 1005 | [ 1006 | 103.938511, 1007 | 1.3372347 1008 | ], 1009 | [ 1010 | 103.9384192, 1011 | 1.3371988 1012 | ], 1013 | [ 1014 | 103.938326, 1015 | 1.3371667 1016 | ], 1017 | [ 1018 | 103.9382315, 1019 | 1.3371385 1020 | ], 1021 | [ 1022 | 103.9381359, 1023 | 1.3371143 1024 | ], 1025 | [ 1026 | 103.9380395, 1027 | 1.3370941 1028 | ], 1029 | [ 1030 | 103.9379422, 1031 | 1.3370778 1032 | ], 1033 | [ 1034 | 103.9363149, 1035 | 1.3368916 1036 | ], 1037 | [ 1038 | 103.9338362, 1039 | 1.3366516 1040 | ], 1041 | [ 1042 | 103.9337565, 1043 | 1.3366504 1044 | ], 1045 | [ 1046 | 103.9336802, 1047 | 1.3366543 1048 | ], 1049 | [ 1050 | 103.9330263, 1051 | 1.3366957 1052 | ], 1053 | [ 1054 | 103.9321489, 1055 | 1.3367222 1056 | ], 1057 | [ 1058 | 103.9312232, 1059 | 1.3367446 1060 | ], 1061 | [ 1062 | 103.9311747, 1063 | 1.3367436 1064 | ], 1065 | [ 1066 | 103.9311244, 1067 | 1.3367403 1068 | ], 1069 | [ 1070 | 103.9310082, 1071 | 1.3367287 1072 | ], 1073 | [ 1074 | 103.9308318, 1075 | 1.3367046 1076 | ], 1077 | [ 1078 | 103.9306602, 1079 | 1.3366748 1080 | ], 1081 | [ 1082 | 103.9278876, 1083 | 1.3361818 1084 | ], 1085 | [ 1086 | 103.9276499, 1087 | 1.3361283 1088 | ], 1089 | [ 1090 | 103.927418, 1091 | 1.3360626 1092 | ], 1093 | [ 1094 | 103.9271904, 1095 | 1.3359831 1096 | ], 1097 | [ 1098 | 103.9222636, 1099 | 1.3339655 1100 | ], 1101 | [ 1102 | 103.9220433, 1103 | 1.3338743 1104 | ], 1105 | [ 1106 | 103.9218162, 1107 | 1.3338015 1108 | ], 1109 | [ 1110 | 103.9215839, 1111 | 1.3337476 1112 | ], 1113 | [ 1114 | 103.921348, 1115 | 1.3337128 1116 | ], 1117 | [ 1118 | 103.92111, 1119 | 1.3336975 1120 | ], 1121 | [ 1122 | 103.9208716, 1123 | 1.3337017 1124 | ], 1125 | [ 1126 | 103.9206343, 1127 | 1.3337255 1128 | ], 1129 | [ 1130 | 103.9203998, 1131 | 1.3337686 1132 | ] 1133 | ], 1134 | [ 1135 | [ 1136 | 103.8503754, 1137 | 1.2989735 1138 | ], 1139 | [ 1140 | 103.8492735, 1141 | 1.2976847 1142 | ], 1143 | [ 1144 | 103.8480364, 1145 | 1.2965009 1146 | ], 1147 | [ 1148 | 103.8461886, 1149 | 1.2951059 1150 | ], 1151 | [ 1152 | 103.845849, 1153 | 1.2948495 1154 | ], 1155 | [ 1156 | 103.8446501, 1157 | 1.2930011 1158 | ], 1159 | [ 1160 | 103.8444288, 1161 | 1.2926728 1162 | ], 1163 | [ 1164 | 103.8443355, 1165 | 1.2925342 1166 | ], 1167 | [ 1168 | 103.8435455, 1169 | 1.2912898 1170 | ], 1171 | [ 1172 | 103.8431749, 1173 | 1.2902896 1174 | ], 1175 | [ 1176 | 103.8430702, 1177 | 1.2894774 1178 | ], 1179 | [ 1180 | 103.8429511, 1181 | 1.2888997 1182 | ], 1183 | [ 1184 | 103.8427109, 1185 | 1.2882868 1186 | ], 1187 | [ 1188 | 103.8424649, 1189 | 1.2874947 1190 | ], 1191 | [ 1192 | 103.8424223, 1193 | 1.2869299 1194 | ], 1195 | [ 1196 | 103.8424964, 1197 | 1.2865059 1198 | ], 1199 | [ 1200 | 103.8427288, 1201 | 1.2860467 1202 | ], 1203 | [ 1204 | 103.8430739, 1205 | 1.2856345 1206 | ] 1207 | ], 1208 | [ 1209 | [ 1210 | 103.7672579, 1211 | 1.3616689 1212 | ], 1213 | [ 1214 | 103.767437, 1215 | 1.3622771 1216 | ], 1217 | [ 1218 | 103.7676652, 1219 | 1.3630527 1220 | ], 1221 | [ 1222 | 103.7677296, 1223 | 1.3632687 1224 | ], 1225 | [ 1226 | 103.7677852, 1227 | 1.3637131 1228 | ], 1229 | [ 1230 | 103.7677657, 1231 | 1.3640212 1232 | ], 1233 | [ 1234 | 103.7676522, 1235 | 1.3645542 1236 | ], 1237 | [ 1238 | 103.7672113, 1239 | 1.3654918 1240 | ], 1241 | [ 1242 | 103.7652754, 1243 | 1.3685162 1244 | ], 1245 | [ 1246 | 103.7647369, 1247 | 1.3693616 1248 | ], 1249 | [ 1250 | 103.7644499, 1251 | 1.3698144 1252 | ], 1253 | [ 1254 | 103.7643109, 1255 | 1.3700336 1256 | ], 1257 | [ 1258 | 103.7638908, 1259 | 1.3706551 1260 | ], 1261 | [ 1262 | 103.76328, 1263 | 1.3714423 1264 | ], 1265 | [ 1266 | 103.7631573, 1267 | 1.3717798 1268 | ], 1269 | [ 1270 | 103.7630834, 1271 | 1.3721439 1272 | ], 1273 | [ 1274 | 103.7629861, 1275 | 1.3731582 1276 | ], 1277 | [ 1278 | 103.7629368, 1279 | 1.3736844 1280 | ], 1281 | [ 1282 | 103.7628213, 1283 | 1.3749099 1284 | ], 1285 | [ 1286 | 103.7626391, 1287 | 1.3767904 1288 | ], 1289 | [ 1290 | 103.7626048, 1291 | 1.3771387 1292 | ], 1293 | [ 1294 | 103.7624896, 1295 | 1.3775347 1296 | ], 1297 | [ 1298 | 103.7624345, 1299 | 1.3777059 1300 | ], 1301 | [ 1302 | 103.7619573, 1303 | 1.3787283 1304 | ] 1305 | ], 1306 | [ 1307 | [ 1308 | 103.8609744, 1309 | 1.2937022 1310 | ], 1311 | [ 1312 | 103.8609789, 1313 | 1.2940459 1314 | ], 1315 | [ 1316 | 103.860956, 1317 | 1.294324 1318 | ], 1319 | [ 1320 | 103.8608581, 1321 | 1.2948715 1322 | ], 1323 | [ 1324 | 103.8607519, 1325 | 1.2952173 1326 | ], 1327 | [ 1328 | 103.8605153, 1329 | 1.2956894 1330 | ], 1331 | [ 1332 | 103.8602257, 1333 | 1.2960973 1334 | ], 1335 | [ 1336 | 103.8597917, 1337 | 1.2964784 1338 | ], 1339 | [ 1340 | 103.8591952, 1341 | 1.2968826 1342 | ], 1343 | [ 1344 | 103.8588045, 1345 | 1.2971767 1346 | ], 1347 | [ 1348 | 103.8584294, 1349 | 1.2975685 1350 | ], 1351 | [ 1352 | 103.8575764, 1353 | 1.2986947 1354 | ], 1355 | [ 1356 | 103.8567771, 1357 | 1.2996601 1358 | ], 1359 | [ 1360 | 103.856348, 1361 | 1.3002903 1362 | ], 1363 | [ 1364 | 103.856061, 1365 | 1.3005572 1366 | ], 1367 | [ 1368 | 103.8557942, 1369 | 1.3008052 1370 | ] 1371 | ], 1372 | [ 1373 | [ 1374 | 103.9203998, 1375 | 1.3337686 1376 | ], 1377 | [ 1378 | 103.9201695, 1379 | 1.3338307 1380 | ], 1381 | [ 1382 | 103.9199474, 1383 | 1.3338901 1384 | ], 1385 | [ 1386 | 103.9197662, 1387 | 1.3339512 1388 | ], 1389 | [ 1390 | 103.9179906, 1391 | 1.3346913 1392 | ], 1393 | [ 1394 | 103.9172158, 1395 | 1.3350272 1396 | ], 1397 | [ 1398 | 103.9147094, 1399 | 1.3361269 1400 | ], 1401 | [ 1402 | 103.9145765, 1403 | 1.3361738 1404 | ], 1405 | [ 1406 | 103.9144506, 1407 | 1.3362136 1408 | ], 1409 | [ 1410 | 103.9143237, 1411 | 1.3362477 1412 | ], 1413 | [ 1414 | 103.9141875, 1415 | 1.3362794 1416 | ], 1417 | [ 1418 | 103.9138774, 1419 | 1.3363414 1420 | ], 1421 | [ 1422 | 103.9135294, 1423 | 1.3363937 1424 | ], 1425 | [ 1426 | 103.9132282, 1427 | 1.3364259 1428 | ], 1429 | [ 1430 | 103.9129282, 1431 | 1.3364299 1432 | ], 1433 | [ 1434 | 103.9126385, 1435 | 1.3363938 1436 | ], 1437 | [ 1438 | 103.9124084, 1439 | 1.3363195 1440 | ], 1441 | [ 1442 | 103.9100258, 1443 | 1.3352949 1444 | ], 1445 | [ 1446 | 103.9086571, 1447 | 1.3349944 1448 | ], 1449 | [ 1450 | 103.9062415, 1451 | 1.3344639 1452 | ], 1453 | [ 1454 | 103.9050972, 1455 | 1.3340102 1456 | ], 1457 | [ 1458 | 103.9040097, 1459 | 1.3333672 1460 | ], 1461 | [ 1462 | 103.9039448, 1463 | 1.3333228 1464 | ], 1465 | [ 1466 | 103.9038839, 1467 | 1.3332784 1468 | ], 1469 | [ 1470 | 103.9038214, 1471 | 1.3332251 1472 | ], 1473 | [ 1474 | 103.9037629, 1475 | 1.3331719 1476 | ], 1477 | [ 1478 | 103.9025545, 1479 | 1.331924 1480 | ], 1481 | [ 1482 | 103.9008496, 1483 | 1.3307338 1484 | ], 1485 | [ 1486 | 103.9001995, 1487 | 1.3304009 1488 | ], 1489 | [ 1490 | 103.8993573, 1491 | 1.3300095 1492 | ], 1493 | [ 1494 | 103.8984427, 1495 | 1.3296414 1496 | ], 1497 | [ 1498 | 103.8934732, 1499 | 1.3276306 1500 | ], 1501 | [ 1502 | 103.8905436, 1503 | 1.3266469 1504 | ], 1505 | [ 1506 | 103.8897064, 1507 | 1.3262838 1508 | ], 1509 | [ 1510 | 103.8890965, 1511 | 1.3259765 1512 | ], 1513 | [ 1514 | 103.8885915, 1515 | 1.325814 1516 | ], 1517 | [ 1518 | 103.8884854, 1519 | 1.325775 1520 | ], 1521 | [ 1522 | 103.8883664, 1523 | 1.3257511 1524 | ], 1525 | [ 1526 | 103.8882338, 1527 | 1.3257491 1528 | ], 1529 | [ 1530 | 103.8870649, 1531 | 1.325918 1532 | ], 1533 | [ 1534 | 103.8867432, 1535 | 1.3259473 1536 | ], 1537 | [ 1538 | 103.8863892, 1539 | 1.3259644 1540 | ], 1541 | [ 1542 | 103.8858931, 1543 | 1.3260065 1544 | ], 1545 | [ 1546 | 103.8851792, 1547 | 1.3260941 1548 | ], 1549 | [ 1550 | 103.8848072, 1551 | 1.3261497 1552 | ], 1553 | [ 1554 | 103.8846383, 1555 | 1.3261784 1556 | ], 1557 | [ 1558 | 103.8844445, 1559 | 1.3262266 1560 | ], 1561 | [ 1562 | 103.8842778, 1563 | 1.3263043 1564 | ], 1565 | [ 1566 | 103.8841939, 1567 | 1.3263433 1568 | ], 1569 | [ 1570 | 103.8835162, 1571 | 1.3266737 1572 | ], 1573 | [ 1574 | 103.8832884, 1575 | 1.3267827 1576 | ], 1577 | [ 1578 | 103.8826257, 1579 | 1.3271 1580 | ], 1581 | [ 1582 | 103.8819444, 1583 | 1.3274084 1584 | ], 1585 | [ 1586 | 103.8811704, 1587 | 1.3275684 1588 | ], 1589 | [ 1590 | 103.8807528, 1591 | 1.327579 1592 | ], 1593 | [ 1594 | 103.8800732, 1595 | 1.327395 1596 | ], 1597 | [ 1598 | 103.8795494, 1599 | 1.3270129 1600 | ], 1601 | [ 1602 | 103.8776851, 1603 | 1.3244695 1604 | ], 1605 | [ 1606 | 103.8775268, 1607 | 1.3243301 1608 | ], 1609 | [ 1610 | 103.8765508, 1611 | 1.3239306 1612 | ], 1613 | [ 1614 | 103.8754075, 1615 | 1.3234714 1616 | ], 1617 | [ 1618 | 103.8724297, 1619 | 1.3218427 1620 | ], 1621 | [ 1622 | 103.8720146, 1623 | 1.3215932 1624 | ], 1625 | [ 1626 | 103.8714605, 1627 | 1.3212725 1628 | ], 1629 | [ 1630 | 103.8680439, 1631 | 1.3191612 1632 | ], 1633 | [ 1634 | 103.8679571, 1635 | 1.3191076 1636 | ], 1637 | [ 1638 | 103.8677625, 1639 | 1.3189871 1640 | ], 1641 | [ 1642 | 103.8665155, 1643 | 1.3182169 1644 | ], 1645 | [ 1646 | 103.8659799, 1647 | 1.3177282 1648 | ], 1649 | [ 1650 | 103.8656378, 1651 | 1.3171837 1652 | ], 1653 | [ 1654 | 103.8644081, 1655 | 1.3147464 1656 | ], 1657 | [ 1658 | 103.8641587, 1659 | 1.3144514 1660 | ], 1661 | [ 1662 | 103.8638824, 1663 | 1.3141886 1664 | ], 1665 | [ 1666 | 103.8635337, 1667 | 1.3139339 1668 | ], 1669 | [ 1670 | 103.862645, 1671 | 1.3135751 1672 | ], 1673 | [ 1674 | 103.8620612, 1675 | 1.3132876 1676 | ], 1677 | [ 1678 | 103.8616773, 1679 | 1.3130932 1680 | ], 1681 | [ 1682 | 103.8612672, 1683 | 1.3129168 1684 | ], 1685 | [ 1686 | 103.8607322, 1687 | 1.3126625 1688 | ], 1689 | [ 1690 | 103.8602692, 1691 | 1.3123774 1692 | ], 1693 | [ 1694 | 103.8597773, 1695 | 1.3119769 1696 | ], 1697 | [ 1698 | 103.8594029, 1699 | 1.3115237 1700 | ], 1701 | [ 1702 | 103.8578311, 1703 | 1.3092033 1704 | ], 1705 | [ 1706 | 103.8563141, 1707 | 1.3069603 1708 | ], 1709 | [ 1710 | 103.8553671, 1711 | 1.305462 1712 | ], 1713 | [ 1714 | 103.8541928, 1715 | 1.3036041 1716 | ], 1717 | [ 1718 | 103.8503754, 1719 | 1.2989735 1720 | ] 1721 | ] 1722 | ] -------------------------------------------------------------------------------- /data/raw/tel-exits.citymapper.json: -------------------------------------------------------------------------------- 1 | { 2 | "Havelock": [ 3 | { 4 | "id": "CMStation_havelock_4_E44190", 5 | "coords": [ 6 | 1.286735, 7 | 103.833831 8 | ], 9 | "station_id": "CMStation_havelock_4", 10 | "short_name": "1", 11 | "indicator": "1", 12 | "name": "Zion Rd / Furama RiverFront Singapore" 13 | }, 14 | { 15 | "id": "CMStation_havelock_4_E44191", 16 | "coords": [ 17 | 1.28702, 18 | 103.833482 19 | ], 20 | "station_id": "CMStation_havelock_4", 21 | "short_name": "2", 22 | "indicator": "2", 23 | "name": "Jalan Bukit Ho Swee" 24 | }, 25 | { 26 | "id": "CMStation_havelock_4_E44192", 27 | "coords": [ 28 | 1.288805, 29 | 103.83334 30 | ], 31 | "station_id": "CMStation_havelock_4", 32 | "short_name": "3", 33 | "indicator": "3", 34 | "name": "Zion Rd / Kim Seng CC" 35 | }, 36 | { 37 | "id": "CMStation_havelock_4_E44193", 38 | "coords": [ 39 | 1.290173, 40 | 103.833976 41 | ], 42 | "station_id": "CMStation_havelock_4", 43 | "short_name": "4", 44 | "indicator": "4", 45 | "name": "Havelock Rd / Kim Seng Park" 46 | }, 47 | { 48 | "id": "CMStation_havelock_4_E44194", 49 | "coords": [ 50 | 1.289693, 51 | 103.833606 52 | ], 53 | "station_id": "CMStation_havelock_4", 54 | "short_name": "5", 55 | "indicator": "5", 56 | "name": "Havelock Rd" 57 | } 58 | ], 59 | "Woodlands": [ 60 | { 61 | "id": "SingaporeStation_Woodlands_E10508", 62 | "coords": [ 63 | 1.436673115, 64 | 103.7865081 65 | ], 66 | "station_id": "SingaporeStation_Woodlands", 67 | "short_name": "2", 68 | "indicator": "2", 69 | "name": "Causeway Point" 70 | }, 71 | { 72 | "id": "SingaporeStation_Woodlands_E10509", 73 | "coords": [ 74 | 1.436696875, 75 | 103.7857356 76 | ], 77 | "station_id": "SingaporeStation_Woodlands", 78 | "short_name": "1", 79 | "indicator": "1", 80 | "name": "Woodlands Avenue 3" 81 | }, 82 | { 83 | "id": "SingaporeStation_Woodlands_E10510", 84 | "coords": [ 85 | 1.437243367, 86 | 103.7871082 87 | ], 88 | "station_id": "SingaporeStation_Woodlands", 89 | "short_name": "3", 90 | "indicator": "3", 91 | "name": "Woodlands Avenue 7" 92 | }, 93 | { 94 | "id": "SingaporeStation_Woodlands_E39603", 95 | "coords": [ 96 | 1.437540374, 97 | 103.7880055 98 | ], 99 | "station_id": "SingaporeStation_Woodlands", 100 | "short_name": "4", 101 | "indicator": "4", 102 | "name": "Woodlands Square\t" 103 | }, 104 | { 105 | "id": "SingaporeStation_Woodlands_E39604", 106 | "coords": [ 107 | 1.435843936, 108 | 103.7889643 109 | ], 110 | "station_id": "SingaporeStation_Woodlands", 111 | "short_name": "5", 112 | "indicator": "5", 113 | "name": "Blk 894B\t" 114 | }, 115 | { 116 | "id": "SingaporeStation_Woodlands_E39605", 117 | "coords": [ 118 | 1.434815175, 119 | 103.7890891 120 | ], 121 | "station_id": "SingaporeStation_Woodlands", 122 | "short_name": "6", 123 | "indicator": "6", 124 | "name": "Blk 512\t" 125 | }, 126 | { 127 | "id": "SingaporeStation_Woodlands_E39606", 128 | "coords": [ 129 | 1.434495526, 130 | 103.7879768 131 | ], 132 | "station_id": "SingaporeStation_Woodlands", 133 | "short_name": "7", 134 | "indicator": "7", 135 | "name": "Woodlands Avenue 2 & 5" 136 | } 137 | ], 138 | "Shenton Way": [ 139 | { 140 | "id": "CMStation_shenton_way_4_E44206", 141 | "coords": [ 142 | 1.277468, 143 | 103.851869 144 | ], 145 | "station_id": "CMStation_shenton_way_4", 146 | "short_name": "1", 147 | "indicator": "1", 148 | "name": "Straits View" 149 | }, 150 | { 151 | "id": "CMStation_shenton_way_4_E44207", 152 | "coords": [ 153 | 1.277023, 154 | 103.850933 155 | ], 156 | "station_id": "CMStation_shenton_way_4", 157 | "short_name": "2", 158 | "indicator": "2", 159 | "name": "Central Linear Park" 160 | }, 161 | { 162 | "id": "CMStation_shenton_way_4_E44208", 163 | "coords": [ 164 | 1.277025, 165 | 103.851976 166 | ], 167 | "station_id": "CMStation_shenton_way_4", 168 | "short_name": "5", 169 | "indicator": "5", 170 | "name": "Marina One" 171 | }, 172 | { 173 | "id": "CMStation_shenton_way_4_E44209", 174 | "coords": [ 175 | 1.277889, 176 | 103.849852 177 | ], 178 | "station_id": "CMStation_shenton_way_4", 179 | "short_name": "6", 180 | "indicator": "6", 181 | "name": "UIC Building" 182 | }, 183 | { 184 | "id": "CMStation_shenton_way_4_E44210", 185 | "coords": [ 186 | 1.277639, 187 | 103.850099 188 | ], 189 | "station_id": "CMStation_shenton_way_4", 190 | "short_name": "3", 191 | "indicator": "3", 192 | "name": "Park Street" 193 | }, 194 | { 195 | "id": "CMStation_shenton_way_4_E44211", 196 | "coords": [ 197 | 1.277645, 198 | 103.851002 199 | ], 200 | "station_id": "CMStation_shenton_way_4", 201 | "short_name": "4", 202 | "indicator": "4", 203 | "name": "Asia Square" 204 | } 205 | ], 206 | "Orchard": [ 207 | { 208 | "id": "SingaporeStation_Orchard_E4232", 209 | "coords": [ 210 | 1.304031, 211 | 103.832763 212 | ], 213 | "station_id": "SingaporeStation_Orchard", 214 | "short_name": "3", 215 | "indicator": "3", 216 | "name": "Wisma Atria / Ngee Ann City via Wisma Atria" 217 | }, 218 | { 219 | "id": "SingaporeStation_Orchard_E4233", 220 | "coords": [ 221 | 1.30398, 222 | 103.83198 223 | ], 224 | "station_id": "SingaporeStation_Orchard", 225 | "short_name": "5", 226 | "indicator": "5", 227 | "name": "ION Orchard / Wheelock Place" 228 | }, 229 | { 230 | "id": "SingaporeStation_Orchard_E4234", 231 | "coords": [ 232 | 1.304761, 233 | 103.832608 234 | ], 235 | "station_id": "SingaporeStation_Orchard", 236 | "short_name": "1", 237 | "indicator": "1", 238 | "name": "Tang Plaza / Scotts Rd / Lucky Plaza" 239 | }, 240 | { 241 | "id": "SingaporeStation_Orchard_E4235", 242 | "coords": [ 243 | 1.304278, 244 | 103.832533 245 | ], 246 | "station_id": "SingaporeStation_Orchard", 247 | "short_name": "2", 248 | "indicator": "2", 249 | "name": "Orchard Rd / Wisma Atria " 250 | }, 251 | { 252 | "id": "SingaporeStation_Orchard_E4237", 253 | "coords": [ 254 | 1.303146, 255 | 103.832211 256 | ], 257 | "station_id": "SingaporeStation_Orchard", 258 | "short_name": "7", 259 | "indicator": "7", 260 | "name": "Orchard Boulevard / Orchard Turn" 261 | }, 262 | { 263 | "id": "SingaporeStation_Orchard_E44179", 264 | "coords": [ 265 | 1.304221, 266 | 103.831983 267 | ], 268 | "station_id": "SingaporeStation_Orchard", 269 | "short_name": "4", 270 | "indicator": "4", 271 | "name": "ION Orchard" 272 | }, 273 | { 274 | "id": "SingaporeStation_Orchard_E44180", 275 | "coords": [ 276 | 1.303661, 277 | 103.832069 278 | ], 279 | "station_id": "SingaporeStation_Orchard", 280 | "short_name": "6", 281 | "indicator": "6", 282 | "name": "ION Orchard (B1)" 283 | }, 284 | { 285 | "id": "SingaporeStation_Orchard_E44182", 286 | "coords": [ 287 | 1.302326, 288 | 103.83212 289 | ], 290 | "station_id": "SingaporeStation_Orchard", 291 | "short_name": "13", 292 | "indicator": "13", 293 | "name": "Orchard Boulevard" 294 | }, 295 | { 296 | "id": "SingaporeStation_Orchard_E44183", 297 | "coords": [ 298 | 1.302908, 299 | 103.830577 300 | ], 301 | "station_id": "SingaporeStation_Orchard", 302 | "short_name": "12", 303 | "indicator": "12", 304 | "name": "Paterson Rd" 305 | }, 306 | { 307 | "id": "SingaporeStation_Orchard_E44184", 308 | "coords": [ 309 | 1.304138, 310 | 103.830626 311 | ], 312 | "station_id": "SingaporeStation_Orchard", 313 | "short_name": "11", 314 | "indicator": "11", 315 | "name": "Orchard Boulevard / Wheelock Place / Shaw House" 316 | }, 317 | { 318 | "id": "SingaporeStation_Orchard_E44185", 319 | "coords": [ 320 | 1.304042, 321 | 103.831119 322 | ], 323 | "station_id": "SingaporeStation_Orchard", 324 | "short_name": "10", 325 | "indicator": "10", 326 | "name": "Paterson Rd" 327 | }, 328 | { 329 | "id": "SingaporeStation_Orchard_E44186", 330 | "coords": [ 331 | 1.303674, 332 | 103.831481 333 | ], 334 | "station_id": "SingaporeStation_Orchard", 335 | "short_name": "9", 336 | "indicator": "9", 337 | "name": "ION Orchard" 338 | }, 339 | { 340 | "id": "SingaporeStation_Orchard_E44187", 341 | "coords": [ 342 | 1.303522, 343 | 103.831688 344 | ], 345 | "station_id": "SingaporeStation_Orchard", 346 | "short_name": "8", 347 | "indicator": "8", 348 | "name": "ION Orchard" 349 | } 350 | ], 351 | "Upper Thomson": [ 352 | { 353 | "id": "CMStation_upper_thomson_E43466", 354 | "coords": [ 355 | 1.355736575, 356 | 103.831833 357 | ], 358 | "station_id": "CMStation_upper_thomson", 359 | "short_name": "2", 360 | "indicator": "2", 361 | "name": "Bright Hill Drive" 362 | }, 363 | { 364 | "id": "CMStation_upper_thomson_E43467", 365 | "coords": [ 366 | 1.354833645, 367 | 103.8319162 368 | ], 369 | "station_id": "CMStation_upper_thomson", 370 | "short_name": "1", 371 | "indicator": "1", 372 | "name": "Thomson Plaza, Soo Chow Garden Road" 373 | }, 374 | { 375 | "id": "CMStation_upper_thomson_E43468", 376 | "coords": [ 377 | 1.354144566, 378 | 103.8339246 379 | ], 380 | "station_id": "CMStation_upper_thomson", 381 | "short_name": "3", 382 | "indicator": "3", 383 | "name": "Jalan Keli" 384 | }, 385 | { 386 | "id": "CMStation_upper_thomson_E43469", 387 | "coords": [ 388 | 1.35350301, 389 | 103.8337939 390 | ], 391 | "station_id": "CMStation_upper_thomson", 392 | "short_name": "4", 393 | "indicator": "4", 394 | "name": "Lorong Mega" 395 | }, 396 | { 397 | "id": "CMStation_upper_thomson_E43470", 398 | "coords": [ 399 | 1.354417822, 400 | 103.8326352 401 | ], 402 | "station_id": "CMStation_upper_thomson", 403 | "short_name": "5", 404 | "indicator": "5", 405 | "name": "Upper Thomson Road" 406 | } 407 | ], 408 | "Stevens": [ 409 | { 410 | "id": "CMStation_stevens_E44170", 411 | "coords": [ 412 | 1.319951, 413 | 103.82591 414 | ], 415 | "station_id": "CMStation_stevens", 416 | "short_name": "1", 417 | "indicator": "1", 418 | "name": "Built Timah Rd / Stevens Rd" 419 | }, 420 | { 421 | "id": "CMStation_stevens_E44171", 422 | "coords": [ 423 | 1.319544, 424 | 103.825057 425 | ], 426 | "station_id": "CMStation_stevens", 427 | "short_name": "3", 428 | "indicator": "3", 429 | "name": "Stevens Rd" 430 | }, 431 | { 432 | "id": "CMStation_stevens_E44172", 433 | "coords": [ 434 | 1.321389, 435 | 103.825833 436 | ], 437 | "station_id": "CMStation_stevens", 438 | "short_name": "4", 439 | "indicator": "4", 440 | "name": "Whitley Rd" 441 | }, 442 | { 443 | "id": "CMStation_stevens_E44173", 444 | "coords": [ 445 | 1.320951, 446 | 103.826278 447 | ], 448 | "station_id": "CMStation_stevens", 449 | "short_name": "5", 450 | "indicator": "5", 451 | "name": "Dunearn Rd" 452 | }, 453 | { 454 | "id": "CMStation_stevens_E44174", 455 | "coords": [ 456 | 1.318653, 457 | 103.825924 458 | ], 459 | "station_id": "CMStation_stevens", 460 | "short_name": "2", 461 | "indicator": "2", 462 | "name": "Stevens Rd / Robin Close" 463 | } 464 | ], 465 | "Orchard Boulevard": [ 466 | { 467 | "id": "CMStation_orchard_boulevard_5_E44177", 468 | "coords": [ 469 | 1.303607, 470 | 103.823681 471 | ], 472 | "station_id": "CMStation_orchard_boulevard_5", 473 | "short_name": "1", 474 | "indicator": "1", 475 | "name": "Grange Rd / Tourism Court" 476 | }, 477 | { 478 | "id": "CMStation_orchard_boulevard_5_E44178", 479 | "coords": [ 480 | 1.302478, 481 | 103.824038 482 | ], 483 | "station_id": "CMStation_orchard_boulevard_5", 484 | "short_name": "2", 485 | "indicator": "2", 486 | "name": "Orchard Boulevard" 487 | } 488 | ], 489 | "Springleaf": [ 490 | { 491 | "id": "CMStation_springleaf_E43447", 492 | "coords": [ 493 | 1.398787248, 494 | 103.8180034 495 | ], 496 | "station_id": "CMStation_springleaf", 497 | "short_name": "1", 498 | "indicator": "1", 499 | "name": "Thong Soon Green" 500 | }, 501 | { 502 | "id": "CMStation_springleaf_E43448", 503 | "coords": [ 504 | 1.397820804, 505 | 103.8183906 506 | ], 507 | "station_id": "CMStation_springleaf", 508 | "short_name": "2", 509 | "indicator": "2", 510 | "name": "Springleaf Road" 511 | }, 512 | { 513 | "id": "CMStation_springleaf_E43449", 514 | "coords": [ 515 | 1.397684179, 516 | 103.8180816 517 | ], 518 | "station_id": "CMStation_springleaf", 519 | "short_name": "3", 520 | "indicator": "3", 521 | "name": "Upper Thomson Road" 522 | } 523 | ], 524 | "Lentor": [ 525 | { 526 | "id": "CMStation_lentor_E43450", 527 | "coords": [ 528 | 1.38540983, 529 | 103.83536 530 | ], 531 | "station_id": "CMStation_lentor", 532 | "short_name": "1", 533 | "indicator": "1", 534 | "name": "Lentor Drive" 535 | }, 536 | { 537 | "id": "CMStation_lentor_E43451", 538 | "coords": [ 539 | 1.38589099, 540 | 103.8358235 541 | ], 542 | "station_id": "CMStation_lentor", 543 | "short_name": "2", 544 | "indicator": "2", 545 | "name": "Lentor Drive" 546 | }, 547 | { 548 | "id": "CMStation_lentor_E43452", 549 | "coords": [ 550 | 1.384601954, 551 | 103.8373981 552 | ], 553 | "station_id": "CMStation_lentor", 554 | "short_name": "3", 555 | "indicator": "3", 556 | "name": "Yio Chu Kang Road" 557 | }, 558 | { 559 | "id": "CMStation_lentor_E43453", 560 | "coords": [ 561 | 1.383627752, 562 | 103.8373387 563 | ], 564 | "station_id": "CMStation_lentor", 565 | "short_name": "4", 566 | "indicator": "4", 567 | "name": "Ang Mo Kio Avenue 4" 568 | }, 569 | { 570 | "id": "CMStation_lentor_E43454", 571 | "coords": [ 572 | 1.384162375, 573 | 103.8368395 574 | ], 575 | "station_id": "CMStation_lentor", 576 | "short_name": "5", 577 | "indicator": "5", 578 | "name": "Thomson Grove" 579 | } 580 | ], 581 | "Woodlands North": [ 582 | { 583 | "id": "CMStation_woodlands_north_E41029", 584 | "coords": [ 585 | 1.4490473, 586 | 103.7851023 587 | ], 588 | "station_id": "CMStation_woodlands_north", 589 | "short_name": "2", 590 | "indicator": "2" 591 | }, 592 | { 593 | "id": "CMStation_woodlands_north_E41030", 594 | "coords": [ 595 | 1.447936503, 596 | 103.7854291 597 | ], 598 | "station_id": "CMStation_woodlands_north", 599 | "short_name": "1", 600 | "indicator": "1" 601 | } 602 | ], 603 | "Marina Bay": [ 604 | { 605 | "id": "SingaporeStation_MarinaBay_E8508", 606 | "coords": [ 607 | 1.277002, 608 | 103.85456 609 | ], 610 | "station_id": "SingaporeStation_MarinaBay", 611 | "short_name": "1", 612 | "indicator": "1", 613 | "name": "Asia Square / The Sail @ Marina Bay / One Raffles Quay" 614 | }, 615 | { 616 | "id": "SingaporeStation_MarinaBay_E8509", 617 | "coords": [ 618 | 1.275987, 619 | 103.854936 620 | ], 621 | "station_id": "SingaporeStation_MarinaBay", 622 | "short_name": "2", 623 | "indicator": "2", 624 | "name": "Marina Bay Link Mall / Central Linear Park" 625 | }, 626 | { 627 | "id": "SingaporeStation_MarinaBay_E44212", 628 | "coords": [ 629 | 1.275146, 630 | 103.855184 631 | ], 632 | "station_id": "SingaporeStation_MarinaBay", 633 | "short_name": "3", 634 | "indicator": "3", 635 | "name": "Bayfront Avenue" 636 | }, 637 | { 638 | "id": "SingaporeStation_MarinaBay_E44213", 639 | "coords": [ 640 | 1.273767, 641 | 103.856265 642 | ], 643 | "station_id": "SingaporeStation_MarinaBay", 644 | "short_name": "4", 645 | "indicator": "4", 646 | "name": "Sheares Avenue" 647 | }, 648 | { 649 | "id": "SingaporeStation_MarinaBay_E44214", 650 | "coords": [ 651 | 1.274915, 652 | 103.85439 653 | ], 654 | "station_id": "SingaporeStation_MarinaBay", 655 | "short_name": "5", 656 | "indicator": "5", 657 | "name": "Singapore Conference Hall" 658 | } 659 | ], 660 | "Mayflower": [ 661 | { 662 | "id": "CMStation_mayflower_E43455", 663 | "coords": [ 664 | 1.372703972, 665 | 103.8367168 666 | ], 667 | "station_id": "CMStation_mayflower", 668 | "short_name": "1", 669 | "indicator": "1", 670 | "name": "Ang Mo Kio Avenue 4" 671 | }, 672 | { 673 | "id": "CMStation_mayflower_E43456", 674 | "coords": [ 675 | 1.371377308, 676 | 103.836285 677 | ], 678 | "station_id": "CMStation_mayflower", 679 | "short_name": "7", 680 | "indicator": "7", 681 | "name": "Blk 112" 682 | }, 683 | { 684 | "id": "CMStation_mayflower_E43457", 685 | "coords": [ 686 | 1.371276323, 687 | 103.836796 688 | ], 689 | "station_id": "CMStation_mayflower", 690 | "short_name": "4", 691 | "indicator": "4", 692 | "name": "Blk 107" 693 | }, 694 | { 695 | "id": "CMStation_mayflower_E43458", 696 | "coords": [ 697 | 1.373532092, 698 | 103.837461 699 | ], 700 | "station_id": "CMStation_mayflower", 701 | "short_name": "3", 702 | "indicator": "3", 703 | "name": "Mayflower Avenue" 704 | }, 705 | { 706 | "id": "CMStation_mayflower_E43459", 707 | "coords": [ 708 | 1.373719761, 709 | 103.8370317 710 | ], 711 | "station_id": "CMStation_mayflower", 712 | "short_name": "2", 713 | "indicator": "2", 714 | "name": "Blk 170" 715 | }, 716 | { 717 | "id": "CMStation_mayflower_E43460", 718 | "coords": [ 719 | 1.370896144, 720 | 103.8363087 721 | ], 722 | "station_id": "CMStation_mayflower", 723 | "short_name": "6", 724 | "indicator": "6", 725 | "name": "Blk 256" 726 | }, 727 | { 728 | "id": "CMStation_mayflower_E43461", 729 | "coords": [ 730 | 1.370777338, 731 | 103.8367603 732 | ], 733 | "station_id": "CMStation_mayflower", 734 | "short_name": "5", 735 | "indicator": "5", 736 | "name": "Blk 111" 737 | } 738 | ], 739 | "Great World": [ 740 | { 741 | "id": "CMStation_great_world_4_E44188", 742 | "coords": [ 743 | 1.293329, 744 | 103.833906 745 | ], 746 | "station_id": "CMStation_great_world_4", 747 | "short_name": "1", 748 | "indicator": "1", 749 | "name": "Kim Seng Rd / River Valley Green" 750 | }, 751 | { 752 | "id": "CMStation_great_world_4_E44189", 753 | "coords": [ 754 | 1.295952, 755 | 103.833037 756 | ], 757 | "station_id": "CMStation_great_world_4", 758 | "short_name": "4", 759 | "indicator": "4", 760 | "name": "River Valley Rd / River Valley Green" 761 | } 762 | ], 763 | "Outram Park": [ 764 | { 765 | "id": "SingaporeStation_OutramPark_E44195", 766 | "coords": [ 767 | 1.278996, 768 | 103.839547 769 | ], 770 | "station_id": "SingaporeStation_OutramPark", 771 | "short_name": "5", 772 | "indicator": "5", 773 | "name": "Cantonment Rd / New Bridge Road" 774 | }, 775 | { 776 | "id": "SingaporeStation_OutramPark_E44196", 777 | "coords": [ 778 | 1.280659, 779 | 103.839802 780 | ], 781 | "station_id": "SingaporeStation_OutramPark", 782 | "short_name": "3", 783 | "indicator": "3", 784 | "name": "Outram Rd / Eu Tong Sen St" 785 | }, 786 | { 787 | "id": "SingaporeStation_OutramPark_E44197", 788 | "coords": [ 789 | 1.282303, 790 | 103.838082 791 | ], 792 | "station_id": "SingaporeStation_OutramPark", 793 | "short_name": "8", 794 | "indicator": "8", 795 | "name": "Outram Rd / Pearl's Hill City Park" 796 | }, 797 | { 798 | "id": "SingaporeStation_OutramPark_E44198", 799 | "coords": [ 800 | 1.280793, 801 | 103.838806 802 | ], 803 | "station_id": "SingaporeStation_OutramPark", 804 | "short_name": "7", 805 | "indicator": "7", 806 | "name": "S'pore General Hosp / NCCS / HPB / HSA" 807 | }, 808 | { 809 | "id": "SingaporeStation_OutramPark_E44199", 810 | "coords": [ 811 | 1.280337, 812 | 103.840311 813 | ], 814 | "station_id": "SingaporeStation_OutramPark", 815 | "short_name": "4", 816 | "indicator": "4", 817 | "name": "New Bridge Rd / Teo Hong Road" 818 | }, 819 | { 820 | "id": "SingaporeStation_OutramPark_E44200", 821 | "coords": [ 822 | 1.281509, 823 | 103.83923 824 | ], 825 | "station_id": "SingaporeStation_OutramPark", 826 | "short_name": "2", 827 | "indicator": "2" 828 | }, 829 | { 830 | "id": "SingaporeStation_OutramPark_E44201", 831 | "coords": [ 832 | 1.281369, 833 | 103.839142 834 | ], 835 | "station_id": "SingaporeStation_OutramPark", 836 | "short_name": "1", 837 | "indicator": "1", 838 | "name": "Outram Rd" 839 | }, 840 | { 841 | "id": "SingaporeStation_OutramPark_E44202", 842 | "coords": [ 843 | 1.278809, 844 | 103.838415 845 | ], 846 | "station_id": "SingaporeStation_OutramPark", 847 | "short_name": "6", 848 | "indicator": "6", 849 | "name": "Eu Tong Sen St / MOH / Singhealth Polyclinic" 850 | } 851 | ], 852 | "Caldecott": [ 853 | { 854 | "id": "SingaporeStation_Caldecott_E40390", 855 | "coords": [ 856 | 1.33825973, 857 | 103.8403875 858 | ], 859 | "station_id": "SingaporeStation_Caldecott", 860 | "short_name": "2", 861 | "indicator": "2", 862 | "name": "SAVH / Toa Payoh Rise" 863 | }, 864 | { 865 | "id": "SingaporeStation_Caldecott_E40391", 866 | "coords": [ 867 | 1.337832023, 868 | 103.8404647 869 | ], 870 | "station_id": "SingaporeStation_Caldecott", 871 | "short_name": "3", 872 | "indicator": "3", 873 | "name": "Toa Payoh Rise" 874 | }, 875 | { 876 | "id": "SingaporeStation_Caldecott_E43854", 877 | "coords": [ 878 | 1.336750875, 879 | 103.8398824 880 | ], 881 | "station_id": "SingaporeStation_Caldecott", 882 | "short_name": "4", 883 | "indicator": "4", 884 | "name": "Toa Payoh Link" 885 | }, 886 | { 887 | "id": "SingaporeStation_Caldecott_E8478", 888 | "coords": [ 889 | 1.337105317, 890 | 103.8394067 891 | ], 892 | "station_id": "SingaporeStation_Caldecott", 893 | "short_name": "1", 894 | "indicator": "1", 895 | "name": "Toa Payoh Link" 896 | } 897 | ], 898 | "Gardens by the Bay": [ 899 | { 900 | "id": "CMStation_gardens_by_the_bay_4_E44215", 901 | "coords": [ 902 | 1.278197, 903 | 103.867088 904 | ], 905 | "station_id": "CMStation_gardens_by_the_bay_4", 906 | "short_name": "3", 907 | "indicator": "3", 908 | "name": "Marina Mall" 909 | }, 910 | { 911 | "id": "CMStation_gardens_by_the_bay_4_E44216", 912 | "coords": [ 913 | 1.279589, 914 | 103.868466 915 | ], 916 | "station_id": "CMStation_gardens_by_the_bay_4", 917 | "short_name": "2", 918 | "indicator": "2", 919 | "name": "Marina Gardens Drive" 920 | }, 921 | { 922 | "id": "CMStation_gardens_by_the_bay_4_E44217", 923 | "coords": [ 924 | 1.280586, 925 | 103.868901 926 | ], 927 | "station_id": "CMStation_gardens_by_the_bay_4", 928 | "short_name": "1", 929 | "indicator": "1", 930 | "name": "Gardens by the Bay / Marina Barrage" 931 | } 932 | ], 933 | "Bright Hill": [ 934 | { 935 | "id": "CMStation_bright_hill_E43462", 936 | "coords": [ 937 | 1.363163, 938 | 103.832195 939 | ], 940 | "station_id": "CMStation_bright_hill", 941 | "short_name": "4", 942 | "indicator": "4", 943 | "name": "Sin Ming Avenue" 944 | }, 945 | { 946 | "id": "CMStation_bright_hill_E43463", 947 | "coords": [ 948 | 1.363233, 949 | 103.833383 950 | ], 951 | "station_id": "CMStation_bright_hill", 952 | "short_name": "2", 953 | "indicator": "2", 954 | "name": "Sim Ming Garden" 955 | }, 956 | { 957 | "id": "CMStation_bright_hill_E43464", 958 | "coords": [ 959 | 1.363917, 960 | 103.833831 961 | ], 962 | "station_id": "CMStation_bright_hill", 963 | "short_name": "1", 964 | "indicator": "1", 965 | "name": "Sin Ming Avenue" 966 | }, 967 | { 968 | "id": "CMStation_bright_hill_E43465", 969 | "coords": [ 970 | 1.362087, 971 | 103.832356 972 | ], 973 | "station_id": "CMStation_bright_hill", 974 | "short_name": "3", 975 | "indicator": "3", 976 | "name": "Fulton Road" 977 | } 978 | ], 979 | "Maxwell": [ 980 | { 981 | "id": "CMStation_maxwell_4_E44203", 982 | "coords": [ 983 | 1.28101, 984 | 103.844233 985 | ], 986 | "station_id": "CMStation_maxwell_4", 987 | "short_name": "1", 988 | "indicator": "1", 989 | "name": "Buddha Tooth Relic Temple & Museum" 990 | }, 991 | { 992 | "id": "CMStation_maxwell_4_E44204", 993 | "coords": [ 994 | 1.280825, 995 | 103.84482 996 | ], 997 | "station_id": "CMStation_maxwell_4", 998 | "short_name": "2", 999 | "indicator": "2", 1000 | "name": "South Bridge Rd" 1001 | }, 1002 | { 1003 | "id": "CMStation_maxwell_4_E44205", 1004 | "coords": [ 1005 | 1.280133, 1006 | 103.842843 1007 | ], 1008 | "station_id": "CMStation_maxwell_4", 1009 | "short_name": "3", 1010 | "indicator": "3", 1011 | "name": "Neil Rd / Kreta Ayer Rd" 1012 | } 1013 | ], 1014 | "Napier": [ 1015 | { 1016 | "id": "CMStation_napier_4_E44175", 1017 | "coords": [ 1018 | 1.306991, 1019 | 103.819368 1020 | ], 1021 | "station_id": "CMStation_napier_4", 1022 | "short_name": "1", 1023 | "indicator": "1", 1024 | "name": "Gleneagles Hospital / Singapore Botanic Gardens" 1025 | }, 1026 | { 1027 | "id": "CMStation_napier_4_E44176", 1028 | "coords": [ 1029 | 1.306334, 1030 | 103.819374 1031 | ], 1032 | "station_id": "CMStation_napier_4", 1033 | "short_name": "2", 1034 | "indicator": "2", 1035 | "name": "Napier Rd / Holland Rd" 1036 | } 1037 | ], 1038 | "Woodlands South": [ 1039 | { 1040 | "id": "CMStation_woodlands_south_E41025", 1041 | "coords": [ 1042 | 1.427604964, 1043 | 103.7934137 1044 | ], 1045 | "station_id": "CMStation_woodlands_south", 1046 | "short_name": "2", 1047 | "indicator": "2", 1048 | "name": "Blk 541" 1049 | }, 1050 | { 1051 | "id": "CMStation_woodlands_south_E41026", 1052 | "coords": [ 1053 | 1.427302017, 1054 | 103.7930275 1055 | ], 1056 | "station_id": "CMStation_woodlands_south", 1057 | "short_name": "1", 1058 | "indicator": "1", 1059 | "name": "Christ Church Sec School" 1060 | }, 1061 | { 1062 | "id": "CMStation_woodlands_south_E41027", 1063 | "coords": [ 1064 | 1.42742676, 1065 | 103.7945605 1066 | ], 1067 | "station_id": "CMStation_woodlands_south", 1068 | "short_name": "3", 1069 | "indicator": "3", 1070 | "name": "Blk 588" 1071 | }, 1072 | { 1073 | "id": "CMStation_woodlands_south_E41028", 1074 | "coords": [ 1075 | 1.426684241, 1076 | 103.7944238 1077 | ], 1078 | "station_id": "CMStation_woodlands_south", 1079 | "short_name": "4", 1080 | "indicator": "4", 1081 | "name": "Masjid Yusof Ishak" 1082 | } 1083 | ] 1084 | } -------------------------------------------------------------------------------- /data/raw/wikipedia-mrt.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "codes": [ 4 | "NS1", 5 | "EW24", 6 | "JE5" 7 | ], 8 | "name": "Jurong East", 9 | "name_zh_Hans": "裕廊东", 10 | "name_ta": "ஜூரோங் கிழக்கு", 11 | "title": "Jurong East MRT station", 12 | "url": "/wiki/Jurong_East_MRT_station" 13 | }, 14 | { 15 | "codes": [ 16 | "NS2" 17 | ], 18 | "name": "Bukit Batok", 19 | "name_zh_Hans": "武吉巴督", 20 | "name_ta": "புக்கிட் பாத்தோக்", 21 | "title": "Bukit Batok MRT station", 22 | "url": "/wiki/Bukit_Batok_MRT_station" 23 | }, 24 | { 25 | "codes": [ 26 | "NS3" 27 | ], 28 | "name": "Bukit Gombak", 29 | "name_zh_Hans": "武吉甘柏", 30 | "name_ta": "புக்கிட் கோம்பாக்", 31 | "title": "Bukit Gombak MRT station", 32 | "url": "/wiki/Bukit_Gombak_MRT_station" 33 | }, 34 | { 35 | "codes": [ 36 | "NS4", 37 | "JS1", 38 | "BP1" 39 | ], 40 | "name": "Choa Chu Kang", 41 | "name_zh_Hans": "蔡厝港", 42 | "name_ta": "சுவா சூ காங்", 43 | "title": "Choa Chu Kang MRT/LRT station", 44 | "url": "/wiki/Choa_Chu_Kang_MRT/LRT_station" 45 | }, 46 | { 47 | "codes": [ 48 | "NS5" 49 | ], 50 | "name": "Yew Tee", 51 | "name_zh_Hans": "油池", 52 | "name_ta": "இயூ டீ", 53 | "title": "Yew Tee MRT station", 54 | "url": "/wiki/Yew_Tee_MRT_station" 55 | }, 56 | { 57 | "codes": [ 58 | "NS7" 59 | ], 60 | "name": "Kranji", 61 | "name_zh_Hans": "克兰芝", 62 | "name_ta": "கிராஞ்சி", 63 | "title": "Kranji MRT station", 64 | "url": "/wiki/Kranji_MRT_station" 65 | }, 66 | { 67 | "codes": [ 68 | "NS8" 69 | ], 70 | "name": "Marsiling", 71 | "name_zh_Hans": "马西岭", 72 | "name_ta": "மார்சிலிங்", 73 | "title": "Marsiling MRT station", 74 | "url": "/wiki/Marsiling_MRT_station" 75 | }, 76 | { 77 | "codes": [ 78 | "NS9", 79 | "TE2" 80 | ], 81 | "name": "Woodlands", 82 | "name_zh_Hans": "兀兰", 83 | "name_ta": "ஊட்லண்ட்ஸ்", 84 | "title": "Woodlands MRT station", 85 | "url": "/wiki/Woodlands_MRT_station" 86 | }, 87 | { 88 | "codes": [ 89 | "NS10" 90 | ], 91 | "name": "Admiralty", 92 | "name_zh_Hans": "海军部", 93 | "name_ta": "அட்மிரல்ட்டி", 94 | "title": "Admiralty MRT station", 95 | "url": "/wiki/Admiralty_MRT_station" 96 | }, 97 | { 98 | "codes": [ 99 | "NS11" 100 | ], 101 | "name": "Sembawang", 102 | "name_zh_Hans": "三巴旺", 103 | "name_ta": "செம்பாவாங்", 104 | "title": "Sembawang MRT station", 105 | "url": "/wiki/Sembawang_MRT_station" 106 | }, 107 | { 108 | "codes": [ 109 | "NS12" 110 | ], 111 | "name": "Canberra", 112 | "name_zh_Hans": "坎贝拉", 113 | "name_ta": "கான்பரா", 114 | "title": "Canberra MRT station", 115 | "url": "/wiki/Canberra_MRT_station" 116 | }, 117 | { 118 | "codes": [ 119 | "NS13" 120 | ], 121 | "name": "Yishun", 122 | "name_zh_Hans": "义顺", 123 | "name_ta": "யீஷூன்", 124 | "title": "Yishun MRT station", 125 | "url": "/wiki/Yishun_MRT_station" 126 | }, 127 | { 128 | "codes": [ 129 | "NS14" 130 | ], 131 | "name": "Khatib", 132 | "name_zh_Hans": "卡迪", 133 | "name_ta": "காதிப்", 134 | "title": "Khatib MRT station", 135 | "url": "/wiki/Khatib_MRT_station" 136 | }, 137 | { 138 | "codes": [ 139 | "NS15" 140 | ], 141 | "name": "Yio Chu Kang", 142 | "name_zh_Hans": "杨厝港", 143 | "name_ta": "இயோ சூ காங்", 144 | "title": "Yio Chu Kang MRT station", 145 | "url": "/wiki/Yio_Chu_Kang_MRT_station" 146 | }, 147 | { 148 | "codes": [ 149 | "NS16", 150 | "CR11" 151 | ], 152 | "name": "Ang Mo Kio", 153 | "name_zh_Hans": "宏茂桥", 154 | "name_ta": "அங் மோ கியோ", 155 | "title": "Ang Mo Kio MRT station", 156 | "url": "/wiki/Ang_Mo_Kio_MRT_station" 157 | }, 158 | { 159 | "codes": [ 160 | "NS17", 161 | "CC15" 162 | ], 163 | "name": "Bishan", 164 | "name_zh_Hans": "碧山", 165 | "name_ta": "பீஷான்", 166 | "title": "Bishan MRT station", 167 | "url": "/wiki/Bishan_MRT_station" 168 | }, 169 | { 170 | "codes": [ 171 | "NS18" 172 | ], 173 | "name": "Braddell", 174 | "name_zh_Hans": "布莱德", 175 | "name_ta": "பிரேடல்", 176 | "title": "Braddell MRT station", 177 | "url": "/wiki/Braddell_MRT_station" 178 | }, 179 | { 180 | "codes": [ 181 | "NS19" 182 | ], 183 | "name": "Toa Payoh", 184 | "name_zh_Hans": "大巴窑", 185 | "name_ta": "தோ பாயோ", 186 | "title": "Toa Payoh MRT station", 187 | "url": "/wiki/Toa_Payoh_MRT_station" 188 | }, 189 | { 190 | "codes": [ 191 | "NS20" 192 | ], 193 | "name": "Novena", 194 | "name_zh_Hans": "诺维娜", 195 | "name_ta": "நொவீனா", 196 | "title": "Novena MRT station", 197 | "url": "/wiki/Novena_MRT_station" 198 | }, 199 | { 200 | "codes": [ 201 | "NS21", 202 | "DT11" 203 | ], 204 | "name": "Newton", 205 | "name_zh_Hans": "纽顿", 206 | "name_ta": "நியூட்டன்", 207 | "title": "Newton MRT station", 208 | "url": "/wiki/Newton_MRT_station" 209 | }, 210 | { 211 | "codes": [ 212 | "NS22", 213 | "TE14" 214 | ], 215 | "name": "Orchard", 216 | "name_zh_Hans": "乌节", 217 | "name_ta": "ஆர்ச்சர்ட்", 218 | "title": "Orchard MRT station", 219 | "url": "/wiki/Orchard_MRT_station" 220 | }, 221 | { 222 | "codes": [ 223 | "NS23" 224 | ], 225 | "name": "Somerset", 226 | "name_zh_Hans": "索美塞", 227 | "name_ta": "சாமர்செட்", 228 | "title": "Somerset MRT station", 229 | "url": "/wiki/Somerset_MRT_station" 230 | }, 231 | { 232 | "codes": [ 233 | "NS24", 234 | "NE6", 235 | "CC1" 236 | ], 237 | "name": "Dhoby Ghaut", 238 | "name_zh_Hans": "多美歌", 239 | "name_ta": "டோபி காட்", 240 | "title": "Dhoby Ghaut MRT station", 241 | "url": "/wiki/Dhoby_Ghaut_MRT_station" 242 | }, 243 | { 244 | "codes": [ 245 | "NS25", 246 | "EW13" 247 | ], 248 | "name": "City Hall", 249 | "name_zh_Hans": "政府大厦", 250 | "name_ta": "நகர மண்டபம்", 251 | "title": "City Hall MRT station", 252 | "url": "/wiki/City_Hall_MRT_station" 253 | }, 254 | { 255 | "codes": [ 256 | "NS26", 257 | "EW14" 258 | ], 259 | "name": "Raffles Place", 260 | "name_zh_Hans": "莱佛士坊", 261 | "name_ta": "ராஃபிள்ஸ் பிளேஸ்", 262 | "title": "Raffles Place MRT station", 263 | "url": "/wiki/Raffles_Place_MRT_station" 264 | }, 265 | { 266 | "codes": [ 267 | "NS27", 268 | "CE2", 269 | "TE20" 270 | ], 271 | "name": "Marina Bay", 272 | "name_zh_Hans": "滨海湾", 273 | "name_ta": "மரீனா பே", 274 | "title": "Marina Bay MRT station", 275 | "url": "/wiki/Marina_Bay_MRT_station" 276 | }, 277 | { 278 | "codes": [ 279 | "NS28" 280 | ], 281 | "name": "Marina South Pier", 282 | "name_zh_Hans": "滨海南码头", 283 | "name_ta": "மரினா சவுத் படகுத்துறை", 284 | "title": "Marina South Pier MRT station", 285 | "url": "/wiki/Marina_South_Pier_MRT_station" 286 | }, 287 | { 288 | "codes": [ 289 | "EW1", 290 | "CR5", 291 | "CP1" 292 | ], 293 | "name": "Pasir Ris", 294 | "name_zh_Hans": "巴西立", 295 | "name_ta": "பாசிர் ரிஸ்", 296 | "title": "Pasir Ris MRT station", 297 | "url": "/wiki/Pasir_Ris_MRT_station" 298 | }, 299 | { 300 | "codes": [ 301 | "EW2", 302 | "DT32" 303 | ], 304 | "name": "Tampines", 305 | "name_zh_Hans": "淡滨尼", 306 | "name_ta": "தெம்பினிஸ்", 307 | "title": "Tampines MRT station", 308 | "url": "/wiki/Tampines_MRT_station" 309 | }, 310 | { 311 | "codes": [ 312 | "EW3" 313 | ], 314 | "name": "Simei", 315 | "name_zh_Hans": "四美", 316 | "name_ta": "ஸீமெய்", 317 | "title": "Simei MRT station", 318 | "url": "/wiki/Simei_MRT_station" 319 | }, 320 | { 321 | "codes": [ 322 | "EW4", 323 | "CG" 324 | ], 325 | "name": "Tanah Merah", 326 | "name_zh_Hans": "丹那美拉", 327 | "name_ta": "தானா மேரா", 328 | "title": "Tanah Merah MRT station", 329 | "url": "/wiki/Tanah_Merah_MRT_station" 330 | }, 331 | { 332 | "codes": [ 333 | "EW5" 334 | ], 335 | "name": "Bedok", 336 | "name_zh_Hans": "勿洛", 337 | "name_ta": "பிடோக்", 338 | "title": "Bedok MRT station", 339 | "url": "/wiki/Bedok_MRT_station" 340 | }, 341 | { 342 | "codes": [ 343 | "EW6" 344 | ], 345 | "name": "Kembangan", 346 | "name_zh_Hans": "景万岸", 347 | "name_ta": "கெம்பாங்கான்", 348 | "title": "Kembangan MRT station", 349 | "url": "/wiki/Kembangan_MRT_station" 350 | }, 351 | { 352 | "codes": [ 353 | "EW7" 354 | ], 355 | "name": "Eunos", 356 | "name_zh_Hans": "友诺士", 357 | "name_ta": "யூனுஸ்", 358 | "title": "Eunos MRT station", 359 | "url": "/wiki/Eunos_MRT_station" 360 | }, 361 | { 362 | "codes": [ 363 | "EW8", 364 | "CC9" 365 | ], 366 | "name": "Paya Lebar", 367 | "name_zh_Hans": "巴耶利峇", 368 | "name_ta": "பாய லேபார்", 369 | "title": "Paya Lebar MRT station", 370 | "url": "/wiki/Paya_Lebar_MRT_station" 371 | }, 372 | { 373 | "codes": [ 374 | "EW9" 375 | ], 376 | "name": "Aljunied", 377 | "name_zh_Hans": "阿裕尼", 378 | "name_ta": "அல்ஜூனிட்", 379 | "title": "Aljunied MRT station", 380 | "url": "/wiki/Aljunied_MRT_station" 381 | }, 382 | { 383 | "codes": [ 384 | "EW10" 385 | ], 386 | "name": "Kallang", 387 | "name_zh_Hans": "加冷", 388 | "name_ta": "காலாங்", 389 | "title": "Kallang MRT station", 390 | "url": "/wiki/Kallang_MRT_station" 391 | }, 392 | { 393 | "codes": [ 394 | "EW11" 395 | ], 396 | "name": "Lavender", 397 | "name_zh_Hans": "劳明达", 398 | "name_ta": "லவண்டர்", 399 | "title": "Lavender MRT station", 400 | "url": "/wiki/Lavender_MRT_station" 401 | }, 402 | { 403 | "codes": [ 404 | "EW12", 405 | "DT14" 406 | ], 407 | "name": "Bugis", 408 | "name_zh_Hans": "武吉士", 409 | "name_ta": "பூகிஸ்", 410 | "title": "Bugis MRT station", 411 | "url": "/wiki/Bugis_MRT_station" 412 | }, 413 | { 414 | "codes": [ 415 | "EW15" 416 | ], 417 | "name": "Tanjong Pagar", 418 | "name_zh_Hans": "丹戎巴葛", 419 | "name_ta": "தஞ்சோங் பகார்", 420 | "title": "Tanjong Pagar MRT station", 421 | "url": "/wiki/Tanjong_Pagar_MRT_station" 422 | }, 423 | { 424 | "codes": [ 425 | "EW16", 426 | "NE3", 427 | "TE17" 428 | ], 429 | "name": "Outram Park", 430 | "name_zh_Hans": "欧南园", 431 | "name_ta": "ஊட்ரம் பார்க்", 432 | "title": "Outram Park MRT station", 433 | "url": "/wiki/Outram_Park_MRT_station" 434 | }, 435 | { 436 | "codes": [ 437 | "EW17" 438 | ], 439 | "name": "Tiong Bahru", 440 | "name_zh_Hans": "中峇鲁", 441 | "name_ta": "தியோங் பாரு", 442 | "title": "Tiong Bahru MRT station", 443 | "url": "/wiki/Tiong_Bahru_MRT_station" 444 | }, 445 | { 446 | "codes": [ 447 | "EW18" 448 | ], 449 | "name": "Redhill", 450 | "name_zh_Hans": "红山", 451 | "name_ta": "ரெட்ஹில்", 452 | "title": "Redhill MRT station", 453 | "url": "/wiki/Redhill_MRT_station" 454 | }, 455 | { 456 | "codes": [ 457 | "EW19" 458 | ], 459 | "name": "Queenstown", 460 | "name_zh_Hans": "女皇镇", 461 | "name_ta": "குவீன்ஸ்டவுன்", 462 | "title": "Queenstown MRT station", 463 | "url": "/wiki/Queenstown_MRT_station" 464 | }, 465 | { 466 | "codes": [ 467 | "EW20" 468 | ], 469 | "name": "Commonwealth", 470 | "name_zh_Hans": "联邦", 471 | "name_ta": "காமன்வெல்த்", 472 | "title": "Commonwealth MRT station", 473 | "url": "/wiki/Commonwealth_MRT_station" 474 | }, 475 | { 476 | "codes": [ 477 | "EW21", 478 | "CC22" 479 | ], 480 | "name": "Buona Vista", 481 | "name_zh_Hans": "波那维斯达", 482 | "name_ta": "புவன விஸ்தா", 483 | "title": "Buona Vista MRT station", 484 | "url": "/wiki/Buona_Vista_MRT_station" 485 | }, 486 | { 487 | "codes": [ 488 | "EW22" 489 | ], 490 | "name": "Dover", 491 | "name_zh_Hans": "杜弗", 492 | "name_ta": "டோவெர்", 493 | "title": "Dover MRT station", 494 | "url": "/wiki/Dover_MRT_station" 495 | }, 496 | { 497 | "codes": [ 498 | "EW23", 499 | "CR17" 500 | ], 501 | "name": "Clementi", 502 | "name_zh_Hans": "金文泰", 503 | "name_ta": "கிளிமெண்டி", 504 | "title": "Clementi MRT station", 505 | "url": "/wiki/Clementi_MRT_station" 506 | }, 507 | { 508 | "codes": [ 509 | "EW25" 510 | ], 511 | "name": "Chinese Garden", 512 | "name_zh_Hans": "裕华园", 513 | "name_ta": "சீனத் தோட்டம்", 514 | "title": "Chinese Garden MRT station", 515 | "url": "/wiki/Chinese_Garden_MRT_station" 516 | }, 517 | { 518 | "codes": [ 519 | "EW26" 520 | ], 521 | "name": "Lakeside", 522 | "name_zh_Hans": "湖畔", 523 | "name_ta": "ஏரிக்கரை", 524 | "title": "Lakeside MRT station", 525 | "url": "/wiki/Lakeside_MRT_station" 526 | }, 527 | { 528 | "codes": [ 529 | "EW27", 530 | "JS8" 531 | ], 532 | "name": "Boon Lay", 533 | "name_zh_Hans": "文礼", 534 | "name_ta": "பூன் லே", 535 | "title": "Boon Lay MRT station", 536 | "url": "/wiki/Boon_Lay_MRT_station" 537 | }, 538 | { 539 | "codes": [ 540 | "EW28" 541 | ], 542 | "name": "Pioneer", 543 | "name_zh_Hans": "先驱", 544 | "name_ta": "பயனியர்", 545 | "title": "Pioneer MRT station", 546 | "url": "/wiki/Pioneer_MRT_station" 547 | }, 548 | { 549 | "codes": [ 550 | "EW29" 551 | ], 552 | "name": "Joo Koon", 553 | "name_zh_Hans": "裕群", 554 | "name_ta": "ஜூ கூன்", 555 | "title": "Joo Koon MRT station", 556 | "url": "/wiki/Joo_Koon_MRT_station" 557 | }, 558 | { 559 | "codes": [ 560 | "EW30", 561 | "CR24" 562 | ], 563 | "name": "Gul Circle", 564 | "name_zh_Hans": "卡尔圈", 565 | "name_ta": "கல் சர்க்கல்", 566 | "title": "Gul Circle MRT station", 567 | "url": "/wiki/Gul_Circle_MRT_station" 568 | }, 569 | { 570 | "codes": [ 571 | "EW31" 572 | ], 573 | "name": "Tuas Crescent", 574 | "name_zh_Hans": "大士弯", 575 | "name_ta": "துவாஸ் கிரசண்ட்", 576 | "title": "Tuas Crescent MRT station", 577 | "url": "/wiki/Tuas_Crescent_MRT_station" 578 | }, 579 | { 580 | "codes": [ 581 | "EW32" 582 | ], 583 | "name": "Tuas West Road", 584 | "name_zh_Hans": "大士西路", 585 | "name_ta": "துவாஸ் வெஸ்ட் ரோடு", 586 | "title": "Tuas West Road MRT station", 587 | "url": "/wiki/Tuas_West_Road_MRT_station" 588 | }, 589 | { 590 | "codes": [ 591 | "EW33" 592 | ], 593 | "name": "Tuas Link", 594 | "name_zh_Hans": "大士连路", 595 | "name_ta": "துவாஸ் லிங்க்", 596 | "title": "Tuas Link MRT station", 597 | "url": "/wiki/Tuas_Link_MRT_station" 598 | }, 599 | { 600 | "codes": [ 601 | "CG1", 602 | "DT35" 603 | ], 604 | "name": "Expo", 605 | "name_zh_Hans": "博览", 606 | "name_ta": "எக்ஸ்போ", 607 | "title": "Expo MRT station", 608 | "url": "/wiki/Expo_MRT_station" 609 | }, 610 | { 611 | "codes": [ 612 | "CG2" 613 | ], 614 | "name": "Changi Airport", 615 | "name_zh_Hans": "樟宜机场", 616 | "name_ta": "சாங்கி விமானநிலையம்", 617 | "title": "Changi Airport MRT station", 618 | "url": "/wiki/Changi_Airport_MRT_station" 619 | }, 620 | { 621 | "codes": [ 622 | "NE1", 623 | "CC29" 624 | ], 625 | "name": "HarbourFront", 626 | "name_zh_Hans": "港湾", 627 | "name_ta": "துறைமுகம்", 628 | "title": "HarbourFront MRT station", 629 | "url": "/wiki/HarbourFront_MRT_station" 630 | }, 631 | { 632 | "codes": [ 633 | "NE4", 634 | "DT19" 635 | ], 636 | "name": "Chinatown", 637 | "name_zh_Hans": "牛车水", 638 | "name_ta": "சைனாடவுன்", 639 | "title": "Chinatown MRT station", 640 | "url": "/wiki/Chinatown_MRT_station" 641 | }, 642 | { 643 | "codes": [ 644 | "NE5" 645 | ], 646 | "name": "Clarke Quay", 647 | "name_zh_Hans": "克拉码头", 648 | "name_ta": "கிளார்க் கீ", 649 | "title": "Clarke Quay MRT station", 650 | "url": "/wiki/Clarke_Quay_MRT_station" 651 | }, 652 | { 653 | "codes": [ 654 | "NE7", 655 | "DT12" 656 | ], 657 | "name": "Little India", 658 | "name_zh_Hans": "小印度", 659 | "name_ta": "லிட்டில் இந்தியா", 660 | "title": "Little India MRT station", 661 | "url": "/wiki/Little_India_MRT_station" 662 | }, 663 | { 664 | "codes": [ 665 | "NE8" 666 | ], 667 | "name": "Farrer Park", 668 | "name_zh_Hans": "花拉公园", 669 | "name_ta": "ஃபேரர் பார்க்", 670 | "title": "Farrer Park MRT station", 671 | "url": "/wiki/Farrer_Park_MRT_station" 672 | }, 673 | { 674 | "codes": [ 675 | "NE9" 676 | ], 677 | "name": "Boon Keng", 678 | "name_zh_Hans": "文庆", 679 | "name_ta": "பூன் கெங்", 680 | "title": "Boon Keng MRT station", 681 | "url": "/wiki/Boon_Keng_MRT_station" 682 | }, 683 | { 684 | "codes": [ 685 | "NE10" 686 | ], 687 | "name": "Potong Pasir", 688 | "name_zh_Hans": "波东巴西", 689 | "name_ta": "போத்தோங் பாசிர்", 690 | "title": "Potong Pasir MRT station", 691 | "url": "/wiki/Potong_Pasir_MRT_station" 692 | }, 693 | { 694 | "codes": [ 695 | "NE11" 696 | ], 697 | "name": "Woodleigh", 698 | "name_zh_Hans": "兀里", 699 | "name_ta": "உட்லீ", 700 | "title": "Woodleigh MRT station", 701 | "url": "/wiki/Woodleigh_MRT_station" 702 | }, 703 | { 704 | "codes": [ 705 | "NE12", 706 | "CC13" 707 | ], 708 | "name": "Serangoon", 709 | "name_zh_Hans": "实龙岗", 710 | "name_ta": "சிராங்கூன்", 711 | "title": "Serangoon MRT station", 712 | "url": "/wiki/Serangoon_MRT_station" 713 | }, 714 | { 715 | "codes": [ 716 | "NE13" 717 | ], 718 | "name": "Kovan", 719 | "name_zh_Hans": "高文", 720 | "name_ta": "கோவன்", 721 | "title": "Kovan MRT station", 722 | "url": "/wiki/Kovan_MRT_station" 723 | }, 724 | { 725 | "codes": [ 726 | "NE14", 727 | "CR8" 728 | ], 729 | "name": "Hougang", 730 | "name_zh_Hans": "后港", 731 | "name_ta": "ஹவ்காங்", 732 | "title": "Hougang MRT station", 733 | "url": "/wiki/Hougang_MRT_station" 734 | }, 735 | { 736 | "codes": [ 737 | "NE15" 738 | ], 739 | "name": "Buangkok", 740 | "name_zh_Hans": "万国", 741 | "name_ta": "புவாங்கோக்", 742 | "title": "Buangkok MRT station", 743 | "url": "/wiki/Buangkok_MRT_station" 744 | }, 745 | { 746 | "codes": [ 747 | "NE16", 748 | "STC" 749 | ], 750 | "name": "Sengkang", 751 | "name_zh_Hans": "盛港", 752 | "name_ta": "செங்காங்", 753 | "title": "Sengkang MRT/LRT station", 754 | "url": "/wiki/Sengkang_MRT/LRT_station" 755 | }, 756 | { 757 | "codes": [ 758 | "NE17", 759 | "CP4", 760 | "PTC" 761 | ], 762 | "name": "Punggol", 763 | "name_zh_Hans": "榜鹅", 764 | "name_ta": "பொங்கோல்", 765 | "title": "Punggol MRT/LRT station", 766 | "url": "/wiki/Punggol_MRT/LRT_station" 767 | }, 768 | { 769 | "codes": [ 770 | "NE18" 771 | ], 772 | "name": "Punggol Coast", 773 | "name_zh_Hans": "榜鹅海岸", 774 | "name_ta": "பொங்கோல் கோஸ்ட்", 775 | "title": "Punggol Coast MRT station", 776 | "url": "/wiki/Punggol_Coast_MRT_station" 777 | }, 778 | { 779 | "codes": [ 780 | "CC2" 781 | ], 782 | "name": "Bras Basah", 783 | "name_zh_Hans": "百胜", 784 | "name_ta": "பிராஸ் பாசா", 785 | "title": "Bras Basah MRT station", 786 | "url": "/wiki/Bras_Basah_MRT_station" 787 | }, 788 | { 789 | "codes": [ 790 | "CC3" 791 | ], 792 | "name": "Esplanade", 793 | "name_zh_Hans": "滨海中心", 794 | "name_ta": "எஸ்பிளனேட்", 795 | "title": "Esplanade MRT station", 796 | "url": "/wiki/Esplanade_MRT_station" 797 | }, 798 | { 799 | "codes": [ 800 | "CC4", 801 | "DT15" 802 | ], 803 | "name": "Promenade", 804 | "name_zh_Hans": "宝门廊", 805 | "name_ta": "புரொமனாட்", 806 | "title": "Promenade MRT station", 807 | "url": "/wiki/Promenade_MRT_station" 808 | }, 809 | { 810 | "codes": [ 811 | "CC5" 812 | ], 813 | "name": "Nicoll Highway", 814 | "name_zh_Hans": "尼诰大道", 815 | "name_ta": "நிக்கல் நெடுஞ்சாலை", 816 | "title": "Nicoll Highway MRT station", 817 | "url": "/wiki/Nicoll_Highway_MRT_station" 818 | }, 819 | { 820 | "codes": [ 821 | "CC6" 822 | ], 823 | "name": "Stadium", 824 | "name_zh_Hans": "体育场", 825 | "name_ta": "ஸ்டேடியம்", 826 | "title": "Stadium MRT station", 827 | "url": "/wiki/Stadium_MRT_station" 828 | }, 829 | { 830 | "codes": [ 831 | "CC7" 832 | ], 833 | "name": "Mountbatten", 834 | "name_zh_Hans": "蒙巴登", 835 | "name_ta": "மவுண்ட்பேட்டன்", 836 | "title": "Mountbatten MRT station", 837 | "url": "/wiki/Mountbatten_MRT_station" 838 | }, 839 | { 840 | "codes": [ 841 | "CC8" 842 | ], 843 | "name": "Dakota", 844 | "name_zh_Hans": "达科达", 845 | "name_ta": "டகோட்டா", 846 | "title": "Dakota MRT station", 847 | "url": "/wiki/Dakota_MRT_station" 848 | }, 849 | { 850 | "codes": [ 851 | "CC10", 852 | "DT26" 853 | ], 854 | "name": "MacPherson", 855 | "name_zh_Hans": "麦波申", 856 | "name_ta": "மெக்பர்சன்", 857 | "title": "MacPherson MRT station", 858 | "url": "/wiki/MacPherson_MRT_station" 859 | }, 860 | { 861 | "codes": [ 862 | "CC11" 863 | ], 864 | "name": "Tai Seng", 865 | "name_zh_Hans": "大成", 866 | "name_ta": "தை செங்", 867 | "title": "Tai Seng MRT station", 868 | "url": "/wiki/Tai_Seng_MRT_station" 869 | }, 870 | { 871 | "codes": [ 872 | "CC12" 873 | ], 874 | "name": "Bartley", 875 | "name_zh_Hans": "巴特礼", 876 | "name_ta": "பார்ட்லி", 877 | "title": "Bartley MRT station", 878 | "url": "/wiki/Bartley_MRT_station" 879 | }, 880 | { 881 | "codes": [ 882 | "CC14" 883 | ], 884 | "name": "Lorong Chuan", 885 | "name_zh_Hans": "罗弄泉", 886 | "name_ta": "லோரோங் சுவான்", 887 | "title": "Lorong Chuan MRT station", 888 | "url": "/wiki/Lorong_Chuan_MRT_station" 889 | }, 890 | { 891 | "codes": [ 892 | "CC16" 893 | ], 894 | "name": "Marymount", 895 | "name_zh_Hans": "玛丽蒙", 896 | "name_ta": "மேரிமவுண்ட்", 897 | "title": "Marymount MRT station", 898 | "url": "/wiki/Marymount_MRT_station" 899 | }, 900 | { 901 | "codes": [ 902 | "CC17", 903 | "TE9" 904 | ], 905 | "name": "Caldecott", 906 | "name_zh_Hans": "加利谷", 907 | "name_ta": "கால்டிகாட்", 908 | "title": "Caldecott MRT station", 909 | "url": "/wiki/Caldecott_MRT_station" 910 | }, 911 | { 912 | "codes": [ 913 | "CC19", 914 | "DT9" 915 | ], 916 | "name": "Botanic Gardens", 917 | "name_zh_Hans": "植物园", 918 | "name_ta": "பூ மலை", 919 | "title": "Botanic Gardens MRT station", 920 | "url": "/wiki/Botanic_Gardens_MRT_station" 921 | }, 922 | { 923 | "codes": [ 924 | "CC20" 925 | ], 926 | "name": "Farrer Road", 927 | "name_zh_Hans": "花拉路", 928 | "name_ta": "ஃபேரர் சாலை", 929 | "title": "Farrer Road MRT station", 930 | "url": "/wiki/Farrer_Road_MRT_station" 931 | }, 932 | { 933 | "codes": [ 934 | "CC21" 935 | ], 936 | "name": "Holland Village", 937 | "name_zh_Hans": "荷兰村", 938 | "name_ta": "ஹாலந்து வில்லேஜ்", 939 | "title": "Holland Village MRT station", 940 | "url": "/wiki/Holland_Village_MRT_station" 941 | }, 942 | { 943 | "codes": [ 944 | "CC23" 945 | ], 946 | "name": "one-north", 947 | "name_zh_Hans": "纬壹", 948 | "name_ta": "ஒன்-நார்த்", 949 | "title": "One-north MRT station", 950 | "url": "/wiki/One-north_MRT_station" 951 | }, 952 | { 953 | "codes": [ 954 | "CC24" 955 | ], 956 | "name": "Kent Ridge", 957 | "name_zh_Hans": "肯特岗", 958 | "name_ta": "கெண்ட் ரிஜ்", 959 | "title": "Kent Ridge MRT station", 960 | "url": "/wiki/Kent_Ridge_MRT_station" 961 | }, 962 | { 963 | "codes": [ 964 | "CC25" 965 | ], 966 | "name": "Haw Par Villa", 967 | "name_zh_Hans": "虎豹别墅", 968 | "name_ta": "ஹா பர் வில்லா", 969 | "title": "Haw Par Villa MRT station", 970 | "url": "/wiki/Haw_Par_Villa_MRT_station" 971 | }, 972 | { 973 | "codes": [ 974 | "CC26" 975 | ], 976 | "name": "Pasir Panjang", 977 | "name_zh_Hans": "巴西班让", 978 | "name_ta": "பாசிர் பாஞ்சாங்", 979 | "title": "Pasir Panjang MRT station", 980 | "url": "/wiki/Pasir_Panjang_MRT_station" 981 | }, 982 | { 983 | "codes": [ 984 | "CC27" 985 | ], 986 | "name": "Labrador Park", 987 | "name_zh_Hans": "拉柏多公园", 988 | "name_ta": "லாப்ரடார் பூங்கா", 989 | "title": "Labrador Park MRT station", 990 | "url": "/wiki/Labrador_Park_MRT_station" 991 | }, 992 | { 993 | "codes": [ 994 | "CC28" 995 | ], 996 | "name": "Telok Blangah", 997 | "name_zh_Hans": "直落布兰雅", 998 | "name_ta": "தெலுக் பிளாங்கா", 999 | "title": "Telok Blangah MRT station", 1000 | "url": "/wiki/Telok_Blangah_MRT_station" 1001 | }, 1002 | { 1003 | "codes": [ 1004 | "CC30" 1005 | ], 1006 | "name": "Keppel", 1007 | "name_zh_Hans": "吉宝", 1008 | "name_ta": "கெப்பல்", 1009 | "title": "Keppel MRT station", 1010 | "url": "/wiki/Keppel_MRT_station" 1011 | }, 1012 | { 1013 | "codes": [ 1014 | "CC31" 1015 | ], 1016 | "name": "Cantonment", 1017 | "name_zh_Hans": "广东民", 1018 | "name_ta": "கெண்டொன்மன்", 1019 | "title": "Cantonment MRT station", 1020 | "url": "/wiki/Cantonment_MRT_station" 1021 | }, 1022 | { 1023 | "codes": [ 1024 | "CC32" 1025 | ], 1026 | "name": "Prince Edward Road", 1027 | "name_zh_Hans": "爱德华太子路", 1028 | "name_ta": "பிரின்ஸ் எட்வர்ட் ரோடு", 1029 | "title": "Prince Edward Road MRT station", 1030 | "url": "/wiki/Prince_Edward_Road_MRT_station" 1031 | }, 1032 | { 1033 | "codes": [ 1034 | "CE1", 1035 | "DT16" 1036 | ], 1037 | "name": "Bayfront", 1038 | "name_zh_Hans": "海湾舫", 1039 | "name_ta": "பேஃபிரண்ட்", 1040 | "title": "Bayfront MRT station", 1041 | "url": "/wiki/Bayfront_MRT_station" 1042 | }, 1043 | { 1044 | "codes": [ 1045 | "DT1", 1046 | "BP6" 1047 | ], 1048 | "name": "Bukit Panjang", 1049 | "name_zh_Hans": "武吉班让", 1050 | "name_ta": "புக்கிட் பாஞ்சாங்", 1051 | "title": "Bukit Panjang MRT/LRT station", 1052 | "url": "/wiki/Bukit_Panjang_MRT/LRT_station" 1053 | }, 1054 | { 1055 | "codes": [ 1056 | "DT2" 1057 | ], 1058 | "name": "Cashew", 1059 | "name_zh_Hans": "凯秀", 1060 | "name_ta": "கேஷ்யூ", 1061 | "title": "Cashew MRT station", 1062 | "url": "/wiki/Cashew_MRT_station" 1063 | }, 1064 | { 1065 | "codes": [ 1066 | "DT3" 1067 | ], 1068 | "name": "Hillview", 1069 | "name_zh_Hans": "山景", 1070 | "name_ta": "ஹில்வியூ", 1071 | "title": "Hillview MRT station", 1072 | "url": "/wiki/Hillview_MRT_station" 1073 | }, 1074 | { 1075 | "codes": [ 1076 | "DT4" 1077 | ], 1078 | "name": "Hume", 1079 | "name_zh_Hans": "谦道", 1080 | "name_ta": "ஹியூம்", 1081 | "title": "Hume MRT station", 1082 | "url": "/wiki/Hume_MRT_station" 1083 | }, 1084 | { 1085 | "codes": [ 1086 | "DT5" 1087 | ], 1088 | "name": "Beauty World", 1089 | "name_zh_Hans": "美世界", 1090 | "name_ta": "பியூட்டி வோர்ல்ட்", 1091 | "title": "Beauty World MRT station", 1092 | "url": "/wiki/Beauty_World_MRT_station" 1093 | }, 1094 | { 1095 | "codes": [ 1096 | "DT6", 1097 | "CR15" 1098 | ], 1099 | "name": "King Albert Park", 1100 | "name_zh_Hans": "阿尔柏王园", 1101 | "name_ta": "கிங் ஆல்பர்ட் பார்க்", 1102 | "title": "King Albert Park MRT station", 1103 | "url": "/wiki/King_Albert_Park_MRT_station" 1104 | }, 1105 | { 1106 | "codes": [ 1107 | "DT7" 1108 | ], 1109 | "name": "Sixth Avenue", 1110 | "name_zh_Hans": "第六道", 1111 | "name_ta": "சிக்ஸ்த் அவென்யூ", 1112 | "title": "Sixth Avenue MRT station", 1113 | "url": "/wiki/Sixth_Avenue_MRT_station" 1114 | }, 1115 | { 1116 | "codes": [ 1117 | "DT8" 1118 | ], 1119 | "name": "Tan Kah Kee", 1120 | "name_zh_Hans": "陈嘉庚", 1121 | "name_ta": "டான் கா கீ", 1122 | "title": "Tan Kah Kee MRT station", 1123 | "url": "/wiki/Tan_Kah_Kee_MRT_station" 1124 | }, 1125 | { 1126 | "codes": [ 1127 | "DT10", 1128 | "TE11" 1129 | ], 1130 | "name": "Stevens", 1131 | "name_zh_Hans": "史蒂芬", 1132 | "name_ta": "ஸ்டீவன்ஸ்", 1133 | "title": "Stevens MRT station", 1134 | "url": "/wiki/Stevens_MRT_station" 1135 | }, 1136 | { 1137 | "codes": [ 1138 | "DT13" 1139 | ], 1140 | "name": "Rochor", 1141 | "name_zh_Hans": "梧槽", 1142 | "name_ta": "ரோச்சோர்", 1143 | "title": "Rochor MRT station", 1144 | "url": "/wiki/Rochor_MRT_station" 1145 | }, 1146 | { 1147 | "codes": [ 1148 | "DT17" 1149 | ], 1150 | "name": "Downtown", 1151 | "name_zh_Hans": "市中心", 1152 | "name_ta": "டௌன்டவுன்", 1153 | "title": "Downtown MRT station", 1154 | "url": "/wiki/Downtown_MRT_station" 1155 | }, 1156 | { 1157 | "codes": [ 1158 | "DT18" 1159 | ], 1160 | "name": "Telok Ayer", 1161 | "name_zh_Hans": "直落亚逸", 1162 | "name_ta": "தெலுக் ஆயர்", 1163 | "title": "Telok Ayer MRT station", 1164 | "url": "/wiki/Telok_Ayer_MRT_station" 1165 | }, 1166 | { 1167 | "codes": [ 1168 | "DT20" 1169 | ], 1170 | "name": "Fort Canning", 1171 | "name_zh_Hans": "福康宁", 1172 | "name_ta": "ஃபோர்ட் கெனிங்", 1173 | "title": "Fort Canning MRT station", 1174 | "url": "/wiki/Fort_Canning_MRT_station" 1175 | }, 1176 | { 1177 | "codes": [ 1178 | "DT21" 1179 | ], 1180 | "name": "Bencoolen", 1181 | "name_zh_Hans": "明古连", 1182 | "name_ta": "பென்கூலன்", 1183 | "title": "Bencoolen MRT station", 1184 | "url": "/wiki/Bencoolen_MRT_station" 1185 | }, 1186 | { 1187 | "codes": [ 1188 | "DT22" 1189 | ], 1190 | "name": "Jalan Besar", 1191 | "name_zh_Hans": "惹兰勿刹", 1192 | "name_ta": "ஜாலான் புசார்", 1193 | "title": "Jalan Besar MRT station", 1194 | "url": "/wiki/Jalan_Besar_MRT_station" 1195 | }, 1196 | { 1197 | "codes": [ 1198 | "DT23" 1199 | ], 1200 | "name": "Bendemeer", 1201 | "name_zh_Hans": "明地迷亚", 1202 | "name_ta": "பெண்டிமியர்", 1203 | "title": "Bendemeer MRT station", 1204 | "url": "/wiki/Bendemeer_MRT_station" 1205 | }, 1206 | { 1207 | "codes": [ 1208 | "DT24" 1209 | ], 1210 | "name": "Geylang Bahru", 1211 | "name_zh_Hans": "芽笼峇鲁", 1212 | "name_ta": "கேலாங் பாரு", 1213 | "title": "Geylang Bahru MRT station", 1214 | "url": "/wiki/Geylang_Bahru_MRT_station" 1215 | }, 1216 | { 1217 | "codes": [ 1218 | "DT25" 1219 | ], 1220 | "name": "Mattar", 1221 | "name_zh_Hans": "玛达", 1222 | "name_ta": "மாத்தார்", 1223 | "title": "Mattar MRT station", 1224 | "url": "/wiki/Mattar_MRT_station" 1225 | }, 1226 | { 1227 | "codes": [ 1228 | "DT27" 1229 | ], 1230 | "name": "Ubi", 1231 | "name_zh_Hans": "乌美", 1232 | "name_ta": "உபி", 1233 | "title": "Ubi MRT station", 1234 | "url": "/wiki/Ubi_MRT_station" 1235 | }, 1236 | { 1237 | "codes": [ 1238 | "DT28" 1239 | ], 1240 | "name": "Kaki Bukit", 1241 | "name_zh_Hans": "加基武吉", 1242 | "name_ta": "காக்கி புக்கிட்", 1243 | "title": "Kaki Bukit MRT station", 1244 | "url": "/wiki/Kaki_Bukit_MRT_station" 1245 | }, 1246 | { 1247 | "codes": [ 1248 | "DT29" 1249 | ], 1250 | "name": "Bedok North", 1251 | "name_zh_Hans": "勿洛北", 1252 | "name_ta": "பிடோக் நார்த்", 1253 | "title": "Bedok North MRT station", 1254 | "url": "/wiki/Bedok_North_MRT_station" 1255 | }, 1256 | { 1257 | "codes": [ 1258 | "DT30" 1259 | ], 1260 | "name": "Bedok Reservoir", 1261 | "name_zh_Hans": "勿洛蓄水池", 1262 | "name_ta": "பிடோக் ரெசவோர்", 1263 | "title": "Bedok Reservoir MRT station", 1264 | "url": "/wiki/Bedok_Reservoir_MRT_station" 1265 | }, 1266 | { 1267 | "codes": [ 1268 | "DT31" 1269 | ], 1270 | "name": "Tampines West", 1271 | "name_zh_Hans": "淡滨尼西", 1272 | "name_ta": "தெம்பினிஸ் வெஸ்ட்", 1273 | "title": "Tampines West MRT station", 1274 | "url": "/wiki/Tampines_West_MRT_station" 1275 | }, 1276 | { 1277 | "codes": [ 1278 | "DT33" 1279 | ], 1280 | "name": "Tampines East", 1281 | "name_zh_Hans": "淡滨尼东", 1282 | "name_ta": "தெம்பினிஸ் ஈஸ்ட்", 1283 | "title": "Tampines East MRT station", 1284 | "url": "/wiki/Tampines_East_MRT_station" 1285 | }, 1286 | { 1287 | "codes": [ 1288 | "DT34" 1289 | ], 1290 | "name": "Upper Changi", 1291 | "name_zh_Hans": "樟宜上段", 1292 | "name_ta": "அப்பர் சாங்கி", 1293 | "title": "Upper Changi MRT station", 1294 | "url": "/wiki/Upper_Changi_MRT_station" 1295 | }, 1296 | { 1297 | "codes": [ 1298 | "DT36" 1299 | ], 1300 | "name": "Xilin", 1301 | "name_zh_Hans": "锡林", 1302 | "name_ta": "ஸீலின்", 1303 | "title": "Xilin MRT station", 1304 | "url": "/wiki/Xilin_MRT_station" 1305 | }, 1306 | { 1307 | "codes": [ 1308 | "DT37", 1309 | "TE31" 1310 | ], 1311 | "name": "Sungei Bedok", 1312 | "name_zh_Hans": "双溪勿洛", 1313 | "name_ta": "சங்கை பிடோக்", 1314 | "title": "Sungei Bedok MRT station", 1315 | "url": "/wiki/Sungei_Bedok_MRT_station" 1316 | }, 1317 | { 1318 | "codes": [ 1319 | "TE1" 1320 | ], 1321 | "name": "Woodlands North", 1322 | "name_zh_Hans": "兀兰北", 1323 | "name_ta": "உட்லண்ட்ஸ் நார்த்", 1324 | "title": "Woodlands North MRT station", 1325 | "url": "/wiki/Woodlands_North_MRT_station" 1326 | }, 1327 | { 1328 | "codes": [ 1329 | "TE3" 1330 | ], 1331 | "name": "Woodlands South", 1332 | "name_zh_Hans": "兀兰南", 1333 | "name_ta": "உட்லண்ட்ஸ் சவுத்", 1334 | "title": "Woodlands South MRT station", 1335 | "url": "/wiki/Woodlands_South_MRT_station" 1336 | }, 1337 | { 1338 | "codes": [ 1339 | "TE4" 1340 | ], 1341 | "name": "Springleaf", 1342 | "name_zh_Hans": "春叶", 1343 | "name_ta": "ஸ்பிரிங்லீஃவ்", 1344 | "title": "Springleaf MRT station", 1345 | "url": "/wiki/Springleaf_MRT_station" 1346 | }, 1347 | { 1348 | "codes": [ 1349 | "TE5" 1350 | ], 1351 | "name": "Lentor", 1352 | "name_zh_Hans": "伦多", 1353 | "name_ta": "லென்ட்டோர்", 1354 | "title": "Lentor MRT station", 1355 | "url": "/wiki/Lentor_MRT_station" 1356 | }, 1357 | { 1358 | "codes": [ 1359 | "TE6" 1360 | ], 1361 | "name": "Mayflower", 1362 | "name_zh_Hans": "美华", 1363 | "name_ta": "மேஃபிளவர்", 1364 | "title": "Mayflower MRT station", 1365 | "url": "/wiki/Mayflower_MRT_station" 1366 | }, 1367 | { 1368 | "codes": [ 1369 | "TE7", 1370 | "CR13" 1371 | ], 1372 | "name": "Bright Hill", 1373 | "name_zh_Hans": "光明山", 1374 | "name_ta": "பிரைட் ஹில்", 1375 | "title": "Bright Hill MRT station", 1376 | "url": "/wiki/Bright_Hill_MRT_station" 1377 | }, 1378 | { 1379 | "codes": [ 1380 | "TE8" 1381 | ], 1382 | "name": "Upper Thomson", 1383 | "name_zh_Hans": "汤申路上段", 1384 | "name_ta": "அப்பர் தாம்சன்", 1385 | "title": "Upper Thomson MRT station", 1386 | "url": "/wiki/Upper_Thomson_MRT_station" 1387 | }, 1388 | { 1389 | "codes": [ 1390 | "TE12" 1391 | ], 1392 | "name": "Napier", 1393 | "name_zh_Hans": "纳比雅", 1394 | "name_ta": "நேப்பியர்", 1395 | "title": "Napier MRT station", 1396 | "url": "/wiki/Napier_MRT_station" 1397 | }, 1398 | { 1399 | "codes": [ 1400 | "TE13" 1401 | ], 1402 | "name": "Orchard Boulevard", 1403 | "name_zh_Hans": "乌节大道", 1404 | "name_ta": "ஆர்ச்சர்ட் பொலிவார்ட்", 1405 | "title": "Orchard Boulevard MRT station", 1406 | "url": "/wiki/Orchard_Boulevard_MRT_station" 1407 | }, 1408 | { 1409 | "codes": [ 1410 | "TE15" 1411 | ], 1412 | "name": "Great World", 1413 | "name_zh_Hans": "大世界", 1414 | "name_ta": "கிரேட் வோர்ல்ட்", 1415 | "title": "Great World MRT station", 1416 | "url": "/wiki/Great_World_MRT_station" 1417 | }, 1418 | { 1419 | "codes": [ 1420 | "TE16" 1421 | ], 1422 | "name": "Havelock", 1423 | "name_zh_Hans": "合乐", 1424 | "name_ta": "ஹவ்லாக்", 1425 | "title": "Havelock MRT station", 1426 | "url": "/wiki/Havelock_MRT_station" 1427 | }, 1428 | { 1429 | "codes": [ 1430 | "TE18" 1431 | ], 1432 | "name": "Maxwell", 1433 | "name_zh_Hans": "麦士威", 1434 | "name_ta": "மெச்ஸ்வெல்", 1435 | "title": "Maxwell MRT station", 1436 | "url": "/wiki/Maxwell_MRT_station" 1437 | }, 1438 | { 1439 | "codes": [ 1440 | "TE19" 1441 | ], 1442 | "name": "Shenton Way", 1443 | "name_zh_Hans": "珊顿道", 1444 | "name_ta": "ஷென்ட்டன் வே", 1445 | "title": "Shenton Way MRT station", 1446 | "url": "/wiki/Shenton_Way_MRT_station" 1447 | }, 1448 | { 1449 | "codes": [ 1450 | "TE22" 1451 | ], 1452 | "name": "Gardens by the Bay", 1453 | "name_zh_Hans": "滨海湾花园", 1454 | "name_ta": "கரையோரப் பூந்தோட்டங்கள்", 1455 | "title": "Gardens by the Bay MRT station", 1456 | "url": "/wiki/Gardens_by_the_Bay_MRT_station" 1457 | }, 1458 | { 1459 | "codes": [ 1460 | "TE22A" 1461 | ], 1462 | "name": "Founders' Memorial", 1463 | "name_zh_Hans": "建国先贤纪念园", 1464 | "name_ta": "தேச நிறுவனர்கள் நினைவிட நிலையம்", 1465 | "title": "Founders' Memorial MRT station", 1466 | "url": "/wiki/Founders%27_Memorial_MRT_station" 1467 | }, 1468 | { 1469 | "codes": [ 1470 | "TE23" 1471 | ], 1472 | "name": "Tanjong Rhu", 1473 | "name_zh_Hans": "丹戎禺", 1474 | "name_ta": "தஞ்சோங் ரூ", 1475 | "title": "Tanjong Rhu MRT station", 1476 | "url": "/wiki/Tanjong_Rhu_MRT_station" 1477 | }, 1478 | { 1479 | "codes": [ 1480 | "TE24" 1481 | ], 1482 | "name": "Katong Park", 1483 | "name_zh_Hans": "加东公园", 1484 | "name_ta": "காத்தோங் பார்க்", 1485 | "title": "Katong Park MRT station", 1486 | "url": "/wiki/Katong_Park_MRT_station" 1487 | }, 1488 | { 1489 | "codes": [ 1490 | "TE25" 1491 | ], 1492 | "name": "Tanjong Katong", 1493 | "name_zh_Hans": "丹戎加东", 1494 | "name_ta": "தஞ்சோங் காத்தோங்", 1495 | "title": "Tanjong Katong MRT station", 1496 | "url": "/wiki/Tanjong_Katong_MRT_station" 1497 | }, 1498 | { 1499 | "codes": [ 1500 | "TE26" 1501 | ], 1502 | "name": "Marine Parade", 1503 | "name_zh_Hans": "马林百列", 1504 | "name_ta": "மரீன் பரேட்", 1505 | "title": "Marine Parade MRT station", 1506 | "url": "/wiki/Marine_Parade_MRT_station" 1507 | }, 1508 | { 1509 | "codes": [ 1510 | "TE27" 1511 | ], 1512 | "name": "Marine Terrace", 1513 | "name_zh_Hans": "马林台", 1514 | "name_ta": "மரீன் டெரஸ்", 1515 | "title": "Marine Terrace MRT station", 1516 | "url": "/wiki/Marine_Terrace_MRT_station" 1517 | }, 1518 | { 1519 | "codes": [ 1520 | "TE28" 1521 | ], 1522 | "name": "Siglap", 1523 | "name_zh_Hans": "实乞纳", 1524 | "name_ta": "சிக்லாப்", 1525 | "title": "Siglap MRT station", 1526 | "url": "/wiki/Siglap_MRT_station" 1527 | }, 1528 | { 1529 | "codes": [ 1530 | "TE29" 1531 | ], 1532 | "name": "Bayshore", 1533 | "name_zh_Hans": "碧湾", 1534 | "name_ta": "பேஷோர்", 1535 | "title": "Bayshore MRT station", 1536 | "url": "/wiki/Bayshore_MRT_station" 1537 | }, 1538 | { 1539 | "codes": [ 1540 | "TE30" 1541 | ], 1542 | "name": "Bedok South", 1543 | "name_zh_Hans": "勿洛南", 1544 | "name_ta": "பிடோக் சவுத்", 1545 | "title": "Bedok South MRT station", 1546 | "url": "/wiki/Bedok_South_MRT_station" 1547 | }, 1548 | { 1549 | "codes": [ 1550 | "JS2" 1551 | ], 1552 | "name": "Choa Chu Kang West", 1553 | "name_zh_Hans": "蔡厝港西", 1554 | "name_ta": "சுவா சூ காங் வெஸ்ட்", 1555 | "title": "Choa Chu Kang West MRT station", 1556 | "url": "/wiki/Choa_Chu_Kang_West_MRT_station" 1557 | }, 1558 | { 1559 | "codes": [ 1560 | "JS3" 1561 | ], 1562 | "name": "Tengah", 1563 | "name_zh_Hans": "登加", 1564 | "name_ta": "தெங்கா", 1565 | "title": "Tengah MRT station", 1566 | "url": "/wiki/Tengah_MRT_station" 1567 | }, 1568 | { 1569 | "codes": [ 1570 | "JS4" 1571 | ], 1572 | "name": "Hong Kah", 1573 | "name_zh_Hans": "丰加", 1574 | "name_ta": "ஹோங் காஹ்", 1575 | "title": "Hong Kah MRT station", 1576 | "url": "/wiki/Hong_Kah_MRT_station" 1577 | }, 1578 | { 1579 | "codes": [ 1580 | "JS5" 1581 | ], 1582 | "name": "Corporation", 1583 | "name_zh_Hans": "企业", 1584 | "name_ta": "கார்ப்பரெஷன்", 1585 | "title": "Corporation MRT station", 1586 | "url": "/wiki/Corporation_MRT_station" 1587 | }, 1588 | { 1589 | "codes": [ 1590 | "JS6" 1591 | ], 1592 | "name": "Jurong West", 1593 | "name_zh_Hans": "裕廊西", 1594 | "name_ta": "ஜூரோங் வெஸ்ட்", 1595 | "title": "Jurong West MRT station", 1596 | "url": "/wiki/Jurong_West_MRT_station" 1597 | }, 1598 | { 1599 | "codes": [ 1600 | "JS7" 1601 | ], 1602 | "name": "Bahar Junction", 1603 | "name_zh_Hans": "峇哈路口", 1604 | "name_ta": "பஹார் சந்திப்பு", 1605 | "title": "Bahar Junction MRT station", 1606 | "url": "/wiki/Bahar_Junction_MRT_station" 1607 | }, 1608 | { 1609 | "codes": [ 1610 | "JW1" 1611 | ], 1612 | "name": "Gek Poh", 1613 | "name_zh_Hans": "玉宝", 1614 | "name_ta": "ஜெக் போ", 1615 | "title": "Gek Poh MRT station", 1616 | "url": "/wiki/Gek_Poh_MRT_station" 1617 | }, 1618 | { 1619 | "codes": [ 1620 | "JW2" 1621 | ], 1622 | "name": "Tawas", 1623 | "name_zh_Hans": "大华士", 1624 | "name_ta": "தாவாஸ்", 1625 | "title": "Tawas MRT station", 1626 | "url": "/wiki/Tawas_MRT_station" 1627 | }, 1628 | { 1629 | "codes": [ 1630 | "JE1" 1631 | ], 1632 | "name": "Tengah Plantation", 1633 | "name_zh_Hans": "登加种植", 1634 | "name_ta": "தெங்கா தோட்டம்", 1635 | "title": "Tengah Plantation MRT station", 1636 | "url": "/wiki/Tengah_Plantation_MRT_station" 1637 | }, 1638 | { 1639 | "codes": [ 1640 | "JE2" 1641 | ], 1642 | "name": "Tengah Park", 1643 | "name_zh_Hans": "登加公园", 1644 | "name_ta": "தெங்கா பூங்கா", 1645 | "title": "Tengah Park MRT station", 1646 | "url": "/wiki/Tengah_Park_MRT_station" 1647 | }, 1648 | { 1649 | "codes": [ 1650 | "JE3" 1651 | ], 1652 | "name": "Bukit Batok West", 1653 | "name_zh_Hans": "武吉巴督西", 1654 | "name_ta": "புக்கிட் பாத்தோக் வெஸ்ட்", 1655 | "title": "Bukit Batok West MRT station", 1656 | "url": "/wiki/Bukit_Batok_West_MRT_station" 1657 | }, 1658 | { 1659 | "codes": [ 1660 | "JE4" 1661 | ], 1662 | "name": "Toh Guan", 1663 | "name_zh_Hans": "卓源", 1664 | "name_ta": "டோ குவான்", 1665 | "title": "Toh Guan MRT station", 1666 | "url": "/wiki/Toh_Guan_MRT_station" 1667 | }, 1668 | { 1669 | "codes": [ 1670 | "JE6" 1671 | ], 1672 | "name": "Jurong Town Hall", 1673 | "name_zh_Hans": "裕廊镇大会堂", 1674 | "name_ta": "ஜுராங் டவுன் ஹால்", 1675 | "title": "Jurong Town Hall MRT station", 1676 | "url": "/wiki/Jurong_Town_Hall_MRT_station" 1677 | }, 1678 | { 1679 | "codes": [ 1680 | "JE7" 1681 | ], 1682 | "name": "Pandan Reservoir", 1683 | "name_zh_Hans": "班丹蓄水池", 1684 | "name_ta": "பாண்டன் ரெசவோர்", 1685 | "title": "Pandan Reservoir MRT station", 1686 | "url": "/wiki/Pandan_Reservoir_MRT_station" 1687 | }, 1688 | { 1689 | "codes": [ 1690 | "JS9" 1691 | ], 1692 | "name": "Enterprise", 1693 | "name_zh_Hans": "事业", 1694 | "name_ta": "எண்டர்பிரைஸ்", 1695 | "title": "Enterprise MRT station", 1696 | "url": "/wiki/Enterprise_MRT_station" 1697 | }, 1698 | { 1699 | "codes": [ 1700 | "JS10" 1701 | ], 1702 | "name": "Tukang", 1703 | "name_zh_Hans": "都康", 1704 | "name_ta": "துக்காங்", 1705 | "title": "Tukang MRT station", 1706 | "url": "/wiki/Tukang_MRT_station" 1707 | }, 1708 | { 1709 | "codes": [ 1710 | "JS11" 1711 | ], 1712 | "name": "Jurong Hill", 1713 | "name_zh_Hans": "裕廊山", 1714 | "name_ta": "ஜூரோங் ஹில்", 1715 | "title": "Jurong Hill MRT station", 1716 | "url": "/wiki/Jurong_Hill_MRT_station" 1717 | }, 1718 | { 1719 | "codes": [ 1720 | "JS12", 1721 | "CR21" 1722 | ], 1723 | "name": "Jurong Pier", 1724 | "name_zh_Hans": "裕廊渡头", 1725 | "name_ta": "ஜூரோங் பியர்", 1726 | "title": "Jurong Pier MRT station", 1727 | "url": "/wiki/Jurong_Pier_MRT_station" 1728 | }, 1729 | { 1730 | "codes": [ 1731 | "JW3" 1732 | ], 1733 | "name": "Nanyang Gateway", 1734 | "name_zh_Hans": "南洋门", 1735 | "name_ta": "நன்யாங் கேட்வே", 1736 | "title": "Nanyang Gateway MRT station", 1737 | "url": "/wiki/Nanyang_Gateway_MRT_station" 1738 | }, 1739 | { 1740 | "codes": [ 1741 | "JW4" 1742 | ], 1743 | "name": "Nanyang Crescent", 1744 | "name_zh_Hans": "南洋弯", 1745 | "name_ta": "நன்யாங் க்ரெஸ்ஸன்", 1746 | "title": "Nanyang Crescent MRT station", 1747 | "url": "/wiki/Nanyang_Crescent_MRT_station" 1748 | }, 1749 | { 1750 | "codes": [ 1751 | "JW5" 1752 | ], 1753 | "name": "Peng Kang Hill", 1754 | "name_zh_Hans": "秉光山", 1755 | "name_ta": "பெங் காங் ஹில்", 1756 | "title": "Peng Kang Hill MRT station", 1757 | "url": "/wiki/Peng_Kang_Hill_MRT_station" 1758 | }, 1759 | { 1760 | "codes": [ 1761 | "JE", 1762 | "CR18" 1763 | ], 1764 | "name": "West Coast", 1765 | "name_zh_Hans": "西海岸", 1766 | "name_ta": "வெஸ்ட் கோஸ்ட்", 1767 | "title": "West Coast MRT station", 1768 | "url": "/wiki/West_Coast_MRT_station" 1769 | }, 1770 | { 1771 | "codes": [ 1772 | "CR2" 1773 | ], 1774 | "name": "Aviation Park", 1775 | "name_zh_Hans": "航空园", 1776 | "name_ta": "ஏவியேஷன் பார்க்", 1777 | "title": "Aviation Park MRT station", 1778 | "url": "/wiki/Aviation_Park_MRT_station" 1779 | }, 1780 | { 1781 | "codes": [ 1782 | "CR3" 1783 | ], 1784 | "name": "Loyang", 1785 | "name_zh_Hans": "罗央", 1786 | "name_ta": "லோயாங்", 1787 | "title": "Loyang MRT station", 1788 | "url": "/wiki/Loyang_MRT_station" 1789 | }, 1790 | { 1791 | "codes": [ 1792 | "CR4" 1793 | ], 1794 | "name": "Pasir Ris East", 1795 | "name_zh_Hans": "巴西立东", 1796 | "name_ta": "பாசிர் ரிஸ் ஈஸ்ட்", 1797 | "title": "Pasir Ris East MRT station", 1798 | "url": "/wiki/Pasir_Ris_East_MRT_station" 1799 | }, 1800 | { 1801 | "codes": [ 1802 | "CR6" 1803 | ], 1804 | "name": "Tampines North", 1805 | "name_zh_Hans": "淡滨尼北", 1806 | "name_ta": "தெம்பினிஸ் நார்த்", 1807 | "title": "Tampines North MRT station", 1808 | "url": "/wiki/Tampines_North_MRT_station" 1809 | }, 1810 | { 1811 | "codes": [ 1812 | "CR7" 1813 | ], 1814 | "name": "Defu", 1815 | "name_zh_Hans": "德福", 1816 | "name_ta": "டெஃபு", 1817 | "title": "Defu MRT station", 1818 | "url": "/wiki/Defu_MRT_station" 1819 | }, 1820 | { 1821 | "codes": [ 1822 | "CR9" 1823 | ], 1824 | "name": "Serangoon North", 1825 | "name_zh_Hans": "实龙岗北", 1826 | "name_ta": "சிராங்கூன் நார்த்", 1827 | "title": "Serangoon North MRT station", 1828 | "url": "/wiki/Serangoon_North_MRT_station" 1829 | }, 1830 | { 1831 | "codes": [ 1832 | "CR10" 1833 | ], 1834 | "name": "Tavistock", 1835 | "name_zh_Hans": "达维士笃", 1836 | "name_ta": "தெவிஸ்தொக்", 1837 | "title": "Tavistock MRT station", 1838 | "url": "/wiki/Tavistock_MRT_station" 1839 | }, 1840 | { 1841 | "codes": [ 1842 | "CR12" 1843 | ], 1844 | "name": "Teck Ghee", 1845 | "name_zh_Hans": "德义", 1846 | "name_ta": "டெக் கீ", 1847 | "title": "Teck Ghee MRT station", 1848 | "url": "/wiki/Teck_Ghee_MRT_station" 1849 | }, 1850 | { 1851 | "codes": [ 1852 | "CR14" 1853 | ], 1854 | "name": "Turf City", 1855 | "name_zh_Hans": "马城", 1856 | "name_ta": "டர்ஃப் சிட்­டி­யில்", 1857 | "title": "Turf City MRT station", 1858 | "url": "/wiki/Turf_City_MRT_station" 1859 | }, 1860 | { 1861 | "codes": [ 1862 | "CR16" 1863 | ], 1864 | "name": "Maju", 1865 | "name_zh_Hans": "马裕", 1866 | "name_ta": "மாஜு", 1867 | "title": "Maju MRT station", 1868 | "url": "/wiki/Maju_MRT_station" 1869 | }, 1870 | { 1871 | "codes": [ 1872 | "CR19" 1873 | ], 1874 | "name": "Jurong Lake District", 1875 | "name_zh_Hans": "裕廊湖区", 1876 | "name_ta": "ஜூரோங் லேக் வட்­டா­ரம்", 1877 | "title": "Jurong Lake District MRT station", 1878 | "url": "/wiki/Jurong_Lake_District_MRT_station" 1879 | }, 1880 | { 1881 | "codes": [ 1882 | "CP2" 1883 | ], 1884 | "name": "Elias", 1885 | "name_zh_Hans": "伊莱雅", 1886 | "name_ta": "இலியாஸ்", 1887 | "title": "Elias MRT station", 1888 | "url": "/wiki/Elias_MRT_station" 1889 | }, 1890 | { 1891 | "codes": [ 1892 | "CP3", 1893 | "PE4" 1894 | ], 1895 | "name": "Riviera", 1896 | "name_zh_Hans": "里维拉", 1897 | "name_ta": "ரிவியாரா", 1898 | "title": "Riviera MRT/LRT station", 1899 | "url": "/wiki/Riviera_MRT/LRT_station" 1900 | } 1901 | ] --------------------------------------------------------------------------------