Spring Boot 3 JPA Postgis - 无法根据几何形状选择行

问题描述 投票:0回答:1

我们开始评估向 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
spring-data-jpa postgis
1个回答
0
投票

查询不正确。

在我替换文章中的 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);

...查询速度更快而且正确!

© www.soinside.com 2019 - 2024. All rights reserved.