实现空间四至的求解,可转换为寻找当前面数据的四至范围极值的问题。因此只需要找到能包围当前面数据的最大点的坐标即可。为了方便实现按照某省份来查询其对应的四至范围,在 PostgreSQL 中使用子查询来进行数据的过滤,首先定义 with 子句。查询的 SQL 如下:
WITH temp_area AS (
SELECT*FROM biz_area T WHERE T.province_code ='510000'
),
bounds_info AS (
(SELECT'最东'AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS y FROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dp ORDERBY x DESC LIMIT 1)
UNION
(SELECT'最西'AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS y FROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dp ORDERBY x ASC LIMIT 1)
UNION
(SELECT'最北'AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS y FROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dp ORDERBY y ASC LIMIT 1)
UNION
(SELECT'最南'AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS y FROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dp ORDERBY y DESC LIMIT 1)
)
SELECT direction,id, province_code, province_name, city_code, city_name,area_code,area_name,type,st_asgeojson(geom) AS geomJson, x AS lon,y AS lat FROM bounds_info;
staticfinalStringFIND_ESWNAREA_BYPROVINCE_SQL="<script>" +
" WITH temp_area AS ( SELECT * FROM biz_area T WHERE T.province_code = #{province_code} ), " +
" bounds_info AS (" +
" ( SELECT '最东' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y " +
" FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x DESC LIMIT 1 " +
" ) UNION " +
" ( SELECT '最西' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y " +
" FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x ASC LIMIT 1 " +
" ) UNION " +
" ( SELECT '最南' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y " +
" FROM temp_area T, LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY y ASC LIMIT 1 " +
" ) UNION " +
" (SELECT '最北' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y " +
" FROM temp_area T, LATERAL ST_DumpPoints( T.geom ) AS dp ORDER BY y DESC LIMIT 1 " +
") SELECT direction,id,province_code,province_name,city_code,city_name,area_code, " +
" area_name,type, st_asgeojson(geom) geomJson, x lon,y lat FROM bounds_info " +
"</script>";
/**
* - 根据省份 code 查询对应省份的四至区县信息
* @param provinceCode 需要查询的目标省份 code
* @return
*/@Select(FIND_ESWNAREA_BYPROVINCE_SQL)
List<EwsnAreaVo> findEswnAreaByProvinceCode(@Param("province_code")String provinceCode);