我们开始评估向 Postgis 的迁移。出于好奇,我读了这篇好文章。当查询几何和距离的数据时,我没有得到任何数据。我确定数据在数据库中。
实体与来自 locationtech 的点:
@Data
@Entity(name = "us_cities")
public class City {
@Id
@Column(name="id")
private long id;
@Column(name="pop_2010")
private long population2010;
@Column(name="elev_in_ft")
private long altitude;
@Column(name="state")
private String state;
@Column(columnDefinition = "geometry(Point,4326)")
private Point geom;
}
存储库是:
@Repository
public interface CityRepository extends JpaRepository<City, Long>{
@Query(value="SELECT * from us_cities where ST_DistanceSphere(geom, :p) < :distanceM", nativeQuery = true)
List<City> findNearWithinDistance(Point p, double distanceM);
}
服务是:
public List<City> findAround(double lat, double lon, double distanceM){
log.info("Looking for city around ({},{}) withing {} meters", lat, lon, distanceM);
Point p = factory.createPoint(new Coordinate(lon, lat));
List<City> cities = repo.findNearWithinDistance(p, distanceM);
return cities;
}
依赖项是:
Postgres/Postgis 中的列定义如下所示:
Postgis 中的表包含数据,前几行是:
在 Spring Boot JPA 应用程序中选择数据时,我无法按几何形状选择任何行。执行简单的“全选”即可找到表中的所有行。
如何在Spring JPA中基于Postgis查询正确选择数据?你能帮我迈出迈向 Postgis 的第一步吗?
数据是通过以下方式创建的:JSON 文件:
{
"type": "FeatureCollection",
"name": "us_cities",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{ "type": "Feature", "properties": { "id": "53", "POP_2010": 40888.0, "ELEV_IN_FT": 1611.0, "STATE": "ND" }, "geometry": { "type": "Point", "coordinates": [ -101.296273199999973, 48.232509500000106 ] } },
{ "type": "Feature", "properties": { "id": "101", "POP_2010": 52838.0, "ELEV_IN_FT": 830.0, "STATE": "ND" }, "geometry": { "type": "Point", "coordinates": [ -97.032854699999973, 47.925256800000057 ] } } ...} ... ]
还有一个 ogr2ogr 命令:
ogr2ogr -f "PostgreSQL" PG:"dbname=postgis user=postgis host=localhost port=5433 password=postgis" "src/main/resources/us_cities.geojson" -sql "select cast(ID as INTEGER), ELEV_IN_FT, POP_2010, STATE from us_cities" -nln us_cities
查询不正确。
在我替换文章中的 native 查询后...
@Query(value="SELECT * from us_cities where ST_DistanceSphere(geom, :p) < :distanceM", nativeQuery = true)
List<City> findNearWithinDistance(Point p, double distanceM);
...与...
@Query(value="SELECT s from com.hin.spatial.postgis.model.City s where ST_DistanceSphere(s.geom, :p) < :distanceM")
List<City> findNearWithinDistance2(Point p, double distanceM);
...查询速度更快而且正确!