fix geodesic error on azimuth
This commit is contained in:
parent
efea6fe13c
commit
1f1502a623
|
@ -20,7 +20,7 @@ export abstract class Algorithm {
|
||||||
for (const processor of this.processors) {
|
for (const processor of this.processors) {
|
||||||
this.candidates = await processor.execute(this.candidates);
|
this.candidates = await processor.execute(this.candidates);
|
||||||
}
|
}
|
||||||
// console.log(JSON.stringify(this.candidates, null, 2));
|
console.log(JSON.stringify(this.candidates, null, 2));
|
||||||
return this.candidates.map((candidate: CandidateEntity) =>
|
return this.candidates.map((candidate: CandidateEntity) =>
|
||||||
MatchEntity.create({ adId: candidate.id }),
|
MatchEntity.create({ adId: candidate.id }),
|
||||||
);
|
);
|
||||||
|
|
|
@ -20,6 +20,7 @@ export class PassengerOrientedAlgorithm extends Algorithm {
|
||||||
new PassengerOrientedCarpoolPathCompleter(query),
|
new PassengerOrientedCarpoolPathCompleter(query),
|
||||||
new RouteCompleter(query, RouteCompleterType.BASIC),
|
new RouteCompleter(query, RouteCompleterType.BASIC),
|
||||||
new PassengerOrientedGeoFilter(query),
|
new PassengerOrientedGeoFilter(query),
|
||||||
|
new RouteCompleter(query, RouteCompleterType.DETAILED),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,4 +8,6 @@ export interface GeodesicPort {
|
||||||
azimuth: number;
|
azimuth: number;
|
||||||
distance: number;
|
distance: number;
|
||||||
};
|
};
|
||||||
|
distance(lon1: number, lat1: number, lon2: number, lat2: number): number;
|
||||||
|
azimuth(lon1: number, lat1: number, lon2: number, lat2: number): number;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,7 @@ import { Geodesic } from './infrastructure/geodesic';
|
||||||
import { GraphhopperGeorouter } from './infrastructure/graphhopper-georouter';
|
import { GraphhopperGeorouter } from './infrastructure/graphhopper-georouter';
|
||||||
import { HttpModule } from '@nestjs/axios';
|
import { HttpModule } from '@nestjs/axios';
|
||||||
import { GetRouteQueryHandler } from './core/application/queries/get-route/get-route.query-handler';
|
import { GetRouteQueryHandler } from './core/application/queries/get-route/get-route.query-handler';
|
||||||
|
import { GetDetailedRouteController } from './interface/controllers/get-detailed-route.controller';
|
||||||
|
|
||||||
const queryHandlers: Provider[] = [GetRouteQueryHandler];
|
const queryHandlers: Provider[] = [GetRouteQueryHandler];
|
||||||
|
|
||||||
|
@ -37,11 +38,17 @@ const adapters: Provider[] = [
|
||||||
useClass: Geodesic,
|
useClass: Geodesic,
|
||||||
},
|
},
|
||||||
GetBasicRouteController,
|
GetBasicRouteController,
|
||||||
|
GetDetailedRouteController,
|
||||||
];
|
];
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [CqrsModule, HttpModule],
|
imports: [CqrsModule, HttpModule],
|
||||||
providers: [...queryHandlers, ...mappers, ...adapters],
|
providers: [...queryHandlers, ...mappers, ...adapters],
|
||||||
exports: [RouteMapper, DIRECTION_ENCODER, GetBasicRouteController],
|
exports: [
|
||||||
|
RouteMapper,
|
||||||
|
DIRECTION_ENCODER,
|
||||||
|
GetBasicRouteController,
|
||||||
|
GetDetailedRouteController,
|
||||||
|
],
|
||||||
})
|
})
|
||||||
export class GeographyModule {}
|
export class GeographyModule {}
|
||||||
|
|
|
@ -22,7 +22,38 @@ export class Geodesic implements GeodesicPort {
|
||||||
lat2,
|
lat2,
|
||||||
lon2,
|
lon2,
|
||||||
);
|
);
|
||||||
if (!azimuth || !distance) throw new Error('Azimuth not found');
|
if (!azimuth || !distance)
|
||||||
|
throw new Error(
|
||||||
|
`Inverse not found for coordinates ${lon1} ${lat1} / ${lon2} ${lat2}`,
|
||||||
|
);
|
||||||
return { azimuth, distance };
|
return { azimuth, distance };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
azimuth = (
|
||||||
|
lon1: number,
|
||||||
|
lat1: number,
|
||||||
|
lon2: number,
|
||||||
|
lat2: number,
|
||||||
|
): number => {
|
||||||
|
const { azi2: azimuth } = this.geod.Inverse(lat1, lon1, lat2, lon2);
|
||||||
|
if (!azimuth)
|
||||||
|
throw new Error(
|
||||||
|
`Azimuth not found for coordinates ${lon1} ${lat1} / ${lon2} ${lat2}`,
|
||||||
|
);
|
||||||
|
return azimuth;
|
||||||
|
};
|
||||||
|
|
||||||
|
distance = (
|
||||||
|
lon1: number,
|
||||||
|
lat1: number,
|
||||||
|
lon2: number,
|
||||||
|
lat2: number,
|
||||||
|
): number => {
|
||||||
|
const { s12: distance } = this.geod.Inverse(lat1, lon1, lat2, lon2);
|
||||||
|
if (!distance)
|
||||||
|
throw new Error(
|
||||||
|
`Distance not found for coordinates ${lon1} ${lat1} / ${lon2} ${lat2}`,
|
||||||
|
);
|
||||||
|
return distance;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,14 +192,14 @@ export class GraphhopperGeorouter implements GeorouterPort {
|
||||||
.filter((element) => element.index == -1);
|
.filter((element) => element.index == -1);
|
||||||
for (const index in points) {
|
for (const index in points) {
|
||||||
for (const missedWaypoint of missedWaypoints) {
|
for (const missedWaypoint of missedWaypoints) {
|
||||||
const inverse = this.geodesic.inverse(
|
const distance = this.geodesic.distance(
|
||||||
missedWaypoint.waypoint[0],
|
missedWaypoint.waypoint[0],
|
||||||
missedWaypoint.waypoint[1],
|
missedWaypoint.waypoint[1],
|
||||||
points[index][0],
|
points[index][0],
|
||||||
points[index][1],
|
points[index][1],
|
||||||
);
|
);
|
||||||
if (inverse.distance < missedWaypoint.distance) {
|
if (distance < missedWaypoint.distance) {
|
||||||
missedWaypoint.distance = inverse.distance;
|
missedWaypoint.distance = distance;
|
||||||
missedWaypoint.nearest = parseInt(index);
|
missedWaypoint.nearest = parseInt(index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,4 +11,26 @@ describe('Matcher geodesic', () => {
|
||||||
expect(Math.round(inv.azimuth as number)).toBe(45);
|
expect(Math.round(inv.azimuth as number)).toBe(45);
|
||||||
expect(Math.round(inv.distance as number)).toBe(156900);
|
expect(Math.round(inv.distance as number)).toBe(156900);
|
||||||
});
|
});
|
||||||
|
it('should get azimuth value', () => {
|
||||||
|
const geodesic: Geodesic = new Geodesic();
|
||||||
|
const azimuth = geodesic.azimuth(0, 0, 1, 1);
|
||||||
|
expect(Math.round(azimuth as number)).toBe(45);
|
||||||
|
});
|
||||||
|
it('should get distance value', () => {
|
||||||
|
const geodesic: Geodesic = new Geodesic();
|
||||||
|
const distance = geodesic.distance(0, 0, 1, 1);
|
||||||
|
expect(Math.round(distance as number)).toBe(156900);
|
||||||
|
});
|
||||||
|
it('should throw an exception if inverse fails', () => {
|
||||||
|
const geodesic: Geodesic = new Geodesic();
|
||||||
|
expect(() => {
|
||||||
|
geodesic.inverse(7.74547, 48.583035, 7.74547, 48.583036);
|
||||||
|
}).toThrow();
|
||||||
|
});
|
||||||
|
it('should throw an exception if azimuth fails', () => {
|
||||||
|
const geodesic: Geodesic = new Geodesic();
|
||||||
|
expect(() => {
|
||||||
|
geodesic.azimuth(7.74547, 48.583035, 7.74547, 48.583036);
|
||||||
|
}).toThrow();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -253,6 +253,8 @@ const mockGeodesic: GeodesicPort = {
|
||||||
azimuth: 45,
|
azimuth: 45,
|
||||||
distance: 50000,
|
distance: 50000,
|
||||||
})),
|
})),
|
||||||
|
azimuth: jest.fn().mockImplementation(() => 45),
|
||||||
|
distance: jest.fn().mockImplementation(() => 50000),
|
||||||
};
|
};
|
||||||
|
|
||||||
const mockDefaultParamsProvider: DefaultParamsProviderPort = {
|
const mockDefaultParamsProvider: DefaultParamsProviderPort = {
|
||||||
|
|
Loading…
Reference in New Issue