Skip to content

Commit 4c30d60

Browse files
committed
Filter shelters by distance
1 parent e5c574b commit 4c30d60

File tree

6 files changed

+87
-6
lines changed

6 files changed

+87
-6
lines changed

client/src/app/_services/shelters.service.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,21 @@ export class SheltersService {
2222
);
2323
}
2424

25-
public getAllShelters(): Observable<Shelter[]> {
25+
public getLatLng(): Observable<any> {
26+
return this.http.get(
27+
'http://ip-api.com/json/'
28+
);
29+
}
30+
31+
public getAllShelters(lat, lng): Observable<Shelter[]> {
2632
return this.http.get<Shelter[]>(
27-
`${this.apiBaseUrl}/shelters`
33+
`${this.apiBaseUrl}/shelters`,
34+
{
35+
params: {
36+
lat: lat,
37+
lng: lng
38+
}
39+
}
2840
);
2941
}
3042

client/src/app/shelters/shelter-card/shelter-card.component.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
<a href="{{bingMapUrl}}" target="_blank" class="button is-outlined">Open in Bing Maps</a>
2727
</div>
2828
</div>
29+
<div class="column is-4">
30+
<div class="content">
31+
<p>Approx <span class="has-text-weight-bold">{{shelter['distance']}} kms</span> away</p>
32+
</div>
33+
</div>
2934
</div>
3035
</div>
3136
<footer class="card-footer">

client/src/app/shelters/shelter-info/shelter-info.component.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
<div class="card-content">
88
<div class="columns">
99
<div class="column is-4">
10+
<p *ngIf="shelter['official']" class="has-text-success">
11+
<i class="fa fa-check"></i>&nbsp;Official Government Shelter
12+
</p>
1013
<p class="title">
1114
{{ shelter.name }}
1215
</p>

client/src/app/shelters/shelters.component.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,19 @@ export class SheltersComponent implements OnInit {
2727
(err) => this.alertService.error(err)
2828
);
2929

30-
this.shelterService.getAllShelters()
30+
this.shelterService.getLatLng()
3131
.subscribe(
32-
(res) => this.shelters = res,
33-
(err) => this.alertService.error(err)
32+
(res) => {
33+
this.shelterService.getAllShelters(res.lat, res.lon)
34+
.subscribe(
35+
(res) => this.shelters = res,
36+
(err) => this.alertService.error(err)
37+
);
38+
}
3439
);
3540

41+
42+
3643
this.shelterService.getZipcodeStatus()
3744
.subscribe(
3845
(res) => this.zipcodeStatus = res[0],
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const Shelter = require('../model/Shelter')
2+
const User = require('../../users/model/User')
3+
var ObjectId = require('mongoose').Types.ObjectId;
4+
5+
module.exports = {
6+
method: 'GET',
7+
path: '/api/shelters/{id}/users',
8+
options: {
9+
handler: async (request, h) => {
10+
const shelter = await User.find({shelter: new ObjectId(request.params.id)}).lean()
11+
12+
return shelter;
13+
},
14+
description: 'Returns requested shelter info'
15+
}
16+
}

server/api/shelters/routes/getShelters.js

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,57 @@
11
const Shelter = require('../model/Shelter')
22
const User = require('../../users/model/User')
33

4+
function distance(lat1, lon1, shelter) {
5+
const unit = 'K';
6+
const lon2 = +shelter.lngLat.split(",")[0];
7+
const lat2 = +shelter.lngLat.split(",")[1];
8+
9+
if ((lat1 == lat2) && (lon1 == lon2)) {
10+
return 0;
11+
}
12+
else {
13+
var radlat1 = Math.PI * lat1 / 180;
14+
var radlat2 = Math.PI * lat2 / 180;
15+
var theta = lon1 - lon2;
16+
var radtheta = Math.PI * theta / 180;
17+
var dist = Math.sin(radlat1) * Math.sin(radlat2) + Math.cos(radlat1) * Math.cos(radlat2) * Math.cos(radtheta);
18+
if (dist > 1) {
19+
dist = 1;
20+
}
21+
dist = Math.acos(dist);
22+
dist = dist * 180 / Math.PI;
23+
dist = dist * 60 * 1.1515;
24+
if (unit === "K") { dist = dist * 1.609344 }
25+
return dist.toFixed(2);
26+
}
27+
}
28+
429
module.exports = {
530
method: 'GET',
631
path: '/api/shelters',
732
options: {
833
handler: async (request, h) => {
34+
const userLat = +request.query.lat
35+
const userLng = +request.query.lng
36+
937
const shelters = await Shelter.find({}).lean()
1038

1139
for (let i = 0; i < shelters.length; i++) {
1240
const user = await User.findOne({ _id: shelters[i].user })
1341
shelters[i].user = user.email;
1442
}
1543

16-
return shelters;
44+
const nearbyShelters = []
45+
46+
for (let i = 0; i < shelters.length; i++) {
47+
const dist = distance(userLat, userLng, shelters[i]);
48+
if ( dist < 50) {
49+
shelters[i]['distance'] = dist
50+
nearbyShelters.push(shelters[i])
51+
}
52+
}
53+
54+
return nearbyShelters;
1755
},
1856
description: 'Returns all shelters'
1957
}

0 commit comments

Comments
 (0)