Java检查1km圆圈内是否存在长lat
我正在从事一个Java EE项目,拥有如下实体: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
@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
从以下位置选择*(纬度介于(latValue?-0.009044)和(latValue?+0.009044)之间)以及(长纬度介于(longValue?-0.0089831)和(longValue?+0.0089831)之间)代码>
为了得到更准确的结果,您仍然需要使用Vincenty或Haversine公式过滤结果值
编辑:
或者您也可以将Vincenty或Haversine公式直接实现到查询中。现在是否这样做更有效,我还没有测试。我总是将数据库事务保持在最小。存储和检索数据的计算量非常小 您使用哪种数据库系统?我已经有一段时间没有讨论这个主题了,我使用了Postgres/PostGIS。对于MySQL,这可以解决您的问题: