diff options
author | Logan Hunt <loganhunt@simponic.xyz> | 2022-03-30 15:18:16 -0600 |
---|---|---|
committer | Logan Hunt <loganhunt@simponic.xyz> | 2022-03-30 15:18:16 -0600 |
commit | acff469ba069b6f090adfd5ed91379c9f146aa77 (patch) | |
tree | e600e951d2e88ffde9252214fe31b8042ca129aa /server/database/migrations/1648669551959-AddDistanceFunction.ts | |
parent | 042e3b9862b253fb3c3e59ee628dd9e30edf7e35 (diff) | |
download | locchat-acff469ba069b6f090adfd5ed91379c9f146aa77.tar.gz locchat-acff469ba069b6f090adfd5ed91379c9f146aa77.zip |
Ability to add, remove, update radius and location of chatrooms with a leaflet
Diffstat (limited to 'server/database/migrations/1648669551959-AddDistanceFunction.ts')
-rw-r--r-- | server/database/migrations/1648669551959-AddDistanceFunction.ts | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/server/database/migrations/1648669551959-AddDistanceFunction.ts b/server/database/migrations/1648669551959-AddDistanceFunction.ts new file mode 100644 index 0000000..0890936 --- /dev/null +++ b/server/database/migrations/1648669551959-AddDistanceFunction.ts @@ -0,0 +1,45 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddDistanceFunction1648669551959 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise<void> { + // From https://stackoverflow.com/questions/61135374/postgresql-calculate-distance-between-two-points-without-using-postgis + await queryRunner.query(` +CREATE OR REPLACE FUNCTION calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar) + RETURNS float AS $dist$ + DECLARE + dist float = 0; + radlat1 float; + radlat2 float; + theta float; + radtheta float; + BEGIN + IF lat1 = lat2 OR lon1 = lon2 + THEN RETURN dist; + ELSE + radlat1 = pi() * lat1 / 180; + radlat2 = pi() * lat2 / 180; + theta = lon1 - lon2; + radtheta = pi() * theta / 180; + dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta); + + IF dist > 1 THEN dist = 1; END IF; + + dist = acos(dist); + dist = dist * 180 / pi(); + dist = dist * 60 * 1.1515; + + IF units = 'K' THEN dist = dist * 1.609344; END IF; + IF units = 'N' THEN dist = dist * 0.8684; END IF; + + RETURN dist; + END IF; + END; + $dist$ LANGUAGE plpgsql;`); + } + + public async down(queryRunner: QueryRunner): Promise<void> { + await queryRunner.query( + `DROP FUNCTION IF EXISTS calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar);`, + ); + } +} |