Java检查长度为1 km的圈

时间:2015-08-04 18:45:10

标签: java mysql jpa persistence createquery

我在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,我需要用中心点过滤这些位置。

enter image description here

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

1 个答案:

答案 0 :(得分:0)

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

  • 一度经度约为111.32 km
  • 一度纬度约为110.57 km
  

reference for values

由此我们可以假设

  • 1km of longtitude 1等于0.0089831deg
  • 1km纬度1等于0.009044deg

我们可以通过将以下内容添加到您的sql语句中来消除大部分数据

DataSource

要获得更准确的结果,您仍需要使用Vincenty或Haversine公式过滤结果值。

编辑:

或者您也可以直接在查询中实施Vincenty或Haversine公式。现在是否更有效率,我还没有测试过。我始终将数据库事务保持在最低限度。以非常小的计算存储和检索数据。