Skip to content

Commit

Permalink
Merge pull request #1166 from JGreenlee/use-server-nominatim
Browse files Browse the repository at this point in the history
📍 Use the server-side geocoded addresses for place names
  • Loading branch information
shankari authored Aug 24, 2024
2 parents 9852fd9 + e07206f commit d1c9646
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 6 deletions.
31 changes: 28 additions & 3 deletions www/js/diary/addressNamesHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,23 @@ import Bottleneck from 'bottleneck';
import { displayError, logDebug } from '../plugin/logger';
import { CompositeTrip } from '../types/diaryTypes';

export type NominatimResponse = {
address: {
road?: string;
pedestrian?: string;
suburb?: string;
neighbourhood?: string;
hamlet?: string;
city?: string;
town?: string;
county?: string;
state?: string;
postcode?: string;
country?: string;
country_code?: string;
};
};

let nominatimLimiter = new Bottleneck({ maxConcurrent: 2, minTime: 500 });
export const resetNominatimLimiter = () => {
const newLimiter = new Bottleneck({ maxConcurrent: 2, minTime: 500 });
Expand Down Expand Up @@ -127,7 +144,7 @@ async function fetchNominatimLocName(loc_geojson) {
status = ${response.status};
data = ${JSON.stringify(data)}`);
localStorage.setItem(coordsStr, JSON.stringify(data));
publish(coordsStr, data);
publish(coordsStr, JSON.stringify(data));
} catch (error) {
if (!nominatimError) {
nominatimError = error;
Expand All @@ -138,8 +155,16 @@ async function fetchNominatimLocName(loc_geojson) {

// Schedules nominatim fetches for the start and end locations of a trip
export function fillLocationNamesOfTrip(trip: CompositeTrip) {
nominatimLimiter.schedule(() => fetchNominatimLocName(trip.end_loc));
nominatimLimiter.schedule(() => fetchNominatimLocName(trip.start_loc));
[trip.start_confirmed_place, trip.end_confirmed_place].forEach((place) => {
if (place?.geocoded_address || place?.reverse_geocode) {
const coordsStr = place.location.coordinates.toString();
const data = place.reverse_geocode || { address: place.geocoded_address };
localStorage.setItem(coordsStr, JSON.stringify(data));
publish(coordsStr, JSON.stringify(data));
} else {
nominatimLimiter.schedule(() => fetchNominatimLocName(place.location));
}
});
}

// a React hook that takes a trip or place and returns an array of its address names
Expand Down
12 changes: 9 additions & 3 deletions www/js/types/diaryTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
and user input objects.
As much as possible, these types parallel the types used in the server code. */

import { NominatimResponse } from '../diary/addressNamesHelper';
import { BaseModeKey, MotionTypeKey } from '../diary/diaryHelper';
import useDerivedProperties from '../diary/useDerivedProperties';
import { VehicleIdentity } from './appConfigTypes';
Expand Down Expand Up @@ -32,8 +33,13 @@ export type ConfirmedPlace = {
exit_fmt_time: string; // ISO string e.g. 2023-10-31T12:00:00.000-04:00
exit_local_dt: LocalDt;
exit_ts: number; // Unix timestamp

// one of these depending on what we decide to keep on the server
geocoded_address?: NominatimResponse['address'];
reverse_geocode?: NominatimResponse;

key: string;
location: Geometry;
location: Point;
origin_key: string;
raw_places: ObjectId[];
source: string;
Expand Down Expand Up @@ -96,7 +102,7 @@ export type CompositeTrip = {
confirmed_trip: ObjectId;
distance: number;
duration: number;
end_confirmed_place: BEMData<ConfirmedPlace>;
end_confirmed_place: ConfirmedPlace;
end_fmt_time: string;
end_loc: Point;
end_local_dt: LocalDt;
Expand All @@ -113,7 +119,7 @@ export type CompositeTrip = {
raw_trip: ObjectId;
sections: SectionData[];
source: string;
start_confirmed_place: BEMData<ConfirmedPlace>;
start_confirmed_place: ConfirmedPlace;
start_fmt_time: string;
start_loc: Point;
start_local_dt: LocalDt;
Expand Down

0 comments on commit d1c9646

Please sign in to comment.