座標を保持する位置エンティティがあります。半径に基づいて、範囲内にあるすべての場所を取得します。
2つの場所の間の距離を計算する関数(データベースではなくバックエンドコード/ Nestjsロジック)を作成しました。計算された距離が半径以下の場合、この場所を選択します。
この距離計算関数を使用した私の現在のリポジトリ実装:
// ...
import { distanceFromCoordinatesInKilometers } from '../shared/calculations/distanceFromCoordinatesInKilometers';
@EntityRepository(Location)
export class LocationsRepository extends Repository<Location> {
public getLocations({ /* ... */ latitude, longitude, radiusInKilometers }: GetLocationsDTO): Promise<Location[]> {
const query: SelectQueryBuilder<Location> = this.createQueryBuilder('location');
// ....
if(latitude && longitude && radiusInKilometers) {
query.andWhere("distanceFromCoordinatesInKilometers(location.latitude, location.longitude, :latitude, :longitude) <= :radiusInKilometers", {
latitude,
longitude,
radiusInKilometers,
});
}
return query.getMany();
}
}
上記の例は機能しません。このエラーが発生する
QueryFailedError:関数distanceFromCoordinatesInKilometers(倍精度、倍精度、不明、不明)は存在しません
:
関数にを追加すると、このエラーが発生します
関数パラメーターはパラメーターでサポートされていません。「距離」パラメータを確認してください。
distanceFromCoordinatesInKilometers
そのクエリ内でバックエンドコード関数をどのように呼び出しますか?変数を渡すことはできますが、関数を渡すことはできませんか?
現在、私はPostgresデータベースを使用していますが、独立したソリューションがあればそれは素晴らしいでしょう。
おかげで、クエリにその関数をどのように実装できますか?計算自体は大きなものです(30行のコード)
—
Question3r
あなたの質問はTypeORMそのものよりも、関連する多くのSQLですが、基本的な大円を使用していると仮定すると、その主旨のを見てみましょう微積分gist.github.com/rugbyprof/...
—
広々
そのリンクをありがとう。ここでそれをpastebin.com/AS7y7efrに翻訳してみましたが、エラーは発生しませんでした。しかし、その計算が正しいかどうかを確認する必要があります...
—
Question3r
PostgreSQL のPostGIS拡張機能を見たことはありますか?座標(ポイント)間の距離を決定する機能が含まれています。指定された座標から指定された距離内で行をフィルタリングするクエリを実行する方法の例については、gis.stackexchange.com / questions / 77072 /…を参照してください。
—
Timshel
node.js
、データベースからアプリから関数を呼び出そうとしていて、それが機能することは決してありません。普遍的な解決策は、データベースにその関数を実装する(たとえば、移行によって)か、よりドライバーに依存しないソリューション:その関数を実装することです。クエリで