Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java检查1km圆圈内是否存在长lat_Java_Mysql_Jpa_Persistence_Createquery - Fatal编程技术网

Java检查1km圆圈内是否存在长lat

Java检查1km圆圈内是否存在长lat,java,mysql,jpa,persistence,createquery,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 longitu

我正在从事一个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;
}
我需要用一个中心点来过滤这些位置,如果它们在直径为1km的圆中

我需要一个这样的方法,只返回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;
}
公共列表查找位置(浮动经度、浮动纬度){
列表位置=
createQuery(“从位置选择l?”)
.setParameter(“经度”,经度)
.setParameter(“纬度”,纬度)
.getResultList();
返回地点;
}
我找到了一些代码示例,但我必须遍历db上的所有位置(这将是非常昂贵的)

我可以直接用
createQuery()
来完成吗

注意:我使用的是
MySQL


假设latlong值接近赤道,粗略估计如下

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

由此我们可以假设
  • 1公里的长度等于0.0089831度
  • 纬度1的1km等于0.009044deg
我们可以通过在Where of OUR sql语句中添加以下内容来消除大部分数据

从以下位置选择*(纬度介于(latValue?-0.009044)和(latValue?+0.009044)之间)以及(长纬度介于(longValue?-0.0089831)和(longValue?+0.0089831)之间)

为了得到更准确的结果,您仍然需要使用Vincenty或Haversine公式过滤结果值

编辑:
或者您也可以将Vincenty或Haversine公式直接实现到查询中。现在是否这样做更有效,我还没有测试。我总是将数据库事务保持在最小。存储和检索数据的计算量非常小

您使用哪种数据库系统?我已经有一段时间没有讨论这个主题了,我使用了Postgres/PostGIS。对于MySQL,这可以解决您的问题: