Skip to content
This repository was archived by the owner on Mar 15, 2024. It is now read-only.

Commit 7a185c6

Browse files
committed
update postcode search
1 parent 2c94f20 commit 7a185c6

File tree

4 files changed

+3309
-87
lines changed

4 files changed

+3309
-87
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,11 @@
3434
"husky": "^1.3.1",
3535
"jest": "^24.7.1",
3636
"jest-dom": "^3.1.3",
37+
"parcel-bundler": "^1.12.3",
3738
"prettier": "^1.17.0",
3839
"rimraf": "^2.6.3",
3940
"ts-jest": "^24.0.2",
40-
"ts-node-dev": "^1.0.0-pre.32",
41+
"ts-node-dev": "^1.0.0-pre.40",
4142
"tslint": "^5.15.0",
4243
"tslint-config-airbnb": "^5.11.1",
4344
"tslint-config-prettier": "^1.18.0",
@@ -58,6 +59,8 @@
5859
"lodash": "^4.17.11",
5960
"method-override": "^3.0.0",
6061
"pg": "^7.9.0",
62+
"postcode": "^2.0.0",
63+
"proj4": "^2.5.0",
6164
"recompose": "^0.30.0",
6265
"reflect-metadata": "^0.1.10",
6366
"sharedb": "^1.0.0-beta.20",

src/rest-api/controllers/postcodes.ts

Lines changed: 64 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,80 @@
11
import axios from 'axios'
22
import { NextFunction, Request, Response } from 'express'
3-
import * as get from 'lodash/get'
3+
import * as proj4 from 'proj4'
4+
5+
proj4.defs([
6+
['WGS84', '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'],
7+
[
8+
'EPSG:27700',
9+
'+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +ellps=airy +towgs84=446.448,-125.157,542.06,0.15,0.247,0.842,-20.489 +units=m +no_defs',
10+
],
11+
])
12+
13+
const projections = {
14+
standard: new proj4.Proj('WGS84'),
15+
ordnanceSurvey: new proj4.Proj('EPSG:27700'),
16+
}
417

518
export async function search(
619
request: Request,
720
response: Response,
821
next: NextFunction
922
) {
10-
const url = `https://api.ideal-postcodes.co.uk/v1/postcodes/${
11-
request.params.postcode
12-
}?api_key=${process.env.IDEAL_POSTCODES_KEY}`
23+
// const postcode = await formatPostcode(request.params.postcode)
1324

1425
try {
26+
const { data: pdata } = await axios.get(
27+
`https://api.postcodes.io/postcodes/${request.params.postcode}`
28+
)
29+
30+
const postcode = pdata.result.postcode
31+
const localAuthority = pdata.result.admin_district.toLowerCase()
32+
33+
if (localAuthority !== 'southwark') {
34+
return response.json({
35+
localAuthority,
36+
results: [],
37+
})
38+
}
39+
40+
const url = `https://llpg.planx.uk/LLPG_ALL?limit=100&POSTALLY_ADDRESSABLE=eq.Y&POSTCODE=eq.${postcode}`
41+
1542
const { data } = await axios.get(url)
1643

1744
response.json({
18-
localAuthority: get(data, 'result[0].district', 'unknown')
19-
.toLowerCase()
20-
.replace(' ', ''),
21-
results: data.result.map(result => {
22-
return {
23-
id: result.udprn.toString(),
24-
name: [result.line_1, result.line_2].filter(Boolean).join(', '),
25-
uprn: result.udprn.toString(),
26-
updrn: result.udprn.toString(),
27-
x: result.eastings,
28-
y: result.northings,
29-
lat: result.latitude,
30-
lng: result.longitude,
31-
rawData: result,
32-
}
33-
}),
45+
localAuthority,
46+
results: data
47+
.map(result => {
48+
const { x: lng, y: lat } = proj4.transform(
49+
projections.ordnanceSurvey,
50+
projections.standard,
51+
[Number(result.X), Number(result.Y)]
52+
)
53+
54+
return {
55+
lat,
56+
lng,
57+
id: result.UPRN.toString(),
58+
name: [
59+
result.ORGANISATION,
60+
result.SAO,
61+
[result.PAO, result.STREET].filter(Boolean).join(' '),
62+
]
63+
.filter(Boolean)
64+
.join(', '),
65+
uprn: result.UPRN.toString(),
66+
updrn: result.UPRN.toString(),
67+
x: Number(result.X),
68+
y: Number(result.Y),
69+
rawData: result,
70+
}
71+
})
72+
.sort((a, b) => {
73+
const aa = [a.rawData.PAO, a.rawData.STREET].filter(Boolean).join(' ')
74+
const bb = [b.rawData.PAO, b.rawData.STREET].filter(Boolean).join(' ')
75+
// return bb < aa
76+
return aa < bb ? -1 : aa > bb ? 1 : 0
77+
}),
3478
})
3579
} catch (e) {
3680
next(e)
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import axios from 'axios'
2+
import { NextFunction, Request, Response } from 'express'
3+
import * as get from 'lodash/get'
4+
5+
export async function search(
6+
request: Request,
7+
response: Response,
8+
next: NextFunction
9+
) {
10+
const url = `https://api.ideal-postcodes.co.uk/v1/postcodes/${
11+
request.params.postcode
12+
}?api_key=${process.env.IDEAL_POSTCODES_KEY}`
13+
14+
try {
15+
const { data } = await axios.get(url)
16+
17+
response.json({
18+
localAuthority: get(data, 'result[0].district', 'unknown')
19+
.toLowerCase()
20+
.replace(' ', ''),
21+
results: data.result.map(result => {
22+
return {
23+
id: result.udprn.toString(),
24+
name: [result.line_1, result.line_2].filter(Boolean).join(', '),
25+
uprn: result.udprn.toString(),
26+
updrn: result.udprn.toString(),
27+
x: result.eastings,
28+
y: result.northings,
29+
lat: result.latitude,
30+
lng: result.longitude,
31+
rawData: result,
32+
}
33+
}),
34+
})
35+
} catch (e) {
36+
next(e)
37+
}
38+
}

0 commit comments

Comments
 (0)