Sql 如何按国家查询PostGIS中的数据?

Sql 如何按国家查询PostGIS中的数据?,sql,postgresql,spring-boot,postgis,shapefile,Sql,Postgresql,Spring Boot,Postgis,Shapefile,我已经从下载了a世界地图形状文件 世界地图表的列如下所示: gid integer NOT NULL DEFAULT nextval('table_world_gid_seq'::regclass), fips character varying(2) COLLATE pg_catalog."default", iso2 character varying(2) COLLATE pg_catalog."default", iso3 character varying(3) COLLATE pg_

我已经从下载了a世界地图形状文件

世界地图表的列如下所示:

gid integer NOT NULL DEFAULT nextval('table_world_gid_seq'::regclass),
fips character varying(2) COLLATE pg_catalog."default",
iso2 character varying(2) COLLATE pg_catalog."default",
iso3 character varying(3) COLLATE pg_catalog."default",
un smallint,
name character varying(50) COLLATE pg_catalog."default",
area integer,
pop2005 bigint,
region smallint,
subregion smallint,
lon double precision,
lat double precision,
geom geometry(MultiPolygon,4326)
现在我想通过
geom
列查询我的数据,例如,查询中国的数据

//function in controller
@GetMapping("china")
fun getInChina(): Result<List<WalkItem>> {
    val ce = countryRepo.findById(30).get()
    val wes = walkRepo.findInCountry(ce.geom!!)
    return Result.success(wes)
}
这些是我想在中国质疑的一些观点

//function in controller
@GetMapping("china")
fun getInChina(): Result<List<WalkItem>> {
    val ce = countryRepo.findById(30).get()
    val wes = walkRepo.findInCountry(ce.geom!!)
    return Result.success(wes)
}
屏幕截图显示了我根据地图的角位置查询出来的数据。

我相信您查询的是
经纬度
,而不是
经纬度
——后者是所有SRS中最常见的组合。你的坐标看起来很好,它们确实与数据集中的中国多边形重叠

查询-导入shapefile和您提供的坐标

WITH j AS (
  VALUES ('SRID=4326;POINT(115.43765119 39.99987095)'::GEOMETRY),
         ('SRID=4326;POINT(116.38653411 40.00929495)'::GEOMETRY),
         ('SRID=4326;POINT(115.59797164 39.86346926)'::GEOMETRY)
)
SELECT ST_AsText(column1), name FROM j, table_world
WHERE ST_Contains(geom,column1);

---------------------------------+-------
 POINT(115.43765119 39.99987095) | China
 POINT(116.38653411 40.00929495) | China
 POINT(115.59797164 39.86346926) | China

(3 Zeilen)

你能发布一个你声称位于中国多边形内部的坐标样本吗?已经在我的帖子末尾添加了坐标。还添加了一张屏幕截图,显示了地图角位置的查询数据。这里返回的是中国多边形,如预期的那样:
带j as(值('SRID=4326;点(115.43765119 39.99987095)::GEOMETRY))从J中选择*,“tm_world_borders_Siml-0.3”,其中ST_包含(geom,第1列)
带j AS(值('SRID=4326;点(115.43765119 39.99987095)::几何体))从j,public.table_世界中选择*ST_包含的位置(geom,column1)
使用此命令,我可以查询出中国的数据:
0101000020E61000C006237A02DC5C40383C73C5FBFF4340“30”CH“CN”CHN“156”China“932743”1312978855“142 30”106.514“33.42”
@GetMapping("within")
fun findWithin(@RequestParam("lat_north") latNorth: Double,
               @RequestParam("lon_west") lonWest: Double,
               @RequestParam("lat_south") latSouth: Double,
               @RequestParam("lon_east") lonEast: Double,
               page: Int, size: Int): Result<List<WalkItem>> {
    val rectangle = GeometryFactory().createPolygon(arrayOf(
            Coordinate(latNorth, lonWest),
            Coordinate(latNorth, lonEast),
            Coordinate(latSouth, lonEast),
            Coordinate(latSouth, lonWest),
            Coordinate(latNorth, lonWest)
    ))
    val wes = walkRepo.findWithin(rectangle, PageRequest.of(page, size))
    return Result.success(wes)
}
{
    "altitude": 1391.2064208984375,
    "latitude": 39.99987095,
    "longitude": 115.43765119
}
{
    "altitude": 45.00225830078125,
    "latitude": 40.00929495,
    "longitude": 116.38653411
}
{
    "altitude": 1075.603759765625,
    "latitude": 39.86346926,
    "longitude": 115.59797164
}
WITH j AS (
  VALUES ('SRID=4326;POINT(115.43765119 39.99987095)'::GEOMETRY),
         ('SRID=4326;POINT(116.38653411 40.00929495)'::GEOMETRY),
         ('SRID=4326;POINT(115.59797164 39.86346926)'::GEOMETRY)
)
SELECT ST_AsText(column1), name FROM j, table_world
WHERE ST_Contains(geom,column1);

---------------------------------+-------
 POINT(115.43765119 39.99987095) | China
 POINT(116.38653411 40.00929495) | China
 POINT(115.59797164 39.86346926) | China

(3 Zeilen)