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 公里的圆内,我需要用中心点过滤这些位置。

在此处输入图像描述

我需要这样的方法,只返回 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

假设对赤道附近的纬度值进行粗略估计如下

  • 一个经度大约是111.32公里
  • 一个纬度大约是110.57公里

值参考

由此我们可以假设

  • 1公里经度1等于0.0089831deg
  • 纬度1的1公里等于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 回答