Java 如何基于空间坐标获取MySQL 8中的对象列表

Java 如何基于空间坐标获取MySQL 8中的对象列表,java,mysql,spring,spring-mvc,mysql-8.0,Java,Mysql,Spring,Spring Mvc,Mysql 8.0,例如,我有一个MySQL 8DB存储 id int, -> 1 name String, -> Hosp One address String, -> 8900 North Kendall Drive lat double, -> 25.6870576 lng double -> -80.33634669999999 在我通过谷歌地图api得到zipcode的坐标后 即33175->lat:25.7357

例如,我有一个MySQL 8DB存储

id        int,    -> 1
name      String, -> Hosp One
address   String, -> 8900 North Kendall Drive
lat       double, -> 25.6870576
lng       double  -> -80.33634669999999
在我通过谷歌地图api得到zipcode的坐标后

即33175->lat:25.735712,液化天然气:-80.399265

使用MySQL,我知道我现在可以使用空间数据类型进行查询和检索,并将SRID设置为4326,但我不知道是否应该从一开始创建一个新表,或者我的当前表就足够了

另外,我也不知道如何进行查询搜索,并返回所述zipcode/坐标的半径/距离X英里范围内的医院列表列表

服务

//这里有包信息
导入com.google.maps.errors.ApiException;
导入org.springframework.beans.factory.annotation.Autowired;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Optional;
导入静态com.Utils.Utils.*;
@org.springframework.stereotype.Service
公立医院服务{
私人最终医院储存库医院储存库;
@自动连线
公共医院服务(医院资源库医院资源库){
this.hospitalRepository=hospitalRepository;
}
公共可选findById(字符串id){
int parsedInt=Integer.parseInt(id);
返回hospitalRepository.findById(parsedInt);
}
公立医院{
返回hospitalRepository.findAll();
}
public Iterable createHospital(列出医院)抛出InterruptedException、ApiException、IOException{
List newHosp=newarraylist();
医院(hosp:医院){
新增hosp.add(createLatCord(hosp));
}
返回hospitalRepository.saveAll(newHosp);
}
公共列表findHospitalByZipcode(字符串zipcode)引发InterruptedException、ApiException、IOException{
//ZipodePoint是一个自定义方法,它返回点obj中zipcode的cordinate
//即x=25.735712,y=-80.399265
System.out.println(ZipodePoint(zipcode));
返回null;
}
}
我的控制器

@GetMapping(path=“search/{zip}”,products=MediaType.APPLICATION\u JSON\u UTF8\u VALUE)
公共列表findHospitalByZipcode(@PathVariable String zip)引发InterruptedException、ApiException、IOException{
返回hospitalService.findHospitalByZipcode(zip);
}
回购

//此处为包名
导入org.springframework.data.repository.crudepository;
公共接口HospitalRepository扩展了Crudepository{
}
医院模式

//包名
导入javax.persistence.*;
导入java.util.ArrayList;
导入java.util.List;
@实体
公立医院{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有int-id;
私有字符串名称;
私有字符串地址;
私有字符串zipcode;
私人城市;
私有字符串状态;
私人双lat;
私人双液化天然气;
@OneToMany(mappedBy=“医院”)
公立医院(){
}
//所有其他的场上能手和二传手
公共双getLat(){
返回lat;
}
公共无效设置lat(双lat){
this.lat=lat;
}
公共双getLng(){
返回液化天然气;
}
公共空间设置液化天然气(双液化天然气){
这是液化天然气=液化天然气;
}
}

在HospitalRepository中,编写如下方法:

Hospital findByLatLng(Double lat, Double lng);
从服务台呼叫。LatLng应该是实体字段的名称。 或编写一个如下所示的查询-

@Query("SELECT h FROM Hospital h where h.lat = ?1 And h.lng = ?2")
Hospital findByLatLng(Double lat, Double lng);
要获取对象列表,请按如下方式编写方法:

@Query("SELECT h FROM Hospital h where h.lat = ?1 And h.lng = ?2")
List<Hospital> findByLatLng(Double lat, Double lng);
@Query(“从医院h中选择h,其中h.lat=?1和h.lng=?2”)
列出findByLatLng(双lat,双lng);

在HospitalRepository中,编写一个方法,如:Hospital FindBylaLNG(双lat,双lng)并从服务调用它。LatLng应该是实体字段的名称。试图在MySQL Workbench中运行它,但一直得到>错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以获得在第1行的“?1”和lng=?2”附近使用的正确语法。。。也不知道它会返回半径X英里内的医院。这不是mysql workbench,它应该用java代码编写。好的,但当我运行它时,附近没有医院,它只会用匹配我在url中传递的lat和lng的对象(如url/lat_lng)进行响应。因此,如果url/lat_lng与我数据库中的任何hosp匹配,我将获得所有hosp,如果不匹配,我将不会得到任何结果。我试图在x英里半径范围内找到任何hosp,mysql中没有这样的功能。我认为,你必须计算lat lng的范围,比如minLat,maxLat。。并将范围数据与存储库方法进行比较。我设法找到了一个基本公式来查找结果,但我可以在MySQL Workbench中运行它,但似乎无法将其转换为Java查询代码->@Query(“选择*,(6371*acos(cos(radians(25.735712))*cos(radians(lat))*cos(radians(lng)-radians(-80.399265))+sin(radians)(25.735712))*sin(弧度(lat)))表示距离医院的距离,距离小于8.5个数量级,距离限制为0,20”)