4

私はJava EEプロジェクトに取り組んでおり、次のようなエンティティがあります:

@Entity
public class Location {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long messageId;

  @ManyToOne
  private User user;

  private String name;

  private Float latitude;

  private Float longitude;
}

また、これらの場所が直径 1 km の円内にある場合は、中心点でこれらの場所をフィルター処理する必要があります。

ここに画像の説明を入力

A、B、C、E の場所のみを返すこのようなメソッドが必要です。

public List<Location> findLocations(Float longitude, Float latitude) {
    List<Location> locations = 
            entityManager.createQuery("select l from Location where ???")
            .setParameter("longitude", longitude)
            .setParameter("latitude", latitude)
            .getResultList();
    return locations;
}

いくつかのコード サンプルを見つけましたが、db のすべての場所を反復処理する必要があります (これには実際にコストがかかります)。

で直接できますcreateQuery()か?

注:私は使用していますMySQL

4

1 に答える 1

0

緯度経度値の大まかな推定値が赤道付近にあると仮定すると、次のようになります。

  • 経度 1 度は約 111.32 km
  • 緯度 1 度は約 110.57 km

値の参照

このことから、次のことが推測できます。

  • 1km の経度 1 は 0.0089831deg に等しい
  • 緯度 1 の 1 km は 0.009044 度に等しい

Where of you SQL ステートメントに以下を追加することで、データの大部分を削除できます。

SELECT * FROM location WHERE ( latitude BETWEEN (latValue? - 0.009044) AND (LatValue?+0.009044)) AND (longtitude BETWEEN (longValue? - 0.0089831) AND (longValue?+0.0089831));

より正確な結果を得るには、結果の値を Vincenty または Haversine 式でフィルタリングする必要があります。

編集:

または、Vincenty または Haversine 式をクエリに直接実装することもできます。そうする方が効率的かどうかはまだテストしていません。私は常にデータベース トランザクションを最小限に抑えています。非常に最小限の計算でデータを保存および取得します。

于 2015-09-08T05:40:04.900 に答える