sql - 在香草 Postgres 查询中使用 PostGIS 中的边界框
问题描述
我有一个香草 Postgres 的数据库结构:
CREATE TABLE IF NOT EXISTS locations (
name text NOT NULL,
lat double precision NOT NULL,
lng double precision NOT NULL,
);
CREATE INDEX ON locations(lat,lng);
当我想计算具有左下角和右上角的边界框中的所有位置时,我使用以下查询:
SELECT * FROM locations
WHERE lat >= min_lat AND
WHERE lat <= max_lat AND
WHERE lng >= min_lng AND
WHERE lng <= max_lng;
现在,我想生成一个给定点的边界框,并在位置查询中使用边界框结果。我正在使用以下 PostGIS 查询来生成边界框:
SELECT
ST_Extent(
ST_Envelope(
ST_Rotate(
ST_Buffer(
ST_GeomFromText('POINT (-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)));
结果: BOX(-89.568160053866 40.4285062983089,-85.6903925527536 43.3273499289221)
但是,我不确定如何在一次调用中将 PostGIS 查询边界框的结果用于普通 lat / lng Postgres 查询。关于如何将两者合并的任何想法?最好保留索引。
解决方案
如果您想将 bbox 坐标作为分隔值获取,您可能想看看ST_XMax
, ST_YMax
, ST_XMin
, ST_YMin
. 以下嵌入您的查询的 CTE 应该会给您一个想法:
WITH j (geom) AS (
SELECT
ST_Extent(ST_Envelope(
ST_Rotate(ST_Buffer(
ST_GeomFromText('POINT(-87.6297982 41.8781136)',4326)::GEOGRAPHY,160934)::GEOMETRY,0)))
)
SELECT
ST_XMax(geom),ST_YMax(geom),
ST_XMin(geom),ST_YMin(geom)
FROM j
st_xmax | st_ymax | st_xmin | st_ymin
-------------------+-----------------+-------------------+------------------
-85.6903925527536 | 43.327349928921 | -89.5681600538661 | 40.4285062983098
旁注:将几何值存储为数字可能看起来很简单,但它几乎不是更好的选择 - 特别是在处理多边形时!所以我真的建议你将这些值存储为geometry
or geography
,乍一看可能看起来很复杂,但从长远来看肯定会有所回报。
这个答案可能会阐明涉及多边形的距离/包含查询:Getting all Buildings in range of 5 miles from specified coordinates
推荐阅读
- rest - 将 curl 命令转换为 golang conn.publish 代码
- python - 打印差异大于一个值的列表元素
- java - 如何将文本文件读入数组,计算出现次数然后显示计数
- ios - iOS - 使用矢量资源比使用 png 的利弊
- java - (Java数字金字塔)当整数> 9时,如何让我的数字在它们之间有更多的空格,同时准确地排列?
- java - Source not found importing CSS to JavaFX
- python - Kivy:使用 MySQL 的 kivy 页面的 Listview 实现
- javascript - Angularjs在for循环错误中添加新字段
- java - Android 三星 FaceID 身份验证 SDK
- ios - URLSession.Datatask 返回 0 字节数据